@hotglue/cli 1.0.31 ā 1.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/lib/cjs/index.js +9 -8
- package/lib/cjs/index.js.map +1 -1
- package/lib/mjs/index.js +9 -8
- package/lib/mjs/index.js.map +1 -1
- package/package.json +1 -1
- package/lib/commands/config/set.js +0 -82
- package/lib/commands/config.js +0 -69
- package/lib/commands/env/deploy.js +0 -162
- package/lib/commands/env/download.js +0 -169
- package/lib/commands/env.js +0 -32
- package/lib/commands/etl/delete.js +0 -171
- package/lib/commands/etl/deploy.js +0 -263
- package/lib/commands/etl/download.js +0 -205
- package/lib/commands/etl.js +0 -32
- package/lib/commands/flows/list.js +0 -104
- package/lib/commands/flows.js +0 -32
- package/lib/commands/jobs/download.js +0 -188
- package/lib/commands/jobs/list.js +0 -108
- package/lib/commands/jobs.js +0 -32
- package/lib/commands/snapshots/deploy.js +0 -202
- package/lib/commands/snapshots/download.js +0 -213
- package/lib/commands/snapshots.js +0 -32
- package/lib/commands/tenants/custom-etl.js +0 -183
- package/lib/commands/tenants/custom-field-map.js +0 -191
- package/lib/commands/tenants/delete.js +0 -150
- package/lib/commands/tenants/list.js +0 -97
- package/lib/commands/tenants/updateConfig.js +0 -188
- package/lib/commands/tenants.js +0 -32
- package/lib/helpers/api.js +0 -326
- package/lib/helpers/baseBuilder.js +0 -30
- package/lib/helpers/config.js +0 -105
- package/lib/helpers/debug.js +0 -19
- package/lib/helpers/descriptions.js +0 -137
- package/lib/helpers/flow.js +0 -32
- package/lib/helpers/print.js +0 -92
- package/lib/helpers/utils.js +0 -245
- package/lib/index.js +0 -12
- package/lib/main.js +0 -27
package/lib/mjs/index.js
CHANGED
|
@@ -1,34 +1,35 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import e,{readFileSync as n,
|
|
2
|
+
import e,{readFileSync as n,writeFile as t,statSync as o,existsSync as s,createWriteStream as r}from"fs";import a,{resolve as i,normalize as c}from"path";import l,{homedir as d}from"os";import u from"yargs";import{format as f,inspect as p}from"util";import"assert";import{fileURLToPath as y}from"url";import{mkdir as g,writeFile as h,readdir as m,readFile as w,stat as b}from"fs/promises";import{cosmiconfig as v}from"cosmiconfig";import $ from"chalk";import k from"aws-sdk";import j from"debug";import _ from"yaml";import O from"cli-table";import E from"ora";import x from"micromatch";import S from"axios";import"progress";import{mkdir as T}from"node:fs/promises";import A from"crypto";function I(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var F,U,N,D,K,B,P,R={};function M(){if(F)return R;F=1;const n=e,t=a,o=l;function s(e){console.log(`[dotenv][DEBUG] ${e}`)}const r=/^\s*([\w.-]+)\s*=\s*("[^"]*"|'[^']*'|[^#]*)?(\s*|\s*#.*)?$/,i=/\\n/g,c=/\r\n|\n|\r/;function d(e,n){const t=Boolean(n&&n.debug),o={};return e.toString().split(c).forEach(function(e,n){const a=e.match(r);if(null!=a){const e=a[1];let n=a[2]||"";const t=n.length-1,s='"'===n[0]&&'"'===n[t];"'"===n[0]&&"'"===n[t]||s?(n=n.substring(1,t),s&&(n=n.replace(i,"\n"))):n=n.trim(),o[e]=n}else if(t){const t=e.trim();t.length&&"#"!==t[0]&&s(`Failed to match key and value when parsing line ${n+1}: ${e}`)}}),o}return R.config=function(e){let r=t.resolve(process.cwd(),".env"),a="utf8";const i=Boolean(e&&e.debug),c=Boolean(e&&e.override);var l;e&&(null!=e.path&&(r="~"===(l=e.path)[0]?t.join(o.homedir(),l.slice(1)):l),null!=e.encoding&&(a=e.encoding));try{const e=d(n.readFileSync(r,{encoding:a}),{debug:i});return Object.keys(e).forEach(function(n){Object.prototype.hasOwnProperty.call(process.env,n)?(!0===c&&(process.env[n]=e[n]),i&&s(!0===c?`"${n}" is already defined in \`process.env\` and WAS overwritten`:`"${n}" is already defined in \`process.env\` and was NOT overwritten`)):process.env[n]=e[n]}),{parsed:e}}catch(e){return i&&s(`Failed to load ${r} ${e.message}`),{error:e}}},R.parse=d,R}function C(){return process.versions.electron&&!process.defaultApp?0:1}
|
|
3
3
|
/**
|
|
4
4
|
* @license
|
|
5
5
|
* Copyright (c) 2016, Contributors
|
|
6
6
|
* SPDX-License-Identifier: ISC
|
|
7
7
|
*/
|
|
8
|
-
function
|
|
8
|
+
function L(e){if(e!==e.toLowerCase()&&e!==e.toUpperCase()||(e=e.toLowerCase()),-1===e.indexOf("-")&&-1===e.indexOf("_"))return e;{let n="",t=!1;const o=e.match(/^-+/);for(let s=o?o[0].length:0;s<e.length;s++){let o=e.charAt(s);t&&(t=!1,o=o.toUpperCase()),0===s||"-"!==o&&"_"!==o?"-"!==o&&"_"!==o&&(n+=o):t=!0}return n}}
|
|
9
9
|
/**
|
|
10
10
|
* @license
|
|
11
11
|
* Copyright (c) 2016, Contributors
|
|
12
12
|
* SPDX-License-Identifier: ISC
|
|
13
13
|
*/
|
|
14
|
+
let z;B||(B=1,M().config(Object.assign({},function(){if(N)return U;N=1;const e={};return null!=process.env.DOTENV_CONFIG_ENCODING&&(e.encoding=process.env.DOTENV_CONFIG_ENCODING),null!=process.env.DOTENV_CONFIG_PATH&&(e.path=process.env.DOTENV_CONFIG_PATH),null!=process.env.DOTENV_CONFIG_DEBUG&&(e.debug=process.env.DOTENV_CONFIG_DEBUG),null!=process.env.DOTENV_CONFIG_OVERRIDE&&(e.override=process.env.DOTENV_CONFIG_OVERRIDE),U=e}(),function(){if(K)return D;K=1;const e=/^dotenv_config_(encoding|path|debug|override)=(.+)$/;return D=function(n){return n.reduce(function(n,t){const o=t.match(e);return o&&(n[o[1]]=o[2]),n},{})}}()(process.argv)))),function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARRAY="array"}(P||(P={}));function V(e){return void 0!==e?e+1:1}function q(e){return"__proto__"===e?"___proto___":e}
|
|
14
15
|
/**
|
|
16
|
+
* @fileoverview Main entrypoint for libraries using yargs-parser in Node.js
|
|
17
|
+
* CJS and ESM environments.
|
|
18
|
+
*
|
|
15
19
|
* @license
|
|
16
20
|
* Copyright (c) 2016, Contributors
|
|
17
21
|
* SPDX-License-Identifier: ISC
|
|
18
22
|
*/
|
|
19
|
-
|
|
23
|
+
const J=process&&process.env&&process.env.YARGS_MIN_NODE_VERSION?Number(process.env.YARGS_MIN_NODE_VERSION):12;if(process&&process.version){if(Number(process.version.match(/v([^.]+)/)[1])<J)throw Error(`yargs parser supports a minimum Node.js version of ${J}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}const W=process?process.env:{};new class{constructor(e){z=e}parse(e,n){const t=Object.assign({alias:void 0,array:void 0,boolean:void 0,config:void 0,configObjects:void 0,configuration:void 0,coerce:void 0,count:void 0,default:void 0,envPrefix:void 0,narg:void 0,normalize:void 0,string:void 0,number:void 0,__:void 0,key:void 0},n),o=
|
|
20
24
|
/**
|
|
21
|
-
* @fileoverview Main entrypoint for libraries using yargs-parser in Node.js
|
|
22
|
-
* CJS and ESM environments.
|
|
23
|
-
*
|
|
24
25
|
* @license
|
|
25
26
|
* Copyright (c) 2016, Contributors
|
|
26
27
|
* SPDX-License-Identifier: ISC
|
|
27
28
|
*/
|
|
28
|
-
|
|
29
|
+
function(e){if(Array.isArray(e))return e.map(e=>"string"!=typeof e?e+"":e);e=e.trim();let n=0,t=null,o=null,s=null;const r=[];for(let a=0;a<e.length;a++)t=o,o=e.charAt(a)," "!==o||s?(o===s?s=null:"'"!==o&&'"'!==o||s||(s=o),r[n]||(r[n]=""),r[n]+=o):" "!==t&&n++;return r}
|
|
29
30
|
/**
|
|
30
31
|
* @license
|
|
31
32
|
* Copyright (c) 2016, Contributors
|
|
32
33
|
* SPDX-License-Identifier: ISC
|
|
33
|
-
*/(e),s="string"==typeof e,r=function(e){const n=[],t=Object.create(null);let o=!0;Object.keys(e).forEach((function(t){n.push([].concat(e[t],t))}));for(;o;){o=!1;for(let e=0;e<n.length;e++)for(let t=e+1;t<n.length;t++){if(n[e].filter((function(e){return-1!==n[t].indexOf(e)})).length){n[e]=n[e].concat(n[t]),n.splice(t,1),o=!0;break}}}return n.forEach((function(e){const n=(e=e.filter((function(e,n,t){return t.indexOf(e)===n}))).pop();void 0!==n&&"string"==typeof n&&(t[n]=e)})),t}(Object.assign(Object.create(null),t.alias)),a=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":"no-","parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},t.configuration),i=Object.assign(Object.create(null),t.default),c=t.configObjects||[],l=t.envPrefix,d=a["populate--"],u=d?"--":"_",f=Object.create(null),p=Object.create(null),y=t.__||H.format,g={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},h=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,m=new RegExp("^--"+a["negation-prefix"]+"(.+)");[].concat(t.array||[]).filter(Boolean).forEach((function(e){const n="object"==typeof e?e.key:e,t=Object.keys(e).map((function(e){return{boolean:"bools",string:"strings",number:"numbers"}[e]})).filter(Boolean).pop();t&&(g[t][n]=!0),g.arrays[n]=!0,g.keys.push(n)})),[].concat(t.boolean||[]).filter(Boolean).forEach((function(e){g.bools[e]=!0,g.keys.push(e)})),[].concat(t.string||[]).filter(Boolean).forEach((function(e){g.strings[e]=!0,g.keys.push(e)})),[].concat(t.number||[]).filter(Boolean).forEach((function(e){g.numbers[e]=!0,g.keys.push(e)})),[].concat(t.count||[]).filter(Boolean).forEach((function(e){g.counts[e]=!0,g.keys.push(e)})),[].concat(t.normalize||[]).filter(Boolean).forEach((function(e){g.normalize[e]=!0,g.keys.push(e)})),"object"==typeof t.narg&&Object.entries(t.narg).forEach((([e,n])=>{"number"==typeof n&&(g.nargs[e]=n,g.keys.push(e))})),"object"==typeof t.coerce&&Object.entries(t.coerce).forEach((([e,n])=>{"function"==typeof n&&(g.coercions[e]=n,g.keys.push(e))})),void 0!==t.config&&(Array.isArray(t.config)||"string"==typeof t.config?[].concat(t.config).filter(Boolean).forEach((function(e){g.configs[e]=!0})):"object"==typeof t.config&&Object.entries(t.config).forEach((([e,n])=>{"boolean"!=typeof n&&"function"!=typeof n||(g.configs[e]=n)}))),function(...e){e.forEach((function(e){Object.keys(e||{}).forEach((function(e){g.aliases[e]||(g.aliases[e]=[].concat(r[e]||[]),g.aliases[e].concat(e).forEach((function(n){if(/-/.test(n)&&a["camel-case-expansion"]){const t=J(n);t!==e&&-1===g.aliases[e].indexOf(t)&&(g.aliases[e].push(t),f[t]=!0)}})),g.aliases[e].concat(e).forEach((function(n){if(n.length>1&&/[A-Z]/.test(n)&&a["camel-case-expansion"]){const t=Q(n,"-");t!==e&&-1===g.aliases[e].indexOf(t)&&(g.aliases[e].push(t),f[t]=!0)}})),g.aliases[e].forEach((function(n){g.aliases[n]=[e].concat(g.aliases[e].filter((function(e){return n!==e})))})))}))}))}(t.key,r,t.default,g.arrays),Object.keys(i).forEach((function(e){(g.aliases[e]||[]).forEach((function(n){i[n]=i[e]}))}));let w=null;Object.keys(g.counts).find((e=>N(e,g.arrays)?(w=Error(y("Invalid configuration: %s, opts.count excludes opts.array.",e)),!0):!!N(e,g.nargs)&&(w=Error(y("Invalid configuration: %s, opts.count excludes opts.narg.",e)),!0)));let b=[];const v=Object.assign(Object.create(null),{_:[]}),$={};for(let e=0;e<o.length;e++){const n=o[e],t=n.replace(/^-{3,}/,"---");let s,r,i,c,l,d;if("--"!==n&&B(n))k(n);else{if(t.match(/---+(=|$)/)){k(n);continue}if(n.match(/^--.+=/)||!a["short-option-groups"]&&n.match(/^-.+=/))c=n.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(N(c[1],g.arrays)?e=j(e,c[1],o,c[2]):!1!==N(c[1],g.nargs)?e=_(e,c[1],o,c[2]):O(c[1],c[2],!0));else if(n.match(m)&&a["boolean-negation"])c=n.match(m),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],O(r,!!N(r,g.arrays)&&[!1]));else if(n.match(/^--.+/)||!a["short-option-groups"]&&n.match(/^-[^-]+/))c=n.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],N(r,g.arrays)?e=j(e,r,o):!1!==N(r,g.nargs)?e=_(e,r,o):(l=o[e+1],void 0===l||l.match(/^-/)&&!l.match(h)||N(r,g.bools)||N(r,g.counts)?/^(true|false)$/.test(l)?(O(r,l),e++):O(r,D(r)):(O(r,l),e++)));else if(n.match(/^-.\..+=/))c=n.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&O(c[1],c[2]);else if(n.match(/^-.\..+/)&&!n.match(h))l=o[e+1],c=n.match(/^-(.\..+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],void 0===l||l.match(/^-/)||N(r,g.bools)||N(r,g.counts)?O(r,D(r)):(O(r,l),e++));else if(n.match(/^-[^-]+/)&&!n.match(h)){i=n.slice(1,-1).split(""),s=!1;for(let t=0;t<i.length;t++){if(l=n.slice(t+2),i[t+1]&&"="===i[t+1]){d=n.slice(t+3),r=i[t],N(r,g.arrays)?e=j(e,r,o,d):!1!==N(r,g.nargs)?e=_(e,r,o,d):O(r,d),s=!0;break}if("-"!==l){if(/[A-Za-z]/.test(i[t])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(l)&&!1===N(l,g.bools)){O(i[t],l),s=!0;break}if(i[t+1]&&i[t+1].match(/\W/)){O(i[t],l),s=!0;break}O(i[t],D(i[t]))}else O(i[t],l)}r=n.slice(-1)[0],s||"-"===r||(N(r,g.arrays)?e=j(e,r,o):!1!==N(r,g.nargs)?e=_(e,r,o):(l=o[e+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(h)||N(r,g.bools)||N(r,g.counts)?/^(true|false)$/.test(l)?(O(r,l),e++):O(r,D(r)):(O(r,l),e++)))}else if(n.match(/^-[0-9]$/)&&n.match(h)&&N(n.slice(1),g.bools))r=n.slice(1),O(r,D(r));else{if("--"===n){b=o.slice(e+1);break}if(a["halt-at-non-option"]){b=o.slice(e);break}k(n)}}}function k(e){const n=T("_",e);"string"!=typeof n&&"number"!=typeof n||v._.push(n)}function _(e,n,t,o){let s,r=N(n,g.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return M(o)||(w=Error(y("Argument unexpected for: %s",n))),O(n,D(n)),e;let i=M(o)?0:1;if(a["nargs-eats-options"])t.length-(e+1)+i<r&&(w=Error(y("Not enough arguments following: %s",n))),i=r;else{for(s=e+1;s<t.length&&(!t[s].match(/^-[^0-9]/)||t[s].match(h)||B(t[s]));s++)i++;i<r&&(w=Error(y("Not enough arguments following: %s",n)))}let c=Math.min(i,r);for(!M(o)&&c>0&&(O(n,o),c--),s=e+1;s<c+e+1;s++)O(n,t[s]);return e+c}function j(e,n,t,o){let r=[],c=o||t[e+1];const l=N(n,g.nargs);if(N(n,g.bools)&&!/^(true|false)$/.test(c))r.push(!0);else if(M(c)||M(o)&&/^-/.test(c)&&!h.test(c)&&!B(c)){if(void 0!==i[n]){const e=i[n];r=Array.isArray(e)?e:[e]}}else{M(o)||r.push(E(n,o,!0));for(let o=e+1;o<t.length&&!(!a["greedy-arrays"]&&r.length>0||l&&"number"==typeof l&&r.length>=l)&&(c=t[o],!/^-/.test(c)||h.test(c)||B(c));o++)e=o,r.push(E(n,c,s))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(w=Error(y("Not enough arguments following: %s",n))),O(n,r),e}function O(e,n,t=s){if(/-/.test(e)&&a["camel-case-expansion"]){const n=e.split(".").map((function(e){return J(e)})).join(".");x(e,n)}const o=E(e,n,t),r=e.split(".");if(U(v,r,o),g.aliases[e]&&g.aliases[e].forEach((function(e){const n=e.split(".");U(v,n,o)})),r.length>1&&a["dot-notation"]&&(g.aliases[r[0]]||[]).forEach((function(n){let t=n.split(".");const s=[].concat(r);s.shift(),t=t.concat(s),(g.aliases[e]||[]).includes(t.join("."))||U(v,t,o)})),N(e,g.normalize)&&!N(e,g.arrays)){[e].concat(g.aliases[e]||[]).forEach((function(e){Object.defineProperty($,e,{enumerable:!0,get:()=>n,set(e){n="string"==typeof e?H.normalize(e):e}})}))}}function x(e,n){g.aliases[e]&&g.aliases[e].length||(g.aliases[e]=[n],f[n]=!0),g.aliases[n]&&g.aliases[n].length||x(n,e)}function E(e,n,t){t&&(n=function(e){return"string"!=typeof e||"'"!==e[0]&&'"'!==e[0]||e[e.length-1]!==e[0]?e:e.substring(1,e.length-1)}(n)),(N(e,g.bools)||N(e,g.counts))&&"string"==typeof n&&(n="true"===n);let o=Array.isArray(n)?n.map((function(n){return T(e,n)})):T(e,n);return N(e,g.counts)&&(M(o)||"boolean"==typeof o)&&(o=Z()),N(e,g.normalize)&&N(e,g.arrays)&&(o=Array.isArray(n)?n.map((e=>H.normalize(e))):H.normalize(n)),o}function T(e,n){if(!a["parse-positional-numbers"]&&"_"===e)return n;if(!N(e,g.strings)&&!N(e,g.bools)&&!Array.isArray(n)){(Y(n)&&a["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${n}`)))||!M(n)&&N(e,g.numbers))&&(n=Number(n))}return n}function A(e,n){Object.keys(e).forEach((function(t){const o=e[t],s=n?n+"."+t:t;"object"==typeof o&&null!==o&&!Array.isArray(o)&&a["dot-notation"]?A(o,s):(!F(v,s.split("."))||N(s,g.arrays)&&a["combine-arrays"])&&O(s,o)}))}function S(e,n){if(void 0===l)return;const t="string"==typeof l?l:"",o=H.env();Object.keys(o).forEach((function(s){if(""===t||0===s.lastIndexOf(t,0)){const r=s.split("__").map((function(e,n){return 0===n&&(e=e.substring(t.length)),J(e)}));(n&&g.configs[r.join(".")]||!n)&&!F(e,r)&&O(r.join("."),o[s])}}))}function I(e,n,t,o=!1){Object.keys(t).forEach((function(s){F(e,s.split("."))||(U(e,s.split("."),t[s]),o&&(p[s]=!0),(n[s]||[]).forEach((function(n){F(e,n.split("."))||U(e,n.split("."),t[s])})))}))}function F(e,n){let t=e;a["dot-notation"]||(n=[n.join(".")]),n.slice(0,-1).forEach((function(e){t=t[e]||{}}));const o=n[n.length-1];return"object"==typeof t&&o in t}function U(e,n,t){let o=e;a["dot-notation"]||(n=[n.join(".")]),n.slice(0,-1).forEach((function(e){e=X(e),"object"==typeof o&&void 0===o[e]&&(o[e]={}),"object"!=typeof o[e]||Array.isArray(o[e])?(Array.isArray(o[e])?o[e].push({}):o[e]=[o[e],{}],o=o[e][o[e].length-1]):o=o[e]}));const s=X(n[n.length-1]),r=N(n.join("."),g.arrays),i=Array.isArray(t);let c=a["duplicate-arguments-array"];!c&&N(s,g.nargs)&&(c=!0,(!M(o[s])&&1===g.nargs[s]||Array.isArray(o[s])&&o[s].length===g.nargs[s])&&(o[s]=void 0)),t===Z()?o[s]=Z(o[s]):Array.isArray(o[s])?c&&r&&i?o[s]=a["flatten-duplicate-arrays"]?o[s].concat(t):(Array.isArray(o[s][0])?o[s]:[o[s]]).concat([t]):c||Boolean(r)!==Boolean(i)?o[s]=o[s].concat([t]):o[s]=t:void 0===o[s]&&r?o[s]=i?t:[t]:!c||void 0===o[s]||N(s,g.counts)||N(s,g.bools)?o[s]=t:o[s]=[o[s],t]}function N(e,n){const t=[].concat(g.aliases[e]||[],e),o=Object.keys(n),s=t.find((e=>o.includes(e)));return!!s&&n[s]}function K(e){const n=Object.keys(g);return[].concat(n.map((e=>g[e]))).some((function(n){return Array.isArray(n)?n.includes(e):n[e]}))}function B(e){return a["unknown-options-as-args"]&&function(e){if(e=e.replace(/^-{3,}/,"--"),e.match(h))return!1;if(function(e){if(e.match(h)||!e.match(/^-[^-]+/))return!1;let n,t=!0;const o=e.slice(1).split("");for(let s=0;s<o.length;s++){if(n=e.slice(s+2),!K(o[s])){t=!1;break}if(o[s+1]&&"="===o[s+1]||"-"===n||/[A-Za-z]/.test(o[s])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(n)||o[s+1]&&o[s+1].match(/\W/))break}return t}(e))return!1;return!function(e,...n){return[].concat(...n).some((function(n){const t=e.match(n);return t&&K(t[1])}))}(e,/^-+([^=]+?)=[\s\S]*$/,m,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(e)}function D(e){return N(e,g.bools)||N(e,g.counts)||!(`${e}`in i)?(n=function(e){let n=V.BOOLEAN;return N(e,g.strings)?n=V.STRING:N(e,g.numbers)?n=V.NUMBER:N(e,g.bools)?n=V.BOOLEAN:N(e,g.arrays)&&(n=V.ARRAY),n}(e),{[V.BOOLEAN]:!0,[V.STRING]:"",[V.NUMBER]:void 0,[V.ARRAY]:[]}[n]):i[e];var n}function M(e){return void 0===e}return S(v,!0),S(v,!1),function(e){const n=Object.create(null);I(n,g.aliases,i),Object.keys(g.configs).forEach((function(t){const o=e[t]||n[t];if(o)try{let e=null;const n=H.resolve(H.cwd(),o),s=g.configs[t];if("function"==typeof s){try{e=s(n)}catch(n){e=n}if(e instanceof Error)return void(w=e)}else e=H.require(n);A(e)}catch(n){"PermissionDenied"===n.name?w=n:e[t]&&(w=Error(y("Invalid JSON config file: %s",o)))}}))}(v),void 0!==c&&c.forEach((function(e){A(e)})),I(v,g.aliases,i,!0),function(e){let n;const t=new Set;Object.keys(e).forEach((function(o){if(!t.has(o)&&(n=N(o,g.coercions),"function"==typeof n))try{const s=T(o,n(e[o]));[].concat(g.aliases[o]||[],o).forEach((n=>{t.add(n),e[n]=s}))}catch(e){w=e}}))}(v),a["set-placeholder-key"]&&function(e){g.keys.forEach((n=>{~n.indexOf(".")||void 0===e[n]&&(e[n]=void 0)}))}(v),Object.keys(g.counts).forEach((function(e){F(v,e.split("."))||O(e,0)})),d&&b.length&&(v[u]=[]),b.forEach((function(e){v[u].push(e)})),a["camel-case-expansion"]&&a["strip-dashed"]&&Object.keys(v).filter((e=>"--"!==e&&e.includes("-"))).forEach((e=>{delete v[e]})),a["strip-aliased"]&&[].concat(...Object.keys(r).map((e=>r[e]))).forEach((e=>{a["camel-case-expansion"]&&e.includes("-")&&delete v[e.split(".").map((e=>J(e))).join(".")],delete v[e]})),{aliases:Object.assign({},g.aliases),argv:Object.assign($,v),configuration:a,defaulted:Object.assign({},p),error:w,newAliases:Object.assign({},f)}}}({cwd:process.cwd,env:()=>ne,format:m,normalize:c,resolve:l,require:e=>{if("undefined"!=typeof require)return require(e);if(e.match(/\.json$/))return JSON.parse(n(e,"utf8"));throw Error("only .json config files are supported in ESM")}}),oe=function(e,n){return te.parse(e.slice(),n).argv};oe.detailed=function(e,n){return te.parse(e.slice(),n)},oe.camelCase=J,oe.decamelize=Q,oe.looksLikeNumber=Y;new RegExp("(?:\\[(?:\\d+[ABCDEFGJKSTm]|\\d+;\\d+[Hfm]|\\d+;\\d+;\\d+m|6n|s|u|\\?25[lh])|\\w)","g");var se={fs:{readFileSync:n,writeFile:s},format:m,resolve:l,exists:e=>{try{return t(e).isFile()}catch(e){return!1}}};let re;class ae{constructor(e){e=e||{},this.directory=e.directory||"./locales",this.updateFiles="boolean"!=typeof e.updateFiles||e.updateFiles,this.locale=e.locale||"en",this.fallbackToLanguage="boolean"!=typeof e.fallbackToLanguage||e.fallbackToLanguage,this.cache=Object.create(null),this.writeQueue=[]}__(...e){if("string"!=typeof arguments[0])return this._taggedLiteral(arguments[0],...arguments);const n=e.shift();let t=function(){};return"function"==typeof e[e.length-1]&&(t=e.pop()),t=t||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][n]&&this.updateFiles?(this.cache[this.locale][n]=n,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:t})):t(),re.format.apply(re.format,[this.cache[this.locale][n]||n].concat(e))}__n(){const e=Array.prototype.slice.call(arguments),n=e.shift(),t=e.shift(),o=e.shift();let s=function(){};"function"==typeof e[e.length-1]&&(s=e.pop()),this.cache[this.locale]||this._readLocaleFile();let r=1===o?n:t;if(this.cache[this.locale][n]){r=this.cache[this.locale][n][1===o?"one":"other"]}!this.cache[this.locale][n]&&this.updateFiles?(this.cache[this.locale][n]={one:n,other:t},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:s})):s();const a=[r];return~r.indexOf("%d")&&a.push(o),re.format.apply(re.format,a.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){this.cache[this.locale]||this._readLocaleFile();for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(this.cache[this.locale][n]=e[n])}_taggedLiteral(e,...n){let t="";return e.forEach((function(e,o){const s=n[o+1];t+=e,void 0!==s&&(t+="%s")})),this.__.apply(this,[t].concat([].slice.call(n,1)))}_enqueueWrite(e){this.writeQueue.push(e),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const e=this,n=this.writeQueue[0],t=n.directory,o=n.locale,s=n.cb,r=this._resolveLocaleFile(t,o),a=JSON.stringify(this.cache[o],null,2);re.fs.writeFile(r,a,"utf-8",(function(n){e.writeQueue.shift(),e.writeQueue.length>0&&e._processWriteQueue(),s(n)}))}_readLocaleFile(){let e={};const n=this._resolveLocaleFile(this.directory,this.locale);try{re.fs.readFileSync&&(e=JSON.parse(re.fs.readFileSync(n,"utf-8")))}catch(t){if(t instanceof SyntaxError&&(t.message="syntax error in "+n),"ENOENT"!==t.code)throw t;e={}}this.cache[this.locale]=e}_resolveLocaleFile(e,n){let t=re.resolve(e,"./",n+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(t)&&~n.lastIndexOf("_")){const o=re.resolve(e,"./",n.split("_")[0]+".json");this._fileExistsSync(o)&&(t=o)}return t}_fileExistsSync(e){return re.exists(e)}}let ie;try{ie=$(import.meta.url)}catch(e){ie=process.cwd()}ie.split("node_modules")[0]||process.cwd(),process.cwd,process.exit,process.nextTick,void 0!==process.stdout.columns&&process.stdout.columns,function(e,n){re=n;const t=new ae(e);t.__.bind(t),t.__n.bind(t),t.setLocale.bind(t),t.getLocale.bind(t),t.updateLocale.bind(t),t.locale}({directory:l(ie,"../../../locales"),updateFiles:!1},se);const ce={hg:{appName:"hotglue",clientApiBaseUri:process.env.HOTGLUE_CLIENT_API_BASE_URI||"https://client-api.hotglue.xyz",defaultConfigFileName:"config.yaml"}},le={},de=()=>i.resolve(g(),`.${ce.hg.appName}`,ce.hg.defaultConfigFileName),ue=async()=>{const{appName:e}=ce.hg;try{return await E(e).load(de())||{}}catch(e){return{}}},fe=async()=>{const{appName:e}=ce.hg,n=E(e,{searchPlaces:[`${e}.yaml`,`.${e}.yaml`,`.${e}rc.yaml`,`.${e}rc.yml`,`.${e}rc`,`.${e}rc.json`,`.${e}rc.js`]});try{return await n.search()||{}}catch(e){throw console.log(e),new Error(`Malformed configuration file: ${e.message}`)}},pe={primary:e=>T.whiteBright(e),secondary:e=>T.white(e),info:e=>T.green(e),warn:e=>T.yellow(e),error:e=>T.redBright(e),success:e=>T.greenBright(e)};let ye=pe,ge="primary";function he(e){return ye={...pe,...e},ke}function me(e){process.stdout.write(e)}const we=(e,n=ge)=>{if(!e)return"";if("string"==typeof e)return ye[n]?ye[n](e):ye[ge](e);const t=w(e,{colors:!0});return ye[n]?ye[n](t):t};function be(...e){return console.log(...e),ke}function ve(e,n){return me(we(e,n)),me("\n"),ke}function $e(e,n){return me(we(e,n)),ke}const ke={cl:be,pr:ve,pp:$e,setTheme:he,setDefault:function(e="primary"){return ye[e]&&(ge=e),ke}},_e=e=>{console.log(JSON.stringify(e))},je=S("hotglue-cli");function Oe(e){return je.extend(e)}const xe=Oe("commands:config:set"),Ee="set <setting> <value>";var Te=Object.freeze({__proto__:null,builder:async e=>(xe("builder",Ee,e),e.option("setting",{describe:"The configuration parameter you wish to set",type:"string"}).option("value",{describe:"The configuration parameter's value",type:"string"}),e),command:Ee,desc:"Set configuration key-value pairs",handler:async e=>{xe("handler",Ee,e);const{json:n,setting:t,value:o}=e;if(["apikey"].includes(t))try{const e=await ue();e&&e.config?!n&&$e("Updating profile config file..."):!n&&$e("Creating profile config file...");const s=e&&e.config?{...e.config,[t]:o}:{[t]:o},r=I.stringify(s),a=e&&e.filepath?e.filepath:de();await(async(e,n)=>{await k(i.dirname(e),{recursive:!0}),await _(e,n)})(a,r),n?_e({status:"success"}):$e("Done").pr()}catch(e){n?_e({status:"error",error:e}):console.log(e)}else n?_e({status:"error",error:"Invalid settings parameter"}):console.error("Invalid settings parameter")}});const Ae=[Te],Se=Oe("commands:config"),Ie="config [action]";var Fe=Object.freeze({__proto__:null,builder:async function(e){return Se("builder",Ie),e.command(Ae)},command:Ie,desc:"Configure your hotglue CLI",handler:async function(e){Se("handler",Ie,e);const{action:n}=e;if(!n)try{const e=await ue();e.config&&0!==Object.keys(e.config).length||ve("No profile configuration found. Run config set to configure the hotglue CLI.");const n=new F({head:["Setting","Value","Config File","Type"]});e.config&&Object.entries(e.config).forEach((([t,o])=>n.push([t,o,e.filepath,"Profile"])));const t=await fe();t.config&&Object.entries(t.config).forEach((([e,o])=>n.push([e,o,i.relative(process.cwd(),t.filepath),"Project"]))),n.length>0&&console.log(n.toString())}catch(e){throw console.log(e),e}}}),Ue={env:{config:{describe:"Environment Id",type:"string",alias:["e"]},demandText:'The "env" parameter (Environment Id) is required. Either pass here using `-e [env_id]` or add an env property in your rc file.'},apikey:{config:{describe:"API key",type:"string",alias:["k"]},demandText:"API key is required. Either pass here using -k [key] or configure your profile using config set."},json:{config:{describe:"Makes the output format to be JSON",type:"boolean",default:!1},demandText:""},tenant:{config:{describe:"Tenant (user) ID",type:"string",alias:["u"]},demandText:"TenantId is required. You can pass it using -u [tenantId]."},flow:{config:{describe:"Flow ID",type:"string",alias:["f"]},demandText:"FlowId is required. You can pass it using -f [flow_id]."},tap:{config:{describe:"Tap name",type:"string",alias:["t"]},demandText:"Tap name is required. You can pass it using -t <tap_name>."},connector:{config:{describe:"Connector ID",type:"string",alias:["c"]},demandText:"Connector ID is required. You can pass it using -c <connector>."},all:{config:{describe:"Run command for all taps/connectors",type:"boolean",default:!1,alias:["a"]},demandText:'This "all" flag is required. You can pass it using -a or --all.'},jobroot:{config:{describe:"Job Root (S3 prefix)",type:"string",alias:["j"]},demandText:"JobRoot key is required. You can pass it using -j [job_root]."},count:{config:{describe:"Max returned records",type:"number"}},downloadTo:{config:{describe:"Download folder",default:".",type:"string",alias:["d"]},demandText:"A destination folder is required. You can pass it using -d [folder] and can be either relative from cwd or absolute."},sourceFolder:{config:{describe:"Source folder",type:"string",default:".",alias:["s"]},demandText:""},configFilePath:{config:{describe:"Config file path",type:"string",default:"./config.json",alias:["p"]},demandText:'Local path of the config (with .json extension). Example: "/home/hotglue/config.json"'},overwrite:{config:{describe:"Overwrite existing",type:"boolean",default:!1,alias:["o"]},demandText:""},cleanup:{config:{describe:"Clean up target prior to action",type:"boolean",default:!1,alias:["c"]},demandText:""}};const Ne=Oe("base"),Ke=async e=>{Ne("builder");const n=await(async()=>{const e=await ue(),n=await fe();return{...le,...e.config,...n.config}})();return e.option("apikey",Ue.apikey.config).option("env",Ue.env.config).option("json",Ue.json.config).config(n).demandOption(["env"],Ue.env.demandText).demandOption(["apikey"],Ue.apikey.demandText)},Be=Oe("utils.js"),De=async(e,n,t=[])=>{const{includeSymLinks:o,recursive:s,filter:r}=n,{matcher:a}=r,c=i.resolve(e),l=await j(c,{withFileTypes:!0});for(const e of l){const r=i.resolve(c,e.name);e.isSymbolicLink()&&!o||(!a||a(r)?e.isFile()?t.push(i.resolve(c,e.name)):e.isDirectory()&&s&&await De(i.resolve(c,e.name),n,t):Be("skip",r))}return t},Me=async(e,n)=>{const t={includeSymLinks:!1,recursive:!1,filter:{},...n},{pattern:o}=t.filter;return o&&(t.filter.matcher=N.matcher(o,{dot:!0})),De(e,t)},Pe=(e,n)=>{Be("filter-in",e);const{pattern:t}={...n};let o=e;return t&&(o=N(o,t)),Be("filter-out",o),o};const Le=e=>{const n=[];return new Promise(((t,o)=>{e.on("error",o),e.on("data",(e=>n.push(Buffer.from(e)))),e.on("end",(()=>t(Buffer.concat(n).toString("utf8"))))}))},Ce=(e,n=10)=>{const t=[];for(let o=0;o<e.length;o+=n){const s=e.slice(o,o+n);t.push(s)}return t},Re=async({debug:e,baseUri:n,env:t,apiKey:o})=>{const s=new URL(`${n}/${t}/resetAvailableEntities`),{data:r}=await K.delete(s,{headers:{"x-api-key":o,"Content-type":"application/json"}});e({data:r})},ze=async({debug:e,baseUri:n,task:t,env:o,apikey:s,...r})=>{const a=new URL(`${n}/credentials/${t}/${o}`);r&&Object.entries(r).forEach((([e,n])=>{a.searchParams.set(e,n)}));const i=a.toString();e&&e("uri:",i);const{data:c}=await K.get(i,{headers:{"x-api-key":s}}),{accessKeyId:l,secretAccessKey:d,sessionToken:u}=c;return{accessKeyId:l,secretAccessKey:d,sessionToken:u}},Ve=async({debug:e,baseUri:n,env:t,apikey:o})=>{const s=`${n}/tenants/${t}`;e("requesting:",s);const{data:r}=await K.get(s,{headers:{"x-api-key":o}});return e("response-data",r),r},qe=async({debug:e,baseUri:n,env:t,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${n}/${t}/${o}/supportedSources`).toString();e&&e("uri:",a);const{data:i}=await K.get(a,{headers:r});return i},Ge=async({debug:e,baseUri:n,env:t,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${n}/v2/${t}/${o}/supportedConnectors`).toString();e&&e("uri:",a);const{data:i}=await K.get(a,{headers:r});return i},We=async({debug:e,baseUri:n,env:t,flow:o,tenant:s,apikey:r,config:a})=>{const i=new URL(`${n}/${t}/${o}/${s}/linkedSources`);a&&i.searchParams.set("config","true");const c={"x-api-key":r},l=i.toString();e&&e("uri:",l);const{data:d}=await K.get(l,{headers:c});return d},Je=async({debug:e,baseUri:n,env:t,flow:o,tenant:s,apikey:r,config:a})=>{const i=new URL(`${n}/v2/${t}/${o}/${s}/linkedConnectors`);a&&i.searchParams.set("config","true");const c={"x-api-key":r},l=i.toString();e&&e("uri:",l);const{data:d}=await K.get(l,{headers:c});return d},Qe=async({debug:e,baseUri:n,env:t,apikey:o})=>{const s={"x-api-key":o},r=new URL(`${n}/${t}/flows/supported`).toString();e&&e("uri:",r);const{data:a}=await K.get(r,{headers:s});return a},Ye=async({debug:e,baseUri:n,env:t,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${n}/${t}/flows/${o}/supported`).toString();e&&e("uri:",a);const{data:i}=await K.get(a,{headers:r});return i},He=S("commands:env:validators"),Ze=async(e,n,t,o,s)=>{if(!Array.isArray(e))throw new Error("availableSources.json must be an array of objects");const r=(await Promise.all(o.filter((e=>1==e.version)).map((async e=>await qe({debug:He,baseUri:n,env:s,flow:e.id,apikey:t}))))).flat(),a=e.map((e=>{if(!e.tap)throw new Error(`Source ${JSON.stringify(e)} has no tap id`);return e.tap})),i=a.filter(((e,n)=>a.indexOf(e)!==n));if(i.length>0)throw new Error(`Duplicate source id(s) found in availableSources.json: ${i.join(", ")}. All sources must have a unique tap id.`);const c=r.filter((e=>e.isForked&&!a.includes(e.tap)));if(c.length>0)throw new Error(`Sources ${c.map((e=>e.label)).join(", ")} are linked, but missing from your availableSources.json`)},Xe=async(e,n,t,o,s)=>{if(!Array.isArray(e))throw new Error("availableTargets.json must be an array of objects");const r=(await Promise.all(o.filter((e=>1==e.version)).map((async e=>{const o=await(async({debug:e,baseUri:n,env:t,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${n}/${t}/${o}/supportedTargets`).toString();e&&e("uri:",a);const{data:i}=await K.get(a,{headers:r});return i})({debug:He,baseUri:n,env:s,flow:e.id,apikey:t});return o})))).flat(),a=e.map((e=>{if(!e.target)throw new Error(`Target ${JSON.stringify(e)} has no target id`);return e.target})),i=a.filter(((e,n)=>a.indexOf(e)!==n));if(i.length>0)throw new Error(`Duplicate target id(s) found in availableTargets.json: ${i.join(", ")}. All targets must have a unique target id.`);const c=r.filter((e=>e.isForked&&!a.includes(e.target)));if(c.length>0)throw new Error(`Targets ${c.map((e=>e.label)).join(", ")} are linked, but missing from your availableTargets.json`)},en=async(e,n,t,o,s)=>{if(!Array.isArray(e))throw new Error("availableConnectors.json must be an array of objects");const r=(await Promise.all(o.filter((e=>2==e.version)).map((async e=>await Ge({debug:He,baseUri:n,env:s,flow:e.id,apikey:t}))))).flat(),a=e.map((e=>{if(!e.id)throw new Error(`Connector ${JSON.stringify(e)} has no id`);return e.id})),i=a.filter(((e,n)=>a.indexOf(e)!==n));if(i.length>0)throw new Error(`Duplicate connector id(s) found in availableConnectors.json: ${i.join(", ")}. All connectors must have a unique id.`);const c=r.filter((e=>e.isForked&&!a.includes(e.id)));if(c.length>0)throw new Error(`Connectors ${c.map((e=>e.id)).join(", ")} are linked, but missing from your availableConnectors.json`)},nn=Oe("commands:env:deploy"),tn="deploy";var on=Object.freeze({__proto__:null,builder:async e=>(nn("builder",tn),e.option("sourceFolder",Ue.sourceFolder.config).demandOption("sourceFolder",Ue.sourceFolder.demandText)),command:tn,desc:"Deploy Environment settings",handler:async e=>{nn("handler",tn,e);const{hg:n,json:t,apikey:o,env:s,sourceFolder:r}=e,{clientApiBaseUri:a}=n,c=i.resolve(process.cwd(),r);let l,d=U();try{l=we(`Scanning ${we(c,"info")} for deployable files`),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const e=await Me(c,{filter:{pattern:"((**/requirements.txt)|(**/availableSources.json)|(**/availableTargets.json)|(**/availableConnectors.json)|(**/customTaps.json))"}});if(0===e.length)return void(t?_e({status:"error",error:"There are no files to deploy at the specified location!"}):(d.fail(we(`Error: ${l}.`,"secondary")),ve(we(`Message: ${we("There are no files to deploy at the specified location!")}`,"secondary"))));!t&&d.succeed(we(`Finished: ${l}.`,"secondary"));for(const n of e)if(n.endsWith(".json"))try{const e=await O(n,{encoding:"utf-8"});JSON.parse(e)}catch(e){throw new Error(`File ${n} is not a valid JSON: ${String(e)}`)}const n=await Qe({debug:nn,baseUri:a,env:s,apikey:o});for(const t of e){if(t.endsWith("availableSources.json")){const e=JSON.parse(await O(t,{encoding:"utf-8"}));await Ze(e,a,o,n,s)}if(t.endsWith("availableTargets.json")){const e=JSON.parse(await O(t,{encoding:"utf-8"}));await Xe(e,a,o,n,s)}if(t.endsWith("availableConnectors.json")){const e=JSON.parse(await O(t,{encoding:"utf-8"}));await en(e,a,o,n,s)}}l=we("Verifying user and authorizing"),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const{accessKeyId:r,secretAccessKey:u,sessionToken:f}=await ze({debug:nn,baseUri:a,task:"env-deploy",env:s,apikey:o});!t&&d.succeed(we(`Finished: ${l}.`,"secondary"));const p=new A.S3({accessKeyId:r,secretAccessKey:u,sessionToken:f});l=we("Deploying environment files"),!t&&d.info(we(`Info: ${l}.`,"secondary"));const y="config/",g=new F({head:["File","Status"]});for await(const n of e){const e=i.basename(n);l=we(`Pushing file: ${we(e,"info")}`),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const r={Bucket:s,Key:`${y}${e}`,Body:await O(n)},c=await p.putObject(r).promise();!t&&d.succeed(we(`Finished: ${l}.`,"secondary")),nn("s3-put-res",c),g.push([e,"Deployed"]),await Re({debug:nn,baseUri:a,env:s,apiKey:o})}t?_e({status:"success",deployedFiles:e}):be(g.toString())}catch(e){!t&&d.fail(we(`Error: ${l}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),nn(e),e&&e.response&&e.response.data&&nn("response",e.response.data)}}});const sn=Oe("commands:env:download"),rn="download";var an=Object.freeze({__proto__:null,builder:async e=>(sn("builder",rn),e.option("downloadTo",Ue.downloadTo.config)),command:rn,desc:"Download Environment settings",handler:async e=>{sn("handler",rn,e);const{hg:n,json:t,apikey:o,env:s,downloadTo:r}=e,{clientApiBaseUri:a}=n,c=i.resolve(process.cwd(),r);let l,d=U();try{l=we("Verifying user and authorizing"),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:r}=await ze({debug:sn,baseUri:a,task:"env-download",env:s,apikey:o});!t&&d.succeed(we(`Finished: ${l}.`,"secondary"));const u=new A.S3({accessKeyId:e,secretAccessKey:n,sessionToken:r});l=we(`Scanning environment ${we(s,"info")}`),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const f={Bucket:s,Prefix:"config/"},{Contents:p}=await u.listObjectsV2(f).promise();!t&&d.succeed(we(`Finished: ${l}.`,"secondary")),sn("s3-files",p);const y=p?Pe(p.map((e=>e.Key)),{pattern:"((*/requirements.txt)|(*/availableSources.json)|(*/availableTargets.json)|(*/availableConnectors.json)|(*/customTaps.json))"}):[];if(!y||0===y.length)return void(t?_e({status:"success",downloadedFiles:[]}):d.warn(we(`Warning: ${we("Nothing to download!")}`,"secondary")));l=we(`Downloading to ${we(c,"info")}`),!t&&d.info(we(`Info: ${l}.`,"secondary"));const g=new F({head:["File","Status"]});for await(const e of y){const n=i.basename(e),o=i.resolve(c,n);sn("local-file",o),await k(i.dirname(o),{recursive:!0}),l=we(`Downloading file: ${we(n,"info")}`),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const r=u.getObject({Bucket:s,Key:e}).createReadStream();await _(o,await Le(r)),!t&&d.succeed(we(`Finished: ${l}.`,"secondary")),g.push([n,"Downloaded"])}t?_e({status:"success",downloadedFiles:y}):be(g.toString())}catch(e){t?_e({status:"error",error:e}):(d.fail(we(`Error: ${l}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),sn(e),e&&e.response&&e.response.data&&sn("response",e.response.data))}}});const cn=[on,an],ln=Oe("commands:env"),dn="env <action>";var un=Object.freeze({__proto__:null,builder:async function(e){ln("builder",dn);return(await Ke(e)).command(cn)},command:dn,desc:"Manage environment settings",handler:async function(e){ln("handler",dn,e)}});const fn=async(e,n,t,o)=>{try{const s=e.getObject({Bucket:n,Key:`${t}/flows/${o}/flow.json`}).createReadStream(),r=await Le(s);return 2===JSON.parse(r).version}catch(e){return!1}},pn=async(e,n,t,o,s=void 0)=>s??await fn(e,n,t,o)?"connectors":"taps",yn=Oe("commands:etl:delete"),gn="delete";var hn=Object.freeze({__proto__:null,builder:async e=>(yn("builder",gn),e.option("flow",Ue.flow.config).demandOption("flow",Ue.flow.demandText).option("tap",Ue.tap.config).demandOption("tap",Ue.tap.demandText).option("tenant",{...Ue.tenant.config}).demandOption("tenant",Ue.tenant.demandText)),command:gn,desc:"Delete ETL scripts",handler:async e=>{yn("handler",gn,e);const{hg:n,json:t,apikey:o,env:s,flow:r,tap:a,tenant:i}=e,{clientApiBaseUri:c}=n;let l,d=U();try{l=we(`Deleting ETL scripts for Tenant ${we(i,"info")} Flow ${we(r,"info")} and Tap ${we(a,"info")} to ${we(s,"info")}`),!t&&d.info(we(`Info: ${l}.`,"secondary")),l=we("Verifying user and authorizing"),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:u}=await ze({debug:yn,baseUri:c,task:"etl-deploy",env:s,tenant:i,flow:r,tap:a,apikey:o}),f=new A.S3({accessKeyId:e,secretAccessKey:n,sessionToken:u});!t&&d.succeed(we(`Finished: ${l}.`,"secondary")),l=we("Deleting ETL scripts"),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const p=`${i}/flows/${r}/${await pn(f,s,i,r)}/${a}/etl/`,y=await f.listObjectsV2({Bucket:s,Prefix:p}).promise();if(yn("s3-list-objects-res",y),y.Contents?.length>0){const e=await f.deleteObjects({Bucket:s,Delete:{Objects:y.Contents.map((e=>({Key:e.Key})))}}).promise();yn("s3-list-objects-res",e)}const g=await f.deleteObject({Bucket:s,Key:p}).promise();if(yn("s3-delete-object-res",g),!t&&d.succeed(we(`Finished: ${l}.`,"secondary")),y.Contents?.length>0){const e=new F({head:["File","Status"]});y.Contents.filter((({Key:e})=>e!==p)).forEach((({Key:n})=>{const t=n.split("/"),o=t[t.length-1];e.push([o,we("Deleted","info")])})),t?_e({status:"success",deletedObjects:(y.Contents??[]).map((({Key:e})=>e))}):be(e.toString())}else l=we("There was no file or folder to be deleted"),t?_e({status:"success",deletedObjects:[]}):d.info(we(`Info: ${l}.`,"secondary"))}catch(e){t?_e({status:"error",error:e}):(d.fail(we(`Error: ${l}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),yn(e),e&&e.response&&e.response.data&&yn("response",e.response.data))}}});const mn=Oe("commands:etl:deploy"),wn="deploy";var bn=Object.freeze({__proto__:null,builder:async e=>(mn("builder",wn),e.option("flow",Ue.flow.config).demandOption("flow",Ue.flow.demandText).option("tap",Ue.tap.config).option("all",Ue.all.config).option("tenant",{...Ue.tenant.config,default:"default"}).option("sourceFolder",Ue.sourceFolder.config).demandOption("sourceFolder",Ue.sourceFolder.demandText)),command:wn,desc:"Deploy ETL scripts",handler:async e=>{mn("handler",wn,e);const{hg:n,json:t,apikey:o,env:s,flow:r,tap:a,all:c,tenant:l,sourceFolder:d}=e,{clientApiBaseUri:u}=n;if(!c&&!a)throw new Error(`${Ue.tap.demandText} Or you can pass the --all flag to run this command for all taps/connectors.`);let f,p=U();const y=i.resolve(process.cwd(),d);try{f=we(`Deploying script for Tenant ${we(l,"info")} Flow ${we(r,"info")}${a?` and Tap ${we(a,"info")}`:""} to ${we(s,"info")}`),!t&&p.info(we(`Info: ${f}.`,"secondary"));const e=await Me(y,{recursive:!0,filter:{pattern:"!((**/sync-output)|(**/etl-output)|(**/snapshots))"}});if(0===e.length)return void(t?_e({status:"error",error:"There are no files to deploy at the specified location!"}):p.fail(we(`Error: ${we("There are no files to deploy at the specified location!")}.`,"secondary")));f=we("Verifying user and authorizing"),!t&&p.start(we(`In progress: ${f}...`,"secondary"));const n={debug:mn,baseUri:u,task:"etl-deploy",env:s,tenant:l,flow:r,apikey:o};a&&(n.tap=a);const{accessKeyId:c,secretAccessKey:g,sessionToken:h}=await ze(n);!t&&p.succeed(we(`Finished: ${f}.`,"secondary"));const m=new A.S3({accessKeyId:c,secretAccessKey:g,sessionToken:h}),w=await fn(m,s,l,r);f=we("Validating flow and tap location"),!t&&p.start(we(`In progress: ${f}...`,"secondary"));const b=(await Qe({debug:mn,baseUri:u,apikey:o,env:s})).find((({id:e})=>e===r));let v=[];try{if("default"===l||b?.type){if(v=((w?await Ge({debug:mn,baseUri:u,env:s,flow:r,apikey:o}):await qe({debug:mn,baseUri:u,env:s,flow:r,apikey:o}))??[]).filter((e=>!a||e[w?"id":"tap"]===a)),a&&0===v.length)throw new Error("Tap is not supported")}else{if(v=((w?await Je({debug:mn,baseUri:u,env:s,flow:r,tenant:l,apikey:o}):await We({debug:mn,baseUri:u,env:s,flow:r,tenant:l,apikey:o}))??[]).filter((e=>!a||e[w?"id":"tap"]===a)),a&&0===v.length)throw new Error("Tap is not linked")}}catch(e){throw mn("err",e),new Error("Target location doesn't exist. Check your tenant, flow and tap arguments.")}!t&&p.succeed(we(`Finished: ${f}.`,"secondary"));const $=new F({head:["File","Status"]});for(const n of v){const o=n[w?"id":"tap"];f=we(`Preparing ${o} deployment target`),!t&&p.start(we(`In progress: ${f}...`,"secondary"));const a=`${l}/flows/${r}/${await pn(null,null,null,null,w)}/${o}/etl/`,{Contents:c}=await m.listObjectsV2({Bucket:s,Prefix:`${a}`}).promise();!t&&p.succeed(we(`Finished: ${f}.`,"secondary")),mn("contents",c);const u=c.map((e=>({Key:e.Key})));if(u.length>0){f=we(`Removing old ${o} ETL files`),!t&&p.start(we(`In progress: ${f}...`,"secondary"));const e={Bucket:s,Delete:{Objects:u,Quiet:!0}};await m.deleteObjects(e).promise(),u.forEach((({Key:e})=>$.push([`${o}/${e.substring(a.length)}`,we("Deleted","warn")]))),!t&&p.succeed(we(`Finished: ${f}.`,"secondary"))}for await(const n of e){const e="win32"===process.platform?i.relative(d,n).replace(/\\/g,"/"):i.relative(d,n),r=`${a}${e}`;f=we(`Deploying file: ${we(`${o}/${e}`,"info")}`),!t&&p.start(we(`In progress: ${f}...`,"secondary"));const c={Bucket:s,Key:r,Body:await O(n)},l=await m.putObject(c).promise();!t&&p.succeed(we(`Finished: ${f}.`,"secondary")),mn("s3-put-res",l),$.push([`${o}/${e}`,we("Deployed","info")])}}t?_e({status:"success",deployedFiles:e}):be($.toString())}catch(e){t?_e({status:"error",error:e}):(p.fail(we(`Error: ${f}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),mn(e),e&&e.response&&e.response.data&&mn("response",e.response.data))}}});const vn=Oe("commands:etl:download"),$n="download";var kn=Object.freeze({__proto__:null,builder:async e=>(vn("builder",$n),e.option("flow",Ue.flow.config).demandOption("flow",Ue.flow.demandText).option("tap",Ue.tap.config).demandOption("tap",Ue.tap.demandText).option("downloadTo",Ue.downloadTo.config).demandOption("downloadTo",Ue.downloadTo.demandText).option("tenant",{...Ue.tenant.config,default:"default"}).option("overwrite",Ue.overwrite.config).demandOption("overwrite",Ue.overwrite.demandText)),command:$n,desc:"Download ETL scripts",handler:async e=>{vn("handler",$n,e);const{hg:n,json:t,apikey:o,env:s,flow:a,tap:c,tenant:l,downloadTo:d,overwrite:u}=e,{clientApiBaseUri:f}=n;let p,y=U();const g=i.resolve(process.cwd(),d);try{p=we("Verifying user and authorizing"),!t&&y.start(we(`In progress: ${p}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:d}=await ze({debug:vn,baseUri:f,task:"etl-download",env:s,tenant:l,flow:a,tap:c,apikey:o}),h=new A.S3({accessKeyId:e,secretAccessKey:n,sessionToken:d});!t&&y.succeed(we(`Finished: ${p}.`,"secondary")),p=we("Scanning for downloadable files"),!t&&y.start(we(`In progress: ${p}...`,"secondary"));const m=`${l}/flows/${a}/${await pn(h,s,l,a)}/${c}/etl/`,w={Bucket:s,Prefix:m},{Contents:b}=await h.listObjectsV2(w).promise();!t&&y.succeed(we(`Finished: ${p}.`,"secondary")),vn("s3-list-res",b);const v=b?Pe(b.map((e=>e.Key)),{pattern:"!(.ipynb_checkpoints/*)"}):[];if(!v||0===v.length)return void(t?_e({status:"success",downloadedFiles:[]}):y.warn(we(`Warning: ${we("Nothing to download!")}`,"secondary")));p=we(`Downloading script files to ${we(g,"info")}`),!t&&y.info(we(`Info: ${p}.`,"secondary"));const $=new F({head:["File","Status"]});for await(const e of v){const n=e.substring(m.length),o=i.resolve(g,n);if(vn("file",o),e.endsWith("/")){!r(o)&&await k(o,{recursive:!0});continue}if(!u)try{await x(o),vn("exists, skipping"),$.push([n,"Skipped"]);continue}catch(e){"ENOENT"!==e.code&&be(e)}p=we(`Downloading file: ${we(n,"info")}`),!t&&y.start(we(`In progress: ${p}...`,"secondary")),await k(i.dirname(o),{recursive:!0});const a=h.getObject({Bucket:s,Key:e}).createReadStream();await _(o,await Le(a)),!t&&y.succeed(we(`Finished: ${p}.`,"secondary")),$.push([n,"Downloaded"])}t?_e({status:"success",downloadedFiles:v}):be($.toString())}catch(e){t?_e({status:"error",error:e}):(y.fail(we(`Error: ${p}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),vn(e),e&&e.response&&e.response.data&&vn("response",e.response.data))}}});const _n=[hn,bn,kn],jn=Oe("commands:etl"),On="etl <action>";var xn=Object.freeze({__proto__:null,builder:async function(e){jn("builder",On);return(await Ke(e)).command(_n)},command:On,desc:"Manage ETL scripts",handler:async function(e){jn("handler",On,e)}});const En=Oe("commands:flows:list"),Tn="list";var An=Object.freeze({__proto__:null,builder:async e=>(En("builder",Tn),e.option("tenant",{...Ue.tenant.config})),command:Tn,desc:"List flows",handler:async e=>{En("handler",Tn,e);const{hg:n,json:t,apikey:o,env:s,tenant:r}=e,{clientApiBaseUri:a}=n;let i,c=U();try{i=we(`Retrieving ${r?`${we(r,"info")} tenant's`:"the"} flows for environment: ${we(s,"info")}`);const e=`${a}/${s}/flows/${r?`linked?user_id=${r}`:"supported"}`;En("requesting:",e),!t&&c.start(we(`In progress: ${i}...`,"secondary"));const{data:n}=await K.get(e,{headers:{"x-api-key":o}});if(!t&&c.succeed(we(`Finished: ${i}.`,"secondary")),En("response-data",n),!n||0===n.length)return void(t?_e([]):c.warn(we(`Warning: ${we("No flows for specified environment and tenant")}.`,"secondary")));if(t)_e(n);else{const e=new F({head:["ID","Name","isPush","Taps","Targets"]});n.forEach((n=>e.push([n.id,n.name||"",n.type||!1,n.taps?w(n.taps):"",n.targets?w(n.targets):"none"]))),console.log(e.toString())}}catch(e){t?_e({status:"error",error:e}):(c.fail(we(`Error: ${i}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),En(e),e&&e.response&&e.response.data&&En("response",e.response.data))}}});const Sn=[An],In=Oe("commands:flows"),Fn="flows <action>";var Un,Nn=Object.freeze({__proto__:null,builder:async function(e){In("builder",Fn);return(await Ke(e)).command(Sn)},command:Fn,desc:"Manage flows",handler:async function(e){In("handler",Fn,e)}}),Kn={exports:{}},Bn={exports:{}},Dn={exports:{}},Mn={exports:{}};var Pn,Ln={exports:{}},Cn={exports:{}};var Rn,zn,Vn={exports:{}};function qn(){return zn||(zn=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){if((0,o.default)(e))return function(e){var n=-1,t=e.length;return function(){return++n<t?{value:e[n],key:n}:null}}(e);var n=(0,r.default)(e);return n?function(e){var n=-1;return function(){var t=e.next();return t.done?null:(n++,{value:t.value,key:n})}}(n):(t=e,s=t?Object.keys(t):[],a=-1,i=s.length,function e(){var n=s[++a];return"__proto__"===n?e():a<i?{value:t[n],key:n}:null});var t,s,a,i};var t=function(){return Pn||(Pn=1,e=Cn,n=Cn.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return e&&"number"==typeof e.length&&e.length>=0&&e.length%1==0},e.exports=n.default),Cn.exports;var e,n}(),o=a(t),s=function(){return Rn||(Rn=1,e=Vn,n=Vn.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return e[Symbol.iterator]&&e[Symbol.iterator]()},e.exports=n.default),Vn.exports;var e,n}(),r=a(s);function a(e){return e&&e.__esModule?e:{default:e}}e.exports=n.default}(Ln,Ln.exports)),Ln.exports}var Gn,Wn={exports:{}};var Jn,Qn={},Yn={exports:{}},Hn={exports:{}};var Zn,Xn,et,nt={};function tt(){return Xn||(Xn=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){if((0,a.isAsync)(e))return function(...n){const t=n.pop();return c(e.apply(this,n),t)};return(0,o.default)((function(n,t){var o;try{o=e.apply(this,n)}catch(e){return t(e)}if(o&&"function"==typeof o.then)return c(o,t);t(null,o)}))};var t=function(){return Jn||(Jn=1,e=Hn,n=Hn.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return function(...n){var t=n.pop();return e.call(this,n,t)}},e.exports=n.default),Hn.exports;var e,n}(),o=i(t),s=function(){if(Zn)return nt;Zn=1,Object.defineProperty(nt,"__esModule",{value:!0}),nt.fallback=s,nt.wrap=r;var e,n=nt.hasQueueMicrotask="function"==typeof queueMicrotask&&queueMicrotask,t=nt.hasSetImmediate="function"==typeof setImmediate&&setImmediate,o=nt.hasNextTick="object"==typeof process&&"function"==typeof process.nextTick;function s(e){setTimeout(e,0)}function r(e){return(n,...t)=>e((()=>n(...t)))}return e=n?queueMicrotask:t?setImmediate:o?process.nextTick:s,nt.default=r(e),nt}(),r=i(s),a=ot();function i(e){return e&&e.__esModule?e:{default:e}}function c(e,n){return e.then((e=>{l(n,null,e)}),(e=>{l(n,e&&(e instanceof Error||e.message)?e:new Error(e))}))}function l(e,n,t){try{e(n,t)}catch(e){(0,r.default)((e=>{throw e}),e)}}e.exports=n.default}(Yn,Yn.exports)),Yn.exports}function ot(){if(et)return Qn;et=1,Object.defineProperty(Qn,"__esModule",{value:!0}),Qn.isAsyncIterable=Qn.isAsyncGenerator=Qn.isAsync=void 0;var e,n=tt(),t=(e=n)&&e.__esModule?e:{default:e};function o(e){return"AsyncFunction"===e[Symbol.toStringTag]}return Qn.default=function(e){if("function"!=typeof e)throw new Error("expected a function");return o(e)?(0,t.default)(e):e},Qn.isAsync=o,Qn.isAsyncGenerator=function(e){return"AsyncGenerator"===e[Symbol.toStringTag]},Qn.isAsyncIterable=function(e){return"function"==typeof e[Symbol.asyncIterator]},Qn}var st,rt,at,it={exports:{}},ct={exports:{}};function lt(){return st||(st=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0});n.default={},e.exports=n.default}(ct,ct.exports)),ct.exports}function dt(){return at||(at=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0});var t=function(){return Un||(Un=1,e=Mn,n=Mn.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){function n(...n){if(null!==e){var t=e;e=null,t.apply(this,n)}}return Object.assign(n,e),n},e.exports=n.default),Mn.exports;var e,n}(),o=u(t),s=u(qn()),r=function(){return Gn||(Gn=1,e=Wn,n=Wn.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return function(...n){if(null===e)throw new Error("Callback was already called.");var t=e;e=null,t.apply(this,n)}},e.exports=n.default),Wn.exports;var e,n}(),a=u(r),i=ot(),c=(rt||(rt=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e,n,t,s){let r=!1,a=!1,i=!1,c=0,l=0;function d(){c>=n||i||r||(i=!0,e.next().then((({value:e,done:n})=>{if(!a&&!r){if(i=!1,n)return r=!0,void(c<=0&&s(null));c++,t(e,l,u),l++,d()}})).catch(f))}function u(e,n){if(c-=1,!a)return e?f(e):!1===e?(r=!0,void(a=!0)):n===o.default||r&&c<=0?(r=!0,s(null)):void d()}function f(e){a||(i=!1,r=!0,s(e))}d()};var t,o=(t=lt())&&t.__esModule?t:{default:t};e.exports=n.default}(it,it.exports)),it.exports),l=u(c),d=u(lt());function u(e){return e&&e.__esModule?e:{default:e}}n.default=e=>(n,t,r)=>{if(r=(0,o.default)(r),e<=0)throw new RangeError("concurrency limit cannot be less than 1");if(!n)return r(null);if((0,i.isAsyncGenerator)(n))return(0,l.default)(n,e,t,r);if((0,i.isAsyncIterable)(n))return(0,l.default)(n[Symbol.asyncIterator](),e,t,r);var c=(0,s.default)(n),u=!1,f=!1,p=0,y=!1;function g(e,n){if(!f)if(p-=1,e)u=!0,r(e);else if(!1===e)u=!0,f=!0;else{if(n===d.default||u&&p<=0)return u=!0,r(null);y||h()}}function h(){for(y=!0;p<e&&!u;){var n=c();if(null===n)return u=!0,void(p<=0&&r(null));p+=1,t(n.value,n.key,(0,a.default)(g))}y=!1}h()},e.exports=n.default}(Dn,Dn.exports)),Dn.exports}var ut,ft={exports:{}};var pt,yt,gt,ht={exports:{}};function mt(){return pt||(pt=1,e=ht,n=ht.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e,n){if(n||(n=e.length),!n)throw new Error("arity is undefined");return function(...t){return"function"==typeof t[n-1]?e.apply(this,t):new Promise(((o,s)=>{t[n-1]=(e,...n)=>{if(e)return s(e);o(n.length>1?n:n[0])},e.apply(this,t)}))}},e.exports=n.default),ht.exports;var e,n}function wt(){return yt||(yt=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0});var t=i(dt()),o=function(){return ut||(ut=1,e=ft,n=ft.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return(n,t,o)=>e(n,o)},e.exports=n.default),ft.exports;var e,n}(),s=i(o),r=i(ot()),a=i(mt());function i(e){return e&&e.__esModule?e:{default:e}}n.default=(0,a.default)((function(e,n,o,a){return(0,t.default)(n)(e,(0,s.default)((0,r.default)(o)),a)}),4),e.exports=n.default}(Bn,Bn.exports)),Bn.exports}var bt=D((gt||(gt=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0});var t=s(wt()),o=s(mt());function s(e){return e&&e.__esModule?e:{default:e}}n.default=(0,o.default)((function(e,n,o){return(0,t.default)(e,1,n,o)}),3),e.exports=n.default}(Kn,Kn.exports)),Kn.exports));const vt=Oe("commands:jobs:download"),$t="download <jobroot>";var kt=Object.freeze({__proto__:null,builder:async e=>(vt("builder",$t),e.option("downloadTo",Ue.downloadTo.config)),command:$t,desc:"Download Job files",handler:async e=>{vt("handler",$t,e);const{hg:n,json:t,apikey:o,env:s,jobroot:r,downloadTo:c}=e,{clientApiBaseUri:l}=n;let d,u=U();try{d=we("Verifying user and authorizing"),!t&&u.start(we(`In progress: ${d}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:f}=await ze({debug:vt,baseUri:l,task:"job-download",env:s,apikey:o,jobroot:r}),p=new A.S3({accessKeyId:e,secretAccessKey:n,sessionToken:f});!t&&u.succeed(we(`Finished: ${d}.`,"secondary")),d=we("Scanning for downloadable files"),!t&&u.start(we(`In progress: ${d}...`,"secondary"));const y={Bucket:s,Prefix:r},{Contents:g}=await p.listObjectsV2(y).promise();if(vt("res",g),!g||0===g.length)return void(t?_e({status:"error",error:"Nothing to download!"}):(u.fail(we(`Error: ${d}.`,"secondary")),ve(we(`Message: ${we("Nothing to download!")}`,"secondary"))));if(!t&&u.succeed(we(`Finished: ${d}.`,"secondary")),!t){const e=new F({head:["File","Size","LastModified"]});g.forEach((n=>{const t=n.Key.substring(r.length+1);e.push([t,n.Size,n.LastModified.toLocaleString("en-US")])})),console.log(e.toString())}const h=i.resolve(process.cwd(),c,i.basename(r));await bt(g.filter((({Key:e})=>!new RegExp(`${r}/([^/]+)-config.json`).test(e))),(async e=>{d=we(`Downloading file: ${we(e.Key,"info")}`),!t&&u.start(we(`In progress: ${d}...`,"secondary"));const n=i.resolve(h,e.Key.substring(r.length+1));vt("file",n),await B(i.dirname(n),{recursive:!0});const o=p.getObject({Bucket:s,Key:e.Key}).createReadStream(),c=a(n,{flags:"w"});o.pipe(c),!t&&u.succeed(we(`Finished: ${d}.`,"secondary"))})),t?_e({status:"success",downloadedFiles:g.map((({Key:e})=>e))}):(d=we("Downloading job files."),u.succeed(we(`Finished: ${d}`,"secondary")))}catch(e){t?_e({status:"error",error:e}):(u.fail(we(`Error: ${d}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),vt(e),e&&e.response&&e.response.data&&vt("response",e.response.data))}}});const _t=(...e)=>{Oe("commands:jobs:list")(...e)},jt="list";var Ot=Object.freeze({__proto__:null,builder:async e=>(_t("builder",jt),e.option("flow",Ue.flow.config).demandOption("flow",Ue.flow.demandText).option("tenant",{...Ue.tenant.config,default:"default"}).option("count",Ue.count.config)),command:jt,desc:"List jobs",handler:async e=>{_t("handler",jt,e);const{hg:n,json:t,apikey:o,env:s,flow:r,tenant:a,count:i}=e,{clientApiBaseUri:c}=n;let l,d=U();try{l=we(`Retrieving jobs for environment: ${we(s,"info")} flow: ${we(r,"info")} tenant: ${we(a,"info")}...`);const e=`${c}/${s}/${r}/${a}/jobs${i?`?count=${i}`:""}`;_t("requesting:",e),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const{data:n}=await K.get(e,{headers:{"x-api-key":o}});if(!t&&d.succeed(we(`Finished: ${l}.`,"secondary")),_t("response-data",n),!n||0===n.length)return void(t?_e([]):d.warn(we(`Warning: ${we("No jobs for the specified environment, flow and tenant")}.`,"secondary")));if(t)_e(n);else{const e=new F({head:["name","details"]});n.forEach((n=>e.push([n.job_name,JSON.stringify(n,void 0,2)]))),console.log(e.toString())}}catch(e){t?_e({status:"error",error:e}):(d.fail(we(`Error: ${l}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),_t(e),e&&e.response&&e.response.data&&_t("response",e.response.data))}}});const xt=[kt,Ot],Et=Oe("commands:jobs"),Tt="jobs <action>";var At=Object.freeze({__proto__:null,builder:async function(e){Et("builder",Tt);return(await Ke(e)).command(xt)},command:Tt,desc:"Manage ETL jobs",handler:async function(e){Et("handler",Tt,e)}});const St=Oe("commands:snapshots:deploy"),It="deploy";var Ft=Object.freeze({__proto__:null,builder:async e=>(St("builder",It),e.option("tenant",{...Ue.tenant.config,default:"default"}).option("sourceFolder",Ue.sourceFolder.config).demandOption("sourceFolder",Ue.sourceFolder.demandText)),command:It,desc:"Deploy Snapshots",handler:async e=>{St("handler",It,e);const{hg:n,json:t,apikey:o,env:s,tenant:r,sourceFolder:a}=e,{clientApiBaseUri:c}=n;let l,d=U();const u=i.resolve(process.cwd(),a);try{l=we(`Deploying Snapshots for Tenant ${we(r,"info")} to ${we(s,"info")}`),!t&&d.info(we(`Info: ${l}.`,"secondary"));const e=await Me(u,{recursive:!0});if(0===e.length)return void(t?_e({status:"error",error:"There are no files to deploy at the specified location!"}):d.fail(we(`Error: ${we("There are no files to deploy at the specified location!")}.`,"secondary")));l=we("Verifying user and authorizing");const{accessKeyId:n,secretAccessKey:f,sessionToken:p}=await ze({debug:St,baseUri:c,task:"snapshot-deploy",env:s,tenant:r,apikey:o});!t&&d.succeed(we(`Finished: ${l}.`,"secondary"));const y=new A.S3({accessKeyId:n,secretAccessKey:f,sessionToken:p});l=we("Validating tenant exists"),!t&&d.start(we(`In progress: ${l}...`,"secondary"));try{const{CommonPrefixes:e}=await y.listObjectsV2({Bucket:s,Prefix:`${r}/`,Delimiter:"/"}).promise();if(0===e.length)throw new Error("Invalid tenant")}catch(e){throw St("err",e),new Error("Tenant doesn't exist. Please check your tenant (-u) argument.")}!t&&d.succeed(we(`Finished: ${l}.`,"secondary"));const g=`${r}/snapshots/`,h=new F({head:["File","Status"]});l=we("Preparing deployment target"),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const{Contents:m}=await y.listObjectsV2({Bucket:s,Prefix:`${g}`}).promise();!t&&d.stop(),St("contents",m),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const w=m.map((e=>({Key:e.Key})));if(w.length>0){const e={Bucket:s,Delete:{Objects:w,Quiet:!0}};await y.deleteObjects(e).promise(),w.forEach((({Key:e})=>h.push([e.substring(g.length),we("Deleted","warn")])))}!t&&d.succeed(we(`Finished: ${l}.`,"secondary"));for await(const n of e){const e=i.relative(a,n),o=`${g}${e}`;l=we(`Deploying file: ${we(e,"info")}`),!t&&d.start(we(`In progress: ${l}...`,"secondary"));const r={Bucket:s,Key:o,Body:await O(n)},c=await y.putObject(r).promise();!t&&d.succeed(we(`Finished: ${l}.`,"secondary")),St("s3-put-res",c),h.push([e,we("Deployed","info")])}t?_e({status:"success",deployedFiles:e}):be(h.toString())}catch(e){t?_e({status:"error",error:e}):(d.fail(we(`Error: ${l}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),St(e),e&&e.response&&e.response.data&&St("response",e.response.data))}}});const Ut=Oe("commands:snapshots:download"),Nt="download";var Kt=Object.freeze({__proto__:null,builder:async e=>(Ut("builder",Nt),e.option("downloadTo",Ue.downloadTo.config).demandOption("downloadTo",Ue.downloadTo.demandText).option("tenant",{...Ue.tenant.config,default:"default"}).option("overwrite",Ue.overwrite.config).demandOption("overwrite",Ue.overwrite.demandText)),command:Nt,desc:"Download Snapshots",handler:async e=>{Ut("handler",Nt,e);const{hg:n,json:t,apikey:o,env:s,tenant:a,downloadTo:c,overwrite:l}=e,{clientApiBaseUri:d}=n;let u,f=U();const p=i.resolve(process.cwd(),function(e){function n(e){return process.argv.indexOf(e)>-1}if(n(`--${e}`))return!0;const t=Ue[e]?.config?.alias||[];for(let e in t)if(n(`-${t[e]}`))return!0;return!1}("downloadTo")?c:"snapshots");try{u=we("Verifying user and authorizing"),!t&&f.start(we(`In progress: ${u}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:c}=await ze({debug:Ut,baseUri:d,task:"snapshot-download",env:s,tenant:a,apikey:o}),y=new A.S3({accessKeyId:e,secretAccessKey:n,sessionToken:c});!t&&f.succeed(we(`Finished: ${u}.`,"secondary")),u=we("Validating tenant exists"),!t&&f.start(we(`In progress: ${u}...`,"secondary"));try{const{CommonPrefixes:e}=await y.listObjectsV2({Bucket:s,Prefix:`${a}/`,Delimiter:"/"}).promise();if(0===e.length)throw new Error("Invalid tenant")}catch(e){throw Ut("err",e),new Error("Tenant doesn't exist. Please check your tenant (-u) argument.")}!t&&f.succeed(we(`Finished: ${u}.`,"secondary")),u=we("Scanning for downloadable files"),!t&&f.start(we(`In progress: ${u}...`,"secondary"));const g=`${a}/snapshots/`,h={Bucket:s,Prefix:g},{Contents:m}=await y.listObjectsV2(h).promise();!t&&f.succeed(we(`Finished: ${u}.`,"secondary")),Ut("s3-list-res",m);const w=m?m.map((e=>e.Key)).filter((e=>e!==g)):[];if(!w||0===w.length)return void(t?_e({status:"success",downloadedFiles:[]}):f.warn(we(`Warning: ${we("Nothing to download!")}`,"secondary")));u=we(`Downloading snapshot files to ${we(p,"info")}`),!t&&f.info(we(`Info: ${u}.`,"secondary"));const b=new F({head:["File","Status"]});for await(const e of w){const n=e.substring(g.length),o=i.resolve(p,n);if(Ut("file",o),e.endsWith("/")){!r(o)&&await k(o,{recursive:!0});continue}if(!l)try{await x(o),Ut("exists, skipping"),b.push([n,"Skipped"]);continue}catch(e){"ENOENT"!==e.code&&be(e)}u=we(`Downloading file: ${we(n,"info")}`),!t&&f.start(we(`In progress: ${u}...`,"secondary")),await k(i.dirname(o),{recursive:!0});const a=y.getObject({Bucket:s,Key:e}).createReadStream();await _(o,await Le(a)),!t&&f.succeed(we(`Finished: ${u}.`,"secondary")),b.push([n,"Downloaded"])}t?_e({status:"success",downloadedFiles:w}):be(b.toString())}catch(e){t?_e({status:"error",error:e}):(f.fail(we(`Error: ${u}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),Ut(e),e&&e.response&&e.response.data&&Ut("response",e.response.data))}}});const Bt=[Ft,Kt],Dt=Oe("commands:snapshots"),Mt="snapshots <action>";var Pt=Object.freeze({__proto__:null,builder:async function(e){Dt("builder",Mt,e);return(await Ke(e)).command(Bt)},command:Mt,desc:"Manage tenant snapshots",handler:async function(e){Dt("handler",Mt,e)}});const Lt=Oe("commands:tenants:custom-etl"),Ct="custom-etl",Rt=async({debug:e,baseUri:n,apikey:t,env:o,flow:s,tenant:r,supportedSources:a})=>{const i=await We({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t});let c=null;for(const{tap:l}of[...i,...a]){const{accessKeyId:a,secretAccessKey:i,sessionToken:d}=await ze({debug:e,baseUri:n,task:"etl-download",env:o,tenant:r,flow:s,tap:l,apikey:t}),u=new A.S3({accessKeyId:a,secretAccessKey:i,sessionToken:d}),f={Bucket:o,Prefix:`${r}/flows/${s}/taps/${l}/etl/`},{Contents:p}=await u.listObjectsV2(f).promise();if(p.some((({Key:e})=>e.endsWith("etl.py")||e.endsWith("etl.ipynb")))&&(c=r),null!==c)break}return c};var zt=Object.freeze({__proto__:null,builder:async e=>(Lt("builder",Ct),e.option("tenant",Ue.tenant.config).option("flow",Ue.flow.config).demandOption("flow",Ue.flow.demandText)),command:Ct,desc:"List tenants with custom ETL in a specific flow",handler:async e=>{Lt("handler",Ct,e);const{hg:n,json:t,apikey:o,env:s,flow:r}=e;let a,i=U();try{a=we(`Retrieving tenants for environment ${we(s,"info")}`),!t&&i.start(we(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ve({debug:Lt,baseUri:n.clientApiBaseUri,apikey:o,env:s}),qe({debug:Lt,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r})]);!t&&i.succeed(we(`Finished: ${a}.`,"secondary"));let l=[];a=we(`Querying for custom ETL scripts for flow ${we(r,"info")}`),!t&&i.start(we(`In progress: ${a}...`,"secondary"));for(const t of Ce(e)){const e=await Promise.all(t.map((e=>Rt({debug:Lt,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,supportedSources:c}))));l=l.concat(e.filter(Boolean))}if(!t&&i.succeed(we(`Finished: ${a}.`,"secondary")),t)_e(l);else{const e=new F({head:["Tenant ID"]});e.push(...l.map((e=>[e]))),console.log(e.toString())}}catch(e){t?_e({status:"error",error:e}):(i.fail(we(`Error: ${a}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),Lt(e),e&&e.response&&e.response.data&&Lt("response",e.response.data))}}});const Vt=Oe("commands:tenants:custom-field-map"),qt="custom-field-map",Gt=async({debug:e,baseUri:n,apikey:t,env:o,flow:s,tenant:r,isV2Flow:a})=>{const i=a?await Je({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t}):await We({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t}),c=[],{accessKeyId:l,secretAccessKey:d,sessionToken:u}=await ze({debug:e,baseUri:n,task:"field-map-download",env:o,tenant:r,flow:s,apikey:t}),f=new A.S3({accessKeyId:l,secretAccessKey:d,sessionToken:u});for(const{id:e,tap:n}of i){const t={Bucket:o,Key:`${r}/flows/${s}/${a?"connectors":"taps"}/${a?e:n}/fieldMap.json`};try{await f.headObject(t).promise(),c.push(a?e:n)}catch(e){}}return{tenant:r,connectors:c}};var Wt=Object.freeze({__proto__:null,builder:async e=>(Vt("builder",qt),e.option("tenant",Ue.tenant.config).option("flow",Ue.flow.config).demandOption("flow",Ue.flow.demandText)),command:qt,desc:"List tenants with custom field map in a specific flow",handler:async e=>{Vt("handler",qt,e);const{hg:n,json:t,apikey:o,env:s,flow:r}=e;let a,i=U();try{a=we(`Retrieving tenants for environment ${we(s,"info")}`),!t&&i.start(we(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ve({debug:Vt,baseUri:n.clientApiBaseUri,apikey:o,env:s}),Ye({debug:Vt,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r})]),l=2===c?.version;!t&&i.succeed(we(`Finished: ${a}.`,"secondary"));const d=[];a=we(`Querying for custom field maps for flow ${we(r,"info")}`),!t&&i.start(we(`In progress: ${a}...`,"secondary"));for(const t of Ce(e)){const e=await Promise.all(t.map((e=>Gt({debug:Vt,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,isV2Flow:l}))));d.push(...e.filter((({connectors:e})=>e.length>0)))}if(!t&&i.succeed(we(`Finished: ${a}.`,"secondary")),t)_e(d);else{const e=new F({head:["Tenant ID","Connector IDs"]});e.push(...d.map((({tenant:e,connectors:n})=>[e,n.join(", ")]))),console.log(e.toString())}}catch(e){t?_e({status:"error",error:e}):(i.fail(we(`Error: ${a}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),Vt(e),e&&e.response&&e.response.data&&Vt("response",e.response.data))}}});const Jt=Oe("commands:tenants:delete"),Qt="delete";var Yt=Object.freeze({__proto__:null,builder:async e=>(Jt("builder",Qt),e.option("tenant",Ue.tenant.config)),command:Qt,desc:"Delete tenant",handler:async e=>{Jt("handler",Qt,e);const{hg:n,json:t,apikey:o,env:s,tenant:r}=e,{clientApiBaseUri:a}=n;let i,c=U();try{if("default"===r)throw new Error('It\'s not possible to delete "default" tenant!');i=we(`Deleting tenant ${r} schedules`),!t&&c.start(we(`In progress: ${i}...`,"secondary")),await(async({debug:e,baseUri:n,env:t,apikey:o,tenant:s})=>{const r={"x-api-key":o},a=new URL(`${n}/tenant/${t}/${s}?schedules_only=true`).toString();e&&e("uri:",a);const{data:i}=await K.delete(a,{headers:r});return i})({debug:Jt,baseUri:a,env:s,apikey:o,tenant:r}),!t&&c.succeed(we(`Finished: ${i}.`,"secondary")),i=we("Verifying user and authorizing"),!t&&c.start(we(`In progress: ${i}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:l}=await ze({debug:Jt,baseUri:a,task:"tenant-delete",env:s,tenant:r,apikey:o});!t&&c.succeed(we(`Finished: ${i}.`,"secondary"));const d=new A.S3({accessKeyId:e,secretAccessKey:n,sessionToken:l});for(i=we(`Deleting tenant ${r} for environment ${we(s,"info")}`),!t&&c.start(we(`In progress: ${i}...`,"secondary"));;){const e=((await d.listObjectsV2({Bucket:s,Prefix:`${r}/`}).promise()).Contents||[]).map((({Key:e})=>({Key:e})));if(0===e.length)break;await d.deleteObjects({Bucket:s,Delete:{Objects:e}}).promise()}if(!t&&c.succeed(we(`Finished: ${i}.`,"secondary")),t)_e({statu:"success",tenantDeleted:r});else{const e=new F({head:["Tenant ID"]});e.push([r]),console.log(e.toString())}}catch(e){t?_e({status:"error",error:e}):(c.fail(we(`Error: ${i}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),Jt(e),e&&e.response&&e.response.data&&Jt("response",e.response.data))}}});const Ht=Oe("commands:tenants:list"),Zt="list";var Xt=Object.freeze({__proto__:null,builder:async e=>(Ht("builder",Zt),e.option("tenant",Ue.tenant.config)),command:Zt,desc:"List tenants",handler:async e=>{Ht("handler",Zt,e);const{hg:n,json:t,apikey:o,env:s,tenant:r}=e;let a,i=U();try{a=we(`Retrieving tenants for environment ${we(s,"info")}`);const e=`${n.clientApiBaseUri}/tenants/${s}${r?`?tenant=${r}`:""}`;Ht("requesting:",e),!t&&i.start(we(`In progress: ${a}...`,"secondary"));const{data:c}=await K.get(e,{headers:{"x-api-key":o}});if(!t&&i.succeed(we(`Finished: ${a}.`,"secondary")),Ht("response-data",c),!c||0===c.length)return void(t?_e([]):i.info(we(`Info: ${we("No tenants found in the specified environment")}.`,"secondary")));if(t)_e(c);else{const e=new F({head:["tenant ID"]});e.push(...c.map((e=>[e]))),console.log(e.toString())}}catch(e){t?_e({status:"error",error:e}):(i.fail(we(`Error: ${a}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),Ht(e),e&&e.response&&e.response.data&&Ht("response",e.response.data))}}});const eo=Oe("commands:tenants:custom-catalog"),no="custom-catalog",to=async({debug:e,baseUri:n,apikey:t,env:o,flow:s,tenant:r,isV2Flow:a})=>{try{const i=a?await Je({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t}):await We({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t}),c=[],{accessKeyId:l,secretAccessKey:d,sessionToken:u}=await ze({debug:e,baseUri:n,task:"field-map-download",env:o,tenant:r,flow:s,apikey:t}),f=new A.S3({accessKeyId:l,secretAccessKey:d,sessionToken:u});for(const{id:e,tap:n}of i){const t={Bucket:o,Key:`${r}/flows/${s}/${a?"connectors":"taps"}/${a?e:n}/catalog.json`};try{await f.headObject(t).promise(),c.push(a?e:n)}catch(e){}}return{tenant:r,connectors:c}}catch(e){return console.error(e),{tenant:r,connectors:[]}}};var oo=Object.freeze({__proto__:null,builder:async e=>(eo("builder",no),e.option("tenant",Ue.tenant.config).option("flow",Ue.flow.config).demandOption("flow",Ue.flow.demandText)),command:no,desc:"List tenants with custom catalog in a specific flow",handler:async e=>{eo("handler",no,e);const{hg:n,json:t,apikey:o,env:s,flow:r}=e;let a,i=U();try{a=we(`Retrieving tenants for environment ${we(s,"info")}`),!t&&i.start(we(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ve({debug:eo,baseUri:n.clientApiBaseUri,apikey:o,env:s}),Ye({debug:eo,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r})]),l=2===c?.version;!t&&i.succeed(we(`Finished: ${a}.`,"secondary"));const d=[];a=we(`Querying for custom catalogs for flow ${we(r,"info")}`),!t&&i.start(we(`In progress: ${a}...`,"secondary"));for(const t of Ce(e)){const e=await Promise.all(t.map((e=>to({debug:eo,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,isV2Flow:l}))));d.push(...e.filter((({connectors:e})=>e.length>0)))}if(!t&&i.succeed(we(`Finished: ${a}.`,"secondary")),t)_e(d);else{const e=new F({head:["Tenant ID","Connector IDs"]});e.push(...d.map((({tenant:e,connectors:n})=>[e,n.join(", ")]))),console.log(e.toString())}}catch(e){t?_e({status:"error",error:e}):(i.fail(we(`Error: ${a}.`,"secondary")),ve(we(`Message: ${we(e.message)}`,"secondary")),eo(e),e&&e.response&&e.response.data&&eo("response",e.response.data))}}});const so=[zt,Wt,Yt,Xt,oo],ro=Oe("commands:tenants"),ao="tenants <action>";var io=Object.freeze({__proto__:null,builder:async function(e){ro("builder",ao);return(await Ke(e)).command(so)},command:ao,desc:"Manage tenants",handler:async function(e){ro("handler",ao,e)}});const co=[Fe,un,xn,Nn,At,Pt,io];process.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE="1";he({});const lo=h(process.argv.slice(2));lo.usage(we("Usage: $0 <command>")).command(co).demandCommand().alias("v","version").alias("h","help").string("_").strictCommands().epilogue(we("For more information, visit https://docs.hotglue.xyz/docs/cli-overview")).wrap(Math.min(lo.terminalWidth(),90)).parse(process.argv.slice(W()+1),ce);
|
|
34
|
+
*/(e),s="string"==typeof e,r=function(e){const n=[],t=Object.create(null);let o=!0;Object.keys(e).forEach(function(t){n.push([].concat(e[t],t))});for(;o;){o=!1;for(let e=0;e<n.length;e++)for(let t=e+1;t<n.length;t++){if(n[e].filter(function(e){return-1!==n[t].indexOf(e)}).length){n[e]=n[e].concat(n[t]),n.splice(t,1),o=!0;break}}}return n.forEach(function(e){const n=(e=e.filter(function(e,n,t){return t.indexOf(e)===n})).pop();void 0!==n&&"string"==typeof n&&(t[n]=e)}),t}(Object.assign(Object.create(null),t.alias)),a=Object.assign({"boolean-negation":!0,"camel-case-expansion":!0,"combine-arrays":!1,"dot-notation":!0,"duplicate-arguments-array":!0,"flatten-duplicate-arrays":!0,"greedy-arrays":!0,"halt-at-non-option":!1,"nargs-eats-options":!1,"negation-prefix":"no-","parse-numbers":!0,"parse-positional-numbers":!0,"populate--":!1,"set-placeholder-key":!1,"short-option-groups":!0,"strip-aliased":!1,"strip-dashed":!1,"unknown-options-as-args":!1},t.configuration),i=Object.assign(Object.create(null),t.default),c=t.configObjects||[],l=t.envPrefix,d=a["populate--"],u=d?"--":"_",f=Object.create(null),p=Object.create(null),y=t.__||z.format,g={aliases:Object.create(null),arrays:Object.create(null),bools:Object.create(null),strings:Object.create(null),numbers:Object.create(null),counts:Object.create(null),normalize:Object.create(null),configs:Object.create(null),nargs:Object.create(null),coercions:Object.create(null),keys:[]},h=/^-([0-9]+(\.[0-9]+)?|\.[0-9]+)$/,m=new RegExp("^--"+a["negation-prefix"]+"(.+)");[].concat(t.array||[]).filter(Boolean).forEach(function(e){const n="object"==typeof e?e.key:e,t=Object.keys(e).map(function(e){return{boolean:"bools",string:"strings",number:"numbers"}[e]}).filter(Boolean).pop();t&&(g[t][n]=!0),g.arrays[n]=!0,g.keys.push(n)}),[].concat(t.boolean||[]).filter(Boolean).forEach(function(e){g.bools[e]=!0,g.keys.push(e)}),[].concat(t.string||[]).filter(Boolean).forEach(function(e){g.strings[e]=!0,g.keys.push(e)}),[].concat(t.number||[]).filter(Boolean).forEach(function(e){g.numbers[e]=!0,g.keys.push(e)}),[].concat(t.count||[]).filter(Boolean).forEach(function(e){g.counts[e]=!0,g.keys.push(e)}),[].concat(t.normalize||[]).filter(Boolean).forEach(function(e){g.normalize[e]=!0,g.keys.push(e)}),"object"==typeof t.narg&&Object.entries(t.narg).forEach(([e,n])=>{"number"==typeof n&&(g.nargs[e]=n,g.keys.push(e))}),"object"==typeof t.coerce&&Object.entries(t.coerce).forEach(([e,n])=>{"function"==typeof n&&(g.coercions[e]=n,g.keys.push(e))}),void 0!==t.config&&(Array.isArray(t.config)||"string"==typeof t.config?[].concat(t.config).filter(Boolean).forEach(function(e){g.configs[e]=!0}):"object"==typeof t.config&&Object.entries(t.config).forEach(([e,n])=>{"boolean"!=typeof n&&"function"!=typeof n||(g.configs[e]=n)})),function(...e){e.forEach(function(e){Object.keys(e||{}).forEach(function(e){g.aliases[e]||(g.aliases[e]=[].concat(r[e]||[]),g.aliases[e].concat(e).forEach(function(n){if(/-/.test(n)&&a["camel-case-expansion"]){const t=L(n);t!==e&&-1===g.aliases[e].indexOf(t)&&(g.aliases[e].push(t),f[t]=!0)}}),g.aliases[e].concat(e).forEach(function(n){if(n.length>1&&/[A-Z]/.test(n)&&a["camel-case-expansion"]){const t=function(e,n){const t=e.toLowerCase();n=n||"-";let o="";for(let s=0;s<e.length;s++){const r=t.charAt(s),a=e.charAt(s);o+=r!==a&&s>0?`${n}${t.charAt(s)}`:a}return o}(n,"-");t!==e&&-1===g.aliases[e].indexOf(t)&&(g.aliases[e].push(t),f[t]=!0)}}),g.aliases[e].forEach(function(n){g.aliases[n]=[e].concat(g.aliases[e].filter(function(e){return n!==e}))}))})})}(t.key,r,t.default,g.arrays),Object.keys(i).forEach(function(e){(g.aliases[e]||[]).forEach(function(n){i[n]=i[e]})});let w=null;Object.keys(g.counts).find(e=>N(e,g.arrays)?(w=Error(y("Invalid configuration: %s, opts.count excludes opts.array.",e)),!0):!!N(e,g.nargs)&&(w=Error(y("Invalid configuration: %s, opts.count excludes opts.narg.",e)),!0));let b=[];const v=Object.assign(Object.create(null),{_:[]}),$={};for(let e=0;e<o.length;e++){const n=o[e],t=n.replace(/^-{3,}/,"---");let s,r,i,c,l,d;if("--"!==n&&K(n))k(n);else{if(t.match(/---+(=|$)/)){k(n);continue}if(n.match(/^--.+=/)||!a["short-option-groups"]&&n.match(/^-.+=/))c=n.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(N(c[1],g.arrays)?e=_(e,c[1],o,c[2]):!1!==N(c[1],g.nargs)?e=j(e,c[1],o,c[2]):O(c[1],c[2],!0));else if(n.match(m)&&a["boolean-negation"])c=n.match(m),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],O(r,!!N(r,g.arrays)&&[!1]));else if(n.match(/^--.+/)||!a["short-option-groups"]&&n.match(/^-[^-]+/))c=n.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],N(r,g.arrays)?e=_(e,r,o):!1!==N(r,g.nargs)?e=j(e,r,o):(l=o[e+1],void 0===l||l.match(/^-/)&&!l.match(h)||N(r,g.bools)||N(r,g.counts)?/^(true|false)$/.test(l)?(O(r,l),e++):O(r,B(r)):(O(r,l),e++)));else if(n.match(/^-.\..+=/))c=n.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&O(c[1],c[2]);else if(n.match(/^-.\..+/)&&!n.match(h))l=o[e+1],c=n.match(/^-(.\..+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],void 0===l||l.match(/^-/)||N(r,g.bools)||N(r,g.counts)?O(r,B(r)):(O(r,l),e++));else if(n.match(/^-[^-]+/)&&!n.match(h)){i=n.slice(1,-1).split(""),s=!1;for(let t=0;t<i.length;t++){if(l=n.slice(t+2),i[t+1]&&"="===i[t+1]){d=n.slice(t+3),r=i[t],N(r,g.arrays)?e=_(e,r,o,d):!1!==N(r,g.nargs)?e=j(e,r,o,d):O(r,d),s=!0;break}if("-"!==l){if(/[A-Za-z]/.test(i[t])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(l)&&!1===N(l,g.bools)){O(i[t],l),s=!0;break}if(i[t+1]&&i[t+1].match(/\W/)){O(i[t],l),s=!0;break}O(i[t],B(i[t]))}else O(i[t],l)}r=n.slice(-1)[0],s||"-"===r||(N(r,g.arrays)?e=_(e,r,o):!1!==N(r,g.nargs)?e=j(e,r,o):(l=o[e+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(h)||N(r,g.bools)||N(r,g.counts)?/^(true|false)$/.test(l)?(O(r,l),e++):O(r,B(r)):(O(r,l),e++)))}else if(n.match(/^-[0-9]$/)&&n.match(h)&&N(n.slice(1),g.bools))r=n.slice(1),O(r,B(r));else{if("--"===n){b=o.slice(e+1);break}if(a["halt-at-non-option"]){b=o.slice(e);break}k(n)}}}function k(e){const n=S("_",e);"string"!=typeof n&&"number"!=typeof n||v._.push(n)}function j(e,n,t,o){let s,r=N(n,g.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return R(o)||(w=Error(y("Argument unexpected for: %s",n))),O(n,B(n)),e;let i=R(o)?0:1;if(a["nargs-eats-options"])t.length-(e+1)+i<r&&(w=Error(y("Not enough arguments following: %s",n))),i=r;else{for(s=e+1;s<t.length&&(!t[s].match(/^-[^0-9]/)||t[s].match(h)||K(t[s]));s++)i++;i<r&&(w=Error(y("Not enough arguments following: %s",n)))}let c=Math.min(i,r);for(!R(o)&&c>0&&(O(n,o),c--),s=e+1;s<c+e+1;s++)O(n,t[s]);return e+c}function _(e,n,t,o){let r=[],c=o||t[e+1];const l=N(n,g.nargs);if(N(n,g.bools)&&!/^(true|false)$/.test(c))r.push(!0);else if(R(c)||R(o)&&/^-/.test(c)&&!h.test(c)&&!K(c)){if(void 0!==i[n]){const e=i[n];r=Array.isArray(e)?e:[e]}}else{R(o)||r.push(x(n,o,!0));for(let o=e+1;o<t.length&&!(!a["greedy-arrays"]&&r.length>0||l&&"number"==typeof l&&r.length>=l)&&(c=t[o],!/^-/.test(c)||h.test(c)||K(c));o++)e=o,r.push(x(n,c,s))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(w=Error(y("Not enough arguments following: %s",n))),O(n,r),e}function O(e,n,t=s){if(/-/.test(e)&&a["camel-case-expansion"]){const n=e.split(".").map(function(e){return L(e)}).join(".");E(e,n)}const o=x(e,n,t),r=e.split(".");if(U(v,r,o),g.aliases[e]&&g.aliases[e].forEach(function(e){const n=e.split(".");U(v,n,o)}),r.length>1&&a["dot-notation"]&&(g.aliases[r[0]]||[]).forEach(function(n){let t=n.split(".");const s=[].concat(r);s.shift(),t=t.concat(s),(g.aliases[e]||[]).includes(t.join("."))||U(v,t,o)}),N(e,g.normalize)&&!N(e,g.arrays)){[e].concat(g.aliases[e]||[]).forEach(function(e){Object.defineProperty($,e,{enumerable:!0,get:()=>n,set(e){n="string"==typeof e?z.normalize(e):e}})})}}function E(e,n){g.aliases[e]&&g.aliases[e].length||(g.aliases[e]=[n],f[n]=!0),g.aliases[n]&&g.aliases[n].length||E(n,e)}function x(e,n,t){t&&(n=function(e){return"string"!=typeof e||"'"!==e[0]&&'"'!==e[0]||e[e.length-1]!==e[0]?e:e.substring(1,e.length-1)}(n)),(N(e,g.bools)||N(e,g.counts))&&"string"==typeof n&&(n="true"===n);let o=Array.isArray(n)?n.map(function(n){return S(e,n)}):S(e,n);return N(e,g.counts)&&(R(o)||"boolean"==typeof o)&&(o=V()),N(e,g.normalize)&&N(e,g.arrays)&&(o=Array.isArray(n)?n.map(e=>z.normalize(e)):z.normalize(n)),o}function S(e,n){if(!a["parse-positional-numbers"]&&"_"===e)return n;if(!N(e,g.strings)&&!N(e,g.bools)&&!Array.isArray(n)){(null!=(t=n)&&("number"==typeof t||!!/^0x[0-9a-f]+$/i.test(t)||!/^0[^.]/.test(t)&&/^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(t))&&a["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${n}`)))||!R(n)&&N(e,g.numbers))&&(n=Number(n))}var t;return n}function T(e,n){Object.keys(e).forEach(function(t){const o=e[t],s=n?n+"."+t:t;"object"==typeof o&&null!==o&&!Array.isArray(o)&&a["dot-notation"]?T(o,s):(!F(v,s.split("."))||N(s,g.arrays)&&a["combine-arrays"])&&O(s,o)})}function A(e,n){if(void 0===l)return;const t="string"==typeof l?l:"",o=z.env();Object.keys(o).forEach(function(s){if(""===t||0===s.lastIndexOf(t,0)){const r=s.split("__").map(function(e,n){return 0===n&&(e=e.substring(t.length)),L(e)});(n&&g.configs[r.join(".")]||!n)&&!F(e,r)&&O(r.join("."),o[s])}})}function I(e,n,t,o=!1){Object.keys(t).forEach(function(s){F(e,s.split("."))||(U(e,s.split("."),t[s]),o&&(p[s]=!0),(n[s]||[]).forEach(function(n){F(e,n.split("."))||U(e,n.split("."),t[s])}))})}function F(e,n){let t=e;a["dot-notation"]||(n=[n.join(".")]),n.slice(0,-1).forEach(function(e){t=t[e]||{}});const o=n[n.length-1];return"object"==typeof t&&o in t}function U(e,n,t){let o=e;a["dot-notation"]||(n=[n.join(".")]),n.slice(0,-1).forEach(function(e){e=q(e),"object"==typeof o&&void 0===o[e]&&(o[e]={}),"object"!=typeof o[e]||Array.isArray(o[e])?(Array.isArray(o[e])?o[e].push({}):o[e]=[o[e],{}],o=o[e][o[e].length-1]):o=o[e]});const s=q(n[n.length-1]),r=N(n.join("."),g.arrays),i=Array.isArray(t);let c=a["duplicate-arguments-array"];!c&&N(s,g.nargs)&&(c=!0,(!R(o[s])&&1===g.nargs[s]||Array.isArray(o[s])&&o[s].length===g.nargs[s])&&(o[s]=void 0)),t===V()?o[s]=V(o[s]):Array.isArray(o[s])?c&&r&&i?o[s]=a["flatten-duplicate-arrays"]?o[s].concat(t):(Array.isArray(o[s][0])?o[s]:[o[s]]).concat([t]):c||Boolean(r)!==Boolean(i)?o[s]=o[s].concat([t]):o[s]=t:void 0===o[s]&&r?o[s]=i?t:[t]:!c||void 0===o[s]||N(s,g.counts)||N(s,g.bools)?o[s]=t:o[s]=[o[s],t]}function N(e,n){const t=[].concat(g.aliases[e]||[],e),o=Object.keys(n),s=t.find(e=>o.includes(e));return!!s&&n[s]}function D(e){const n=Object.keys(g);return[].concat(n.map(e=>g[e])).some(function(n){return Array.isArray(n)?n.includes(e):n[e]})}function K(e){return a["unknown-options-as-args"]&&function(e){if(e=e.replace(/^-{3,}/,"--"),e.match(h))return!1;if(function(e){if(e.match(h)||!e.match(/^-[^-]+/))return!1;let n,t=!0;const o=e.slice(1).split("");for(let s=0;s<o.length;s++){if(n=e.slice(s+2),!D(o[s])){t=!1;break}if(o[s+1]&&"="===o[s+1]||"-"===n||/[A-Za-z]/.test(o[s])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(n)||o[s+1]&&o[s+1].match(/\W/))break}return t}(e))return!1;return!function(e,...n){return[].concat(...n).some(function(n){const t=e.match(n);return t&&D(t[1])})}(e,/^-+([^=]+?)=[\s\S]*$/,m,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(e)}function B(e){return N(e,g.bools)||N(e,g.counts)||!(`${e}`in i)?(n=function(e){let n=P.BOOLEAN;return N(e,g.strings)?n=P.STRING:N(e,g.numbers)?n=P.NUMBER:N(e,g.bools)?n=P.BOOLEAN:N(e,g.arrays)&&(n=P.ARRAY),n}(e),{[P.BOOLEAN]:!0,[P.STRING]:"",[P.NUMBER]:void 0,[P.ARRAY]:[]}[n]):i[e];var n}function R(e){return void 0===e}return A(v,!0),A(v,!1),function(e){const n=Object.create(null);I(n,g.aliases,i),Object.keys(g.configs).forEach(function(t){const o=e[t]||n[t];if(o)try{let e=null;const n=z.resolve(z.cwd(),o),s=g.configs[t];if("function"==typeof s){try{e=s(n)}catch(n){e=n}if(e instanceof Error)return void(w=e)}else e=z.require(n);T(e)}catch(n){"PermissionDenied"===n.name?w=n:e[t]&&(w=Error(y("Invalid JSON config file: %s",o)))}})}(v),void 0!==c&&c.forEach(function(e){T(e)}),I(v,g.aliases,i,!0),function(e){let n;const t=new Set;Object.keys(e).forEach(function(o){if(!t.has(o)&&(n=N(o,g.coercions),"function"==typeof n))try{const s=S(o,n(e[o]));[].concat(g.aliases[o]||[],o).forEach(n=>{t.add(n),e[n]=s})}catch(e){w=e}})}(v),a["set-placeholder-key"]&&function(e){g.keys.forEach(n=>{~n.indexOf(".")||void 0===e[n]&&(e[n]=void 0)})}(v),Object.keys(g.counts).forEach(function(e){F(v,e.split("."))||O(e,0)}),d&&b.length&&(v[u]=[]),b.forEach(function(e){v[u].push(e)}),a["camel-case-expansion"]&&a["strip-dashed"]&&Object.keys(v).filter(e=>"--"!==e&&e.includes("-")).forEach(e=>{delete v[e]}),a["strip-aliased"]&&[].concat(...Object.keys(r).map(e=>r[e])).forEach(e=>{a["camel-case-expansion"]&&e.includes("-")&&delete v[e.split(".").map(e=>L(e)).join(".")],delete v[e]}),{aliases:Object.assign({},g.aliases),argv:Object.assign($,v),configuration:a,defaulted:Object.assign({},p),error:w,newAliases:Object.assign({},f)}}}({cwd:process.cwd,env:()=>W,format:f,normalize:c,resolve:i,require:e=>{if("undefined"!=typeof require)return require(e);if(e.match(/\.json$/))return JSON.parse(n(e,"utf8"));throw Error("only .json config files are supported in ESM")}});var G={fs:{readFileSync:n,writeFile:t},format:f,resolve:i,exists:e=>{try{return o(e).isFile()}catch(e){return!1}}};let Q;class Y{constructor(e){e=e||{},this.directory=e.directory||"./locales",this.updateFiles="boolean"!=typeof e.updateFiles||e.updateFiles,this.locale=e.locale||"en",this.fallbackToLanguage="boolean"!=typeof e.fallbackToLanguage||e.fallbackToLanguage,this.cache=Object.create(null),this.writeQueue=[]}__(...e){if("string"!=typeof arguments[0])return this._taggedLiteral(arguments[0],...arguments);const n=e.shift();let t=function(){};return"function"==typeof e[e.length-1]&&(t=e.pop()),t=t||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][n]&&this.updateFiles?(this.cache[this.locale][n]=n,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:t})):t(),Q.format.apply(Q.format,[this.cache[this.locale][n]||n].concat(e))}__n(){const e=Array.prototype.slice.call(arguments),n=e.shift(),t=e.shift(),o=e.shift();let s=function(){};"function"==typeof e[e.length-1]&&(s=e.pop()),this.cache[this.locale]||this._readLocaleFile();let r=1===o?n:t;if(this.cache[this.locale][n]){r=this.cache[this.locale][n][1===o?"one":"other"]}!this.cache[this.locale][n]&&this.updateFiles?(this.cache[this.locale][n]={one:n,other:t},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:s})):s();const a=[r];return~r.indexOf("%d")&&a.push(o),Q.format.apply(Q.format,a.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){this.cache[this.locale]||this._readLocaleFile();for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(this.cache[this.locale][n]=e[n])}_taggedLiteral(e,...n){let t="";return e.forEach(function(e,o){const s=n[o+1];t+=e,void 0!==s&&(t+="%s")}),this.__.apply(this,[t].concat([].slice.call(n,1)))}_enqueueWrite(e){this.writeQueue.push(e),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const e=this,n=this.writeQueue[0],t=n.directory,o=n.locale,s=n.cb,r=this._resolveLocaleFile(t,o),a=JSON.stringify(this.cache[o],null,2);Q.fs.writeFile(r,a,"utf-8",function(n){e.writeQueue.shift(),e.writeQueue.length>0&&e._processWriteQueue(),s(n)})}_readLocaleFile(){let e={};const n=this._resolveLocaleFile(this.directory,this.locale);try{Q.fs.readFileSync&&(e=JSON.parse(Q.fs.readFileSync(n,"utf-8")))}catch(t){if(t instanceof SyntaxError&&(t.message="syntax error in "+n),"ENOENT"!==t.code)throw t;e={}}this.cache[this.locale]=e}_resolveLocaleFile(e,n){let t=Q.resolve(e,"./",n+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(t)&&~n.lastIndexOf("_")){const o=Q.resolve(e,"./",n.split("_")[0]+".json");this._fileExistsSync(o)&&(t=o)}return t}_fileExistsSync(e){return Q.exists(e)}}let H;try{H=y(import.meta.url)}catch(e){H=process.cwd()}H.split("node_modules")[0]||process.cwd(),process.cwd,process.exit,process.nextTick,void 0!==process.stdout.columns&&process.stdout.columns,function(e,n){Q=n;const t=new Y(e);t.__.bind(t),t.__n.bind(t),t.setLocale.bind(t),t.getLocale.bind(t),t.updateLocale.bind(t),t.locale}({directory:i(H,"../../../locales"),updateFiles:!1},G);const Z={hg:{appName:"hotglue",clientApiBaseUri:process.env.HOTGLUE_CLIENT_API_BASE_URI||"https://client-api.hotglue.xyz",defaultConfigFileName:"config.yaml"}},X={},ee=()=>a.resolve(d(),`.${Z.hg.appName}`,Z.hg.defaultConfigFileName),ne=async()=>{const{appName:e}=Z.hg;try{return await v(e).load(ee())||{}}catch(e){return{}}},te=async()=>{const{appName:e}=Z.hg,n=v(e,{searchPlaces:[`${e}.yaml`,`.${e}.yaml`,`.${e}rc.yaml`,`.${e}rc.yml`,`.${e}rc`,`.${e}rc.json`,`.${e}rc.js`]});try{return await n.search()||{}}catch(e){throw console.log(e),new Error(`Malformed configuration file: ${e.message}`)}},oe={primary:e=>$.whiteBright(e),secondary:e=>$.white(e),info:e=>$.green(e),warn:e=>$.yellow(e),error:e=>$.redBright(e),success:e=>$.greenBright(e)};let se=oe,re="primary";function ae(e){return se={...oe,...e},fe}function ie(e){process.stdout.write(e)}const ce=(e,n=re)=>{if(!e)return"";if("string"==typeof e)return se[n]?se[n](e):se[re](e);const t=p(e,{colors:!0});return se[n]?se[n](t):t};function le(...e){return console.log(...e),fe}function de(e,n){return ie(ce(e,n)),ie("\n"),fe}function ue(e,n){return ie(ce(e,n)),fe}const fe={cl:le,pr:de,pp:ue,setTheme:ae,setDefault:function(e="primary"){return se[e]&&(re=e),fe}},pe=e=>{console.log(JSON.stringify(e))},ye=j("hotglue-cli");function ge(e){return ye.extend(e)}const he=ge("commands:config:set"),me="set <setting> <value>";var we=Object.freeze({__proto__:null,builder:async e=>(he("builder",me,e),e.option("setting",{describe:"The configuration parameter you wish to set",type:"string"}).option("value",{describe:"The configuration parameter's value",type:"string"}),e),command:me,desc:"Set configuration key-value pairs",handler:async e=>{he("handler",me,e);const{json:n,setting:t,value:o}=e;if(["apikey"].includes(t))try{const e=await ne();e&&e.config?!n&&ue("Updating profile config file..."):!n&&ue("Creating profile config file...");const s=e&&e.config?{...e.config,[t]:o}:{[t]:o},r=_.stringify(s),i=e&&e.filepath?e.filepath:ee();await(async(e,n)=>{await g(a.dirname(e),{recursive:!0}),await h(e,n)})(i,r),n?pe({status:"success"}):ue("Done").pr()}catch(e){n?pe({status:"error",error:e}):console.log(e)}else n?pe({status:"error",error:"Invalid settings parameter"}):console.error("Invalid settings parameter")}});const be=[we],ve=ge("commands:config"),$e="config [action]";var ke=Object.freeze({__proto__:null,builder:async function(e){return ve("builder",$e),e.command(be)},command:$e,desc:"Configure your hotglue CLI",handler:async function(e){ve("handler",$e,e);const{action:n}=e;if(!n)try{const e=await ne();e.config&&0!==Object.keys(e.config).length||de("No profile configuration found. Run config set to configure the hotglue CLI.");const n=new O({head:["Setting","Value","Config File","Type"]});e.config&&Object.entries(e.config).forEach(([t,o])=>n.push([t,o,e.filepath,"Profile"]));const t=await te();t.config&&Object.entries(t.config).forEach(([e,o])=>n.push([e,o,a.relative(process.cwd(),t.filepath),"Project"])),n.length>0&&console.log(n.toString())}catch(e){throw console.log(e),e}}}),je={env:{config:{describe:"Environment Id",type:"string",alias:["e"]},demandText:'The "env" parameter (Environment Id) is required. Either pass here using `-e [env_id]` or add an env property in your rc file.'},apikey:{config:{describe:"API key",type:"string",alias:["k"]},demandText:"API key is required. Either pass here using -k [key] or configure your profile using config set."},dataFilePath:{config:{describe:"Singer data file path",type:"string",alias:["data","data-file-path"],default:"data.singer"}},json:{config:{describe:"Makes the output format to be JSON",type:"boolean",default:!1},demandText:""},tenant:{config:{describe:"Tenant (user) ID",type:"string",alias:["u"]},demandText:"TenantId is required. You can pass it using -u [tenantId]."},flow:{config:{describe:"Flow ID",type:"string",alias:["f"]},demandText:"FlowId is required. You can pass it using -f [flow_id]."},tap:{config:{describe:"Tap name",type:"string",alias:["t"]},demandText:"Tap name is required. You can pass it using -t <tap_name>."},connector:{config:{describe:"Connector ID",type:"string",alias:["c"]},demandText:"Connector ID is required. You can pass it using -c <connector>."},all:{config:{describe:"Run command for all taps/connectors",type:"boolean",default:!1,alias:["a"]},demandText:'This "all" flag is required. You can pass it using -a or --all.'},jobroot:{config:{describe:"Job Root (S3 prefix)",type:"string",alias:["j"]},demandText:"JobRoot key is required. You can pass it using -j [job_root]."},count:{config:{describe:"Max returned records",type:"number"}},downloadTo:{config:{describe:"Download folder",default:".",type:"string",alias:["d"]},demandText:"A destination folder is required. You can pass it using -d [folder] and can be either relative from cwd or absolute."},sourceFolder:{config:{describe:"Source folder",type:"string",default:".",alias:["s"]},demandText:""},configFilePath:{config:{describe:"Config file path",type:"string",default:"./config.json",alias:["p"]},demandText:'Local path of the config (with .json extension). Example: "/home/hotglue/config.json"'},overwrite:{config:{describe:"Overwrite existing",type:"boolean",default:!1,alias:["o"]},demandText:""},cleanup:{config:{describe:"Clean up target prior to action",type:"boolean",default:!1,alias:["c"]},demandText:""}};const _e=ge("base"),Oe=async e=>{_e("builder");const n=await(async()=>{const e=await ne(),n=await te();return{...X,...e.config,...n.config}})();return e.option("apikey",je.apikey.config).option("env",je.env.config).option("json",je.json.config).config(n).demandOption(["env"],je.env.demandText).demandOption(["apikey"],je.apikey.demandText).strictCommands()},Ee=ge("utils.js"),xe=async(e,n,t=[])=>{const{includeSymLinks:o,recursive:s,filter:r}=n,{matcher:i}=r,c=a.resolve(e),l=await m(c,{withFileTypes:!0});for(const e of l){const r=a.resolve(c,e.name);e.isSymbolicLink()&&!o||(!i||i(r)?e.isFile()?t.push(a.resolve(c,e.name)):e.isDirectory()&&s&&await xe(a.resolve(c,e.name),n,t):Ee("skip",r))}return t},Se=async(e,n)=>{const t={includeSymLinks:!1,recursive:!1,filter:{},...n},{pattern:o}=t.filter;return o&&(t.filter.matcher=x.matcher(o,{dot:!0})),xe(e,t)},Te=(e,n)=>{Ee("filter-in",e);const{pattern:t}={...n};let o=e;return t&&(o=x(o,t)),Ee("filter-out",o),o};const Ae=e=>{const n=[];return new Promise((t,o)=>{e.on("error",o),e.on("data",e=>n.push(Buffer.from(e))),e.on("end",()=>t(Buffer.concat(n).toString("utf8")))})},Ie=(e,n=10)=>{const t=[];for(let o=0;o<e.length;o+=n){const s=e.slice(o,o+n);t.push(s)}return t},Fe=async({debug:e,baseUri:n,env:t,apiKey:o})=>{const s=new URL(`${n}/${t}/resetAvailableEntities`),{data:r}=await S.delete(s,{headers:{"x-api-key":o,"Content-type":"application/json"}});e({data:r})},Ue=async({debug:e,baseUri:n,task:t,env:o,apikey:s,...r})=>{const a=new URL(`${n}/credentials/${t}/${o}`);r&&Object.entries(r).forEach(([e,n])=>{a.searchParams.set(e,n)});const i=a.toString();e&&e("uri:",i);const{data:c}=await S.get(i,{headers:{"x-api-key":s}}),{accessKeyId:l,secretAccessKey:d,sessionToken:u}=c;return{accessKeyId:l,secretAccessKey:d,sessionToken:u}},Ne=async({debug:e,baseUri:n,env:t,apikey:o})=>{const s=`${n}/tenants/${t}`;e("requesting:",s);const{data:r}=await S.get(s,{headers:{"x-api-key":o}});return e("response-data",r),r},De=async({debug:e,baseUri:n,env:t,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${n}/${t}/${o}/supportedSources`).toString();e&&e("uri:",a);const{data:i}=await S.get(a,{headers:r});return i},Ke=async({debug:e,baseUri:n,env:t,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${n}/v2/${t}/${o}/supportedConnectors`).toString();e&&e("uri:",a);const{data:i}=await S.get(a,{headers:r});return i},Be=async({debug:e,baseUri:n,env:t,flow:o,tenant:s,apikey:r,config:a})=>{const i=new URL(`${n}/${t}/${o}/${s}/linkedSources`);a&&i.searchParams.set("config","true");const c={"x-api-key":r},l=i.toString();e&&e("uri:",l);const{data:d}=await S.get(l,{headers:c});return d},Pe=async({debug:e,baseUri:n,env:t,flow:o,tenant:s,apikey:r,config:a})=>{const i=new URL(`${n}/v2/${t}/${o}/${s}/linkedConnectors`);a&&i.searchParams.set("config","true");const c={"x-api-key":r},l=i.toString();e&&e("uri:",l);const{data:d}=await S.get(l,{headers:c});return d},Re=async({debug:e,baseUri:n,env:t,flow:o,tenant:s,apikey:r,connectorId:a,config:i})=>{const c={"x-api-key":r},l=new URL(`${n}/${t}/${o}/${s}/linkedSources`).toString(),d={tap:a,config:i};e&&e("uri:",l);const{data:u}=await S.patch(l,d,{headers:c});return u},Me=async({debug:e,baseUri:n,env:t,flow:o,tenant:s,apikey:r,connectorId:a,config:i})=>{const c={"x-api-key":r},l=new URL(`${n}/v2/${t}/${o}/${s}/linkedConnectors`).toString(),d={connector_id:a,config:i};e&&e("uri:",l);const{data:u}=await S.patch(l,d,{headers:c});return u},Ce=async({debug:e,baseUri:n,env:t,apikey:o})=>{const s={"x-api-key":o},r=new URL(`${n}/${t}/flows/supported`).toString();e&&e("uri:",r);const{data:a}=await S.get(r,{headers:s});return a},Le=async({debug:e,baseUri:n,env:t,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${n}/${t}/flows/${o}/supported`).toString();e&&e("uri:",a);const{data:i}=await S.get(a,{headers:r});return i},ze=j("commands:env:validators"),Ve=async(e,n,t,o,s)=>{if(!Array.isArray(e))throw new Error("availableSources.json must be an array of objects");const r=(await Promise.all(o.filter(e=>1==e.version).map(async e=>await De({debug:ze,baseUri:n,env:s,flow:e.id,apikey:t})))).flat(),a=e.map(e=>{if(!e.tap)throw new Error(`Source ${JSON.stringify(e)} has no tap id`);return e.tap}),i=a.filter((e,n)=>a.indexOf(e)!==n);if(i.length>0)throw new Error(`Duplicate source id(s) found in availableSources.json: ${i.join(", ")}. All sources must have a unique tap id.`);const c=r.filter(e=>e.isForked&&!a.includes(e.tap));if(c.length>0)throw new Error(`Sources ${c.map(e=>e.label).join(", ")} are linked, but missing from your availableSources.json`)},qe=async(e,n,t,o,s)=>{if(!Array.isArray(e))throw new Error("availableTargets.json must be an array of objects");const r=(await Promise.all(o.filter(e=>1==e.version).map(async e=>{const o=await(async({debug:e,baseUri:n,env:t,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${n}/${t}/${o}/supportedTargets`).toString();e&&e("uri:",a);const{data:i}=await S.get(a,{headers:r});return i})({debug:ze,baseUri:n,env:s,flow:e.id,apikey:t});return o}))).flat(),a=e.map(e=>{if(!e.target)throw new Error(`Target ${JSON.stringify(e)} has no target id`);return e.target}),i=a.filter((e,n)=>a.indexOf(e)!==n);if(i.length>0)throw new Error(`Duplicate target id(s) found in availableTargets.json: ${i.join(", ")}. All targets must have a unique target id.`);const c=r.filter(e=>e.isForked&&!a.includes(e.target));if(c.length>0)throw new Error(`Targets ${c.map(e=>e.label).join(", ")} are linked, but missing from your availableTargets.json`)},Je=async(e,n,t,o,s)=>{if(!Array.isArray(e))throw new Error("availableConnectors.json must be an array of objects");const r=(await Promise.all(o.filter(e=>2==e.version).map(async e=>await Ke({debug:ze,baseUri:n,env:s,flow:e.id,apikey:t})))).flat(),a=e.map(e=>{if(!e.id)throw new Error(`Connector ${JSON.stringify(e)} has no id`);return e.id}),i=a.filter((e,n)=>a.indexOf(e)!==n);if(i.length>0)throw new Error(`Duplicate connector id(s) found in availableConnectors.json: ${i.join(", ")}. All connectors must have a unique id.`);const c=r.filter(e=>e.isForked&&!a.includes(e.id));if(c.length>0)throw new Error(`Connectors ${c.map(e=>e.id).join(", ")} are linked, but missing from your availableConnectors.json`)},We=ge("commands:env:deploy"),Ge="deploy";var Qe=Object.freeze({__proto__:null,builder:async e=>(We("builder",Ge),e.option("sourceFolder",je.sourceFolder.config).demandOption("sourceFolder",je.sourceFolder.demandText)),command:Ge,desc:"Deploy Environment settings",handler:async e=>{We("handler",Ge,e);const{hg:n,json:t,apikey:o,env:s,sourceFolder:r}=e,{clientApiBaseUri:i}=n,c=a.resolve(process.cwd(),r);let l,d=E();try{l=ce(`Scanning ${ce(c,"info")} for deployable files`),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const e=await Se(c,{filter:{pattern:"((**/requirements.txt)|(**/availableSources.json)|(**/availableTargets.json)|(**/availableConnectors.json)|(**/customTaps.json))"}});if(0===e.length)return void(t?pe({status:"error",error:"There are no files to deploy at the specified location!"}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce("There are no files to deploy at the specified location!")}`,"secondary"))));!t&&d.succeed(ce(`Finished: ${l}.`,"secondary"));for(const n of e)if(n.endsWith(".json"))try{const e=await w(n,{encoding:"utf-8"});JSON.parse(e)}catch(e){throw new Error(`File ${n} is not a valid JSON: ${String(e)}`)}const n=await Ce({debug:We,baseUri:i,env:s,apikey:o});for(const t of e){if(t.endsWith("availableSources.json")){const e=JSON.parse(await w(t,{encoding:"utf-8"}));await Ve(e,i,o,n,s)}if(t.endsWith("availableTargets.json")){const e=JSON.parse(await w(t,{encoding:"utf-8"}));await qe(e,i,o,n,s)}if(t.endsWith("availableConnectors.json")){const e=JSON.parse(await w(t,{encoding:"utf-8"}));await Je(e,i,o,n,s)}}l=ce("Verifying user and authorizing"),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const{accessKeyId:r,secretAccessKey:u,sessionToken:f}=await Ue({debug:We,baseUri:i,task:"env-deploy",env:s,apikey:o});!t&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const p=new k.S3({accessKeyId:r,secretAccessKey:u,sessionToken:f});l=ce("Deploying environment files"),!t&&d.info(ce(`Info: ${l}.`,"secondary"));const y="config/",g=new O({head:["File","Status"]});for await(const n of e){const e=a.basename(n);l=ce(`Pushing file: ${ce(e,"info")}`),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const r={Bucket:s,Key:`${y}${e}`,Body:await w(n)},c=await p.putObject(r).promise();!t&&d.succeed(ce(`Finished: ${l}.`,"secondary")),We("s3-put-res",c),g.push([e,"Deployed"]),await Fe({debug:We,baseUri:i,env:s,apiKey:o})}t?pe({status:"success",deployedFiles:e}):le(g.toString())}catch(e){!t&&d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),We(e),e&&e.response&&e.response.data&&We("response",e.response.data),process.exit(1)}}});const Ye=ge("commands:env:download"),He="download";var Ze=Object.freeze({__proto__:null,builder:async e=>(Ye("builder",He),e.option("downloadTo",je.downloadTo.config)),command:He,desc:"Download Environment settings",handler:async e=>{Ye("handler",He,e);const{hg:n,json:t,apikey:o,env:s,downloadTo:r}=e,{clientApiBaseUri:i}=n,c=a.resolve(process.cwd(),r);let l,d=E();try{l=ce("Verifying user and authorizing"),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:r}=await Ue({debug:Ye,baseUri:i,task:"env-download",env:s,apikey:o});!t&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const u=new k.S3({accessKeyId:e,secretAccessKey:n,sessionToken:r});l=ce(`Scanning environment ${ce(s,"info")}`),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const f={Bucket:s,Prefix:"config/"},{Contents:p}=await u.listObjectsV2(f).promise();!t&&d.succeed(ce(`Finished: ${l}.`,"secondary")),Ye("s3-files",p);const y=p?Te(p.map(e=>e.Key),{pattern:"((*/requirements.txt)|(*/availableSources.json)|(*/availableTargets.json)|(*/availableConnectors.json)|(*/customTaps.json))"}):[];if(!y||0===y.length)return void(t?pe({status:"success",downloadedFiles:[]}):d.warn(ce(`Warning: ${ce("Nothing to download!")}`,"secondary")));l=ce(`Downloading to ${ce(c,"info")}`),!t&&d.info(ce(`Info: ${l}.`,"secondary"));const m=new O({head:["File","Status"]});for await(const e of y){const n=a.basename(e),o=a.resolve(c,n);Ye("local-file",o),await g(a.dirname(o),{recursive:!0}),l=ce(`Downloading file: ${ce(n,"info")}`),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const r=u.getObject({Bucket:s,Key:e}).createReadStream();await h(o,await Ae(r)),!t&&d.succeed(ce(`Finished: ${l}.`,"secondary")),m.push([n,"Downloaded"])}t?pe({status:"success",downloadedFiles:y}):le(m.toString())}catch(e){t?pe({status:"error",error:e}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Ye(e),e&&e.response&&e.response.data&&Ye("response",e.response.data)),process.exit(1)}}});const Xe=[Qe,Ze],en=ge("commands:env"),nn="env <action>";var tn=Object.freeze({__proto__:null,builder:async function(e){en("builder",nn);return(await Oe(e)).command(Xe)},command:nn,desc:"Manage environment settings",handler:async function(e){en("handler",nn,e)}});const on=async(e,n,t,o)=>{try{const s=e.getObject({Bucket:n,Key:`${t}/flows/${o}/flow.json`}).createReadStream(),r=await Ae(s);return 2===JSON.parse(r).version}catch(e){return!1}},sn=async(e,n,t,o,s=void 0)=>s??await on(e,n,t,o)?"connectors":"taps",rn=ge("commands:etl:delete"),an="delete";var cn=Object.freeze({__proto__:null,builder:async e=>(rn("builder",an),e.option("flow",je.flow.config).demandOption("flow",je.flow.demandText).option("tap",je.tap.config).demandOption("tap",je.tap.demandText).option("tenant",{...je.tenant.config}).demandOption("tenant",je.tenant.demandText)),command:an,desc:"Delete ETL scripts",handler:async e=>{rn("handler",an,e);const{hg:n,json:t,apikey:o,env:s,flow:r,tap:a,tenant:i}=e,{clientApiBaseUri:c}=n;let l,d=E();try{l=ce(`Deleting ETL scripts for Tenant ${ce(i,"info")} Flow ${ce(r,"info")} and Tap ${ce(a,"info")} to ${ce(s,"info")}`),!t&&d.info(ce(`Info: ${l}.`,"secondary")),l=ce("Verifying user and authorizing"),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:u}=await Ue({debug:rn,baseUri:c,task:"etl-deploy",env:s,tenant:i,flow:r,tap:a,apikey:o}),f=new k.S3({accessKeyId:e,secretAccessKey:n,sessionToken:u});!t&&d.succeed(ce(`Finished: ${l}.`,"secondary")),l=ce("Deleting ETL scripts"),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const p=`${i}/flows/${r}/${await sn(f,s,i,r)}/${a}/etl/`,y=await f.listObjectsV2({Bucket:s,Prefix:p}).promise();if(rn("s3-list-objects-res",y),y.Contents?.length>0){const e=await f.deleteObjects({Bucket:s,Delete:{Objects:y.Contents.map(e=>({Key:e.Key}))}}).promise();rn("s3-list-objects-res",e)}const g=await f.deleteObject({Bucket:s,Key:p}).promise();if(rn("s3-delete-object-res",g),!t&&d.succeed(ce(`Finished: ${l}.`,"secondary")),y.Contents?.length>0){const e=new O({head:["File","Status"]});y.Contents.filter(({Key:e})=>e!==p).forEach(({Key:n})=>{const t=n.split("/"),o=t[t.length-1];e.push([o,ce("Deleted","info")])}),t?pe({status:"success",deletedObjects:(y.Contents??[]).map(({Key:e})=>e)}):le(e.toString())}else l=ce("There was no file or folder to be deleted"),t?pe({status:"success",deletedObjects:[]}):d.info(ce(`Info: ${l}.`,"secondary"))}catch(e){t?pe({status:"error",error:e}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),rn(e),e&&e.response&&e.response.data&&rn("response",e.response.data)),process.exit(1)}}});const ln=ge("commands:etl:deploy"),dn="deploy";var un=Object.freeze({__proto__:null,builder:async e=>(ln("builder",dn),e.option("flow",je.flow.config).demandOption("flow",je.flow.demandText).option("tap",je.tap.config).option("all",je.all.config).option("tenant",{...je.tenant.config,default:"default"}).option("sourceFolder",je.sourceFolder.config).demandOption("sourceFolder",je.sourceFolder.demandText)),command:dn,desc:"Deploy ETL scripts",handler:async e=>{ln("handler",dn,e);const{hg:n,json:t,apikey:o,env:s,flow:r,tap:i,all:c,tenant:l,sourceFolder:d}=e,{clientApiBaseUri:u}=n;if(!c&&!i)throw new Error(`${je.tap.demandText} Or you can pass the --all flag to run this command for all taps/connectors.`);let f,p=E();const y=a.resolve(process.cwd(),d);try{f=ce(`Deploying script for Tenant ${ce(l,"info")} Flow ${ce(r,"info")}${i?` and Tap ${ce(i,"info")}`:""} to ${ce(s,"info")}`),!t&&p.info(ce(`Info: ${f}.`,"secondary"));const e=await Se(y,{recursive:!0,filter:{pattern:"!((**/sync-output)|(**/etl-output)|(**/snapshots))"}});if(0===e.length)return void(t?pe({status:"error",error:"There are no files to deploy at the specified location!"}):p.fail(ce(`Error: ${ce("There are no files to deploy at the specified location!")}.`,"secondary")));f=ce("Verifying user and authorizing"),!t&&p.start(ce(`In progress: ${f}...`,"secondary"));const n={debug:ln,baseUri:u,task:"etl-deploy",env:s,tenant:l,flow:r,apikey:o};i&&(n.tap=i);const{accessKeyId:c,secretAccessKey:g,sessionToken:h}=await Ue(n);!t&&p.succeed(ce(`Finished: ${f}.`,"secondary"));const m=new k.S3({accessKeyId:c,secretAccessKey:g,sessionToken:h}),b=await on(m,s,l,r);f=ce("Validating flow and tap location"),!t&&p.start(ce(`In progress: ${f}...`,"secondary"));const v=(await Ce({debug:ln,baseUri:u,apikey:o,env:s})).find(({id:e})=>e===r);let $=[];try{if("default"===l||v?.type){if($=((b?await Ke({debug:ln,baseUri:u,env:s,flow:r,apikey:o}):await De({debug:ln,baseUri:u,env:s,flow:r,apikey:o}))??[]).filter(e=>!i||e[b?"id":"tap"]===i),i&&0===$.length)throw new Error("Tap is not supported")}else{if($=((b?await Pe({debug:ln,baseUri:u,env:s,flow:r,tenant:l,apikey:o}):await Be({debug:ln,baseUri:u,env:s,flow:r,tenant:l,apikey:o}))??[]).filter(e=>!i||e[b?"id":"tap"]===i),i&&0===$.length)throw new Error("Tap is not linked")}}catch(e){throw ln("err",e),new Error("Target location doesn't exist. Check your tenant, flow and tap arguments.")}!t&&p.succeed(ce(`Finished: ${f}.`,"secondary"));const j=new O({head:["File","Status"]});for(const n of $){const o=n[b?"id":"tap"];f=ce(`Preparing ${o} deployment target`),!t&&p.start(ce(`In progress: ${f}...`,"secondary"));const i=`${l}/flows/${r}/${await sn(null,null,null,null,b)}/${o}/etl/`,{Contents:c}=await m.listObjectsV2({Bucket:s,Prefix:`${i}`}).promise();!t&&p.succeed(ce(`Finished: ${f}.`,"secondary")),ln("contents",c);const u=c.map(e=>({Key:e.Key}));if(u.length>0){f=ce(`Removing old ${o} ETL files`),!t&&p.start(ce(`In progress: ${f}...`,"secondary"));const e={Bucket:s,Delete:{Objects:u,Quiet:!0}};await m.deleteObjects(e).promise(),u.forEach(({Key:e})=>j.push([`${o}/${e.substring(i.length)}`,ce("Deleted","warn")])),!t&&p.succeed(ce(`Finished: ${f}.`,"secondary"))}for await(const n of e){const e="win32"===process.platform?a.relative(d,n).replace(/\\/g,"/"):a.relative(d,n),r=`${i}${e}`;f=ce(`Deploying file: ${ce(`${o}/${e}`,"info")}`),!t&&p.start(ce(`In progress: ${f}...`,"secondary"));const c={Bucket:s,Key:r,Body:await w(n)},l=await m.putObject(c).promise();!t&&p.succeed(ce(`Finished: ${f}.`,"secondary")),ln("s3-put-res",l),j.push([`${o}/${e}`,ce("Deployed","info")])}}t?pe({status:"success",deployedFiles:e}):le(j.toString())}catch(e){t?pe({status:"error",error:e}):(p.fail(ce(`Error: ${f}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),ln(e),e&&e.response&&e.response.data&&ln("response",e.response.data)),process.exit(1)}}});const fn=ge("commands:etl:download"),pn="download";var yn=Object.freeze({__proto__:null,builder:async e=>(fn("builder",pn),e.option("flow",je.flow.config).demandOption("flow",je.flow.demandText).option("tap",je.tap.config).demandOption("tap",je.tap.demandText).option("downloadTo",je.downloadTo.config).demandOption("downloadTo",je.downloadTo.demandText).option("tenant",{...je.tenant.config,default:"default"}).option("overwrite",je.overwrite.config).demandOption("overwrite",je.overwrite.demandText)),command:pn,desc:"Download ETL scripts",handler:async e=>{fn("handler",pn,e);const{hg:n,json:t,apikey:o,env:r,flow:i,tap:c,tenant:l,downloadTo:d,overwrite:u}=e,{clientApiBaseUri:f}=n;let p,y=E();const m=a.resolve(process.cwd(),d);try{p=ce("Verifying user and authorizing"),!t&&y.start(ce(`In progress: ${p}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:d}=await Ue({debug:fn,baseUri:f,task:"etl-download",env:r,tenant:l,flow:i,tap:c,apikey:o}),w=new k.S3({accessKeyId:e,secretAccessKey:n,sessionToken:d});!t&&y.succeed(ce(`Finished: ${p}.`,"secondary")),p=ce("Scanning for downloadable files"),!t&&y.start(ce(`In progress: ${p}...`,"secondary"));const v=`${l}/flows/${i}/${await sn(w,r,l,i)}/${c}/etl/`,$={Bucket:r,Prefix:v},{Contents:j}=await w.listObjectsV2($).promise();!t&&y.succeed(ce(`Finished: ${p}.`,"secondary")),fn("s3-list-res",j);const _=j?Te(j.map(e=>e.Key),{pattern:"!(.ipynb_checkpoints/*)"}):[];if(!_||0===_.length)return void(t?pe({status:"success",downloadedFiles:[]}):y.warn(ce(`Warning: ${ce("Nothing to download!")}`,"secondary")));p=ce(`Downloading script files to ${ce(m,"info")}`),!t&&y.info(ce(`Info: ${p}.`,"secondary"));const E=new O({head:["File","Status"]});for await(const e of _){const n=e.substring(v.length),o=a.resolve(m,n);if(fn("file",o),e.endsWith("/")){!s(o)&&await g(o,{recursive:!0});continue}if(!u)try{await b(o),fn("exists, skipping"),E.push([n,"Skipped"]);continue}catch(e){"ENOENT"!==e.code&&le(e)}p=ce(`Downloading file: ${ce(n,"info")}`),!t&&y.start(ce(`In progress: ${p}...`,"secondary")),await g(a.dirname(o),{recursive:!0});const i=w.getObject({Bucket:r,Key:e}).createReadStream();await h(o,await Ae(i)),!t&&y.succeed(ce(`Finished: ${p}.`,"secondary")),E.push([n,"Downloaded"])}t?pe({status:"success",downloadedFiles:_}):le(E.toString())}catch(e){t?pe({status:"error",error:e}):(y.fail(ce(`Error: ${p}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),fn(e),e&&e.response&&e.response.data&&fn("response",e.response.data)),process.exit(1)}}});const gn=[cn,un,yn],hn=ge("commands:etl"),mn="etl <action>";var wn=Object.freeze({__proto__:null,builder:async function(e){hn("builder",mn);return(await Oe(e)).command(gn)},command:mn,desc:"Manage ETL scripts",handler:async function(e){hn("handler",mn,e)}});const bn=ge("commands:flows:list"),vn="list";var $n=Object.freeze({__proto__:null,builder:async e=>(bn("builder",vn),e.option("tenant",{...je.tenant.config})),command:vn,desc:"List flows",handler:async e=>{bn("handler",vn,e);const{hg:n,json:t,apikey:o,env:s,tenant:r}=e,{clientApiBaseUri:a}=n;let i,c=E();try{i=ce(`Retrieving ${r?`${ce(r,"info")} tenant's`:"the"} flows for environment: ${ce(s,"info")}`);const e=`${a}/${s}/flows/${r?`linked?user_id=${r}`:"supported"}`;bn("requesting:",e),!t&&c.start(ce(`In progress: ${i}...`,"secondary"));const{data:n}=await S.get(e,{headers:{"x-api-key":o}});if(!t&&c.succeed(ce(`Finished: ${i}.`,"secondary")),bn("response-data",n),!n||0===n.length)return void(t?pe([]):c.warn(ce(`Warning: ${ce("No flows for specified environment and tenant")}.`,"secondary")));if(t)pe(n);else{const e=new O({head:["ID","Name","isPush","Taps","Targets"]});n.forEach(n=>e.push([n.id,n.name||"",n.type||!1,n.taps?p(n.taps):"",n.targets?p(n.targets):"none"])),console.log(e.toString())}}catch(e){t?pe({status:"error",error:e}):(c.fail(ce(`Error: ${i}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),bn(e),e&&e.response&&e.response.data&&bn("response",e.response.data)),process.exit(1)}}});const kn=[$n],jn=ge("commands:flows"),_n="flows <action>";var On,En=Object.freeze({__proto__:null,builder:async function(e){jn("builder",_n);return(await Oe(e)).command(kn)},command:_n,desc:"Manage flows",handler:async function(e){jn("handler",_n,e)}}),xn={exports:{}},Sn={exports:{}},Tn={exports:{}},An={exports:{}};var In,Fn={exports:{}},Un={exports:{}};var Nn,Dn,Kn={exports:{}};function Bn(){return Dn||(Dn=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){if((0,o.default)(e))return function(e){var n=-1,t=e.length;return function(){return++n<t?{value:e[n],key:n}:null}}(e);var n=(0,r.default)(e);return n?function(e){var n=-1;return function(){var t=e.next();return t.done?null:(n++,{value:t.value,key:n})}}(n):(t=e,s=t?Object.keys(t):[],a=-1,i=s.length,function e(){var n=s[++a];return"__proto__"===n?e():a<i?{value:t[n],key:n}:null});var t,s,a,i};var t=function(){return In||(In=1,e=Un,n=Un.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return e&&"number"==typeof e.length&&e.length>=0&&e.length%1==0},e.exports=n.default),Un.exports;var e,n}(),o=a(t),s=function(){return Nn||(Nn=1,e=Kn,n=Kn.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return e[Symbol.iterator]&&e[Symbol.iterator]()},e.exports=n.default),Kn.exports;var e,n}(),r=a(s);function a(e){return e&&e.__esModule?e:{default:e}}e.exports=n.default}(Fn,Fn.exports)),Fn.exports}var Pn,Rn={exports:{}};var Mn,Cn={},Ln={exports:{}},zn={exports:{}};var Vn,qn,Jn,Wn={};function Gn(){return qn||(qn=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){if((0,r.isAsync)(e))return function(...n){const t=n.pop();return i(e.apply(this,n),t)};return(0,o.default)(function(n,t){var o;try{o=e.apply(this,n)}catch(e){return t(e)}if(o&&"function"==typeof o.then)return i(o,t);t(null,o)})};var t=function(){return Mn||(Mn=1,e=zn,n=zn.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return function(...n){var t=n.pop();return e.call(this,n,t)}},e.exports=n.default),zn.exports;var e,n}(),o=a(t),s=a(function(){if(Vn)return Wn;Vn=1,Object.defineProperty(Wn,"__esModule",{value:!0}),Wn.fallback=s,Wn.wrap=r;var e,n=Wn.hasQueueMicrotask="function"==typeof queueMicrotask&&queueMicrotask,t=Wn.hasSetImmediate="function"==typeof setImmediate&&setImmediate,o=Wn.hasNextTick="object"==typeof process&&"function"==typeof process.nextTick;function s(e){setTimeout(e,0)}function r(e){return(n,...t)=>e(()=>n(...t))}return e=n?queueMicrotask:t?setImmediate:o?process.nextTick:s,Wn.default=r(e),Wn}()),r=Qn();function a(e){return e&&e.__esModule?e:{default:e}}function i(e,n){return e.then(e=>{c(n,null,e)},e=>{c(n,e&&(e instanceof Error||e.message)?e:new Error(e))})}function c(e,n,t){try{e(n,t)}catch(e){(0,s.default)(e=>{throw e},e)}}e.exports=n.default}(Ln,Ln.exports)),Ln.exports}function Qn(){if(Jn)return Cn;Jn=1,Object.defineProperty(Cn,"__esModule",{value:!0}),Cn.isAsyncIterable=Cn.isAsyncGenerator=Cn.isAsync=void 0;var e,n=Gn(),t=(e=n)&&e.__esModule?e:{default:e};function o(e){return"AsyncFunction"===e[Symbol.toStringTag]}return Cn.default=function(e){if("function"!=typeof e)throw new Error("expected a function");return o(e)?(0,t.default)(e):e},Cn.isAsync=o,Cn.isAsyncGenerator=function(e){return"AsyncGenerator"===e[Symbol.toStringTag]},Cn.isAsyncIterable=function(e){return"function"==typeof e[Symbol.asyncIterator]},Cn}var Yn,Hn,Zn,Xn={exports:{}},et={exports:{}};function nt(){return Yn||(Yn=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0});n.default={},e.exports=n.default}(et,et.exports)),et.exports}function tt(){return Zn||(Zn=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0});var t=function(){return On||(On=1,e=An,n=An.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){function n(...n){if(null!==e){var t=e;e=null,t.apply(this,n)}}return Object.assign(n,e),n},e.exports=n.default),An.exports;var e,n}(),o=u(t),s=u(Bn()),r=function(){return Pn||(Pn=1,e=Rn,n=Rn.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return function(...n){if(null===e)throw new Error("Callback was already called.");var t=e;e=null,t.apply(this,n)}},e.exports=n.default),Rn.exports;var e,n}(),a=u(r),i=Qn(),c=(Hn||(Hn=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e,n,t,s){let r=!1,a=!1,i=!1,c=0,l=0;function d(){c>=n||i||r||(i=!0,e.next().then(({value:e,done:n})=>{if(!a&&!r){if(i=!1,n)return r=!0,void(c<=0&&s(null));c++,t(e,l,u),l++,d()}}).catch(f))}function u(e,n){if(c-=1,!a)return e?f(e):!1===e?(r=!0,void(a=!0)):n===o.default||r&&c<=0?(r=!0,s(null)):void d()}function f(e){a||(i=!1,r=!0,s(e))}d()};var t,o=(t=nt())&&t.__esModule?t:{default:t};e.exports=n.default}(Xn,Xn.exports)),Xn.exports),l=u(c),d=u(nt());function u(e){return e&&e.__esModule?e:{default:e}}n.default=e=>(n,t,r)=>{if(r=(0,o.default)(r),e<=0)throw new RangeError("concurrency limit cannot be less than 1");if(!n)return r(null);if((0,i.isAsyncGenerator)(n))return(0,l.default)(n,e,t,r);if((0,i.isAsyncIterable)(n))return(0,l.default)(n[Symbol.asyncIterator](),e,t,r);var c=(0,s.default)(n),u=!1,f=!1,p=0,y=!1;function g(e,n){if(!f)if(p-=1,e)u=!0,r(e);else if(!1===e)u=!0,f=!0;else{if(n===d.default||u&&p<=0)return u=!0,r(null);y||h()}}function h(){for(y=!0;p<e&&!u;){var n=c();if(null===n)return u=!0,void(p<=0&&r(null));p+=1,t(n.value,n.key,(0,a.default)(g))}y=!1}h()},e.exports=n.default}(Tn,Tn.exports)),Tn.exports}var ot,st={exports:{}};var rt,at,it,ct={exports:{}};function lt(){return rt||(rt=1,e=ct,n=ct.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e,n){if(n||(n=e.length),!n)throw new Error("arity is undefined");return function(...t){return"function"==typeof t[n-1]?e.apply(this,t):new Promise((o,s)=>{t[n-1]=(e,...n)=>{if(e)return s(e);o(n.length>1?n:n[0])},e.apply(this,t)})}},e.exports=n.default),ct.exports;var e,n}function dt(){return at||(at=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0});var t=i(tt()),o=function(){return ot||(ot=1,e=st,n=st.exports,Object.defineProperty(n,"__esModule",{value:!0}),n.default=function(e){return(n,t,o)=>e(n,o)},e.exports=n.default),st.exports;var e,n}(),s=i(o),r=i(Qn()),a=i(lt());function i(e){return e&&e.__esModule?e:{default:e}}n.default=(0,a.default)(function(e,n,o,a){return(0,t.default)(n)(e,(0,s.default)((0,r.default)(o)),a)},4),e.exports=n.default}(Sn,Sn.exports)),Sn.exports}var ut=I((it||(it=1,function(e,n){Object.defineProperty(n,"__esModule",{value:!0});var t=s(dt()),o=s(lt());function s(e){return e&&e.__esModule?e:{default:e}}n.default=(0,o.default)(function(e,n,o){return(0,t.default)(e,1,n,o)},3),e.exports=n.default}(xn,xn.exports)),xn.exports));const ft=ge("commands:jobs:download"),pt="download <jobroot>";var yt=Object.freeze({__proto__:null,builder:async e=>(ft("builder",pt),e.option("downloadTo",je.downloadTo.config)),command:pt,desc:"Download Job files",handler:async e=>{ft("handler",pt,e);const{hg:n,json:t,apikey:o,env:s,jobroot:i,downloadTo:c}=e,{clientApiBaseUri:l}=n;let d,u=E();try{d=ce("Verifying user and authorizing"),!t&&u.start(ce(`In progress: ${d}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:f}=await Ue({debug:ft,baseUri:l,task:"job-download",env:s,apikey:o,jobroot:i}),p=new k.S3({accessKeyId:e,secretAccessKey:n,sessionToken:f});!t&&u.succeed(ce(`Finished: ${d}.`,"secondary")),d=ce("Scanning for downloadable files"),!t&&u.start(ce(`In progress: ${d}...`,"secondary"));const y={Bucket:s,Prefix:i},{Contents:g}=await p.listObjectsV2(y).promise();if(ft("res",g),!g||0===g.length)return void(t?pe({status:"error",error:"Nothing to download!"}):(u.fail(ce(`Error: ${d}.`,"secondary")),de(ce(`Message: ${ce("Nothing to download!")}`,"secondary"))));if(!t&&u.succeed(ce(`Finished: ${d}.`,"secondary")),!t){const e=new O({head:["File","Size","LastModified"]});g.forEach(n=>{const t=n.Key.substring(i.length+1);e.push([t,n.Size,n.LastModified.toLocaleString("en-US")])}),console.log(e.toString())}const h=a.resolve(process.cwd(),c,a.basename(i));await ut(g.filter(({Key:e})=>!new RegExp(`${i}/([^/]+)-config.json`).test(e)),async e=>{d=ce(`Downloading file: ${ce(e.Key,"info")}`),!t&&u.start(ce(`In progress: ${d}...`,"secondary"));const n=a.resolve(h,e.Key.substring(i.length+1));ft("file",n),await T(a.dirname(n),{recursive:!0});const o=p.getObject({Bucket:s,Key:e.Key}).createReadStream(),c=r(n,{flags:"w"});o.pipe(c),!t&&u.succeed(ce(`Finished: ${d}.`,"secondary"))}),t?pe({status:"success",downloadedFiles:g.map(({Key:e})=>e)}):(d=ce("Downloading job files."),u.succeed(ce(`Finished: ${d}`,"secondary")))}catch(e){t?pe({status:"error",error:e}):(u.fail(ce(`Error: ${d}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),ft(e),e&&e.response&&e.response.data&&ft("response",e.response.data)),process.exit(1)}}});const gt=(...e)=>{ge("commands:jobs:list")(...e)},ht="list";var mt=Object.freeze({__proto__:null,builder:async e=>(gt("builder",ht),e.option("flow",je.flow.config).demandOption("flow",je.flow.demandText).option("tenant",{...je.tenant.config,default:"default"}).option("count",je.count.config)),command:ht,desc:"List jobs",handler:async e=>{gt("handler",ht,e);const{hg:n,json:t,apikey:o,env:s,flow:r,tenant:a,count:i}=e,{clientApiBaseUri:c}=n;let l,d=E();try{l=ce(`Retrieving jobs for environment: ${ce(s,"info")} flow: ${ce(r,"info")} tenant: ${ce(a,"info")}...`);const e=`${c}/${s}/${r}/${a}/jobs${i?`?count=${i}`:""}`;gt("requesting:",e),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const{data:n}=await S.get(e,{headers:{"x-api-key":o}});if(!t&&d.succeed(ce(`Finished: ${l}.`,"secondary")),gt("response-data",n),!n||0===n.length)return void(t?pe([]):d.warn(ce(`Warning: ${ce("No jobs for the specified environment, flow and tenant")}.`,"secondary")));if(t)pe(n);else{const e=new O({head:["name","details"]});n.forEach(n=>e.push([n.job_name,JSON.stringify(n,void 0,2)])),console.log(e.toString())}}catch(e){t?pe({status:"error",error:e}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),gt(e),e&&e.response&&e.response.data&>("response",e.response.data)),process.exit(1)}}});const wt=[yt,mt],bt=ge("commands:jobs"),vt="jobs <action>";var $t=Object.freeze({__proto__:null,builder:async function(e){bt("builder",vt);return(await Oe(e)).command(wt)},command:vt,desc:"Manage ETL jobs",handler:async function(e){bt("handler",vt,e)}});const kt=ge("commands:snapshots:deploy"),jt="deploy";var _t=Object.freeze({__proto__:null,builder:async e=>(kt("builder",jt),e.option("tenant",{...je.tenant.config,default:"default"}).option("sourceFolder",je.sourceFolder.config).demandOption("sourceFolder",je.sourceFolder.demandText)),command:jt,desc:"Deploy Snapshots",handler:async e=>{kt("handler",jt,e);const{hg:n,json:t,apikey:o,env:s,tenant:r,sourceFolder:i}=e,{clientApiBaseUri:c}=n;let l,d=E();const u=a.resolve(process.cwd(),i);try{l=ce(`Deploying Snapshots for Tenant ${ce(r,"info")} to ${ce(s,"info")}`),!t&&d.info(ce(`Info: ${l}.`,"secondary"));const e=await Se(u,{recursive:!0});if(0===e.length)return void(t?pe({status:"error",error:"There are no files to deploy at the specified location!"}):d.fail(ce(`Error: ${ce("There are no files to deploy at the specified location!")}.`,"secondary")));l=ce("Verifying user and authorizing");const{accessKeyId:n,secretAccessKey:f,sessionToken:p}=await Ue({debug:kt,baseUri:c,task:"snapshot-deploy",env:s,tenant:r,apikey:o});!t&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const y=new k.S3({accessKeyId:n,secretAccessKey:f,sessionToken:p});l=ce("Validating tenant exists"),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));try{const{CommonPrefixes:e}=await y.listObjectsV2({Bucket:s,Prefix:`${r}/`,Delimiter:"/"}).promise();if(0===e.length)throw new Error("Invalid tenant")}catch(e){throw kt("err",e),new Error("Tenant doesn't exist. Please check your tenant (-u) argument.")}!t&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const g=`${r}/snapshots/`,h=new O({head:["File","Status"]});l=ce("Preparing deployment target"),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const{Contents:m}=await y.listObjectsV2({Bucket:s,Prefix:`${g}`}).promise();!t&&d.stop(),kt("contents",m),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const b=m.map(e=>({Key:e.Key}));if(b.length>0){const e={Bucket:s,Delete:{Objects:b,Quiet:!0}};await y.deleteObjects(e).promise(),b.forEach(({Key:e})=>h.push([e.substring(g.length),ce("Deleted","warn")]))}!t&&d.succeed(ce(`Finished: ${l}.`,"secondary"));for await(const n of e){const e=a.relative(i,n),o=`${g}${e}`;l=ce(`Deploying file: ${ce(e,"info")}`),!t&&d.start(ce(`In progress: ${l}...`,"secondary"));const r={Bucket:s,Key:o,Body:await w(n)},c=await y.putObject(r).promise();!t&&d.succeed(ce(`Finished: ${l}.`,"secondary")),kt("s3-put-res",c),h.push([e,ce("Deployed","info")])}t?pe({status:"success",deployedFiles:e}):le(h.toString())}catch(e){t?pe({status:"error",error:e}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),kt(e),e&&e.response&&e.response.data&&kt("response",e.response.data)),process.exit(1)}}});const Ot=ge("commands:snapshots:download"),Et="download";var xt=Object.freeze({__proto__:null,builder:async e=>(Ot("builder",Et),e.option("downloadTo",je.downloadTo.config).demandOption("downloadTo",je.downloadTo.demandText).option("tenant",{...je.tenant.config,default:"default"}).option("overwrite",je.overwrite.config).demandOption("overwrite",je.overwrite.demandText)),command:Et,desc:"Download Snapshots",handler:async e=>{Ot("handler",Et,e);const{hg:n,json:t,apikey:o,env:r,tenant:i,downloadTo:c,overwrite:l}=e,{clientApiBaseUri:d}=n;let u,f=E();const p=a.resolve(process.cwd(),function(e){function n(e){return process.argv.indexOf(e)>-1}if(n(`--${e}`))return!0;const t=je[e]?.config?.alias||[];for(let e in t)if(n(`-${t[e]}`))return!0;return!1}("downloadTo")?c:"snapshots");try{u=ce("Verifying user and authorizing"),!t&&f.start(ce(`In progress: ${u}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:c}=await Ue({debug:Ot,baseUri:d,task:"snapshot-download",env:r,tenant:i,apikey:o}),y=new k.S3({accessKeyId:e,secretAccessKey:n,sessionToken:c});!t&&f.succeed(ce(`Finished: ${u}.`,"secondary")),u=ce("Validating tenant exists"),!t&&f.start(ce(`In progress: ${u}...`,"secondary"));try{const{CommonPrefixes:e}=await y.listObjectsV2({Bucket:r,Prefix:`${i}/`,Delimiter:"/"}).promise();if(0===e.length)throw new Error("Invalid tenant")}catch(e){throw Ot("err",e),new Error("Tenant doesn't exist. Please check your tenant (-u) argument.")}!t&&f.succeed(ce(`Finished: ${u}.`,"secondary")),u=ce("Scanning for downloadable files"),!t&&f.start(ce(`In progress: ${u}...`,"secondary"));const m=`${i}/snapshots/`,w={Bucket:r,Prefix:m},{Contents:v}=await y.listObjectsV2(w).promise();!t&&f.succeed(ce(`Finished: ${u}.`,"secondary")),Ot("s3-list-res",v);const $=v?v.map(e=>e.Key).filter(e=>e!==m):[];if(!$||0===$.length)return void(t?pe({status:"success",downloadedFiles:[]}):f.warn(ce(`Warning: ${ce("Nothing to download!")}`,"secondary")));u=ce(`Downloading snapshot files to ${ce(p,"info")}`),!t&&f.info(ce(`Info: ${u}.`,"secondary"));const j=new O({head:["File","Status"]});for await(const e of $){const n=e.substring(m.length),o=a.resolve(p,n);if(Ot("file",o),e.endsWith("/")){!s(o)&&await g(o,{recursive:!0});continue}if(!l)try{await b(o),Ot("exists, skipping"),j.push([n,"Skipped"]);continue}catch(e){"ENOENT"!==e.code&&le(e)}u=ce(`Downloading file: ${ce(n,"info")}`),!t&&f.start(ce(`In progress: ${u}...`,"secondary")),await g(a.dirname(o),{recursive:!0});const i=y.getObject({Bucket:r,Key:e}).createReadStream();await h(o,await Ae(i)),!t&&f.succeed(ce(`Finished: ${u}.`,"secondary")),j.push([n,"Downloaded"])}t?pe({status:"success",downloadedFiles:$}):le(j.toString())}catch(e){t?pe({status:"error",error:e}):(f.fail(ce(`Error: ${u}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Ot(e),e&&e.response&&e.response.data&&Ot("response",e.response.data)),process.exit(1)}}});const St=[_t,xt],Tt=ge("commands:snapshots"),At="snapshots <action>";var It=Object.freeze({__proto__:null,builder:async function(e){Tt("builder",At,e);return(await Oe(e)).command(St)},command:At,desc:"Manage tenant snapshots",handler:async function(e){Tt("handler",At,e)}});const Ft=ge("commands:tenants:custom-etl"),Ut="custom-etl",Nt=async({debug:e,baseUri:n,apikey:t,env:o,flow:s,tenant:r,supportedSources:a})=>{const i=await Be({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t});let c=null;for(const{tap:l}of[...i,...a]){const{accessKeyId:a,secretAccessKey:i,sessionToken:d}=await Ue({debug:e,baseUri:n,task:"etl-download",env:o,tenant:r,flow:s,tap:l,apikey:t}),u=new k.S3({accessKeyId:a,secretAccessKey:i,sessionToken:d}),f={Bucket:o,Prefix:`${r}/flows/${s}/taps/${l}/etl/`},{Contents:p}=await u.listObjectsV2(f).promise();if(p.some(({Key:e})=>e.endsWith("etl.py")||e.endsWith("etl.ipynb"))&&(c=r),null!==c)break}return c};var Dt=Object.freeze({__proto__:null,builder:async e=>(Ft("builder",Ut),e.option("tenant",je.tenant.config).option("flow",je.flow.config).demandOption("flow",je.flow.demandText)),command:Ut,desc:"List tenants with custom ETL in a specific flow",handler:async e=>{Ft("handler",Ut,e);const{hg:n,json:t,apikey:o,env:s,flow:r}=e;let a,i=E();try{a=ce(`Retrieving tenants for environment ${ce(s,"info")}`),!t&&i.start(ce(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ne({debug:Ft,baseUri:n.clientApiBaseUri,apikey:o,env:s}),De({debug:Ft,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r})]);!t&&i.succeed(ce(`Finished: ${a}.`,"secondary"));let l=[];a=ce(`Querying for custom ETL scripts for flow ${ce(r,"info")}`),!t&&i.start(ce(`In progress: ${a}...`,"secondary"));for(const t of Ie(e)){const e=await Promise.all(t.map(e=>Nt({debug:Ft,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,supportedSources:c})));l=l.concat(e.filter(Boolean))}if(!t&&i.succeed(ce(`Finished: ${a}.`,"secondary")),t)pe(l);else{const e=new O({head:["Tenant ID"]});e.push(...l.map(e=>[e])),console.log(e.toString())}}catch(e){t?pe({status:"error",error:e}):(i.fail(ce(`Error: ${a}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Ft(e),e&&e.response&&e.response.data&&Ft("response",e.response.data)),process.exit(1)}}});const Kt=ge("commands:tenants:custom-field-map"),Bt="custom-field-map",Pt=async({debug:e,baseUri:n,apikey:t,env:o,flow:s,tenant:r,isV2Flow:a})=>{const i=a?await Pe({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t}):await Be({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t}),c=[],{accessKeyId:l,secretAccessKey:d,sessionToken:u}=await Ue({debug:e,baseUri:n,task:"field-map-download",env:o,tenant:r,flow:s,apikey:t}),f=new k.S3({accessKeyId:l,secretAccessKey:d,sessionToken:u});for(const{id:e,tap:n}of i){const t={Bucket:o,Key:`${r}/flows/${s}/${a?"connectors":"taps"}/${a?e:n}/fieldMap.json`};try{await f.headObject(t).promise(),c.push(a?e:n)}catch(e){}}return{tenant:r,connectors:c}};var Rt=Object.freeze({__proto__:null,builder:async e=>(Kt("builder",Bt),e.option("tenant",je.tenant.config).option("flow",je.flow.config).demandOption("flow",je.flow.demandText)),command:Bt,desc:"List tenants with custom field map in a specific flow",handler:async e=>{Kt("handler",Bt,e);const{hg:n,json:t,apikey:o,env:s,flow:r}=e;let a,i=E();try{a=ce(`Retrieving tenants for environment ${ce(s,"info")}`),!t&&i.start(ce(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ne({debug:Kt,baseUri:n.clientApiBaseUri,apikey:o,env:s}),Le({debug:Kt,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r})]),l=2===c?.version;!t&&i.succeed(ce(`Finished: ${a}.`,"secondary"));const d=[];a=ce(`Querying for custom field maps for flow ${ce(r,"info")}`),!t&&i.start(ce(`In progress: ${a}...`,"secondary"));for(const t of Ie(e)){const e=await Promise.all(t.map(e=>Pt({debug:Kt,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,isV2Flow:l})));d.push(...e.filter(({connectors:e})=>e.length>0))}if(!t&&i.succeed(ce(`Finished: ${a}.`,"secondary")),t)pe(d);else{const e=new O({head:["Tenant ID","Connector IDs"]});e.push(...d.map(({tenant:e,connectors:n})=>[e,n.join(", ")])),console.log(e.toString())}}catch(e){t?pe({status:"error",error:e}):(i.fail(ce(`Error: ${a}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Kt(e),e&&e.response&&e.response.data&&Kt("response",e.response.data)),process.exit(1)}}});const Mt=ge("commands:tenants:delete"),Ct="delete";var Lt=Object.freeze({__proto__:null,builder:async e=>(Mt("builder",Ct),e.option("tenant",je.tenant.config)),command:Ct,desc:"Delete tenant",handler:async e=>{Mt("handler",Ct,e);const{hg:n,json:t,apikey:o,env:s,tenant:r}=e,{clientApiBaseUri:a}=n;let i,c=E();try{if("default"===r)throw new Error('It\'s not possible to delete "default" tenant!');i=ce(`Deleting tenant ${r} schedules`),!t&&c.start(ce(`In progress: ${i}...`,"secondary")),await(async({debug:e,baseUri:n,env:t,apikey:o,tenant:s})=>{const r={"x-api-key":o},a=new URL(`${n}/tenant/${t}/${s}?schedules_only=true`).toString();e&&e("uri:",a);const{data:i}=await S.delete(a,{headers:r});return i})({debug:Mt,baseUri:a,env:s,apikey:o,tenant:r}),!t&&c.succeed(ce(`Finished: ${i}.`,"secondary")),i=ce("Verifying user and authorizing"),!t&&c.start(ce(`In progress: ${i}...`,"secondary"));const{accessKeyId:e,secretAccessKey:n,sessionToken:l}=await Ue({debug:Mt,baseUri:a,task:"tenant-delete",env:s,tenant:r,apikey:o});!t&&c.succeed(ce(`Finished: ${i}.`,"secondary"));const d=new k.S3({accessKeyId:e,secretAccessKey:n,sessionToken:l});for(i=ce(`Deleting tenant ${r} for environment ${ce(s,"info")}`),!t&&c.start(ce(`In progress: ${i}...`,"secondary"));;){const e=((await d.listObjectsV2({Bucket:s,Prefix:`${r}/`}).promise()).Contents||[]).map(({Key:e})=>({Key:e}));if(0===e.length)break;await d.deleteObjects({Bucket:s,Delete:{Objects:e}}).promise()}if(!t&&c.succeed(ce(`Finished: ${i}.`,"secondary")),t)pe({statu:"success",tenantDeleted:r});else{const e=new O({head:["Tenant ID"]});e.push([r]),console.log(e.toString())}}catch(e){t?pe({status:"error",error:e}):(c.fail(ce(`Error: ${i}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Mt(e),e&&e.response&&e.response.data&&Mt("response",e.response.data)),process.exit(1)}}});const zt=ge("commands:tenants:list"),Vt="list";var qt=Object.freeze({__proto__:null,builder:async e=>(zt("builder",Vt),e.option("tenant",je.tenant.config)),command:Vt,desc:"List tenants",handler:async e=>{zt("handler",Vt,e);const{hg:n,json:t,apikey:o,env:s,tenant:r}=e;let a,i=E();try{a=ce(`Retrieving tenants for environment ${ce(s,"info")}`);const e=`${n.clientApiBaseUri}/tenants/${s}${r?`?tenant=${r}`:""}`;zt("requesting:",e),!t&&i.start(ce(`In progress: ${a}...`,"secondary"));const{data:c}=await S.get(e,{headers:{"x-api-key":o}});if(!t&&i.succeed(ce(`Finished: ${a}.`,"secondary")),zt("response-data",c),!c||0===c.length)return void(t?pe([]):i.info(ce(`Info: ${ce("No tenants found in the specified environment")}.`,"secondary")));if(t)pe(c);else{const e=new O({head:["tenant ID"]});e.push(...c.map(e=>[e])),console.log(e.toString())}}catch(e){t?pe({status:"error",error:e}):(i.fail(ce(`Error: ${a}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),zt(e),e&&e.response&&e.response.data&&zt("response",e.response.data)),process.exit(1)}}});const Jt=ge("commands:tenants:custom-catalog"),Wt="custom-catalog",Gt=async({debug:e,baseUri:n,apikey:t,env:o,flow:s,tenant:r,isV2Flow:a})=>{try{const i=a?await Pe({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t}):await Be({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t}),c=[],{accessKeyId:l,secretAccessKey:d,sessionToken:u}=await Ue({debug:e,baseUri:n,task:"field-map-download",env:o,tenant:r,flow:s,apikey:t}),f=new k.S3({accessKeyId:l,secretAccessKey:d,sessionToken:u});for(const{id:e,tap:n}of i){const t={Bucket:o,Key:`${r}/flows/${s}/${a?"connectors":"taps"}/${a?e:n}/catalog.json`};try{await f.headObject(t).promise(),c.push(a?e:n)}catch(e){}}return{tenant:r,connectors:c}}catch(e){return console.error(e),{tenant:r,connectors:[]}}};var Qt=Object.freeze({__proto__:null,builder:async e=>(Jt("builder",Wt),e.option("tenant",je.tenant.config).option("flow",je.flow.config).demandOption("flow",je.flow.demandText)),command:Wt,desc:"List tenants with custom catalog in a specific flow",handler:async e=>{Jt("handler",Wt,e);const{hg:n,json:t,apikey:o,env:s,flow:r}=e;let a,i=E();try{a=ce(`Retrieving tenants for environment ${ce(s,"info")}`),!t&&i.start(ce(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ne({debug:Jt,baseUri:n.clientApiBaseUri,apikey:o,env:s}),Le({debug:Jt,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r})]),l=2===c?.version;!t&&i.succeed(ce(`Finished: ${a}.`,"secondary"));const d=[];a=ce(`Querying for custom catalogs for flow ${ce(r,"info")}`),!t&&i.start(ce(`In progress: ${a}...`,"secondary"));for(const t of Ie(e)){const e=await Promise.all(t.map(e=>Gt({debug:Jt,baseUri:n.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,isV2Flow:l})));d.push(...e.filter(({connectors:e})=>e.length>0))}if(!t&&i.succeed(ce(`Finished: ${a}.`,"secondary")),t)pe(d);else{const e=new O({head:["Tenant ID","Connector IDs"]});e.push(...d.map(({tenant:e,connectors:n})=>[e,n.join(", ")])),console.log(e.toString())}}catch(e){t?pe({status:"error",error:e}):(i.fail(ce(`Error: ${a}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Jt(e),e&&e.response&&e.response.data&&Jt("response",e.response.data)),process.exit(1)}}});const Yt=ge("commands:tenants:update-config"),Ht="update-config",Zt=async({debug:e,baseUri:n,apikey:t,env:o,flow:s,tenant:r,connectorId:a,config:i,isV2Flow:c})=>{const l=c?"id":"tap";if(!(c?await Pe({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t,config:!0}):await Be({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t,config:!0})).find(e=>e[l]===a))return null;const d=c?Me:Re;try{await d({debug:e,baseUri:n,env:o,flow:s,tenant:r,apikey:t,connectorId:a,config:i})}catch(e){console.log(ce(`Error patching: ${r}. ${e}`,"secondary"))}return r};var Xt=Object.freeze({__proto__:null,builder:async e=>(Yt("builder",Ht),e.option("flow",je.flow.config).demandOption("flow",je.flow.demandText).option("connector",je.connector.config).demandOption("connector",je.connector.demandText).option("configFilePath",je.configFilePath.config).demandOption("configFilePath",je.configFilePath.demandText)),command:Ht,desc:"Update the config of a specific connector and flow for all tenants",handler:async e=>{Yt("handler",Ht,e);const{hg:t,json:o,apikey:r,env:a,flow:i,connector:c,configFilePath:l}=e;let d,u=E();try{if(!l)throw new Error("Config file path not provided");if(!l.endsWith(".json"))throw new Error("Config file must have .json extension");if(!s(l))throw new Error("Config file not found");const e=JSON.parse(n(l,{encoding:"utf-8"}));d=ce(`Retrieving tenants for environment ${ce(a,"info")}`),!o&&u.start(ce(`In progress: ${d}...`,"secondary"));const[f,p]=await Promise.all([Ne({debug:Yt,baseUri:t.clientApiBaseUri,apikey:r,env:a}),Le({debug:Yt,baseUri:t.clientApiBaseUri,apikey:r,env:a,flow:i})]),y=2===p?.version;!o&&u.succeed(ce(`Finished: ${d}.`,"secondary"));const g=[];d=ce(`Updating config for connector ${ce(c,"info")} and flow ${ce(i,"info")}`),!o&&u.start(ce(`In progress: ${d}...`,"secondary"));for(const n of Ie(f)){const o=await Promise.all(n.map(n=>Zt({debug:Yt,baseUri:t.clientApiBaseUri,apikey:r,env:a,flow:i,tenant:n,connectorId:c,config:e,isV2Flow:y})));g.push(...o.filter(Boolean))}if(!o&&u.succeed(ce(`Finished: ${d}.`,"secondary")),o)pe(g);else{const e=new O({head:["Tenant ID"]});g.forEach(n=>e.push([n])),console.log(e.toString())}}catch(e){o?pe({status:"error",error:e}):(u.fail(ce(`Error: ${d}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Yt(e),e&&e.response&&e.response.data&&Yt("response",e.response.data)),process.exit(1)}}});const eo=[Dt,Rt,Lt,qt,Qt,Xt],no=ge("commands:tenants"),to="tenants <action>";var oo=Object.freeze({__proto__:null,builder:async function(e){no("builder",to);return(await Oe(e)).command(eo)},command:to,desc:"Manage tenants",handler:async function(e){no("handler",to,e)}});const so=ge("commands:singer:validate"),ro="validate",ao=(e,n,t,o)=>{let s=o.type;Array.isArray(s)||(s=[s]);const r=s.filter(e=>"null"!==e)[0];if(!s.includes("null")||null!==t){if("string"===r&&"string"!=typeof t)throw new Error(`Record for ${e} has invalid type ${typeof t} for field ${n}. Expected type string.`);if("number"===r&&"number"!=typeof t)throw new Error(`Record for ${e} has invalid type ${typeof t} for field ${n}. Expected type number.`);if("boolean"===r&&"boolean"!=typeof t)throw new Error(`Record for ${e} has invalid type ${typeof t} for field ${n}. Expected type boolean.`);if("array"===r&&!Array.isArray(t))throw new Error(`Record for ${e} has invalid type ${typeof t} for field ${n}. Expected type array.`);if("object"===r&&"object"!=typeof t)throw new Error(`Record for ${e} has invalid type ${typeof t} for field ${n}. Expected type object.`)}},io=(e,n,t)=>{const o=n.stream;if(!o)throw new Error("Schema record is missing stream name");if(!n.schema)throw new Error(`Schema record for ${o} is missing schema field`);if(e[o]){for(const t of n.key_properties)if(!e[o].keyProperties.includes(t))throw new Error(`Schema for ${o} has different key properties: ${e[o].keyProperties.join(", ")} and ${n.key_properties.join(", ")}`);const t=e[o].schema;((e,n,t)=>{for(const[o,s]of Object.entries(n.properties))if(t.properties[o]){const n=t.properties[o].type,r=s.type;if(n.length!=r.length||n.some(e=>!r.includes(e)))throw new Error(`Schema for ${e} has different typing for field ${o}: ${n} and ${r}`)}})(o,n.schema,t)}else e[o]={schema:n.schema,keyProperties:n.key_properties||[],keySet:new Set,count:0};return((e,n,t)=>{for(const[o,s]of Object.entries(n.properties)){let n=s.type;Array.isArray(n)||(n=[n]);const r=n.filter(e=>"null"!==e);if(r.length>1&&!t)throw new Error(`Schema for ${e} has multiple non-null types for field ${o}: ${r.join(", ")}`)}})(o,n.schema,t),e},co=(e,n,t)=>{const o=n.stream,s=n.record;if(!s)throw new Error("Record is missing record field");if("object"!=typeof s)throw new Error(`Record has invalid type ${typeof s} for record field. Expected type object.`);if(!o)throw new Error("Record record is missing stream name");if(!e[o])throw new Error(`Record was written for stream ${o} before schema row was written.`);const r=e[o].keyProperties;for(const n of r){if(!s[n])throw new Error(`Record for ${o} is missing key property ${n}`);e[o].keySet.add(s[n])}if(r.length>0&&!t){const n=A.createHash("sha256").update(r.map(e=>`${e}:${s[e]}`).join("")).digest("hex");if(e[o].keySet.has(n))throw new Error(`Duplicate record for ${o} with primary keys: ${r.map(e=>`${e}: ${s[e]}`).join(", ")}`);e[o].keySet.add(n)}((e,n,t)=>{for(const[o,s]of Object.entries(n)){const n=t.properties[o];if(!n)throw new Error(`Record for ${e} has unknown field ${o}`);ao(e,o,s,n)}})(o,s,e[o].schema),e[o].count++},lo=(e,n)=>{if(!n.value)throw new Error("State record is missing value");if("object"!=typeof n.value)throw new Error(`State record has invalid type ${typeof n.value} for value. Expected type object.`)},uo=async(n,t)=>{const o={},{allowDuplicateRecords:s,allowFuzzyTypes:r}=t;for await(const a of async function*(n){const t=e.createReadStream(n,{encoding:"utf8"});let o="";for await(const e of t){const n=(o+e).split("\n");o=n.pop();for(const e of n)e.trim()&&(yield JSON.parse(e))}o.trim()&&(yield JSON.parse(o))}(n))try{if(!a.type)throw new Error(`Singer row is missing type: ${JSON.stringify(a)}`);"SCHEMA"==a.type?io(o,a,r):"RECORD"==a.type?co(o,a,s):"STATE"==a.type&&lo(0,a)}catch(e){throw t.json?e.message=`${e.message}. Error occured on line: ${JSON.stringify(a)}.`:console.log(`Error occured on line: ${JSON.stringify(a)} \n `),e}return o};var fo=Object.freeze({__proto__:null,builder:async e=>(so("builder",ro),e.option("dataFilePath",{...je.dataFilePath.config}).option("allowDuplicateRecords",{type:"boolean",default:!1,description:"Allow duplicate records"}).option("allowFuzzyTypes",{type:"boolean",default:!1,description:"Allow fields to have multiple non-null types"})),command:ro,desc:"Validate Singer data",handler:async n=>{so("handler",ro,n);const{allowDuplicateRecords:t,allowFuzzyTypes:o,dataFilePath:s,json:r}=n,a={allowDuplicateRecords:t,allowFuzzyTypes:o,json:r};if(!s)throw new Error("Data file path is required");if(!e.existsSync(s))throw new Error(`Data file path ${s} does not exist`);try{const e=await uo(s,a);r?console.log(JSON.stringify({streams:Object.keys(e).map(n=>({stream:n,count:e[n].count}))},null,2)):console.log(`\n \nššš Singer validation passed ššš\n--------------------------------------\n\n${Object.keys(e).length} streams validated\n\nRecord count by stream:\n${Object.keys(e).map(n=>`\n ${n}: ${e[n].count}`).join("")}\n\n `)}catch(e){r?console.log(JSON.stringify({error:e.message},null,2)):console.log(`\n\nšØšØšØ Singer validation failed šØšØšØ\n--------------------------------------\n\n${e.message}\n\n `),process.exit(1)}}});const po=[fo],yo=ge("commands:singer"),go="singer <action>";var ho=Object.freeze({__proto__:null,builder:async function(e){yo("builder",go);return(await e).command(po)},command:go,desc:"Develop and test singer taps and targets",handler:async function(e){yo("handler",go,e)}});const mo=[ke,tn,wn,En,$t,It,oo,ho];process.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE="1";ae({});const wo=u(process.argv.slice(2));wo.usage(ce("Usage: $0 <command>")).command(mo).demandCommand().alias("v","version").alias("h","help").string("_").strictCommands().epilogue(ce("For more information, visit https://docs.hotglue.xyz/docs/cli-overview")).wrap(Math.min(wo.terminalWidth(),90)).parse(process.argv.slice(C()+1),Z);
|
|
34
35
|
//# sourceMappingURL=index.js.map
|