@hotglue/cli 1.0.36 → 1.0.38

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/lib/mjs/index.js CHANGED
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import e,{readFileSync as t,writeFile as n,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 g}from"url";import{mkdir as y,writeFile as h,readdir as m,readFile as b,stat as w}from"fs/promises";import{cosmiconfig as $}from"cosmiconfig";import v from"chalk";import j from"aws-sdk";import k from"debug";import _ from"yaml";import E from"cli-table";import O from"ora";import x from"micromatch";import S from"axios";import"progress";import{mkdir as I}from"node:fs/promises";import T from"crypto";function A(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var F,U,N,D,R,P,C,B={};function K(){if(F)return B;F=1;const t=e,n=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,t){const n=Boolean(t&&t.debug),o={};return e.toString().split(c).forEach(function(e,t){const a=e.match(r);if(null!=a){const e=a[1];let t=a[2]||"";const n=t.length-1,s='"'===t[0]&&'"'===t[n];"'"===t[0]&&"'"===t[n]||s?(t=t.substring(1,n),s&&(t=t.replace(i,"\n"))):t=t.trim(),o[e]=t}else if(n){const n=e.trim();n.length&&"#"!==n[0]&&s(`Failed to match key and value when parsing line ${t+1}: ${e}`)}}),o}return B.config=function(e){let r=n.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]?n.join(o.homedir(),l.slice(1)):l),null!=e.encoding&&(a=e.encoding));try{const e=d(t.readFileSync(r,{encoding:a}),{debug:i});return Object.keys(e).forEach(function(t){Object.prototype.hasOwnProperty.call(process.env,t)?(!0===c&&(process.env[t]=e[t]),i&&s(!0===c?`"${t}" is already defined in \`process.env\` and WAS overwritten`:`"${t}" is already defined in \`process.env\` and was NOT overwritten`)):process.env[t]=e[t]}),{parsed:e}}catch(e){return i&&s(`Failed to load ${r} ${e.message}`),{error:e}}},B.parse=d,B}function M(){return process.versions.electron&&!process.defaultApp?0:1}
2
+ import e,{readFileSync as t,writeFile as n,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 g}from"url";import{mkdir as y,writeFile as h,readdir as m,readFile as b,stat as w,rename as $,unlink as v}from"fs/promises";import{cosmiconfig as j}from"cosmiconfig";import k from"chalk";import _ from"aws-sdk";import E from"debug";import x from"yaml";import O from"cli-table";import S from"ora";import I from"micromatch";import T from"axios";import"progress";import{mkdir as F}from"node:fs/promises";import A from"crypto";function N(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var U,D,R,C,P,B,M,K={};function L(){if(U)return K;U=1;const t=e,n=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,t){const n=Boolean(t&&t.debug),o={};return e.toString().split(c).forEach(function(e,t){const a=e.match(r);if(null!=a){const e=a[1];let t=a[2]||"";const n=t.length-1,s='"'===t[0]&&'"'===t[n];"'"===t[0]&&"'"===t[n]||s?(t=t.substring(1,n),s&&(t=t.replace(i,"\n"))):t=t.trim(),o[e]=t}else if(n){const n=e.trim();n.length&&"#"!==n[0]&&s(`Failed to match key and value when parsing line ${t+1}: ${e}`)}}),o}return K.config=function(e){let r=n.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]?n.join(o.homedir(),l.slice(1)):l),null!=e.encoding&&(a=e.encoding));try{const e=d(t.readFileSync(r,{encoding:a}),{debug:i});return Object.keys(e).forEach(function(t){Object.prototype.hasOwnProperty.call(process.env,t)?(!0===c&&(process.env[t]=e[t]),i&&s(!0===c?`"${t}" is already defined in \`process.env\` and WAS overwritten`:`"${t}" is already defined in \`process.env\` and was NOT overwritten`)):process.env[t]=e[t]}),{parsed:e}}catch(e){return i&&s(`Failed to load ${r} ${e.message}`),{error:e}}},K.parse=d,K}function z(){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 L(e){if(e!==e.toLowerCase()&&e!==e.toUpperCase()||(e=e.toLowerCase()),-1===e.indexOf("-")&&-1===e.indexOf("_"))return e;{let t="",n=!1;const o=e.match(/^-+/);for(let s=o?o[0].length:0;s<e.length;s++){let o=e.charAt(s);n&&(n=!1,o=o.toUpperCase()),0===s||"-"!==o&&"_"!==o?"-"!==o&&"_"!==o&&(t+=o):n=!0}return t}}
8
+ function J(e){if(e!==e.toLowerCase()&&e!==e.toUpperCase()||(e=e.toLowerCase()),-1===e.indexOf("-")&&-1===e.indexOf("_"))return e;{let t="",n=!1;const o=e.match(/^-+/);for(let s=o?o[0].length:0;s<e.length;s++){let o=e.charAt(s);n&&(n=!1,o=o.toUpperCase()),0===s||"-"!==o&&"_"!==o?"-"!==o&&"_"!==o&&(t+=o):n=!0}return t}}
9
9
  /**
10
10
  * @license
11
11
  * Copyright (c) 2016, Contributors
12
12
  * SPDX-License-Identifier: ISC
13
13
  */
14
- let z;P||(P=1,K().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(R)return D;R=1;const e=/^dotenv_config_(encoding|path|debug|override)=(.+)$/;return D=function(t){return t.reduce(function(t,n){const o=n.match(e);return o&&(t[o[1]]=o[2]),t},{})}}()(process.argv)))),function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARRAY="array"}(C||(C={}));function J(e){return void 0!==e?e+1:1}function q(e){return"__proto__"===e?"___proto___":e}
14
+ let q;B||(B=1,L().config(Object.assign({},function(){if(R)return D;R=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),D=e}(),function(){if(P)return C;P=1;const e=/^dotenv_config_(encoding|path|debug|override)=(.+)$/;return C=function(t){return t.reduce(function(t,n){const o=n.match(e);return o&&(t[o[1]]=o[2]),t},{})}}()(process.argv)))),function(e){e.BOOLEAN="boolean",e.STRING="string",e.NUMBER="number",e.ARRAY="array"}(M||(M={}));function V(e){return void 0!==e?e+1:1}function W(e){return"__proto__"===e?"___proto___":e}
15
15
  /**
16
16
  * @fileoverview Main entrypoint for libraries using yargs-parser in Node.js
17
17
  * CJS and ESM environments.
@@ -20,7 +20,7 @@ let z;P||(P=1,K().config(Object.assign({},function(){if(N)return U;N=1;const e={
20
20
  * Copyright (c) 2016, Contributors
21
21
  * SPDX-License-Identifier: ISC
22
22
  */
