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