{"version":3,"sources":["jsdelivr-header.js","/npm/cf-wait-deploy@1.0.2/src/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACJA,MAAM,aAAE,cAAiB,QAAQ,SAEjC,eAAe,MAAM,GACnB,OAAO,IAAI,SAAQ,GAAW,WAAW,EAAS,IACpD,CAEA,SAAS,qBACP,EACA,GAAU,EACV,EAAc,KAEd,SAAS,EAAI,GACP,GAAS,QAAQ,IAAI,EAC3B,CA0EA,eAAe,EAAQ,EAAW,GAChC,IAAI,EACJ,MAAM,EA1ER,WACE,IAAI,GAAY,EAChB,MAAM,EAAU,CAAC,EACX,EAAS,aAAa,CAC1B,cAAe,CAAE,MAAO,IACxB,YAAa,EACb,QAAS,CACP,EAAG,CAAE,MAAO,IACZ,EAAG,CAAE,MAAO,IACZ,EAAG,CAAE,MAAO,OAIhB,OADA,EAAO,MAAM,CAAC,OAAQ,aAAc,OAAQ,SAAU,WAC/C,CACL,MAAA,CAAO,GACL,EAAO,YAAY,SAAQ,IACzB,MAAM,QACJ,EAAO,UACP,EAAS,kBACT,EAAiB,aACjB,EAAY,eACZ,EAAc,qBACd,GACE,EACE,KAAW,IACf,EAAQ,IAAW,EACd,GACH,EAAO,MAAM,CACX,EAAU,eAAe,MAAM,KAAK,GACpC,EACA,EACA,EACA,IAEN,IAEF,GAAY,CACd,EAEJ,CAmCkB,GAChB,EAAG,CACD,MAAO,EAAQ,SAAe,QAAQ,IAAI,CACxC,EAAe,oBAAoB,CAAE,UAAW,IAAa,UAC7D,EAAe,eAAe,CAAE,UAAW,IAAa,YAE1D,EAAQ,OAAO,GACf,EAAU,EAAM,OAAO,GAAG,kBACpB,MAAM,EACd,QAAU,EAAW,SAAS,KAE1B,EAAQ,MAAM,aAAe,EAAQ,MAAM,gBACvC,QAAQ,OAAO,4BAA4B,IACrD,CAUA,MAAO,CAAE,OART,eAAsB,GACpB,MAAM,aAAE,EAAY,YAAE,EAAW,UAAE,GAAc,QAC3C,EAAe,iBAAiB,CAAE,eAAc,gBACtD,MAAM,QAnDR,eAAoC,GAClC,IAGE,aAFM,EAAe,YAAY,GAAQ,UACzC,EAAI,UAAU,EAAO,sBACd,QACT,CAAE,MAAO,GACP,GAAuB,2BAAnB,EAAU,KAAmC,CAC/C,UACQ,EAAe,YAAY,GAAQ,SAC3C,CAAE,MAAO,GACP,GAA0B,oCAAtB,EAAU,QAEZ,OADA,EAAI,EAAU,SACP,QAET,MAAM,CACR,CAEA,OADA,EAAI,UAAU,EAAO,sBACd,QACT,CACA,MAAM,CACR,CACF,CA8BqB,CAAqB,GACxC,GAAa,UAAT,EAAkB,OACtB,MAAM,EA9BR,SAA2B,GACzB,MAAO,CACL,GAAG,aACH,GAAG,sBACH,oBAEJ,CAwBiB,CAAkB,SAC3B,EAAQ,EAAW,EAC3B,EAEF,CAEA,OAAO,QAAU","file":"/npm/cf-wait-deploy@1.0.2/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/cf-wait-deploy@1.0.2/src/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/* eslint-disable no-await-in-loop, no-underscore-dangle */\n\nconst { createStream } = require(\"table\");\n\nasync function sleep(refreshRate) {\n  return new Promise(resolve => setTimeout(resolve, refreshRate));\n}\n\nfunction CloudFormationDeploy(\n  cloudformation,\n  verbose = false,\n  refreshRate = 500\n) {\n  function log(txt) {\n    if (verbose) console.log(txt);\n  }\n\n  function eventManager() {\n    let firstRead = true;\n    const history = {};\n    const stream = createStream({\n      columnDefault: { width: 30 },\n      columnCount: 5,\n      columns: {\n        0: { width: 20 },\n        3: { width: 20 },\n        4: { width: 20 }\n      }\n    });\n    stream.write([\"Time\", \"Logical Id\", \"Type\", \"Status\", \"Reason\"]);\n    return {\n      report(events) {\n        events.StackEvents.forEach(event => {\n          const {\n            EventId,\n            Timestamp,\n            LogicalResourceId,\n            ResourceType,\n            ResourceStatus,\n            ResourceStatusReason\n          } = event;\n          if (!(EventId in history)) {\n            history[EventId] = true;\n            if (!firstRead)\n              stream.write([\n                Timestamp.toTimeString().split(\" \")[0],\n                LogicalResourceId,\n                ResourceType,\n                ResourceStatus,\n                ResourceStatusReason\n              ]);\n          }\n        });\n        firstRead = false;\n      }\n    };\n  }\n\n  async function createOrReplaceStack(params) {\n    try {\n      await cloudformation.createStack(params).promise();\n      log(`Create ${params.StackName} stack...`);\n      return \"CREATE\";\n    } catch (errCreate) {\n      if (errCreate.code === \"AlreadyExistsException\") {\n        try {\n          await cloudformation.updateStack(params).promise();\n        } catch (errUpdate) {\n          if (errUpdate.message === \"No updates are to be performed.\") {\n            log(errUpdate.message);\n            return \"ABORT\";\n          }\n          throw errUpdate;\n        }\n        log(`Update ${params.StackName} stack...`);\n        return \"UPDATE\";\n      }\n      throw errCreate;\n    }\n  }\n\n  function getExpectedStatus(status) {\n    return [\n      `${status}_COMPLETE`,\n      `${status}_ROLLBACK_COMPLETE`,\n      \"ROLLBACK_COMPLETE\"\n    ];\n  }\n\n  async function waitFor(stackName, statusList) {\n    let _status;\n    const _events = eventManager(verbose);\n    do {\n      const [events, stack] = await Promise.all([\n        cloudformation.describeStackEvents({ StackName: stackName }).promise(),\n        cloudformation.describeStacks({ StackName: stackName }).promise()\n      ]);\n      _events.report(events);\n      _status = stack.Stacks[0].StackStatus;\n      await sleep(refreshRate);\n    } while (!statusList.includes(_status));\n\n    if (_status.match(\"ROLLBACK\") || _status.match(\"FAIL\"))\n      await Promise.reject(`Deploy ended with status ${_status}`);\n  }\n\n  async function deploy(params) {\n    const { TemplateBody, TemplateURL, StackName } = params;\n    await cloudformation.validateTemplate({ TemplateBody, TemplateURL });\n    const type = await createOrReplaceStack(params);\n    if (type === \"ABORT\") return;\n    const status = getExpectedStatus(type);\n    await waitFor(StackName, status);\n  }\n  return { deploy };\n}\n\nmodule.exports = CloudFormationDeploy;\n"]}