{"version":3,"file":"cli.modern.mjs","sources":["../src/util/logger.ts","../src/util/exec.ts","../src/ciStages/ciPhaseRunner.ts","../node_modules/tslib/tslib.es6.js","../src/configuration/interface.ts","../src/deploy/pm2/pm2.ts","../src/deploy/upload.ts","../src/deploy/healthCheck.ts","../src/deploy/util/createTimestamp.ts","../src/deploy/environments/setupDynamicArgs.ts","../src/configuration/defaults.ts","../src/configuration/configuration.ts","../src/cli/cliStage.ts","../src/deploy/util/getSsh.ts","../src/deploy/environments/validateEnvironment.ts","../src/util/tagsHelpers.ts","../src/deploy/environments/deployEnvironment.ts","../src/deploy/deploy.ts","../src/cli/cliDeploy.ts","../src/cli/cliCreateEnv.ts","../src/gitlabCi/createGitlabCiConfig.ts","../src/util/diff.ts","../src/cli/cliCreateCiConfig.ts","../src/index.ts","../src/cli/cli.ts"],"sourcesContent":["import chalk from 'chalk'\nimport log from 'loglevel'\nimport prefix from 'loglevel-plugin-prefix'\n\nexport const initLogger = () => {\n\n  // Setup levels colors\n  const colors: { [key: string]: chalk.ChalkFunction } = {\n    TRACE: chalk.magenta,\n    DEBUG: chalk.cyan,\n    INFO: chalk.blue,\n    WARN: chalk.yellow,\n    ERROR: chalk.red,\n  };\n\n  prefix.reg(log)\n  log.enableAll()\n\n  prefix.apply(log, {\n    format(level, name, timestamp) {\n      return `${chalk.gray(`[${timestamp}]`)} ${chalk.yellow('ci-deploy')} ${colors[level.toUpperCase()](level)} ${chalk.green(`${name}:`)}`\n    },\n  })\n\n  // Set log level from debug variable or set info as default\n  if (process.env.CI_TOOLS_DEBUG) {\n    // TODO figure out better type guard so i don't have to cast type (not sure if its possible)\n    const envDebug: keyof log.LogLevel = Object.keys(log.levels).includes(process.env.CI_TOOLS_DEBUG) ? process.env.CI_TOOLS_DEBUG as keyof log.LogLevel : 'TRACE'\n    if (Object.keys(log.levels).includes(envDebug)) {\n      log.setLevel(log.levels[envDebug])\n    }\n  } else {\n    log.setLevel(log.levels[\"INFO\"])\n  }\n}","import execa from 'execa'\nimport log from 'loglevel';\nimport { PassThrough } from \"stream\"\n\nexport const exec = async (command: string, options?: execa.Options): Promise<string> => {\n  log.debug(`Executing command \"${command}\"`)\n\n  // Create PassThrough stream\n  const pass = new PassThrough();\n  // Console log stream data\n  pass.on(\"data\", (chunk: Buffer | string | any) => {\n    log.debug(chunk.toString());\n  });\n\n  // execa rejects on non-zero exit codes, so failures propagate to the caller\n  const subprocess = execa.command(command, options);\n  subprocess.stdout.pipe(pass);\n  const result = await subprocess;\n  log.debug(result)\n\n  return result.stdout;\n\n}","import log from 'loglevel'\nimport { exec } from '../util/exec'\nimport { CiConfig, CiStage, CiPhase } from \"../configuration/interface\";\n\n\nexport const ciPhaseRunner = async (config: CiConfig, stage: CiStage, phase: CiPhase) => {\n  const commands = config[stage][phase]\n  log.info(`Running phase \"${phase}\" of stage \"${stage}\"`)\n  // Using for loop so all awaited promises must be resolved before next cycle\n  for (let i = 0; i < commands.length; i++) {\n    const command = commands[i];\n    await exec(command, { shell: true })\n  }\n} ","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { NodeSSH } from 'node-ssh'\nimport { DeepPartial } from 'utility-types'\nimport { string, array, func, object, boolean } from 'joiful'\n\n\n\nexport type dynamicArgs = { [key: string]: any }\nexport type deployFunction = (deployConfig: DeployConfig, environmentConfig: EnvironmentConfig, serverConfig: ServersConfig, dynamicArgs: dynamicArgs, ssh: NodeSSH) => Promise<void>\nexport type healthCheckFunction = (ssh: NodeSSH, port: number) => Promise<void>\nexport type setupDynamicArgsFunction = (deployConfig: DeployConfig, environmentConfig: EnvironmentConfig, serverConfig: ServersConfig, dynamicArgs: dynamicArgs, ssh: NodeSSH) => Promise<void>\nexport type deployAction = 'default' | 'stop' | 'revert'\nexport type createTagFunction = (isSemverTag: boolean, isVersionedTag: boolean, releaseNumber: number, semverVersion: string | undefined, environmentName: string, branch: string | undefined) => string\nexport type parseTagFunction = (isSemverTag: boolean, isVersionedTag: boolean, allTags: string[], environmentName: string, branch: string | undefined) => { semverVersion: string | undefined, releaseNumber: number | undefined }\nexport type createBaseConfigFunction = (buildTemplate: Json, deployTemplate: Json, stopTemplate: Json, stages: Json, revertTemplate?: Json) => Json\n\nexport type JsonPrimitive = string | number | boolean | null | undefined\nexport type JsonMap = { [key: string]: JsonPrimitive | JsonArray | JsonMap }\nexport type JsonArray = (JsonPrimitive | JsonArray | JsonMap)[]\nexport type Json = JsonPrimitive | JsonMap | JsonArray\n\nexport class SshConfig {\n  @(string().required())\n  host: string\n\n  @(string().required())\n  username: string\n\n  @(string().required())\n  privateKey: string\n}\n\nexport class UploadConfig {\n  @(array().items(joi => joi.string()).required())\n  files: string[]\n\n  @(array().items(joi => joi.string()).required())\n  folders: string[]\n\n  @(string().required())\n  uploadTo: string\n}\n\nexport class ServersConfig {\n  // TODO generic type DeployFunction<returnType>\n  @(func().optional())\n  getPort?: (deployConfig: DeployConfig, environmentConfig: EnvironmentConfig, serverConfig: ServersConfig, dynamicArgs: dynamicArgs, ssh: NodeSSH) => Promise<number>\n\n  @(func().required())\n  getAppName: (deployConfig: DeployConfig, environmentConfig: EnvironmentConfig, serverConfig: ServersConfig, dynamicArgs: dynamicArgs, ssh: NodeSSH) => Promise<string>\n\n  @(object().required())\n  sshConfig: SshConfig\n}\n\nexport class EnvironmentConfig {\n  @(string().required())\n  environmentName: string\n\n\n  @(func().required())\n  environmentTagCreate: createTagFunction\n\n  @(func().required())\n  environmentTagParseVersion: parseTagFunction\n\n  @(boolean().required())\n  environmentTagIsSemver: boolean\n\n  @(boolean().required())\n  environmentTagIsVersioned: boolean\n\n  @(boolean().required())\n  deployManual: boolean\n\n  @(string().optional())\n  defaultEnvironmentBranch?: string\n\n  @(boolean().required())\n  isMultiEnv: boolean\n\n  // Keep the second-latest build on the server after every deploy and\n  // generate a manual revert_<env> gitlab job that switches back to it\n  @(boolean().optional())\n  revertible?: boolean\n\n  @(object().optional())\n  envVars?: { [key: string]: string }\n\n  @(object().required())\n  uploadConfig: UploadConfig\n\n  @(func().optional())\n  setupDynamicArgs?: setupDynamicArgsFunction\n\n  @(func().optional())\n  deployBefore?: deployFunction\n\n  @(func().optional())\n  deployUpload?: deployFunction\n\n  @(func().optional())\n  deployStart?: deployFunction\n\n  @(func().optional())\n  deployAfter?: deployFunction\n\n  @(func().optional())\n  onStop?: deployFunction\n\n  @(func().optional())\n  onRevert?: deployFunction\n\n  @(func().optional())\n  healthCheck?: healthCheckFunction\n\n  @(array({ elementClass: ServersConfig }).required())\n  servers: ServersConfig[]\n\n  @(string().optional())\n  auto_stop_in?: string\n}\n\nexport class DeployConfig {\n  @(array({ elementClass: EnvironmentConfig }).required())\n  environments: EnvironmentConfig[]\n\n  @(func().optional())\n  setupDynamicArgs?: setupDynamicArgsFunction\n\n  @(array().items(joi => joi.string()).required())\n  requiredEnvVars: string[]\n\n  @(func().optional())\n  deployBefore?: deployFunction\n\n  @(func().required())\n  deployUpload: deployFunction\n\n  @(func().required())\n  deployStart: deployFunction\n\n  @(func().optional())\n  deployAfter?: deployFunction\n\n  @(func().required())\n  healthCheck: healthCheckFunction\n\n  @(func().required())\n  onStop: deployFunction\n\n  @(func().required())\n  onRevert: deployFunction\n\n  @(func().optional())\n  createBaseConfig?: createBaseConfigFunction\n}\n\nexport class CiScripts {\n  @(array().items(joi => joi.string()).required())\n  before: string[]\n\n  @(array().items(joi => joi.string()).required())\n  main: string[]\n\n  @(array().items(joi => joi.string()).required())\n  after: string[]\n}\n\n\nexport class CiConfig {\n  @(object().required())\n  deploy: CiScripts\n\n  @(object().required())\n  build: CiScripts\n\n  @(object().required())\n  stop: CiScripts\n\n  @(object().required())\n  revert: CiScripts\n}\n\nexport type CiStage = keyof CiConfig\nexport type CiPhase = keyof CiScripts\nexport type PartialCiConfig = DeepPartial<CiConfig>\nexport type PartialDeployConfig = DeepPartial<DeployConfig>\n\n// TODO remove TEMP example\nexport const ciConfig: CiConfig = {\n  deploy: {\n    before: [],\n    main: [\n      'echo \"Starting deploy\"',\n      'yarn ci:deploy',\n    ],\n    after: []\n\n  },\n  build: {\n    before: [],\n    main: [\n      // Run unit tests\n      'echo \"Running tests\"',\n      'yarn ci:test',\n\n      // Run build\n      'echo \"Building project\"',\n      'yarn ci:build',\n\n      // Run build health check,\n      'echo \"Checking build\"',\n      'yarn ci:check-build',\n    ],\n    after: []\n  },\n  stop: {\n    before: [],\n    main: [\n      // Run unit tests\n      'echo \"Stopping environment\"',\n    ],\n    after: []\n  },\n  revert: {\n    before: [],\n    main: [\n      'echo \"Reverting environment\"',\n    ],\n    after: []\n  }\n}\n\n// TODO remove TEMP example\nexport const deployConfig: DeployConfig = {\n  requiredEnvVars: ['CI_COMMIT_SHORT_SHA', 'CI_TOOLS_COMMIT_TIMESTAMP', 'CI_COMMIT_TAG'],\n  onStop: async () => { },\n  onRevert: async () => { },\n  deployUpload: async () => { },\n  deployStart: async () => { },\n  healthCheck: async () => { },\n  environments: [\n    {\n      environmentName: 'production',\n      environmentTagCreate: () => { return 'tag' },\n      environmentTagIsSemver: true,\n      environmentTagIsVersioned: true,\n      isMultiEnv: false,\n      deployManual: true,\n      environmentTagParseVersion: () => { return { releaseNumber: 1, semverVersion: '1.1.1' } },\n      envVars: {\n        APP_ENV: 'production'\n      },\n      uploadConfig: {\n        files: ['ecosystem.production.config.js', '.frackrc.js'],\n        folders: ['build'],\n        uploadTo: 'www',\n      },\n      servers: [{\n        getPort: async () => 8080,\n        getAppName: async () => 'my-app',\n        sshConfig: {\n          host: 'my-production-server.com',\n          username: 'deploy',\n          privateKey: process.env.KEY_MASTER,\n        }\n      }]\n    }\n  ]\n}","import log from 'loglevel'\nimport { NodeSSH } from 'node-ssh'\n\nimport { deployFunction } from '../../configuration/interface'\n\n// Runs pm2 start command and starts your build in pm2\nconst pm2Start = async (buildPath: string, pm2Env: string, appName: string, appPort: number, prependCommand: string, ssh: NodeSSH) => {\n  log.info('running pm2Start')\n  // TODO add to configuration\n  const pm2ConfigFile = `ecosystem.${pm2Env}.config.js`\n\n  // Stop and remove old running app process in pm2\n  await pm2Del(appName, ssh)\n\n  const startCommand = `${prependCommand}pm2 startOrRestart ${pm2ConfigFile} --env=${pm2Env} ${appName} ${appPort}`\n  const startResult = await ssh.execCommand(\n    startCommand,\n    {\n      cwd: buildPath,\n    },\n  )\n  log.debug('Executed command over ssh:', startCommand, startResult)\n\n  if (startResult.code && startResult.code !== 0) {\n    log.error(startResult.stderr)\n    throw new Error('SERVER START FAILED')\n  }\n  if (startResult.stderr) {\n    log.warn(startResult.stderr)\n  }\n\n  log.info('finished pm2Start')\n}\n\n// Save current pm2 state, so it could be restored on server restart\nconst pm2Save = async (ssh: NodeSSH) => {\n  log.info('running pm2Save')\n\n  const command = 'pm2 save'\n  const result = await ssh.execCommand(command)\n  log.debug('Executed command over ssh:', command, result)\n\n  if (result.code && result.code !== 0) {\n    log.error(result.stderr)\n    throw new Error('STARTUP SCRIPTS FAILED')\n  }\n  if (result.stderr) {\n    log.warn(result.stderr)\n  }\n\n  log.info('finished pm2Save')\n}\n\n// Delete app from pm2\nconst pm2Del = async (appName: string, ssh: NodeSSH) => {\n  log.info('running pm2Del')\n  const delCommand = `pm2 delete -s ${appName}`\n  const delResult = await ssh.execCommand(delCommand) // using -s (silent) to allow this to fail (fails when app is not running, this can happen when previous deployStart failed)\n  log.debug('Executed command over ssh:', delCommand, delResult)\n  log.info('finished pm2Del')\n}\n\n// Quote a value for safe use in a shell command (handles spaces and special characters)\nconst shellQuote = (value: string): string => `'${String(value).replace(/'/g, `'\\\\''`)}'`\n\n// Build the `export VAR='value';` prefix for the pm2 start command\nconst buildEnvVarsPrepend = (envVars?: { [key: string]: string }, dynamicEnvVars?: { [key: string]: string }): string => {\n  let prependCommand = ''\n  if (envVars || dynamicEnvVars) {\n    const allEnvVars = { ...envVars, ...dynamicEnvVars }\n    Object.keys(allEnvVars).forEach(varName => {\n      const varValue = allEnvVars[varName]\n      prependCommand = `${prependCommand}export ${varName}=${shellQuote(varValue)};`\n    })\n  }\n  return prependCommand\n}\n\n// Start build on server in pm2\nexport const pm2DeployStart: deployFunction = async (deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh) => {\n  log.info('running deployStart')\n\n  const { getAppName, getPort } = serverConfig\n  if (!getPort) {\n    throw new Error(`Missing getPort in server config for host \"${serverConfig.sshConfig.host}\". The default pm2 deployStart requires it.`)\n  }\n  const { envVars, environmentName } = environmentConfig\n  const appName = await getAppName(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh)\n  const port = await getPort(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh)\n  const { buildPath, envVars: dynamicEnvVars } = dynamicArgs\n\n  const prependCommand = buildEnvVarsPrepend(envVars, dynamicEnvVars)\n\n  // Use pm2 to start build\n  await pm2Start(buildPath, environmentName, appName, port, prependCommand, ssh)\n  // Check if started build is running correctly\n  await (environmentConfig.healthCheck || deployConfig.healthCheck)(ssh, port)\n  // Call pm2 save so build would automatically start on server restart\n  await pm2Save(ssh)\n\n  log.info('finished deployStart')\n}\n\n// Setup some extra pm2 dynamic args\nexport const pm2DeployBefore: deployFunction = async (_deployConfig, _environmentConfig, _serverConfig, _dynamicArgs) => {\n  log.info('running deployBefore')\n\n\n  log.info('finished deployBefore')\n}\n\n// Clean older build on redeploy\nexport const pm2DeployAfter: deployFunction = async (deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh) => {\n  log.info('running deployAfter')\n  const { getAppName } = serverConfig\n  const appName = await getAppName(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh)\n  const { buildPath } = dynamicArgs\n  const buildParentDir = buildPath.slice(0, buildPath.lastIndexOf(\"/\"))\n  // Get all folders of this build (environment + tag (preview only))\n  const allBuildDirs = await getSubdirectories(buildParentDir, ssh)\n\n  // Get active build folder\n  const appCWD = await pm2GetAppCWD(appName, ssh)\n\n  // Inactive build folders, newest first (folder names are timestamp-prefixed)\n  const inactiveBuildDirs = allBuildDirs\n    .map(buildDir => buildDir.replace(/\\/$/, ''))\n    .filter(buildDir => buildDir && !appCWD.includes(buildDir))\n    .sort()\n    .reverse()\n\n  // Revertible environments keep the newest inactive build so the `revert`\n  // cli command can switch back to it\n  const deleteBuildDirs = environmentConfig.revertible ? inactiveBuildDirs.slice(1) : inactiveBuildDirs\n\n  // Using for loop so all awaited promises must be resolved before next cycle\n  for (let i = 0; i < deleteBuildDirs.length; i++) {\n    await deleteFolder(`${buildParentDir}/${deleteBuildDirs[i]}`, ssh)\n  }\n  log.info('finished deployAfter')\n\n}\n\nexport type RevertState = {\n  buildParentDir: string,\n  activeDir: string | undefined,\n  targetDir: string | undefined,\n}\n\n// Inspect the server: where does the app run now and which previous build\n// could it be reverted to (the newest inactive build folder)\nexport const getRevertState = async (uploadTo: string, appName: string, ssh: NodeSSH): Promise<RevertState> => {\n  const buildParentDir = `${uploadTo}/${appName}`\n  const allBuildDirs = await getSubdirectories(buildParentDir, ssh)\n  const appCWD = await pm2GetAppCWD(appName, ssh)\n\n  const buildDirs = allBuildDirs\n    .map(buildDir => buildDir.replace(/\\/$/, ''))\n    .filter(Boolean)\n  const activeDir = buildDirs.find(buildDir => appCWD.includes(buildDir))\n  const inactiveDirs = buildDirs\n    .filter(buildDir => buildDir !== activeDir)\n    .sort()\n    .reverse()\n\n  return { buildParentDir, activeDir, targetDir: inactiveDirs[0] }\n}\n\n// Switch the app back to the previous build kept on the server\n// (environments with revertible: true keep it after every deploy)\nexport const pm2Revert: deployFunction = async (deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh) => {\n  log.info('running revert')\n\n  const { getAppName, getPort } = serverConfig\n  if (!getPort) {\n    throw new Error(`Missing getPort in server config for host \"${serverConfig.sshConfig.host}\". The default pm2 revert requires it.`)\n  }\n  const { envVars, environmentName } = environmentConfig\n  const appName = await getAppName(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh)\n  const port = await getPort(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh)\n\n  const { buildParentDir, activeDir, targetDir } = await getRevertState(environmentConfig.uploadConfig.uploadTo, appName, ssh)\n  if (!targetDir) {\n    throw new Error(`No previous build to revert to for app \"${appName}\" in ${buildParentDir}. Reverts need at least two deploys with revertible: true.`)\n  }\n\n  log.info(`Reverting app \"${appName}\" from version \"${activeDir}\" to version \"${targetDir}\"`)\n\n  const prependCommand = buildEnvVarsPrepend(envVars, dynamicArgs.envVars)\n  // Use pm2 to start the previous build (the ecosystem config file is part of every uploaded build)\n  await pm2Start(`${buildParentDir}/${targetDir}`, environmentName, appName, port, prependCommand, ssh)\n  // Check if the reverted build is running correctly\n  await (environmentConfig.healthCheck || deployConfig.healthCheck)(ssh, port)\n  // Call pm2 save so the reverted build survives a server restart\n  await pm2Save(ssh)\n\n  log.info('finished revert')\n}\n\n\n// Delete build folder from server on stop job\nexport const pm2OnStop: deployFunction = async (deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh) => {\n  const { getAppName } = serverConfig\n  const { buildPath } = dynamicArgs\n  const appName = await getAppName(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh)\n  const buildParentDir = buildPath.slice(0, buildPath.lastIndexOf(\"/\"))\n  // Stop and remove running app process in pm2\n  await pm2Del(appName, ssh)\n  // Save pm2 config\n  await pm2Save(ssh)\n  // Delete whole build folder\n  await deleteFolder(buildParentDir, ssh)\n}\n\nconst getSubdirectories = async (dir: string, ssh: NodeSSH): Promise<string[]> => {\n  const command = `ls -1qd */`\n  const result = await ssh.execCommand(command, {\n    cwd: dir,\n  })\n  log.debug('Executed command over ssh:', command, result)\n\n  if (result.code && result.code !== 0) {\n    log.error(result.stderr)\n    throw new Error(`ERROR GETTING SUB DIRS OF ${dir}`)\n  }\n  if (result.stderr) {\n    log.warn(result.stderr)\n  }\n\n  return result.stdout.split('\\n')\n}\n\nconst deleteFolder = async (folder: string, ssh: NodeSSH): Promise<void> => {\n  const command = `rm -r ${folder}`\n  const result = await ssh.execCommand(command)\n  log.debug('Executed command over ssh:', command, result)\n  if (result.code && result.code !== 0) {\n    log.error(result.stderr)\n    throw new Error('ERROR DELETING FOLDER')\n  }\n  if (result.stderr) {\n    log.warn(result.stderr)\n  }\n}\n\n\nconst pm2GetAppCWD = async (appName: string, ssh: NodeSSH): Promise<string> => {\n  const command = `pm2 jlist`\n  const result = await ssh.execCommand(command)\n  log.debug('Executed command over ssh:', command, result)\n  if (result.code && result.code !== 0) {\n    log.error(result.stderr)\n    throw new Error('ERROR GETTING PM2 PROCESSES')\n  }\n  if (result.stderr) {\n    log.warn(result.stderr)\n  }\n\n  const processes = JSON.parse(result.stdout)\n  const pm2Process = processes.find((pm2Process: { [key: string]: any }) => {\n    return pm2Process.name === appName\n  })\n  if (!pm2Process) {\n    throw new Error(`APP \"${appName}\" NOT FOUND IN PM2`)\n  }\n\n  return `${pm2Process.pm2_env.pm_cwd}/`\n}\n","import fs from 'fs'\nimport path from 'path'\nimport log from 'loglevel'\nimport { exec } from '../util/exec'\nimport { deployFunction } from '../configuration/interface'\n\nconst archiveName = 'build.tar.gz'\n\n// Default upload: pack configured files and folders into one gzipped archive,\n// upload it in a single transfer and unpack it on the server.\n// Requires the tar binary on both the runner image and the target server.\nexport const deployUpload: deployFunction = async (_deployConfig, environmentConfig, _serverConfig, dynamicArgs, ssh) => {\n  log.info('running deployUpload')\n  const { uploadConfig } = environmentConfig\n  const { files, folders } = uploadConfig\n  const { buildPath } = dynamicArgs\n\n  const entries = [...files, ...folders]\n  if (!entries.length) {\n    throw new Error('Nothing to upload: uploadConfig.files and uploadConfig.folders are both empty')\n  }\n\n  const archivePath = path.join(process.cwd(), archiveName)\n  const quotedEntries = entries.map(entry => `'${entry}'`).join(' ')\n\n  try {\n    // Compress locally on the runner\n    await exec(`tar -czf '${archivePath}' -C '${process.cwd()}' ${quotedEntries}`, { shell: true })\n    log.info('Compressed files and folders into', archivePath)\n\n    // Upload the archive in a single transfer\n    await ssh.putFile(archivePath, `${buildPath}/${archiveName}`)\n    log.info('Uploaded archive to server:', archiveName)\n\n    // Unpack on the server and remove the remote archive\n    const unpackCommand = `tar -xzf ${buildPath}/${archiveName} -C ${buildPath} && rm ${buildPath}/${archiveName}`\n    const unpackResult = await ssh.execCommand(unpackCommand)\n    log.debug('Executed command over ssh:', unpackCommand, unpackResult)\n    if (unpackResult.code && unpackResult.code !== 0) {\n      log.error(unpackResult.stderr)\n      throw new Error('ERROR UNPACKING ARCHIVE ON SERVER')\n    }\n    if (unpackResult.stderr) {\n      log.warn(unpackResult.stderr)\n    }\n    log.info('Unpacked and removed archive on the server')\n  } finally {\n    // Always clean up the local archive, even when compression or upload fails\n    if (fs.existsSync(archivePath)) {\n      fs.unlinkSync(archivePath)\n      log.debug('Deleted local archive:', archivePath)\n    }\n  }\n\n  log.info('finished deployUpload')\n}\n\n// Per-file upload kept as an alternative strategy for projects that can't use\n// tar (set `deployUpload: deployUploadFiles` in deploy.config.js).\nexport const deployUploadFiles: deployFunction = async (_deployConfig, environmentConfig, _serverConfig, dynamicArgs, ssh) => {\n  log.info('running deployUpload')\n  const { uploadConfig } = environmentConfig\n  const { files, folders } = uploadConfig\n  const { buildPath } = dynamicArgs\n\n  // Upload files one at a time\n  // Using for cycle to simplify dealing with async behavior\n  for (let i = 0; i < files.length; i++) {\n    const file = files[i]\n    log.info('Moving ', file)\n    const status = await ssh.putFile(file, `${buildPath}/${file}`)\n    log.info('status', status, 'file', file)\n  }\n\n  // Upload folders one at a time\n  // Using for cycle to simplify dealing with async behavior\n  for (let i = 0; i < folders.length; i++) {\n    const folder = folders[i]\n    const status = await ssh.putDirectory(folder, `${buildPath}/${folder}`, {\n      recursive: true,\n      concurrency: 1,\n      tick: function (localPath: string, _remotePath: string, error: Error | null) {\n        log.info('Moving ', localPath)\n        if (error) {\n          log.error(error)\n          throw error\n        }\n      },\n    })\n    log.info('status', status, 'folder', folder)\n  }\n  log.info('finished deployUpload')\n}\n","import log from 'loglevel'\nimport { healthCheckFunction } from '../configuration/interface'\n\nconst pollIntervalMs = 2000\nconst maxAttempts = 15\n\n// Polls the app on the remote machine until it responds with http status 200,\n// checking every 2s for up to 30s total\nexport const healthCheck: healthCheckFunction = async (ssh, port) => {\n  log.info('start healthCheck')\n\n  // Calls localhost with specified port on the remote machine and checks if respond http status is 200\n  const command = `curl -I -s -o /dev/null -L -w \"%{http_code}\" http://localhost:${port} | grep 200`\n\n  let lastResult\n  for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n    await sleep(pollIntervalMs)\n    lastResult = await ssh.execCommand(command)\n    log.debug('Executing command:', command, lastResult)\n\n    if (!lastResult.code || lastResult.code === 0) {\n      if (lastResult.stderr) {\n        log.warn(lastResult.stderr)\n      }\n      log.info('finished healthCheck')\n      return\n    }\n    log.info(`Health check attempt ${attempt}/${maxAttempts} failed, retrying in ${pollIntervalMs / 1000}s`)\n  }\n\n  if (lastResult && lastResult.stderr) {\n    log.error(lastResult.stderr)\n  }\n  throw new Error('HEALTH CHECK FAILED')\n}\n\n// UTIL\nfunction sleep(ms: number) {\n  return new Promise(resolve => {\n    setTimeout(resolve, ms)\n  })\n}\n","\nexport const createTimestamp = (date: Date) => {\n  const timestamp = `${date.toISOString().split('T')[0]}.${date\n    .toISOString()\n    .split('T')[1]\n    .split('.')[0]\n    .replace(/\\:/g, '-')}`\n  return timestamp\n}","import { setupDynamicArgsFunction } from \"../../configuration/interface\"\nimport { createTimestamp } from '../util/createTimestamp'\n\nconst parseCommitTimestamp = (rawTimestamp: string): Date => {\n  if (/^\\d+$/.test(rawTimestamp)) {\n    return new Date(parseInt(rawTimestamp, 10) * 1000)\n  }\n  return new Date(rawTimestamp)\n}\n\nexport const setupDynamicArgs: setupDynamicArgsFunction = async (deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh) => {\n  const sha = process.env.CI_COMMIT_SHORT_SHA\n  const commitDate = parseCommitTimestamp(process.env.CI_TOOLS_COMMIT_TIMESTAMP)\n  const timestamp = createTimestamp(commitDate)\n  const { getAppName } = serverConfig\n  const appName = await getAppName(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh)\n  const buildPath = `${environmentConfig.uploadConfig.uploadTo}/${appName}/${timestamp}.${sha}`\n\n  dynamicArgs.commitDate = commitDate\n  dynamicArgs.buildPath = buildPath\n}","import { pm2DeployStart, pm2DeployBefore, pm2OnStop, pm2DeployAfter, pm2Revert } from '../deploy/pm2/pm2'\nimport { deployUpload } from '../deploy/upload'\nimport { healthCheck } from '../deploy/healthCheck'\nimport { PartialCiConfig, PartialDeployConfig } from './interface'\nimport { setupDynamicArgs } from '../deploy/environments/setupDynamicArgs'\n\n\nexport const ciConfigDefaults: PartialCiConfig = {\n  build: {\n    before: [],\n    main: [\n      'yarn build',\n    ],\n    after: []\n  },\n  deploy: {\n    before: [],\n    main: [\n      'yarn ci:deploy',\n    ],\n    after: []\n  },\n  stop: {\n    before: [],\n    main: [\n      'yarn ci:stop'\n    ],\n    after: []\n  },\n  revert: {\n    before: [],\n    main: [\n      'yarn ci:revert'\n    ],\n    after: []\n  }\n}\n\nexport const deployConfigDefaults: PartialDeployConfig = {\n  requiredEnvVars: ['CI_COMMIT_SHORT_SHA', 'CI_TOOLS_COMMIT_TIMESTAMP', 'CI_COMMIT_TAG'],\n  setupDynamicArgs: setupDynamicArgs,\n  deployBefore: pm2DeployBefore, // Using pm2 deploy before to setup vars for pm2 upload and deploy\n  deployUpload: deployUpload, // Using tar archive ssh upload as default (deployUploadFiles is the per-file alternative)\n  deployStart: pm2DeployStart, // Using pm2 deploy as default\n  healthCheck: healthCheck, // Using default basic health check\n  deployAfter: pm2DeployAfter, // Using pm2 cleanup as default\n  onStop: pm2OnStop, // Using pm2 onStop as default\n  onRevert: pm2Revert, // Using pm2 revert as default\n  environments: [],\n\n}","\nimport fs from 'fs'\nimport log from 'loglevel'\nimport { validateAsClass, ValidationResult } from 'joiful'\nimport deepmerge from 'deepmerge'\n\nimport { DeployConfig, PartialDeployConfig, CiConfig, PartialCiConfig, EnvironmentConfig } from './interface'\nimport { ciConfigDefaults, deployConfigDefaults } from './defaults'\n\n\nexport const loadConfigFile = async (configFile: string): Promise<PartialDeployConfig | PartialCiConfig> => {\n    const configPath = `${process.cwd()}/${configFile}`\n    if (!fs.existsSync(configPath)) {\n        throw Error(`Missing configuration file on path: ${configPath}`)\n    }\n    const userConfig = requireFunc(configPath)\n    return userConfig\n}\n\nexport const getDeployConfiguration = async (configFile: string): Promise<DeployConfig> => {\n    const userConfig = await loadConfigFile(configFile) as PartialDeployConfig\n    // Casting type because we validate config below and it should be complete (the validation isn't perfect, but we can assume it's enough)\n    // TODO add deepfreeze?\n    const deployConfig = deepmerge(deployConfigDefaults, userConfig, { arrayMerge: overrideEmpty }) as DeployConfig\n    validateDeployConfiguration(deployConfig)\n    return deployConfig\n}\n\nexport const getCiConfiguration = async (configFile: string): Promise<CiConfig> => {\n    const userConfig = await loadConfigFile(configFile) as PartialCiConfig\n    // Casting type because we validate config below and it should be complete (the validation isn't perfect, but we can assume it's enough)\n    // TODO add deepfreeze?\n    const ciConfig = deepmerge(ciConfigDefaults, userConfig, { arrayMerge: overrideEmpty }) as CiConfig\n    validateCiConfiguration(ciConfig)\n    return ciConfig\n}\n\nconst validateDeployConfiguration = (deployConfig: DeployConfig) => {\n    const validationResult: ValidationResult<DeployConfig> = validateAsClass(deployConfig, DeployConfig)\n    // TODO better validation error messages\n    log.debug('Config validation result', validationResult)\n    if (validationResult.error) {\n        throw validationResult.error\n    }\n}\n\nconst validateCiConfiguration = (ciConfig: CiConfig) => {\n    const validationResult: ValidationResult<CiConfig> = validateAsClass(ciConfig, CiConfig)\n    // TODO better validation error messages\n    log.debug('Config validation result', validationResult)\n    if (validationResult.error) {\n        throw validationResult.error\n    }\n}\n\n// UTIL\nconst overrideEmpty = (destinationArray: any[], sourceArray: any[]): any[] => {\n    if (sourceArray && sourceArray.length) {\n        return sourceArray;\n    }\n    return destinationArray;\n}\n\nexport const getEnvironmentConfig = (deployConfig: DeployConfig, environmentName: string): EnvironmentConfig => {\n    const environmentConfig = deployConfig.environments.find(environmentConfig => {\n        const { environmentName: name } = environmentConfig\n        return name === environmentName\n    })\n    return environmentConfig\n}\n\n// // Webpack safe require\nconst requireFunc = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require;\n","import { ciPhaseRunner } from '../ciStages/ciPhaseRunner'\nimport { getCiConfiguration } from '../configuration/configuration'\nimport { CiPhase, CiStage } from '../configuration/interface'\n\nexport type cliStageOptions = {\n  stage: CiStage,\n  phase: CiPhase,\n  config: string,\n}\n\nconst cliStage = async (options: cliStageOptions) => {\n  const { stage, phase, config: configFile } = options\n\n  // Get config\n  const ciConfig = await getCiConfiguration(configFile)\n\n  // Validate stage and phase args\n  // Obsolete since cli validates this\n  if (!stage || !['deploy', 'build', 'stop', 'revert'].includes(stage) || !phase || !['before', 'main', 'after'].includes(phase)) {\n    throw Error(`Missing or invalid stage or phase arguments`)\n  }\n\n  await ciPhaseRunner(ciConfig, stage, phase)\n}\n\nexport default cliStage","import { NodeSSH } from 'node-ssh'\nimport { SshConfig } from '../../configuration/interface'\n\nexport const getSsh = async (sshConfig: SshConfig) => {\n  const ssh = new NodeSSH()\n  await ssh.connect(sshConfig)\n  return ssh\n}","\nexport const validateEnv = (envVarsNames: string[]): void => {\n  envVarsNames.forEach(envVarName => {\n    if (!process.env[envVarName]) {\n      throw Error(`Env var \"${envVarName}\" is not defined. This script require this environment variable to exist, please make sure it's defined correctly in your gitlab ci configuration or by your scripts.`)\n    }\n  })\n}","import { createTagFunction, parseTagFunction } from \"../configuration/interface\";\n\nconst getBranchTagPart = (branch: string): string => {\n  const branchPart = branch ? branch.replace(/\\//g, '-') : ''\n  return branchPart\n}\n\nexport const createEnvironmentRegExpString = (isSemverTag: boolean, isVersionedTag: boolean, environmentName: string, branch: string, namedGroups: boolean = true): string => {\n  const branchPart = getBranchTagPart(branch)\n  let regExpString = `^${environmentName}-`\n\n  if (branchPart) {\n    regExpString += String.raw`${branchPart}-`\n  }\n\n  if (isSemverTag) {\n    regExpString += String.raw`(${namedGroups ? '?<semverVersion>' : ''}\\d+\\.\\d+\\.\\d+)-`\n  }\n\n  if (isVersionedTag) {\n    regExpString += String.raw`releaseNumber\\.(${namedGroups ? '?<releaseNumber>' : ''}\\d+)-`\n  }\n\n  // Remove trailing -\n  regExpString = regExpString.slice(0, -1);\n  return regExpString\n\n}\n\nexport const createEnvironmentRegExp = (isSemverTag: boolean, isVersionedTag: boolean, environmentName: string, branch: string, namedGroups: boolean = true): RegExp => {\n  const regExpString = createEnvironmentRegExpString(isSemverTag, isVersionedTag, environmentName, branch, namedGroups)\n  const regExp = new RegExp(regExpString)\n  return regExp\n}\n\nexport const createTag: createTagFunction = (isSemverTag, isVersionedTag, releaseNumber, semverVersion, environmentName, branch) => {\n  const branchPart = getBranchTagPart(branch)\n  let tag = `${environmentName}-`\n\n  if (branchPart) {\n    tag += `${branchPart}-`\n  }\n\n  if (isSemverTag) {\n    tag += `${semverVersion}-`\n  }\n\n  if (isVersionedTag) {\n    tag += `releaseNumber.${releaseNumber}-`\n  }\n\n  // Remove trailing -\n  tag = tag.slice(0, -1);\n  return tag\n}\n\nexport const parseTag: parseTagFunction = (isSemverTag, isVersionedTag, allTags, environmentName, branch) => {\n\n  const environmentTagRegExp = createEnvironmentRegExp(isSemverTag, isVersionedTag, environmentName, branch)\n  const parseTagVersion = (tag: string, environmentTagRegExp: RegExp): { semverVersion: string, releaseNumber: number } => {\n    const { semverVersion, releaseNumber } = tag.match(environmentTagRegExp)?.groups || {}\n    return { semverVersion, releaseNumber: parseInt(releaseNumber) }\n  }\n\n  const latestTag = allTags.filter(existingTag => {\n    return existingTag.match(environmentTagRegExp) !== null\n  }).sort((existingTagA, existingTagB) => {\n    const { releaseNumber: releaseNumberA } = parseTagVersion(existingTagA, environmentTagRegExp)\n    const { releaseNumber: releaseNumberB } = parseTagVersion(existingTagB, environmentTagRegExp)\n    return releaseNumberA < releaseNumberB ? 1 : -1\n  })[0]\n\n  if (latestTag) {\n    const { semverVersion, releaseNumber } = parseTagVersion(latestTag, environmentTagRegExp)\n    return { semverVersion, releaseNumber }\n  }\n  return { semverVersion: isSemverTag ? '0.0.0 - not specified' : undefined, releaseNumber: isVersionedTag ? 0 : undefined }\n}","import { DeployConfig, EnvironmentConfig } from \"../../configuration/interface\"\nimport { createEnvironmentRegExp } from \"../../util/tagsHelpers\"\n\n// CI_COMMIT_REF_NAME\nexport const getCurrentEnvironment = (deployConfig: DeployConfig): string => {\n\n  const environmentConfig = getCurrentEnvironmentConfig(deployConfig)\n  const { environmentName } = environmentConfig\n  return environmentName\n\n\n}\n\nexport const getCurrentEnvironmentConfig = (deployConfig: DeployConfig): EnvironmentConfig => {\n  if (!process.env.CI_COMMIT_TAG) {\n    throw new Error(`process.env.CI_COMMIT_TAG is not defined or falsy. This package only allows deploys triggered by tags.`)\n  }\n  const environmentConfig = deployConfig.environments.find(environmentConfig => {\n    const { environmentTagIsSemver, environmentTagIsVersioned, environmentName, isMultiEnv } = environmentConfig\n    // RegExp part for any string for multiEnv instead of branch which is unknownNow\n    const branch = isMultiEnv ? '.*?' : undefined\n    const environmentTagRegExp = createEnvironmentRegExp(environmentTagIsSemver, environmentTagIsVersioned, environmentName, branch)\n    return process.env.CI_COMMIT_TAG.match(environmentTagRegExp) !== null\n  })\n\n  if (!environmentConfig) {\n    throw new Error(`Unknown environment`)\n  }\n\n  return environmentConfig\n\n}\n","import log from 'loglevel'\nimport { getSsh } from './util/getSsh'\nimport { DeployConfig, deployAction } from '../configuration/interface'\nimport { validateEnv } from './environments/validateEnvironment'\nimport { getCurrentEnvironmentConfig } from './environments/deployEnvironment'\n\nexport const deploy = async (deployConfig: DeployConfig, action: deployAction) => {\n    // Validate environments\n    validateEnv(deployConfig.requiredEnvVars)\n    const environmentConfig = getCurrentEnvironmentConfig(deployConfig)\n    const { environmentName } = environmentConfig\n\n    if (action === 'revert' && !environmentConfig.revertible) {\n        throw new Error(`Environment \"${environmentName}\" is not revertible. Set \"revertible: true\" in its config to keep the previous build on the server.`)\n    }\n\n    log.info(`Running deploy for environment: ${environmentName} with action ${action}`)\n\n    const servers = environmentConfig.servers\n\n    // Process all configured servers\n    // Using for loop so all awaited promises must be resolved before next cycle\n    for (let index = 0; index < servers.length; index++) {\n        const serverConfig = servers[index]\n\n        log.info(`Processing host \"${serverConfig.sshConfig.host}\"`)\n\n        // Add user created dynamicArgs (can be mutated in any deploy function, usually deploy before)\n        const dynamicArgs: { [key: string]: any } = {}\n\n        const ssh = await getSsh(serverConfig.sshConfig)\n\n        try {\n            const nill = async () => { }\n\n            // Setup dynamicArgs\n            await (deployConfig.setupDynamicArgs || environmentConfig.setupDynamicArgs || nill)(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh);\n            // Run before deploy hook\n            if (action === 'default') {\n                await (environmentConfig.deployBefore || deployConfig.deployBefore || nill)(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh);\n                // Upload files from runner to server\n                await (environmentConfig.deployUpload || deployConfig.deployUpload)(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh);\n                // Start uploaded build\n                await (environmentConfig.deployStart || deployConfig.deployStart)(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh);\n                // Run after deploy hook\n                await (environmentConfig.deployAfter || deployConfig.deployAfter || nill)(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh);\n            }\n\n            if (action === 'stop') {\n                await (environmentConfig.onStop || deployConfig.onStop)(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh);\n            }\n\n            if (action === 'revert') {\n                // Switch the app back to the previous build kept on the server\n                await (environmentConfig.onRevert || deployConfig.onRevert)(deployConfig, environmentConfig, serverConfig, dynamicArgs, ssh);\n            }\n        } finally {\n            // Dispose this server's ssh connection even when a hook throws\n            ssh.dispose()\n        }\n    }\n}\n","import { getDeployConfiguration } from '../configuration/configuration'\nimport { deployAction } from '../configuration/interface'\nimport { deploy } from '../deploy/deploy'\n\nexport type cliDeployOptions = {\n  action: deployAction,\n  config: string\n}\n\n// Validate and prepare configuration than call deploy script\nconst cliDeploy = async (options: cliDeployOptions) => {\n  // Get config\n  const { config: configFile, action } = options\n  const deployConfig = await getDeployConfiguration(configFile)\n\n  // Run deploy script\n  await deploy(deployConfig, action)\n}\n\nexport default cliDeploy","import log from 'loglevel'\nimport { select, input, confirm } from '@inquirer/prompts'\nimport chalk from 'chalk'\nimport { exec } from '../util/exec';\nimport { getDeployConfiguration, getEnvironmentConfig } from '../configuration/configuration';\n\n\n// TODO check if everything is pushed before triggering deploy\n\nexport type cliCreateEnvOptions = {\n  branch?: string,\n  environment?: string,\n  deployConfig: string,\n}\n\n\nconst isASCII = (str: string) => /^[\\x00-\\x7F]*$/.test(str);\n\n// Compares two major.minor.patch versions segment by segment\nexport const isVersionGreater = (next: string, previous: string): boolean => {\n  const parse = (version: string): number[] => {\n    const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/)\n    return match ? [parseInt(match[1], 10), parseInt(match[2], 10), parseInt(match[3], 10)] : [0, 0, 0]\n  }\n  const nextParts = parse(next)\n  const previousParts = parse(previous)\n  for (let i = 0; i < 3; i++) {\n    if (nextParts[i] !== previousParts[i]) {\n      return nextParts[i] > previousParts[i]\n    }\n  }\n  return false\n}\n\n// GIT helpers\nconst gitGetTags = async () => {\n  // first fetch all from remote to make sure we are not missing any tags\n  await exec('git fetch --all')\n  const result = await exec('git tag')\n  const tags = result.replace(/[ \\*] /g, '').split('\\n');\n  return tags\n}\n\nconst gitCreateTag = async (tag: string, branch: string, remote: string = 'origin', message: string = '') => {\n  // TODO tag messages\n  await exec(`git tag -f -a ${tag} -m \"${message}\" ${remote}/${branch}`, { shell: true })\n}\n\nconst gitPushTag = async (tag: string, remote: string = 'origin') => {\n  await exec(`git push -f ${remote} ${tag}`)\n}\n\nconst gitGetBranches = async () => {\n  const result = await exec('git branch')\n  const branches = result.replace(/[ \\*] /g, '').split('\\n');\n  const currentBranch = result.split('\\n').find(line => line.includes('*')).replace(/[ \\*] /g, '')\n  return { branches, currentBranch }\n}\n\n\n\nconst cliCreateEnv = async (options: cliCreateEnvOptions) => {\n  try {\n    const { deployConfig: configFile } = options\n    const deployConfig = await getDeployConfiguration(configFile)\n\n    const environments = deployConfig.environments.map(environmentConfig => {\n      const { environmentName } = environmentConfig\n      return environmentName\n    })\n\n    // Extract some info from current tags\n    const { branches, currentBranch } = await gitGetBranches()\n    const gitTags = await gitGetTags()\n\n    // Environment (CLI option skips the prompt, same as the other answers below)\n    const environment = options.environment || await select({\n      message: 'Please select environment',\n      choices: environments.map(environmentName => ({ value: environmentName })),\n      default: 'preview',\n    })\n\n    const environmentConfig = getEnvironmentConfig(deployConfig, environment)\n    if (!environmentConfig) {\n      throw new Error(`Environment \"${environment}\" is not defined in ${configFile}`)\n    }\n    const {\n      defaultEnvironmentBranch,\n      environmentTagCreate,\n      environmentTagParseVersion,\n      environmentTagIsSemver,\n      environmentTagIsVersioned,\n      isMultiEnv,\n    } = environmentConfig\n\n    // Branch\n    const branch = options.branch || await select({\n      message: 'Select branch you would like to create environment for',\n      choices: branches.map(branchName => ({ value: branchName })),\n      default: defaultEnvironmentBranch && branches.includes(defaultEnvironmentBranch) ? defaultEnvironmentBranch : currentBranch,\n    })\n    if (!isASCII(branch)) {\n      throw new Error(`Selected branch ${chalk.yellow(branch)} contains non ASCII characters. Please rename your branch and try again.`)\n    }\n\n    const tagBranch = isMultiEnv ? branch : undefined\n    const { semverVersion: latestVersion, releaseNumber } = environmentTagParseVersion(environmentTagIsSemver, environmentTagIsVersioned, gitTags, environment, tagBranch)\n\n    // New semver version (only for semver-tagged environments)\n    let semverVersion: string | undefined\n    if (environmentTagIsSemver) {\n      semverVersion = await input({\n        message: `Please add new app version - latest version is: ${chalk.green(latestVersion)} (major.minor.patch semver format)`,\n        validate: (value: string) => {\n          if (!value.match(/^\\d+\\.\\d+\\.\\d+$/)) {\n            return 'Version must be in format [major].[minor].[patch] ex: 3.1.4'\n          }\n          if (!isVersionGreater(value, latestVersion)) {\n            return `Inputted version ${chalk.red(value)} is the same or lower than previous version ${chalk.red(latestVersion)}. Please increment version with every release.`\n          }\n          return true\n        },\n      })\n    }\n\n    const newTag = environmentTagCreate(environmentTagIsSemver, environmentTagIsVersioned, releaseNumber + 1, semverVersion, environment, tagBranch)\n\n    let confirmationMessage = `Do you really wish to deploy branch ${chalk.green(branch)} to environment ${chalk.green(environment)}. This operation will create tag ${chalk.green(newTag)} from latest commit of branch origin/${chalk.green(branch)} and push it to your remote. Gitlab should handle the rest.`\n    if (defaultEnvironmentBranch && branch !== defaultEnvironmentBranch) {\n      confirmationMessage += '\\n'\n      confirmationMessage += chalk.yellow(`WARNING: You are trying to release to ${environment} other branch than default environment branch: ${defaultEnvironmentBranch}. Are you sure you know what you are doing?`)\n    }\n\n    const confirmed = await confirm({ message: confirmationMessage })\n\n    // Create and push tag if confirmed\n    if (confirmed) {\n      await gitCreateTag(newTag, branch)\n      await gitPushTag(newTag)\n      log.info('Everything seems all right. Check out your gitlab CI/CD page and see if your pipeline is running.')\n    } else {\n      log.info('Creating tag aborted')\n    }\n\n  } catch (error) {\n    log.error(error)\n    throw Error('Failed to create env')\n  }\n\n\n}\n\nexport default cliCreateEnv\n","import yaml from 'js-yaml'\nimport { createBaseConfigFunction, DeployConfig, EnvironmentConfig, Json } from \"../configuration/interface\"\nimport { createEnvironmentRegExpString } from '../util/tagsHelpers'\n\n\n\nexport const defaultStages: string[] = [\n  \"ci-tools-build\",\n  \"ci-tools-deploy\"\n]\n\nexport const defaultBuildTemplate: Json = {\n  \"image\": \"$CI_TOOLS_IMAGE\",\n  \"stage\": \"ci-tools-build\",\n  \"before_script\": [\n    \"yarn install --frozen-lockfile --prefer-offline\",\n    \"export CI_TOOLS_COMMIT_TIMESTAMP=\\\"$CI_COMMIT_TIMESTAMP\\\"\",\n    \"export CI_TOOLS_COMMIT_AUTHOR=\\\"$CI_COMMIT_AUTHOR\\\"\",\n    \"export CI_TOOLS_COMMIT_MESSAGE=\\\"$CI_COMMIT_MESSAGE\\\"\",\n    \"yarn ci stage --stage=build --phase=before\"\n  ],\n  \"script\": [\n    \"yarn ci stage --stage=build --phase=main\"\n  ],\n  \"after_script\": [\n    \"yarn ci stage --stage=build --phase=after\"\n  ],\n  \"artifacts\": {\n    \"paths\": [\n      \"./build\"\n    ],\n    \"expire_in\": \"7 days\"\n  }\n}\n\nexport const defaultDeployTemplate: Json = {\n  \"image\": \"$CI_TOOLS_IMAGE\",\n  \"stage\": \"ci-tools-deploy\",\n  \"before_script\": [\n    \"yarn install --frozen-lockfile --prefer-offline\",\n    \"export CI_TOOLS_COMMIT_TIMESTAMP=\\\"$CI_COMMIT_TIMESTAMP\\\"\",\n    \"export CI_TOOLS_COMMIT_AUTHOR=\\\"$CI_COMMIT_AUTHOR\\\"\",\n    \"export CI_TOOLS_COMMIT_MESSAGE=\\\"$CI_COMMIT_MESSAGE\\\"\",\n    \"yarn ci stage --stage=deploy --phase=before\"\n  ],\n  \"script\": [\n    \"yarn ci stage --stage=deploy --phase=main\"\n  ],\n  \"after_script\": [\n    \"yarn ci stage --stage=deploy --phase=after\"\n  ]\n}\n\nexport const defaultStopTemplate: Json = {\n  \"image\": \"$CI_TOOLS_IMAGE\",\n  \"stage\": \"ci-tools-deploy\",\n  \"before_script\": [\n    \"yarn install --frozen-lockfile --prefer-offline\",\n    \"export CI_TOOLS_COMMIT_TIMESTAMP=\\\"$CI_COMMIT_TIMESTAMP\\\"\",\n    \"export CI_TOOLS_COMMIT_AUTHOR=\\\"$CI_COMMIT_AUTHOR\\\"\",\n    \"export CI_TOOLS_COMMIT_MESSAGE=\\\"$CI_COMMIT_MESSAGE\\\"\",\n    \"yarn ci stage --stage=stop --phase=before\"\n  ],\n  \"script\": [\n    \"yarn ci stage --stage=stop --phase=main\"\n  ],\n  \"after_script\": [\n    \"yarn ci stage --stage=stop --phase=after\"\n  ],\n  \"environment\": {\n    \"action\": \"stop\"\n  },\n  \"dependencies\": []\n}\n\n\nexport const defaultRevertTemplate: Json = {\n  \"image\": \"$CI_TOOLS_IMAGE\",\n  \"stage\": \"ci-tools-deploy\",\n  \"before_script\": [\n    \"yarn install --frozen-lockfile --prefer-offline\",\n    \"export CI_TOOLS_COMMIT_TIMESTAMP=\\\"$CI_COMMIT_TIMESTAMP\\\"\",\n    \"export CI_TOOLS_COMMIT_AUTHOR=\\\"$CI_COMMIT_AUTHOR\\\"\",\n    \"export CI_TOOLS_COMMIT_MESSAGE=\\\"$CI_COMMIT_MESSAGE\\\"\",\n    \"yarn ci stage --stage=revert --phase=before\"\n  ],\n  \"script\": [\n    \"yarn ci stage --stage=revert --phase=main\"\n  ],\n  \"after_script\": [\n    \"yarn ci stage --stage=revert --phase=after\"\n  ],\n  \"dependencies\": []\n}\n\n\nexport const createBaseConfig: createBaseConfigFunction = (\n  buildTemplate,\n  deployTemplate,\n  stopTemplate,\n  stages,\n  revertTemplate,\n) => {\n  const baseConfig = {\n    stages,\n    \".build\": buildTemplate,\n    \".deploy\": deployTemplate,\n    \".stop\": stopTemplate,\n    \".revert\": revertTemplate\n  }\n  return baseConfig\n}\n\nconst createEnvironmentBuildCiConfig = (environmentConfig: EnvironmentConfig) => {\n\n  const { environmentTagIsSemver, environmentTagIsVersioned, environmentName, isMultiEnv } = environmentConfig\n  // RegExp part for any string for multiEnv instead of branch which is unknownNow\n  const branch = isMultiEnv ? '.*?' : undefined\n  const environmentTagRegExpString = createEnvironmentRegExpString(environmentTagIsSemver, environmentTagIsVersioned, environmentName, branch, false)\n  const environmentBuildCiConfig = {\n    \"extends\": \".build\",\n    \"rules\": [\n      {\n        \"if\": `$CI_COMMIT_TAG  =~ /${environmentTagRegExpString}/`\n      }\n    ]\n  }\n  return environmentBuildCiConfig\n}\n\nconst createEnvironmentDeployCiConfig = (environmentConfig: EnvironmentConfig) => {\n  const { environmentName, auto_stop_in, deployManual, environmentTagIsSemver, environmentTagIsVersioned, isMultiEnv } = environmentConfig\n\n  // RegExp part for any string for multiEnv instead of branch which is unknownNow\n  const branch = isMultiEnv ? '.*?' : undefined\n  const environmentTagRegExpString = createEnvironmentRegExpString(environmentTagIsSemver, environmentTagIsVersioned, environmentName, branch, false)\n  // TODO better type\n  const environmentDeployCiConfig: any = {\n    \"extends\": \".deploy\",\n    \"rules\": [\n      {\n        \"if\": `$CI_COMMIT_TAG  =~ /${environmentTagRegExpString}/`\n      }\n    ],\n    \"environment\": {\n      \"name\": `${environmentName}/$CI_COMMIT_TAG`,\n    }\n  }\n  if (auto_stop_in) {\n    environmentDeployCiConfig.environment.on_stop = `stop_${environmentName}`\n    environmentDeployCiConfig.environment.auto_stop_in = auto_stop_in\n  }\n  if (deployManual) {\n    environmentDeployCiConfig.rules[0].when = \"manual\"\n  }\n  return environmentDeployCiConfig\n}\n\nconst createEnvironmentStopCiConfig = (environmentConfig: EnvironmentConfig) => {\n  const { environmentTagIsSemver, environmentTagIsVersioned, environmentName, isMultiEnv } = environmentConfig\n  // RegExp part for any string for multiEnv instead of branch which is unknownNow\n  const branch = isMultiEnv ? '.*?' : undefined\n  const environmentTagRegExpString = createEnvironmentRegExpString(environmentTagIsSemver, environmentTagIsVersioned, environmentName, branch, false)\n  const environmentStopCiConfig = {\n    \"extends\": \".stop\",\n    \"rules\": [\n      {\n        \"if\": `$CI_COMMIT_TAG  =~ /${environmentTagRegExpString}/`,\n        \"when\": \"manual\"\n      }\n    ],\n    \"environment\": {\n      \"name\": `${environmentName}/$CI_COMMIT_TAG`\n    }\n  }\n  return environmentStopCiConfig\n}\n\n// Manual job switching a revertible environment back to the previous build\nconst createEnvironmentRevertCiConfig = (environmentConfig: EnvironmentConfig) => {\n  const { environmentTagIsSemver, environmentTagIsVersioned, environmentName, isMultiEnv } = environmentConfig\n  // RegExp part for any string for multiEnv instead of branch which is unknownNow\n  const branch = isMultiEnv ? '.*?' : undefined\n  const environmentTagRegExpString = createEnvironmentRegExpString(environmentTagIsSemver, environmentTagIsVersioned, environmentName, branch, false)\n  const environmentRevertCiConfig = {\n    \"extends\": \".revert\",\n    \"rules\": [\n      {\n        \"if\": `$CI_COMMIT_TAG  =~ /${environmentTagRegExpString}/`,\n        \"when\": \"manual\"\n      }\n    ]\n  }\n  return environmentRevertCiConfig\n}\n\nconst createEnvironmentCiConfig = (environmentConfig: EnvironmentConfig) => {\n  // TODO better type\n  const environmentCiConfig: any = {}\n  const { auto_stop_in, revertible, environmentName } = environmentConfig\n  environmentCiConfig[`build_${environmentName}`] = createEnvironmentBuildCiConfig(environmentConfig)\n  environmentCiConfig[`deploy_${environmentName}`] = createEnvironmentDeployCiConfig(environmentConfig)\n  if (auto_stop_in) {\n    environmentCiConfig[`stop_${environmentName}`] = createEnvironmentStopCiConfig(environmentConfig)\n  }\n  if (revertible) {\n    environmentCiConfig[`revert_${environmentName}`] = createEnvironmentRevertCiConfig(environmentConfig)\n  }\n  return environmentCiConfig\n}\n\nexport const createCiConfig = (deployConfig: DeployConfig) => {\n  const { environments } = deployConfig\n  const baseConfig = (deployConfig.createBaseConfig || createBaseConfig)(defaultBuildTemplate, defaultDeployTemplate, defaultStopTemplate, defaultStages, defaultRevertTemplate)\n  // TODO better type\n  const ciConfig = environments.reduce((ciConfig: any, environmentConfig) => {\n    ciConfig = { ...ciConfig, ...createEnvironmentCiConfig(environmentConfig) }\n    return ciConfig\n  }, baseConfig)\n\n  const yamlCiConfig = yaml.dump(ciConfig, {\n    lineWidth: -1,\n\n  })\n\n  return yamlCiConfig\n}","import chalk from 'chalk'\nimport { diffChars } from 'diff'\n\nexport const getDiff = (base: string, compare: string): string => {\n  const changes = diffChars(base, compare)\n  const hasChanges = changes.some(change => {\n    return change.added || change.removed\n  })\n  if (hasChanges) {\n    return changes.reduce((diffString: string, part) => {\n      diffString += part.added ? chalk.green(part.value) :\n        part.removed ? chalk.red(part.value) : chalk.grey(part.value);\n      return diffString\n    }, '')\n  }\n  return ''\n}\n","import fs from 'fs'\nimport { getDeployConfiguration } from \"../configuration/configuration\"\nimport { createCiConfig } from \"../gitlabCi/createGitlabCiConfig\"\nimport { getDiff } from '../util/diff'\nimport log from 'loglevel'\n\nexport type cliCreateCiConfigOptions = {\n  deployConfig: string,\n  outputFile: string,\n  dryRun: boolean,\n}\n\nexport const cliCreateCiConfig = async (options: cliCreateCiConfigOptions) => {\n  const { deployConfig: configFile, dryRun, outputFile } = options\n  // TODO DRY RUN\n  const deployConfig = await getDeployConfiguration(configFile)\n  const newConfig = createCiConfig(deployConfig)\n  const outputPath = `${process.cwd()}/${outputFile}`\n  const outputExists = fs.existsSync(outputPath)\n  const currentConfig = outputExists ? fs.readFileSync(outputPath, 'utf8') : ''\n  const diff = getDiff(currentConfig, newConfig)\n  if (diff) {\n    log.info(`Differences found`)\n    if (dryRun) {\n      log.info(`Dry run. No changes will be saved. See diff below:`)\n      log.info(diff)\n    } else {\n      log.info(`Saving new config to location ${outputPath}. Please commit new config before deploying.`)\n      fs.writeFileSync(outputPath, newConfig)\n    }\n  } else {\n    log.info('There are no changes required in your CI configuration, no actions required. You are ready to deploy.')\n  }\n\n}","/**\n * @siteone/gitlab-ci-deploy\n */\nimport { deploy } from './deploy/deploy'\nimport { pm2DeployStart, pm2DeployBefore, pm2OnStop, pm2DeployAfter, pm2Revert, getRevertState } from './deploy/pm2/pm2'\nimport { deployUpload, deployUploadFiles } from './deploy/upload'\nimport { healthCheck } from './deploy/healthCheck'\nimport { getCurrentEnvironment, getCurrentEnvironmentConfig } from './deploy/environments/deployEnvironment'\nimport { setupDynamicArgs } from './deploy/environments/setupDynamicArgs'\nimport { exec } from './util/exec'\nimport { sendMessage } from './mattermost/mattermost'\nimport { createTag, parseTag } from './util/tagsHelpers'\nimport { getDeployConfiguration, getCiConfiguration } from './configuration/configuration'\nimport { createBaseConfig, defaultBuildTemplate, defaultDeployTemplate, defaultStopTemplate, defaultRevertTemplate, defaultStages } from './gitlabCi/createGitlabCiConfig'\n\nconst defaultCiConfigFile = 'ci.config.js'\nconst defaultDeployConfigFile = 'deploy.config.js'\n\nexport {\n  defaultDeployConfigFile,\n  defaultCiConfigFile,\n  getDeployConfiguration,\n  getCiConfiguration,\n  deploy,\n  pm2DeployStart,\n  pm2DeployBefore,\n  pm2OnStop,\n  pm2DeployAfter,\n  pm2Revert,\n  getRevertState,\n  getCurrentEnvironment,\n  getCurrentEnvironmentConfig,\n  setupDynamicArgs,\n  deployUpload,\n  deployUploadFiles,\n  healthCheck,\n  exec,\n  sendMessage,\n  createTag,\n  parseTag,\n  createBaseConfig,\n  defaultBuildTemplate,\n  defaultDeployTemplate,\n  defaultStopTemplate,\n  defaultRevertTemplate,\n  defaultStages\n}\n\n","#!/usr/bin/env node\nimport log from 'loglevel'\nimport { initLogger } from '../util/logger'\nimport cliStage, { cliStageOptions } from './cliStage';\nimport { Command, Option } from 'commander'\nimport cliDeploy, { cliDeployOptions } from './cliDeploy';\nimport cliCreateEnv, { cliCreateEnvOptions } from './cliCreateEnv';\nimport { cliCreateCiConfig, cliCreateCiConfigOptions } from './cliCreateCiConfig';\n\nimport { defaultCiConfigFile, defaultDeployConfigFile } from '../index'\n\nconst program = new Command();\n\nconst cli = async () => {\n  try {\n\n\n    // Stage command\n    program\n      .command('stage')\n      .addOption(\n        new Option('-s, --stage <name>', 'Stage you would like to run')\n          .choices(['deploy', 'build', 'stop', 'revert'])\n      )\n      .addOption(\n        new Option('-p, --phase <phase>', 'Phase you would like to run')\n          .choices(['before', 'main', 'after'])\n      )\n      .option('-c, --config <path>', 'Path to ci config file', defaultCiConfigFile)\n      .description('Load config and run configured stage scripts')\n      .action(async (options: cliStageOptions) => {\n        log.debug(`Running cli stage with options ${JSON.stringify(options)}`)\n        await cliStage(options)\n      })\n\n    // Phase command\n    program\n      .command('deploy')\n      .addOption(\n        new Option('-a, --action [action]', 'Deploy action')\n          .choices(['default', 'stop', 'revert'])\n          .default('default')\n      )\n\n      .option('-c, --config <path>', 'Path to deploy config file', defaultDeployConfigFile)\n      .description('Load config and run configured deploy scripts')\n      .action(async (options: cliDeployOptions) => {\n        log.debug(`Running cli deploy with options ${JSON.stringify(options)}`)\n        await cliDeploy(options)\n      })\n\n    // CreateEnv command\n    program\n      .command('createEnv')\n      .option('-c, --deployConfig <path>', 'Path to deploy config file', defaultDeployConfigFile)\n      .addOption(\n        new Option('-e, --environment <env>', 'Environment name from your deploy config')\n      )\n      .addOption(\n        new Option('-b, --branch <branch>')\n      )\n      .action(async (options: cliCreateEnvOptions) => {\n        log.debug(`Running cli createEnv with options ${JSON.stringify(options)}`)\n        await cliCreateEnv(options)\n      })\n\n    // CreateCiConfig command\n    program\n      .command('createCiConfig')\n      .option('-c, --deployConfig <path>', 'Path to deploy config file', defaultDeployConfigFile)\n      .option('-d, --dryRun', 'Does not write any files, just report if there are any changes', false)\n      .option('-o, --outputFile <path>', 'Your ci config yml file name', 'ci-tools-gl-config.yml')\n      .action(async (options: cliCreateCiConfigOptions) => {\n        log.debug(`Running cli createCiConfig with options ${JSON.stringify(options)}`)\n        await cliCreateCiConfig(options)\n      })\n\n    await program.parseAsync(process.argv);\n  } catch (error) {\n    console.error(error)\n    log.error(error)\n    process.exit(1)\n  }\n}\n\n\n\n\ninitLogger()\ncli()\n\n\n"],"names":["initLogger","colors","TRACE","chalk","magenta","DEBUG","cyan","INFO","blue","WARN","yellow","ERROR","red","prefix","reg","log","enableAll","apply","format","level","name","timestamp","gray","toUpperCase","green","process","env","CI_TOOLS_DEBUG","envDebug","Object","keys","levels","includes","setLevel","exec","command","options","debug","pass","PassThrough","on","chunk","toString","subprocess","execa","stdout","pipe","result","ciPhaseRunner","config","stage","phase","commands","info","i","length","shell","SshConfig","host","username","privateKey","__decorate","string","required","UploadConfig","files","folders","uploadTo","array","items","joi","ServersConfig","getPort","getAppName","sshConfig","func","optional","object","EnvironmentConfig","environmentName","environmentTagCreate","environmentTagParseVersion","environmentTagIsSemver","environmentTagIsVersioned","deployManual","defaultEnvironmentBranch","isMultiEnv","revertible","envVars","uploadConfig","setupDynamicArgs","deployBefore","deployUpload","deployStart","deployAfter","onStop","onRevert","healthCheck","servers","auto_stop_in","boolean","elementClass","DeployConfig","environments","requiredEnvVars","createBaseConfig","CiScripts","before","main","after","CiConfig","deploy","build","stop","revert","releaseNumber","semverVersion","APP_ENV","KEY_MASTER","pm2Start","buildPath","pm2Env","appName","appPort","prependCommand","ssh","pm2ConfigFile","pm2Del","startCommand","startResult","execCommand","cwd","code","error","stderr","Error","warn","pm2Save","delCommand","delResult","shellQuote","value","String","replace","buildEnvVarsPrepend","dynamicEnvVars","allEnvVars","forEach","varName","varValue","pm2DeployStart","deployConfig","environmentConfig","serverConfig","dynamicArgs","port","pm2DeployBefore","_deployConfig","_environmentConfig","_serverConfig","_dynamicArgs","pm2DeployAfter","buildParentDir","slice","lastIndexOf","allBuildDirs","getSubdirectories","appCWD","pm2GetAppCWD","inactiveBuildDirs","map","buildDir","filter","sort","reverse","deleteBuildDirs","deleteFolder","getRevertState","buildDirs","Boolean","activeDir","find","inactiveDirs","targetDir","pm2Revert","pm2OnStop","dir","split","folder","processes","JSON","parse","pm2Process","pm2_env","pm_cwd","archiveName","entries","archivePath","path","join","quotedEntries","entry","putFile","unpackCommand","unpackResult","fs","existsSync","unlinkSync","pollIntervalMs","maxAttempts","lastResult","attempt","sleep","ms","Promise","resolve","setTimeout","createTimestamp","date","toISOString","parseCommitTimestamp","rawTimestamp","test","Date","parseInt","sha","CI_COMMIT_SHORT_SHA","commitDate","CI_TOOLS_COMMIT_TIMESTAMP","ciConfigDefaults","deployConfigDefaults","loadConfigFile","configFile","configPath","userConfig","requireFunc","getDeployConfiguration","deepmerge","arrayMerge","overrideEmpty","validateDeployConfiguration","getCiConfiguration","ciConfig","validateCiConfiguration","validationResult","validateAsClass","destinationArray","sourceArray","getEnvironmentConfig","__webpack_require__","__non_webpack_require__","require","cliStage","getSsh","NodeSSH","connect","validateEnv","envVarsNames","envVarName","getBranchTagPart","branch","branchPart","createEnvironmentRegExpString","isSemverTag","isVersionedTag","namedGroups","regExpString","raw","createEnvironmentRegExp","regExp","RegExp","getCurrentEnvironmentConfig","CI_COMMIT_TAG","undefined","environmentTagRegExp","match","action","index","nill","dispose","cliDeploy","isASCII","str","isVersionGreater","next","previous","version","nextParts","previousParts","gitGetTags","tags","gitCreateTag","tag","remote","message","gitPushTag","gitGetBranches","branches","currentBranch","line","cliCreateEnv","gitTags","environment","select","choices","default","branchName","tagBranch","latestVersion","input","validate","newTag","confirmationMessage","confirmed","confirm","defaultStages","defaultBuildTemplate","defaultDeployTemplate","defaultStopTemplate","defaultRevertTemplate","buildTemplate","deployTemplate","stopTemplate","stages","revertTemplate","baseConfig","createEnvironmentBuildCiConfig","environmentTagRegExpString","environmentBuildCiConfig","createEnvironmentDeployCiConfig","environmentDeployCiConfig","on_stop","rules","when","createEnvironmentStopCiConfig","environmentStopCiConfig","createEnvironmentRevertCiConfig","environmentRevertCiConfig","createEnvironmentCiConfig","environmentCiConfig","createCiConfig","reduce","yamlCiConfig","yaml","dump","lineWidth","getDiff","base","compare","changes","diffChars","hasChanges","some","change","added","removed","diffString","part","grey","cliCreateCiConfig","dryRun","outputFile","newConfig","outputPath","outputExists","currentConfig","readFileSync","diff","writeFileSync","defaultCiConfigFile","defaultDeployConfigFile","program","Command","cli","addOption","Option","option","description","stringify","parseAsync","argv","console","exit"],"mappings":"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"}