23
- const V=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])<V)throw Error(`yargs parser supports a minimum Node.js version of ${V}. 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,t){const n=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},t),o=
23
+ const Y=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])<Y)throw Error(`yargs parser supports a minimum Node.js version of ${Y}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`)}const G=process?process.env:{};new class{constructor(e){q=e}parse(e,t){const n=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},t),o=
24
24
  /**
25
25
  * @license
26
26
  * Copyright (c) 2016, Contributors
@@ -31,5 +31,5 @@ function(e){if(Array.isArray(e))return e.map(e=>"string"!=typeof e?e+"":e);e=e.t
31
31
  * @license
32
32
  * Copyright (c) 2016, Contributors
33
33
  * SPDX-License-Identifier: ISC
34
- */(e),s="string"==typeof e,r=function(e){const t=[],n=Object.create(null);let o=!0;Object.keys(e).forEach(function(n){t.push([].concat(e[n],n))});for(;o;){o=!1;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++){if(t[e].filter(function(e){return-1!==t[n].indexOf(e)}).length){t[e]=t[e].concat(t[n]),t.splice(n,1),o=!0;break}}}return t.forEach(function(e){const t=(e=e.filter(function(e,t,n){return n.indexOf(e)===t})).pop();void 0!==t&&"string"==typeof t&&(n[t]=e)}),n}(Object.assign(Object.create(null),n.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},n.configuration),i=Object.assign(Object.create(null),n.default),c=n.configObjects||[],l=n.envPrefix,d=a["populate--"],u=d?"--":"_",f=Object.create(null),p=Object.create(null),g=n.__||z.format,y={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(n.array||[]).filter(Boolean).forEach(function(e){const t="object"==typeof e?e.key:e,n=Object.keys(e).map(function(e){return{boolean:"bools",string:"strings",number:"numbers"}[e]}).filter(Boolean).pop();n&&(y[n][t]=!0),y.arrays[t]=!0,y.keys.push(t)}),[].concat(n.boolean||[]).filter(Boolean).forEach(function(e){y.bools[e]=!0,y.keys.push(e)}),[].concat(n.string||[]).filter(Boolean).forEach(function(e){y.strings[e]=!0,y.keys.push(e)}),[].concat(n.number||[]).filter(Boolean).forEach(function(e){y.numbers[e]=!0,y.keys.push(e)}),[].concat(n.count||[]).filter(Boolean).forEach(function(e){y.counts[e]=!0,y.keys.push(e)}),[].concat(n.normalize||[]).filter(Boolean).forEach(function(e){y.normalize[e]=!0,y.keys.push(e)}),"object"==typeof n.narg&&Object.entries(n.narg).forEach(([e,t])=>{"number"==typeof t&&(y.nargs[e]=t,y.keys.push(e))}),"object"==typeof n.coerce&&Object.entries(n.coerce).forEach(([e,t])=>{"function"==typeof t&&(y.coercions[e]=t,y.keys.push(e))}),void 0!==n.config&&(Array.isArray(n.config)||"string"==typeof n.config?[].concat(n.config).filter(Boolean).forEach(function(e){y.configs[e]=!0}):"object"==typeof n.config&&Object.entries(n.config).forEach(([e,t])=>{"boolean"!=typeof t&&"function"!=typeof t||(y.configs[e]=t)})),function(...e){e.forEach(function(e){Object.keys(e||{}).forEach(function(e){y.aliases[e]||(y.aliases[e]=[].concat(r[e]||[]),y.aliases[e].concat(e).forEach(function(t){if(/-/.test(t)&&a["camel-case-expansion"]){const n=L(t);n!==e&&-1===y.aliases[e].indexOf(n)&&(y.aliases[e].push(n),f[n]=!0)}}),y.aliases[e].concat(e).forEach(function(t){if(t.length>1&&/[A-Z]/.test(t)&&a["camel-case-expansion"]){const n=function(e,t){const n=e.toLowerCase();t=t||"-";let o="";for(let s=0;s<e.length;s++){const r=n.charAt(s),a=e.charAt(s);o+=r!==a&&s>0?`${t}${n.charAt(s)}`:a}return o}(t,"-");n!==e&&-1===y.aliases[e].indexOf(n)&&(y.aliases[e].push(n),f[n]=!0)}}),y.aliases[e].forEach(function(t){y.aliases[t]=[e].concat(y.aliases[e].filter(function(e){return t!==e}))}))})})}(n.key,r,n.default,y.arrays),Object.keys(i).forEach(function(e){(y.aliases[e]||[]).forEach(function(t){i[t]=i[e]})});let b=null;Object.keys(y.counts).find(e=>N(e,y.arrays)?(b=Error(g("Invalid configuration: %s, opts.count excludes opts.array.",e)),!0):!!N(e,y.nargs)&&(b=Error(g("Invalid configuration: %s, opts.count excludes opts.narg.",e)),!0));let w=[];const $=Object.assign(Object.create(null),{_:[]}),v={};for(let e=0;e<o.length;e++){const t=o[e],n=t.replace(/^-{3,}/,"---");let s,r,i,c,l,d;if("--"!==t&&R(t))j(t);else{if(n.match(/---+(=|$)/)){j(t);continue}if(t.match(/^--.+=/)||!a["short-option-groups"]&&t.match(/^-.+=/))c=t.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(N(c[1],y.arrays)?e=_(e,c[1],o,c[2]):!1!==N(c[1],y.nargs)?e=k(e,c[1],o,c[2]):E(c[1],c[2],!0));else if(t.match(m)&&a["boolean-negation"])c=t.match(m),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],E(r,!!N(r,y.arrays)&&[!1]));else if(t.match(/^--.+/)||!a["short-option-groups"]&&t.match(/^-[^-]+/))c=t.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],N(r,y.arrays)?e=_(e,r,o):!1!==N(r,y.nargs)?e=k(e,r,o):(l=o[e+1],void 0===l||l.match(/^-/)&&!l.match(h)||N(r,y.bools)||N(r,y.counts)?/^(true|false)$/.test(l)?(E(r,l),e++):E(r,P(r)):(E(r,l),e++)));else if(t.match(/^-.\..+=/))c=t.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&E(c[1],c[2]);else if(t.match(/^-.\..+/)&&!t.match(h))l=o[e+1],c=t.match(/^-(.\..+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],void 0===l||l.match(/^-/)||N(r,y.bools)||N(r,y.counts)?E(r,P(r)):(E(r,l),e++));else if(t.match(/^-[^-]+/)&&!t.match(h)){i=t.slice(1,-1).split(""),s=!1;for(let n=0;n<i.length;n++){if(l=t.slice(n+2),i[n+1]&&"="===i[n+1]){d=t.slice(n+3),r=i[n],N(r,y.arrays)?e=_(e,r,o,d):!1!==N(r,y.nargs)?e=k(e,r,o,d):E(r,d),s=!0;break}if("-"!==l){if(/[A-Za-z]/.test(i[n])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(l)&&!1===N(l,y.bools)){E(i[n],l),s=!0;break}if(i[n+1]&&i[n+1].match(/\W/)){E(i[n],l),s=!0;break}E(i[n],P(i[n]))}else E(i[n],l)}r=t.slice(-1)[0],s||"-"===r||(N(r,y.arrays)?e=_(e,r,o):!1!==N(r,y.nargs)?e=k(e,r,o):(l=o[e+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(h)||N(r,y.bools)||N(r,y.counts)?/^(true|false)$/.test(l)?(E(r,l),e++):E(r,P(r)):(E(r,l),e++)))}else if(t.match(/^-[0-9]$/)&&t.match(h)&&N(t.slice(1),y.bools))r=t.slice(1),E(r,P(r));else{if("--"===t){w=o.slice(e+1);break}if(a["halt-at-non-option"]){w=o.slice(e);break}j(t)}}}function j(e){const t=S("_",e);"string"!=typeof t&&"number"!=typeof t||$._.push(t)}function k(e,t,n,o){let s,r=N(t,y.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return B(o)||(b=Error(g("Argument unexpected for: %s",t))),E(t,P(t)),e;let i=B(o)?0:1;if(a["nargs-eats-options"])n.length-(e+1)+i<r&&(b=Error(g("Not enough arguments following: %s",t))),i=r;else{for(s=e+1;s<n.length&&(!n[s].match(/^-[^0-9]/)||n[s].match(h)||R(n[s]));s++)i++;i<r&&(b=Error(g("Not enough arguments following: %s",t)))}let c=Math.min(i,r);for(!B(o)&&c>0&&(E(t,o),c--),s=e+1;s<c+e+1;s++)E(t,n[s]);return e+c}function _(e,t,n,o){let r=[],c=o||n[e+1];const l=N(t,y.nargs);if(N(t,y.bools)&&!/^(true|false)$/.test(c))r.push(!0);else if(B(c)||B(o)&&/^-/.test(c)&&!h.test(c)&&!R(c)){if(void 0!==i[t]){const e=i[t];r=Array.isArray(e)?e:[e]}}else{B(o)||r.push(x(t,o,!0));for(let o=e+1;o<n.length&&!(!a["greedy-arrays"]&&r.length>0||l&&"number"==typeof l&&r.length>=l)&&(c=n[o],!/^-/.test(c)||h.test(c)||R(c));o++)e=o,r.push(x(t,c,s))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(b=Error(g("Not enough arguments following: %s",t))),E(t,r),e}function E(e,t,n=s){if(/-/.test(e)&&a["camel-case-expansion"]){const t=e.split(".").map(function(e){return L(e)}).join(".");O(e,t)}const o=x(e,t,n),r=e.split(".");if(U($,r,o),y.aliases[e]&&y.aliases[e].forEach(function(e){const t=e.split(".");U($,t,o)}),r.length>1&&a["dot-notation"]&&(y.aliases[r[0]]||[]).forEach(function(t){let n=t.split(".");const s=[].concat(r);s.shift(),n=n.concat(s),(y.aliases[e]||[]).includes(n.join("."))||U($,n,o)}),N(e,y.normalize)&&!N(e,y.arrays)){[e].concat(y.aliases[e]||[]).forEach(function(e){Object.defineProperty(v,e,{enumerable:!0,get:()=>t,set(e){t="string"==typeof e?z.normalize(e):e}})})}}function O(e,t){y.aliases[e]&&y.aliases[e].length||(y.aliases[e]=[t],f[t]=!0),y.aliases[t]&&y.aliases[t].length||O(t,e)}function x(e,t,n){n&&(t=function(e){return"string"!=typeof e||"'"!==e[0]&&'"'!==e[0]||e[e.length-1]!==e[0]?e:e.substring(1,e.length-1)}(t)),(N(e,y.bools)||N(e,y.counts))&&"string"==typeof t&&(t="true"===t);let o=Array.isArray(t)?t.map(function(t){return S(e,t)}):S(e,t);return N(e,y.counts)&&(B(o)||"boolean"==typeof o)&&(o=J()),N(e,y.normalize)&&N(e,y.arrays)&&(o=Array.isArray(t)?t.map(e=>z.normalize(e)):z.normalize(t)),o}function S(e,t){if(!a["parse-positional-numbers"]&&"_"===e)return t;if(!N(e,y.strings)&&!N(e,y.bools)&&!Array.isArray(t)){(null!=(n=t)&&("number"==typeof n||!!/^0x[0-9a-f]+$/i.test(n)||!/^0[^.]/.test(n)&&/^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(n))&&a["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${t}`)))||!B(t)&&N(e,y.numbers))&&(t=Number(t))}var n;return t}function I(e,t){Object.keys(e).forEach(function(n){const o=e[n],s=t?t+"."+n:n;"object"==typeof o&&null!==o&&!Array.isArray(o)&&a["dot-notation"]?I(o,s):(!F($,s.split("."))||N(s,y.arrays)&&a["combine-arrays"])&&E(s,o)})}function T(e,t){if(void 0===l)return;const n="string"==typeof l?l:"",o=z.env();Object.keys(o).forEach(function(s){if(""===n||0===s.lastIndexOf(n,0)){const r=s.split("__").map(function(e,t){return 0===t&&(e=e.substring(n.length)),L(e)});(t&&y.configs[r.join(".")]||!t)&&!F(e,r)&&E(r.join("."),o[s])}})}function A(e,t,n,o=!1){Object.keys(n).forEach(function(s){F(e,s.split("."))||(U(e,s.split("."),n[s]),o&&(p[s]=!0),(t[s]||[]).forEach(function(t){F(e,t.split("."))||U(e,t.split("."),n[s])}))})}function F(e,t){let n=e;a["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach(function(e){n=n[e]||{}});const o=t[t.length-1];return"object"==typeof n&&o in n}function U(e,t,n){let o=e;a["dot-notation"]||(t=[t.join(".")]),t.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(t[t.length-1]),r=N(t.join("."),y.arrays),i=Array.isArray(n);let c=a["duplicate-arguments-array"];!c&&N(s,y.nargs)&&(c=!0,(!B(o[s])&&1===y.nargs[s]||Array.isArray(o[s])&&o[s].length===y.nargs[s])&&(o[s]=void 0)),n===J()?o[s]=J(o[s]):Array.isArray(o[s])?c&&r&&i?o[s]=a["flatten-duplicate-arrays"]?o[s].concat(n):(Array.isArray(o[s][0])?o[s]:[o[s]]).concat([n]):c||Boolean(r)!==Boolean(i)?o[s]=o[s].concat([n]):o[s]=n:void 0===o[s]&&r?o[s]=i?n:[n]:!c||void 0===o[s]||N(s,y.counts)||N(s,y.bools)?o[s]=n:o[s]=[o[s],n]}function N(e,t){const n=[].concat(y.aliases[e]||[],e),o=Object.keys(t),s=n.find(e=>o.includes(e));return!!s&&t[s]}function D(e){const t=Object.keys(y);return[].concat(t.map(e=>y[e])).some(function(t){return Array.isArray(t)?t.includes(e):t[e]})}function R(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 t,n=!0;const o=e.slice(1).split("");for(let s=0;s<o.length;s++){if(t=e.slice(s+2),!D(o[s])){n=!1;break}if(o[s+1]&&"="===o[s+1]||"-"===t||/[A-Za-z]/.test(o[s])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(t)||o[s+1]&&o[s+1].match(/\W/))break}return n}(e))return!1;return!function(e,...t){return[].concat(...t).some(function(t){const n=e.match(t);return n&&D(n[1])})}(e,/^-+([^=]+?)=[\s\S]*$/,m,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(e)}function P(e){return N(e,y.bools)||N(e,y.counts)||!(`${e}`in i)?(t=function(e){let t=C.BOOLEAN;return N(e,y.strings)?t=C.STRING:N(e,y.numbers)?t=C.NUMBER:N(e,y.bools)?t=C.BOOLEAN:N(e,y.arrays)&&(t=C.ARRAY),t}(e),{[C.BOOLEAN]:!0,[C.STRING]:"",[C.NUMBER]:void 0,[C.ARRAY]:[]}[t]):i[e];var t}function B(e){return void 0===e}return T($,!0),T($,!1),function(e){const t=Object.create(null);A(t,y.aliases,i),Object.keys(y.configs).forEach(function(n){const o=e[n]||t[n];if(o)try{let e=null;const t=z.resolve(z.cwd(),o),s=y.configs[n];if("function"==typeof s){try{e=s(t)}catch(t){e=t}if(e instanceof Error)return void(b=e)}else e=z.require(t);I(e)}catch(t){"PermissionDenied"===t.name?b=t:e[n]&&(b=Error(g("Invalid JSON config file: %s",o)))}})}($),void 0!==c&&c.forEach(function(e){I(e)}),A($,y.aliases,i,!0),function(e){let t;const n=new Set;Object.keys(e).forEach(function(o){if(!n.has(o)&&(t=N(o,y.coercions),"function"==typeof t))try{const s=S(o,t(e[o]));[].concat(y.aliases[o]||[],o).forEach(t=>{n.add(t),e[t]=s})}catch(e){b=e}})}($),a["set-placeholder-key"]&&function(e){y.keys.forEach(t=>{~t.indexOf(".")||void 0===e[t]&&(e[t]=void 0)})}($),Object.keys(y.counts).forEach(function(e){F($,e.split("."))||E(e,0)}),d&&w.length&&($[u]=[]),w.forEach(function(e){$[u].push(e)}),a["camel-case-expansion"]&&a["strip-dashed"]&&Object.keys($).filter(e=>"--"!==e&&e.includes("-")).forEach(e=>{delete $[e]}),a["strip-aliased"]&&[].concat(...Object.keys(r).map(e=>r[e])).forEach(e=>{a["camel-case-expansion"]&&e.includes("-")&&delete $[e.split(".").map(e=>L(e)).join(".")],delete $[e]}),{aliases:Object.assign({},y.aliases),argv:Object.assign(v,$),configuration:a,defaulted:Object.assign({},p),error:b,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(t(e,"utf8"));throw Error("only .json config files are supported in ESM")}});var Y={fs:{readFileSync:t,writeFile:n},format:f,resolve:i,exists:e=>{try{return o(e).isFile()}catch(e){return!1}}};let G;class Q{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 t=e.shift();let n=function(){};return"function"==typeof e[e.length-1]&&(n=e.pop()),n=n||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]=t,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n})):n(),G.format.apply(G.format,[this.cache[this.locale][t]||t].concat(e))}__n(){const e=Array.prototype.slice.call(arguments),t=e.shift(),n=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?t:n;if(this.cache[this.locale][t]){r=this.cache[this.locale][t][1===o?"one":"other"]}!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]={one:t,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:s})):s();const a=[r];return~r.indexOf("%d")&&a.push(o),G.format.apply(G.format,a.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){this.cache[this.locale]||this._readLocaleFile();for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(this.cache[this.locale][t]=e[t])}_taggedLiteral(e,...t){let n="";return e.forEach(function(e,o){const s=t[o+1];n+=e,void 0!==s&&(n+="%s")}),this.__.apply(this,[n].concat([].slice.call(t,1)))}_enqueueWrite(e){this.writeQueue.push(e),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const e=this,t=this.writeQueue[0],n=t.directory,o=t.locale,s=t.cb,r=this._resolveLocaleFile(n,o),a=JSON.stringify(this.cache[o],null,2);G.fs.writeFile(r,a,"utf-8",function(t){e.writeQueue.shift(),e.writeQueue.length>0&&e._processWriteQueue(),s(t)})}_readLocaleFile(){let e={};const t=this._resolveLocaleFile(this.directory,this.locale);try{G.fs.readFileSync&&(e=JSON.parse(G.fs.readFileSync(t,"utf-8")))}catch(n){if(n instanceof SyntaxError&&(n.message="syntax error in "+t),"ENOENT"!==n.code)throw n;e={}}this.cache[this.locale]=e}_resolveLocaleFile(e,t){let n=G.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){const o=G.resolve(e,"./",t.split("_")[0]+".json");this._fileExistsSync(o)&&(n=o)}return n}_fileExistsSync(e){return G.exists(e)}}let H;try{H=g(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,t){G=t;const n=new Q(e);n.__.bind(n),n.__n.bind(n),n.setLocale.bind(n),n.getLocale.bind(n),n.updateLocale.bind(n),n.locale}({directory:i(H,"../../../locales"),updateFiles:!1},Y);const Z={hg:{appName:"hotglue",clientApiBaseUri:process.env.HOTGLUE_CLIENT_API_BASE_URI||"https://api.hotglue.com",defaultConfigFileName:"config.yaml"}},X={},ee=()=>a.resolve(d(),`.${Z.hg.appName}`,Z.hg.defaultConfigFileName),te=async()=>{const{appName:e}=Z.hg;try{return await $(e).load(ee())||{}}catch(e){return{}}},ne=async()=>{const{appName:e}=Z.hg,t=$(e,{searchPlaces:[`${e}.yaml`,`.${e}.yaml`,`.${e}rc.yaml`,`.${e}rc.yml`,`.${e}rc`,`.${e}rc.json`,`.${e}rc.js`]});try{return await t.search()||{}}catch(e){throw console.log(e),new Error(`Malformed configuration file: ${e.message}`)}},oe={primary:e=>v.whiteBright(e),secondary:e=>v.white(e),info:e=>v.green(e),warn:e=>v.yellow(e),error:e=>v.redBright(e),success:e=>v.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,t=re)=>{if(!e)return"";if("string"==typeof e)return se[t]?se[t](e):se[re](e);const n=p(e,{colors:!0});return se[t]?se[t](n):n};function le(...e){return console.log(...e),fe}function de(e,t){return ie(ce(e,t)),ie("\n"),fe}function ue(e,t){return ie(ce(e,t)),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))},ge=k("hotglue-cli");function ye(e){return ge.extend(e)}const he=ye("commands:config:set"),me="set <setting> <value>";var be=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:t,setting:n,value:o}=e;if(["apikey"].includes(n))try{const e=await te();e&&e.config?!t&&ue("Updating profile config file..."):!t&&ue("Creating profile config file...");const s=e&&e.config?{...e.config,[n]:o}:{[n]:o},r=_.stringify(s),i=e&&e.filepath?e.filepath:ee();await(async(e,t)=>{await y(a.dirname(e),{recursive:!0}),await h(e,t)})(i,r),t?pe({status:"success"}):ue("Done").pr()}catch(e){t?pe({status:"error",error:e}):console.log(e)}else t?pe({status:"error",error:"Invalid settings parameter"}):console.error("Invalid settings parameter")}});const we=[be],$e=ye("commands:config"),ve="config [action]";var je=Object.freeze({__proto__:null,builder:async function(e){return $e("builder",ve),e.command(we)},command:ve,desc:"Configure your hotglue CLI",handler:async function(e){$e("handler",ve,e);const{action:t}=e;if(!t)try{const e=await te();e.config&&0!==Object.keys(e.config).length||de("No profile configuration found. Run config set to configure the hotglue CLI.");const t=new E({head:["Setting","Value","Config File","Type"]});e.config&&Object.entries(e.config).forEach(([n,o])=>t.push([n,o,e.filepath,"Profile"]));const n=await ne();n.config&&Object.entries(n.config).forEach(([e,o])=>t.push([e,o,a.relative(process.cwd(),n.filepath),"Project"])),t.length>0&&console.log(t.toString())}catch(e){throw console.log(e),e}}}),ke={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=ye("base"),Ee=async e=>{_e("builder");const t=await(async()=>{const e=await te(),t=await ne();return{...X,...e.config,...t.config}})();return e.option("apikey",ke.apikey.config).option("env",ke.env.config).option("json",ke.json.config).config(t).demandOption(["env"],ke.env.demandText).demandOption(["apikey"],ke.apikey.demandText).strictCommands()},Oe=ye("utils.js"),xe=async(e,t,n=[])=>{const{includeSymLinks:o,recursive:s,filter:r}=t,{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()?n.push(a.resolve(c,e.name)):e.isDirectory()&&s&&await xe(a.resolve(c,e.name),t,n):Oe("skip",r))}return n},Se=async(e,t)=>{const n={includeSymLinks:!1,recursive:!1,filter:{},...t},{pattern:o}=n.filter;return o&&(n.filter.matcher=x.matcher(o,{dot:!0})),xe(e,n)},Ie=(e,t)=>{Oe("filter-in",e);const{pattern:n}={...t};let o=e;return n&&(o=x(o,n)),Oe("filter-out",o),o};const Te=e=>{const t=[];return new Promise((n,o)=>{e.on("error",o),e.on("data",e=>t.push(Buffer.from(e))),e.on("end",()=>n(Buffer.concat(t).toString("utf8")))})},Ae=(e,t=10)=>{const n=[];for(let o=0;o<e.length;o+=t){const s=e.slice(o,o+t);n.push(s)}return n},Fe=async({debug:e,baseUri:t,env:n,apiKey:o})=>{const s=new URL(`${t}/${n}/resetAvailableEntities`),{data:r}=await S.delete(s,{headers:{"x-api-key":o,"Content-type":"application/json"}});e({data:r})},Ue=async({debug:e,baseUri:t,task:n,env:o,apikey:s,...r})=>{const a=new URL(`${t}/credentials/${n}/${o}`);r&&Object.entries(r).forEach(([e,t])=>{a.searchParams.set(e,t)});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:t,env:n,apikey:o})=>{const s=`${t}/tenants/${n}`;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:t,env:n,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${t}/${n}/${o}/supportedSources`).toString();e&&e("uri:",a);const{data:i}=await S.get(a,{headers:r});return i},Re=async({debug:e,baseUri:t,env:n,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${t}/v2/${n}/${o}/supportedConnectors`).toString();e&&e("uri:",a);const{data:i}=await S.get(a,{headers:r});return i},Pe=async({debug:e,baseUri:t,env:n,flow:o,tenant:s,apikey:r,config:a})=>{const i=new URL(`${t}/${n}/${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},Ce=async({debug:e,baseUri:t,env:n,flow:o,tenant:s,apikey:r,config:a})=>{const i=new URL(`${t}/v2/${n}/${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},Be=async({debug:e,baseUri:t,env:n,flow:o,tenant:s,apikey:r,connectorId:a,config:i})=>{const c={"x-api-key":r},l=new URL(`${t}/${n}/${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},Ke=async({debug:e,baseUri:t,env:n,flow:o,tenant:s,apikey:r,connectorId:a,config:i})=>{const c={"x-api-key":r},l=new URL(`${t}/v2/${n}/${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},Me=async({debug:e,baseUri:t,env:n,apikey:o})=>{const s={"x-api-key":o},r=new URL(`${t}/${n}/flows/supported`).toString();e&&e("uri:",r);const{data:a}=await S.get(r,{headers:s});return a},Le=async({debug:e,baseUri:t,env:n,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${t}/${n}/flows/${o}/supported`).toString();e&&e("uri:",a);const{data:i}=await S.get(a,{headers:r});return i},ze=async({debug:e,baseUri:t,env:n,apikey:o,from:s,to:r,count:a=1e4,...i})=>{const c={"x-api-key":o},l="string"==typeof a?parseInt(a,10):a;let d=[],u=0,f=1,p=!0;for(;p;){const o=new URL(`${t}/${n}/jobs`);o.searchParams.set("from",s),r&&o.searchParams.set("to",r),o.searchParams.set("count",l.toString()),o.searchParams.set("page",f.toString()),i&&Object.entries(i).forEach(([e,t])=>{null!=t&&"count"!==e&&"page"!==e&&o.searchParams.set(e,t)}),o.searchParams.set("include_export_details","false"),o.searchParams.set("skip_cache","true");const a=o.toString();e&&e(`Fetching page ${f}, uri:`,a);const{data:g}=await S.get(a,{headers:c});e&&e(`Page ${f} response:`,{jobsCount:g.jobs?.length||0,total:g.total||0});const y=g.jobs||[];d=d.concat(y),1===f&&(u=g.total||0),y.length<l?p=!1:f++}return e&&e(`Fetched ${d.length} jobs across ${f} page(s)`),{jobs:d,total:u}},Je=async({debug:e,baseUri:t,env:n,apikey:o,tenant:s,flow:r,...a})=>{const i={"x-api-key":o},c=new URL(`${t}/${n}/${r}/${s}/jobs/retrigger`).toString(),l=a;e&&e("uri:",c),e&&e("payload:",l);const{data:d}=await S.post(c,l,{headers:i});return d},qe=async({debug:e,baseUri:t,env:n,flow:o,user_id:s,apikey:r,schedule_expression:a,state:i,job_type:c,connector_id:l,extra_args:d})=>{const u={"x-api-key":r},f=new URL(`${t}/${n}/${o}/${s}/jobs/schedule`).toString(),p={schedule_expression:a,state:i};c&&(p.job_type=c),l&&(p.connector_id=l),d&&Object.assign(p,d),e&&e("uri:",f),e&&e("body:",p);const{data:g}=await S.put(f,p,{headers:u});return g},Ve=async({debug:e,baseUri:t,env:n,flow:o,user_id:s,apikey:r,job_root:a,include_export_details:i=!1})=>{const c=new URL(`${t}/${n}/${o}/${s}/jobs/status`);c.searchParams.set("job_root",a),c.searchParams.set("include_export_details",i?"true":"false");const l={"x-api-key":r},d=c.toString();e&&e("uri:",d);const{data:u}=await S.get(d,{headers:l});return u},We=k("commands:env:validators"),Ye=async(e,t,n,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:We,baseUri:t,env:s,flow:e.id,apikey:n})))).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,t)=>a.indexOf(e)!==t);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`)},Ge=async(e,t,n,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:t,env:n,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${t}/${n}/${o}/supportedTargets`).toString();e&&e("uri:",a);const{data:i}=await S.get(a,{headers:r});return i})({debug:We,baseUri:t,env:s,flow:e.id,apikey:n});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,t)=>a.indexOf(e)!==t);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`)},Qe=async(e,t,n,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 Re({debug:We,baseUri:t,env:s,flow:e.id,apikey:n})))).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,t)=>a.indexOf(e)!==t);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`)},He=ye("commands:env:deploy"),Ze="deploy";var Xe=Object.freeze({__proto__:null,builder:async e=>(He("builder",Ze),e.option("sourceFolder",ke.sourceFolder.config).demandOption("sourceFolder",ke.sourceFolder.demandText)),command:Ze,desc:"Deploy Environment settings",handler:async e=>{He("handler",Ze,e);const{hg:t,json:n,apikey:o,env:s,sourceFolder:r}=e,{clientApiBaseUri:i}=t,c=a.resolve(process.cwd(),r);let l,d=O();try{l=ce(`Scanning ${ce(c,"info")} for deployable files`),!n&&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(n?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"))));!n&&d.succeed(ce(`Finished: ${l}.`,"secondary"));for(const t of e)if(t.endsWith(".json"))try{const e=await b(t,{encoding:"utf-8"});JSON.parse(e)}catch(e){throw new Error(`File ${t} is not a valid JSON: ${String(e)}`)}const t=await Me({debug:He,baseUri:i,env:s,apikey:o});for(const n of e){if(n.endsWith("availableSources.json")){const e=JSON.parse(await b(n,{encoding:"utf-8"}));await Ye(e,i,o,t,s)}if(n.endsWith("availableTargets.json")){const e=JSON.parse(await b(n,{encoding:"utf-8"}));await Ge(e,i,o,t,s)}if(n.endsWith("availableConnectors.json")){const e=JSON.parse(await b(n,{encoding:"utf-8"}));await Qe(e,i,o,t,s)}}l=ce("Verifying user and authorizing"),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const{accessKeyId:r,secretAccessKey:u,sessionToken:f}=await Ue({debug:He,baseUri:i,task:"env-deploy",env:s,apikey:o});!n&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const p=new j.S3({accessKeyId:r,secretAccessKey:u,sessionToken:f});l=ce("Deploying environment files"),!n&&d.info(ce(`Info: ${l}.`,"secondary"));const g="config/",y=new E({head:["File","Status"]});for await(const t of e){const e=a.basename(t);l=ce(`Pushing file: ${ce(e,"info")}`),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const r={Bucket:s,Key:`${g}${e}`,Body:await b(t)},c=await p.putObject(r).promise();!n&&d.succeed(ce(`Finished: ${l}.`,"secondary")),He("s3-put-res",c),y.push([e,"Deployed"]),await Fe({debug:He,baseUri:i,env:s,apiKey:o})}n?pe({status:"success",deployedFiles:e}):le(y.toString())}catch(e){!n&&d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),He(e),e&&e.response&&e.response.data&&He("response",e.response.data),process.exit(1)}}});const et=ye("commands:env:download"),tt="download";var nt=Object.freeze({__proto__:null,builder:async e=>(et("builder",tt),e.option("downloadTo",ke.downloadTo.config)),command:tt,desc:"Download Environment settings",handler:async e=>{et("handler",tt,e);const{hg:t,json:n,apikey:o,env:s,downloadTo:r}=e,{clientApiBaseUri:i}=t,c=a.resolve(process.cwd(),r);let l,d=O();try{l=ce("Verifying user and authorizing"),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:r}=await Ue({debug:et,baseUri:i,task:"env-download",env:s,apikey:o});!n&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const u=new j.S3({accessKeyId:e,secretAccessKey:t,sessionToken:r});l=ce(`Scanning environment ${ce(s,"info")}`),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const f={Bucket:s,Prefix:"config/"},{Contents:p}=await u.listObjectsV2(f).promise();!n&&d.succeed(ce(`Finished: ${l}.`,"secondary")),et("s3-files",p);const g=p?Ie(p.map(e=>e.Key),{pattern:"((*/requirements.txt)|(*/availableSources.json)|(*/availableTargets.json)|(*/availableConnectors.json)|(*/customTaps.json))"}):[];if(!g||0===g.length)return void(n?pe({status:"success",downloadedFiles:[]}):d.warn(ce(`Warning: ${ce("Nothing to download!")}`,"secondary")));l=ce(`Downloading to ${ce(c,"info")}`),!n&&d.info(ce(`Info: ${l}.`,"secondary"));const m=new E({head:["File","Status"]});for await(const e of g){const t=a.basename(e),o=a.resolve(c,t);et("local-file",o),await y(a.dirname(o),{recursive:!0}),l=ce(`Downloading file: ${ce(t,"info")}`),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const r=u.getObject({Bucket:s,Key:e}).createReadStream();await h(o,await Te(r)),!n&&d.succeed(ce(`Finished: ${l}.`,"secondary")),m.push([t,"Downloaded"])}n?pe({status:"success",downloadedFiles:g}):le(m.toString())}catch(e){n?pe({status:"error",error:e}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),et(e),e&&e.response&&e.response.data&&et("response",e.response.data)),process.exit(1)}}});const ot=[Xe,nt],st=ye("commands:env"),rt="env <action>";var at=Object.freeze({__proto__:null,builder:async function(e){st("builder",rt);return(await Ee(e)).command(ot)},command:rt,desc:"Manage environment settings",handler:async function(e){st("handler",rt,e)}});const it=async(e,t,n,o)=>{try{const s=e.getObject({Bucket:t,Key:`${n}/flows/${o}/flow.json`}).createReadStream(),r=await Te(s);return 2===JSON.parse(r).version}catch(e){return!1}},ct=async(e,t,n,o,s=void 0)=>s??await it(e,t,n,o)?"connectors":"taps",lt=ye("commands:etl:delete"),dt="delete";var ut=Object.freeze({__proto__:null,builder:async e=>(lt("builder",dt),e.option("flow",ke.flow.config).demandOption("flow",ke.flow.demandText).option("tap",ke.tap.config).demandOption("tap",ke.tap.demandText).option("tenant",{...ke.tenant.config}).demandOption("tenant",ke.tenant.demandText)),command:dt,desc:"Delete ETL scripts",handler:async e=>{lt("handler",dt,e);const{hg:t,json:n,apikey:o,env:s,flow:r,tap:a,tenant:i}=e,{clientApiBaseUri:c}=t;let l,d=O();try{l=ce(`Deleting ETL scripts for Tenant ${ce(i,"info")} Flow ${ce(r,"info")} and Tap ${ce(a,"info")} to ${ce(s,"info")}`),!n&&d.info(ce(`Info: ${l}.`,"secondary")),l=ce("Verifying user and authorizing"),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:u}=await Ue({debug:lt,baseUri:c,task:"etl-deploy",env:s,tenant:i,flow:r,tap:a,apikey:o}),f=new j.S3({accessKeyId:e,secretAccessKey:t,sessionToken:u});!n&&d.succeed(ce(`Finished: ${l}.`,"secondary")),l=ce("Deleting ETL scripts"),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const p=`${i}/flows/${r}/${await ct(f,s,i,r)}/${a}/etl/`,g=await f.listObjectsV2({Bucket:s,Prefix:p}).promise();if(lt("s3-list-objects-res",g),g.Contents?.length>0){const e=await f.deleteObjects({Bucket:s,Delete:{Objects:g.Contents.map(e=>({Key:e.Key}))}}).promise();lt("s3-list-objects-res",e)}const y=await f.deleteObject({Bucket:s,Key:p}).promise();if(lt("s3-delete-object-res",y),!n&&d.succeed(ce(`Finished: ${l}.`,"secondary")),g.Contents?.length>0){const e=new E({head:["File","Status"]});g.Contents.filter(({Key:e})=>e!==p).forEach(({Key:t})=>{const n=t.split("/"),o=n[n.length-1];e.push([o,ce("Deleted","info")])}),n?pe({status:"success",deletedObjects:(g.Contents??[]).map(({Key:e})=>e)}):le(e.toString())}else l=ce("There was no file or folder to be deleted"),n?pe({status:"success",deletedObjects:[]}):d.info(ce(`Info: ${l}.`,"secondary"))}catch(e){n?pe({status:"error",error:e}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),lt(e),e&&e.response&&e.response.data&&lt("response",e.response.data)),process.exit(1)}}});const ft=ye("commands:etl:deploy"),pt="deploy";var gt=Object.freeze({__proto__:null,builder:async e=>(ft("builder",pt),e.option("flow",ke.flow.config).demandOption("flow",ke.flow.demandText).option("tap",ke.tap.config).option("all",ke.all.config).option("tenant",{...ke.tenant.config,default:"default"}).option("sourceFolder",ke.sourceFolder.config).demandOption("sourceFolder",ke.sourceFolder.demandText)),command:pt,desc:"Deploy ETL scripts",handler:async e=>{ft("handler",pt,e);const{hg:t,json:n,apikey:o,env:s,flow:r,tap:i,all:c,tenant:l,sourceFolder:d}=e,{clientApiBaseUri:u}=t;if(!c&&!i)throw new Error(`${ke.tap.demandText} Or you can pass the --all flag to run this command for all taps/connectors.`);let f,p=O();const g=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")}`),!n&&p.info(ce(`Info: ${f}.`,"secondary"));const e=await Se(g,{recursive:!0,filter:{pattern:"!((**/sync-output)|(**/etl-output)|(**/snapshots))"}});if(0===e.length)return void(n?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")));(e=>{const t=["config.json","source-config.json","target-config.json","catalog.json","target-catalog.json","state.json"],n=["sync-output","snapshots","etl-output",".venv"];for(const o of e){if(t.includes(o))throw new Error(`File ${o} is a reserved file name and cannot be used in the ETL script.`);const e=n.find(e=>o.startsWith(`${e}/`));if(e)throw new Error(`Directory ${e} is a reserved directory name and cannot be used in the ETL script.`)}})(e.map(e=>a.relative(d,e))),f=ce("Verifying user and authorizing"),!n&&p.start(ce(`In progress: ${f}...`,"secondary"));const t={debug:ft,baseUri:u,task:"etl-deploy",env:s,tenant:l,flow:r,apikey:o};i&&(t.tap=i);const{accessKeyId:c,secretAccessKey:y,sessionToken:h}=await Ue(t);!n&&p.succeed(ce(`Finished: ${f}.`,"secondary"));const m=new j.S3({accessKeyId:c,secretAccessKey:y,sessionToken:h}),w=await it(m,s,l,r);f=ce("Validating flow and tap location"),!n&&p.start(ce(`In progress: ${f}...`,"secondary"));const $=(await Me({debug:ft,baseUri:u,apikey:o,env:s})).find(({id:e})=>e===r);let v=[];try{if("default"===l||$?.type){if(v=((w?await Re({debug:ft,baseUri:u,env:s,flow:r,apikey:o}):await De({debug:ft,baseUri:u,env:s,flow:r,apikey:o}))??[]).filter(e=>!i||e[w?"id":"tap"]===i),i&&0===v.length)throw new Error("Tap is not supported")}else{if(v=((w?await Ce({debug:ft,baseUri:u,env:s,flow:r,tenant:l,apikey:o}):await Pe({debug:ft,baseUri:u,env:s,flow:r,tenant:l,apikey:o}))??[]).filter(e=>!i||e[w?"id":"tap"]===i),i&&0===v.length)throw new Error("Tap is not linked")}}catch(e){throw ft("err",e),new Error("Target location doesn't exist. Check your tenant, flow and tap arguments.")}!n&&p.succeed(ce(`Finished: ${f}.`,"secondary"));const k=new E({head:["File","Status"]});for(const t of v){const o=t[w?"id":"tap"];f=ce(`Preparing ${o} deployment target`),!n&&p.start(ce(`In progress: ${f}...`,"secondary"));const i=`${l}/flows/${r}/${await ct(null,null,null,null,w)}/${o}/etl/`,{Contents:c}=await m.listObjectsV2({Bucket:s,Prefix:`${i}`}).promise();!n&&p.succeed(ce(`Finished: ${f}.`,"secondary")),ft("contents",c);const u=c.map(e=>({Key:e.Key}));if(u.length>0){f=ce(`Removing old ${o} ETL files`),!n&&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})=>k.push([`${o}/${e.substring(i.length)}`,ce("Deleted","warn")])),!n&&p.succeed(ce(`Finished: ${f}.`,"secondary"))}for await(const t of e){const e="win32"===process.platform?a.relative(d,t).replace(/\\/g,"/"):a.relative(d,t),r=`${i}${e}`;f=ce(`Deploying file: ${ce(`${o}/${e}`,"info")}`),!n&&p.start(ce(`In progress: ${f}...`,"secondary"));const c={Bucket:s,Key:r,Body:await b(t)},l=await m.putObject(c).promise();!n&&p.succeed(ce(`Finished: ${f}.`,"secondary")),ft("s3-put-res",l),k.push([`${o}/${e}`,ce("Deployed","info")])}}n?pe({status:"success",deployedFiles:e}):le(k.toString())}catch(e){n?pe({status:"error",error:e}):(p.fail(ce(`Error: ${f}.`,"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 yt=ye("commands:etl:download"),ht="download";var mt=Object.freeze({__proto__:null,builder:async e=>(yt("builder",ht),e.option("flow",ke.flow.config).demandOption("flow",ke.flow.demandText).option("tap",ke.tap.config).demandOption("tap",ke.tap.demandText).option("downloadTo",ke.downloadTo.config).demandOption("downloadTo",ke.downloadTo.demandText).option("tenant",{...ke.tenant.config,default:"default"}).option("overwrite",ke.overwrite.config).demandOption("overwrite",ke.overwrite.demandText)),command:ht,desc:"Download ETL scripts",handler:async e=>{yt("handler",ht,e);const{hg:t,json:n,apikey:o,env:r,flow:i,tap:c,tenant:l,downloadTo:d,overwrite:u}=e,{clientApiBaseUri:f}=t;let p,g=O();const m=a.resolve(process.cwd(),d);try{p=ce("Verifying user and authorizing"),!n&&g.start(ce(`In progress: ${p}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:d}=await Ue({debug:yt,baseUri:f,task:"etl-download",env:r,tenant:l,flow:i,tap:c,apikey:o}),b=new j.S3({accessKeyId:e,secretAccessKey:t,sessionToken:d});!n&&g.succeed(ce(`Finished: ${p}.`,"secondary")),p=ce("Scanning for downloadable files"),!n&&g.start(ce(`In progress: ${p}...`,"secondary"));const $=`${l}/flows/${i}/${await ct(b,r,l,i)}/${c}/etl/`,v={Bucket:r,Prefix:$},{Contents:k}=await b.listObjectsV2(v).promise();!n&&g.succeed(ce(`Finished: ${p}.`,"secondary")),yt("s3-list-res",k);const _=k?Ie(k.map(e=>e.Key),{pattern:"!(.ipynb_checkpoints/*)"}):[];if(!_||0===_.length)return void(n?pe({status:"success",downloadedFiles:[]}):g.warn(ce(`Warning: ${ce("Nothing to download!")}`,"secondary")));p=ce(`Downloading script files to ${ce(m,"info")}`),!n&&g.info(ce(`Info: ${p}.`,"secondary"));const O=new E({head:["File","Status"]});for await(const e of _){const t=e.substring($.length),o=a.resolve(m,t);if(yt("file",o),e.endsWith("/")){!s(o)&&await y(o,{recursive:!0});continue}if(!u)try{await w(o),yt("exists, skipping"),O.push([t,"Skipped"]);continue}catch(e){"ENOENT"!==e.code&&le(e)}p=ce(`Downloading file: ${ce(t,"info")}`),!n&&g.start(ce(`In progress: ${p}...`,"secondary")),await y(a.dirname(o),{recursive:!0});const i=b.getObject({Bucket:r,Key:e}).createReadStream();await h(o,await Te(i)),!n&&g.succeed(ce(`Finished: ${p}.`,"secondary")),O.push([t,"Downloaded"])}n?pe({status:"success",downloadedFiles:_}):le(O.toString())}catch(e){n?pe({status:"error",error:e}):(g.fail(ce(`Error: ${p}.`,"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 bt=[ut,gt,mt],wt=ye("commands:etl"),$t="etl <action>";var vt=Object.freeze({__proto__:null,builder:async function(e){wt("builder",$t);return(await Ee(e)).command(bt)},command:$t,desc:"Manage ETL scripts",handler:async function(e){wt("handler",$t,e)}});const jt=ye("commands:flows:list"),kt="list";var _t=Object.freeze({__proto__:null,builder:async e=>(jt("builder",kt),e.option("tenant",{...ke.tenant.config})),command:kt,desc:"List flows",handler:async e=>{jt("handler",kt,e);const{hg:t,json:n,apikey:o,env:s,tenant:r}=e,{clientApiBaseUri:a}=t;let i,c=O();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"}`;jt("requesting:",e),!n&&c.start(ce(`In progress: ${i}...`,"secondary"));const{data:t}=await S.get(e,{headers:{"x-api-key":o}});if(!n&&c.succeed(ce(`Finished: ${i}.`,"secondary")),jt("response-data",t),!t||0===t.length)return void(n?pe([]):c.warn(ce(`Warning: ${ce("No flows for specified environment and tenant")}.`,"secondary")));if(n)pe(t);else{const e=new E({head:["ID","Name","Flow Type","Taps","Targets","Connectors"]});t.sort((e,t)=>(e.name||"").localeCompare(t.name||"")),t.forEach(t=>{return e.push([t.id,t.name||"",2==t.version?"Bidirectional":t.type?"Target Flow":"Source Flow",(n=t.taps,null==n||Array.isArray(n)&&0===n.length?t.sources?t.sources:[]:t.taps).join("\n"),(t.targets?t.targets:[]).join("\n"),(t.connectors?t.connectors:[]).join("\n")]);var n}),console.log(e.toString())}}catch(e){n?pe({status:"error",error:e}):(c.fail(ce(`Error: ${i}.`,"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 Et=[_t],Ot=ye("commands:flows"),xt="flows <action>";var St,It=Object.freeze({__proto__:null,builder:async function(e){Ot("builder",xt);return(await Ee(e)).command(Et)},command:xt,desc:"Manage flows",handler:async function(e){Ot("handler",xt,e)}}),Tt={exports:{}},At={exports:{}},Ft={exports:{}},Ut={exports:{}};var Nt,Dt={exports:{}},Rt={exports:{}};var Pt,Ct,Bt={exports:{}};function Kt(){return Ct||(Ct=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if((0,o.default)(e))return function(e){var t=-1,n=e.length;return function(){return++t<n?{value:e[t],key:t}:null}}(e);var t=(0,r.default)(e);return t?function(e){var t=-1;return function(){var n=e.next();return n.done?null:(t++,{value:n.value,key:t})}}(t):(n=e,s=n?Object.keys(n):[],a=-1,i=s.length,function e(){var t=s[++a];return"__proto__"===t?e():a<i?{value:n[t],key:t}:null});var n,s,a,i};var n=function(){return Nt||(Nt=1,e=Rt,t=Rt.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e&&"number"==typeof e.length&&e.length>=0&&e.length%1==0},e.exports=t.default),Rt.exports;var e,t}(),o=a(n),s=function(){return Pt||(Pt=1,e=Bt,t=Bt.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e[Symbol.iterator]&&e[Symbol.iterator]()},e.exports=t.default),Bt.exports;var e,t}(),r=a(s);function a(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default}(Dt,Dt.exports)),Dt.exports}var Mt,Lt={exports:{}};var zt,Jt={},qt={exports:{}},Vt={exports:{}};var Wt,Yt,Gt,Qt={};function Ht(){return Yt||(Yt=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if((0,r.isAsync)(e))return function(...t){const n=t.pop();return i(e.apply(this,t),n)};return(0,o.default)(function(t,n){var o;try{o=e.apply(this,t)}catch(e){return n(e)}if(o&&"function"==typeof o.then)return i(o,n);n(null,o)})};var n=function(){return zt||(zt=1,e=Vt,t=Vt.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(...t){var n=t.pop();return e.call(this,t,n)}},e.exports=t.default),Vt.exports;var e,t}(),o=a(n),s=a(function(){if(Wt)return Qt;Wt=1,Object.defineProperty(Qt,"__esModule",{value:!0}),Qt.fallback=s,Qt.wrap=r;var e,t=Qt.hasQueueMicrotask="function"==typeof queueMicrotask&&queueMicrotask,n=Qt.hasSetImmediate="function"==typeof setImmediate&&setImmediate,o=Qt.hasNextTick="object"==typeof process&&"function"==typeof process.nextTick;function s(e){setTimeout(e,0)}function r(e){return(t,...n)=>e(()=>t(...n))}return e=t?queueMicrotask:n?setImmediate:o?process.nextTick:s,Qt.default=r(e),Qt}()),r=Zt();function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){return e.then(e=>{c(t,null,e)},e=>{c(t,e&&(e instanceof Error||e.message)?e:new Error(e))})}function c(e,t,n){try{e(t,n)}catch(e){(0,s.default)(e=>{throw e},e)}}e.exports=t.default}(qt,qt.exports)),qt.exports}function Zt(){if(Gt)return Jt;Gt=1,Object.defineProperty(Jt,"__esModule",{value:!0}),Jt.isAsyncIterable=Jt.isAsyncGenerator=Jt.isAsync=void 0;var e,t=Ht(),n=(e=t)&&e.__esModule?e:{default:e};function o(e){return"AsyncFunction"===e[Symbol.toStringTag]}return Jt.default=function(e){if("function"!=typeof e)throw new Error("expected a function");return o(e)?(0,n.default)(e):e},Jt.isAsync=o,Jt.isAsyncGenerator=function(e){return"AsyncGenerator"===e[Symbol.toStringTag]},Jt.isAsyncIterable=function(e){return"function"==typeof e[Symbol.asyncIterator]},Jt}var Xt,en,tn,nn={exports:{}},on={exports:{}};function sn(){return Xt||(Xt=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0});t.default={},e.exports=t.default}(on,on.exports)),on.exports}function rn(){return tn||(tn=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=function(){return St||(St=1,e=Ut,t=Ut.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(...t){if(null!==e){var n=e;e=null,n.apply(this,t)}}return Object.assign(t,e),t},e.exports=t.default),Ut.exports;var e,t}(),o=u(n),s=u(Kt()),r=function(){return Mt||(Mt=1,e=Lt,t=Lt.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(...t){if(null===e)throw new Error("Callback was already called.");var n=e;e=null,n.apply(this,t)}},e.exports=t.default),Lt.exports;var e,t}(),a=u(r),i=Zt(),c=(en||(en=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n,s){let r=!1,a=!1,i=!1,c=0,l=0;function d(){c>=t||i||r||(i=!0,e.next().then(({value:e,done:t})=>{if(!a&&!r){if(i=!1,t)return r=!0,void(c<=0&&s(null));c++,n(e,l,u),l++,d()}}).catch(f))}function u(e,t){if(c-=1,!a)return e?f(e):!1===e?(r=!0,void(a=!0)):t===o.default||r&&c<=0?(r=!0,s(null)):void d()}function f(e){a||(i=!1,r=!0,s(e))}d()};var n,o=(n=sn())&&n.__esModule?n:{default:n};e.exports=t.default}(nn,nn.exports)),nn.exports),l=u(c),d=u(sn());function u(e){return e&&e.__esModule?e:{default:e}}t.default=e=>(t,n,r)=>{if(r=(0,o.default)(r),e<=0)throw new RangeError("concurrency limit cannot be less than 1");if(!t)return r(null);if((0,i.isAsyncGenerator)(t))return(0,l.default)(t,e,n,r);if((0,i.isAsyncIterable)(t))return(0,l.default)(t[Symbol.asyncIterator](),e,n,r);var c=(0,s.default)(t),u=!1,f=!1,p=0,g=!1;function y(e,t){if(!f)if(p-=1,e)u=!0,r(e);else if(!1===e)u=!0,f=!0;else{if(t===d.default||u&&p<=0)return u=!0,r(null);g||h()}}function h(){for(g=!0;p<e&&!u;){var t=c();if(null===t)return u=!0,void(p<=0&&r(null));p+=1,n(t.value,t.key,(0,a.default)(y))}g=!1}h()},e.exports=t.default}(Ft,Ft.exports)),Ft.exports}var an,cn={exports:{}};var ln,dn,un,fn={exports:{}};function pn(){return ln||(ln=1,e=fn,t=fn.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(t||(t=e.length),!t)throw new Error("arity is undefined");return function(...n){return"function"==typeof n[t-1]?e.apply(this,n):new Promise((o,s)=>{n[t-1]=(e,...t)=>{if(e)return s(e);o(t.length>1?t:t[0])},e.apply(this,n)})}},e.exports=t.default),fn.exports;var e,t}function gn(){return dn||(dn=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=i(rn()),o=function(){return an||(an=1,e=cn,t=cn.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(t,n,o)=>e(t,o)},e.exports=t.default),cn.exports;var e,t}(),s=i(o),r=i(Zt()),a=i(pn());function i(e){return e&&e.__esModule?e:{default:e}}t.default=(0,a.default)(function(e,t,o,a){return(0,n.default)(t)(e,(0,s.default)((0,r.default)(o)),a)},4),e.exports=t.default}(At,At.exports)),At.exports}var yn=A((un||(un=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=s(gn()),o=s(pn());function s(e){return e&&e.__esModule?e:{default:e}}t.default=(0,o.default)(function(e,t,o){return(0,n.default)(e,1,t,o)},3),e.exports=t.default}(Tt,Tt.exports)),Tt.exports));const hn=ye("commands:jobs:download"),mn="download <jobroot>";var bn=Object.freeze({__proto__:null,builder:async e=>(hn("builder",mn),e.option("downloadTo",ke.downloadTo.config)),command:mn,desc:"Download Job files",handler:async e=>{hn("handler",mn,e);const{hg:t,json:n,apikey:o,env:s,jobroot:i,downloadTo:c}=e,{clientApiBaseUri:l}=t;let d,u=O();try{d=ce("Verifying user and authorizing"),!n&&u.start(ce(`In progress: ${d}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:f}=await Ue({debug:hn,baseUri:l,task:"job-download",env:s,apikey:o,jobroot:i}),p=new j.S3({accessKeyId:e,secretAccessKey:t,sessionToken:f});!n&&u.succeed(ce(`Finished: ${d}.`,"secondary")),d=ce("Scanning for downloadable files"),!n&&u.start(ce(`In progress: ${d}...`,"secondary"));const g={Bucket:s,Prefix:i},{Contents:y}=await p.listObjectsV2(g).promise();if(hn("res",y),!y||0===y.length)return void(n?pe({status:"error",error:"Nothing to download!"}):(u.fail(ce(`Error: ${d}.`,"secondary")),de(ce(`Message: ${ce("Nothing to download!")}`,"secondary"))));if(!n&&u.succeed(ce(`Finished: ${d}.`,"secondary")),!n){const e=new E({head:["File","Size","LastModified"]});y.forEach(t=>{const n=t.Key.substring(i.length+1);e.push([n,t.Size,t.LastModified.toLocaleString("en-US")])}),console.log(e.toString())}const h=a.resolve(process.cwd(),c,a.basename(i));await yn(y.filter(({Key:e})=>!new RegExp(`${i}/([^/]+)-config.json`).test(e)),async e=>{d=ce(`Downloading file: ${ce(e.Key,"info")}`),!n&&u.start(ce(`In progress: ${d}...`,"secondary"));const t=a.resolve(h,e.Key.substring(i.length+1));hn("file",t),await I(a.dirname(t),{recursive:!0});const o=p.getObject({Bucket:s,Key:e.Key}).createReadStream(),c=r(t,{flags:"w"});o.pipe(c),!n&&u.succeed(ce(`Finished: ${d}.`,"secondary"))}),n?pe({status:"success",downloadedFiles:y.map(({Key:e})=>e)}):(d=ce("Downloading job files."),u.succeed(ce(`Finished: ${d}`,"secondary")))}catch(e){n?pe({status:"error",error:e}):(u.fail(ce(`Error: ${d}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),hn(e),e&&e.response&&e.response.data&&hn("response",e.response.data)),process.exit(1)}}});const wn=(...e)=>{ye("commands:jobs:list")(...e)},$n="list";var vn=Object.freeze({__proto__:null,builder:async e=>(wn("builder",$n),e.option("flow",ke.flow.config).demandOption("flow",ke.flow.demandText).option("tenant",{...ke.tenant.config,default:"default"}).option("count",ke.count.config)),command:$n,desc:"List jobs",handler:async e=>{wn("handler",$n,e);const{hg:t,json:n,apikey:o,env:s,flow:r,tenant:a,count:i}=e,{clientApiBaseUri:c}=t;let l,d=O();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}`:""}`;wn("requesting:",e),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const{data:t}=await S.get(e,{headers:{"x-api-key":o}});if(!n&&d.succeed(ce(`Finished: ${l}.`,"secondary")),wn("response-data",t),!t||0===t.length)return void(n?pe([]):d.warn(ce(`Warning: ${ce("No jobs for the specified environment, flow and tenant")}.`,"secondary")));if(n)pe(t);else{const e=new E({head:["name","details"]});t.forEach(t=>e.push([t.job_name,JSON.stringify(t,void 0,2)])),console.log(e.toString())}}catch(e){n?pe({status:"error",error:e}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),wn(e),e&&e.response&&e.response.data&&wn("response",e.response.data)),process.exit(1)}}});const jn=(...e)=>{ye("commands:jobs:bulkRun")(...e)},kn="bulk-run";var _n=Object.freeze({__proto__:null,builder:async e=>(jn("builder",kn),e.option("file",{describe:"Path to JSON file containing array of jobs to run",type:"string",alias:["f"],demandOption:!0}).demandOption("file","Path to JSON file is required. Example: -f ./jobs.json")),command:kn,desc:"Run jobs in bulk",handler:async e=>{jn("handler",kn,e);const{hg:n,json:o,apikey:r,env:a,file:i}=e,{clientApiBaseUri:c}=n;let l,d=O();try{if(l=ce(`Reading jobs file: ${ce(i,"info")}`),!o&&d.start(ce(`In progress: ${l}...`,"secondary")),!s(i))throw new Error(`File not found: ${i}`);const e=t(i,{encoding:"utf-8"}),n=JSON.parse(e);if(!Array.isArray(n))throw new Error("JSON file must contain an array of job objects");if(0===n.length)return void(o?pe({status:"error",error:"No jobs found in file"}):d.warn(ce(`Warning: ${ce("No jobs found in file")}.`,"secondary")));for(let e=0;e<n.length;e++){const t=n[e];if(!t.flow)throw new Error(`Job at index ${e} is missing required field: flow`);if(!t.tenant)throw new Error(`Job at index ${e} is missing required field: tenant`)}!o&&d.succeed(ce(`Finished: ${l}.`,"secondary")),l=ce("Checking flow versions..."),!o&&d.start(ce(`In progress: ${l}...`,"secondary"));const u=[...new Set(n.map(e=>e.flow))],f={};await Promise.all(u.map(async e=>{try{const t=await Le({debug:jn,baseUri:c,apikey:r,env:a,flow:e});f[e]=2===t?.version}catch(t){jn(`Error checking flow ${e}:`,t),f[e]=!1}})),!o&&d.succeed(ce(`Finished: ${l}.`,"secondary")),l=ce(`Running ${ce(n.length,"info")} job(s)...`),!o&&d.start(ce(`In progress: ${l}...`,"secondary"));const p=await Promise.all(n.map(async(e,t)=>{const{flow:n,tenant:o,...s}=e,i=f[n]||!1;try{const e=await(async({debug:e,baseUri:t,env:n,apikey:o,tenant:s,flow:r,...a})=>{const{isV2Flow:i=!1,...c}=a,l={"x-api-key":o},d=new URL(`${t}/${i?"v2/":""}${n}/${r}/${s}/jobs`).toString();e&&e("uri:",d);const{data:u}=await S.post(d,c,{headers:l});return u})({debug:jn,baseUri:c,env:a,apikey:r,tenant:o,flow:n,isV2Flow:i,...s});return{index:t,flow:n,tenant:o,ok:!0,response:e}}catch(e){let s;if(e.response){const t=e.response.status,n=e.response.statusText,o=e.response.data,r=e.message;jn("Error response:",{statusCode:t,statusText:n,message:r,data:o}),s={statusCode:t,statusText:n,message:r,data:o}}else e.request?(jn("Error: No response received",e.message),s={message:e.message,request:e.request}):(jn("Error:",e.message),s={message:e.message});return{index:t,flow:n,tenant:o,ok:!1,error:s}}}));if(!o&&d.succeed(ce(`Finished: ${l}.`,"secondary")),o)pe(p);else{const e=new E({head:["Index","Flow","Tenant","Status","Response/Error"]});p.forEach(t=>{const n=t.ok?"SUCCESS":"FAILED",o=t.ok?JSON.stringify(t.response,void 0,2):JSON.stringify(t.error,void 0,2);e.push([t.index,t.flow,t.tenant,n,o])}),console.log(e.toString());const t=p.filter(e=>e.ok).length,n=p.filter(e=>!e.ok).length;de(ce(`Summary: ${ce(String(t),"info")} succeeded, ${ce(String(n),"error")} failed out of ${ce(String(p.length),"info")} total.`,"secondary"))}}catch(e){o?pe({status:"error",error:e.message,stack:e.stack}):(d.fail(ce(`Error: ${l||"Failed to run jobs"}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),jn(e)),process.exit(1)}}});const En=(...e)=>{ye("commands:jobs:bulkRetrigger")(...e)},On="bulk-retrigger";var xn=Object.freeze({__proto__:null,builder:async e=>(En("builder",On),e.option("file",{describe:"Path to JSON file containing array of jobRoots to retrigger",type:"string",alias:["f"],demandOption:!0}).demandOption("file","Path to JSON file is required. Example: -f ./jobRoots.json")),command:On,desc:"Retrigger jobs in bulk",handler:async e=>{En("handler",On,e);const{hg:n,json:o,apikey:r,env:a,file:i}=e,{clientApiBaseUri:c}=n;let l,d=O();try{if(l=ce(`Reading jobRoots file: ${ce(i,"info")}`),!o&&d.start(ce(`In progress: ${l}...`,"secondary")),!s(i))throw new Error(`File not found: ${i}`);const e=t(i,{encoding:"utf-8"}),n=JSON.parse(e);if(!Array.isArray(n))throw new Error("JSON file must contain an array of jobRoot strings");if(0===n.length)return void(o?pe({status:"error",error:"No jobRoots found in file"}):d.warn(ce(`Warning: ${ce("No jobRoots found in file")}.`,"secondary")));for(let e=0;e<n.length;e++)if("string"!=typeof n[e])throw new Error(`JobRoot at index ${e} must be a string, got ${typeof n[e]}`);!o&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const u={};for(const e of n){const t=e.split("/");if(t.length<3||"flows"!==t[1])throw new Error(`Invalid jobRoot format: ${e}. Expected format: {tenantId}/flows/{flowId}/...`);const n=t[0],o=t[2],s=`${n}/flows/${o}`;u[s]||(u[s]={tenant:n,flow:o,jobRoots:[]}),u[s].jobRoots.push(e)}const f=Object.keys(u);!o&&de(ce(`Found ${ce(String(n.length),"info")} jobRoot(s) grouped into ${ce(String(f.length),"info")} tenant/flow group(s).`,"secondary"));const p=async(e,t,n,o=36e5)=>{const s=Date.now();for(;Date.now()-s<o;)try{const o=await Ve({debug:En,baseUri:c,env:a,apikey:r,flow:t,user_id:e,job_root:n}),s=o.status||o.state;if("JOB_COMPLETED"===s||"string"==typeof s&&s.endsWith("_FAILED"))return{completed:!0,status:s};await new Promise(e=>setTimeout(e,5e3))}catch(e){En(`Error checking job status for ${n}:`,e),await new Promise(e=>setTimeout(e,5e3))}return{completed:!1,status:"TIMEOUT"}};l=ce(`Retriggering ${ce(String(n.length),"info")} job(s) across ${ce(String(f.length),"info")} group(s)...`),!o&&d.start(ce(`In progress: ${l}...`,"secondary"));const g=[];if(await Promise.all(f.map(async e=>{const t=u[e],{tenant:n,flow:s,jobRoots:i}=t,l=[];for(let e=0;e<i.length;e++){const t=i[e];try{const u=await Je({debug:En,baseUri:c,env:a,apikey:r,tenant:n,flow:s,job_root:t});if(e<i.length-1){o||(d.text=ce(`Waiting for job ${e+1}/${i.length} in group ${n}/${s} to complete...`,"secondary"));(await p(n,s,t)).completed||En(`Warning: Job ${t} did not complete within timeout period`)}l.push({tenant:n,flow:s,jobRoot:t,ok:!0,response:u})}catch(e){let o;if(e.response){const t=e.response.status,n=e.response.statusText,s=e.response.data,r=e.message;En("Error response:",{statusCode:t,statusText:n,message:r,data:s}),o={statusCode:t,statusText:n,message:r,data:s}}else e.request?(En("Error: No response received",e.message),o={message:e.message,request:e.request}):(En("Error:",e.message),o={message:e.message});l.push({tenant:n,flow:s,jobRoot:t,ok:!1,error:o})}}g.push(...l)})),!o&&d.succeed(ce(`Finished: ${l}.`,"secondary")),o)pe(g);else{const e=new E({head:["Tenant","Flow","Job Root","Status","Response/Error"]});g.forEach(t=>{const n=t.ok?"SUCCESS":"FAILED",o=t.ok?JSON.stringify(t.response,void 0,2):JSON.stringify(t.error,void 0,2);e.push([t.tenant||"N/A",t.flow||"N/A",t.jobRoot||"N/A",n,o])}),console.log(e.toString());const t=g.filter(e=>e.ok).length,n=g.filter(e=>!e.ok).length;de(ce(`Summary: ${ce(String(t),"info")} succeeded, ${ce(String(n),"error")} failed out of ${ce(String(g.length),"info")} total.`,"secondary"))}}catch(e){o?pe({status:"error",error:e.message,stack:e.stack}):(d.fail(ce(`Error: ${l||"Failed to retrigger jobs"}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),En(e)),process.exit(1)}}});const Sn=(...e)=>{ye("commands:jobs:bulkKill")(...e)},In="bulk-kill";var Tn=Object.freeze({__proto__:null,builder:async e=>(Sn("builder",In),e.option("tenant-ids",{describe:"Comma-separated list of tenant IDs to filter by",type:"string",alias:["tenants"]}).option("flow-ids",{describe:"Comma-separated list of flow IDs to filter by",type:"string",alias:["flows"]}).option("reason",{describe:"Reason for killing the jobs",type:"string"})),command:In,desc:"Kill jobs in bulk",handler:async e=>{Sn("handler",In,e);const{hg:t,json:n,apikey:o,env:s,tenantIds:r,flowIds:a,reason:i}=e,{clientApiBaseUri:c}=t;let l,d=O();try{const e="JOB_CREATED,SYNC_STARTED,SYNC_SUCCESS,ETL_STARTED,ETL_SUCCESS,EXPORT_STARTED";l=ce("Fetching running jobs..."),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const t=new Date,u=new Date(t);u.setMonth(t.getMonth()-1);const f=u.toISOString().split("T")[0],p=await ze({debug:Sn,baseUri:c,env:s,apikey:o,from:f,status:e,count:100});let g=p.jobs||[];const y=p.total||0;if(!n&&d.succeed(ce(`Found ${ce(y,"info")} job(s) with specified status.`,"secondary")),r){const e=r.split(",").map(e=>e.trim()).filter(e=>e);e.length>0&&(g=g.filter(t=>{const n=t.tenant;return e.includes(n)}))}if(a){const e=a.split(",").map(e=>e.trim()).filter(e=>e);e.length>0&&(g=g.filter(t=>{const n=t.flow_id;return e.includes(n)}))}if(0===g.length)return void(n?pe({status:"info",message:"No jobs found matching the filters"}):d.warn(ce(`Warning: ${ce("No jobs found matching the specified filters")}.`,"secondary")));l=ce(`Killing ${ce(g.length,"info")} job(s)...`),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const h=await Promise.all(g.map(async(e,t)=>{const n=e.s3_root,r=e.flow_id,a=e.tenant;if(!n)return{index:t,flow:r,tenant:a,ok:!1,error:{message:"Job root (s3_root) not found in job data"}};try{const e=await(async({debug:e,baseUri:t,env:n,flow:o,user_id:s,apikey:r,job_root:a,reason:i,task_arn:c,skip_webhooks:l})=>{const d=new URL(`${t}/${n}/${o}/${s}/jobs/kill`);d.searchParams.set("job_root",a),i&&d.searchParams.set("reason",i),c&&d.searchParams.set("task_arn",c),l&&d.searchParams.set("skip_webhooks",!0===l?"true":"false");const u={"x-api-key":r},f=d.toString();e&&e("uri:",f);const{data:p}=await S.get(f,{headers:u});return p})({debug:Sn,baseUri:c,env:s,apikey:o,flow:r,user_id:a,job_root:n,reason:i});return{index:t,flow:r,tenant:a,jobRoot:n,ok:!0,response:e}}catch(e){let o;if(e.response){const t=e.response.status,n=e.response.statusText,s=e.response.data,r=e.message;Sn("Error response:",{statusCode:t,statusText:n,message:r,data:s}),o={statusCode:t,statusText:n,message:r,data:s}}else e.request?(Sn("Error: No response received",e.message),o={message:e.message,request:e.request}):(Sn("Error:",e.message),o={message:e.message});return{index:t,flow:r,tenant:a,jobRoot:n,ok:!1,error:o}}}));if(!n&&d.succeed(ce(`Finished: ${l}.`,"secondary")),n)pe(h);else{const e=new E({head:["Index","Flow","Tenant","Job Root","Status","Response/Error"]});h.forEach(t=>{const n=t.ok?"SUCCESS":"FAILED",o=t.ok?JSON.stringify(t.response,void 0,2):JSON.stringify(t.error,void 0,2);e.push([t.index,t.flow||"N/A",t.tenant||"N/A",t.jobRoot||"N/A",n,o])}),console.log(e.toString());const t=h.filter(e=>e.ok).length,n=h.filter(e=>!e.ok).length;de(ce(`Summary: ${ce(String(t),"info")} succeeded, ${ce(String(n),"error")} failed out of ${ce(String(h.length),"info")} total.`,"secondary"))}}catch(e){n?pe({status:"error",error:e.message,stack:e.stack}):(d.fail(ce(`Error: ${l||"Failed to kill jobs"}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Sn(e)),process.exit(1)}}});const An=(...e)=>{ye("commands:jobs:bulkRollback")(...e)},Fn="bulk-rollback";var Un=Object.freeze({__proto__:null,builder:async e=>(An("builder",Fn),e.option("from-utc-iso",{describe:"Start date for job search (YYYY-MM-DD)",type:"string",alias:["from"],demandOption:!0}).demandOption("from-utc-iso","Date from is required. Example: --from-utc-iso 2024-01-01").option("to-utc-iso",{describe:"End date for job search (YYYY-MM-DD)",type:"string",alias:["to"],demandOption:!0}).demandOption("to-utc-iso","Date to is required. Example: --to-utc-iso 2024-01-31").option("tenant-ids",{describe:"Comma-separated list of tenant IDs to filter by",type:"string",alias:["tenants"]}).option("flow-ids",{describe:"Comma-separated list of flow IDs to filter by",type:"string",alias:["flows"]})),command:Fn,desc:"Rollback jobs in bulk",handler:async e=>{An("handler",Fn,e);const{hg:t,json:n,apikey:o,env:s,fromUtcIso:r,toUtcIso:a,tenantIds:i,flowIds:c}=e,{clientApiBaseUri:l}=t;let d,u=O();try{if(10!==r.length){const e="Date from must be in YYYY-MM-DD format";n?pe({status:"error",error:e}):u.fail(ce(`Error: ${e}`,"secondary")),process.exit(1)}if(10!==a.length){const e="Date to must be in YYYY-MM-DD format";n?pe({status:"error",error:e}):u.fail(ce(`Error: ${e}`,"secondary")),process.exit(1)}const e=`${r}T00:00:00Z`,t=`${a}T23:59:59.999Z`;d=ce(`Fetching jobs from ${ce(r,"info")} to ${ce(a,"info")}...`),!n&&u.start(ce(`In progress: ${d}...`,"secondary"));const f=await ze({debug:An,baseUri:l,env:s,apikey:o,from:e,to:t,count:100});!n&&u.stop();let p=f.jobs||[];if(i){const e=i.split(",").map(e=>e.trim()).filter(e=>e);e.length>0&&(p=p.filter(t=>{const n=t.tenant;return e.includes(n)}))}if(c){const e=c.split(",").map(e=>e.trim()).filter(e=>e);e.length>0&&(p=p.filter(t=>{const n=t.flow_id||t.flowId||t.flow;return e.includes(n)}))}if(!n&&de(ce(`Found ${ce(String(p.length),"info")} job(s) after filtering.`,"secondary")),0===p.length)return void(n?pe({status:"info",message:"No jobs found matching the filters"}):u.warn(ce(`Warning: ${ce("No jobs found matching the specified filters")}.`,"secondary")));d=ce(`Rolling back ${ce(p.length,"info")} job(s)...`),!n&&u.start(ce(`In progress: ${d}...`,"secondary"));const g=await Promise.all(p.map(async(e,t)=>{const n=e.s3_root||e.s3Root||e.job_root||e.jobRoot,r=e.flow_id||e.flowId||e.flow,a=e.tenant||e.tenant_id||e.tenantId||e.user_id;let i=e.tap;if(!i&&e.taps&&Array.isArray(e.taps)&&e.taps.length>0&&(i=e.taps[0]),!i&&e.tap_name&&(i=e.tap_name),!i&&e.connector&&(i=e.connector),!n)return{index:t,flow:r,tenant:a,ok:!1,error:{message:"Job root (s3_root) not found in job data"}};if(!i)return{index:t,flow:r,tenant:a,jobRoot:n,ok:!1,error:{message:"Tap not found in job data"}};try{const e=await(async({debug:e,baseUri:t,env:n,flow:o,user_id:s,apikey:r,job_root:a,tap:i})=>{const c={"x-api-key":r},l=new URL(`${t}/${n}/${o}/${s}/jobs/rollback`).toString(),d={job_root:a,tap:i};e&&e("uri:",l),e&&e("body:",d);const{data:u}=await S.post(l,d,{headers:c});return u})({debug:An,baseUri:l,env:s,apikey:o,flow:r,user_id:a,job_root:n,tap:i});return{index:t,flow:r,tenant:a,jobRoot:n,tap:i,ok:!0,response:e}}catch(e){let o;if(e.response){const t=e.response.status,n=e.response.statusText,s=e.response.data,r=e.message;An("Error response:",{statusCode:t,statusText:n,message:r,data:s}),o={statusCode:t,statusText:n,message:r,data:s}}else e.request?(An("Error: No response received",e.message),o={message:e.message,request:e.request}):(An("Error:",e.message),o={message:e.message});return{index:t,flow:r,tenant:a,jobRoot:n,tap:i,ok:!1,error:o}}}));if(!n&&u.succeed(ce(`Finished: ${d}.`,"secondary")),n)pe(g);else{const e=new E({head:["Index","Flow","Tenant","Job Root","Tap","Status","Response/Error"]});g.forEach(t=>{const n=t.ok?"SUCCESS":"FAILED",o=t.ok?JSON.stringify(t.response,void 0,2):JSON.stringify(t.error,void 0,2);e.push([t.index,t.flow||"N/A",t.tenant||"N/A",t.jobRoot||"N/A",t.tap||"N/A",n,o])}),console.log(e.toString());const t=g.filter(e=>e.ok).length,n=g.filter(e=>!e.ok).length;de(ce(`Summary: ${ce(String(t),"info")} succeeded, ${ce(String(n),"error")} failed out of ${ce(String(g.length),"info")} total.`,"secondary"))}}catch(e){n?pe({status:"error",error:e.message,stack:e.stack}):(u.fail(ce(`Error: ${d||"Failed to rollback jobs"}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),An(e)),process.exit(1)}}});const Nn=[bn,vn,_n,xn,Tn,Un],Dn=ye("commands:jobs"),Rn="jobs <action>";var Pn=Object.freeze({__proto__:null,builder:async function(e){Dn("builder",Rn);return(await Ee(e)).command(Nn)},command:Rn,desc:"Manage ETL jobs",handler:async function(e){Dn("handler",Rn,e)}});const Cn=ye("commands:schedules:bulkUpdate"),Bn="bulk-update";var Kn=Object.freeze({__proto__:null,builder:async e=>(Cn("builder",Bn),e.option("tenant-ids",{describe:"Comma-separated list of tenant IDs",type:"string",alias:["tenants"]}).option("flow-ids",{describe:"Comma-separated list of flow IDs",type:"string",alias:["flows"]}).option("status",{describe:'Schedule status: "enable" or "disable"',type:"string",choices:["enable","disable"]}).option("expression",{describe:"Cron schedule expression",type:"string"}).option("connector",{describe:"Filter by connector ID",type:"string"}).option("job-type",{describe:'Filter by job type: "read" or "write"',type:"string",choices:["read","write"]})),command:Bn,desc:"Update schedules in bulk",handler:async e=>{Cn("handler",Bn,e);const{hg:t,json:n,apikey:o,env:s,tenantIds:r,flowIds:a,status:i,expression:c,connector:l,"job-type":d}=e,{clientApiBaseUri:u}=t;let f,p=O();try{if(!i&&!c){const e='Either "status" or "expression" must be provided';n?pe({status:"error",error:e}):p.fail(ce(`Error: ${e}`,"secondary")),process.exit(1)}const e=r?r.split(",").map(e=>e.trim()).filter(Boolean):null,t=a?a.split(",").map(e=>e.trim()).filter(Boolean):null;f=ce(`Retrieving schedules for environment: ${ce(s,"info")}`),!n&&p.start(ce(`In progress: ${f}...`,"secondary"));const g=await(async({debug:e,baseUri:t,env:n,apikey:o,includeDisabled:s})=>{const r=new URL(`${t}/tenants/${n}/schedule`);r.searchParams.set("includeDisabled","true");const a={"x-api-key":o},i=r.toString();e&&e("uri:",i);const{data:c}=await S.get(i,{headers:a});return c})({debug:Cn,baseUri:u,env:s,apikey:o,includeDisabled:!0});!n&&p.succeed(ce(`Finished: ${f}.`,"secondary")),Cn("response-data",g);const y="string"==typeof g?JSON.parse(g):g;if(!y||0===y.length)return void(n?pe({updated:0,schedules:[]}):p.warn(ce(`Warning: ${ce("No schedules found for the specified environment")}.`,"secondary")));let h=y.filter(n=>{if(e&&e.length>0&&!e.includes(n.tenantId))return!1;if(t&&t.length>0&&!t.includes(n.flowId))return!1;if(null!=l&&""!==l){if(n.connectorId!==l)return!1}else if(null!==n.connectorId&&void 0!==n.connectorId)return!1;return!d||n.jobType===d});if(0===h.length)return void(n?pe({updated:0,schedules:[]}):p.warn(ce(`Warning: ${ce("No schedules match the specified filters")}.`,"secondary")));let m=h;if(i&&("enable"===i?m=h.filter(e=>!1===e.isActive):"disable"===i&&(m=h.filter(e=>!0===e.isActive))),0===m.length)return void(n?pe({updated:0,schedules:[],message:"No schedules need to be updated (all are already in the desired state)"}):p.warn(ce(`Warning: ${ce("No schedules need to be updated (all are already in the desired state)")}.`,"secondary")));const b=i?"enable"===i?"ENABLED":"DISABLED":void 0;n||de(ce(`Found ${ce(m.length.toString(),"info")} schedule(s) to update`,"secondary"));const w=20,$=[],v=[];for(let e=0;e<m.length;e+=w){const t=m.slice(e,e+w),s=Math.floor(e/w)+1,r=Math.ceil(m.length/w);f=ce(`Updating batch ${ce(`${s}/${r}`,"info")} (${t.length} schedule(s))`),!n&&p.start(ce(`In progress: ${f}...`,"secondary"));const a=t.map(async e=>{try{const t=c||e.expression,n=b||(e.isActive?"ENABLED":"DISABLED");if(!t)throw new Error("Schedule expression is required but not found");const s=await qe({debug:Cn,baseUri:u,env:e.envId,flow:e.flowId,user_id:e.tenantId,apikey:o,schedule_expression:t,state:n,job_type:e.jobType||d,connector_id:e.connectorId||l});return{success:!0,schedule:{envId:e.envId,flowId:e.flowId,tenantId:e.tenantId,connectorId:e.connectorId,jobType:e.jobType,expression:t,state:n},result:s}}catch(t){return Cn("Error updating schedule:",t),{success:!1,schedule:{envId:e.envId,flowId:e.flowId,tenantId:e.tenantId,connectorId:e.connectorId,jobType:e.jobType},error:t.message||t.toString()}}});(await Promise.all(a)).forEach(e=>{e.success?$.push(e.schedule):v.push(e)}),!n&&p.succeed(ce(`Finished: ${f}.`,"secondary"))}if(n)pe({total:m.length,updated:$.length,failed:v.length,schedules:$,errors:v});else if(de(ce(`\nUpdated ${ce($.length.toString(),"info")} schedule(s) successfully`,"secondary")),v.length>0&&de(ce(`Failed to update ${ce(v.length.toString(),"error")} schedule(s)`,"secondary")),$.length>0||v.length>0){const e=new E({head:["Environment","Flow","Tenant","Connector","Job Type","Expression","State","Updated"]});$.forEach(t=>{e.push([t.envId,t.flowId,t.tenantId,t.connectorId||"N/A",t.jobType||"N/A",t.expression,t.state,"yes"])}),v.forEach(t=>{const n=t.schedule,o=m.find(e=>e.envId===n.envId&&e.flowId===n.flowId&&e.tenantId===n.tenantId&&e.connectorId===n.connectorId&&e.jobType===n.jobType);e.push([n.envId,n.flowId,n.tenantId,n.connectorId||"N/A",n.jobType||"N/A",o?.expression||"N/A",o?.isActive?"ENABLED":"DISABLED",`no: ${t.error}`])}),console.log("\n"+e.toString())}}catch(e){n?pe({status:"error",error:e.message||e.toString()}):(p.fail(ce(`Error: ${f||"Failed to update schedules"}.`,"secondary")),de(ce(`Message: ${ce(e.message||e.toString())}`,"secondary")),Cn(e),e&&e.response&&e.response.data&&Cn("response",e.response.data)),process.exit(1)}}});const Mn=[Kn],Ln=ye("commands:schedules"),zn="schedules <action>";var Jn=Object.freeze({__proto__:null,builder:async function(e){Ln("builder",zn);return(await Ee(e)).command(Mn)},command:zn,desc:"Manage schedules",handler:async function(e){Ln("handler",zn,e)}});const qn=ye("commands:snapshots:deploy"),Vn="deploy";var Wn=Object.freeze({__proto__:null,builder:async e=>(qn("builder",Vn),e.option("tenant",{...ke.tenant.config,default:"default"}).option("sourceFolder",ke.sourceFolder.config).demandOption("sourceFolder",ke.sourceFolder.demandText)),command:Vn,desc:"Deploy Snapshots",handler:async e=>{qn("handler",Vn,e);const{hg:t,json:n,apikey:o,env:s,tenant:r,sourceFolder:i}=e,{clientApiBaseUri:c}=t;let l,d=O();const u=a.resolve(process.cwd(),i);try{l=ce(`Deploying Snapshots for Tenant ${ce(r,"info")} to ${ce(s,"info")}`),!n&&d.info(ce(`Info: ${l}.`,"secondary"));const e=await Se(u,{recursive:!0});if(0===e.length)return void(n?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:t,secretAccessKey:f,sessionToken:p}=await Ue({debug:qn,baseUri:c,task:"snapshot-deploy",env:s,tenant:r,apikey:o});!n&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const g=new j.S3({accessKeyId:t,secretAccessKey:f,sessionToken:p});l=ce("Validating tenant exists"),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));try{const{CommonPrefixes:e}=await g.listObjectsV2({Bucket:s,Prefix:`${r}/`,Delimiter:"/"}).promise();if(0===e.length)throw new Error("Invalid tenant")}catch(e){throw qn("err",e),new Error("Tenant doesn't exist. Please check your tenant (-u) argument.")}!n&&d.succeed(ce(`Finished: ${l}.`,"secondary"));const y=`${r}/snapshots/`,h=new E({head:["File","Status"]});l=ce("Preparing deployment target"),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const{Contents:m}=await g.listObjectsV2({Bucket:s,Prefix:`${y}`}).promise();!n&&d.stop(),qn("contents",m),!n&&d.start(ce(`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 g.deleteObjects(e).promise(),w.forEach(({Key:e})=>h.push([e.substring(y.length),ce("Deleted","warn")]))}!n&&d.succeed(ce(`Finished: ${l}.`,"secondary"));for await(const t of e){const e=a.relative(i,t),o=`${y}${e}`;l=ce(`Deploying file: ${ce(e,"info")}`),!n&&d.start(ce(`In progress: ${l}...`,"secondary"));const r={Bucket:s,Key:o,Body:await b(t)},c=await g.putObject(r).promise();!n&&d.succeed(ce(`Finished: ${l}.`,"secondary")),qn("s3-put-res",c),h.push([e,ce("Deployed","info")])}n?pe({status:"success",deployedFiles:e}):le(h.toString())}catch(e){n?pe({status:"error",error:e}):(d.fail(ce(`Error: ${l}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),qn(e),e&&e.response&&e.response.data&&qn("response",e.response.data)),process.exit(1)}}});const Yn=ye("commands:snapshots:download"),Gn="download";var Qn=Object.freeze({__proto__:null,builder:async e=>(Yn("builder",Gn),e.option("downloadTo",ke.downloadTo.config).demandOption("downloadTo",ke.downloadTo.demandText).option("tenant",{...ke.tenant.config,default:"default"}).option("overwrite",ke.overwrite.config).demandOption("overwrite",ke.overwrite.demandText)),command:Gn,desc:"Download Snapshots",handler:async e=>{Yn("handler",Gn,e);const{hg:t,json:n,apikey:o,env:r,tenant:i,downloadTo:c,overwrite:l}=e,{clientApiBaseUri:d}=t;let u,f=O();const p=a.resolve(process.cwd(),function(e){function t(e){return process.argv.indexOf(e)>-1}if(t(`--${e}`))return!0;const n=ke[e]?.config?.alias||[];for(let e in n)if(t(`-${n[e]}`))return!0;return!1}("downloadTo")?c:"snapshots");try{u=ce("Verifying user and authorizing"),!n&&f.start(ce(`In progress: ${u}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:c}=await Ue({debug:Yn,baseUri:d,task:"snapshot-download",env:r,tenant:i,apikey:o}),g=new j.S3({accessKeyId:e,secretAccessKey:t,sessionToken:c});!n&&f.succeed(ce(`Finished: ${u}.`,"secondary")),u=ce("Validating tenant exists"),!n&&f.start(ce(`In progress: ${u}...`,"secondary"));try{const{CommonPrefixes:e}=await g.listObjectsV2({Bucket:r,Prefix:`${i}/`,Delimiter:"/"}).promise();if(0===e.length)throw new Error("Invalid tenant")}catch(e){throw Yn("err",e),new Error("Tenant doesn't exist. Please check your tenant (-u) argument.")}!n&&f.succeed(ce(`Finished: ${u}.`,"secondary")),u=ce("Scanning for downloadable files"),!n&&f.start(ce(`In progress: ${u}...`,"secondary"));const m=`${i}/snapshots/`,b={Bucket:r,Prefix:m},{Contents:$}=await g.listObjectsV2(b).promise();!n&&f.succeed(ce(`Finished: ${u}.`,"secondary")),Yn("s3-list-res",$);const v=$?$.map(e=>e.Key).filter(e=>e!==m):[];if(!v||0===v.length)return void(n?pe({status:"success",downloadedFiles:[]}):f.warn(ce(`Warning: ${ce("Nothing to download!")}`,"secondary")));u=ce(`Downloading snapshot files to ${ce(p,"info")}`),!n&&f.info(ce(`Info: ${u}.`,"secondary"));const k=new E({head:["File","Status"]});for await(const e of v){const t=e.substring(m.length),o=a.resolve(p,t);if(Yn("file",o),e.endsWith("/")){!s(o)&&await y(o,{recursive:!0});continue}if(!l)try{await w(o),Yn("exists, skipping"),k.push([t,"Skipped"]);continue}catch(e){"ENOENT"!==e.code&&le(e)}u=ce(`Downloading file: ${ce(t,"info")}`),!n&&f.start(ce(`In progress: ${u}...`,"secondary")),await y(a.dirname(o),{recursive:!0});const i=g.getObject({Bucket:r,Key:e}).createReadStream();await h(o,await Te(i)),!n&&f.succeed(ce(`Finished: ${u}.`,"secondary")),k.push([t,"Downloaded"])}n?pe({status:"success",downloadedFiles:v}):le(k.toString())}catch(e){n?pe({status:"error",error:e}):(f.fail(ce(`Error: ${u}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),Yn(e),e&&e.response&&e.response.data&&Yn("response",e.response.data)),process.exit(1)}}});const Hn=[Wn,Qn],Zn=ye("commands:snapshots"),Xn="snapshots <action>";var eo=Object.freeze({__proto__:null,builder:async function(e){Zn("builder",Xn,e);return(await Ee(e)).command(Hn)},command:Xn,desc:"Manage tenant snapshots",handler:async function(e){Zn("handler",Xn,e)}});const to=ye("commands:tenants:custom-etl"),no="custom-etl",oo=async({debug:e,baseUri:t,apikey:n,env:o,flow:s,tenant:r,supportedSources:a})=>{const i=await Pe({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n});let c=null;for(const{tap:l}of[...i,...a]){const{accessKeyId:a,secretAccessKey:i,sessionToken:d}=await Ue({debug:e,baseUri:t,task:"etl-download",env:o,tenant:r,flow:s,tap:l,apikey:n}),u=new j.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 so=Object.freeze({__proto__:null,builder:async e=>(to("builder",no),e.option("tenant",ke.tenant.config).option("flow",ke.flow.config).demandOption("flow",ke.flow.demandText)),command:no,desc:"List tenants with custom ETL in a specific flow",handler:async e=>{to("handler",no,e);const{hg:t,json:n,apikey:o,env:s,flow:r}=e;let a,i=O();try{a=ce(`Retrieving tenants for environment ${ce(s,"info")}`),!n&&i.start(ce(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ne({debug:to,baseUri:t.clientApiBaseUri,apikey:o,env:s}),De({debug:to,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r})]);!n&&i.succeed(ce(`Finished: ${a}.`,"secondary"));let l=[];a=ce(`Querying for custom ETL scripts for flow ${ce(r,"info")}`),!n&&i.start(ce(`In progress: ${a}...`,"secondary"));for(const n of Ae(e)){const e=await Promise.all(n.map(e=>oo({debug:to,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,supportedSources:c})));l=l.concat(e.filter(Boolean))}if(!n&&i.succeed(ce(`Finished: ${a}.`,"secondary")),n)pe(l);else{const e=new E({head:["Tenant ID"]});e.push(...l.map(e=>[e])),console.log(e.toString())}}catch(e){n?pe({status:"error",error:e}):(i.fail(ce(`Error: ${a}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),to(e),e&&e.response&&e.response.data&&to("response",e.response.data)),process.exit(1)}}});const ro=ye("commands:tenants:custom-field-map"),ao="custom-field-map",io=async({debug:e,baseUri:t,apikey:n,env:o,flow:s,tenant:r,isV2Flow:a})=>{const i=a?await Ce({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n}):await Pe({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n}),c=[],{accessKeyId:l,secretAccessKey:d,sessionToken:u}=await Ue({debug:e,baseUri:t,task:"field-map-download",env:o,tenant:r,flow:s,apikey:n}),f=new j.S3({accessKeyId:l,secretAccessKey:d,sessionToken:u});for(const{id:e,tap:t}of i){const n={Bucket:o,Key:`${r}/flows/${s}/${a?"connectors":"taps"}/${a?e:t}/fieldMap.json`};try{await f.headObject(n).promise(),c.push(a?e:t)}catch(e){}}return{tenant:r,connectors:c}};var co=Object.freeze({__proto__:null,builder:async e=>(ro("builder",ao),e.option("tenant",ke.tenant.config).option("flow",ke.flow.config).demandOption("flow",ke.flow.demandText)),command:ao,desc:"List tenants with custom field map in a specific flow",handler:async e=>{ro("handler",ao,e);const{hg:t,json:n,apikey:o,env:s,flow:r}=e;let a,i=O();try{a=ce(`Retrieving tenants for environment ${ce(s,"info")}`),!n&&i.start(ce(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ne({debug:ro,baseUri:t.clientApiBaseUri,apikey:o,env:s}),Le({debug:ro,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r})]),l=2===c?.version;!n&&i.succeed(ce(`Finished: ${a}.`,"secondary"));const d=[];a=ce(`Querying for custom field maps for flow ${ce(r,"info")}`),!n&&i.start(ce(`In progress: ${a}...`,"secondary"));for(const n of Ae(e)){const e=await Promise.all(n.map(e=>io({debug:ro,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,isV2Flow:l})));d.push(...e.filter(({connectors:e})=>e.length>0))}if(!n&&i.succeed(ce(`Finished: ${a}.`,"secondary")),n)pe(d);else{const e=new E({head:["Tenant ID","Connector IDs"]});e.push(...d.map(({tenant:e,connectors:t})=>[e,t.join(", ")])),console.log(e.toString())}}catch(e){n?pe({status:"error",error:e}):(i.fail(ce(`Error: ${a}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),ro(e),e&&e.response&&e.response.data&&ro("response",e.response.data)),process.exit(1)}}});const lo=ye("commands:tenants:delete"),uo="delete";var fo=Object.freeze({__proto__:null,builder:async e=>(lo("builder",uo),e.option("tenant",ke.tenant.config)),command:uo,desc:"Delete tenant",handler:async e=>{lo("handler",uo,e);const{hg:t,json:n,apikey:o,env:s,tenant:r}=e,{clientApiBaseUri:a}=t;let i,c=O();try{if("default"===r)throw new Error('It\'s not possible to delete "default" tenant!');i=ce(`Deleting tenant ${r} schedules`),!n&&c.start(ce(`In progress: ${i}...`,"secondary")),await(async({debug:e,baseUri:t,env:n,apikey:o,tenant:s})=>{const r={"x-api-key":o},a=new URL(`${t}/tenant/${n}/${s}?schedules_only=true`).toString();e&&e("uri:",a);const{data:i}=await S.delete(a,{headers:r});return i})({debug:lo,baseUri:a,env:s,apikey:o,tenant:r}),!n&&c.succeed(ce(`Finished: ${i}.`,"secondary")),i=ce("Verifying user and authorizing"),!n&&c.start(ce(`In progress: ${i}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:l}=await Ue({debug:lo,baseUri:a,task:"tenant-delete",env:s,tenant:r,apikey:o});!n&&c.succeed(ce(`Finished: ${i}.`,"secondary"));const d=new j.S3({accessKeyId:e,secretAccessKey:t,sessionToken:l});for(i=ce(`Deleting tenant ${r} for environment ${ce(s,"info")}`),!n&&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(!n&&c.succeed(ce(`Finished: ${i}.`,"secondary")),n)pe({statu:"success",tenantDeleted:r});else{const e=new E({head:["Tenant ID"]});e.push([r]),console.log(e.toString())}}catch(e){n?pe({status:"error",error:e}):(c.fail(ce(`Error: ${i}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),lo(e),e&&e.response&&e.response.data&&lo("response",e.response.data)),process.exit(1)}}});const po=ye("commands:tenants:list"),go="list";var yo=Object.freeze({__proto__:null,builder:async e=>(po("builder",go),e.option("tenant",ke.tenant.config)),command:go,desc:"List tenants",handler:async e=>{po("handler",go,e);const{hg:t,json:n,apikey:o,env:s,tenant:r}=e;let a,i=O();try{a=ce(`Retrieving tenants for environment ${ce(s,"info")}`);const e=`${t.clientApiBaseUri}/tenants/${s}${r?`?tenant=${r}`:""}`;po("requesting:",e),!n&&i.start(ce(`In progress: ${a}...`,"secondary"));const{data:c}=await S.get(e,{headers:{"x-api-key":o}});if(!n&&i.succeed(ce(`Finished: ${a}.`,"secondary")),po("response-data",c),!c||0===c.length)return void(n?pe([]):i.info(ce(`Info: ${ce("No tenants found in the specified environment")}.`,"secondary")));if(n)pe(c);else{const e=new E({head:["tenant ID"]});e.push(...c.map(e=>[e])),console.log(e.toString())}}catch(e){n?pe({status:"error",error:e}):(i.fail(ce(`Error: ${a}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),po(e),e&&e.response&&e.response.data&&po("response",e.response.data)),process.exit(1)}}});const ho=ye("commands:tenants:custom-catalog"),mo="custom-catalog",bo=async({debug:e,baseUri:t,apikey:n,env:o,flow:s,tenant:r,isV2Flow:a})=>{try{const i=a?await Ce({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n}):await Pe({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n}),c=[],{accessKeyId:l,secretAccessKey:d,sessionToken:u}=await Ue({debug:e,baseUri:t,task:"field-map-download",env:o,tenant:r,flow:s,apikey:n}),f=new j.S3({accessKeyId:l,secretAccessKey:d,sessionToken:u});for(const{id:e,tap:t}of i){const n={Bucket:o,Key:`${r}/flows/${s}/${a?"connectors":"taps"}/${a?e:t}/catalog.json`};try{await f.headObject(n).promise(),c.push(a?e:t)}catch(e){}}return{tenant:r,connectors:c}}catch(e){return console.error(e),{tenant:r,connectors:[]}}};var wo=Object.freeze({__proto__:null,builder:async e=>(ho("builder",mo),e.option("tenant",ke.tenant.config).option("flow",ke.flow.config).demandOption("flow",ke.flow.demandText)),command:mo,desc:"List tenants with custom catalog in a specific flow",handler:async e=>{ho("handler",mo,e);const{hg:t,json:n,apikey:o,env:s,flow:r}=e;let a,i=O();try{a=ce(`Retrieving tenants for environment ${ce(s,"info")}`),!n&&i.start(ce(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Ne({debug:ho,baseUri:t.clientApiBaseUri,apikey:o,env:s}),Le({debug:ho,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r})]),l=2===c?.version;!n&&i.succeed(ce(`Finished: ${a}.`,"secondary"));const d=[];a=ce(`Querying for custom catalogs for flow ${ce(r,"info")}`),!n&&i.start(ce(`In progress: ${a}...`,"secondary"));for(const n of Ae(e)){const e=await Promise.all(n.map(e=>bo({debug:ho,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,isV2Flow:l})));d.push(...e.filter(({connectors:e})=>e.length>0))}if(!n&&i.succeed(ce(`Finished: ${a}.`,"secondary")),n)pe(d);else{const e=new E({head:["Tenant ID","Connector IDs"]});e.push(...d.map(({tenant:e,connectors:t})=>[e,t.join(", ")])),console.log(e.toString())}}catch(e){n?pe({status:"error",error:e}):(i.fail(ce(`Error: ${a}.`,"secondary")),de(ce(`Message: ${ce(e.message)}`,"secondary")),ho(e),e&&e.response&&e.response.data&&ho("response",e.response.data)),process.exit(1)}}});const $o=ye("commands:tenants:update-config"),vo="update-config",jo=async({debug:e,baseUri:t,apikey:n,env:o,flow:s,tenant:r,connectorId:a,config:i,isV2Flow:c})=>{const l=c?"id":"tap";if(!(c?await Ce({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n,config:!0}):await Pe({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n,config:!0})).find(e=>e[l]===a))return null;const d=c?Ke:Be;try{await d({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n,connectorId:a,config:i})}catch(e){console.log(ce(`Error patching: ${r}. ${e}`,"secondary"))}return r};var ko=Object.freeze({__proto__:null,builder:async e=>($o("builder",vo),e.option("flow",ke.flow.config).demandOption("flow",ke.flow.demandText).option("connector",ke.connector.config).demandOption("connector",ke.connector.demandText).option("configFilePath",ke.configFilePath.config).demandOption("configFilePath",ke.configFilePath.demandText)),command:vo,desc:"Update the config of a specific connector and flow for all tenants",handler:async e=>{$o("handler",vo,e);const{hg:n,json:o,apikey:r,env:a,flow:i,connector:c,configFilePath:l}=e;let d,u=O();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(t(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:$o,baseUri:n.clientApiBaseUri,apikey:r,env:a}),Le({debug:$o,baseUri:n.clientApiBaseUri,apikey:r,env:a,flow:i})]),g=2===p?.version;!o&&u.succeed(ce(`Finished: ${d}.`,"secondary"));const y=[];d=ce(`Updating config for connector ${ce(c,"info")} and flow ${ce(i,"info")}`),!o&&u.start(ce(`In progress: ${d}...`,"secondary"));for(const t of Ae(f)){const o=await Promise.all(t.map(t=>jo({debug:$o,baseUri:n.clientApiBaseUri,apikey:r,env:a,flow:i,tenant:t,connectorId:c,config:e,isV2Flow:g})));y.push(...o.filter(Boolean))}if(!o&&u.succeed(ce(`Finished: ${d}.`,"secondary")),o)pe(y);else{const e=new E({head:["Tenant ID"]});y.forEach(t=>e.push([t])),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")),$o(e),e&&e.response&&e.response.data&&$o("response",e.response.data)),process.exit(1)}}});const _o=[so,co,fo,yo,wo,ko],Eo=ye("commands:tenants"),Oo="tenants <action>";var xo=Object.freeze({__proto__:null,builder:async function(e){Eo("builder",Oo);return(await Ee(e)).command(_o)},command:Oo,desc:"Manage tenants",handler:async function(e){Eo("handler",Oo,e)}});const So=ye("commands:singer:validate"),Io="validate",To=(e,t,n,o)=>{let s=o.type;Array.isArray(s)||(s=[s]);const r=s.filter(e=>"null"!==e)[0];if(!s.includes("null")||null!==n){if("string"===r&&"string"!=typeof n)throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type string.`);if("number"===r&&"number"!=typeof n)throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type number.`);if("boolean"===r&&"boolean"!=typeof n)throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type boolean.`);if("array"===r&&!Array.isArray(n))throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type array.`);if("object"===r&&"object"!=typeof n)throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type object.`)}},Ao=(e,t,n)=>{const o=t.stream;if(!o)throw new Error("Schema record is missing stream name");if(!t.schema)throw new Error(`Schema record for ${o} is missing schema field`);if(e[o]){for(const n of t.key_properties)if(!e[o].keyProperties.includes(n))throw new Error(`Schema for ${o} has different key properties: ${e[o].keyProperties.join(", ")} and ${t.key_properties.join(", ")}`);const n=e[o].schema;((e,t,n)=>{for(const[o,s]of Object.entries(t.properties))if(n.properties[o]){const t=n.properties[o].type,r=s.type;if(t.length!=r.length||t.some(e=>!r.includes(e)))throw new Error(`Schema for ${e} has different typing for field ${o}: ${t} and ${r}`)}})(o,t.schema,n)}else e[o]={schema:t.schema,keyProperties:t.key_properties||[],keySet:new Set,count:0};return((e,t,n)=>{for(const[o,s]of Object.entries(t.properties)){let t=s.type;Array.isArray(t)||(t=[t]);const r=t.filter(e=>"null"!==e);if(r.length>1&&!n)throw new Error(`Schema for ${e} has multiple non-null types for field ${o}: ${r.join(", ")}`)}})(o,t.schema,n),e},Fo=(e,t,n)=>{const o=t.stream,s=t.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 t of r){if(!s[t])throw new Error(`Record for ${o} is missing key property ${t}`);e[o].keySet.add(s[t])}if(r.length>0&&!n){const t=T.createHash("sha256").update(r.map(e=>`${e}:${s[e]}`).join("")).digest("hex");if(e[o].keySet.has(t))throw new Error(`Duplicate record for ${o} with primary keys: ${r.map(e=>`${e}: ${s[e]}`).join(", ")}`);e[o].keySet.add(t)}((e,t,n)=>{for(const[o,s]of Object.entries(t)){const t=n.properties[o];if(!t)throw new Error(`Record for ${e} has unknown field ${o}`);To(e,o,s,t)}})(o,s,e[o].schema),e[o].count++},Uo=(e,t)=>{if(!t.value)throw new Error("State record is missing value");if("object"!=typeof t.value)throw new Error(`State record has invalid type ${typeof t.value} for value. Expected type object.`)},No=async(t,n)=>{const o={},{allowDuplicateRecords:s,allowFuzzyTypes:r}=n;for await(const a of async function*(t){const n=e.createReadStream(t,{encoding:"utf8"});let o="";for await(const e of n){const t=(o+e).split("\n");o=t.pop();for(const e of t)e.trim()&&(yield JSON.parse(e))}o.trim()&&(yield JSON.parse(o))}(t))try{if(!a.type)throw new Error(`Singer row is missing type: ${JSON.stringify(a)}`);"SCHEMA"==a.type?Ao(o,a,r):"RECORD"==a.type?Fo(o,a,s):"STATE"==a.type&&Uo(0,a)}catch(e){throw n.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 Do=Object.freeze({__proto__:null,builder:async e=>(So("builder",Io),e.option("dataFilePath",{...ke.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:Io,desc:"Validate Singer data",handler:async t=>{So("handler",Io,t);const{allowDuplicateRecords:n,allowFuzzyTypes:o,dataFilePath:s,json:r}=t,a={allowDuplicateRecords:n,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 No(s,a);r?console.log(JSON.stringify({streams:Object.keys(e).map(t=>({stream:t,count:e[t].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(t=>`\n ${t}: ${e[t].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 Ro=[Do],Po=ye("commands:singer"),Co="singer <action>";var Bo=Object.freeze({__proto__:null,builder:async function(e){Po("builder",Co);return(await e).command(Ro)},command:Co,desc:"Develop and test singer taps and targets",handler:async function(e){Po("handler",Co,e)}});const Ko=[je,at,vt,It,Pn,Jn,eo,xo,Bo];process.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE="1";ae({});const Mo=u(process.argv.slice(2));Mo.usage(ce("Usage: $0 <command>")).command(Ko).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(Mo.terminalWidth(),90)).parse(process.argv.slice(M()+1),Z);
34
+ */(e),s="string"==typeof e,r=function(e){const t=[],n=Object.create(null);let o=!0;Object.keys(e).forEach(function(n){t.push([].concat(e[n],n))});for(;o;){o=!1;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++){if(t[e].filter(function(e){return-1!==t[n].indexOf(e)}).length){t[e]=t[e].concat(t[n]),t.splice(n,1),o=!0;break}}}return t.forEach(function(e){const t=(e=e.filter(function(e,t,n){return n.indexOf(e)===t})).pop();void 0!==t&&"string"==typeof t&&(n[t]=e)}),n}(Object.assign(Object.create(null),n.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},n.configuration),i=Object.assign(Object.create(null),n.default),c=n.configObjects||[],l=n.envPrefix,d=a["populate--"],u=d?"--":"_",f=Object.create(null),p=Object.create(null),g=n.__||q.format,y={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(n.array||[]).filter(Boolean).forEach(function(e){const t="object"==typeof e?e.key:e,n=Object.keys(e).map(function(e){return{boolean:"bools",string:"strings",number:"numbers"}[e]}).filter(Boolean).pop();n&&(y[n][t]=!0),y.arrays[t]=!0,y.keys.push(t)}),[].concat(n.boolean||[]).filter(Boolean).forEach(function(e){y.bools[e]=!0,y.keys.push(e)}),[].concat(n.string||[]).filter(Boolean).forEach(function(e){y.strings[e]=!0,y.keys.push(e)}),[].concat(n.number||[]).filter(Boolean).forEach(function(e){y.numbers[e]=!0,y.keys.push(e)}),[].concat(n.count||[]).filter(Boolean).forEach(function(e){y.counts[e]=!0,y.keys.push(e)}),[].concat(n.normalize||[]).filter(Boolean).forEach(function(e){y.normalize[e]=!0,y.keys.push(e)}),"object"==typeof n.narg&&Object.entries(n.narg).forEach(([e,t])=>{"number"==typeof t&&(y.nargs[e]=t,y.keys.push(e))}),"object"==typeof n.coerce&&Object.entries(n.coerce).forEach(([e,t])=>{"function"==typeof t&&(y.coercions[e]=t,y.keys.push(e))}),void 0!==n.config&&(Array.isArray(n.config)||"string"==typeof n.config?[].concat(n.config).filter(Boolean).forEach(function(e){y.configs[e]=!0}):"object"==typeof n.config&&Object.entries(n.config).forEach(([e,t])=>{"boolean"!=typeof t&&"function"!=typeof t||(y.configs[e]=t)})),function(...e){e.forEach(function(e){Object.keys(e||{}).forEach(function(e){y.aliases[e]||(y.aliases[e]=[].concat(r[e]||[]),y.aliases[e].concat(e).forEach(function(t){if(/-/.test(t)&&a["camel-case-expansion"]){const n=J(t);n!==e&&-1===y.aliases[e].indexOf(n)&&(y.aliases[e].push(n),f[n]=!0)}}),y.aliases[e].concat(e).forEach(function(t){if(t.length>1&&/[A-Z]/.test(t)&&a["camel-case-expansion"]){const n=function(e,t){const n=e.toLowerCase();t=t||"-";let o="";for(let s=0;s<e.length;s++){const r=n.charAt(s),a=e.charAt(s);o+=r!==a&&s>0?`${t}${n.charAt(s)}`:a}return o}(t,"-");n!==e&&-1===y.aliases[e].indexOf(n)&&(y.aliases[e].push(n),f[n]=!0)}}),y.aliases[e].forEach(function(t){y.aliases[t]=[e].concat(y.aliases[e].filter(function(e){return t!==e}))}))})})}(n.key,r,n.default,y.arrays),Object.keys(i).forEach(function(e){(y.aliases[e]||[]).forEach(function(t){i[t]=i[e]})});let b=null;Object.keys(y.counts).find(e=>U(e,y.arrays)?(b=Error(g("Invalid configuration: %s, opts.count excludes opts.array.",e)),!0):!!U(e,y.nargs)&&(b=Error(g("Invalid configuration: %s, opts.count excludes opts.narg.",e)),!0));let w=[];const $=Object.assign(Object.create(null),{_:[]}),v={};for(let e=0;e<o.length;e++){const t=o[e],n=t.replace(/^-{3,}/,"---");let s,r,i,c,l,d;if("--"!==t&&R(t))j(t);else{if(n.match(/---+(=|$)/)){j(t);continue}if(t.match(/^--.+=/)||!a["short-option-groups"]&&t.match(/^-.+=/))c=t.match(/^--?([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&(U(c[1],y.arrays)?e=_(e,c[1],o,c[2]):!1!==U(c[1],y.nargs)?e=k(e,c[1],o,c[2]):E(c[1],c[2],!0));else if(t.match(m)&&a["boolean-negation"])c=t.match(m),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],E(r,!!U(r,y.arrays)&&[!1]));else if(t.match(/^--.+/)||!a["short-option-groups"]&&t.match(/^-[^-]+/))c=t.match(/^--?(.+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],U(r,y.arrays)?e=_(e,r,o):!1!==U(r,y.nargs)?e=k(e,r,o):(l=o[e+1],void 0===l||l.match(/^-/)&&!l.match(h)||U(r,y.bools)||U(r,y.counts)?/^(true|false)$/.test(l)?(E(r,l),e++):E(r,C(r)):(E(r,l),e++)));else if(t.match(/^-.\..+=/))c=t.match(/^-([^=]+)=([\s\S]*)$/),null!==c&&Array.isArray(c)&&c.length>=3&&E(c[1],c[2]);else if(t.match(/^-.\..+/)&&!t.match(h))l=o[e+1],c=t.match(/^-(.\..+)/),null!==c&&Array.isArray(c)&&c.length>=2&&(r=c[1],void 0===l||l.match(/^-/)||U(r,y.bools)||U(r,y.counts)?E(r,C(r)):(E(r,l),e++));else if(t.match(/^-[^-]+/)&&!t.match(h)){i=t.slice(1,-1).split(""),s=!1;for(let n=0;n<i.length;n++){if(l=t.slice(n+2),i[n+1]&&"="===i[n+1]){d=t.slice(n+3),r=i[n],U(r,y.arrays)?e=_(e,r,o,d):!1!==U(r,y.nargs)?e=k(e,r,o,d):E(r,d),s=!0;break}if("-"!==l){if(/[A-Za-z]/.test(i[n])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(l)&&!1===U(l,y.bools)){E(i[n],l),s=!0;break}if(i[n+1]&&i[n+1].match(/\W/)){E(i[n],l),s=!0;break}E(i[n],C(i[n]))}else E(i[n],l)}r=t.slice(-1)[0],s||"-"===r||(U(r,y.arrays)?e=_(e,r,o):!1!==U(r,y.nargs)?e=k(e,r,o):(l=o[e+1],void 0===l||/^(-|--)[^-]/.test(l)&&!l.match(h)||U(r,y.bools)||U(r,y.counts)?/^(true|false)$/.test(l)?(E(r,l),e++):E(r,C(r)):(E(r,l),e++)))}else if(t.match(/^-[0-9]$/)&&t.match(h)&&U(t.slice(1),y.bools))r=t.slice(1),E(r,C(r));else{if("--"===t){w=o.slice(e+1);break}if(a["halt-at-non-option"]){w=o.slice(e);break}j(t)}}}function j(e){const t=S("_",e);"string"!=typeof t&&"number"!=typeof t||$._.push(t)}function k(e,t,n,o){let s,r=U(t,y.nargs);if(r="number"!=typeof r||isNaN(r)?1:r,0===r)return P(o)||(b=Error(g("Argument unexpected for: %s",t))),E(t,C(t)),e;let i=P(o)?0:1;if(a["nargs-eats-options"])n.length-(e+1)+i<r&&(b=Error(g("Not enough arguments following: %s",t))),i=r;else{for(s=e+1;s<n.length&&(!n[s].match(/^-[^0-9]/)||n[s].match(h)||R(n[s]));s++)i++;i<r&&(b=Error(g("Not enough arguments following: %s",t)))}let c=Math.min(i,r);for(!P(o)&&c>0&&(E(t,o),c--),s=e+1;s<c+e+1;s++)E(t,n[s]);return e+c}function _(e,t,n,o){let r=[],c=o||n[e+1];const l=U(t,y.nargs);if(U(t,y.bools)&&!/^(true|false)$/.test(c))r.push(!0);else if(P(c)||P(o)&&/^-/.test(c)&&!h.test(c)&&!R(c)){if(void 0!==i[t]){const e=i[t];r=Array.isArray(e)?e:[e]}}else{P(o)||r.push(O(t,o,!0));for(let o=e+1;o<n.length&&!(!a["greedy-arrays"]&&r.length>0||l&&"number"==typeof l&&r.length>=l)&&(c=n[o],!/^-/.test(c)||h.test(c)||R(c));o++)e=o,r.push(O(t,c,s))}return"number"==typeof l&&(l&&r.length<l||isNaN(l)&&0===r.length)&&(b=Error(g("Not enough arguments following: %s",t))),E(t,r),e}function E(e,t,n=s){if(/-/.test(e)&&a["camel-case-expansion"]){const t=e.split(".").map(function(e){return J(e)}).join(".");x(e,t)}const o=O(e,t,n),r=e.split(".");if(N($,r,o),y.aliases[e]&&y.aliases[e].forEach(function(e){const t=e.split(".");N($,t,o)}),r.length>1&&a["dot-notation"]&&(y.aliases[r[0]]||[]).forEach(function(t){let n=t.split(".");const s=[].concat(r);s.shift(),n=n.concat(s),(y.aliases[e]||[]).includes(n.join("."))||N($,n,o)}),U(e,y.normalize)&&!U(e,y.arrays)){[e].concat(y.aliases[e]||[]).forEach(function(e){Object.defineProperty(v,e,{enumerable:!0,get:()=>t,set(e){t="string"==typeof e?q.normalize(e):e}})})}}function x(e,t){y.aliases[e]&&y.aliases[e].length||(y.aliases[e]=[t],f[t]=!0),y.aliases[t]&&y.aliases[t].length||x(t,e)}function O(e,t,n){n&&(t=function(e){return"string"!=typeof e||"'"!==e[0]&&'"'!==e[0]||e[e.length-1]!==e[0]?e:e.substring(1,e.length-1)}(t)),(U(e,y.bools)||U(e,y.counts))&&"string"==typeof t&&(t="true"===t);let o=Array.isArray(t)?t.map(function(t){return S(e,t)}):S(e,t);return U(e,y.counts)&&(P(o)||"boolean"==typeof o)&&(o=V()),U(e,y.normalize)&&U(e,y.arrays)&&(o=Array.isArray(t)?t.map(e=>q.normalize(e)):q.normalize(t)),o}function S(e,t){if(!a["parse-positional-numbers"]&&"_"===e)return t;if(!U(e,y.strings)&&!U(e,y.bools)&&!Array.isArray(t)){(null!=(n=t)&&("number"==typeof n||!!/^0x[0-9a-f]+$/i.test(n)||!/^0[^.]/.test(n)&&/^[-]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(n))&&a["parse-numbers"]&&Number.isSafeInteger(Math.floor(parseFloat(`${t}`)))||!P(t)&&U(e,y.numbers))&&(t=Number(t))}var n;return t}function I(e,t){Object.keys(e).forEach(function(n){const o=e[n],s=t?t+"."+n:n;"object"==typeof o&&null!==o&&!Array.isArray(o)&&a["dot-notation"]?I(o,s):(!A($,s.split("."))||U(s,y.arrays)&&a["combine-arrays"])&&E(s,o)})}function T(e,t){if(void 0===l)return;const n="string"==typeof l?l:"",o=q.env();Object.keys(o).forEach(function(s){if(""===n||0===s.lastIndexOf(n,0)){const r=s.split("__").map(function(e,t){return 0===t&&(e=e.substring(n.length)),J(e)});(t&&y.configs[r.join(".")]||!t)&&!A(e,r)&&E(r.join("."),o[s])}})}function F(e,t,n,o=!1){Object.keys(n).forEach(function(s){A(e,s.split("."))||(N(e,s.split("."),n[s]),o&&(p[s]=!0),(t[s]||[]).forEach(function(t){A(e,t.split("."))||N(e,t.split("."),n[s])}))})}function A(e,t){let n=e;a["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach(function(e){n=n[e]||{}});const o=t[t.length-1];return"object"==typeof n&&o in n}function N(e,t,n){let o=e;a["dot-notation"]||(t=[t.join(".")]),t.slice(0,-1).forEach(function(e){e=W(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=W(t[t.length-1]),r=U(t.join("."),y.arrays),i=Array.isArray(n);let c=a["duplicate-arguments-array"];!c&&U(s,y.nargs)&&(c=!0,(!P(o[s])&&1===y.nargs[s]||Array.isArray(o[s])&&o[s].length===y.nargs[s])&&(o[s]=void 0)),n===V()?o[s]=V(o[s]):Array.isArray(o[s])?c&&r&&i?o[s]=a["flatten-duplicate-arrays"]?o[s].concat(n):(Array.isArray(o[s][0])?o[s]:[o[s]]).concat([n]):c||Boolean(r)!==Boolean(i)?o[s]=o[s].concat([n]):o[s]=n:void 0===o[s]&&r?o[s]=i?n:[n]:!c||void 0===o[s]||U(s,y.counts)||U(s,y.bools)?o[s]=n:o[s]=[o[s],n]}function U(e,t){const n=[].concat(y.aliases[e]||[],e),o=Object.keys(t),s=n.find(e=>o.includes(e));return!!s&&t[s]}function D(e){const t=Object.keys(y);return[].concat(t.map(e=>y[e])).some(function(t){return Array.isArray(t)?t.includes(e):t[e]})}function R(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 t,n=!0;const o=e.slice(1).split("");for(let s=0;s<o.length;s++){if(t=e.slice(s+2),!D(o[s])){n=!1;break}if(o[s+1]&&"="===o[s+1]||"-"===t||/[A-Za-z]/.test(o[s])&&/^-?\d+(\.\d*)?(e-?\d+)?$/.test(t)||o[s+1]&&o[s+1].match(/\W/))break}return n}(e))return!1;return!function(e,...t){return[].concat(...t).some(function(t){const n=e.match(t);return n&&D(n[1])})}(e,/^-+([^=]+?)=[\s\S]*$/,m,/^-+([^=]+?)$/,/^-+([^=]+?)-$/,/^-+([^=]+?\d+)$/,/^-+([^=]+?)\W+.*$/)}(e)}function C(e){return U(e,y.bools)||U(e,y.counts)||!(`${e}`in i)?(t=function(e){let t=M.BOOLEAN;return U(e,y.strings)?t=M.STRING:U(e,y.numbers)?t=M.NUMBER:U(e,y.bools)?t=M.BOOLEAN:U(e,y.arrays)&&(t=M.ARRAY),t}(e),{[M.BOOLEAN]:!0,[M.STRING]:"",[M.NUMBER]:void 0,[M.ARRAY]:[]}[t]):i[e];var t}function P(e){return void 0===e}return T($,!0),T($,!1),function(e){const t=Object.create(null);F(t,y.aliases,i),Object.keys(y.configs).forEach(function(n){const o=e[n]||t[n];if(o)try{let e=null;const t=q.resolve(q.cwd(),o),s=y.configs[n];if("function"==typeof s){try{e=s(t)}catch(t){e=t}if(e instanceof Error)return void(b=e)}else e=q.require(t);I(e)}catch(t){"PermissionDenied"===t.name?b=t:e[n]&&(b=Error(g("Invalid JSON config file: %s",o)))}})}($),void 0!==c&&c.forEach(function(e){I(e)}),F($,y.aliases,i,!0),function(e){let t;const n=new Set;Object.keys(e).forEach(function(o){if(!n.has(o)&&(t=U(o,y.coercions),"function"==typeof t))try{const s=S(o,t(e[o]));[].concat(y.aliases[o]||[],o).forEach(t=>{n.add(t),e[t]=s})}catch(e){b=e}})}($),a["set-placeholder-key"]&&function(e){y.keys.forEach(t=>{~t.indexOf(".")||void 0===e[t]&&(e[t]=void 0)})}($),Object.keys(y.counts).forEach(function(e){A($,e.split("."))||E(e,0)}),d&&w.length&&($[u]=[]),w.forEach(function(e){$[u].push(e)}),a["camel-case-expansion"]&&a["strip-dashed"]&&Object.keys($).filter(e=>"--"!==e&&e.includes("-")).forEach(e=>{delete $[e]}),a["strip-aliased"]&&[].concat(...Object.keys(r).map(e=>r[e])).forEach(e=>{a["camel-case-expansion"]&&e.includes("-")&&delete $[e.split(".").map(e=>J(e)).join(".")],delete $[e]}),{aliases:Object.assign({},y.aliases),argv:Object.assign(v,$),configuration:a,defaulted:Object.assign({},p),error:b,newAliases:Object.assign({},f)}}}({cwd:process.cwd,env:()=>G,format:f,normalize:c,resolve:i,require:e=>{if("undefined"!=typeof require)return require(e);if(e.match(/\.json$/))return JSON.parse(t(e,"utf8"));throw Error("only .json config files are supported in ESM")}});var Q={fs:{readFileSync:t,writeFile:n},format:f,resolve:i,exists:e=>{try{return o(e).isFile()}catch(e){return!1}}};let H;class Z{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 t=e.shift();let n=function(){};return"function"==typeof e[e.length-1]&&(n=e.pop()),n=n||function(){},this.cache[this.locale]||this._readLocaleFile(),!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]=t,this._enqueueWrite({directory:this.directory,locale:this.locale,cb:n})):n(),H.format.apply(H.format,[this.cache[this.locale][t]||t].concat(e))}__n(){const e=Array.prototype.slice.call(arguments),t=e.shift(),n=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?t:n;if(this.cache[this.locale][t]){r=this.cache[this.locale][t][1===o?"one":"other"]}!this.cache[this.locale][t]&&this.updateFiles?(this.cache[this.locale][t]={one:t,other:n},this._enqueueWrite({directory:this.directory,locale:this.locale,cb:s})):s();const a=[r];return~r.indexOf("%d")&&a.push(o),H.format.apply(H.format,a.concat(e))}setLocale(e){this.locale=e}getLocale(){return this.locale}updateLocale(e){this.cache[this.locale]||this._readLocaleFile();for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(this.cache[this.locale][t]=e[t])}_taggedLiteral(e,...t){let n="";return e.forEach(function(e,o){const s=t[o+1];n+=e,void 0!==s&&(n+="%s")}),this.__.apply(this,[n].concat([].slice.call(t,1)))}_enqueueWrite(e){this.writeQueue.push(e),1===this.writeQueue.length&&this._processWriteQueue()}_processWriteQueue(){const e=this,t=this.writeQueue[0],n=t.directory,o=t.locale,s=t.cb,r=this._resolveLocaleFile(n,o),a=JSON.stringify(this.cache[o],null,2);H.fs.writeFile(r,a,"utf-8",function(t){e.writeQueue.shift(),e.writeQueue.length>0&&e._processWriteQueue(),s(t)})}_readLocaleFile(){let e={};const t=this._resolveLocaleFile(this.directory,this.locale);try{H.fs.readFileSync&&(e=JSON.parse(H.fs.readFileSync(t,"utf-8")))}catch(n){if(n instanceof SyntaxError&&(n.message="syntax error in "+t),"ENOENT"!==n.code)throw n;e={}}this.cache[this.locale]=e}_resolveLocaleFile(e,t){let n=H.resolve(e,"./",t+".json");if(this.fallbackToLanguage&&!this._fileExistsSync(n)&&~t.lastIndexOf("_")){const o=H.resolve(e,"./",t.split("_")[0]+".json");this._fileExistsSync(o)&&(n=o)}return n}_fileExistsSync(e){return H.exists(e)}}let X;try{X=g(import.meta.url)}catch(e){X=process.cwd()}X.split("node_modules")[0]||process.cwd(),process.cwd,process.exit,process.nextTick,void 0!==process.stdout.columns&&process.stdout.columns,function(e,t){H=t;const n=new Z(e);n.__.bind(n),n.__n.bind(n),n.setLocale.bind(n),n.getLocale.bind(n),n.updateLocale.bind(n),n.locale}({directory:i(X,"../../../locales"),updateFiles:!1},Q);const ee={hg:{appName:"hotglue",clientApiBaseUri:process.env.HOTGLUE_CLIENT_API_BASE_URI||"https://api.hotglue.com",defaultConfigFileName:"config.yaml"}},te={},ne=()=>a.resolve(d(),`.${ee.hg.appName}`,ee.hg.defaultConfigFileName),oe=async()=>{const{appName:e}=ee.hg;try{return await j(e).load(ne())||{}}catch(e){return{}}},se=async()=>{const{appName:e}=ee.hg,t=j(e,{searchPlaces:[`${e}.yaml`,`.${e}.yaml`,`.${e}rc.yaml`,`.${e}rc.yml`,`.${e}rc`,`.${e}rc.json`,`.${e}rc.js`]});try{return await t.search()||{}}catch(e){throw console.log(e),new Error(`Malformed configuration file: ${e.message}`)}},re={primary:e=>k.whiteBright(e),secondary:e=>k.white(e),info:e=>k.green(e),warn:e=>k.yellow(e),error:e=>k.redBright(e),success:e=>k.greenBright(e)};let ae=re,ie="primary";function ce(e){return ae={...re,...e},ge}function le(e){process.stdout.write(e)}const de=(e,t=ie)=>{if(!e)return"";if("string"==typeof e)return ae[t]?ae[t](e):ae[ie](e);const n=p(e,{colors:!0});return ae[t]?ae[t](n):n};function ue(...e){return console.log(...e),ge}function fe(e,t){return le(de(e,t)),le("\n"),ge}function pe(e,t){return le(de(e,t)),ge}const ge={cl:ue,pr:fe,pp:pe,setTheme:ce,setDefault:function(e="primary"){return ae[e]&&(ie=e),ge}},ye=e=>{console.log(JSON.stringify(e))},he=E("hotglue-cli");function me(e){return he.extend(e)}const be=me("commands:config:set"),we="set <setting> <value>";var $e=Object.freeze({__proto__:null,builder:async e=>(be("builder",we,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:we,desc:"Set configuration key-value pairs",handler:async e=>{be("handler",we,e);const{json:t,setting:n,value:o}=e;if(["apikey"].includes(n))try{const e=await oe();e&&e.config?!t&&pe("Updating profile config file..."):!t&&pe("Creating profile config file...");const s=e&&e.config?{...e.config,[n]:o}:{[n]:o},r=x.stringify(s),i=e&&e.filepath?e.filepath:ne();await(async(e,t)=>{await y(a.dirname(e),{recursive:!0}),await h(e,t)})(i,r),t?ye({status:"success"}):pe("Done").pr()}catch(e){t?ye({status:"error",error:e}):console.log(e)}else t?ye({status:"error",error:"Invalid settings parameter"}):console.error("Invalid settings parameter")}});const ve=[$e],je=me("commands:config"),ke="config [action]";var _e=Object.freeze({__proto__:null,builder:async function(e){return je("builder",ke),e.command(ve)},command:ke,desc:"Configure your hotglue CLI",handler:async function(e){je("handler",ke,e);const{action:t}=e;if(!t)try{const e=await oe();e.config&&0!==Object.keys(e.config).length||fe("No profile configuration found. Run config set to configure the hotglue CLI.");const t=new O({head:["Setting","Value","Config File","Type"]});e.config&&Object.entries(e.config).forEach(([n,o])=>t.push([n,o,e.filepath,"Profile"]));const n=await se();n.config&&Object.entries(n.config).forEach(([e,o])=>t.push([e,o,a.relative(process.cwd(),n.filepath),"Project"])),t.length>0&&console.log(t.toString())}catch(e){throw console.log(e),e}}}),Ee={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:""},includeConfigs:{config:{describe:"Include configs in the download folder (source-config.json, target-config.json, tenant-config.json)",type:"boolean",default:!1},demandText:""}};const xe=me("base"),Oe=async e=>{xe("builder");const t=await(async()=>{const e=await oe(),t=await se();return{...te,...e.config,...t.config}})();return e.option("apikey",Ee.apikey.config).option("env",Ee.env.config).option("json",Ee.json.config).config(t).demandOption(["env"],Ee.env.demandText).demandOption(["apikey"],Ee.apikey.demandText).strictCommands()},Se=me("utils.js"),Ie=async(e,t,n=[])=>{const{includeSymLinks:o,recursive:s,filter:r}=t,{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()?n.push(a.resolve(c,e.name)):e.isDirectory()&&s&&await Ie(a.resolve(c,e.name),t,n):Se("skip",r))}return n},Te=async(e,t)=>{const n={includeSymLinks:!1,recursive:!1,filter:{},...t},{pattern:o}=n.filter;return o&&(n.filter.matcher=I.matcher(o,{dot:!0})),Ie(e,n)},Fe=(e,t)=>{Se("filter-in",e);const{pattern:n}={...t};let o=e;return n&&(o=I(o,n)),Se("filter-out",o),o};const Ae=e=>{const t=[];return new Promise((n,o)=>{e.on("error",o),e.on("data",e=>t.push(Buffer.from(e))),e.on("end",()=>n(Buffer.concat(t).toString("utf8")))})},Ne=(e,t=10)=>{const n=[];for(let o=0;o<e.length;o+=t){const s=e.slice(o,o+t);n.push(s)}return n},Ue=async({debug:e,baseUri:t,env:n,apiKey:o})=>{const s=new URL(`${t}/${n}/resetAvailableEntities`),{data:r}=await T.delete(s,{headers:{"x-api-key":o,"Content-type":"application/json"}});e({data:r})},De=async({debug:e,baseUri:t,task:n,env:o,apikey:s,...r})=>{const a=new URL(`${t}/credentials/${n}/${o}`);r&&Object.entries(r).forEach(([e,t])=>{a.searchParams.set(e,t)});const i=a.toString();e&&e("uri:",i);const{data:c}=await T.get(i,{headers:{"x-api-key":s}}),{accessKeyId:l,secretAccessKey:d,sessionToken:u}=c;return{accessKeyId:l,secretAccessKey:d,sessionToken:u}},Re=async({debug:e,baseUri:t,env:n,apikey:o})=>{const s=`${t}/tenants/${n}`;e("requesting:",s);const{data:r}=await T.get(s,{headers:{"x-api-key":o}});return e("response-data",r),r},Ce=async({debug:e,baseUri:t,env:n,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${t}/${n}/${o}/supportedSources`).toString();e&&e("uri:",a);const{data:i}=await T.get(a,{headers:r});return i},Pe=async({debug:e,baseUri:t,env:n,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${t}/v2/${n}/${o}/supportedConnectors`).toString();e&&e("uri:",a);const{data:i}=await T.get(a,{headers:r});return i},Be=async({debug:e,baseUri:t,env:n,flow:o,tenant:s,apikey:r,config:a})=>{const i=new URL(`${t}/${n}/${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 T.get(l,{headers:c});return d},Me=async({debug:e,baseUri:t,env:n,flow:o,tenant:s,apikey:r,config:a})=>{const i=new URL(`${t}/v2/${n}/${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 T.get(l,{headers:c});return d},Ke=async({debug:e,baseUri:t,env:n,flow:o,tenant:s,apikey:r,connectorId:a,config:i})=>{const c={"x-api-key":r},l=new URL(`${t}/${n}/${o}/${s}/linkedSources`).toString(),d={tap:a,config:i};e&&e("uri:",l);const{data:u}=await T.patch(l,d,{headers:c});return u},Le=async({debug:e,baseUri:t,env:n,flow:o,tenant:s,apikey:r,connectorId:a,config:i})=>{const c={"x-api-key":r},l=new URL(`${t}/v2/${n}/${o}/${s}/linkedConnectors`).toString(),d={connector_id:a,config:i};e&&e("uri:",l);const{data:u}=await T.patch(l,d,{headers:c});return u},ze=async({debug:e,baseUri:t,env:n,apikey:o})=>{const s={"x-api-key":o},r=new URL(`${t}/${n}/flows/supported`).toString();e&&e("uri:",r);const{data:a}=await T.get(r,{headers:s});return a},Je=async({debug:e,baseUri:t,env:n,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${t}/${n}/flows/${o}/supported`).toString();e&&e("uri:",a);const{data:i}=await T.get(a,{headers:r});return i},qe=async({debug:e,baseUri:t,env:n,apikey:o,from:s,to:r,count:a=1e4,...i})=>{const c={"x-api-key":o},l="string"==typeof a?parseInt(a,10):a;let d=[],u=0,f=1,p=!0;for(;p;){const o=new URL(`${t}/${n}/jobs`);o.searchParams.set("from",s),r&&o.searchParams.set("to",r),o.searchParams.set("count",l.toString()),o.searchParams.set("page",f.toString()),i&&Object.entries(i).forEach(([e,t])=>{null!=t&&"count"!==e&&"page"!==e&&o.searchParams.set(e,t)}),o.searchParams.set("include_export_details","false"),o.searchParams.set("skip_cache","true");const a=o.toString();e&&e(`Fetching page ${f}, uri:`,a);const{data:g}=await T.get(a,{headers:c});e&&e(`Page ${f} response:`,{jobsCount:g.jobs?.length||0,total:g.total||0});const y=g.jobs||[];d=d.concat(y),1===f&&(u=g.total||0),y.length<l?p=!1:f++}return e&&e(`Fetched ${d.length} jobs across ${f} page(s)`),{jobs:d,total:u}},Ve=async({debug:e,baseUri:t,env:n,apikey:o,tenant:s,flow:r,...a})=>{const i={"x-api-key":o},c=new URL(`${t}/${n}/${r}/${s}/jobs/retrigger`).toString(),l=a;e&&e("uri:",c),e&&e("payload:",l);const{data:d}=await T.post(c,l,{headers:i});return d},We=async({debug:e,baseUri:t,env:n,flow:o,user_id:s,apikey:r,schedule_expression:a,state:i,job_type:c,connector_id:l,extra_args:d})=>{const u={"x-api-key":r},f=new URL(`${t}/${n}/${o}/${s}/jobs/schedule`).toString(),p={schedule_expression:a,state:i};c&&(p.job_type=c),l&&(p.connector_id=l),d&&Object.assign(p,d),e&&e("uri:",f),e&&e("body:",p);const{data:g}=await T.put(f,p,{headers:u});return g},Ye=async({debug:e,baseUri:t,env:n,flow:o,user_id:s,apikey:r,job_root:a,include_export_details:i=!1})=>{const c=new URL(`${t}/${n}/${o}/${s}/jobs/status`);c.searchParams.set("job_root",a),c.searchParams.set("include_export_details",i?"true":"false");const l={"x-api-key":r},d=c.toString();e&&e("uri:",d);const{data:u}=await T.get(d,{headers:l});return u},Ge=E("commands:env:validators"),Qe=async(e,t,n,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 Ce({debug:Ge,baseUri:t,env:s,flow:e.id,apikey:n})))).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,t)=>a.indexOf(e)!==t);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`)},He=async(e,t,n,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:t,env:n,flow:o,apikey:s})=>{const r={"x-api-key":s},a=new URL(`${t}/${n}/${o}/supportedTargets`).toString();e&&e("uri:",a);const{data:i}=await T.get(a,{headers:r});return i})({debug:Ge,baseUri:t,env:s,flow:e.id,apikey:n});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,t)=>a.indexOf(e)!==t);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`)},Ze=async(e,t,n,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 Pe({debug:Ge,baseUri:t,env:s,flow:e.id,apikey:n})))).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,t)=>a.indexOf(e)!==t);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`)},Xe=me("commands:env:deploy"),et="deploy";var tt=Object.freeze({__proto__:null,builder:async e=>(Xe("builder",et),e.option("sourceFolder",Ee.sourceFolder.config).demandOption("sourceFolder",Ee.sourceFolder.demandText)),command:et,desc:"Deploy Environment settings",handler:async e=>{Xe("handler",et,e);const{hg:t,json:n,apikey:o,env:s,sourceFolder:r}=e,{clientApiBaseUri:i}=t,c=a.resolve(process.cwd(),r);let l,d=S();try{l=de(`Scanning ${de(c,"info")} for deployable files`),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const e=await Te(c,{filter:{pattern:"((**/requirements.txt)|(**/availableSources.json)|(**/availableTargets.json)|(**/availableConnectors.json)|(**/customTaps.json))"}});if(0===e.length)return void(n?ye({status:"error",error:"There are no files to deploy at the specified location!"}):(d.fail(de(`Error: ${l}.`,"secondary")),fe(de(`Message: ${de("There are no files to deploy at the specified location!")}`,"secondary"))));!n&&d.succeed(de(`Finished: ${l}.`,"secondary"));for(const t of e)if(t.endsWith(".json"))try{const e=await b(t,{encoding:"utf-8"});JSON.parse(e)}catch(e){throw new Error(`File ${t} is not a valid JSON: ${String(e)}`)}const t=await ze({debug:Xe,baseUri:i,env:s,apikey:o});for(const n of e){if(n.endsWith("availableSources.json")){const e=JSON.parse(await b(n,{encoding:"utf-8"}));await Qe(e,i,o,t,s)}if(n.endsWith("availableTargets.json")){const e=JSON.parse(await b(n,{encoding:"utf-8"}));await He(e,i,o,t,s)}if(n.endsWith("availableConnectors.json")){const e=JSON.parse(await b(n,{encoding:"utf-8"}));await Ze(e,i,o,t,s)}}l=de("Verifying user and authorizing"),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const{accessKeyId:r,secretAccessKey:u,sessionToken:f}=await De({debug:Xe,baseUri:i,task:"env-deploy",env:s,apikey:o});!n&&d.succeed(de(`Finished: ${l}.`,"secondary"));const p=new _.S3({accessKeyId:r,secretAccessKey:u,sessionToken:f});l=de("Deploying environment files"),!n&&d.info(de(`Info: ${l}.`,"secondary"));const g="config/",y=new O({head:["File","Status"]});for await(const t of e){const e=a.basename(t);l=de(`Pushing file: ${de(e,"info")}`),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const r={Bucket:s,Key:`${g}${e}`,Body:await b(t)},c=await p.putObject(r).promise();!n&&d.succeed(de(`Finished: ${l}.`,"secondary")),Xe("s3-put-res",c),y.push([e,"Deployed"]),await Ue({debug:Xe,baseUri:i,env:s,apiKey:o})}n?ye({status:"success",deployedFiles:e}):ue(y.toString())}catch(e){!n&&d.fail(de(`Error: ${l}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),Xe(e),e&&e.response&&e.response.data&&Xe("response",e.response.data),process.exit(1)}}});const nt=me("commands:env:download"),ot="download";var st=Object.freeze({__proto__:null,builder:async e=>(nt("builder",ot),e.option("downloadTo",Ee.downloadTo.config)),command:ot,desc:"Download Environment settings",handler:async e=>{nt("handler",ot,e);const{hg:t,json:n,apikey:o,env:s,downloadTo:r}=e,{clientApiBaseUri:i}=t,c=a.resolve(process.cwd(),r);let l,d=S();try{l=de("Verifying user and authorizing"),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:r}=await De({debug:nt,baseUri:i,task:"env-download",env:s,apikey:o});!n&&d.succeed(de(`Finished: ${l}.`,"secondary"));const u=new _.S3({accessKeyId:e,secretAccessKey:t,sessionToken:r});l=de(`Scanning environment ${de(s,"info")}`),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const f={Bucket:s,Prefix:"config/"},{Contents:p}=await u.listObjectsV2(f).promise();!n&&d.succeed(de(`Finished: ${l}.`,"secondary")),nt("s3-files",p);const g=p?Fe(p.map(e=>e.Key),{pattern:"((*/requirements.txt)|(*/availableSources.json)|(*/availableTargets.json)|(*/availableConnectors.json)|(*/customTaps.json))"}):[];if(!g||0===g.length)return void(n?ye({status:"success",downloadedFiles:[]}):d.warn(de(`Warning: ${de("Nothing to download!")}`,"secondary")));l=de(`Downloading to ${de(c,"info")}`),!n&&d.info(de(`Info: ${l}.`,"secondary"));const m=new O({head:["File","Status"]});for await(const e of g){const t=a.basename(e),o=a.resolve(c,t);nt("local-file",o),await y(a.dirname(o),{recursive:!0}),l=de(`Downloading file: ${de(t,"info")}`),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const r=u.getObject({Bucket:s,Key:e}).createReadStream();await h(o,await Ae(r)),!n&&d.succeed(de(`Finished: ${l}.`,"secondary")),m.push([t,"Downloaded"])}n?ye({status:"success",downloadedFiles:g}):ue(m.toString())}catch(e){n?ye({status:"error",error:e}):(d.fail(de(`Error: ${l}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),nt(e),e&&e.response&&e.response.data&&nt("response",e.response.data)),process.exit(1)}}});const rt=[tt,st],at=me("commands:env"),it="env <action>";var ct=Object.freeze({__proto__:null,builder:async function(e){at("builder",it);return(await Oe(e)).command(rt)},command:it,desc:"Manage environment settings",handler:async function(e){at("handler",it,e)}});const lt=async(e,t,n,o)=>{try{const s=e.getObject({Bucket:t,Key:`${n}/flows/${o}/flow.json`}).createReadStream(),r=await Ae(s);return 2===JSON.parse(r).version}catch(e){return!1}},dt=async(e,t,n,o,s=void 0)=>s??await lt(e,t,n,o)?"connectors":"taps",ut=me("commands:etl:delete"),ft="delete";var pt=Object.freeze({__proto__:null,builder:async e=>(ut("builder",ft),e.option("flow",Ee.flow.config).demandOption("flow",Ee.flow.demandText).option("tap",Ee.tap.config).demandOption("tap",Ee.tap.demandText).option("tenant",{...Ee.tenant.config}).demandOption("tenant",Ee.tenant.demandText)),command:ft,desc:"Delete ETL scripts",handler:async e=>{ut("handler",ft,e);const{hg:t,json:n,apikey:o,env:s,flow:r,tap:a,tenant:i}=e,{clientApiBaseUri:c}=t;let l,d=S();try{l=de(`Deleting ETL scripts for Tenant ${de(i,"info")} Flow ${de(r,"info")} and Tap ${de(a,"info")} to ${de(s,"info")}`),!n&&d.info(de(`Info: ${l}.`,"secondary")),l=de("Verifying user and authorizing"),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:u}=await De({debug:ut,baseUri:c,task:"etl-deploy",env:s,tenant:i,flow:r,tap:a,apikey:o}),f=new _.S3({accessKeyId:e,secretAccessKey:t,sessionToken:u});!n&&d.succeed(de(`Finished: ${l}.`,"secondary")),l=de("Deleting ETL scripts"),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const p=`${i}/flows/${r}/${await dt(f,s,i,r)}/${a}/etl/`,g=await f.listObjectsV2({Bucket:s,Prefix:p}).promise();if(ut("s3-list-objects-res",g),g.Contents?.length>0){const e=await f.deleteObjects({Bucket:s,Delete:{Objects:g.Contents.map(e=>({Key:e.Key}))}}).promise();ut("s3-list-objects-res",e)}const y=await f.deleteObject({Bucket:s,Key:p}).promise();if(ut("s3-delete-object-res",y),!n&&d.succeed(de(`Finished: ${l}.`,"secondary")),g.Contents?.length>0){const e=new O({head:["File","Status"]});g.Contents.filter(({Key:e})=>e!==p).forEach(({Key:t})=>{const n=t.split("/"),o=n[n.length-1];e.push([o,de("Deleted","info")])}),n?ye({status:"success",deletedObjects:(g.Contents??[]).map(({Key:e})=>e)}):ue(e.toString())}else l=de("There was no file or folder to be deleted"),n?ye({status:"success",deletedObjects:[]}):d.info(de(`Info: ${l}.`,"secondary"))}catch(e){n?ye({status:"error",error:e}):(d.fail(de(`Error: ${l}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),ut(e),e&&e.response&&e.response.data&&ut("response",e.response.data)),process.exit(1)}}});const gt=me("commands:etl:deploy"),yt="deploy";var ht=Object.freeze({__proto__:null,builder:async e=>(gt("builder",yt),e.option("flow",Ee.flow.config).demandOption("flow",Ee.flow.demandText).option("tap",Ee.tap.config).option("all",Ee.all.config).option("tenant",{...Ee.tenant.config,default:"default"}).option("sourceFolder",Ee.sourceFolder.config).demandOption("sourceFolder",Ee.sourceFolder.demandText)),command:yt,desc:"Deploy ETL scripts",handler:async e=>{gt("handler",yt,e);const{hg:t,json:n,apikey:o,env:s,flow:r,tap:i,all:c,tenant:l,sourceFolder:d}=e,{clientApiBaseUri:u}=t;if(!c&&!i)throw new Error(`${Ee.tap.demandText} Or you can pass the --all flag to run this command for all taps/connectors.`);let f,p=S();const g=a.resolve(process.cwd(),d);try{f=de(`Deploying script for Tenant ${de(l,"info")} Flow ${de(r,"info")}${i?` and Tap ${de(i,"info")}`:""} to ${de(s,"info")}`),!n&&p.info(de(`Info: ${f}.`,"secondary"));const e=await Te(g,{recursive:!0,filter:{pattern:"!((**/sync-output)|(**/etl-output)|(**/snapshots))"}});if(0===e.length)return void(n?ye({status:"error",error:"There are no files to deploy at the specified location!"}):p.fail(de(`Error: ${de("There are no files to deploy at the specified location!")}.`,"secondary")));(e=>{const t=["config.json","source-config.json","target-config.json","catalog.json","target-catalog.json","state.json"],n=["sync-output","snapshots","etl-output",".venv"];for(const o of e){if(t.includes(o))throw new Error(`File ${o} is a reserved file name and cannot be used in the ETL script.`);const e=n.find(e=>o.startsWith(`${e}/`));if(e)throw new Error(`Directory ${e} is a reserved directory name and cannot be used in the ETL script.`)}})(e.map(e=>a.relative(d,e))),f=de("Verifying user and authorizing"),!n&&p.start(de(`In progress: ${f}...`,"secondary"));const t={debug:gt,baseUri:u,task:"etl-deploy",env:s,tenant:l,flow:r,apikey:o};i&&(t.tap=i);const{accessKeyId:c,secretAccessKey:y,sessionToken:h}=await De(t);!n&&p.succeed(de(`Finished: ${f}.`,"secondary"));const m=new _.S3({accessKeyId:c,secretAccessKey:y,sessionToken:h}),w=await lt(m,s,l,r);f=de("Validating flow and tap location"),!n&&p.start(de(`In progress: ${f}...`,"secondary"));const $=(await ze({debug:gt,baseUri:u,apikey:o,env:s})).find(({id:e})=>e===r);let v=[];try{if("default"===l||$?.type){if(v=((w?await Pe({debug:gt,baseUri:u,env:s,flow:r,apikey:o}):await Ce({debug:gt,baseUri:u,env:s,flow:r,apikey:o}))??[]).filter(e=>!i||e[w?"id":"tap"]===i),i&&0===v.length)throw new Error("Tap is not supported")}else{if(v=((w?await Me({debug:gt,baseUri:u,env:s,flow:r,tenant:l,apikey:o}):await Be({debug:gt,baseUri:u,env:s,flow:r,tenant:l,apikey:o}))??[]).filter(e=>!i||e[w?"id":"tap"]===i),i&&0===v.length)throw new Error("Tap is not linked")}}catch(e){throw gt("err",e),new Error("Target location doesn't exist. Check your tenant, flow and tap arguments.")}!n&&p.succeed(de(`Finished: ${f}.`,"secondary"));const j=new O({head:["File","Status"]});for(const t of v){const o=t[w?"id":"tap"];f=de(`Preparing ${o} deployment target`),!n&&p.start(de(`In progress: ${f}...`,"secondary"));const i=`${l}/flows/${r}/${await dt(null,null,null,null,w)}/${o}/etl/`,{Contents:c}=await m.listObjectsV2({Bucket:s,Prefix:`${i}`}).promise();!n&&p.succeed(de(`Finished: ${f}.`,"secondary")),gt("contents",c);const u=c.map(e=>({Key:e.Key}));if(u.length>0){f=de(`Removing old ${o} ETL files`),!n&&p.start(de(`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)}`,de("Deleted","warn")])),!n&&p.succeed(de(`Finished: ${f}.`,"secondary"))}for await(const t of e){const e="win32"===process.platform?a.relative(d,t).replace(/\\/g,"/"):a.relative(d,t),r=`${i}${e}`;f=de(`Deploying file: ${de(`${o}/${e}`,"info")}`),!n&&p.start(de(`In progress: ${f}...`,"secondary"));const c={Bucket:s,Key:r,Body:await b(t)},l=await m.putObject(c).promise();!n&&p.succeed(de(`Finished: ${f}.`,"secondary")),gt("s3-put-res",l),j.push([`${o}/${e}`,de("Deployed","info")])}}n?ye({status:"success",deployedFiles:e}):ue(j.toString())}catch(e){n?ye({status:"error",error:e}):(p.fail(de(`Error: ${f}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),gt(e),e&&e.response&&e.response.data&&gt("response",e.response.data)),process.exit(1)}}});const mt=me("commands:etl:download"),bt="download";var wt,$t=Object.freeze({__proto__:null,builder:async e=>(mt("builder",bt),e.option("flow",Ee.flow.config).demandOption("flow",Ee.flow.demandText).option("tap",Ee.tap.config).demandOption("tap",Ee.tap.demandText).option("downloadTo",Ee.downloadTo.config).demandOption("downloadTo",Ee.downloadTo.demandText).option("tenant",{...Ee.tenant.config,default:"default"}).option("overwrite",Ee.overwrite.config).demandOption("overwrite",Ee.overwrite.demandText)),command:bt,desc:"Download ETL scripts",handler:async e=>{mt("handler",bt,e);const{hg:t,json:n,apikey:o,env:r,flow:i,tap:c,tenant:l,downloadTo:d,overwrite:u}=e,{clientApiBaseUri:f}=t;let p,g=S();const m=a.resolve(process.cwd(),d);try{p=de("Verifying user and authorizing"),!n&&g.start(de(`In progress: ${p}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:d}=await De({debug:mt,baseUri:f,task:"etl-download",env:r,tenant:l,flow:i,tap:c,apikey:o}),b=new _.S3({accessKeyId:e,secretAccessKey:t,sessionToken:d});!n&&g.succeed(de(`Finished: ${p}.`,"secondary")),p=de("Scanning for downloadable files"),!n&&g.start(de(`In progress: ${p}...`,"secondary"));const $=`${l}/flows/${i}/${await dt(b,r,l,i)}/${c}/etl/`,v={Bucket:r,Prefix:$},{Contents:j}=await b.listObjectsV2(v).promise();!n&&g.succeed(de(`Finished: ${p}.`,"secondary")),mt("s3-list-res",j);const k=j?Fe(j.map(e=>e.Key),{pattern:"!(.ipynb_checkpoints/*)"}):[];if(!k||0===k.length)return void(n?ye({status:"success",downloadedFiles:[]}):g.warn(de(`Warning: ${de("Nothing to download!")}`,"secondary")));p=de(`Downloading script files to ${de(m,"info")}`),!n&&g.info(de(`Info: ${p}.`,"secondary"));const E=new O({head:["File","Status"]});for await(const e of k){const t=e.substring($.length),o=a.resolve(m,t);if(mt("file",o),e.endsWith("/")){!s(o)&&await y(o,{recursive:!0});continue}if(!u)try{await w(o),mt("exists, skipping"),E.push([t,"Skipped"]);continue}catch(e){"ENOENT"!==e.code&&ue(e)}p=de(`Downloading file: ${de(t,"info")}`),!n&&g.start(de(`In progress: ${p}...`,"secondary")),await y(a.dirname(o),{recursive:!0});const i=b.getObject({Bucket:r,Key:e}).createReadStream();await h(o,await Ae(i)),!n&&g.succeed(de(`Finished: ${p}.`,"secondary")),E.push([t,"Downloaded"])}n?ye({status:"success",downloadedFiles:k}):ue(E.toString())}catch(e){n?ye({status:"error",error:e}):(g.fail(de(`Error: ${p}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),mt(e),e&&e.response&&e.response.data&&mt("response",e.response.data)),process.exit(1)}}}),vt={exports:{}},jt={exports:{}},kt={exports:{}},_t={exports:{}};var Et,xt={exports:{}},Ot={exports:{}};var St,It,Tt={exports:{}};function Ft(){return It||(It=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if((0,o.default)(e))return function(e){var t=-1,n=e.length;return function(){return++t<n?{value:e[t],key:t}:null}}(e);var t=(0,r.default)(e);return t?function(e){var t=-1;return function(){var n=e.next();return n.done?null:(t++,{value:n.value,key:t})}}(t):(n=e,s=n?Object.keys(n):[],a=-1,i=s.length,function e(){var t=s[++a];return"__proto__"===t?e():a<i?{value:n[t],key:t}:null});var n,s,a,i};var n=function(){return Et||(Et=1,e=Ot,t=Ot.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e&&"number"==typeof e.length&&e.length>=0&&e.length%1==0},e.exports=t.default),Ot.exports;var e,t}(),o=a(n),s=function(){return St||(St=1,e=Tt,t=Tt.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return e[Symbol.iterator]&&e[Symbol.iterator]()},e.exports=t.default),Tt.exports;var e,t}(),r=a(s);function a(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default}(xt,xt.exports)),xt.exports}var At,Nt={exports:{}};var Ut,Dt={},Rt={exports:{}},Ct={exports:{}};var Pt,Bt,Mt,Kt={};function Lt(){return Bt||(Bt=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if((0,r.isAsync)(e))return function(...t){const n=t.pop();return i(e.apply(this,t),n)};return(0,o.default)(function(t,n){var o;try{o=e.apply(this,t)}catch(e){return n(e)}if(o&&"function"==typeof o.then)return i(o,n);n(null,o)})};var n=function(){return Ut||(Ut=1,e=Ct,t=Ct.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(...t){var n=t.pop();return e.call(this,t,n)}},e.exports=t.default),Ct.exports;var e,t}(),o=a(n),s=a(function(){if(Pt)return Kt;Pt=1,Object.defineProperty(Kt,"__esModule",{value:!0}),Kt.fallback=s,Kt.wrap=r;var e,t=Kt.hasQueueMicrotask="function"==typeof queueMicrotask&&queueMicrotask,n=Kt.hasSetImmediate="function"==typeof setImmediate&&setImmediate,o=Kt.hasNextTick="object"==typeof process&&"function"==typeof process.nextTick;function s(e){setTimeout(e,0)}function r(e){return(t,...n)=>e(()=>t(...n))}return e=t?queueMicrotask:n?setImmediate:o?process.nextTick:s,Kt.default=r(e),Kt}()),r=zt();function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){return e.then(e=>{c(t,null,e)},e=>{c(t,e&&(e instanceof Error||e.message)?e:new Error(e))})}function c(e,t,n){try{e(t,n)}catch(e){(0,s.default)(e=>{throw e},e)}}e.exports=t.default}(Rt,Rt.exports)),Rt.exports}function zt(){if(Mt)return Dt;Mt=1,Object.defineProperty(Dt,"__esModule",{value:!0}),Dt.isAsyncIterable=Dt.isAsyncGenerator=Dt.isAsync=void 0;var e,t=Lt(),n=(e=t)&&e.__esModule?e:{default:e};function o(e){return"AsyncFunction"===e[Symbol.toStringTag]}return Dt.default=function(e){if("function"!=typeof e)throw new Error("expected a function");return o(e)?(0,n.default)(e):e},Dt.isAsync=o,Dt.isAsyncGenerator=function(e){return"AsyncGenerator"===e[Symbol.toStringTag]},Dt.isAsyncIterable=function(e){return"function"==typeof e[Symbol.asyncIterator]},Dt}var Jt,qt,Vt,Wt={exports:{}},Yt={exports:{}};function Gt(){return Jt||(Jt=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0});t.default={},e.exports=t.default}(Yt,Yt.exports)),Yt.exports}function Qt(){return Vt||(Vt=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=function(){return wt||(wt=1,e=_t,t=_t.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){function t(...t){if(null!==e){var n=e;e=null,n.apply(this,t)}}return Object.assign(t,e),t},e.exports=t.default),_t.exports;var e,t}(),o=u(n),s=u(Ft()),r=function(){return At||(At=1,e=Nt,t=Nt.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(...t){if(null===e)throw new Error("Callback was already called.");var n=e;e=null,n.apply(this,t)}},e.exports=t.default),Nt.exports;var e,t}(),a=u(r),i=zt(),c=(qt||(qt=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n,s){let r=!1,a=!1,i=!1,c=0,l=0;function d(){c>=t||i||r||(i=!0,e.next().then(({value:e,done:t})=>{if(!a&&!r){if(i=!1,t)return r=!0,void(c<=0&&s(null));c++,n(e,l,u),l++,d()}}).catch(f))}function u(e,t){if(c-=1,!a)return e?f(e):!1===e?(r=!0,void(a=!0)):t===o.default||r&&c<=0?(r=!0,s(null)):void d()}function f(e){a||(i=!1,r=!0,s(e))}d()};var n,o=(n=Gt())&&n.__esModule?n:{default:n};e.exports=t.default}(Wt,Wt.exports)),Wt.exports),l=u(c),d=u(Gt());function u(e){return e&&e.__esModule?e:{default:e}}t.default=e=>(t,n,r)=>{if(r=(0,o.default)(r),e<=0)throw new RangeError("concurrency limit cannot be less than 1");if(!t)return r(null);if((0,i.isAsyncGenerator)(t))return(0,l.default)(t,e,n,r);if((0,i.isAsyncIterable)(t))return(0,l.default)(t[Symbol.asyncIterator](),e,n,r);var c=(0,s.default)(t),u=!1,f=!1,p=0,g=!1;function y(e,t){if(!f)if(p-=1,e)u=!0,r(e);else if(!1===e)u=!0,f=!0;else{if(t===d.default||u&&p<=0)return u=!0,r(null);g||h()}}function h(){for(g=!0;p<e&&!u;){var t=c();if(null===t)return u=!0,void(p<=0&&r(null));p+=1,n(t.value,t.key,(0,a.default)(y))}g=!1}h()},e.exports=t.default}(kt,kt.exports)),kt.exports}var Ht,Zt={exports:{}};var Xt,en,tn,nn={exports:{}};function on(){return Xt||(Xt=1,e=nn,t=nn.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(t||(t=e.length),!t)throw new Error("arity is undefined");return function(...n){return"function"==typeof n[t-1]?e.apply(this,n):new Promise((o,s)=>{n[t-1]=(e,...t)=>{if(e)return s(e);o(t.length>1?t:t[0])},e.apply(this,n)})}},e.exports=t.default),nn.exports;var e,t}function sn(){return en||(en=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=i(Qt()),o=function(){return Ht||(Ht=1,e=Zt,t=Zt.exports,Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return(t,n,o)=>e(t,o)},e.exports=t.default),Zt.exports;var e,t}(),s=i(o),r=i(zt()),a=i(on());function i(e){return e&&e.__esModule?e:{default:e}}t.default=(0,a.default)(function(e,t,o,a){return(0,n.default)(t)(e,(0,s.default)((0,r.default)(o)),a)},4),e.exports=t.default}(jt,jt.exports)),jt.exports}var rn=N((tn||(tn=1,function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=s(sn()),o=s(on());function s(e){return e&&e.__esModule?e:{default:e}}t.default=(0,o.default)(function(e,t,o){return(0,n.default)(e,1,t,o)},3),e.exports=t.default}(vt,vt.exports)),vt.exports));const an=me("commands:etl:setup-local-run"),cn=e=>{if(e instanceof Error){const t={message:e.message,name:e.name,stack:e.stack};return e.response&&(t.response={status:e.response.status,statusText:e.response.statusText,data:e.response.data}),Object.keys(e).forEach(n=>{t[n]||(t[n]=e[n])}),t}return e},ln="setup-local-run <jobroot>",dn=async(e,t,n,o)=>{let s=S(),r=de(`Scanning for downloadable files (${e})`);!o&&s.start(de(`In progress: ${r}...`,"secondary"));try{const a={Bucket:e,Prefix:n};let i,c=[],l=!0,d=0;for(;l;){d+=1;const e={...a};i&&(e.ContinuationToken=i);const n=await t.listObjectsV2(e).promise();an(`Page ${d} response:`,{keyCount:n.Contents?.length||0,isTruncated:n.IsTruncated,hasNextToken:!!n.NextContinuationToken}),n.Contents&&n.Contents.length>0&&(c=c.concat(n.Contents)),l=!0===n.IsTruncated,i=n.NextContinuationToken,!o&&d>1&&(s.text=de(`In progress: ${r}... (found ${c.length} files so far)`,"secondary"))}return an("Total files found:",c.length,"across",d,"pages"),0===c.length?(o||(s.fail(de(`Error: ${r}.`,"secondary")),fe(de(`Message: ${de("Nothing to download!")}`,"secondary"))),[]):(c.forEach(n=>{n.BucketName=e,n.S3Instance=t}),!o&&s.succeed(de(`Finished: ${r}. Found ${c.length} file${1!==c.length?"s":""}`,"secondary")),c)}catch(e){o?ye({status:"error",error:cn(e)}):(s.fail(de(`Error: ${r}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),an(e),e&&e.response&&e.response.data&&an("response",e.response.data)),process.exit(1)}},un=async(e,t,n,o,s)=>{let r=S(),i=de("Creating .env file");!s&&r.start(de(`In progress: ${i}...`,"secondary"));try{let l={TENANT:t.tenant??"",FLOW:t.flow_id??"",ENV_ID:t.env_id??"",JOB_ID:t.job_id??"",API_URL:"https://api.hotglue.com",JOB_ROOT:t.s3_root??"",ROOT_DIR:n,JOB_TYPE:t.job_type??"",CONNECTOR_ID:t.connector_id??"",TAP:t.tap??"",TARGET:t.target??""};if(o&&(l.API_KEY=e.api_key),!(null==(c=e.custom_env_vars)||Array.isArray(c)&&0===c.length))for(const t of e.custom_env_vars)l[t.name]=t.value;const d=a.resolve(n,".env");await h(d,Object.entries(l).map(([e,t])=>`${e}=${t}`).join("\n")),!s&&r.succeed(de(`Finished: ${i}.`,"secondary"))}catch(e){s?ye({status:"error",error:cn(e)}):(r.fail(de(`Error: ${i}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),an(e),e&&e.response&&e.response.data&&an("response",e.response.data)),process.exit(1)}var c};var fn=Object.freeze({__proto__:null,builder:async e=>(an("builder",ln),e.option("downloadTo",{...Ee.downloadTo.config,default:"."}).option("overwrite",{...Ee.overwrite.config,default:!1}).option("include-configs",{...Ee.includeConfigs.config,default:!1})),command:ln,desc:"Setup job data to run ETL locally",handler:async e=>{an("handler",ln,e);let{hg:t,json:n,apikey:o,env:i,jobroot:c,downloadTo:l,overwrite:d,includeConfigs:u}=e;const{clientApiBaseUri:f}=t;let p;c.endsWith("/")&&(c=c.slice(0,-1));let g=S();const m="."!==l?a.resolve(process.cwd(),l):a.resolve(process.cwd());try{p=de("Verifying user and authorizing"),!n&&g.start(de(`In progress: ${p}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:l}=await De({debug:an,baseUri:f,task:"job-download",env:i,apikey:o,jobroot:c}),w=new _.S3({accessKeyId:e,secretAccessKey:t,sessionToken:l});!n&&g.succeed(de(`Finished: ${p}.`,"secondary")),p=de("Fetching environment config"),!n&&g.start(de(`In progress: ${p}...`,"secondary"));const j=await(async({debug:e,baseUri:t,env:n,apikey:o})=>{const s=new URL(`${t}/${n}/config`);s.searchParams.set("secret","true");const r=s.toString();e&&e("uri:",r);const{data:a}=await T.get(r,{headers:{"x-api-key":o}});return a})({debug:an,baseUri:f,env:i,apikey:o});!n&&g.succeed(de(`Finished: ${p}.`,"secondary")),p=de(`Fetching job files (${i})`),!n&&g.start(de(`In progress: ${p}...`,"secondary"));let k=await dn(i,w,c,n);!n&&g.succeed(de(`Finished: ${p}.`,"secondary"));const E=j.cache_bucket_name;let x=null;if(E){p=de(`Found custom cache bucket (${E}). Setting up custom cache S3 instance...`),!n&&g.start(de(`In progress: ${p}...`,"secondary"));const e=j.cache_bucket_access_key_id,t=j.cache_bucket_secret_access_key;x=new _.S3({accessKeyId:e,secretAccessKey:t}),!n&&g.succeed(de(`Finished: ${p}.`,"secondary"));let o=await dn(E,x,c,n);k=[...k,...o]}p=de("Filtering job files"),!n&&g.start(de(`In progress: ${p}...`,"secondary"));const I=((e,t,n)=>e.filter(({Key:e})=>{if(n)return!0;const o=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`${o}/([^/]+)-config.json`).test(e),r=new RegExp(`${o}/snapshots/tenant-config.json`).test(e);return!(s||r)}))(k,c,u);if(!n&&g.succeed(de(`Finished: ${p}.`,"secondary")),!n){const e=new O({head:["File","Size","LastModified"]});I.forEach(t=>{const n=t.Key.substring(c.length+1);e.push([n,t.Size,t.LastModified.toLocaleString("en-US")])}),console.log(e.toString())}const{downloadedFiles:F,skippedFiles:A}=await(async(e,t,n,o,i)=>{let c,l=S(),d=[],u=[];try{const f=t.length;let p=0;return await rn(t,async t=>{p+=1;let g=t.Key.substring(e.length+1);g=g.replace(/^etl-output\//,"etl-output-reference/"),g=g.replace(/^catalog-selected\.json$/,"catalog.json"),g=g.replace(/^state\.json$/,"source-state.json"),c=de(`Downloading ${g} (${p}/${f})`),!n&&l.start(de(`In progress: ${c}...`,"secondary"));const h=a.resolve(o,g);if(an("file",h),s(h)&&!i)return d.push(g),void(!n&&l.warn(de(`Warning: ${g} already exists in the local directory. Skipping download.`,"secondary")));await y(a.dirname(h),{recursive:!0});const m=t.S3Instance.getObject({Bucket:t.BucketName,Key:t.Key}).createReadStream(),b=r(h,{flags:"w"});let w=0;return m.on("data",e=>{w+=e.length;const o=(w/t.Size*100).toFixed(2);!n&&(l.text=de(`In progress: ${c} ${o}% complete (${(w/1024/1024).toFixed(2)} MB / ${(t.Size/1024/1024).toFixed(2)} MB)`,"secondary"))}),m.pipe(b),new Promise((e,t)=>{const o=async e=>{if(m.destroyed||m.destroy(),b.destroyed||b.destroy(),e&&s(h))try{await v(h),an(`Cleaned up partial file: ${h}`)}catch(e){an(`Failed to delete partial file ${h}:`,e)}};b.on("finish",()=>{u.push(g),!n&&l.succeed(`Successfully downloaded to ${g}`),e()}),m.on("error",async e=>{!n&&l.fail(`Download failed: ${e.message}`),await o(e),t(e)}),b.on("error",async e=>{!n&&l.fail(`File system error: ${e.message}`),await o(e),t(e)})})}),c=de("Downloading job files."),!n&&l.succeed(de(`Finished: ${c}`,"secondary")),{downloadedFiles:u,skippedFiles:d}}catch(e){n?ye({status:"error",error:cn(e)}):(l.fail(de(`Error: ${c}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),an(e),e&&e.response&&e.response.data&&an("response",e.response.data)),process.exit(1)}})(c,I,n,m,d),N=a.resolve(m,"job-details.json");if(!s(N)){const e="No job with that jobroot found, job roots can be copied from the job page and are structured as tenant_id/flows/flow_id/jobs/YYYY/MM/DD/HH/MM/job_i";n?ye({status:"error",error:e}):(g.fail(de(`Error: ${e}`,"secondary")),fe(de(`Message: ${de(e)}`,"secondary"))),process.exit(1)}const U=await b(N,"utf8"),D=JSON.parse(U),R=D.tap,C=D.target,P=a.resolve(m,`${R}-config.json`),B=a.resolve(m,`${C}-config.json`);if(s(P)){const e=P,t="source-config.json";p=de(`Renaming ${e} to ${t}`),!n&&g.start(de(`In progress: ${p}...`,"secondary")),await $(e,a.resolve(m,t)),!n&&g.succeed(de(`Finished: ${p}.`,"secondary"))}if(s(B)){const e=B,t="target-config.json";p=de(`Renaming ${e} to ${t}`),!n&&g.start(de(`In progress: ${p}...`,"secondary")),await $(e,a.resolve(m,t)),!n&&g.succeed(de(`Finished: ${p}.`,"secondary"))}await(async(e,t,n)=>{let o=S(),s=de("Creating state.json file");try{if(null!=e.state&&Object.keys(e.state).length>0){!n&&o.start(de(`In progress: ${s}...`,"secondary"));const r=a.resolve(t,"state.json");await h(r,JSON.stringify(e.state,null,2)),!n&&o.succeed(de(`Finished: ${s}.`,"secondary"))}}catch(e){n?ye({status:"error",error:cn(e)}):(o.fail(de(`Error: ${s}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),an(e),e&&e.response&&e.response.data&&an("response",e.response.data)),process.exit(1)}})(D,m,n),await un(j,D,m,u,n),n?ye({status:"success",downloadedFiles:F,skippedFiles:A}):(p=de("Setting up local job files."),g.succeed(de(`Finished: ${p}`,"secondary")))}catch(e){n?ye({status:"error",error:cn(e)}):(g.fail(de(`Error: ${p}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),an(e),e&&e.response&&e.response.data&&an("response",e.response.data)),process.exit(1)}}});const pn=[pt,ht,$t,fn],gn=me("commands:etl"),yn="etl <action>";var hn=Object.freeze({__proto__:null,builder:async function(e){gn("builder",yn);return(await Oe(e)).command(pn)},command:yn,desc:"Manage ETL scripts",handler:async function(e){gn("handler",yn,e)}});const mn=me("commands:flows:list"),bn="list";var wn=Object.freeze({__proto__:null,builder:async e=>(mn("builder",bn),e.option("tenant",{...Ee.tenant.config})),command:bn,desc:"List flows",handler:async e=>{mn("handler",bn,e);const{hg:t,json:n,apikey:o,env:s,tenant:r}=e,{clientApiBaseUri:a}=t;let i,c=S();try{i=de(`Retrieving ${r?`${de(r,"info")} tenant's`:"the"} flows for environment: ${de(s,"info")}`);const e=`${a}/${s}/flows/${r?`linked?user_id=${r}`:"supported"}`;mn("requesting:",e),!n&&c.start(de(`In progress: ${i}...`,"secondary"));const{data:t}=await T.get(e,{headers:{"x-api-key":o}});if(!n&&c.succeed(de(`Finished: ${i}.`,"secondary")),mn("response-data",t),!t||0===t.length)return void(n?ye([]):c.warn(de(`Warning: ${de("No flows for specified environment and tenant")}.`,"secondary")));if(n)ye(t);else{const e=new O({head:["ID","Name","Flow Type","Taps","Targets","Connectors"]});t.sort((e,t)=>(e.name||"").localeCompare(t.name||"")),t.forEach(t=>{return e.push([t.id,t.name||"",2==t.version?"Bidirectional":t.type?"Target Flow":"Source Flow",(n=t.taps,null==n||Array.isArray(n)&&0===n.length?t.sources?t.sources:[]:t.taps).join("\n"),(t.targets?t.targets:[]).join("\n"),(t.connectors?t.connectors:[]).join("\n")]);var n}),console.log(e.toString())}}catch(e){n?ye({status:"error",error:e}):(c.fail(de(`Error: ${i}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),mn(e),e&&e.response&&e.response.data&&mn("response",e.response.data)),process.exit(1)}}});const $n=[wn],vn=me("commands:flows"),jn="flows <action>";var kn=Object.freeze({__proto__:null,builder:async function(e){vn("builder",jn);return(await Oe(e)).command($n)},command:jn,desc:"Manage flows",handler:async function(e){vn("handler",jn,e)}});const _n=me("commands:jobs:download"),En="download <jobroot>";var xn=Object.freeze({__proto__:null,builder:async e=>(_n("builder",En),e.option("downloadTo",Ee.downloadTo.config)),command:En,desc:"Download Job files",handler:async e=>{_n("handler",En,e);const{hg:t,json:n,apikey:o,env:s,jobroot:i,downloadTo:c}=e,{clientApiBaseUri:l}=t;let d,u=S();try{d=de("Verifying user and authorizing"),!n&&u.start(de(`In progress: ${d}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:f}=await De({debug:_n,baseUri:l,task:"job-download",env:s,apikey:o,jobroot:i}),p=new _.S3({accessKeyId:e,secretAccessKey:t,sessionToken:f});!n&&u.succeed(de(`Finished: ${d}.`,"secondary")),d=de("Scanning for downloadable files"),!n&&u.start(de(`In progress: ${d}...`,"secondary"));const g={Bucket:s,Prefix:i},{Contents:y}=await p.listObjectsV2(g).promise();if(_n("res",y),!y||0===y.length)return void(n?ye({status:"error",error:"Nothing to download!"}):(u.fail(de(`Error: ${d}.`,"secondary")),fe(de(`Message: ${de("Nothing to download!")}`,"secondary"))));if(!n&&u.succeed(de(`Finished: ${d}.`,"secondary")),!n){const e=new O({head:["File","Size","LastModified"]});y.forEach(t=>{const n=t.Key.substring(i.length+1);e.push([n,t.Size,t.LastModified.toLocaleString("en-US")])}),console.log(e.toString())}const h=a.resolve(process.cwd(),c,a.basename(i));await rn(y.filter(({Key:e})=>!new RegExp(`${i}/([^/]+)-config.json`).test(e)),async e=>{d=de(`Downloading file: ${de(e.Key,"info")}`),!n&&u.start(de(`In progress: ${d}...`,"secondary"));const t=a.resolve(h,e.Key.substring(i.length+1));_n("file",t),await F(a.dirname(t),{recursive:!0});const o=p.getObject({Bucket:s,Key:e.Key}).createReadStream(),c=r(t,{flags:"w"});o.pipe(c),!n&&u.succeed(de(`Finished: ${d}.`,"secondary"))}),n?ye({status:"success",downloadedFiles:y.map(({Key:e})=>e)}):(d=de("Downloading job files."),u.succeed(de(`Finished: ${d}`,"secondary")))}catch(e){n?ye({status:"error",error:e}):(u.fail(de(`Error: ${d}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),_n(e),e&&e.response&&e.response.data&&_n("response",e.response.data)),process.exit(1)}}});const On=(...e)=>{me("commands:jobs:list")(...e)},Sn="list";var In=Object.freeze({__proto__:null,builder:async e=>(On("builder",Sn),e.option("flow",Ee.flow.config).demandOption("flow",Ee.flow.demandText).option("tenant",{...Ee.tenant.config,default:"default"}).option("count",Ee.count.config)),command:Sn,desc:"List jobs",handler:async e=>{On("handler",Sn,e);const{hg:t,json:n,apikey:o,env:s,flow:r,tenant:a,count:i}=e,{clientApiBaseUri:c}=t;let l,d=S();try{l=de(`Retrieving jobs for environment: ${de(s,"info")} flow: ${de(r,"info")} tenant: ${de(a,"info")}...`);const e=`${c}/${s}/${r}/${a}/jobs${i?`?count=${i}`:""}`;On("requesting:",e),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const{data:t}=await T.get(e,{headers:{"x-api-key":o}});if(!n&&d.succeed(de(`Finished: ${l}.`,"secondary")),On("response-data",t),!t||0===t.length)return void(n?ye([]):d.warn(de(`Warning: ${de("No jobs for the specified environment, flow and tenant")}.`,"secondary")));if(n)ye(t);else{const e=new O({head:["name","details"]});t.forEach(t=>e.push([t.job_name,JSON.stringify(t,void 0,2)])),console.log(e.toString())}}catch(e){n?ye({status:"error",error:e}):(d.fail(de(`Error: ${l}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),On(e),e&&e.response&&e.response.data&&On("response",e.response.data)),process.exit(1)}}});const Tn=(...e)=>{me("commands:jobs:bulkRun")(...e)},Fn="bulk-run";var An=Object.freeze({__proto__:null,builder:async e=>(Tn("builder",Fn),e.option("file",{describe:"Path to JSON file containing array of jobs to run",type:"string",alias:["f"],demandOption:!0}).demandOption("file","Path to JSON file is required. Example: -f ./jobs.json")),command:Fn,desc:"Run jobs in bulk",handler:async e=>{Tn("handler",Fn,e);const{hg:n,json:o,apikey:r,env:a,file:i}=e,{clientApiBaseUri:c}=n;let l,d=S();try{if(l=de(`Reading jobs file: ${de(i,"info")}`),!o&&d.start(de(`In progress: ${l}...`,"secondary")),!s(i))throw new Error(`File not found: ${i}`);const e=t(i,{encoding:"utf-8"}),n=JSON.parse(e);if(!Array.isArray(n))throw new Error("JSON file must contain an array of job objects");if(0===n.length)return void(o?ye({status:"error",error:"No jobs found in file"}):d.warn(de(`Warning: ${de("No jobs found in file")}.`,"secondary")));for(let e=0;e<n.length;e++){const t=n[e];if(!t.flow)throw new Error(`Job at index ${e} is missing required field: flow`);if(!t.tenant)throw new Error(`Job at index ${e} is missing required field: tenant`)}!o&&d.succeed(de(`Finished: ${l}.`,"secondary")),l=de("Checking flow versions..."),!o&&d.start(de(`In progress: ${l}...`,"secondary"));const u=[...new Set(n.map(e=>e.flow))],f={};await Promise.all(u.map(async e=>{try{const t=await Je({debug:Tn,baseUri:c,apikey:r,env:a,flow:e});f[e]=2===t?.version}catch(t){Tn(`Error checking flow ${e}:`,t),f[e]=!1}})),!o&&d.succeed(de(`Finished: ${l}.`,"secondary")),l=de(`Running ${de(n.length,"info")} job(s)...`),!o&&d.start(de(`In progress: ${l}...`,"secondary"));const p=await Promise.all(n.map(async(e,t)=>{const{flow:n,tenant:o,...s}=e,i=f[n]||!1;try{const e=await(async({debug:e,baseUri:t,env:n,apikey:o,tenant:s,flow:r,...a})=>{const{isV2Flow:i=!1,...c}=a,l={"x-api-key":o},d=new URL(`${t}/${i?"v2/":""}${n}/${r}/${s}/jobs`).toString();e&&e("uri:",d);const{data:u}=await T.post(d,c,{headers:l});return u})({debug:Tn,baseUri:c,env:a,apikey:r,tenant:o,flow:n,isV2Flow:i,...s});return{index:t,flow:n,tenant:o,ok:!0,response:e}}catch(e){let s;if(e.response){const t=e.response.status,n=e.response.statusText,o=e.response.data,r=e.message;Tn("Error response:",{statusCode:t,statusText:n,message:r,data:o}),s={statusCode:t,statusText:n,message:r,data:o}}else e.request?(Tn("Error: No response received",e.message),s={message:e.message,request:e.request}):(Tn("Error:",e.message),s={message:e.message});return{index:t,flow:n,tenant:o,ok:!1,error:s}}}));if(!o&&d.succeed(de(`Finished: ${l}.`,"secondary")),o)ye(p);else{const e=new O({head:["Index","Flow","Tenant","Status","Response/Error"]});p.forEach(t=>{const n=t.ok?"SUCCESS":"FAILED",o=t.ok?JSON.stringify(t.response,void 0,2):JSON.stringify(t.error,void 0,2);e.push([t.index,t.flow,t.tenant,n,o])}),console.log(e.toString());const t=p.filter(e=>e.ok).length,n=p.filter(e=>!e.ok).length;fe(de(`Summary: ${de(String(t),"info")} succeeded, ${de(String(n),"error")} failed out of ${de(String(p.length),"info")} total.`,"secondary"))}}catch(e){o?ye({status:"error",error:e.message,stack:e.stack}):(d.fail(de(`Error: ${l||"Failed to run jobs"}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),Tn(e)),process.exit(1)}}});const Nn=(...e)=>{me("commands:jobs:bulkRetrigger")(...e)},Un="bulk-retrigger";var Dn=Object.freeze({__proto__:null,builder:async e=>(Nn("builder",Un),e.option("file",{describe:"Path to JSON file containing array of jobRoots to retrigger",type:"string",alias:["f"],demandOption:!0}).demandOption("file","Path to JSON file is required. Example: -f ./jobRoots.json")),command:Un,desc:"Retrigger jobs in bulk",handler:async e=>{Nn("handler",Un,e);const{hg:n,json:o,apikey:r,env:a,file:i}=e,{clientApiBaseUri:c}=n;let l,d=S();try{if(l=de(`Reading jobRoots file: ${de(i,"info")}`),!o&&d.start(de(`In progress: ${l}...`,"secondary")),!s(i))throw new Error(`File not found: ${i}`);const e=t(i,{encoding:"utf-8"}),n=JSON.parse(e);if(!Array.isArray(n))throw new Error("JSON file must contain an array of jobRoot strings");if(0===n.length)return void(o?ye({status:"error",error:"No jobRoots found in file"}):d.warn(de(`Warning: ${de("No jobRoots found in file")}.`,"secondary")));for(let e=0;e<n.length;e++)if("string"!=typeof n[e])throw new Error(`JobRoot at index ${e} must be a string, got ${typeof n[e]}`);!o&&d.succeed(de(`Finished: ${l}.`,"secondary"));const u={};for(const e of n){const t=e.split("/");if(t.length<3||"flows"!==t[1])throw new Error(`Invalid jobRoot format: ${e}. Expected format: {tenantId}/flows/{flowId}/...`);const n=t[0],o=t[2],s=`${n}/flows/${o}`;u[s]||(u[s]={tenant:n,flow:o,jobRoots:[]}),u[s].jobRoots.push(e)}const f=Object.keys(u);!o&&fe(de(`Found ${de(String(n.length),"info")} jobRoot(s) grouped into ${de(String(f.length),"info")} tenant/flow group(s).`,"secondary"));const p=async(e,t,n,o=36e5)=>{const s=Date.now();for(;Date.now()-s<o;)try{const o=await Ye({debug:Nn,baseUri:c,env:a,apikey:r,flow:t,user_id:e,job_root:n}),s=o.status||o.state;if("JOB_COMPLETED"===s||"string"==typeof s&&s.endsWith("_FAILED"))return{completed:!0,status:s};await new Promise(e=>setTimeout(e,5e3))}catch(e){Nn(`Error checking job status for ${n}:`,e),await new Promise(e=>setTimeout(e,5e3))}return{completed:!1,status:"TIMEOUT"}};l=de(`Retriggering ${de(String(n.length),"info")} job(s) across ${de(String(f.length),"info")} group(s)...`),!o&&d.start(de(`In progress: ${l}...`,"secondary"));const g=[];if(await Promise.all(f.map(async e=>{const t=u[e],{tenant:n,flow:s,jobRoots:i}=t,l=[];for(let e=0;e<i.length;e++){const t=i[e];try{const u=await Ve({debug:Nn,baseUri:c,env:a,apikey:r,tenant:n,flow:s,job_root:t});if(e<i.length-1){o||(d.text=de(`Waiting for job ${e+1}/${i.length} in group ${n}/${s} to complete...`,"secondary"));(await p(n,s,t)).completed||Nn(`Warning: Job ${t} did not complete within timeout period`)}l.push({tenant:n,flow:s,jobRoot:t,ok:!0,response:u})}catch(e){let o;if(e.response){const t=e.response.status,n=e.response.statusText,s=e.response.data,r=e.message;Nn("Error response:",{statusCode:t,statusText:n,message:r,data:s}),o={statusCode:t,statusText:n,message:r,data:s}}else e.request?(Nn("Error: No response received",e.message),o={message:e.message,request:e.request}):(Nn("Error:",e.message),o={message:e.message});l.push({tenant:n,flow:s,jobRoot:t,ok:!1,error:o})}}g.push(...l)})),!o&&d.succeed(de(`Finished: ${l}.`,"secondary")),o)ye(g);else{const e=new O({head:["Tenant","Flow","Job Root","Status","Response/Error"]});g.forEach(t=>{const n=t.ok?"SUCCESS":"FAILED",o=t.ok?JSON.stringify(t.response,void 0,2):JSON.stringify(t.error,void 0,2);e.push([t.tenant||"N/A",t.flow||"N/A",t.jobRoot||"N/A",n,o])}),console.log(e.toString());const t=g.filter(e=>e.ok).length,n=g.filter(e=>!e.ok).length;fe(de(`Summary: ${de(String(t),"info")} succeeded, ${de(String(n),"error")} failed out of ${de(String(g.length),"info")} total.`,"secondary"))}}catch(e){o?ye({status:"error",error:e.message,stack:e.stack}):(d.fail(de(`Error: ${l||"Failed to retrigger jobs"}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),Nn(e)),process.exit(1)}}});const Rn=(...e)=>{me("commands:jobs:bulkKill")(...e)},Cn="bulk-kill";var Pn=Object.freeze({__proto__:null,builder:async e=>(Rn("builder",Cn),e.option("tenant-ids",{describe:"Comma-separated list of tenant IDs to filter by",type:"string",alias:["tenants"]}).option("flow-ids",{describe:"Comma-separated list of flow IDs to filter by",type:"string",alias:["flows"]}).option("reason",{describe:"Reason for killing the jobs",type:"string"})),command:Cn,desc:"Kill jobs in bulk",handler:async e=>{Rn("handler",Cn,e);const{hg:t,json:n,apikey:o,env:s,tenantIds:r,flowIds:a,reason:i}=e,{clientApiBaseUri:c}=t;let l,d=S();try{const e="JOB_CREATED,SYNC_STARTED,SYNC_SUCCESS,ETL_STARTED,ETL_SUCCESS,EXPORT_STARTED";l=de("Fetching running jobs..."),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const t=new Date,u=new Date(t);u.setMonth(t.getMonth()-1);const f=u.toISOString().split("T")[0],p=await qe({debug:Rn,baseUri:c,env:s,apikey:o,from:f,status:e,count:100});let g=p.jobs||[];const y=p.total||0;if(!n&&d.succeed(de(`Found ${de(y,"info")} job(s) with specified status.`,"secondary")),r){const e=r.split(",").map(e=>e.trim()).filter(e=>e);e.length>0&&(g=g.filter(t=>{const n=t.tenant;return e.includes(n)}))}if(a){const e=a.split(",").map(e=>e.trim()).filter(e=>e);e.length>0&&(g=g.filter(t=>{const n=t.flow_id;return e.includes(n)}))}if(0===g.length)return void(n?ye({status:"info",message:"No jobs found matching the filters"}):d.warn(de(`Warning: ${de("No jobs found matching the specified filters")}.`,"secondary")));l=de(`Killing ${de(g.length,"info")} job(s)...`),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const h=await Promise.all(g.map(async(e,t)=>{const n=e.s3_root,r=e.flow_id,a=e.tenant;if(!n)return{index:t,flow:r,tenant:a,ok:!1,error:{message:"Job root (s3_root) not found in job data"}};try{const e=await(async({debug:e,baseUri:t,env:n,flow:o,user_id:s,apikey:r,job_root:a,reason:i,task_arn:c,skip_webhooks:l})=>{const d=new URL(`${t}/${n}/${o}/${s}/jobs/kill`);d.searchParams.set("job_root",a),i&&d.searchParams.set("reason",i),c&&d.searchParams.set("task_arn",c),l&&d.searchParams.set("skip_webhooks",!0===l?"true":"false");const u={"x-api-key":r},f=d.toString();e&&e("uri:",f);const{data:p}=await T.get(f,{headers:u});return p})({debug:Rn,baseUri:c,env:s,apikey:o,flow:r,user_id:a,job_root:n,reason:i});return{index:t,flow:r,tenant:a,jobRoot:n,ok:!0,response:e}}catch(e){let o;if(e.response){const t=e.response.status,n=e.response.statusText,s=e.response.data,r=e.message;Rn("Error response:",{statusCode:t,statusText:n,message:r,data:s}),o={statusCode:t,statusText:n,message:r,data:s}}else e.request?(Rn("Error: No response received",e.message),o={message:e.message,request:e.request}):(Rn("Error:",e.message),o={message:e.message});return{index:t,flow:r,tenant:a,jobRoot:n,ok:!1,error:o}}}));if(!n&&d.succeed(de(`Finished: ${l}.`,"secondary")),n)ye(h);else{const e=new O({head:["Index","Flow","Tenant","Job Root","Status","Response/Error"]});h.forEach(t=>{const n=t.ok?"SUCCESS":"FAILED",o=t.ok?JSON.stringify(t.response,void 0,2):JSON.stringify(t.error,void 0,2);e.push([t.index,t.flow||"N/A",t.tenant||"N/A",t.jobRoot||"N/A",n,o])}),console.log(e.toString());const t=h.filter(e=>e.ok).length,n=h.filter(e=>!e.ok).length;fe(de(`Summary: ${de(String(t),"info")} succeeded, ${de(String(n),"error")} failed out of ${de(String(h.length),"info")} total.`,"secondary"))}}catch(e){n?ye({status:"error",error:e.message,stack:e.stack}):(d.fail(de(`Error: ${l||"Failed to kill jobs"}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),Rn(e)),process.exit(1)}}});const Bn=(...e)=>{me("commands:jobs:bulkRollback")(...e)},Mn="bulk-rollback";var Kn=Object.freeze({__proto__:null,builder:async e=>(Bn("builder",Mn),e.option("from-utc-iso",{describe:"Start date for job search (YYYY-MM-DD)",type:"string",alias:["from"],demandOption:!0}).demandOption("from-utc-iso","Date from is required. Example: --from-utc-iso 2024-01-01").option("to-utc-iso",{describe:"End date for job search (YYYY-MM-DD)",type:"string",alias:["to"],demandOption:!0}).demandOption("to-utc-iso","Date to is required. Example: --to-utc-iso 2024-01-31").option("tenant-ids",{describe:"Comma-separated list of tenant IDs to filter by",type:"string",alias:["tenants"]}).option("flow-ids",{describe:"Comma-separated list of flow IDs to filter by",type:"string",alias:["flows"]})),command:Mn,desc:"Rollback jobs in bulk",handler:async e=>{Bn("handler",Mn,e);const{hg:t,json:n,apikey:o,env:s,fromUtcIso:r,toUtcIso:a,tenantIds:i,flowIds:c}=e,{clientApiBaseUri:l}=t;let d,u=S();try{if(10!==r.length){const e="Date from must be in YYYY-MM-DD format";n?ye({status:"error",error:e}):u.fail(de(`Error: ${e}`,"secondary")),process.exit(1)}if(10!==a.length){const e="Date to must be in YYYY-MM-DD format";n?ye({status:"error",error:e}):u.fail(de(`Error: ${e}`,"secondary")),process.exit(1)}const e=`${r}T00:00:00Z`,t=`${a}T23:59:59.999Z`;d=de(`Fetching jobs from ${de(r,"info")} to ${de(a,"info")}...`),!n&&u.start(de(`In progress: ${d}...`,"secondary"));const f=await qe({debug:Bn,baseUri:l,env:s,apikey:o,from:e,to:t,count:100});!n&&u.stop();let p=f.jobs||[];if(i){const e=i.split(",").map(e=>e.trim()).filter(e=>e);e.length>0&&(p=p.filter(t=>{const n=t.tenant;return e.includes(n)}))}if(c){const e=c.split(",").map(e=>e.trim()).filter(e=>e);e.length>0&&(p=p.filter(t=>{const n=t.flow_id||t.flowId||t.flow;return e.includes(n)}))}if(!n&&fe(de(`Found ${de(String(p.length),"info")} job(s) after filtering.`,"secondary")),0===p.length)return void(n?ye({status:"info",message:"No jobs found matching the filters"}):u.warn(de(`Warning: ${de("No jobs found matching the specified filters")}.`,"secondary")));d=de(`Rolling back ${de(p.length,"info")} job(s)...`),!n&&u.start(de(`In progress: ${d}...`,"secondary"));const g=await Promise.all(p.map(async(e,t)=>{const n=e.s3_root||e.s3Root||e.job_root||e.jobRoot,r=e.flow_id||e.flowId||e.flow,a=e.tenant||e.tenant_id||e.tenantId||e.user_id;let i=e.tap;if(!i&&e.taps&&Array.isArray(e.taps)&&e.taps.length>0&&(i=e.taps[0]),!i&&e.tap_name&&(i=e.tap_name),!i&&e.connector&&(i=e.connector),!n)return{index:t,flow:r,tenant:a,ok:!1,error:{message:"Job root (s3_root) not found in job data"}};if(!i)return{index:t,flow:r,tenant:a,jobRoot:n,ok:!1,error:{message:"Tap not found in job data"}};try{const e=await(async({debug:e,baseUri:t,env:n,flow:o,user_id:s,apikey:r,job_root:a,tap:i})=>{const c={"x-api-key":r},l=new URL(`${t}/${n}/${o}/${s}/jobs/rollback`).toString(),d={job_root:a,tap:i};e&&e("uri:",l),e&&e("body:",d);const{data:u}=await T.post(l,d,{headers:c});return u})({debug:Bn,baseUri:l,env:s,apikey:o,flow:r,user_id:a,job_root:n,tap:i});return{index:t,flow:r,tenant:a,jobRoot:n,tap:i,ok:!0,response:e}}catch(e){let o;if(e.response){const t=e.response.status,n=e.response.statusText,s=e.response.data,r=e.message;Bn("Error response:",{statusCode:t,statusText:n,message:r,data:s}),o={statusCode:t,statusText:n,message:r,data:s}}else e.request?(Bn("Error: No response received",e.message),o={message:e.message,request:e.request}):(Bn("Error:",e.message),o={message:e.message});return{index:t,flow:r,tenant:a,jobRoot:n,tap:i,ok:!1,error:o}}}));if(!n&&u.succeed(de(`Finished: ${d}.`,"secondary")),n)ye(g);else{const e=new O({head:["Index","Flow","Tenant","Job Root","Tap","Status","Response/Error"]});g.forEach(t=>{const n=t.ok?"SUCCESS":"FAILED",o=t.ok?JSON.stringify(t.response,void 0,2):JSON.stringify(t.error,void 0,2);e.push([t.index,t.flow||"N/A",t.tenant||"N/A",t.jobRoot||"N/A",t.tap||"N/A",n,o])}),console.log(e.toString());const t=g.filter(e=>e.ok).length,n=g.filter(e=>!e.ok).length;fe(de(`Summary: ${de(String(t),"info")} succeeded, ${de(String(n),"error")} failed out of ${de(String(g.length),"info")} total.`,"secondary"))}}catch(e){n?ye({status:"error",error:e.message,stack:e.stack}):(u.fail(de(`Error: ${d||"Failed to rollback jobs"}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),Bn(e)),process.exit(1)}}});const Ln=[xn,In,An,Dn,Pn,Kn],zn=me("commands:jobs"),Jn="jobs <action>";var qn=Object.freeze({__proto__:null,builder:async function(e){zn("builder",Jn);return(await Oe(e)).command(Ln)},command:Jn,desc:"Manage ETL jobs",handler:async function(e){zn("handler",Jn,e)}});const Vn=me("commands:schedules:bulkUpdate"),Wn="bulk-update";var Yn=Object.freeze({__proto__:null,builder:async e=>(Vn("builder",Wn),e.option("tenant-ids",{describe:"Comma-separated list of tenant IDs",type:"string",alias:["tenants"]}).option("flow-ids",{describe:"Comma-separated list of flow IDs",type:"string",alias:["flows"]}).option("status",{describe:'Schedule status: "enable" or "disable"',type:"string",choices:["enable","disable"]}).option("expression",{describe:"Cron schedule expression",type:"string"}).option("connector",{describe:"Filter by connector ID",type:"string"}).option("job-type",{describe:'Filter by job type: "read" or "write"',type:"string",choices:["read","write"]})),command:Wn,desc:"Update schedules in bulk",handler:async e=>{Vn("handler",Wn,e);const{hg:t,json:n,apikey:o,env:s,tenantIds:r,flowIds:a,status:i,expression:c,connector:l,"job-type":d}=e,{clientApiBaseUri:u}=t;let f,p=S();try{if(!i&&!c){const e='Either "status" or "expression" must be provided';n?ye({status:"error",error:e}):p.fail(de(`Error: ${e}`,"secondary")),process.exit(1)}const e=r?r.split(",").map(e=>e.trim()).filter(Boolean):null,t=a?a.split(",").map(e=>e.trim()).filter(Boolean):null;f=de(`Retrieving schedules for environment: ${de(s,"info")}`),!n&&p.start(de(`In progress: ${f}...`,"secondary"));const g=await(async({debug:e,baseUri:t,env:n,apikey:o,includeDisabled:s})=>{const r=new URL(`${t}/tenants/${n}/schedule`);r.searchParams.set("includeDisabled","true");const a={"x-api-key":o},i=r.toString();e&&e("uri:",i);const{data:c}=await T.get(i,{headers:a});return c})({debug:Vn,baseUri:u,env:s,apikey:o,includeDisabled:!0});!n&&p.succeed(de(`Finished: ${f}.`,"secondary")),Vn("response-data",g);const y="string"==typeof g?JSON.parse(g):g;if(!y||0===y.length)return void(n?ye({updated:0,schedules:[]}):p.warn(de(`Warning: ${de("No schedules found for the specified environment")}.`,"secondary")));let h=y.filter(n=>{if(e&&e.length>0&&!e.includes(n.tenantId))return!1;if(t&&t.length>0&&!t.includes(n.flowId))return!1;if(null!=l&&""!==l){if(n.connectorId!==l)return!1}else if(null!==n.connectorId&&void 0!==n.connectorId)return!1;return!d||n.jobType===d});if(0===h.length)return void(n?ye({updated:0,schedules:[]}):p.warn(de(`Warning: ${de("No schedules match the specified filters")}.`,"secondary")));const m=h,b=i?"enable"===i?"ENABLED":"DISABLED":void 0;n||fe(de(`Found ${de(m.length.toString(),"info")} schedule(s) to update`,"secondary"));const w=20,$=[],v=[];for(let e=0;e<m.length;e+=w){const t=m.slice(e,e+w),s=Math.floor(e/w)+1,r=Math.ceil(m.length/w);f=de(`Updating batch ${de(`${s}/${r}`,"info")} (${t.length} schedule(s))`),!n&&p.start(de(`In progress: ${f}...`,"secondary"));const a=t.map(async e=>{try{const t=c||e.expression,n=b||(e.isActive?"ENABLED":"DISABLED");if(!t)throw new Error("Schedule expression is required but not found");const s=await We({debug:Vn,baseUri:u,env:e.envId,flow:e.flowId,user_id:e.tenantId,apikey:o,schedule_expression:t,state:n,job_type:e.jobType||d,connector_id:e.connectorId||l});return{success:!0,schedule:{envId:e.envId,flowId:e.flowId,tenantId:e.tenantId,connectorId:e.connectorId,jobType:e.jobType,expression:t,state:n},result:s}}catch(t){return Vn("Error updating schedule:",t),{success:!1,schedule:{envId:e.envId,flowId:e.flowId,tenantId:e.tenantId,connectorId:e.connectorId,jobType:e.jobType},error:t.message||t.toString()}}});(await Promise.all(a)).forEach(e=>{e.success?$.push(e.schedule):v.push(e)}),!n&&p.succeed(de(`Finished: ${f}.`,"secondary"))}if(n)ye({total:m.length,updated:$.length,failed:v.length,schedules:$,errors:v});else if(fe(de(`\nUpdated ${de($.length.toString(),"info")} schedule(s) successfully`,"secondary")),v.length>0&&fe(de(`Failed to update ${de(v.length.toString(),"error")} schedule(s)`,"secondary")),$.length>0||v.length>0){const e=new O({head:["Environment","Flow","Tenant","Connector","Job Type","Expression","State","Updated"]});$.forEach(t=>{e.push([t.envId,t.flowId,t.tenantId,t.connectorId||"N/A",t.jobType||"N/A",t.expression,t.state,"yes"])}),v.forEach(t=>{const n=t.schedule,o=m.find(e=>e.envId===n.envId&&e.flowId===n.flowId&&e.tenantId===n.tenantId&&e.connectorId===n.connectorId&&e.jobType===n.jobType);e.push([n.envId,n.flowId,n.tenantId,n.connectorId||"N/A",n.jobType||"N/A",o?.expression||"N/A",o?.isActive?"ENABLED":"DISABLED",`no: ${t.error}`])}),console.log("\n"+e.toString())}}catch(e){n?ye({status:"error",error:e.message||e.toString()}):(p.fail(de(`Error: ${f||"Failed to update schedules"}.`,"secondary")),fe(de(`Message: ${de(e.message||e.toString())}`,"secondary")),Vn(e),e&&e.response&&e.response.data&&Vn("response",e.response.data)),process.exit(1)}}});const Gn=[Yn],Qn=me("commands:schedules"),Hn="schedules <action>";var Zn=Object.freeze({__proto__:null,builder:async function(e){Qn("builder",Hn);return(await Oe(e)).command(Gn)},command:Hn,desc:"Manage schedules",handler:async function(e){Qn("handler",Hn,e)}});const Xn=me("commands:snapshots:deploy"),eo="deploy";var to=Object.freeze({__proto__:null,builder:async e=>(Xn("builder",eo),e.option("tenant",{...Ee.tenant.config,default:"default"}).option("sourceFolder",Ee.sourceFolder.config).demandOption("sourceFolder",Ee.sourceFolder.demandText)),command:eo,desc:"Deploy Snapshots",handler:async e=>{Xn("handler",eo,e);const{hg:t,json:n,apikey:o,env:s,tenant:r,sourceFolder:i}=e,{clientApiBaseUri:c}=t;let l,d=S();const u=a.resolve(process.cwd(),i);try{l=de(`Deploying Snapshots for Tenant ${de(r,"info")} to ${de(s,"info")}`),!n&&d.info(de(`Info: ${l}.`,"secondary"));const e=await Te(u,{recursive:!0});if(0===e.length)return void(n?ye({status:"error",error:"There are no files to deploy at the specified location!"}):d.fail(de(`Error: ${de("There are no files to deploy at the specified location!")}.`,"secondary")));l=de("Verifying user and authorizing");const{accessKeyId:t,secretAccessKey:f,sessionToken:p}=await De({debug:Xn,baseUri:c,task:"snapshot-deploy",env:s,tenant:r,apikey:o});!n&&d.succeed(de(`Finished: ${l}.`,"secondary"));const g=new _.S3({accessKeyId:t,secretAccessKey:f,sessionToken:p});l=de("Validating tenant exists"),!n&&d.start(de(`In progress: ${l}...`,"secondary"));try{const{CommonPrefixes:e}=await g.listObjectsV2({Bucket:s,Prefix:`${r}/`,Delimiter:"/"}).promise();if(0===e.length)throw new Error("Invalid tenant")}catch(e){throw Xn("err",e),new Error("Tenant doesn't exist. Please check your tenant (-u) argument.")}!n&&d.succeed(de(`Finished: ${l}.`,"secondary"));const y=`${r}/snapshots/`,h=new O({head:["File","Status"]});l=de("Preparing deployment target"),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const{Contents:m}=await g.listObjectsV2({Bucket:s,Prefix:`${y}`}).promise();!n&&d.stop(),Xn("contents",m),!n&&d.start(de(`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 g.deleteObjects(e).promise(),w.forEach(({Key:e})=>h.push([e.substring(y.length),de("Deleted","warn")]))}!n&&d.succeed(de(`Finished: ${l}.`,"secondary"));for await(const t of e){const e=a.relative(i,t),o=`${y}${e}`;l=de(`Deploying file: ${de(e,"info")}`),!n&&d.start(de(`In progress: ${l}...`,"secondary"));const r={Bucket:s,Key:o,Body:await b(t)},c=await g.putObject(r).promise();!n&&d.succeed(de(`Finished: ${l}.`,"secondary")),Xn("s3-put-res",c),h.push([e,de("Deployed","info")])}n?ye({status:"success",deployedFiles:e}):ue(h.toString())}catch(e){n?ye({status:"error",error:e}):(d.fail(de(`Error: ${l}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),Xn(e),e&&e.response&&e.response.data&&Xn("response",e.response.data)),process.exit(1)}}});const no=me("commands:snapshots:download"),oo="download";var so=Object.freeze({__proto__:null,builder:async e=>(no("builder",oo),e.option("downloadTo",Ee.downloadTo.config).demandOption("downloadTo",Ee.downloadTo.demandText).option("tenant",{...Ee.tenant.config,default:"default"}).option("overwrite",Ee.overwrite.config).demandOption("overwrite",Ee.overwrite.demandText)),command:oo,desc:"Download Snapshots",handler:async e=>{no("handler",oo,e);const{hg:t,json:n,apikey:o,env:r,tenant:i,downloadTo:c,overwrite:l}=e,{clientApiBaseUri:d}=t;let u,f=S();const p=a.resolve(process.cwd(),function(e){function t(e){return process.argv.indexOf(e)>-1}if(t(`--${e}`))return!0;const n=Ee[e]?.config?.alias||[];for(let e in n)if(t(`-${n[e]}`))return!0;return!1}("downloadTo")?c:"snapshots");try{u=de("Verifying user and authorizing"),!n&&f.start(de(`In progress: ${u}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:c}=await De({debug:no,baseUri:d,task:"snapshot-download",env:r,tenant:i,apikey:o}),g=new _.S3({accessKeyId:e,secretAccessKey:t,sessionToken:c});!n&&f.succeed(de(`Finished: ${u}.`,"secondary")),u=de("Validating tenant exists"),!n&&f.start(de(`In progress: ${u}...`,"secondary"));try{const{CommonPrefixes:e}=await g.listObjectsV2({Bucket:r,Prefix:`${i}/`,Delimiter:"/"}).promise();if(0===e.length)throw new Error("Invalid tenant")}catch(e){throw no("err",e),new Error("Tenant doesn't exist. Please check your tenant (-u) argument.")}!n&&f.succeed(de(`Finished: ${u}.`,"secondary")),u=de("Scanning for downloadable files"),!n&&f.start(de(`In progress: ${u}...`,"secondary"));const m=`${i}/snapshots/`,b={Bucket:r,Prefix:m},{Contents:$}=await g.listObjectsV2(b).promise();!n&&f.succeed(de(`Finished: ${u}.`,"secondary")),no("s3-list-res",$);const v=$?$.map(e=>e.Key).filter(e=>e!==m):[];if(!v||0===v.length)return void(n?ye({status:"success",downloadedFiles:[]}):f.warn(de(`Warning: ${de("Nothing to download!")}`,"secondary")));u=de(`Downloading snapshot files to ${de(p,"info")}`),!n&&f.info(de(`Info: ${u}.`,"secondary"));const j=new O({head:["File","Status"]});for await(const e of v){const t=e.substring(m.length),o=a.resolve(p,t);if(no("file",o),e.endsWith("/")){!s(o)&&await y(o,{recursive:!0});continue}if(!l)try{await w(o),no("exists, skipping"),j.push([t,"Skipped"]);continue}catch(e){"ENOENT"!==e.code&&ue(e)}u=de(`Downloading file: ${de(t,"info")}`),!n&&f.start(de(`In progress: ${u}...`,"secondary")),await y(a.dirname(o),{recursive:!0});const i=g.getObject({Bucket:r,Key:e}).createReadStream();await h(o,await Ae(i)),!n&&f.succeed(de(`Finished: ${u}.`,"secondary")),j.push([t,"Downloaded"])}n?ye({status:"success",downloadedFiles:v}):ue(j.toString())}catch(e){n?ye({status:"error",error:e}):(f.fail(de(`Error: ${u}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),no(e),e&&e.response&&e.response.data&&no("response",e.response.data)),process.exit(1)}}});const ro=[to,so],ao=me("commands:snapshots"),io="snapshots <action>";var co=Object.freeze({__proto__:null,builder:async function(e){ao("builder",io,e);return(await Oe(e)).command(ro)},command:io,desc:"Manage tenant snapshots",handler:async function(e){ao("handler",io,e)}});const lo=me("commands:tenants:custom-etl"),uo="custom-etl",fo=async({debug:e,baseUri:t,apikey:n,env:o,flow:s,tenant:r,supportedSources:a})=>{const i=await Be({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n});let c=null;for(const{tap:l}of[...i,...a]){const{accessKeyId:a,secretAccessKey:i,sessionToken:d}=await De({debug:e,baseUri:t,task:"etl-download",env:o,tenant:r,flow:s,tap:l,apikey:n}),u=new _.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 po=Object.freeze({__proto__:null,builder:async e=>(lo("builder",uo),e.option("tenant",Ee.tenant.config).option("flow",Ee.flow.config).demandOption("flow",Ee.flow.demandText)),command:uo,desc:"List tenants with custom ETL in a specific flow",handler:async e=>{lo("handler",uo,e);const{hg:t,json:n,apikey:o,env:s,flow:r}=e;let a,i=S();try{a=de(`Retrieving tenants for environment ${de(s,"info")}`),!n&&i.start(de(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Re({debug:lo,baseUri:t.clientApiBaseUri,apikey:o,env:s}),Ce({debug:lo,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r})]);!n&&i.succeed(de(`Finished: ${a}.`,"secondary"));let l=[];a=de(`Querying for custom ETL scripts for flow ${de(r,"info")}`),!n&&i.start(de(`In progress: ${a}...`,"secondary"));for(const n of Ne(e)){const e=await Promise.all(n.map(e=>fo({debug:lo,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,supportedSources:c})));l=l.concat(e.filter(Boolean))}if(!n&&i.succeed(de(`Finished: ${a}.`,"secondary")),n)ye(l);else{const e=new O({head:["Tenant ID"]});e.push(...l.map(e=>[e])),console.log(e.toString())}}catch(e){n?ye({status:"error",error:e}):(i.fail(de(`Error: ${a}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),lo(e),e&&e.response&&e.response.data&&lo("response",e.response.data)),process.exit(1)}}});const go=me("commands:tenants:custom-field-map"),yo="custom-field-map",ho=async({debug:e,baseUri:t,apikey:n,env:o,flow:s,tenant:r,isV2Flow:a})=>{const i=a?await Me({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n}):await Be({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n}),c=[],{accessKeyId:l,secretAccessKey:d,sessionToken:u}=await De({debug:e,baseUri:t,task:"field-map-download",env:o,tenant:r,flow:s,apikey:n}),f=new _.S3({accessKeyId:l,secretAccessKey:d,sessionToken:u});for(const{id:e,tap:t}of i){const n={Bucket:o,Key:`${r}/flows/${s}/${a?"connectors":"taps"}/${a?e:t}/fieldMap.json`};try{await f.headObject(n).promise(),c.push(a?e:t)}catch(e){}}return{tenant:r,connectors:c}};var mo=Object.freeze({__proto__:null,builder:async e=>(go("builder",yo),e.option("tenant",Ee.tenant.config).option("flow",Ee.flow.config).demandOption("flow",Ee.flow.demandText)),command:yo,desc:"List tenants with custom field map in a specific flow",handler:async e=>{go("handler",yo,e);const{hg:t,json:n,apikey:o,env:s,flow:r}=e;let a,i=S();try{a=de(`Retrieving tenants for environment ${de(s,"info")}`),!n&&i.start(de(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Re({debug:go,baseUri:t.clientApiBaseUri,apikey:o,env:s}),Je({debug:go,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r})]),l=2===c?.version;!n&&i.succeed(de(`Finished: ${a}.`,"secondary"));const d=[];a=de(`Querying for custom field maps for flow ${de(r,"info")}`),!n&&i.start(de(`In progress: ${a}...`,"secondary"));for(const n of Ne(e)){const e=await Promise.all(n.map(e=>ho({debug:go,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,isV2Flow:l})));d.push(...e.filter(({connectors:e})=>e.length>0))}if(!n&&i.succeed(de(`Finished: ${a}.`,"secondary")),n)ye(d);else{const e=new O({head:["Tenant ID","Connector IDs"]});e.push(...d.map(({tenant:e,connectors:t})=>[e,t.join(", ")])),console.log(e.toString())}}catch(e){n?ye({status:"error",error:e}):(i.fail(de(`Error: ${a}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),go(e),e&&e.response&&e.response.data&&go("response",e.response.data)),process.exit(1)}}});const bo=me("commands:tenants:delete"),wo="delete";var $o=Object.freeze({__proto__:null,builder:async e=>(bo("builder",wo),e.option("tenant",Ee.tenant.config)),command:wo,desc:"Delete tenant",handler:async e=>{bo("handler",wo,e);const{hg:t,json:n,apikey:o,env:s,tenant:r}=e,{clientApiBaseUri:a}=t;let i,c=S();try{if("default"===r)throw new Error('It\'s not possible to delete "default" tenant!');i=de(`Deleting tenant ${r} schedules`),!n&&c.start(de(`In progress: ${i}...`,"secondary")),await(async({debug:e,baseUri:t,env:n,apikey:o,tenant:s})=>{const r={"x-api-key":o},a=new URL(`${t}/tenant/${n}/${s}?schedules_only=true`).toString();e&&e("uri:",a);const{data:i}=await T.delete(a,{headers:r});return i})({debug:bo,baseUri:a,env:s,apikey:o,tenant:r}),!n&&c.succeed(de(`Finished: ${i}.`,"secondary")),i=de("Verifying user and authorizing"),!n&&c.start(de(`In progress: ${i}...`,"secondary"));const{accessKeyId:e,secretAccessKey:t,sessionToken:l}=await De({debug:bo,baseUri:a,task:"tenant-delete",env:s,tenant:r,apikey:o});!n&&c.succeed(de(`Finished: ${i}.`,"secondary"));const d=new _.S3({accessKeyId:e,secretAccessKey:t,sessionToken:l});for(i=de(`Deleting tenant ${r} for environment ${de(s,"info")}`),!n&&c.start(de(`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(!n&&c.succeed(de(`Finished: ${i}.`,"secondary")),n)ye({statu:"success",tenantDeleted:r});else{const e=new O({head:["Tenant ID"]});e.push([r]),console.log(e.toString())}}catch(e){n?ye({status:"error",error:e}):(c.fail(de(`Error: ${i}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),bo(e),e&&e.response&&e.response.data&&bo("response",e.response.data)),process.exit(1)}}});const vo=me("commands:tenants:list"),jo="list";var ko=Object.freeze({__proto__:null,builder:async e=>(vo("builder",jo),e.option("tenant",Ee.tenant.config)),command:jo,desc:"List tenants",handler:async e=>{vo("handler",jo,e);const{hg:t,json:n,apikey:o,env:s,tenant:r}=e;let a,i=S();try{a=de(`Retrieving tenants for environment ${de(s,"info")}`);const e=`${t.clientApiBaseUri}/tenants/${s}${r?`?tenant=${r}`:""}`;vo("requesting:",e),!n&&i.start(de(`In progress: ${a}...`,"secondary"));const{data:c}=await T.get(e,{headers:{"x-api-key":o}});if(!n&&i.succeed(de(`Finished: ${a}.`,"secondary")),vo("response-data",c),!c||0===c.length)return void(n?ye([]):i.info(de(`Info: ${de("No tenants found in the specified environment")}.`,"secondary")));if(n)ye(c);else{const e=new O({head:["tenant ID"]});e.push(...c.map(e=>[e])),console.log(e.toString())}}catch(e){n?ye({status:"error",error:e}):(i.fail(de(`Error: ${a}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),vo(e),e&&e.response&&e.response.data&&vo("response",e.response.data)),process.exit(1)}}});const _o=me("commands:tenants:custom-catalog"),Eo="custom-catalog",xo=async({debug:e,baseUri:t,apikey:n,env:o,flow:s,tenant:r,isV2Flow:a})=>{try{const i=a?await Me({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n}):await Be({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n}),c=[],{accessKeyId:l,secretAccessKey:d,sessionToken:u}=await De({debug:e,baseUri:t,task:"field-map-download",env:o,tenant:r,flow:s,apikey:n}),f=new _.S3({accessKeyId:l,secretAccessKey:d,sessionToken:u});for(const{id:e,tap:t}of i){const n={Bucket:o,Key:`${r}/flows/${s}/${a?"connectors":"taps"}/${a?e:t}/catalog.json`};try{await f.headObject(n).promise(),c.push(a?e:t)}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=>(_o("builder",Eo),e.option("tenant",Ee.tenant.config).option("flow",Ee.flow.config).demandOption("flow",Ee.flow.demandText)),command:Eo,desc:"List tenants with custom catalog in a specific flow",handler:async e=>{_o("handler",Eo,e);const{hg:t,json:n,apikey:o,env:s,flow:r}=e;let a,i=S();try{a=de(`Retrieving tenants for environment ${de(s,"info")}`),!n&&i.start(de(`In progress: ${a}...`,"secondary"));const[e,c]=await Promise.all([Re({debug:_o,baseUri:t.clientApiBaseUri,apikey:o,env:s}),Je({debug:_o,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r})]),l=2===c?.version;!n&&i.succeed(de(`Finished: ${a}.`,"secondary"));const d=[];a=de(`Querying for custom catalogs for flow ${de(r,"info")}`),!n&&i.start(de(`In progress: ${a}...`,"secondary"));for(const n of Ne(e)){const e=await Promise.all(n.map(e=>xo({debug:_o,baseUri:t.clientApiBaseUri,apikey:o,env:s,flow:r,tenant:e,isV2Flow:l})));d.push(...e.filter(({connectors:e})=>e.length>0))}if(!n&&i.succeed(de(`Finished: ${a}.`,"secondary")),n)ye(d);else{const e=new O({head:["Tenant ID","Connector IDs"]});e.push(...d.map(({tenant:e,connectors:t})=>[e,t.join(", ")])),console.log(e.toString())}}catch(e){n?ye({status:"error",error:e}):(i.fail(de(`Error: ${a}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),_o(e),e&&e.response&&e.response.data&&_o("response",e.response.data)),process.exit(1)}}});const So=me("commands:tenants:update-config"),Io="update-config",To=async({debug:e,baseUri:t,apikey:n,env:o,flow:s,tenant:r,connectorId:a,config:i,isV2Flow:c})=>{const l=c?"id":"tap";if(!(c?await Me({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n,config:!0}):await Be({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n,config:!0})).find(e=>e[l]===a))return null;const d=c?Le:Ke;try{await d({debug:e,baseUri:t,env:o,flow:s,tenant:r,apikey:n,connectorId:a,config:i})}catch(e){console.log(de(`Error patching: ${r}. ${e}`,"secondary"))}return r};var Fo=Object.freeze({__proto__:null,builder:async e=>(So("builder",Io),e.option("flow",Ee.flow.config).demandOption("flow",Ee.flow.demandText).option("connector",Ee.connector.config).demandOption("connector",Ee.connector.demandText).option("configFilePath",Ee.configFilePath.config).demandOption("configFilePath",Ee.configFilePath.demandText)),command:Io,desc:"Update the config of a specific connector and flow for all tenants",handler:async e=>{So("handler",Io,e);const{hg:n,json:o,apikey:r,env:a,flow:i,connector:c,configFilePath:l}=e;let d,u=S();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(t(l,{encoding:"utf-8"}));d=de(`Retrieving tenants for environment ${de(a,"info")}`),!o&&u.start(de(`In progress: ${d}...`,"secondary"));const[f,p]=await Promise.all([Re({debug:So,baseUri:n.clientApiBaseUri,apikey:r,env:a}),Je({debug:So,baseUri:n.clientApiBaseUri,apikey:r,env:a,flow:i})]),g=2===p?.version;!o&&u.succeed(de(`Finished: ${d}.`,"secondary"));const y=[];d=de(`Updating config for connector ${de(c,"info")} and flow ${de(i,"info")}`),!o&&u.start(de(`In progress: ${d}...`,"secondary"));for(const t of Ne(f)){const o=await Promise.all(t.map(t=>To({debug:So,baseUri:n.clientApiBaseUri,apikey:r,env:a,flow:i,tenant:t,connectorId:c,config:e,isV2Flow:g})));y.push(...o.filter(Boolean))}if(!o&&u.succeed(de(`Finished: ${d}.`,"secondary")),o)ye(y);else{const e=new O({head:["Tenant ID"]});y.forEach(t=>e.push([t])),console.log(e.toString())}}catch(e){o?ye({status:"error",error:e}):(u.fail(de(`Error: ${d}.`,"secondary")),fe(de(`Message: ${de(e.message)}`,"secondary")),So(e),e&&e.response&&e.response.data&&So("response",e.response.data)),process.exit(1)}}});const Ao=[po,mo,$o,ko,Oo,Fo],No=me("commands:tenants"),Uo="tenants <action>";var Do=Object.freeze({__proto__:null,builder:async function(e){No("builder",Uo);return(await Oe(e)).command(Ao)},command:Uo,desc:"Manage tenants",handler:async function(e){No("handler",Uo,e)}});const Ro=me("commands:singer:validate"),Co="validate",Po=(e,t,n,o)=>{let s=o.type;Array.isArray(s)||(s=[s]);const r=s.filter(e=>"null"!==e)[0];if(!s.includes("null")||null!==n){if("string"===r&&"string"!=typeof n)throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type string.`);if("number"===r&&"number"!=typeof n)throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type number.`);if("boolean"===r&&"boolean"!=typeof n)throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type boolean.`);if("array"===r&&!Array.isArray(n))throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type array.`);if("object"===r&&"object"!=typeof n)throw new Error(`Record for ${e} has invalid type ${typeof n} for field ${t}. Expected type object.`)}},Bo=(e,t,n)=>{const o=t.stream;if(!o)throw new Error("Schema record is missing stream name");if(!t.schema)throw new Error(`Schema record for ${o} is missing schema field`);if(e[o]){for(const n of t.key_properties)if(!e[o].keyProperties.includes(n))throw new Error(`Schema for ${o} has different key properties: ${e[o].keyProperties.join(", ")} and ${t.key_properties.join(", ")}`);const n=e[o].schema;((e,t,n)=>{for(const[o,s]of Object.entries(t.properties))if(n.properties[o]){const t=n.properties[o].type,r=s.type;if(t.length!=r.length||t.some(e=>!r.includes(e)))throw new Error(`Schema for ${e} has different typing for field ${o}: ${t} and ${r}`)}})(o,t.schema,n)}else e[o]={schema:t.schema,keyProperties:t.key_properties||[],keySet:new Set,count:0};return((e,t,n)=>{for(const[o,s]of Object.entries(t.properties)){let t=s.type;Array.isArray(t)||(t=[t]);const r=t.filter(e=>"null"!==e);if(r.length>1&&!n)throw new Error(`Schema for ${e} has multiple non-null types for field ${o}: ${r.join(", ")}`)}})(o,t.schema,n),e},Mo=(e,t,n)=>{const o=t.stream,s=t.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 t of r){if(!s[t])throw new Error(`Record for ${o} is missing key property ${t}`);e[o].keySet.add(s[t])}if(r.length>0&&!n){const t=A.createHash("sha256").update(r.map(e=>`${e}:${s[e]}`).join("")).digest("hex");if(e[o].keySet.has(t))throw new Error(`Duplicate record for ${o} with primary keys: ${r.map(e=>`${e}: ${s[e]}`).join(", ")}`);e[o].keySet.add(t)}((e,t,n)=>{for(const[o,s]of Object.entries(t)){const t=n.properties[o];if(!t)throw new Error(`Record for ${e} has unknown field ${o}`);Po(e,o,s,t)}})(o,s,e[o].schema),e[o].count++},Ko=(e,t)=>{if(!t.value)throw new Error("State record is missing value");if("object"!=typeof t.value)throw new Error(`State record has invalid type ${typeof t.value} for value. Expected type object.`)},Lo=async(t,n)=>{const o={},{allowDuplicateRecords:s,allowFuzzyTypes:r}=n;for await(const a of async function*(t){const n=e.createReadStream(t,{encoding:"utf8"});let o="";for await(const e of n){const t=(o+e).split("\n");o=t.pop();for(const e of t)e.trim()&&(yield JSON.parse(e))}o.trim()&&(yield JSON.parse(o))}(t))try{if(!a.type)throw new Error(`Singer row is missing type: ${JSON.stringify(a)}`);"SCHEMA"==a.type?Bo(o,a,r):"RECORD"==a.type?Mo(o,a,s):"STATE"==a.type&&Ko(0,a)}catch(e){throw n.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 zo=Object.freeze({__proto__:null,builder:async e=>(Ro("builder",Co),e.option("dataFilePath",{...Ee.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:Co,desc:"Validate Singer data",handler:async t=>{Ro("handler",Co,t);const{allowDuplicateRecords:n,allowFuzzyTypes:o,dataFilePath:s,json:r}=t,a={allowDuplicateRecords:n,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 Lo(s,a);r?console.log(JSON.stringify({streams:Object.keys(e).map(t=>({stream:t,count:e[t].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(t=>`\n ${t}: ${e[t].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 Jo=[zo],qo=me("commands:singer"),Vo="singer <action>";var Wo=Object.freeze({__proto__:null,builder:async function(e){qo("builder",Vo);return(await e).command(Jo)},command:Vo,desc:"Develop and test singer taps and targets",handler:async function(e){qo("handler",Vo,e)}});const Yo=[_e,ct,hn,kn,qn,Zn,co,Do,Wo];process.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE="1";ce({});const Go=u(process.argv.slice(2));Go.usage(de("Usage: $0 <command>")).command(Yo).demandCommand().alias("v","version").alias("h","help").string("_").strictCommands().epilogue(de("For more information, visit https://docs.hotglue.xyz/docs/cli-overview")).wrap(Math.min(Go.terminalWidth(),90)).parse(process.argv.slice(z()+1),ee);
35
35
  //# sourceMappingURL=index.js.map