@hotglue/cli 1.0.38 → 1.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/index.js +1 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/mjs/index.js +3 -3
- package/lib/mjs/index.js.map +1 -1
- package/package.json +1 -1
package/lib/mjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../node_modules/yargs-parser/build/lib/yargs-parser-types.js","../../../../node_modules/dotenv/lib/main.js","../../../../node_modules/yargs/build/lib/utils/process-argv.js","../../../../node_modules/yargs-parser/build/lib/string-utils.js","../../../../node_modules/yargs-parser/build/lib/yargs-parser.js","../../../../node_modules/dotenv/config.js","../../../../node_modules/dotenv/lib/env-options.js","../../../../node_modules/dotenv/lib/cli-options.js","../../../../node_modules/yargs-parser/build/lib/index.js","../../../../node_modules/yargs-parser/build/lib/tokenize-arg-string.js","../../../../node_modules/y18n/build/lib/platform-shims/node.js","../../../../node_modules/y18n/build/lib/index.js","../../../../node_modules/yargs/lib/platform-shims/esm.mjs","../../../../node_modules/y18n/index.mjs","../../src/helpers/config.js","../../src/helpers/print.js","../../src/helpers/debug.js","../../src/commands/config/set.js","../../src/commands/config/index.js","../../src/commands/config.js","../../src/helpers/descriptions.js","../../src/helpers/baseBuilder.js","../../src/helpers/utils.js","../../src/helpers/api.js","../../src/commands/env/validators.js","../../src/commands/env/deploy.js","../../src/commands/env/download.js","../../src/commands/env/index.js","../../src/commands/env.js","../../src/helpers/flow.js","../../src/commands/etl/delete.js","../../src/commands/etl/deploy.js","../../src/commands/etl/download.js","../../../../node_modules/async/internal/iterator.js","../../../../node_modules/async/internal/isArrayLike.js","../../../../node_modules/async/internal/getIterator.js","../../../../node_modules/async/asyncify.js","../../../../node_modules/async/internal/initialParams.js","../../../../node_modules/async/internal/setImmediate.js","../../../../node_modules/async/internal/wrapAsync.js","../../../../node_modules/async/internal/breakLoop.js","../../../../node_modules/async/internal/eachOfLimit.js","../../../../node_modules/async/internal/once.js","../../../../node_modules/async/internal/onlyOnce.js","../../../../node_modules/async/internal/asyncEachOfLimit.js","../../../../node_modules/async/internal/awaitify.js","../../../../node_modules/async/eachLimit.js","../../../../node_modules/async/internal/withoutIndex.js","../../../../node_modules/async/eachSeries.js","../../src/commands/etl/setup-local-run.js","../../src/commands/etl/index.js","../../src/commands/etl.js","../../src/commands/flows/list.js","../../src/commands/flows/index.js","../../src/commands/flows.js","../../src/commands/jobs/download.js","../../src/commands/jobs/list.js","../../src/commands/jobs/bulkRun.js","../../src/commands/jobs/bulkRetrigger.js","../../src/commands/jobs/bulkKill.js","../../src/commands/jobs/bulkRollback.js","../../src/commands/jobs/index.js","../../src/commands/jobs.js","../../src/commands/schedules/bulkUpdate.js","../../src/commands/schedules/index.js","../../src/commands/schedules.js","../../src/commands/snapshots/deploy.js","../../src/commands/snapshots/download.js","../../src/commands/snapshots/index.js","../../src/commands/snapshots.js","../../src/commands/tenants/customEtl.js","../../src/commands/tenants/customFieldMap.js","../../src/commands/tenants/delete.js","../../src/commands/tenants/list.js","../../src/commands/tenants/customCatalog.js","../../src/commands/tenants/updateConfig.js","../../src/commands/tenants/index.js","../../src/commands/tenants.js","../../src/commands/singer/validate.js","../../src/commands/singer/util.js","../../src/commands/singer/index.js","../../src/commands/singer.js","../../src/commands/index.js","../../src/index.js"],"sourcesContent":["/**\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\nexport var DefaultValuesForTypeKey;\n(function (DefaultValuesForTypeKey) {\n DefaultValuesForTypeKey[\"BOOLEAN\"] = \"boolean\";\n DefaultValuesForTypeKey[\"STRING\"] = \"string\";\n DefaultValuesForTypeKey[\"NUMBER\"] = \"number\";\n DefaultValuesForTypeKey[\"ARRAY\"] = \"array\";\n})(DefaultValuesForTypeKey || (DefaultValuesForTypeKey = {}));\n","const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\n\nfunction log (message) {\n console.log(`[dotenv][DEBUG] ${message}`)\n}\n\nconst NEWLINE = '\\n'\nconst RE_INI_KEY_VAL = /^\\s*([\\w.-]+)\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^#]*)?(\\s*|\\s*#.*)?$/\nconst RE_NEWLINES = /\\\\n/g\nconst NEWLINES_MATCH = /\\r\\n|\\n|\\r/\n\n// Parses src into an Object\nfunction parse (src, options) {\n const debug = Boolean(options && options.debug)\n const obj = {}\n\n // convert Buffers before splitting into lines and processing\n src.toString().split(NEWLINES_MATCH).forEach(function (line, idx) {\n // matching \"KEY' and 'VAL' in 'KEY=VAL'\n const keyValueArr = line.match(RE_INI_KEY_VAL)\n // matched?\n if (keyValueArr != null) {\n const key = keyValueArr[1]\n // default undefined or missing values to empty string\n let val = (keyValueArr[2] || '')\n const end = val.length - 1\n const isDoubleQuoted = val[0] === '\"' && val[end] === '\"'\n const isSingleQuoted = val[0] === \"'\" && val[end] === \"'\"\n\n // if single or double quoted, remove quotes\n if (isSingleQuoted || isDoubleQuoted) {\n val = val.substring(1, end)\n\n // if double quoted, expand newlines\n if (isDoubleQuoted) {\n val = val.replace(RE_NEWLINES, NEWLINE)\n }\n } else {\n // remove surrounding whitespace\n val = val.trim()\n }\n\n obj[key] = val\n } else if (debug) {\n const trimmedLine = line.trim()\n\n // ignore empty and commented lines\n if (trimmedLine.length && trimmedLine[0] !== '#') {\n log(`Failed to match key and value when parsing line ${idx + 1}: ${line}`)\n }\n }\n })\n\n return obj\n}\n\nfunction resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n let dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n\n if (options) {\n if (options.path != null) {\n dotenvPath = resolveHome(options.path)\n }\n if (options.encoding != null) {\n encoding = options.encoding\n }\n }\n\n try {\n // specifying an encoding returns a string instead of a buffer\n const parsed = parse(fs.readFileSync(dotenvPath, { encoding }), { debug })\n\n Object.keys(parsed).forEach(function (key) {\n if (!Object.prototype.hasOwnProperty.call(process.env, key)) {\n process.env[key] = parsed[key]\n } else {\n if (override === true) {\n process.env[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n log(`\"${key}\" is already defined in \\`process.env\\` and WAS overwritten`)\n } else {\n log(`\"${key}\" is already defined in \\`process.env\\` and was NOT overwritten`)\n }\n }\n }\n })\n\n return { parsed }\n } catch (e) {\n if (debug) {\n log(`Failed to load ${dotenvPath} ${e.message}`)\n }\n\n return { error: e }\n }\n}\n\nmodule.exports.config = config\nmodule.exports.parse = parse\n","function getProcessArgvBinIndex() {\n if (isBundledElectronApp())\n return 0;\n return 1;\n}\nfunction isBundledElectronApp() {\n return isElectronApp() && !process.defaultApp;\n}\nfunction isElectronApp() {\n return !!process.versions.electron;\n}\nexport function hideBin(argv) {\n return argv.slice(getProcessArgvBinIndex() + 1);\n}\nexport function getProcessArgvBin() {\n return process.argv[getProcessArgvBinIndex()];\n}\n","/**\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\nexport function camelCase(str) {\n // Handle the case where an argument is provided as camel case, e.g., fooBar.\n // by ensuring that the string isn't already mixed case:\n const isCamelCase = str !== str.toLowerCase() && str !== str.toUpperCase();\n if (!isCamelCase) {\n str = str.toLowerCase();\n }\n if (str.indexOf('-') === -1 && str.indexOf('_') === -1) {\n return str;\n }\n else {\n let camelcase = '';\n let nextChrUpper = false;\n const leadingHyphens = str.match(/^-+/);\n for (let i = leadingHyphens ? leadingHyphens[0].length : 0; i < str.length; i++) {\n let chr = str.charAt(i);\n if (nextChrUpper) {\n nextChrUpper = false;\n chr = chr.toUpperCase();\n }\n if (i !== 0 && (chr === '-' || chr === '_')) {\n nextChrUpper = true;\n }\n else if (chr !== '-' && chr !== '_') {\n camelcase += chr;\n }\n }\n return camelcase;\n }\n}\nexport function decamelize(str, joinString) {\n const lowercase = str.toLowerCase();\n joinString = joinString || '-';\n let notCamelcase = '';\n for (let i = 0; i < str.length; i++) {\n const chrLower = lowercase.charAt(i);\n const chrString = str.charAt(i);\n if (chrLower !== chrString && i > 0) {\n notCamelcase += `${joinString}${lowercase.charAt(i)}`;\n }\n else {\n notCamelcase += chrString;\n }\n }\n return notCamelcase;\n}\nexport function looksLikeNumber(x) {\n if (x === null || x === undefined)\n return false;\n // if loaded from config, may already be a number.\n if (typeof x === 'number')\n return true;\n // hexadecimal.\n if (/^0x[0-9a-f]+$/i.test(x))\n return true;\n // don't treat 0123 as a number; as it drops the leading '0'.\n if (/^0[^.]/.test(x))\n return false;\n return /^[-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(e[-+]?\\d+)?$/.test(x);\n}\n","/**\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\nimport { tokenizeArgString } from './tokenize-arg-string.js';\nimport { DefaultValuesForTypeKey } from './yargs-parser-types.js';\nimport { camelCase, decamelize, looksLikeNumber } from './string-utils.js';\nlet mixin;\nexport class YargsParser {\n constructor(_mixin) {\n mixin = _mixin;\n }\n parse(argsInput, options) {\n const opts = Object.assign({\n alias: undefined,\n array: undefined,\n boolean: undefined,\n config: undefined,\n configObjects: undefined,\n configuration: undefined,\n coerce: undefined,\n count: undefined,\n default: undefined,\n envPrefix: undefined,\n narg: undefined,\n normalize: undefined,\n string: undefined,\n number: undefined,\n __: undefined,\n key: undefined\n }, options);\n // allow a string argument to be passed in rather\n // than an argv array.\n const args = tokenizeArgString(argsInput);\n // tokenizeArgString adds extra quotes to args if argsInput is a string\n // only strip those extra quotes in processValue if argsInput is a string\n const inputIsString = typeof argsInput === 'string';\n // aliases might have transitive relationships, normalize this.\n const aliases = combineAliases(Object.assign(Object.create(null), opts.alias));\n const configuration = Object.assign({\n 'boolean-negation': true,\n 'camel-case-expansion': true,\n 'combine-arrays': false,\n 'dot-notation': true,\n 'duplicate-arguments-array': true,\n 'flatten-duplicate-arrays': true,\n 'greedy-arrays': true,\n 'halt-at-non-option': false,\n 'nargs-eats-options': false,\n 'negation-prefix': 'no-',\n 'parse-numbers': true,\n 'parse-positional-numbers': true,\n 'populate--': false,\n 'set-placeholder-key': false,\n 'short-option-groups': true,\n 'strip-aliased': false,\n 'strip-dashed': false,\n 'unknown-options-as-args': false\n }, opts.configuration);\n const defaults = Object.assign(Object.create(null), opts.default);\n const configObjects = opts.configObjects || [];\n const envPrefix = opts.envPrefix;\n const notFlagsOption = configuration['populate--'];\n const notFlagsArgv = notFlagsOption ? '--' : '_';\n const newAliases = Object.create(null);\n const defaulted = Object.create(null);\n // allow a i18n handler to be passed in, default to a fake one (util.format).\n const __ = opts.__ || mixin.format;\n const flags = {\n aliases: Object.create(null),\n arrays: Object.create(null),\n bools: Object.create(null),\n strings: Object.create(null),\n numbers: Object.create(null),\n counts: Object.create(null),\n normalize: Object.create(null),\n configs: Object.create(null),\n nargs: Object.create(null),\n coercions: Object.create(null),\n keys: []\n };\n const negative = /^-([0-9]+(\\.[0-9]+)?|\\.[0-9]+)$/;\n const negatedBoolean = new RegExp('^--' + configuration['negation-prefix'] + '(.+)');\n [].concat(opts.array || []).filter(Boolean).forEach(function (opt) {\n const key = typeof opt === 'object' ? opt.key : opt;\n // assign to flags[bools|strings|numbers]\n const assignment = Object.keys(opt).map(function (key) {\n const arrayFlagKeys = {\n boolean: 'bools',\n string: 'strings',\n number: 'numbers'\n };\n return arrayFlagKeys[key];\n }).filter(Boolean).pop();\n // assign key to be coerced\n if (assignment) {\n flags[assignment][key] = true;\n }\n flags.arrays[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.boolean || []).filter(Boolean).forEach(function (key) {\n flags.bools[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.string || []).filter(Boolean).forEach(function (key) {\n flags.strings[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.number || []).filter(Boolean).forEach(function (key) {\n flags.numbers[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.count || []).filter(Boolean).forEach(function (key) {\n flags.counts[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.normalize || []).filter(Boolean).forEach(function (key) {\n flags.normalize[key] = true;\n flags.keys.push(key);\n });\n if (typeof opts.narg === 'object') {\n Object.entries(opts.narg).forEach(([key, value]) => {\n if (typeof value === 'number') {\n flags.nargs[key] = value;\n flags.keys.push(key);\n }\n });\n }\n if (typeof opts.coerce === 'object') {\n Object.entries(opts.coerce).forEach(([key, value]) => {\n if (typeof value === 'function') {\n flags.coercions[key] = value;\n flags.keys.push(key);\n }\n });\n }\n if (typeof opts.config !== 'undefined') {\n if (Array.isArray(opts.config) || typeof opts.config === 'string') {\n ;\n [].concat(opts.config).filter(Boolean).forEach(function (key) {\n flags.configs[key] = true;\n });\n }\n else if (typeof opts.config === 'object') {\n Object.entries(opts.config).forEach(([key, value]) => {\n if (typeof value === 'boolean' || typeof value === 'function') {\n flags.configs[key] = value;\n }\n });\n }\n }\n // create a lookup table that takes into account all\n // combinations of aliases: {f: ['foo'], foo: ['f']}\n extendAliases(opts.key, aliases, opts.default, flags.arrays);\n // apply default values to all aliases.\n Object.keys(defaults).forEach(function (key) {\n (flags.aliases[key] || []).forEach(function (alias) {\n defaults[alias] = defaults[key];\n });\n });\n let error = null;\n checkConfiguration();\n let notFlags = [];\n const argv = Object.assign(Object.create(null), { _: [] });\n // TODO(bcoe): for the first pass at removing object prototype we didn't\n // remove all prototypes from objects returned by this API, we might want\n // to gradually move towards doing so.\n const argvReturn = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const truncatedArg = arg.replace(/^-{3,}/, '---');\n let broken;\n let key;\n let letters;\n let m;\n let next;\n let value;\n // any unknown option (except for end-of-options, \"--\")\n if (arg !== '--' && isUnknownOptionAsArg(arg)) {\n pushPositional(arg);\n // ---, ---=, ----, etc,\n }\n else if (truncatedArg.match(/---+(=|$)/)) {\n // options without key name are invalid.\n pushPositional(arg);\n continue;\n // -- separated by =\n }\n else if (arg.match(/^--.+=/) || (!configuration['short-option-groups'] && arg.match(/^-.+=/))) {\n // Using [\\s\\S] instead of . because js doesn't support the\n // 'dotall' regex modifier. See:\n // http://stackoverflow.com/a/1068308/13216\n m = arg.match(/^--?([^=]+)=([\\s\\S]*)$/);\n // arrays format = '--f=a b c'\n if (m !== null && Array.isArray(m) && m.length >= 3) {\n if (checkAllAliases(m[1], flags.arrays)) {\n i = eatArray(i, m[1], args, m[2]);\n }\n else if (checkAllAliases(m[1], flags.nargs) !== false) {\n // nargs format = '--f=monkey washing cat'\n i = eatNargs(i, m[1], args, m[2]);\n }\n else {\n setArg(m[1], m[2], true);\n }\n }\n }\n else if (arg.match(negatedBoolean) && configuration['boolean-negation']) {\n m = arg.match(negatedBoolean);\n if (m !== null && Array.isArray(m) && m.length >= 2) {\n key = m[1];\n setArg(key, checkAllAliases(key, flags.arrays) ? [false] : false);\n }\n // -- separated by space.\n }\n else if (arg.match(/^--.+/) || (!configuration['short-option-groups'] && arg.match(/^-[^-]+/))) {\n m = arg.match(/^--?(.+)/);\n if (m !== null && Array.isArray(m) && m.length >= 2) {\n key = m[1];\n if (checkAllAliases(key, flags.arrays)) {\n // array format = '--foo a b c'\n i = eatArray(i, key, args);\n }\n else if (checkAllAliases(key, flags.nargs) !== false) {\n // nargs format = '--foo a b c'\n // should be truthy even if: flags.nargs[key] === 0\n i = eatNargs(i, key, args);\n }\n else {\n next = args[i + 1];\n if (next !== undefined && (!next.match(/^-/) ||\n next.match(negative)) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next);\n i++;\n }\n else if (/^(true|false)$/.test(next)) {\n setArg(key, next);\n i++;\n }\n else {\n setArg(key, defaultValue(key));\n }\n }\n }\n // dot-notation flag separated by '='.\n }\n else if (arg.match(/^-.\\..+=/)) {\n m = arg.match(/^-([^=]+)=([\\s\\S]*)$/);\n if (m !== null && Array.isArray(m) && m.length >= 3) {\n setArg(m[1], m[2]);\n }\n // dot-notation flag separated by space.\n }\n else if (arg.match(/^-.\\..+/) && !arg.match(negative)) {\n next = args[i + 1];\n m = arg.match(/^-(.\\..+)/);\n if (m !== null && Array.isArray(m) && m.length >= 2) {\n key = m[1];\n if (next !== undefined && !next.match(/^-/) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next);\n i++;\n }\n else {\n setArg(key, defaultValue(key));\n }\n }\n }\n else if (arg.match(/^-[^-]+/) && !arg.match(negative)) {\n letters = arg.slice(1, -1).split('');\n broken = false;\n for (let j = 0; j < letters.length; j++) {\n next = arg.slice(j + 2);\n if (letters[j + 1] && letters[j + 1] === '=') {\n value = arg.slice(j + 3);\n key = letters[j];\n if (checkAllAliases(key, flags.arrays)) {\n // array format = '-f=a b c'\n i = eatArray(i, key, args, value);\n }\n else if (checkAllAliases(key, flags.nargs) !== false) {\n // nargs format = '-f=monkey washing cat'\n i = eatNargs(i, key, args, value);\n }\n else {\n setArg(key, value);\n }\n broken = true;\n break;\n }\n if (next === '-') {\n setArg(letters[j], next);\n continue;\n }\n // current letter is an alphabetic character and next value is a number\n if (/[A-Za-z]/.test(letters[j]) &&\n /^-?\\d+(\\.\\d*)?(e-?\\d+)?$/.test(next) &&\n checkAllAliases(next, flags.bools) === false) {\n setArg(letters[j], next);\n broken = true;\n break;\n }\n if (letters[j + 1] && letters[j + 1].match(/\\W/)) {\n setArg(letters[j], next);\n broken = true;\n break;\n }\n else {\n setArg(letters[j], defaultValue(letters[j]));\n }\n }\n key = arg.slice(-1)[0];\n if (!broken && key !== '-') {\n if (checkAllAliases(key, flags.arrays)) {\n // array format = '-f a b c'\n i = eatArray(i, key, args);\n }\n else if (checkAllAliases(key, flags.nargs) !== false) {\n // nargs format = '-f a b c'\n // should be truthy even if: flags.nargs[key] === 0\n i = eatNargs(i, key, args);\n }\n else {\n next = args[i + 1];\n if (next !== undefined && (!/^(-|--)[^-]/.test(next) ||\n next.match(negative)) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next);\n i++;\n }\n else if (/^(true|false)$/.test(next)) {\n setArg(key, next);\n i++;\n }\n else {\n setArg(key, defaultValue(key));\n }\n }\n }\n }\n else if (arg.match(/^-[0-9]$/) &&\n arg.match(negative) &&\n checkAllAliases(arg.slice(1), flags.bools)) {\n // single-digit boolean alias, e.g: xargs -0\n key = arg.slice(1);\n setArg(key, defaultValue(key));\n }\n else if (arg === '--') {\n notFlags = args.slice(i + 1);\n break;\n }\n else if (configuration['halt-at-non-option']) {\n notFlags = args.slice(i);\n break;\n }\n else {\n pushPositional(arg);\n }\n }\n // order of precedence:\n // 1. command line arg\n // 2. value from env var\n // 3. value from config file\n // 4. value from config objects\n // 5. configured default value\n applyEnvVars(argv, true); // special case: check env vars that point to config file\n applyEnvVars(argv, false);\n setConfig(argv);\n setConfigObjects();\n applyDefaultsAndAliases(argv, flags.aliases, defaults, true);\n applyCoercions(argv);\n if (configuration['set-placeholder-key'])\n setPlaceholderKeys(argv);\n // for any counts either not in args or without an explicit default, set to 0\n Object.keys(flags.counts).forEach(function (key) {\n if (!hasKey(argv, key.split('.')))\n setArg(key, 0);\n });\n // '--' defaults to undefined.\n if (notFlagsOption && notFlags.length)\n argv[notFlagsArgv] = [];\n notFlags.forEach(function (key) {\n argv[notFlagsArgv].push(key);\n });\n if (configuration['camel-case-expansion'] && configuration['strip-dashed']) {\n Object.keys(argv).filter(key => key !== '--' && key.includes('-')).forEach(key => {\n delete argv[key];\n });\n }\n if (configuration['strip-aliased']) {\n ;\n [].concat(...Object.keys(aliases).map(k => aliases[k])).forEach(alias => {\n if (configuration['camel-case-expansion'] && alias.includes('-')) {\n delete argv[alias.split('.').map(prop => camelCase(prop)).join('.')];\n }\n delete argv[alias];\n });\n }\n // Push argument into positional array, applying numeric coercion:\n function pushPositional(arg) {\n const maybeCoercedNumber = maybeCoerceNumber('_', arg);\n if (typeof maybeCoercedNumber === 'string' || typeof maybeCoercedNumber === 'number') {\n argv._.push(maybeCoercedNumber);\n }\n }\n // how many arguments should we consume, based\n // on the nargs option?\n function eatNargs(i, key, args, argAfterEqualSign) {\n let ii;\n let toEat = checkAllAliases(key, flags.nargs);\n // NaN has a special meaning for the array type, indicating that one or\n // more values are expected.\n toEat = typeof toEat !== 'number' || isNaN(toEat) ? 1 : toEat;\n if (toEat === 0) {\n if (!isUndefined(argAfterEqualSign)) {\n error = Error(__('Argument unexpected for: %s', key));\n }\n setArg(key, defaultValue(key));\n return i;\n }\n let available = isUndefined(argAfterEqualSign) ? 0 : 1;\n if (configuration['nargs-eats-options']) {\n // classic behavior, yargs eats positional and dash arguments.\n if (args.length - (i + 1) + available < toEat) {\n error = Error(__('Not enough arguments following: %s', key));\n }\n available = toEat;\n }\n else {\n // nargs will not consume flag arguments, e.g., -abc, --foo,\n // and terminates when one is observed.\n for (ii = i + 1; ii < args.length; ii++) {\n if (!args[ii].match(/^-[^0-9]/) || args[ii].match(negative) || isUnknownOptionAsArg(args[ii]))\n available++;\n else\n break;\n }\n if (available < toEat)\n error = Error(__('Not enough arguments following: %s', key));\n }\n let consumed = Math.min(available, toEat);\n if (!isUndefined(argAfterEqualSign) && consumed > 0) {\n setArg(key, argAfterEqualSign);\n consumed--;\n }\n for (ii = i + 1; ii < (consumed + i + 1); ii++) {\n setArg(key, args[ii]);\n }\n return (i + consumed);\n }\n // if an option is an array, eat all non-hyphenated arguments\n // following it... YUM!\n // e.g., --foo apple banana cat becomes [\"apple\", \"banana\", \"cat\"]\n function eatArray(i, key, args, argAfterEqualSign) {\n let argsToSet = [];\n let next = argAfterEqualSign || args[i + 1];\n // If both array and nargs are configured, enforce the nargs count:\n const nargsCount = checkAllAliases(key, flags.nargs);\n if (checkAllAliases(key, flags.bools) && !(/^(true|false)$/.test(next))) {\n argsToSet.push(true);\n }\n else if (isUndefined(next) ||\n (isUndefined(argAfterEqualSign) && /^-/.test(next) && !negative.test(next) && !isUnknownOptionAsArg(next))) {\n // for keys without value ==> argsToSet remains an empty []\n // set user default value, if available\n if (defaults[key] !== undefined) {\n const defVal = defaults[key];\n argsToSet = Array.isArray(defVal) ? defVal : [defVal];\n }\n }\n else {\n // value in --option=value is eaten as is\n if (!isUndefined(argAfterEqualSign)) {\n argsToSet.push(processValue(key, argAfterEqualSign, true));\n }\n for (let ii = i + 1; ii < args.length; ii++) {\n if ((!configuration['greedy-arrays'] && argsToSet.length > 0) ||\n (nargsCount && typeof nargsCount === 'number' && argsToSet.length >= nargsCount))\n break;\n next = args[ii];\n if (/^-/.test(next) && !negative.test(next) && !isUnknownOptionAsArg(next))\n break;\n i = ii;\n argsToSet.push(processValue(key, next, inputIsString));\n }\n }\n // If both array and nargs are configured, create an error if less than\n // nargs positionals were found. NaN has special meaning, indicating\n // that at least one value is required (more are okay).\n if (typeof nargsCount === 'number' && ((nargsCount && argsToSet.length < nargsCount) ||\n (isNaN(nargsCount) && argsToSet.length === 0))) {\n error = Error(__('Not enough arguments following: %s', key));\n }\n setArg(key, argsToSet);\n return i;\n }\n function setArg(key, val, shouldStripQuotes = inputIsString) {\n if (/-/.test(key) && configuration['camel-case-expansion']) {\n const alias = key.split('.').map(function (prop) {\n return camelCase(prop);\n }).join('.');\n addNewAlias(key, alias);\n }\n const value = processValue(key, val, shouldStripQuotes);\n const splitKey = key.split('.');\n setKey(argv, splitKey, value);\n // handle populating aliases of the full key\n if (flags.aliases[key]) {\n flags.aliases[key].forEach(function (x) {\n const keyProperties = x.split('.');\n setKey(argv, keyProperties, value);\n });\n }\n // handle populating aliases of the first element of the dot-notation key\n if (splitKey.length > 1 && configuration['dot-notation']) {\n ;\n (flags.aliases[splitKey[0]] || []).forEach(function (x) {\n let keyProperties = x.split('.');\n // expand alias with nested objects in key\n const a = [].concat(splitKey);\n a.shift(); // nuke the old key.\n keyProperties = keyProperties.concat(a);\n // populate alias only if is not already an alias of the full key\n // (already populated above)\n if (!(flags.aliases[key] || []).includes(keyProperties.join('.'))) {\n setKey(argv, keyProperties, value);\n }\n });\n }\n // Set normalize getter and setter when key is in 'normalize' but isn't an array\n if (checkAllAliases(key, flags.normalize) && !checkAllAliases(key, flags.arrays)) {\n const keys = [key].concat(flags.aliases[key] || []);\n keys.forEach(function (key) {\n Object.defineProperty(argvReturn, key, {\n enumerable: true,\n get() {\n return val;\n },\n set(value) {\n val = typeof value === 'string' ? mixin.normalize(value) : value;\n }\n });\n });\n }\n }\n function addNewAlias(key, alias) {\n if (!(flags.aliases[key] && flags.aliases[key].length)) {\n flags.aliases[key] = [alias];\n newAliases[alias] = true;\n }\n if (!(flags.aliases[alias] && flags.aliases[alias].length)) {\n addNewAlias(alias, key);\n }\n }\n function processValue(key, val, shouldStripQuotes) {\n // strings may be quoted, clean this up as we assign values.\n if (shouldStripQuotes) {\n val = stripQuotes(val);\n }\n // handle parsing boolean arguments --foo=true --bar false.\n if (checkAllAliases(key, flags.bools) || checkAllAliases(key, flags.counts)) {\n if (typeof val === 'string')\n val = val === 'true';\n }\n let value = Array.isArray(val)\n ? val.map(function (v) { return maybeCoerceNumber(key, v); })\n : maybeCoerceNumber(key, val);\n // increment a count given as arg (either no value or value parsed as boolean)\n if (checkAllAliases(key, flags.counts) && (isUndefined(value) || typeof value === 'boolean')) {\n value = increment();\n }\n // Set normalized value when key is in 'normalize' and in 'arrays'\n if (checkAllAliases(key, flags.normalize) && checkAllAliases(key, flags.arrays)) {\n if (Array.isArray(val))\n value = val.map((val) => { return mixin.normalize(val); });\n else\n value = mixin.normalize(val);\n }\n return value;\n }\n function maybeCoerceNumber(key, value) {\n if (!configuration['parse-positional-numbers'] && key === '_')\n return value;\n if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, flags.bools) && !Array.isArray(value)) {\n const shouldCoerceNumber = looksLikeNumber(value) && configuration['parse-numbers'] && (Number.isSafeInteger(Math.floor(parseFloat(`${value}`))));\n if (shouldCoerceNumber || (!isUndefined(value) && checkAllAliases(key, flags.numbers))) {\n value = Number(value);\n }\n }\n return value;\n }\n // set args from config.json file, this should be\n // applied last so that defaults can be applied.\n function setConfig(argv) {\n const configLookup = Object.create(null);\n // expand defaults/aliases, in-case any happen to reference\n // the config.json file.\n applyDefaultsAndAliases(configLookup, flags.aliases, defaults);\n Object.keys(flags.configs).forEach(function (configKey) {\n const configPath = argv[configKey] || configLookup[configKey];\n if (configPath) {\n try {\n let config = null;\n const resolvedConfigPath = mixin.resolve(mixin.cwd(), configPath);\n const resolveConfig = flags.configs[configKey];\n if (typeof resolveConfig === 'function') {\n try {\n config = resolveConfig(resolvedConfigPath);\n }\n catch (e) {\n config = e;\n }\n if (config instanceof Error) {\n error = config;\n return;\n }\n }\n else {\n config = mixin.require(resolvedConfigPath);\n }\n setConfigObject(config);\n }\n catch (ex) {\n // Deno will receive a PermissionDenied error if an attempt is\n // made to load config without the --allow-read flag:\n if (ex.name === 'PermissionDenied')\n error = ex;\n else if (argv[configKey])\n error = Error(__('Invalid JSON config file: %s', configPath));\n }\n }\n });\n }\n // set args from config object.\n // it recursively checks nested objects.\n function setConfigObject(config, prev) {\n Object.keys(config).forEach(function (key) {\n const value = config[key];\n const fullKey = prev ? prev + '.' + key : key;\n // if the value is an inner object and we have dot-notation\n // enabled, treat inner objects in config the same as\n // heavily nested dot notations (foo.bar.apple).\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && configuration['dot-notation']) {\n // if the value is an object but not an array, check nested object\n setConfigObject(value, fullKey);\n }\n else {\n // setting arguments via CLI takes precedence over\n // values within the config file.\n if (!hasKey(argv, fullKey.split('.')) || (checkAllAliases(fullKey, flags.arrays) && configuration['combine-arrays'])) {\n setArg(fullKey, value);\n }\n }\n });\n }\n // set all config objects passed in opts\n function setConfigObjects() {\n if (typeof configObjects !== 'undefined') {\n configObjects.forEach(function (configObject) {\n setConfigObject(configObject);\n });\n }\n }\n function applyEnvVars(argv, configOnly) {\n if (typeof envPrefix === 'undefined')\n return;\n const prefix = typeof envPrefix === 'string' ? envPrefix : '';\n const env = mixin.env();\n Object.keys(env).forEach(function (envVar) {\n if (prefix === '' || envVar.lastIndexOf(prefix, 0) === 0) {\n // get array of nested keys and convert them to camel case\n const keys = envVar.split('__').map(function (key, i) {\n if (i === 0) {\n key = key.substring(prefix.length);\n }\n return camelCase(key);\n });\n if (((configOnly && flags.configs[keys.join('.')]) || !configOnly) && !hasKey(argv, keys)) {\n setArg(keys.join('.'), env[envVar]);\n }\n }\n });\n }\n function applyCoercions(argv) {\n let coerce;\n const applied = new Set();\n Object.keys(argv).forEach(function (key) {\n if (!applied.has(key)) { // If we haven't already coerced this option via one of its aliases\n coerce = checkAllAliases(key, flags.coercions);\n if (typeof coerce === 'function') {\n try {\n const value = maybeCoerceNumber(key, coerce(argv[key]));\n ([].concat(flags.aliases[key] || [], key)).forEach(ali => {\n applied.add(ali);\n argv[ali] = value;\n });\n }\n catch (err) {\n error = err;\n }\n }\n }\n });\n }\n function setPlaceholderKeys(argv) {\n flags.keys.forEach((key) => {\n // don't set placeholder keys for dot notation options 'foo.bar'.\n if (~key.indexOf('.'))\n return;\n if (typeof argv[key] === 'undefined')\n argv[key] = undefined;\n });\n return argv;\n }\n function applyDefaultsAndAliases(obj, aliases, defaults, canLog = false) {\n Object.keys(defaults).forEach(function (key) {\n if (!hasKey(obj, key.split('.'))) {\n setKey(obj, key.split('.'), defaults[key]);\n if (canLog)\n defaulted[key] = true;\n (aliases[key] || []).forEach(function (x) {\n if (hasKey(obj, x.split('.')))\n return;\n setKey(obj, x.split('.'), defaults[key]);\n });\n }\n });\n }\n function hasKey(obj, keys) {\n let o = obj;\n if (!configuration['dot-notation'])\n keys = [keys.join('.')];\n keys.slice(0, -1).forEach(function (key) {\n o = (o[key] || {});\n });\n const key = keys[keys.length - 1];\n if (typeof o !== 'object')\n return false;\n else\n return key in o;\n }\n function setKey(obj, keys, value) {\n let o = obj;\n if (!configuration['dot-notation'])\n keys = [keys.join('.')];\n keys.slice(0, -1).forEach(function (key) {\n // TODO(bcoe): in the next major version of yargs, switch to\n // Object.create(null) for dot notation:\n key = sanitizeKey(key);\n if (typeof o === 'object' && o[key] === undefined) {\n o[key] = {};\n }\n if (typeof o[key] !== 'object' || Array.isArray(o[key])) {\n // ensure that o[key] is an array, and that the last item is an empty object.\n if (Array.isArray(o[key])) {\n o[key].push({});\n }\n else {\n o[key] = [o[key], {}];\n }\n // we want to update the empty object at the end of the o[key] array, so set o to that object\n o = o[key][o[key].length - 1];\n }\n else {\n o = o[key];\n }\n });\n // TODO(bcoe): in the next major version of yargs, switch to\n // Object.create(null) for dot notation:\n const key = sanitizeKey(keys[keys.length - 1]);\n const isTypeArray = checkAllAliases(keys.join('.'), flags.arrays);\n const isValueArray = Array.isArray(value);\n let duplicate = configuration['duplicate-arguments-array'];\n // nargs has higher priority than duplicate\n if (!duplicate && checkAllAliases(key, flags.nargs)) {\n duplicate = true;\n if ((!isUndefined(o[key]) && flags.nargs[key] === 1) || (Array.isArray(o[key]) && o[key].length === flags.nargs[key])) {\n o[key] = undefined;\n }\n }\n if (value === increment()) {\n o[key] = increment(o[key]);\n }\n else if (Array.isArray(o[key])) {\n if (duplicate && isTypeArray && isValueArray) {\n o[key] = configuration['flatten-duplicate-arrays'] ? o[key].concat(value) : (Array.isArray(o[key][0]) ? o[key] : [o[key]]).concat([value]);\n }\n else if (!duplicate && Boolean(isTypeArray) === Boolean(isValueArray)) {\n o[key] = value;\n }\n else {\n o[key] = o[key].concat([value]);\n }\n }\n else if (o[key] === undefined && isTypeArray) {\n o[key] = isValueArray ? value : [value];\n }\n else if (duplicate && !(o[key] === undefined ||\n checkAllAliases(key, flags.counts) ||\n checkAllAliases(key, flags.bools))) {\n o[key] = [o[key], value];\n }\n else {\n o[key] = value;\n }\n }\n // extend the aliases list with inferred aliases.\n function extendAliases(...args) {\n args.forEach(function (obj) {\n Object.keys(obj || {}).forEach(function (key) {\n // short-circuit if we've already added a key\n // to the aliases array, for example it might\n // exist in both 'opts.default' and 'opts.key'.\n if (flags.aliases[key])\n return;\n flags.aliases[key] = [].concat(aliases[key] || []);\n // For \"--option-name\", also set argv.optionName\n flags.aliases[key].concat(key).forEach(function (x) {\n if (/-/.test(x) && configuration['camel-case-expansion']) {\n const c = camelCase(x);\n if (c !== key && flags.aliases[key].indexOf(c) === -1) {\n flags.aliases[key].push(c);\n newAliases[c] = true;\n }\n }\n });\n // For \"--optionName\", also set argv['option-name']\n flags.aliases[key].concat(key).forEach(function (x) {\n if (x.length > 1 && /[A-Z]/.test(x) && configuration['camel-case-expansion']) {\n const c = decamelize(x, '-');\n if (c !== key && flags.aliases[key].indexOf(c) === -1) {\n flags.aliases[key].push(c);\n newAliases[c] = true;\n }\n }\n });\n flags.aliases[key].forEach(function (x) {\n flags.aliases[x] = [key].concat(flags.aliases[key].filter(function (y) {\n return x !== y;\n }));\n });\n });\n });\n }\n function checkAllAliases(key, flag) {\n const toCheck = [].concat(flags.aliases[key] || [], key);\n const keys = Object.keys(flag);\n const setAlias = toCheck.find(key => keys.includes(key));\n return setAlias ? flag[setAlias] : false;\n }\n function hasAnyFlag(key) {\n const flagsKeys = Object.keys(flags);\n const toCheck = [].concat(flagsKeys.map(k => flags[k]));\n return toCheck.some(function (flag) {\n return Array.isArray(flag) ? flag.includes(key) : flag[key];\n });\n }\n function hasFlagsMatching(arg, ...patterns) {\n const toCheck = [].concat(...patterns);\n return toCheck.some(function (pattern) {\n const match = arg.match(pattern);\n return match && hasAnyFlag(match[1]);\n });\n }\n // based on a simplified version of the short flag group parsing logic\n function hasAllShortFlags(arg) {\n // if this is a negative number, or doesn't start with a single hyphen, it's not a short flag group\n if (arg.match(negative) || !arg.match(/^-[^-]+/)) {\n return false;\n }\n let hasAllFlags = true;\n let next;\n const letters = arg.slice(1).split('');\n for (let j = 0; j < letters.length; j++) {\n next = arg.slice(j + 2);\n if (!hasAnyFlag(letters[j])) {\n hasAllFlags = false;\n break;\n }\n if ((letters[j + 1] && letters[j + 1] === '=') ||\n next === '-' ||\n (/[A-Za-z]/.test(letters[j]) && /^-?\\d+(\\.\\d*)?(e-?\\d+)?$/.test(next)) ||\n (letters[j + 1] && letters[j + 1].match(/\\W/))) {\n break;\n }\n }\n return hasAllFlags;\n }\n function isUnknownOptionAsArg(arg) {\n return configuration['unknown-options-as-args'] && isUnknownOption(arg);\n }\n function isUnknownOption(arg) {\n arg = arg.replace(/^-{3,}/, '--');\n // ignore negative numbers\n if (arg.match(negative)) {\n return false;\n }\n // if this is a short option group and all of them are configured, it isn't unknown\n if (hasAllShortFlags(arg)) {\n return false;\n }\n // e.g. '--count=2'\n const flagWithEquals = /^-+([^=]+?)=[\\s\\S]*$/;\n // e.g. '-a' or '--arg'\n const normalFlag = /^-+([^=]+?)$/;\n // e.g. '-a-'\n const flagEndingInHyphen = /^-+([^=]+?)-$/;\n // e.g. '-abc123'\n const flagEndingInDigits = /^-+([^=]+?\\d+)$/;\n // e.g. '-a/usr/local'\n const flagEndingInNonWordCharacters = /^-+([^=]+?)\\W+.*$/;\n // check the different types of flag styles, including negatedBoolean, a pattern defined near the start of the parse method\n return !hasFlagsMatching(arg, flagWithEquals, negatedBoolean, normalFlag, flagEndingInHyphen, flagEndingInDigits, flagEndingInNonWordCharacters);\n }\n // make a best effort to pick a default value\n // for an option based on name and type.\n function defaultValue(key) {\n if (!checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts) &&\n `${key}` in defaults) {\n return defaults[key];\n }\n else {\n return defaultForType(guessType(key));\n }\n }\n // return a default value, given the type of a flag.,\n function defaultForType(type) {\n const def = {\n [DefaultValuesForTypeKey.BOOLEAN]: true,\n [DefaultValuesForTypeKey.STRING]: '',\n [DefaultValuesForTypeKey.NUMBER]: undefined,\n [DefaultValuesForTypeKey.ARRAY]: []\n };\n return def[type];\n }\n // given a flag, enforce a default type.\n function guessType(key) {\n let type = DefaultValuesForTypeKey.BOOLEAN;\n if (checkAllAliases(key, flags.strings))\n type = DefaultValuesForTypeKey.STRING;\n else if (checkAllAliases(key, flags.numbers))\n type = DefaultValuesForTypeKey.NUMBER;\n else if (checkAllAliases(key, flags.bools))\n type = DefaultValuesForTypeKey.BOOLEAN;\n else if (checkAllAliases(key, flags.arrays))\n type = DefaultValuesForTypeKey.ARRAY;\n return type;\n }\n function isUndefined(num) {\n return num === undefined;\n }\n // check user configuration settings for inconsistencies\n function checkConfiguration() {\n // count keys should not be set as array/narg\n Object.keys(flags.counts).find(key => {\n if (checkAllAliases(key, flags.arrays)) {\n error = Error(__('Invalid configuration: %s, opts.count excludes opts.array.', key));\n return true;\n }\n else if (checkAllAliases(key, flags.nargs)) {\n error = Error(__('Invalid configuration: %s, opts.count excludes opts.narg.', key));\n return true;\n }\n return false;\n });\n }\n return {\n aliases: Object.assign({}, flags.aliases),\n argv: Object.assign(argvReturn, argv),\n configuration: configuration,\n defaulted: Object.assign({}, defaulted),\n error: error,\n newAliases: Object.assign({}, newAliases)\n };\n }\n}\n// if any aliases reference each other, we should\n// merge them together.\nfunction combineAliases(aliases) {\n const aliasArrays = [];\n const combined = Object.create(null);\n let change = true;\n // turn alias lookup hash {key: ['alias1', 'alias2']} into\n // a simple array ['key', 'alias1', 'alias2']\n Object.keys(aliases).forEach(function (key) {\n aliasArrays.push([].concat(aliases[key], key));\n });\n // combine arrays until zero changes are\n // made in an iteration.\n while (change) {\n change = false;\n for (let i = 0; i < aliasArrays.length; i++) {\n for (let ii = i + 1; ii < aliasArrays.length; ii++) {\n const intersect = aliasArrays[i].filter(function (v) {\n return aliasArrays[ii].indexOf(v) !== -1;\n });\n if (intersect.length) {\n aliasArrays[i] = aliasArrays[i].concat(aliasArrays[ii]);\n aliasArrays.splice(ii, 1);\n change = true;\n break;\n }\n }\n }\n }\n // map arrays back to the hash-lookup (de-dupe while\n // we're at it).\n aliasArrays.forEach(function (aliasArray) {\n aliasArray = aliasArray.filter(function (v, i, self) {\n return self.indexOf(v) === i;\n });\n const lastAlias = aliasArray.pop();\n if (lastAlias !== undefined && typeof lastAlias === 'string') {\n combined[lastAlias] = aliasArray;\n }\n });\n return combined;\n}\n// this function should only be called when a count is given as an arg\n// it is NOT called to set a default value\n// thus we can start the count at 1 instead of 0\nfunction increment(orig) {\n return orig !== undefined ? orig + 1 : 1;\n}\n// TODO(bcoe): in the next major version of yargs, switch to\n// Object.create(null) for dot notation:\nfunction sanitizeKey(key) {\n if (key === '__proto__')\n return '___proto___';\n return key;\n}\nfunction stripQuotes(val) {\n return (typeof val === 'string' &&\n (val[0] === \"'\" || val[0] === '\"') &&\n val[val.length - 1] === val[0])\n ? val.substring(1, val.length - 1)\n : val;\n}\n","(function () {\n require('./lib/main').config(\n Object.assign(\n {},\n require('./lib/env-options'),\n require('./lib/cli-options')(process.argv)\n )\n )\n})()\n","// ../config.js accepts options via environment variables\nconst options = {}\n\nif (process.env.DOTENV_CONFIG_ENCODING != null) {\n options.encoding = process.env.DOTENV_CONFIG_ENCODING\n}\n\nif (process.env.DOTENV_CONFIG_PATH != null) {\n options.path = process.env.DOTENV_CONFIG_PATH\n}\n\nif (process.env.DOTENV_CONFIG_DEBUG != null) {\n options.debug = process.env.DOTENV_CONFIG_DEBUG\n}\n\nif (process.env.DOTENV_CONFIG_OVERRIDE != null) {\n options.override = process.env.DOTENV_CONFIG_OVERRIDE\n}\n\nmodule.exports = options\n","const re = /^dotenv_config_(encoding|path|debug|override)=(.+)$/\n\nmodule.exports = function optionMatcher (args) {\n return args.reduce(function (acc, cur) {\n const matches = cur.match(re)\n if (matches) {\n acc[matches[1]] = matches[2]\n }\n return acc\n }, {})\n}\n","/**\n * @fileoverview Main entrypoint for libraries using yargs-parser in Node.js\n * CJS and ESM environments.\n *\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\nimport { format } from 'util';\nimport { normalize, resolve } from 'path';\nimport { camelCase, decamelize, looksLikeNumber } from './string-utils.js';\nimport { YargsParser } from './yargs-parser.js';\nimport { readFileSync } from 'fs';\n// See https://github.com/yargs/yargs-parser#supported-nodejs-versions for our\n// version support policy. The YARGS_MIN_NODE_VERSION is used for testing only.\nconst minNodeVersion = (process && process.env && process.env.YARGS_MIN_NODE_VERSION)\n ? Number(process.env.YARGS_MIN_NODE_VERSION)\n : 12;\nif (process && process.version) {\n const major = Number(process.version.match(/v([^.]+)/)[1]);\n if (major < minNodeVersion) {\n throw Error(`yargs parser supports a minimum Node.js version of ${minNodeVersion}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`);\n }\n}\n// Creates a yargs-parser instance using Node.js standard libraries:\nconst env = process ? process.env : {};\nconst parser = new YargsParser({\n cwd: process.cwd,\n env: () => {\n return env;\n },\n format,\n normalize,\n resolve,\n // TODO: figure out a way to combine ESM and CJS coverage, such that\n // we can exercise all the lines below:\n require: (path) => {\n if (typeof require !== 'undefined') {\n return require(path);\n }\n else if (path.match(/\\.json$/)) {\n // Addresses: https://github.com/yargs/yargs/issues/2040\n return JSON.parse(readFileSync(path, 'utf8'));\n }\n else {\n throw Error('only .json config files are supported in ESM');\n }\n }\n});\nconst yargsParser = function Parser(args, opts) {\n const result = parser.parse(args.slice(), opts);\n return result.argv;\n};\nyargsParser.detailed = function (args, opts) {\n return parser.parse(args.slice(), opts);\n};\nyargsParser.camelCase = camelCase;\nyargsParser.decamelize = decamelize;\nyargsParser.looksLikeNumber = looksLikeNumber;\nexport default yargsParser;\n","/**\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\n// take an un-split argv string and tokenize it.\nexport function tokenizeArgString(argString) {\n if (Array.isArray(argString)) {\n return argString.map(e => typeof e !== 'string' ? e + '' : e);\n }\n argString = argString.trim();\n let i = 0;\n let prevC = null;\n let c = null;\n let opening = null;\n const args = [];\n for (let ii = 0; ii < argString.length; ii++) {\n prevC = c;\n c = argString.charAt(ii);\n // split on spaces unless we're in quotes.\n if (c === ' ' && !opening) {\n if (!(prevC === ' ')) {\n i++;\n }\n continue;\n }\n // don't split the string if we're in matching\n // opening or closing single and double quotes.\n if (c === opening) {\n opening = null;\n }\n else if ((c === \"'\" || c === '\"') && !opening) {\n opening = c;\n }\n if (!args[i])\n args[i] = '';\n args[i] += c;\n }\n return args;\n}\n","import { readFileSync, statSync, writeFile } from 'fs';\nimport { format } from 'util';\nimport { resolve } from 'path';\nexport default {\n fs: {\n readFileSync,\n writeFile\n },\n format,\n resolve,\n exists: (file) => {\n try {\n return statSync(file).isFile();\n }\n catch (err) {\n return false;\n }\n }\n};\n","let shim;\nclass Y18N {\n constructor(opts) {\n // configurable options.\n opts = opts || {};\n this.directory = opts.directory || './locales';\n this.updateFiles = typeof opts.updateFiles === 'boolean' ? opts.updateFiles : true;\n this.locale = opts.locale || 'en';\n this.fallbackToLanguage = typeof opts.fallbackToLanguage === 'boolean' ? opts.fallbackToLanguage : true;\n // internal stuff.\n this.cache = Object.create(null);\n this.writeQueue = [];\n }\n __(...args) {\n if (typeof arguments[0] !== 'string') {\n return this._taggedLiteral(arguments[0], ...arguments);\n }\n const str = args.shift();\n let cb = function () { }; // start with noop.\n if (typeof args[args.length - 1] === 'function')\n cb = args.pop();\n cb = cb || function () { }; // noop.\n if (!this.cache[this.locale])\n this._readLocaleFile();\n // we've observed a new string, update the language file.\n if (!this.cache[this.locale][str] && this.updateFiles) {\n this.cache[this.locale][str] = str;\n // include the current directory and locale,\n // since these values could change before the\n // write is performed.\n this._enqueueWrite({\n directory: this.directory,\n locale: this.locale,\n cb\n });\n }\n else {\n cb();\n }\n return shim.format.apply(shim.format, [this.cache[this.locale][str] || str].concat(args));\n }\n __n() {\n const args = Array.prototype.slice.call(arguments);\n const singular = args.shift();\n const plural = args.shift();\n const quantity = args.shift();\n let cb = function () { }; // start with noop.\n if (typeof args[args.length - 1] === 'function')\n cb = args.pop();\n if (!this.cache[this.locale])\n this._readLocaleFile();\n let str = quantity === 1 ? singular : plural;\n if (this.cache[this.locale][singular]) {\n const entry = this.cache[this.locale][singular];\n str = entry[quantity === 1 ? 'one' : 'other'];\n }\n // we've observed a new string, update the language file.\n if (!this.cache[this.locale][singular] && this.updateFiles) {\n this.cache[this.locale][singular] = {\n one: singular,\n other: plural\n };\n // include the current directory and locale,\n // since these values could change before the\n // write is performed.\n this._enqueueWrite({\n directory: this.directory,\n locale: this.locale,\n cb\n });\n }\n else {\n cb();\n }\n // if a %d placeholder is provided, add quantity\n // to the arguments expanded by util.format.\n const values = [str];\n if (~str.indexOf('%d'))\n values.push(quantity);\n return shim.format.apply(shim.format, values.concat(args));\n }\n setLocale(locale) {\n this.locale = locale;\n }\n getLocale() {\n return this.locale;\n }\n updateLocale(obj) {\n if (!this.cache[this.locale])\n this._readLocaleFile();\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n this.cache[this.locale][key] = obj[key];\n }\n }\n }\n _taggedLiteral(parts, ...args) {\n let str = '';\n parts.forEach(function (part, i) {\n const arg = args[i + 1];\n str += part;\n if (typeof arg !== 'undefined') {\n str += '%s';\n }\n });\n return this.__.apply(this, [str].concat([].slice.call(args, 1)));\n }\n _enqueueWrite(work) {\n this.writeQueue.push(work);\n if (this.writeQueue.length === 1)\n this._processWriteQueue();\n }\n _processWriteQueue() {\n const _this = this;\n const work = this.writeQueue[0];\n // destructure the enqueued work.\n const directory = work.directory;\n const locale = work.locale;\n const cb = work.cb;\n const languageFile = this._resolveLocaleFile(directory, locale);\n const serializedLocale = JSON.stringify(this.cache[locale], null, 2);\n shim.fs.writeFile(languageFile, serializedLocale, 'utf-8', function (err) {\n _this.writeQueue.shift();\n if (_this.writeQueue.length > 0)\n _this._processWriteQueue();\n cb(err);\n });\n }\n _readLocaleFile() {\n let localeLookup = {};\n const languageFile = this._resolveLocaleFile(this.directory, this.locale);\n try {\n // When using a bundler such as webpack, readFileSync may not be defined:\n if (shim.fs.readFileSync) {\n localeLookup = JSON.parse(shim.fs.readFileSync(languageFile, 'utf-8'));\n }\n }\n catch (err) {\n if (err instanceof SyntaxError) {\n err.message = 'syntax error in ' + languageFile;\n }\n if (err.code === 'ENOENT')\n localeLookup = {};\n else\n throw err;\n }\n this.cache[this.locale] = localeLookup;\n }\n _resolveLocaleFile(directory, locale) {\n let file = shim.resolve(directory, './', locale + '.json');\n if (this.fallbackToLanguage && !this._fileExistsSync(file) && ~locale.lastIndexOf('_')) {\n // attempt fallback to language only\n const languageFile = shim.resolve(directory, './', locale.split('_')[0] + '.json');\n if (this._fileExistsSync(languageFile))\n file = languageFile;\n }\n return file;\n }\n _fileExistsSync(file) {\n return shim.exists(file);\n }\n}\nexport function y18n(opts, _shim) {\n shim = _shim;\n const y18n = new Y18N(opts);\n return {\n __: y18n.__.bind(y18n),\n __n: y18n.__n.bind(y18n),\n setLocale: y18n.setLocale.bind(y18n),\n getLocale: y18n.getLocale.bind(y18n),\n updateLocale: y18n.updateLocale.bind(y18n),\n locale: y18n.locale\n };\n}\n","'use strict'\n\nimport { notStrictEqual, strictEqual } from 'assert'\nimport cliui from 'cliui'\nimport escalade from 'escalade/sync'\nimport { inspect } from 'util'\nimport { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url';\nimport Parser from 'yargs-parser'\nimport { basename, dirname, extname, relative, resolve } from 'path'\nimport { getProcessArgvBin } from '../../build/lib/utils/process-argv.js'\nimport { YError } from '../../build/lib/yerror.js'\nimport y18n from 'y18n'\n\nconst REQUIRE_ERROR = 'require is not supported by ESM'\nconst REQUIRE_DIRECTORY_ERROR = 'loading a directory of commands is not supported yet for ESM'\n\nlet __dirname;\ntry {\n __dirname = fileURLToPath(import.meta.url);\n} catch (e) {\n __dirname = process.cwd();\n}\nconst mainFilename = __dirname.split('node_modules')[0]\n\nexport default {\n assert: {\n notStrictEqual,\n strictEqual\n },\n cliui,\n findUp: escalade,\n getEnv: (key) => {\n return process.env[key]\n },\n inspect,\n getCallerFile: () => {\n throw new YError(REQUIRE_DIRECTORY_ERROR)\n },\n getProcessArgvBin,\n mainFilename: mainFilename || process.cwd(),\n Parser,\n path: {\n basename,\n dirname,\n extname,\n relative,\n resolve\n },\n process: {\n argv: () => process.argv,\n cwd: process.cwd,\n emitWarning: (warning, type) => process.emitWarning(warning, type),\n execPath: () => process.execPath,\n exit: process.exit,\n nextTick: process.nextTick,\n stdColumns: typeof process.stdout.columns !== 'undefined' ? process.stdout.columns : null\n },\n readFileSync,\n require: () => {\n throw new YError(REQUIRE_ERROR)\n },\n requireDirectory: () => {\n throw new YError(REQUIRE_DIRECTORY_ERROR)\n },\n stringWidth: (str) => {\n return [...str].length\n },\n y18n: y18n({\n directory: resolve(__dirname, '../../../locales'),\n updateFiles: false\n })\n}\n","import shim from './build/lib/platform-shims/node.js'\nimport { y18n as _y18n } from './build/lib/index.js'\n\nconst y18n = (opts) => {\n return _y18n(opts, shim)\n}\n\nexport default y18n\n","import { homedir } from 'os';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimport { cosmiconfig } from 'cosmiconfig';\n\n/*\nPrecedence of CLI configuration (from highest to lowest):\nper cli execution: pass config file (--config /path/to/.hotgluerc) option with your command\nper project: load from current project's package.json or a config folder in any folder in the path (i.e. /path/to/project/.hotgluerc)\nper user: ~/.hotglue/config.yaml\nany built-in or default config settings\n*/\n\nconst staticOptions = {\n hg: {\n appName: 'hotglue',\n clientApiBaseUri: process.env.HOTGLUE_CLIENT_API_BASE_URI || 'https://api.hotglue.com',\n defaultConfigFileName: 'config.yaml',\n },\n};\n\nconst defaultOptions = {\n // absolute path or a relative path using dot notation only\n // downloadFolder: path.resolve(process.cwd(), 'downloads'),\n};\n\nconst getProfileConfigFilePath = () =>\n path.resolve(homedir(), `.${staticOptions.hg.appName}`, staticOptions.hg.defaultConfigFileName);\n\nconst writeConfigFile = async (file, data) => {\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(file, data);\n};\n\nconst getProfileConfig = async () => {\n const { appName } = staticOptions.hg;\n\n try {\n const result = await cosmiconfig(appName).load(getProfileConfigFilePath());\n return result || {};\n // return { ...result.config };\n } catch (err) {\n // no profile config found; app not configured\n return {};\n }\n};\n\nconst getProjectConfig = async () => {\n const { appName } = staticOptions.hg;\n\n const cosmic = cosmiconfig(appName, {\n searchPlaces: [\n // primary\n `${appName}.yaml`,\n `.${appName}.yaml`,\n `.${appName}rc.yaml`,\n `.${appName}rc.yml`,\n // secondary\n `.${appName}rc`,\n `.${appName}rc.json`,\n `.${appName}rc.js`,\n // `package.json`,\n ],\n // loaders: [],\n // packageProp: `${appName}`,\n // stopDir: '',\n // cache: true,\n // transform: (res) => res\n });\n\n try {\n const result = await cosmic.search();\n return result || {};\n // return (result && result.config) || {};\n } catch (err) {\n console.log(err); // use debug()\n throw new Error(`Malformed configuration file: ${err.message}`);\n }\n};\n\nconst getCombinedConfig = async () => {\n const profileConfig = await getProfileConfig();\n\n const projectConfig = await getProjectConfig();\n\n const result = { ...defaultOptions, ...profileConfig.config, ...projectConfig.config };\n // todo: post-process config (i.e. template replacement)\n return result;\n};\n\nexport {\n getProfileConfigFilePath,\n getProfileConfig,\n getProjectConfig,\n getCombinedConfig,\n writeConfigFile,\n staticOptions,\n};\n","import { inspect } from 'util';\nimport chalk from 'chalk';\n\nconst defaultTheme = {\n primary: (str) => chalk.whiteBright(str),\n secondary: (str) => chalk.white(str),\n info: (str) => chalk.green(str),\n warn: (str) => chalk.yellow(str),\n error: (str) => chalk.redBright(str),\n success: (str) => chalk.greenBright(str),\n};\n\nlet _currentTheme = defaultTheme;\nlet _defaultColor = 'primary';\n\nfunction setTheme(theme) {\n _currentTheme = { ...defaultTheme, ...theme };\n return funcs;\n}\n\nfunction print(str) {\n process.stdout.write(str);\n}\n\n// maybe rename themed to color()\nconst themed = (content, color = _defaultColor) => {\n if (!content) return '';\n if (typeof content === 'string')\n return _currentTheme[color] ? _currentTheme[color](content) : _currentTheme[_defaultColor](content);\n\n // apply limits on returned string from inspected object\n const objString = inspect(content, { colors: true });\n return _currentTheme[color] ? _currentTheme[color](objString) : objString;\n};\n\n// console.log passthrough with default coloring\nfunction cl(...contentArgs) {\n console.log(...contentArgs);\n return funcs;\n}\n\nfunction pr(content, color) {\n print(themed(content, color));\n print('\\n');\n return funcs;\n}\n\nfunction pp(content, color) {\n print(themed(content, color));\n return funcs;\n}\n\nfunction setDefault(color = 'primary') {\n if (_currentTheme[color]) _defaultColor = color;\n return funcs;\n}\n\nconst funcs = {\n cl,\n pr,\n pp,\n setTheme,\n setDefault,\n};\n\nconst printJSON = (data) => {\n console.log(JSON.stringify(data));\n};\n\nexport { cl, pr, pp, setTheme, setDefault, themed, printJSON };\n\nexport default funcs;\n","import Debug from 'debug';\n\nconst debug = Debug('hotglue-cli');\n\nfunction extendDebug(namespace) {\n return debug.extend(namespace);\n}\n\nexport default extendDebug;\n","import Debug from '../../helpers/debug.js';\nimport YAML from 'yaml';\nimport Table from 'cli-table';\nimport { getProfileConfigFilePath, getProfileConfig, writeConfigFile } from '../../helpers/config.js';\nimport { pp, pr, printJSON } from '../../helpers/print.js';\n\nconst debug = Debug('commands:config:set');\n\nconst command = 'set <setting> <value>';\n\nconst desc = 'Set configuration key-value pairs';\n\nconst builder = async (yargs) => {\n debug('builder', command, yargs);\n yargs\n .option('setting', {\n describe: 'The configuration parameter you wish to set',\n type: 'string',\n })\n .option('value', {\n describe: \"The configuration parameter's value\",\n type: 'string',\n });\n\n return yargs;\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { json, setting, value } = argv;\n const allowedSettings = ['apikey'];\n\n if (!allowedSettings.includes(setting)) {\n json\n ? printJSON({ status: 'error', error: 'Invalid settings parameter' })\n : console.error('Invalid settings parameter');\n // throw new Error('Invalid settings parameter');\n return;\n }\n\n try {\n const profileConfig = await getProfileConfig();\n if (profileConfig && profileConfig.config) !json && pp('Updating profile config file...');\n else !json && pp('Creating profile config file...');\n\n const data =\n profileConfig && profileConfig.config ? { ...profileConfig.config, [setting]: value } : { [setting]: value };\n const yamlData = YAML.stringify(data);\n\n const filePath = profileConfig && profileConfig.filepath ? profileConfig.filepath : getProfileConfigFilePath();\n\n await writeConfigFile(filePath, yamlData);\n json ? printJSON({ status: 'success' }) : pp('Done').pr();\n } catch (err) {\n json ? printJSON({ status: 'error', error: err }) : console.log(err);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as set from './set.js';\n\nexport const config = [set];\n","import path from 'path';\nimport Debug from '../helpers/debug.js';\nimport YAML from 'yaml';\nimport Table from 'cli-table';\nimport { getProfileConfig, getProjectConfig } from '../helpers/config.js';\nimport { cl, pp, pr, themed } from '../helpers/print.js';\nimport { config } from './config/index.js';\n\nconst debug = Debug('commands:config');\n\nconst command = 'config [action]';\n\nconst desc = 'Configure your hotglue CLI';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n return yargs.command(config);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n\n const { action } = argv;\n\n // implement using yarg default command\n if (!action) {\n try {\n const profileConfig = await getProfileConfig();\n if (!profileConfig.config || Object.keys(profileConfig.config).length === 0) {\n pr('No profile configuration found. Run config set to configure the hotglue CLI.');\n }\n\n const table = new Table({ head: ['Setting', 'Value', 'Config File', 'Type'] });\n if (profileConfig.config)\n Object.entries(profileConfig.config).forEach(([k, v]) => table.push([k, v, profileConfig.filepath, `Profile`]));\n\n const projectConfig = await getProjectConfig();\n if (projectConfig.config)\n Object.entries(projectConfig.config).forEach(([k, v]) =>\n table.push([k, v, path.relative(process.cwd(), projectConfig.filepath), 'Project'])\n );\n\n if (table.length > 0) {\n // pr('CURRENT CONTEXT SETTINGS');\n console.log(table.toString());\n // console.log(YAML.stringify(fileConfig.config));\n }\n\n // pr('The configuration file is empty. Run config set to configure the hotglue CLI.');\n } catch (err) {\n // log elsewhere\n console.log(err);\n throw err;\n }\n }\n};\n\nexport { command, desc, builder, handler };\n","// get description for key: .option(...((key) => [key, descriptions[key]])('apikey'))\nexport default {\n commands: {},\n options: {\n env: {\n config: {\n describe: 'Environment Id',\n type: 'string',\n alias: ['e'],\n },\n demandText:\n 'The \"env\" parameter (Environment Id) is required. Either pass here using `-e [env_id]` or add an env property in your rc file.',\n },\n apikey: {\n config: {\n describe: 'API key',\n type: 'string',\n alias: ['k'],\n },\n demandText: 'API key is required. Either pass here using -k [key] or configure your profile using config set.',\n },\n dataFilePath: {\n config: {\n describe: 'Singer data file path',\n type: 'string',\n alias: ['data', 'data-file-path'],\n default: 'data.singer',\n },\n },\n json: {\n config: {\n describe: 'Makes the output format to be JSON',\n type: 'boolean',\n default: false,\n },\n demandText: '',\n },\n tenant: {\n config: {\n describe: 'Tenant (user) ID',\n type: 'string',\n alias: ['u'],\n },\n demandText: 'TenantId is required. You can pass it using -u [tenantId].',\n },\n flow: {\n config: {\n describe: 'Flow ID',\n type: 'string',\n alias: ['f'],\n },\n demandText: 'FlowId is required. You can pass it using -f [flow_id].',\n },\n tap: {\n config: {\n describe: 'Tap name',\n type: 'string',\n alias: ['t'],\n },\n demandText: 'Tap name is required. You can pass it using -t <tap_name>.',\n },\n connector: {\n config: {\n describe: 'Connector ID',\n type: 'string',\n alias: ['c'],\n },\n demandText: 'Connector ID is required. You can pass it using -c <connector>.',\n },\n all: {\n config: {\n describe: 'Run command for all taps/connectors',\n type: 'boolean',\n default: false,\n alias: ['a'],\n },\n demandText: 'This \"all\" flag is required. You can pass it using -a or --all.',\n },\n jobroot: {\n config: {\n describe: 'Job Root (S3 prefix)',\n type: 'string',\n alias: ['j'],\n },\n demandText: 'JobRoot key is required. You can pass it using -j [job_root].',\n },\n count: {\n config: {\n describe: 'Max returned records',\n type: 'number',\n },\n },\n downloadTo: {\n config: {\n describe: 'Download folder',\n default: '.',\n type: 'string',\n alias: ['d'],\n },\n demandText:\n 'A destination folder is required. You can pass it using -d [folder] and can be either relative from cwd or absolute.',\n },\n sourceFolder: {\n config: {\n describe: 'Source folder',\n type: 'string',\n default: '.',\n alias: ['s'],\n },\n demandText: '',\n },\n configFilePath: {\n config: {\n describe: 'Config file path',\n type: 'string',\n default: './config.json',\n alias: ['p'],\n },\n demandText: 'Local path of the config (with .json extension). Example: \"/home/hotglue/config.json\"',\n },\n overwrite: {\n config: {\n describe: 'Overwrite existing',\n type: 'boolean',\n default: false,\n alias: ['o'],\n },\n demandText: '',\n },\n cleanup: {\n config: {\n describe: 'Clean up target prior to action',\n type: 'boolean',\n default: false,\n alias: ['c'],\n },\n demandText: '',\n },\n includeConfigs: {\n config: {\n describe: 'Include configs in the download folder (source-config.json, target-config.json, tenant-config.json)',\n type: 'boolean',\n default: false,\n },\n demandText: '',\n },\n },\n};\n","import Debug from './debug.js';\nimport descriptions from './descriptions.js';\nimport { getCombinedConfig } from './config.js';\n\nconst debug = Debug('base');\n\nconst baseBuilder = (yargs) => {\n return yargs;\n};\n\nconst baseApiBuilder = async (yargs) => {\n debug('builder');\n const config = await getCombinedConfig();\n\n return baseBuilder(yargs)\n .option('apikey', descriptions.options['apikey'].config)\n .option('env', descriptions.options['env'].config)\n .option('json', descriptions.options['json'].config)\n .config(config)\n .demandOption(['env'], descriptions.options['env'].demandText)\n .demandOption(['apikey'], descriptions.options['apikey'].demandText)\n .strictCommands();\n};\n\nexport { baseBuilder, baseApiBuilder };\n","import path from 'path';\nimport { readdir } from 'fs/promises';\nimport Debug from './debug.js';\nimport micromatch from 'micromatch';\nimport { cl, pr, pp } from './print.js';\nimport descriptions from './descriptions.js';\n\nconst debug = Debug('utils.js');\n\nconst makeSetFromArray = (arr) => {\n const result = new Set();\n arr.forEach((item) => result.add(item));\n return result;\n};\n\n/**\n * Get list of files in given folder and its subfolders that match against a pattern.\n * ex: await getSubFolderFiles(process.cwd(), ['!d/sync-output', '!d/etl-output', '!d/snapshots']);\n * @param {string} dir starting directory\n * @param {Array<string>} pattern The match patterns. ex: '!my_folder', 'd/uploads', '!f/exclude.txt'\n * @returns {Array<string>} All file paths that meet the pattern criteria\n */\nconst getSubFolderFiles = async (dir, pattern) => {\n const matches = {\n excludedDirs: new Set(),\n excludedFiles: new Set(),\n includedDirs: new Set(),\n includedFiles: new Set(),\n };\n\n if (pattern && pattern.length > 0) {\n const excluded = [];\n const included = [];\n pattern.forEach((item) => {\n if (item.startsWith('!')) excluded.push(item.substring(1));\n else included.push(item);\n });\n included.forEach((item) => {\n if (item.startsWith('d/')) matches.includedDirs.add(item.substring(2));\n else if (item.startsWith('f/')) matches.includedFiles.add(item.substring(2));\n else {\n matches.includedDirs.add(item);\n matches.includedFiles.add(item);\n }\n });\n excluded.forEach((item) => {\n if (item.startsWith('d/')) matches.excludedDirs.add(item.substring(2));\n else if (item.startsWith('f/')) matches.excludedFiles.add(item.substring(2));\n else {\n matches.excludedDirs.add(item);\n matches.excludedFiles.add(item);\n }\n });\n }\n\n return _getSubFolderFiles(dir, matches);\n};\n\nconst _getSubFolderFiles = async (dir, matches) => {\n const files = await readdir(dir, { withFileTypes: true });\n\n const result = [];\n for (const file of files) {\n if (!file.isSymbolicLink()) {\n if (file.isFile() && (!matches.excludedFiles.has(file.name) || matches.includedFiles.has(file.name)))\n result.push(path.resolve(dir, file.name));\n else if (file.isDirectory() && (!matches.excludedDirs.has(file.name) || matches.includedFiles.has(file.name))) {\n const sub = await _getSubFolderFiles(path.resolve(dir, file.name), matches);\n if (sub.length > 0) result.push(...sub);\n }\n }\n }\n\n return result;\n};\n\nconst _getFolderFiles = async (dir, options, result = []) => {\n const { includeSymLinks, recursive, filter } = options;\n const { matcher } = filter;\n\n const fullPath = path.resolve(dir);\n const files = await readdir(fullPath, { withFileTypes: true });\n\n for (const file of files) {\n const filePath = path.resolve(fullPath, file.name);\n\n if (file.isSymbolicLink() && !includeSymLinks) {\n continue;\n }\n\n if (matcher && !matcher(filePath)) {\n debug('skip', filePath);\n continue;\n }\n\n if (file.isFile()) {\n result.push(path.resolve(fullPath, file.name));\n } else if (file.isDirectory() && recursive) {\n await _getFolderFiles(path.resolve(fullPath, file.name), options, result);\n }\n }\n\n return result;\n};\n\nconst getFolderFiles = async (dir, options) => {\n const _options = { includeSymLinks: false, recursive: false, filter: {}, ...options };\n const { pattern } = _options.filter;\n\n if (pattern) {\n _options.filter.matcher = micromatch.matcher(pattern, { dot: true });\n }\n\n return _getFolderFiles(dir, _options);\n};\n\nconst filterFiles = (files, filter) => {\n debug('filter-in', files);\n const { pattern } = { ...filter };\n\n let result = files;\n if (pattern) result = micromatch(result, pattern);\n debug('filter-out', result);\n\n return result;\n};\n\n/**\n * todo: implement my variant:\n * - explicit f/ and d/ prefixes\n * -\n * @param {*} pattern\n * @returns a matcher instance\n */\nfunction createMatcher(pattern) {\n const matches = {\n excludedDirs: new Set(),\n excludedFiles: new Set(),\n includedDirs: new Set(),\n includedFiles: new Set(),\n };\n const excluded = [];\n const included = [];\n pattern.forEach((item) => {\n if (item.startsWith('!')) excluded.push(item.substring(1));\n else included.push(item);\n });\n included.forEach((item) => {\n if (item.startsWith('d/')) matches.includedDirs.add(item.substring(2));\n else if (item.startsWith('f/')) matches.includedFiles.add(item.substring(2));\n else {\n matches.includedDirs.add(item);\n matches.includedFiles.add(item);\n }\n });\n excluded.forEach((item) => {\n if (item.startsWith('d/')) matches.excludedDirs.add(item.substring(2));\n else if (item.startsWith('f/')) matches.excludedFiles.add(item.substring(2));\n else {\n matches.excludedDirs.add(item);\n matches.excludedFiles.add(item);\n }\n });\n\n const match = (path) => {};\n\n return { match };\n}\n\nfunction userSetOption(option) {\n function wasArgPassed(option) {\n return process.argv.indexOf(option) > -1;\n }\n\n if (wasArgPassed(`--${option}`)) {\n return true;\n }\n\n // Handle aliases for same option\n const aliases = descriptions.options[option]?.config?.alias || [];\n for (let i in aliases) {\n if (wasArgPassed(`-${aliases[i]}`)) return true;\n }\n\n return false;\n}\n\nconst streamToString = (stream) => {\n const chunks = [];\n return new Promise((resolve, reject) => {\n stream.on('error', reject);\n stream.on('data', (c) => chunks.push(Buffer.from(c)));\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n};\n\nconst buildChunks = (array, chunkSize = 10) => {\n const resultArray = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n const chunk = array.slice(i, i + chunkSize);\n resultArray.push(chunk);\n }\n return resultArray;\n};\n\nconst isNullOrEmptyArray = (value) => {\n if (value == null || (Array.isArray(value) && value.length === 0)) {\n // The variable is either null, undefined, or an empty array\n return true;\n }\n return false;\n}\n\nexport { makeSetFromArray, getFolderFiles, filterFiles, userSetOption, streamToString, buildChunks, isNullOrEmptyArray };\n","import axios from 'axios';\n\nconst resetAvailableEntities = async ({debug, baseUri, env, apiKey}) => {\n const urlObj = new URL(`${baseUri}/${env}/resetAvailableEntities`);\n\n const { data } = await axios.delete(\n urlObj,\n { headers: { 'x-api-key': apiKey, 'Content-type': 'application/json' } }\n );\n debug({ data });\n};\n\nconst genCredentialsOnClientApi = async ({ debug, baseUri, task, env, apikey, ...params }) => {\n const urlObj = new URL(`${baseUri}/credentials/${task}/${env}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n urlObj.searchParams.set(key, value);\n });\n }\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n const { accessKeyId, secretAccessKey, sessionToken } = data;\n return { accessKeyId, secretAccessKey, sessionToken };\n};\n\nconst getEnvConfig = async ({ debug, baseUri, env, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/config`);\n urlObj.searchParams.set('secret', 'true');\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n return data;\n};\n\nconst getTenants = async ({ debug, baseUri, env, apikey }) => {\n const uri = `${baseUri}/tenants/${env}`;\n debug('requesting:', uri);\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n debug('response-data', data);\n return data;\n};\n\nconst getSupportedSources = async ({ debug, baseUri, env, flow, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/supportedSources`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getSupportedTargets = async ({ debug, baseUri, env, flow, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/supportedTargets`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getSupportedConnectors = async ({ debug, baseUri, env, flow, apikey }) => {\n const urlObj = new URL(`${baseUri}/v2/${env}/${flow}/supportedConnectors`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getLinkedSources = async ({ debug, baseUri, env, flow, tenant, apikey, config }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${tenant}/linkedSources`);\n if (config) {\n urlObj.searchParams.set('config', 'true');\n }\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getLinkedConnectors = async ({ debug, baseUri, env, flow, tenant, apikey, config }) => {\n const urlObj = new URL(`${baseUri}/v2/${env}/${flow}/${tenant}/linkedConnectors`);\n if (config) {\n urlObj.searchParams.set('config', 'true');\n }\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst patchLinkedSourceConfig = async ({ debug, baseUri, env, flow, tenant, apikey, connectorId, config }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${tenant}/linkedSources`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n const body = { tap: connectorId, config };\n debug && debug('uri:', uri);\n const { data } = await axios.patch(uri, body, { headers });\n return data;\n};\n\nconst patchLinkedConnectorConfig = async ({ debug, baseUri, env, flow, tenant, apikey, connectorId, config }) => {\n const urlObj = new URL(`${baseUri}/v2/${env}/${flow}/${tenant}/linkedConnectors`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n const body = { connector_id: connectorId, config };\n debug && debug('uri:', uri);\n const { data } = await axios.patch(uri, body, { headers });\n return data;\n};\n\nconst getSupportedFlows = async ({ debug, baseUri, env, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/flows/supported`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getSupportedFlow = async ({ debug, baseUri, env, flow, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/flows/${flow}/supported`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst deleteTenantSchedules = async ({ debug, baseUri, env, apikey, tenant }) => {\n const urlObj = new URL(`${baseUri}/tenant/${env}/${tenant}?schedules_only=true`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.delete(uri, { headers });\n return data;\n};\n\nconst runJob = async ({ debug, baseUri, env, apikey, tenant, flow, ...args }) => {\n const { isV2Flow = false, ...body } = args;\n const urlObj = new URL(`${baseUri}/${isV2Flow ? 'v2/' : ''}${env}/${flow}/${tenant}/jobs`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.post(uri, body, { headers });\n return data;\n};\n\nconst getEnvJobs = async ({ debug, baseUri, env, apikey, from, to, count = 10000, ...queryParams }) => {\n const headers = { 'x-api-key': apikey };\n const countNum = typeof count === 'string' ? parseInt(count, 10) : count;\n let allJobs = [];\n let totalJobs = 0;\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const urlObj = new URL(`${baseUri}/${env}/jobs`);\n urlObj.searchParams.set('from', from);\n if (to) {\n urlObj.searchParams.set('to', to);\n }\n urlObj.searchParams.set('count', countNum.toString());\n urlObj.searchParams.set('page', page.toString());\n \n // Add any additional query parameters\n if (queryParams) {\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value !== undefined && value !== null && key !== 'count' && key !== 'page') {\n urlObj.searchParams.set(key, value);\n }\n });\n }\n\n urlObj.searchParams.set('include_export_details', 'false');\n urlObj.searchParams.set('skip_cache', 'true');\n \n const uri = urlObj.toString();\n debug && debug(`Fetching page ${page}, uri:`, uri);\n const { data } = await axios.get(uri, { headers });\n debug && debug(`Page ${page} response:`, { jobsCount: data.jobs?.length || 0, total: data.total || 0 });\n \n const pageJobs = data.jobs || [];\n allJobs = allJobs.concat(pageJobs);\n \n // Set total from first page response\n if (page === 1) {\n totalJobs = data.total || 0;\n }\n \n // If we got fewer jobs than the count, we've reached the last page\n if (pageJobs.length < countNum) {\n hasMore = false;\n } else {\n page++;\n }\n }\n\n debug && debug(`Fetched ${allJobs.length} jobs across ${page} page(s)`);\n \n return {\n jobs: allJobs,\n total: totalJobs\n };\n};\n\nconst retriggerJob = async ({ debug, baseUri, env, apikey, tenant, flow, ...args }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${tenant}/jobs/retrigger`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n \n const payload = args;\n \n debug && debug('uri:', uri);\n debug && debug('payload:', payload);\n const { data } = await axios.post(uri, payload, { headers });\n return data;\n};\n\nconst getScheduleList = async ({ debug, baseUri, env, apikey, includeDisabled }) => {\n const urlObj = new URL(`${baseUri}/tenants/${env}/schedule`);\n if (includeDisabled !== undefined) {\n urlObj.searchParams.set('includeDisabled', includeDisabled === true ? 'true' : 'false');\n }\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst updateSchedule = async ({ debug, baseUri, env, flow, user_id, apikey, schedule_expression, state, job_type, connector_id, extra_args }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${user_id}/jobs/schedule`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n \n const body = {\n schedule_expression,\n state,\n };\n \n if (job_type) {\n body.job_type = job_type;\n }\n \n if (connector_id) {\n body.connector_id = connector_id;\n }\n \n if (extra_args) {\n Object.assign(body, extra_args);\n }\n \n debug && debug('uri:', uri);\n debug && debug('body:', body);\n const { data } = await axios.put(uri, body, { headers });\n return data;\n};\n\nconst killJob = async ({ debug, baseUri, env, flow, user_id, apikey, job_root, reason, task_arn, skip_webhooks }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${user_id}/jobs/kill`);\n urlObj.searchParams.set('job_root', job_root);\n if (reason) {\n urlObj.searchParams.set('reason', reason);\n }\n if (task_arn) {\n urlObj.searchParams.set('task_arn', task_arn);\n }\n if (skip_webhooks) {\n urlObj.searchParams.set('skip_webhooks', skip_webhooks === true ? 'true' : 'false');\n }\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst rollbackJob = async ({ debug, baseUri, env, flow, user_id, apikey, job_root, tap }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${user_id}/jobs/rollback`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n \n const body = {\n job_root,\n tap,\n };\n \n debug && debug('uri:', uri);\n debug && debug('body:', body);\n const { data } = await axios.post(uri, body, { headers });\n return data;\n};\n\nconst getJobStatus = async ({ debug, baseUri, env, flow, user_id, apikey, job_root, include_export_details = false }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${user_id}/jobs/status`);\n urlObj.searchParams.set('job_root', job_root);\n urlObj.searchParams.set('include_export_details', include_export_details ? 'true' : 'false');\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nexport {\n genCredentialsOnClientApi,\n getEnvConfig,\n getTenants,\n getSupportedSources,\n getSupportedConnectors,\n getLinkedSources,\n getLinkedConnectors,\n patchLinkedSourceConfig,\n patchLinkedConnectorConfig,\n getSupportedFlows,\n deleteTenantSchedules,\n getSupportedFlow,\n getSupportedTargets,\n resetAvailableEntities,\n runJob,\n retriggerJob,\n getEnvJobs,\n getScheduleList,\n updateSchedule,\n killJob,\n rollbackJob,\n getJobStatus,\n};\n","import Debug from 'debug';\nimport { getSupportedSources, getSupportedConnectors, getSupportedTargets } from '../../helpers/api.js';\n\nconst debug = Debug('commands:env:validators');\n\nexport const validateAvailableSources = async (forkedSources, clientApiBaseUri, apikey, flows, env) => {\n\n if (!Array.isArray(forkedSources)) {\n throw new Error(`availableSources.json must be an array of objects`);\n }\n\n const linkedSources = (await Promise.all(flows.filter(flow => flow.version == 1).map(async (flow) => {\n const linkedSources = await getSupportedSources({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow: flow.id,\n apikey,\n });\n return linkedSources;\n }))).flat();\n\n const newSourceIds = forkedSources.map((source) => {\n if (!source.tap) {\n throw new Error(`Source ${JSON.stringify(source)} has no tap id`);\n }\n return source.tap;\n });\n const duplicateIds = newSourceIds.filter((id, index) => newSourceIds.indexOf(id) !== index);\n if (duplicateIds.length > 0) {\n throw new Error(`Duplicate source id(s) found in availableSources.json: ${duplicateIds.join(', ')}. All sources must have a unique tap id.`);\n }\n\n\n const missingSources = linkedSources.filter((source) => source.isForked && !newSourceIds.includes(source.tap));\n\n if (missingSources.length > 0) {\n throw new Error(`Sources ${missingSources.map((source) => source.label).join(', ')} are linked, but missing from your availableSources.json`);\n }\n}\n\n\nexport const validateAvailableTargets = async (forkedTargets, clientApiBaseUri, apikey, flows, env) => {\n if (!Array.isArray(forkedTargets)) {\n throw new Error(`availableTargets.json must be an array of objects`);\n }\n\n const linkedTargets = (await Promise.all(flows.filter(flow => flow.version == 1).map(async (flow) => {\n const linkedTargets = await getSupportedTargets({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow: flow.id,\n apikey,\n });\n return linkedTargets;\n }))).flat();\n\n const newTargetIds = forkedTargets.map((target) => {\n if (!target.target) {\n throw new Error(`Target ${JSON.stringify(target)} has no target id`);\n }\n return target.target;\n });\n const duplicateIds = newTargetIds.filter((id, index) => newTargetIds.indexOf(id) !== index);\n if (duplicateIds.length > 0) {\n throw new Error(`Duplicate target id(s) found in availableTargets.json: ${duplicateIds.join(', ')}. All targets must have a unique target id.`);\n }\n \n const missingTargets = linkedTargets.filter((target) => target.isForked && !newTargetIds.includes(target.target));\n\n if (missingTargets.length > 0) {\n throw new Error(`Targets ${missingTargets.map((target) => target.label).join(', ')} are linked, but missing from your availableTargets.json`);\n }\n}\n\nexport const validateAvailableConnectors = async (forkedConnectors, clientApiBaseUri, apikey, flows, env) => {\n if (!Array.isArray(forkedConnectors)) {\n throw new Error(`availableConnectors.json must be an array of objects`);\n }\n\n const linkedConnectors = (await Promise.all(flows.filter(flow => flow.version == 2).map(async (flow) => {\n const linkedConnectors = await getSupportedConnectors({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow: flow.id, \n apikey,\n });\n return linkedConnectors;\n }))).flat();\n\n\n const newConnectorIds = forkedConnectors.map((connector) => {\n if (!connector.id) {\n throw new Error(`Connector ${JSON.stringify(connector)} has no id`);\n }\n return connector.id;\n });\n const duplicateIds = newConnectorIds.filter((id, index) => newConnectorIds.indexOf(id) !== index);\n if (duplicateIds.length > 0) {\n throw new Error(`Duplicate connector id(s) found in availableConnectors.json: ${duplicateIds.join(', ')}. All connectors must have a unique id.`);\n }\n\n const missingConnectors = linkedConnectors.filter((connector) => {\n return connector.isForked && !newConnectorIds.includes(connector.id)\n });\n \n \n if (missingConnectors.length > 0) {\n throw new Error(`Connectors ${missingConnectors.map((connector) => connector.id).join(', ')} are linked, but missing from your availableConnectors.json`);\n }\n}\n\n","import path from 'path';\nimport { readFile } from 'fs/promises';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\n// import logUpdate from 'log-update';\nimport descriptions from '../../helpers/descriptions.js';\nimport { getFolderFiles } from '../../helpers/utils.js';\nimport { cl, pr, printJSON, themed } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi, resetAvailableEntities, getSupportedFlows } from '../../helpers/api.js';\nimport { validateAvailableConnectors, validateAvailableSources, validateAvailableTargets } from './validators.js';\n\nconst debug = Debug('commands:env:deploy');\n\nconst command = 'deploy';\n\nconst desc = 'Deploy Environment settings';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('sourceFolder', descriptions.options['sourceFolder'].config)\n .demandOption('sourceFolder', descriptions.options['sourceFolder'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, sourceFolder } = argv;\n const { clientApiBaseUri } = hg;\n\n // eslint-disable-next-line no-undef\n const folderPrefix = path.resolve(process.cwd(), sourceFolder);\n let message;\n let spinner = ora();\n try {\n // 1. build list of deployable files\n message = themed(`Scanning ${themed(folderPrefix, 'info')} for deployable files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const deployableFiles = await getFolderFiles(folderPrefix, {\n filter: {\n pattern:\n '((**/requirements.txt)|(**/availableSources.json)|(**/availableTargets.json)|(**/availableConnectors.json)|(**/customTaps.json))',\n },\n });\n if (deployableFiles.length === 0) {\n if (json) {\n printJSON({ status: 'error', error: 'There are no files to deploy at the specified location!' });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed('There are no files to deploy at the specified location!')}`, 'secondary'));\n }\n return;\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n for (const filePath of deployableFiles) {\n if (!filePath.endsWith('.json')) continue;\n\n try {\n const fileContent = await readFile(filePath, { encoding:'utf-8' });\n JSON.parse(fileContent);\n } catch (error) {\n throw new Error(`File ${filePath} is not a valid JSON: ${String(error)}`);\n }\n }\n\n // Validate files\n const flows = await getSupportedFlows({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n });\n for (const filePath of deployableFiles) {\n if (filePath.endsWith('availableSources.json')) {\n const forkedSources = JSON.parse(await readFile(filePath, { encoding:'utf-8' }));\n await validateAvailableSources(forkedSources, clientApiBaseUri, apikey, flows, env);\n }\n if (filePath.endsWith('availableTargets.json')) {\n const forkedTargets = JSON.parse(await readFile(filePath, { encoding:'utf-8' }));\n await validateAvailableTargets(forkedTargets, clientApiBaseUri, apikey, flows, env);\n }\n if (filePath.endsWith('availableConnectors.json')) {\n const forkedConnectors = JSON.parse(await readFile(filePath, { encoding:'utf-8' })); \n await validateAvailableConnectors(forkedConnectors, clientApiBaseUri, apikey, flows, env);\n }\n }\n\n // 2. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'env-deploy',\n env,\n apikey,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // create authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n // 3. upload new files\n message = themed(`Deploying environment files`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n const rootKey = `config/`;\n const table = new Table({ head: ['File', 'Status'] });\n for await (const file of deployableFiles) {\n const filename = path.basename(file);\n\n message = themed(`Pushing file: ${themed(filename, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const readBuffer = await readFile(file);\n const params = {\n Bucket: env,\n Key: `${rootKey}${filename}`,\n Body: readBuffer,\n };\n const res = await s3.putObject(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-put-res', res);\n table.push([filename, 'Deployed']);\n // handling redis change\n await resetAvailableEntities({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apiKey: apikey\n });\n }\n\n if (json) {\n printJSON({ status: 'success', deployedFiles: deployableFiles });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n !json && spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { mkdir, writeFile, stat } from 'fs/promises';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { filterFiles, streamToString } from '../../helpers/utils.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\n\nconst debug = Debug('commands:env:download');\n\nconst command = 'download';\n\nconst desc = 'Download Environment settings';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n // hotglue environment download -e <env> -o -d downloads\n return yargs.option('downloadTo', descriptions.options['downloadTo'].config);\n // .option('overwrite', descriptions.options['overwrite'].config);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, downloadTo } = argv;\n const { clientApiBaseUri } = hg;\n\n const folderPrefix = path.resolve(process.cwd(), downloadTo);\n let message;\n let spinner = ora();\n try {\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'env-download',\n env,\n apikey,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // create authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n // 2. get list of files from AWS bucket\n message = themed(`Scanning environment ${themed(env, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const params = {\n Bucket: env,\n Prefix: `config/`,\n };\n const { Contents: s3Files } = await s3.listObjectsV2(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-files', s3Files);\n\n // 3. filter only downloadable files\n const filesToDownload = s3Files\n ? filterFiles(\n s3Files.map((item) => item.Key),\n {\n pattern:\n '((*/requirements.txt)|(*/availableSources.json)|(*/availableTargets.json)|(*/availableConnectors.json)|(*/customTaps.json))',\n }\n )\n : [];\n if (!filesToDownload || filesToDownload.length === 0) {\n json\n ? printJSON({ status: 'success', downloadedFiles: [] })\n : spinner.warn(themed(`Warning: ${themed('Nothing to download!')}`, 'secondary'));\n return;\n }\n\n // 4. download environment config files\n message = themed(`Downloading to ${themed(folderPrefix, 'info')}`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n const table = new Table({ head: ['File', 'Status'] });\n for await (const item of filesToDownload) {\n // create destination folder\n const filename = path.basename(item);\n const fullPath = path.resolve(folderPrefix, filename);\n debug('local-file', fullPath);\n\n // ensure destination folder exists\n await mkdir(path.dirname(fullPath), { recursive: true });\n // download s3 object into destination folder\n message = themed(`Downloading file: ${themed(filename, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const fileStream = s3.getObject({ Bucket: env, Key: item }).createReadStream();\n await writeFile(fullPath, await streamToString(fileStream));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n // debug('downloaded', env + item);\n table.push([filename, 'Downloaded']);\n }\n\n if (json) {\n printJSON({ status: 'success', downloadedFiles: filesToDownload });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as deploy from './deploy.js';\nimport * as download from './download.js';\n\nexport const env = [deploy, download];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { env } from './env/index.js';\n\nconst debug = Debug('commands:env');\n\nconst command = 'env <action>';\n\nconst desc = 'Manage environment settings';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(env);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import { streamToString } from './utils.js';\n\nconst isV2Flow = async (s3, envId, tenantId, flowId) => {\n try {\n const fileStream = s3\n .getObject({\n Bucket: envId,\n Key: `${tenantId}/flows/${flowId}/flow.json`,\n })\n .createReadStream();\n\n const fileString = await streamToString(fileStream);\n\n const fileJson = JSON.parse(fileString);\n\n return fileJson.version === 2;\n } catch (error) {\n return false;\n }\n};\n\nconst getEntityLabel = async (s3, envId, tenantId, flowId, isV2 = undefined) => {\n const _isV2Flow = isV2 ?? (await isV2Flow(s3, envId, tenantId, flowId));\n return _isV2Flow ? 'connectors' : 'taps';\n};\n\nexport { isV2Flow, getEntityLabel };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, themed, cl, printJSON } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\nimport { getEntityLabel } from '../../helpers/flow.js';\n\nconst debug = Debug('commands:etl:delete');\n\nconst command = 'delete';\n\nconst desc = 'Delete ETL scripts';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('tap', descriptions.options['tap'].config)\n .demandOption('tap', descriptions.options['tap'].demandText)\n .option('tenant', { ...descriptions.options['tenant'].config })\n .demandOption('tenant', descriptions.options['tenant'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, tap, tenant } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n message = themed(\n `Deleting ETL scripts for Tenant ${themed(tenant, 'info')} Flow ${themed(flow, 'info')} and Tap ${themed(\n tap,\n 'info'\n )} to ${themed(env, 'info')}`\n );\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'etl-deploy',\n env,\n tenant,\n flow,\n tap,\n apikey,\n });\n // created authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. delete ETL folder\n message = themed(`Deleting ETL scripts`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const keyPrefix = `${tenant}/flows/${flow}/${await getEntityLabel(s3, env, tenant, flow)}/${tap}/etl/`;\n // 2.1 Get all objects from folder\n const listObjectsRes = await s3.listObjectsV2({ Bucket: env, Prefix: keyPrefix }).promise();\n debug('s3-list-objects-res', listObjectsRes);\n if (listObjectsRes.Contents?.length > 0) {\n // 2.2 Delete all objects\n const deleteObjectsRes = await s3\n .deleteObjects({\n Bucket: env,\n Delete: {\n Objects: listObjectsRes.Contents.map((object) => {\n return { Key: object.Key };\n }),\n },\n })\n .promise();\n debug('s3-list-objects-res', deleteObjectsRes);\n }\n // 2.3 Delete the folder if needed\n const response = await s3.deleteObject({ Bucket: env, Key: keyPrefix }).promise();\n debug('s3-delete-object-res', response);\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n if (listObjectsRes.Contents?.length > 0) {\n const table = new Table({ head: ['File', 'Status'] });\n listObjectsRes.Contents.filter(({ Key }) => {\n return Key !== keyPrefix;\n }).forEach(({ Key }) => {\n const splittedKey = Key.split('/');\n const filename = splittedKey[splittedKey.length - 1];\n table.push([filename, themed('Deleted', 'info')]);\n });\n if (json) {\n printJSON({\n status: 'success',\n deletedObjects: (listObjectsRes.Contents ?? []).map(({ Key }) => Key),\n });\n } else {\n cl(table.toString());\n }\n } else {\n message = themed(`There was no file or folder to be deleted`);\n json\n ? printJSON({ status: 'success', deletedObjects: [] })\n : spinner.info(themed(`Info: ${message}.`, 'secondary'));\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { readFile } from 'fs/promises';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport { getFolderFiles } from '../../helpers/utils.js';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, cl, themed, printJSON } from '../../helpers/print.js';\nimport {\n genCredentialsOnClientApi,\n getLinkedConnectors,\n getLinkedSources,\n getSupportedConnectors,\n getSupportedFlows,\n getSupportedSources,\n} from '../../helpers/api.js';\nimport { isV2Flow, getEntityLabel } from '../../helpers/flow.js';\n\nconst debug = Debug('commands:etl:deploy');\n\nconst command = 'deploy';\n\nconst desc = 'Deploy ETL scripts';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('tap', descriptions.options['tap'].config)\n .option('all', descriptions.options['all'].config)\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('sourceFolder', descriptions.options['sourceFolder'].config)\n .demandOption('sourceFolder', descriptions.options['sourceFolder'].demandText);\n};\n\nconst validateEtlScriptFiles = (filenames) => {\n\n const ETL_SCRIPT_BLACKLISTED_FILES = [\n \"config.json\",\n \"source-config.json\",\n \"target-config.json\",\n \"catalog.json\",\n \"target-catalog.json\",\n \"state.json\"\n ]\n\n const ETL_SCRIPT_BLACKLISTED_DIRECTORIES = [\n \"sync-output\",\n \"snapshots\",\n \"etl-output\",\n \".venv\"\n ]\n for (const filename of filenames) {\n if (ETL_SCRIPT_BLACKLISTED_FILES.includes(filename)) {\n throw new Error(`File ${filename} is a reserved file name and cannot be used in the ETL script.`);\n }\n const violatedDirectory = ETL_SCRIPT_BLACKLISTED_DIRECTORIES.find((directory) => filename.startsWith(`${directory}/`));\n if (violatedDirectory) {\n throw new Error(`Directory ${violatedDirectory} is a reserved directory name and cannot be used in the ETL script.`);\n }\n }\n}\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, tap, all, tenant, sourceFolder } = argv;\n const { clientApiBaseUri } = hg;\n\n if (!all && !tap) {\n throw new Error(\n `${descriptions.options['tap'].demandText} Or you can pass the --all flag to run this command for all taps/connectors.`\n );\n }\n\n let message;\n let spinner = ora();\n const folderPrefix = path.resolve(process.cwd(), sourceFolder);\n try {\n message = themed(\n `Deploying script for Tenant ${themed(tenant, 'info')} Flow ${themed(flow, 'info')}${\n tap ? ` and Tap ${themed(tap, 'info')}` : ''\n } to ${themed(env, 'info')}`\n );\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n // 1. build list of deployable files\n const deployableFiles = await getFolderFiles(folderPrefix, {\n recursive: true,\n filter: { pattern: '!((**/sync-output)|(**/etl-output)|(**/snapshots))' },\n });\n if (deployableFiles.length === 0) {\n json\n ? printJSON({ status: 'error', error: 'There are no files to deploy at the specified location!' })\n : spinner.fail(\n themed(`Error: ${themed('There are no files to deploy at the specified location!')}.`, 'secondary')\n );\n return;\n }\n\n // Validate files\n validateEtlScriptFiles(deployableFiles.map((file) => path.relative(sourceFolder, file)));\n\n\n // 2. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const params = {\n debug,\n baseUri: clientApiBaseUri,\n task: 'etl-deploy',\n env,\n tenant,\n flow,\n apikey,\n };\n if (tap) params.tap = tap;\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi(params);\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n // create authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n const isV2 = await isV2Flow(s3, env, tenant, flow);\n\n // 3. verify location is valid (consider ListObjects policy + listObjectsV2 + scan folder for key = config.json)\n message = themed(`Validating flow and tap location`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const supportedFlows = await getSupportedFlows({\n debug,\n baseUri: clientApiBaseUri,\n apikey,\n env,\n });\n\n const supportedFlow = supportedFlows.find(({ id }) => id === flow);\n\n let connectors = [];\n\n try {\n if (tenant === 'default' || supportedFlow?.type) {\n const supportedSources = isV2\n ? await getSupportedConnectors({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow,\n apikey,\n })\n : await getSupportedSources({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow,\n apikey,\n });\n connectors = (supportedSources ?? []).filter((ss) => (tap ? ss[isV2 ? 'id' : 'tap'] === tap : true));\n if (tap && connectors.length === 0) throw new Error('Tap is not supported');\n } else {\n const linkedSources = isV2\n ? await getLinkedConnectors({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow,\n tenant,\n apikey,\n })\n : await getLinkedSources({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow,\n tenant,\n apikey,\n });\n connectors = (linkedSources ?? []).filter((ls) => (tap ? ls[isV2 ? 'id' : 'tap'] === tap : true));\n if (tap && connectors.length === 0) throw new Error('Tap is not linked');\n }\n } catch (err) {\n debug('err', err);\n throw new Error(`Target location doesn't exist. Check your tenant, flow and tap arguments.`);\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const table = new Table({ head: ['File', 'Status'] });\n for (const connector of connectors) {\n const connectorId = connector[isV2 ? 'id' : 'tap'];\n message = themed(`Preparing ${connectorId} deployment target`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const rootKey = `${tenant}/flows/${flow}/${await getEntityLabel(\n null,\n null,\n null,\n null,\n isV2\n )}/${connectorId}/etl/`;\n const { Contents } = await s3.listObjectsV2({ Bucket: env, Prefix: `${rootKey}` }).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('contents', Contents);\n // 4. cleanup old files\n const filesToDelete = Contents.map((item) => ({ Key: item.Key }));\n if (filesToDelete.length > 0) {\n message = themed(`Removing old ${connectorId} ETL files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const delParams = {\n Bucket: env,\n Delete: { Objects: filesToDelete, Quiet: true },\n };\n await s3.deleteObjects(delParams).promise();\n filesToDelete.forEach(({ Key }) =>\n table.push([`${connectorId}/${Key.substring(rootKey.length)}`, themed('Deleted', 'warn')])\n );\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n // 5. upload new files\n // message = themed(`Deploying ETL scripts`);\n // !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n for await (const file of deployableFiles) {\n const relativePath =\n process.platform === 'win32'\n ? path.relative(sourceFolder, file).replace(/\\\\/g, '/')\n : path.relative(sourceFolder, file);\n const key = `${rootKey}${relativePath}`;\n message = themed(`Deploying file: ${themed(`${connectorId}/${relativePath}`, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const readBuffer = await readFile(file);\n const params = {\n Bucket: env,\n Key: key,\n Body: readBuffer,\n };\n const res = await s3.putObject(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-put-res', res);\n table.push([`${connectorId}/${relativePath}`, themed('Deployed', 'info')]);\n }\n }\n\n if (json) {\n printJSON({ status: 'success', deployedFiles: deployableFiles });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { mkdir, writeFile, stat } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport ProgressBar from 'progress';\nimport descriptions from '../../helpers/descriptions.js';\nimport print, { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { filterFiles, streamToString } from '../../helpers/utils.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\nimport { getEntityLabel } from '../../helpers/flow.js';\n\nconst debug = Debug('commands:etl:download');\n\nconst command = 'download';\n\nconst desc = 'Download ETL scripts';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('tap', descriptions.options['tap'].config)\n .demandOption('tap', descriptions.options['tap'].demandText)\n .option('downloadTo', descriptions.options['downloadTo'].config)\n .demandOption('downloadTo', descriptions.options['downloadTo'].demandText)\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('overwrite', descriptions.options['overwrite'].config)\n .demandOption('overwrite', descriptions.options['overwrite'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, tap, tenant, downloadTo, overwrite } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n const folderPrefix = path.resolve(process.cwd(), downloadTo);\n try {\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'etl-download',\n env,\n tenant,\n flow,\n tap,\n apikey,\n });\n // created authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. get list of downloadable files\n message = themed(`Scanning for downloadable files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const keyPrefix = `${tenant}/flows/${flow}/${await getEntityLabel(s3, env, tenant, flow)}/${tap}/etl/`;\n const params = {\n Bucket: env,\n Prefix: keyPrefix,\n };\n const { Contents: s3Files } = await s3.listObjectsV2(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-list-res', s3Files);\n // filter unwanted files from source\n const filesToDownload = s3Files\n ? filterFiles(\n s3Files.map((item) => item.Key),\n { pattern: '!(.ipynb_checkpoints/*)' }\n )\n : [];\n if (!filesToDownload || filesToDownload.length === 0) {\n json\n ? printJSON({ status: 'success', downloadedFiles: [] })\n : spinner.warn(themed(`Warning: ${themed('Nothing to download!')}`, 'secondary'));\n return;\n }\n\n // 3. download files\n message = themed(`Downloading script files to ${themed(folderPrefix, 'info')}`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n const table = new Table({ head: ['File', 'Status'] });\n for await (const file of filesToDownload) {\n const subPath = file.substring(keyPrefix.length); // path.basename(`${env}/${item.Key}`);\n const fullPath = path.resolve(folderPrefix, subPath);\n debug('file', fullPath);\n if (file.endsWith('/')) {\n !existsSync(fullPath) && (await mkdir(fullPath, { recursive: true }));\n continue;\n }\n // skip if exists and overwrite is false\n if (!overwrite) {\n try {\n await stat(fullPath);\n debug('exists, skipping');\n table.push([subPath, 'Skipped']);\n continue;\n } catch (err) {\n if (err.code !== 'ENOENT') cl(err);\n }\n }\n\n message = themed(`Downloading file: ${themed(subPath, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n // ensure destination folder exists\n await mkdir(path.dirname(fullPath), { recursive: true });\n // download s3 object into destination folder\n const fileStream = s3.getObject({ Bucket: env, Key: file }).createReadStream();\n await writeFile(fullPath, await streamToString(fileStream));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n table.push([subPath, 'Downloaded']);\n }\n\n if (json) {\n printJSON({ status: 'success', downloadedFiles: filesToDownload });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createIterator;\n\nvar _isArrayLike = require('./isArrayLike.js');\n\nvar _isArrayLike2 = _interopRequireDefault(_isArrayLike);\n\nvar _getIterator = require('./getIterator.js');\n\nvar _getIterator2 = _interopRequireDefault(_getIterator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createArrayIterator(coll) {\n var i = -1;\n var len = coll.length;\n return function next() {\n return ++i < len ? { value: coll[i], key: i } : null;\n };\n}\n\nfunction createES2015Iterator(iterator) {\n var i = -1;\n return function next() {\n var item = iterator.next();\n if (item.done) return null;\n i++;\n return { value: item.value, key: i };\n };\n}\n\nfunction createObjectIterator(obj) {\n var okeys = obj ? Object.keys(obj) : [];\n var i = -1;\n var len = okeys.length;\n return function next() {\n var key = okeys[++i];\n if (key === '__proto__') {\n return next();\n }\n return i < len ? { value: obj[key], key } : null;\n };\n}\n\nfunction createIterator(coll) {\n if ((0, _isArrayLike2.default)(coll)) {\n return createArrayIterator(coll);\n }\n\n var iterator = (0, _getIterator2.default)(coll);\n return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll);\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = isArrayLike;\nfunction isArrayLike(value) {\n return value && typeof value.length === 'number' && value.length >= 0 && value.length % 1 === 0;\n}\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (coll) {\n return coll[Symbol.iterator] && coll[Symbol.iterator]();\n};\n\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = asyncify;\n\nvar _initialParams = require('./internal/initialParams.js');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _setImmediate = require('./internal/setImmediate.js');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nvar _wrapAsync = require('./internal/wrapAsync.js');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Take a sync function and make it async, passing its return value to a\n * callback. This is useful for plugging sync functions into a waterfall,\n * series, or other async functions. Any arguments passed to the generated\n * function will be passed to the wrapped function (except for the final\n * callback argument). Errors thrown will be passed to the callback.\n *\n * If the function passed to `asyncify` returns a Promise, that promises's\n * resolved/rejected state will be used to call the callback, rather than simply\n * the synchronous return value.\n *\n * This also means you can asyncify ES2017 `async` functions.\n *\n * @name asyncify\n * @static\n * @memberOf module:Utils\n * @method\n * @alias wrapSync\n * @category Util\n * @param {Function} func - The synchronous function, or Promise-returning\n * function to convert to an {@link AsyncFunction}.\n * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be\n * invoked with `(args..., callback)`.\n * @example\n *\n * // passing a regular synchronous function\n * async.waterfall([\n * async.apply(fs.readFile, filename, \"utf8\"),\n * async.asyncify(JSON.parse),\n * function (data, next) {\n * // data is the result of parsing the text.\n * // If there was a parsing error, it would have been caught.\n * }\n * ], callback);\n *\n * // passing a function returning a promise\n * async.waterfall([\n * async.apply(fs.readFile, filename, \"utf8\"),\n * async.asyncify(function (contents) {\n * return db.model.create(contents);\n * }),\n * function (model, next) {\n * // `model` is the instantiated model object.\n * // If there was an error, this function would be skipped.\n * }\n * ], callback);\n *\n * // es2017 example, though `asyncify` is not needed if your JS environment\n * // supports async functions out of the box\n * var q = async.queue(async.asyncify(async function(file) {\n * var intermediateStep = await processFile(file);\n * return await somePromise(intermediateStep)\n * }));\n *\n * q.push(files);\n */\nfunction asyncify(func) {\n if ((0, _wrapAsync.isAsync)(func)) {\n return function (...args /*, callback*/) {\n const callback = args.pop();\n const promise = func.apply(this, args);\n return handlePromise(promise, callback);\n };\n }\n\n return (0, _initialParams2.default)(function (args, callback) {\n var result;\n try {\n result = func.apply(this, args);\n } catch (e) {\n return callback(e);\n }\n // if result is Promise object\n if (result && typeof result.then === 'function') {\n return handlePromise(result, callback);\n } else {\n callback(null, result);\n }\n });\n}\n\nfunction handlePromise(promise, callback) {\n return promise.then(value => {\n invokeCallback(callback, null, value);\n }, err => {\n invokeCallback(callback, err && (err instanceof Error || err.message) ? err : new Error(err));\n });\n}\n\nfunction invokeCallback(callback, error, value) {\n try {\n callback(error, value);\n } catch (err) {\n (0, _setImmediate2.default)(e => {\n throw e;\n }, err);\n }\n}\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (fn) {\n return function (...args /*, callback*/) {\n var callback = args.pop();\n return fn.call(this, args, callback);\n };\n};\n\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fallback = fallback;\nexports.wrap = wrap;\n/* istanbul ignore file */\n\nvar hasQueueMicrotask = exports.hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask;\nvar hasSetImmediate = exports.hasSetImmediate = typeof setImmediate === 'function' && setImmediate;\nvar hasNextTick = exports.hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function';\n\nfunction fallback(fn) {\n setTimeout(fn, 0);\n}\n\nfunction wrap(defer) {\n return (fn, ...args) => defer(() => fn(...args));\n}\n\nvar _defer;\n\nif (hasQueueMicrotask) {\n _defer = queueMicrotask;\n} else if (hasSetImmediate) {\n _defer = setImmediate;\n} else if (hasNextTick) {\n _defer = process.nextTick;\n} else {\n _defer = fallback;\n}\n\nexports.default = wrap(_defer);","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.isAsyncIterable = exports.isAsyncGenerator = exports.isAsync = undefined;\n\nvar _asyncify = require('../asyncify.js');\n\nvar _asyncify2 = _interopRequireDefault(_asyncify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isAsync(fn) {\n return fn[Symbol.toStringTag] === 'AsyncFunction';\n}\n\nfunction isAsyncGenerator(fn) {\n return fn[Symbol.toStringTag] === 'AsyncGenerator';\n}\n\nfunction isAsyncIterable(obj) {\n return typeof obj[Symbol.asyncIterator] === 'function';\n}\n\nfunction wrapAsync(asyncFn) {\n if (typeof asyncFn !== 'function') throw new Error('expected a function');\n return isAsync(asyncFn) ? (0, _asyncify2.default)(asyncFn) : asyncFn;\n}\n\nexports.default = wrapAsync;\nexports.isAsync = isAsync;\nexports.isAsyncGenerator = isAsyncGenerator;\nexports.isAsyncIterable = isAsyncIterable;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// A temporary value used to identify if the loop should be broken.\n// See #1064, #1293\nconst breakLoop = {};\nexports.default = breakLoop;\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _once = require('./once.js');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _iterator = require('./iterator.js');\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _onlyOnce = require('./onlyOnce.js');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./wrapAsync.js');\n\nvar _asyncEachOfLimit = require('./asyncEachOfLimit.js');\n\nvar _asyncEachOfLimit2 = _interopRequireDefault(_asyncEachOfLimit);\n\nvar _breakLoop = require('./breakLoop.js');\n\nvar _breakLoop2 = _interopRequireDefault(_breakLoop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = limit => {\n return (obj, iteratee, callback) => {\n callback = (0, _once2.default)(callback);\n if (limit <= 0) {\n throw new RangeError('concurrency limit cannot be less than 1');\n }\n if (!obj) {\n return callback(null);\n }\n if ((0, _wrapAsync.isAsyncGenerator)(obj)) {\n return (0, _asyncEachOfLimit2.default)(obj, limit, iteratee, callback);\n }\n if ((0, _wrapAsync.isAsyncIterable)(obj)) {\n return (0, _asyncEachOfLimit2.default)(obj[Symbol.asyncIterator](), limit, iteratee, callback);\n }\n var nextElem = (0, _iterator2.default)(obj);\n var done = false;\n var canceled = false;\n var running = 0;\n var looping = false;\n\n function iterateeCallback(err, value) {\n if (canceled) return;\n running -= 1;\n if (err) {\n done = true;\n callback(err);\n } else if (err === false) {\n done = true;\n canceled = true;\n } else if (value === _breakLoop2.default || done && running <= 0) {\n done = true;\n return callback(null);\n } else if (!looping) {\n replenish();\n }\n }\n\n function replenish() {\n looping = true;\n while (running < limit && !done) {\n var elem = nextElem();\n if (elem === null) {\n done = true;\n if (running <= 0) {\n callback(null);\n }\n return;\n }\n running += 1;\n iteratee(elem.value, elem.key, (0, _onlyOnce2.default)(iterateeCallback));\n }\n looping = false;\n }\n\n replenish();\n };\n};\n\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = once;\nfunction once(fn) {\n function wrapper(...args) {\n if (fn === null) return;\n var callFn = fn;\n fn = null;\n callFn.apply(this, args);\n }\n Object.assign(wrapper, fn);\n return wrapper;\n}\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = onlyOnce;\nfunction onlyOnce(fn) {\n return function (...args) {\n if (fn === null) throw new Error(\"Callback was already called.\");\n var callFn = fn;\n fn = null;\n callFn.apply(this, args);\n };\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = asyncEachOfLimit;\n\nvar _breakLoop = require('./breakLoop.js');\n\nvar _breakLoop2 = _interopRequireDefault(_breakLoop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// for async generators\nfunction asyncEachOfLimit(generator, limit, iteratee, callback) {\n let done = false;\n let canceled = false;\n let awaiting = false;\n let running = 0;\n let idx = 0;\n\n function replenish() {\n //console.log('replenish')\n if (running >= limit || awaiting || done) return;\n //console.log('replenish awaiting')\n awaiting = true;\n generator.next().then(({ value, done: iterDone }) => {\n //console.log('got value', value)\n if (canceled || done) return;\n awaiting = false;\n if (iterDone) {\n done = true;\n if (running <= 0) {\n //console.log('done nextCb')\n callback(null);\n }\n return;\n }\n running++;\n iteratee(value, idx, iterateeCallback);\n idx++;\n replenish();\n }).catch(handleError);\n }\n\n function iterateeCallback(err, result) {\n //console.log('iterateeCallback')\n running -= 1;\n if (canceled) return;\n if (err) return handleError(err);\n\n if (err === false) {\n done = true;\n canceled = true;\n return;\n }\n\n if (result === _breakLoop2.default || done && running <= 0) {\n done = true;\n //console.log('done iterCb')\n return callback(null);\n }\n replenish();\n }\n\n function handleError(err) {\n if (canceled) return;\n awaiting = false;\n done = true;\n callback(err);\n }\n\n replenish();\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = awaitify;\n// conditionally promisify a function.\n// only return a promise if a callback is omitted\nfunction awaitify(asyncFn, arity) {\n if (!arity) arity = asyncFn.length;\n if (!arity) throw new Error('arity is undefined');\n function awaitable(...args) {\n if (typeof args[arity - 1] === 'function') {\n return asyncFn.apply(this, args);\n }\n\n return new Promise((resolve, reject) => {\n args[arity - 1] = (err, ...cbArgs) => {\n if (err) return reject(err);\n resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]);\n };\n asyncFn.apply(this, args);\n });\n }\n\n return awaitable;\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _eachOfLimit = require('./internal/eachOfLimit.js');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _withoutIndex = require('./internal/withoutIndex.js');\n\nvar _withoutIndex2 = _interopRequireDefault(_withoutIndex);\n\nvar _wrapAsync = require('./internal/wrapAsync.js');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nvar _awaitify = require('./internal/awaitify.js');\n\nvar _awaitify2 = _interopRequireDefault(_awaitify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time.\n *\n * @name eachLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachLimit\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfLimit`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction eachLimit(coll, limit, iteratee, callback) {\n return (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback);\n}\nexports.default = (0, _awaitify2.default)(eachLimit, 4);\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = _withoutIndex;\nfunction _withoutIndex(iteratee) {\n return (value, index, callback) => iteratee(value, callback);\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _eachLimit = require('./eachLimit.js');\n\nvar _eachLimit2 = _interopRequireDefault(_eachLimit);\n\nvar _awaitify = require('./internal/awaitify.js');\n\nvar _awaitify2 = _interopRequireDefault(_awaitify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time.\n *\n * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item\n * in series and therefore the iteratee functions will complete in order.\n\n * @name eachSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachSeries\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfSeries`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction eachSeries(coll, iteratee, callback) {\n return (0, _eachLimit2.default)(coll, 1, iteratee, callback);\n}\nexports.default = (0, _awaitify2.default)(eachSeries, 3);\nmodule.exports = exports.default;","import path from 'path';\nimport { mkdir, writeFile, readFile, rename, unlink } from 'fs/promises';\nimport { createWriteStream, existsSync } from 'fs';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { isNullOrEmptyArray } from '../../helpers/utils.js';\nimport { genCredentialsOnClientApi, getEnvConfig } from '../../helpers/api.js';\nimport eachSeries from 'async/eachSeries.js';\n\nconst debug = Debug('commands:etl:setup-local-run');\n\n// Helper function to serialize Error objects for JSON output\nconst serializeError = (err) => {\n if (err instanceof Error) {\n const serialized = {\n message: err.message,\n name: err.name,\n stack: err.stack,\n };\n \n // Handle axios errors which have a response property\n if (err.response) {\n serialized.response = {\n status: err.response.status,\n statusText: err.response.statusText,\n data: err.response.data,\n };\n }\n \n // Include any additional enumerable properties\n Object.keys(err).forEach((key) => {\n if (!serialized[key]) {\n serialized[key] = err[key];\n }\n });\n \n return serialized;\n }\n \n // If it's not an Error, return as-is (could be a string or other type)\n return err;\n};\n\nconst command = 'setup-local-run <jobroot>';\n\nconst desc = 'Setup job data to run ETL locally';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('downloadTo', { ...descriptions.options['downloadTo'].config, default: '.' })\n .option('overwrite', { ...descriptions.options['overwrite'].config, default: false })\n .option('include-configs', { ...descriptions.options['includeConfigs'].config, default: false })\n};\n\nconst filterFilesList = (filesList, jobroot, includeConfigs) => {\n const filteredFilesList = filesList.filter(({ Key }) => {\n // only filter out config files if includeConfigs is false\n if (includeConfigs) {\n return true;\n }\n\n const escapedJobRoot = jobroot.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n // Filter out all *-config.json files in the root of \"jobroot\"\n const regexConfigFile = new RegExp(`${escapedJobRoot}/([^\\/]+)-config\\.json`);\n const isConfigFile = regexConfigFile.test(Key);\n\n // Filter out snapshots/tenant-config.json file\n const regexTenantConfigFile = new RegExp(`${escapedJobRoot}/snapshots/tenant-config\\.json`);\n const isTenantConfigFile = regexTenantConfigFile.test(Key);\n \n return !(isConfigFile || isTenantConfigFile);\n });\n\n return filteredFilesList;\n};\n\n\nconst downloadJobFiles = async (jobroot, filesList, json, localRoot, overwrite) => {\n let spinner = ora();\n let message;\n let skippedFiles = [];\n let downloadedFiles = [];\n\n try {\n const filesCount = filesList.length;\n let filesDownloaded = 0;\n\n // download job files one-by-one\n await eachSeries(\n filesList,\n async (item) => {\n filesDownloaded += 1;\n let fileName = item.Key.substring(jobroot.length + 1);\n fileName = fileName.replace(/^etl-output\\//, 'etl-output-reference/');\n fileName = fileName.replace(/^catalog-selected\\.json$/, 'catalog.json');\n fileName = fileName.replace(/^state\\.json$/, 'source-state.json');\n\n message = themed(`Downloading ${fileName} (${filesDownloaded}/${filesCount})`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const file = path.resolve(localRoot, fileName);\n debug('file', file);\n\n if (existsSync(file) && !overwrite) {\n skippedFiles.push(fileName);\n !json && spinner.warn(themed(`Warning: ${fileName} already exists in the local directory. Skipping download.`, 'secondary'));\n return;\n }\n\n // ensure destination folder exists\n await mkdir(path.dirname(file), { recursive: true });\n // download s3 object into destination folder\n const fileStream = item.S3Instance.getObject({ Bucket: item.BucketName, Key: item.Key }).createReadStream();\n const writableStream = createWriteStream(file, { flags: 'w' });\n let downloadedBytes = 0;\n\n // Monitor the stream's 'data' events for progress\n fileStream.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const progressPercent = ((downloadedBytes / item.Size) * 100).toFixed(2);\n !json && (spinner.text = themed(`In progress: ${message} ${progressPercent}% complete (${(downloadedBytes / 1024 / 1024).toFixed(2)} MB / ${(item.Size / 1024 / 1024).toFixed(2)} MB)`, 'secondary'));\n });\n\n fileStream.pipe(writableStream);\n\n return new Promise((resolve, reject) => {\n const cleanup = async (err) => {\n // Close/destroy streams\n if (!fileStream.destroyed) {\n fileStream.destroy();\n }\n if (!writableStream.destroyed) {\n writableStream.destroy();\n }\n \n // Delete partially written file on error\n if (err && existsSync(file)) {\n try {\n await unlink(file);\n debug(`Cleaned up partial file: ${file}`);\n } catch (unlinkErr) {\n debug(`Failed to delete partial file ${file}:`, unlinkErr);\n }\n }\n };\n\n writableStream.on('finish', () => {\n downloadedFiles.push(fileName);\n !json && spinner.succeed(`Successfully downloaded to ${fileName}`);\n resolve();\n });\n \n fileStream.on('error', async (err) => {\n !json && spinner.fail(`Download failed: ${err.message}`);\n await cleanup(err);\n reject(err);\n });\n \n writableStream.on('error', async (err) => {\n !json && spinner.fail(`File system error: ${err.message}`);\n await cleanup(err);\n reject(err);\n });\n });\n }\n );\n\n message = themed(`Downloading job files.`);\n !json && spinner.succeed(themed(`Finished: ${message}`, 'secondary'));\n return { downloadedFiles, skippedFiles };\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nconst getJobFilesList = async (env, s3, jobroot, json) => {\n let spinner = ora();\n let message = themed(`Scanning for downloadable files (${env})`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n try {\n const params = {\n Bucket: env,\n Prefix: jobroot,\n };\n\n let allFiles = [];\n let continuationToken = undefined;\n let isTruncated = true;\n let pageCount = 0;\n\n // Fetch all pages of results\n while (isTruncated) {\n pageCount += 1;\n const requestParams = { ...params };\n if (continuationToken) {\n requestParams.ContinuationToken = continuationToken;\n }\n\n const response = await s3.listObjectsV2(requestParams).promise();\n debug(`Page ${pageCount} response:`, {\n keyCount: response.Contents?.length || 0,\n isTruncated: response.IsTruncated,\n hasNextToken: !!response.NextContinuationToken,\n });\n\n if (response.Contents && response.Contents.length > 0) {\n allFiles = allFiles.concat(response.Contents);\n }\n\n isTruncated = response.IsTruncated === true;\n continuationToken = response.NextContinuationToken;\n\n // Update spinner with progress for large jobs\n if (!json && pageCount > 1) {\n spinner.text = themed(`In progress: ${message}... (found ${allFiles.length} files so far)`, 'secondary');\n }\n }\n\n debug('Total files found:', allFiles.length, 'across', pageCount, 'pages');\n\n if (allFiles.length === 0) {\n if (!json) {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed('Nothing to download!')}`, 'secondary'));\n }\n return [];\n }\n\n allFiles.forEach((item) => {\n item.BucketName = env;\n item.S3Instance = s3;\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}. Found ${allFiles.length} file${allFiles.length !== 1 ? 's' : ''}`, 'secondary'));\n\n return allFiles;\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nconst createStateJsonFile = async (jobDetailsJson, localRoot, json) => {\n let spinner = ora();\n let message = themed(`Creating state.json file`);\n\n try {\n if (jobDetailsJson.state != null && Object.keys(jobDetailsJson.state).length > 0) {\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const statePath = path.resolve(localRoot, 'state.json');\n await writeFile(statePath, JSON.stringify(jobDetailsJson.state, null, 2));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n}\n\nconst createEnvJobFile = async (envConfig, jobDetailsJson, localRoot, includeConfigs, json) => {\n let spinner = ora();\n let message = themed(`Creating .env file`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n try {\n let jobEnvVars = {\n TENANT: jobDetailsJson.tenant ?? '',\n FLOW: jobDetailsJson.flow_id ?? '',\n ENV_ID: jobDetailsJson.env_id ?? '',\n JOB_ID: jobDetailsJson.job_id ?? '',\n API_URL: 'https://api.hotglue.com',\n JOB_ROOT: jobDetailsJson.s3_root ?? '',\n ROOT_DIR: localRoot,\n JOB_TYPE: jobDetailsJson.job_type ?? '',\n CONNECTOR_ID: jobDetailsJson.connector_id ?? '',\n TAP: jobDetailsJson.tap ?? '',\n TARGET: jobDetailsJson.target ?? '',\n };\n\n if (includeConfigs) {\n jobEnvVars.API_KEY = envConfig.api_key;\n }\n\n if (!isNullOrEmptyArray(envConfig.custom_env_vars)) {\n for (const customEnvVar of envConfig.custom_env_vars) {\n jobEnvVars[customEnvVar.name] = customEnvVar.value;\n }\n }\n const envJobFilePath = path.resolve(localRoot, '.env');\n await writeFile(envJobFilePath, Object.entries(jobEnvVars).map(([key, value]) => `${key}=${value}`).join('\\n'));\n \n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n let { hg, json, apikey, env, jobroot, downloadTo, overwrite, includeConfigs } = argv;\n const { clientApiBaseUri } = hg;\n\n if (jobroot.endsWith('/')) {\n jobroot = jobroot.slice(0, -1);\n }\n\n let message;\n let spinner = ora();\n const localRoot = downloadTo !== '.' ? path.resolve(process.cwd(), downloadTo) : path.resolve(process.cwd());\n\n try {\n // get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'job-download',\n env,\n apikey,\n jobroot,\n });\n\n // setup authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n message = themed(`Fetching environment config`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const envConfig = await getEnvConfig({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n message = themed(`Fetching job files (${env})`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n let filesList = await getJobFilesList(env, s3, jobroot, json);\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const customCacheBucket = envConfig.cache_bucket_name;\n let customCacheS3 = null;\n\n if (customCacheBucket) {\n message = themed(`Found custom cache bucket (${customCacheBucket}). Setting up custom cache S3 instance...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const customCacheBucketAccessKeyId = envConfig.cache_bucket_access_key_id;\n const customCacheBucketSecretAccessKey = envConfig.cache_bucket_secret_access_key;\n\n customCacheS3 = new AWS.S3({\n accessKeyId: customCacheBucketAccessKeyId,\n secretAccessKey: customCacheBucketSecretAccessKey,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n let customCacheFilesList = await getJobFilesList(customCacheBucket, customCacheS3, jobroot, json);\n filesList = [...filesList, ...customCacheFilesList];\n }\n\n message = themed(`Filtering job files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const filteredFilesList = filterFilesList(filesList, jobroot, includeConfigs);\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (!json) {\n // print remote files table\n const table = new Table({ head: ['File', 'Size', 'LastModified'] });\n filteredFilesList.forEach((item) => {\n const subPath = item.Key.substring(jobroot.length + 1);\n table.push([subPath, item.Size, item.LastModified.toLocaleString('en-US')]);\n });\n console.log(table.toString());\n }\n\n const { downloadedFiles, skippedFiles } = await downloadJobFiles(jobroot, filteredFilesList, json, localRoot, overwrite);\n\n const jobDetailsPath = path.resolve(localRoot, 'job-details.json');\n\n if (!existsSync(jobDetailsPath)) {\n const errorMessage = 'No job with that jobroot found, job roots can be copied from the job page and are structured as tenant_id/flows/flow_id/jobs/YYYY/MM/DD/HH/MM/job_i';\n if (json) {\n printJSON({ status: 'error', error: errorMessage });\n } else {\n spinner.fail(themed(`Error: ${errorMessage}`, 'secondary'));\n pr(themed(`Message: ${themed(errorMessage)}`, 'secondary'));\n }\n process.exit(1);\n }\n\n const jobDetails = await readFile(jobDetailsPath, 'utf8');\n const jobDetailsJson = JSON.parse(jobDetails);\n const sourceName = jobDetailsJson.tap;\n const targetName = jobDetailsJson.target;\n\n const sourceConfigPath = path.resolve(localRoot, `${sourceName}-config.json`);\n const targetConfigPath = path.resolve(localRoot, `${targetName}-config.json`);\n\n // rename {tap}-config.json to source-config.json\n if (existsSync(sourceConfigPath)) {\n const fileNameFrom = sourceConfigPath;\n const fileNameTo = 'source-config.json';\n message = themed(`Renaming ${fileNameFrom} to ${fileNameTo}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n await rename(fileNameFrom, path.resolve(localRoot, fileNameTo));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n\n // rename {target}-config.json to target-config.json\n if (existsSync(targetConfigPath)) {\n const fileNameFrom = targetConfigPath;\n const fileNameTo = 'target-config.json';\n message = themed(`Renaming ${fileNameFrom} to ${fileNameTo}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n await rename(fileNameFrom, path.resolve(localRoot, fileNameTo));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n\n await createStateJsonFile(jobDetailsJson, localRoot, json);\n await createEnvJobFile(envConfig, jobDetailsJson, localRoot, includeConfigs, json);\n\n // print final success message\n if (json) {\n printJSON({ status: 'success', downloadedFiles: downloadedFiles, skippedFiles: skippedFiles });\n } else {\n message = themed(`Setting up local job files.`);\n spinner.succeed(themed(`Finished: ${message}`, 'secondary'));\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as del from './delete.js';\nimport * as deploy from './deploy.js';\nimport * as download from './download.js';\nimport * as setupLocalRun from './setup-local-run.js';\n\nexport const etl = [del, deploy, download, setupLocalRun];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { etl } from './etl/index.js';\nconst debug = Debug('commands:etl');\n\nconst command = 'etl <action>';\n\nconst desc = 'Manage ETL scripts';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(etl);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import { inspect } from 'util';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\n\nconst debug = Debug('commands:flows:list');\n\nconst command = 'list';\n\nconst desc = 'List flows';\n\nconst isNullOrEmptyArray = (value) => {\n if (value == null || (Array.isArray(value) && value.length === 0)) {\n // The variable is either null, undefined, or an empty array\n return true;\n }\n return false;\n}\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs.option('tenant', { ...descriptions.options['tenant'].config });\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. get data from client-api backend\n message = themed(\n `Retrieving ${!tenant ? `the` : `${themed(tenant, 'info')} tenant's`} flows for environment: ${themed(\n env,\n 'info'\n )}`\n );\n // todo: look into changing when if client-api combined these two endpoints\n const uri = `${clientApiBaseUri}/${env}/flows/${tenant ? `linked?user_id=${tenant}` : `supported`}`;\n debug('requesting:', uri);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('response-data', data);\n\n // exit if there is no data\n if (!data || data.length === 0) {\n json\n ? printJSON([])\n : spinner.warn(themed(`Warning: ${themed('No flows for specified environment and tenant')}.`, 'secondary'));\n return;\n }\n\n if (json) {\n printJSON(data);\n } else {\n // generate results table\n const table = new Table({\n head: ['ID', 'Name', 'Flow Type', 'Taps', 'Targets', 'Connectors'],\n });\n\n data.sort((a, b) => (a.name || '').localeCompare(b.name || ''));\n\n data.forEach((item) =>\n table.push([\n item.id,\n item.name || '',\n (item.version == 2 ? 'Bidirectional' : (item.type ? 'Target Flow' : 'Source Flow')),\n (!isNullOrEmptyArray(item.taps) ? item.taps : (item.sources ? item.sources : [])).join('\\n'),\n (item.targets ? item.targets : []).join('\\n'),\n (item.connectors ? item.connectors : []).join('\\n'),\n ])\n );\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as list from './list.js';\n\nexport const flows = [list];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { flows } from './flows/index.js';\n\nconst debug = Debug('commands:flows');\nconst command = 'flows <action>';\n\nconst desc = 'Manage flows';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(flows);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { mkdir } from 'node:fs/promises';\nimport { createWriteStream } from 'fs';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\nimport eachSeries from 'async/eachSeries.js';\nconst debug = Debug('commands:jobs:download');\n\nconst command = 'download <jobroot>';\n\nconst desc = 'Download Job files';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs.option('downloadTo', descriptions.options['downloadTo'].config);\n // .option('jobroot', descriptions.options['jobroot'].config)\n // .demandOption('jobroot', descriptions.options['jobroot'].demandText)\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, jobroot, downloadTo } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'job-download',\n env,\n apikey,\n jobroot,\n });\n // get data from AWS bucket\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. get list of available files\n message = themed(`Scanning for downloadable files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const params = {\n Bucket: env,\n Prefix: jobroot,\n };\n const { Contents: filesList } = await s3.listObjectsV2(params).promise();\n debug('res', filesList);\n if (!filesList || filesList.length === 0) {\n if (json) {\n printJSON({ status: 'error', error: 'Nothing to download!' });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed('Nothing to download!')}`, 'secondary'));\n }\n return;\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (!json) {\n // print remote files\n const table = new Table({ head: ['File', 'Size', 'LastModified'] });\n filesList.forEach((item) => {\n const subPath = item.Key.substring(jobroot.length + 1);\n // const details = { LastModified: item.LastModified, Size: item.Size };\n table.push([subPath, item.Size, item.LastModified.toLocaleString('en-US')]); // JSON.stringify(details, undefined, 2)]);\n });\n console.log(table.toString());\n }\n\n // 3. download job files one-by-one\n const localRoot = path.resolve(process.cwd(), downloadTo, path.basename(jobroot));\n await eachSeries(\n // Filter out tap/target config files\n filesList.filter(({ Key }) => {\n // Filter out all *-config.json files in the root of \"jobroo\"\n const regex = new RegExp(`${jobroot}/([^\\/]+)-config\\.json`);\n return !regex.test(Key);\n }),\n async (item) => {\n message = themed(`Downloading file: ${themed(item.Key, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const file = path.resolve(localRoot, item.Key.substring(jobroot.length + 1));\n debug('file', file);\n\n // ensure destination folder exists\n await mkdir(path.dirname(file), { recursive: true });\n // download s3 object into destination folder\n const fileStream = s3.getObject({ Bucket: env, Key: item.Key }).createReadStream();\n const writableStream = createWriteStream(file, { flags: 'w' });\n fileStream.pipe(writableStream);\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n );\n\n // print final success message\n if (json) {\n printJSON({ status: 'success', downloadedFiles: filesList.map(({ Key }) => Key) });\n } else {\n message = themed(`Downloading job files.`);\n spinner.succeed(themed(`Finished: ${message}`, 'secondary'));\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:list');\n debug(...args);\n};\n\nconst command = 'list';\n\nconst desc = 'List jobs';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('count', descriptions.options['count'].config);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, tenant, count } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. get data from client-api backend\n message = themed(\n `Retrieving jobs for environment: ${themed(env, 'info')} flow: ${themed(flow, 'info')} tenant: ${themed(\n tenant,\n 'info'\n )}...`\n );\n const uri = `${clientApiBaseUri}/${env}/${flow}/${tenant}/jobs${count ? `?count=${count}` : ''}`;\n debug('requesting:', uri);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('response-data', data);\n\n // exit if there is no data\n if (!data || data.length === 0) {\n json\n ? printJSON([])\n : spinner.warn(\n themed(`Warning: ${themed('No jobs for the specified environment, flow and tenant')}.`, 'secondary')\n );\n return;\n }\n\n if (json) {\n printJSON(data);\n } else {\n // generate results table\n const table = new Table({ head: ['name', 'details'] });\n data.forEach((item) => table.push([item.job_name, JSON.stringify(item, undefined, 2)]));\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport { readFileSync, existsSync } from 'fs';\nimport Table from 'cli-table';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { runJob, getSupportedFlow } from '../../helpers/api.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:bulkRun');\n debug(...args);\n};\n\nconst command = 'bulk-run';\n\nconst desc = 'Run jobs in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('file', {\n describe: 'Path to JSON file containing array of jobs to run',\n type: 'string',\n alias: ['f'],\n demandOption: true,\n })\n .demandOption('file', 'Path to JSON file is required. Example: -f ./jobs.json');\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, file } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. Read and validate JSON file\n message = themed(`Reading jobs file: ${themed(file, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n if (!existsSync(file)) {\n throw new Error(`File not found: ${file}`);\n }\n\n const fileContent = readFileSync(file, { encoding: 'utf-8' });\n const jobs = JSON.parse(fileContent);\n\n if (!Array.isArray(jobs)) {\n throw new Error('JSON file must contain an array of job objects');\n }\n\n if (jobs.length === 0) {\n json\n ? printJSON({ status: 'error', error: 'No jobs found in file' })\n : spinner.warn(themed(`Warning: ${themed('No jobs found in file')}.`, 'secondary'));\n return;\n }\n\n // Validate each job has required fields\n for (let i = 0; i < jobs.length; i++) {\n const job = jobs[i];\n if (!job.flow) {\n throw new Error(`Job at index ${i} is missing required field: flow`);\n }\n if (!job.tenant) {\n throw new Error(`Job at index ${i} is missing required field: tenant`);\n }\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. Get unique flows and check if they are V2\n message = themed(`Checking flow versions...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const uniqueFlows = [...new Set(jobs.map((job) => job.flow))];\n const flowVersions = {};\n\n await Promise.all(\n uniqueFlows.map(async (flow) => {\n try {\n const supportedFlow = await getSupportedFlow({\n debug,\n baseUri: clientApiBaseUri,\n apikey,\n env,\n flow,\n });\n flowVersions[flow] = supportedFlow?.version === 2;\n } catch (err) {\n debug(`Error checking flow ${flow}:`, err);\n // Default to false if we can't determine\n flowVersions[flow] = false;\n }\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 3. Run all jobs in parallel\n message = themed(`Running ${themed(jobs.length, 'info')} job(s)...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const results = await Promise.all(\n jobs.map(async (job, index) => {\n const { flow, tenant, ...jobArgs } = job;\n const isV2Flow = flowVersions[flow] || false;\n\n try {\n const response = await runJob({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n tenant,\n flow,\n isV2Flow,\n ...jobArgs,\n });\n\n return {\n index,\n flow,\n tenant,\n ok: true,\n response,\n };\n } catch (error) {\n let errorResult;\n \n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n const statusCode = error.response.status;\n const statusText = error.response.statusText;\n const responseData = error.response.data;\n const message = error.message;\n \n debug('Error response:', {\n statusCode,\n statusText,\n message,\n data: responseData\n });\n \n errorResult = {\n statusCode,\n statusText,\n message,\n data: responseData\n };\n } else if (error.request) {\n // The request was made but no response was received\n debug('Error: No response received', error.message);\n errorResult = {\n message: error.message,\n request: error.request\n };\n } else {\n // Something happened in setting up the request that triggered an Error\n debug('Error:', error.message);\n errorResult = {\n message: error.message\n };\n }\n\n return {\n index,\n flow,\n tenant,\n ok: false,\n error: errorResult,\n };\n }\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 4. Print results\n if (json) {\n printJSON(results);\n } else {\n // Generate results table\n const table = new Table({\n head: ['Index', 'Flow', 'Tenant', 'Status', 'Response/Error'],\n });\n\n results.forEach((result) => {\n const status = result.ok ? 'SUCCESS' : 'FAILED';\n const responseOrError = result.ok\n ? JSON.stringify(result.response, undefined, 2)\n : JSON.stringify(result.error, undefined, 2);\n table.push([result.index, result.flow, result.tenant, status, responseOrError]);\n });\n\n console.log(table.toString());\n\n // Print summary\n const successCount = results.filter((r) => r.ok).length;\n const failCount = results.filter((r) => !r.ok).length;\n pr(\n themed(\n `Summary: ${themed(String(successCount), 'info')} succeeded, ${themed(String(failCount), 'error')} failed out of ${themed(\n String(results.length),\n 'info'\n )} total.`,\n 'secondary'\n )\n );\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message, stack: err.stack });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to run jobs'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport { readFileSync, existsSync } from 'fs';\nimport Table from 'cli-table';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { retriggerJob, getJobStatus } from '../../helpers/api.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:bulkRetrigger');\n debug(...args);\n};\n\nconst command = 'bulk-retrigger';\n\nconst desc = 'Retrigger jobs in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('file', {\n describe: 'Path to JSON file containing array of jobRoots to retrigger',\n type: 'string',\n alias: ['f'],\n demandOption: true,\n })\n .demandOption('file', 'Path to JSON file is required. Example: -f ./jobRoots.json');\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, file } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. Read and validate JSON file\n message = themed(`Reading jobRoots file: ${themed(file, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n if (!existsSync(file)) {\n throw new Error(`File not found: ${file}`);\n }\n\n const fileContent = readFileSync(file, { encoding: 'utf-8' });\n const jobRoots = JSON.parse(fileContent);\n\n if (!Array.isArray(jobRoots)) {\n throw new Error('JSON file must contain an array of jobRoot strings');\n }\n\n if (jobRoots.length === 0) {\n json\n ? printJSON({ status: 'error', error: 'No jobRoots found in file' })\n : spinner.warn(themed(`Warning: ${themed('No jobRoots found in file')}.`, 'secondary'));\n return;\n }\n\n // Validate that all items are strings\n for (let i = 0; i < jobRoots.length; i++) {\n if (typeof jobRoots[i] !== 'string') {\n throw new Error(`JobRoot at index ${i} must be a string, got ${typeof jobRoots[i]}`);\n }\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. Group jobRoots by tenant/flow\n // JobRoot format: {tenantId}/flows/{flowId}/...\n const groupedJobs = {};\n \n for (const jobRoot of jobRoots) {\n const parts = jobRoot.split('/');\n if (parts.length < 3 || parts[1] !== 'flows') {\n throw new Error(`Invalid jobRoot format: ${jobRoot}. Expected format: {tenantId}/flows/{flowId}/...`);\n }\n \n const tenantId = parts[0];\n const flowId = parts[2];\n const key = `${tenantId}/flows/${flowId}`;\n \n if (!groupedJobs[key]) {\n groupedJobs[key] = {\n tenant: tenantId,\n flow: flowId,\n jobRoots: [],\n };\n }\n \n groupedJobs[key].jobRoots.push(jobRoot);\n }\n\n const groupKeys = Object.keys(groupedJobs);\n !json && pr(\n themed(`Found ${themed(String(jobRoots.length), 'info')} jobRoot(s) grouped into ${themed(String(groupKeys.length), 'info')} tenant/flow group(s).`, 'secondary')\n );\n\n // 3. Helper function to wait for job completion\n const waitForJobCompletion = async (tenant, flow, jobRoot, maxWaitTime = 3600000) => { // 1 hour default\n const startTime = Date.now();\n const pollInterval = 5000; // Poll every 5 seconds\n \n while (Date.now() - startTime < maxWaitTime) {\n try {\n const jobStatus = await getJobStatus({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n flow,\n user_id: tenant,\n job_root: jobRoot,\n });\n \n const status = jobStatus.status || jobStatus.state;\n \n if (status === 'JOB_COMPLETED' || (typeof status === 'string' && status.endsWith('_FAILED'))) {\n return { completed: true, status };\n }\n \n // Wait before next poll\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n } catch (error) {\n debug(`Error checking job status for ${jobRoot}:`, error);\n // Continue polling even if there's an error\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n }\n \n return { completed: false, status: 'TIMEOUT' };\n };\n\n // 4. Retrigger jobs: parallel across groups, sequential within groups\n message = themed(`Retriggering ${themed(String(jobRoots.length), 'info')} job(s) across ${themed(String(groupKeys.length), 'info')} group(s)...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const allResults = [];\n\n // Process all groups in parallel\n await Promise.all(\n groupKeys.map(async (key) => {\n const group = groupedJobs[key];\n const { tenant, flow, jobRoots: groupJobRoots } = group;\n const groupResults = [];\n\n // Process jobs sequentially within this group\n for (let i = 0; i < groupJobRoots.length; i++) {\n const jobRoot = groupJobRoots[i];\n \n try {\n // Retrigger the job\n const response = await retriggerJob({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n tenant,\n flow,\n job_root: jobRoot,\n });\n\n // Wait for job completion before retriggering the next one\n if (i < groupJobRoots.length - 1) {\n if (!json) {\n spinner.text = themed(`Waiting for job ${i + 1}/${groupJobRoots.length} in group ${tenant}/${flow} to complete...`, 'secondary');\n }\n const waitResult = await waitForJobCompletion(tenant, flow, jobRoot);\n \n if (!waitResult.completed) {\n debug(`Warning: Job ${jobRoot} did not complete within timeout period`);\n }\n }\n\n groupResults.push({\n tenant,\n flow,\n jobRoot,\n ok: true,\n response,\n });\n } catch (error) {\n let errorResult;\n \n if (error.response) {\n const statusCode = error.response.status;\n const statusText = error.response.statusText;\n const responseData = error.response.data;\n const message = error.message;\n \n debug('Error response:', {\n statusCode,\n statusText,\n message,\n data: responseData\n });\n \n errorResult = {\n statusCode,\n statusText,\n message,\n data: responseData\n };\n } else if (error.request) {\n debug('Error: No response received', error.message);\n errorResult = {\n message: error.message,\n request: error.request\n };\n } else {\n debug('Error:', error.message);\n errorResult = {\n message: error.message\n };\n }\n\n groupResults.push({\n tenant,\n flow,\n jobRoot,\n ok: false,\n error: errorResult,\n });\n }\n }\n\n allResults.push(...groupResults);\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 5. Print results\n if (json) {\n printJSON(allResults);\n } else {\n // Generate results table\n const table = new Table({\n head: ['Tenant', 'Flow', 'Job Root', 'Status', 'Response/Error'],\n });\n\n allResults.forEach((result) => {\n const status = result.ok ? 'SUCCESS' : 'FAILED';\n const responseOrError = result.ok\n ? JSON.stringify(result.response, undefined, 2)\n : JSON.stringify(result.error, undefined, 2);\n table.push([\n result.tenant || 'N/A',\n result.flow || 'N/A',\n result.jobRoot || 'N/A',\n status,\n responseOrError,\n ]);\n });\n\n console.log(table.toString());\n\n // Print summary\n const successCount = allResults.filter((r) => r.ok).length;\n const failCount = allResults.filter((r) => !r.ok).length;\n pr(\n themed(\n `Summary: ${themed(String(successCount), 'info')} succeeded, ${themed(String(failCount), 'error')} failed out of ${themed(\n String(allResults.length),\n 'info'\n )} total.`,\n 'secondary'\n )\n );\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message, stack: err.stack });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to retrigger jobs'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { killJob, getEnvJobs } from '../../helpers/api.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:bulkKill');\n debug(...args);\n};\n\nconst command = 'bulk-kill';\n\nconst desc = 'Kill jobs in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant-ids', {\n describe: 'Comma-separated list of tenant IDs to filter by',\n type: 'string',\n alias: ['tenants'],\n })\n .option('flow-ids', {\n describe: 'Comma-separated list of flow IDs to filter by',\n type: 'string',\n alias: ['flows'],\n })\n .option('reason', {\n describe: 'Reason for killing the jobs',\n type: 'string',\n });\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenantIds, flowIds, reason } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. Fetch jobs from API with status filter\n const statusFilter = 'JOB_CREATED,SYNC_STARTED,SYNC_SUCCESS,ETL_STARTED,ETL_SUCCESS,EXPORT_STARTED';\n message = themed(`Fetching running jobs...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Use a date range to get jobs from the last month\n const today = new Date();\n const oneMonthAgo = new Date(today);\n oneMonthAgo.setMonth(today.getMonth() - 1);\n const dateFrom = oneMonthAgo.toISOString().split('T')[0];\n\n const data = await getEnvJobs({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n from: dateFrom,\n status: statusFilter,\n count: 100, // Get max jobs per page\n });\n\n let jobs = data.jobs || [];\n const totalJobs = data.total || 0;\n\n !json && spinner.succeed(\n themed(`Found ${themed(totalJobs, 'info')} job(s) with specified status.`, 'secondary')\n );\n\n // 2. Filter by tenant IDs if provided\n if (tenantIds) {\n const tenantIdList = tenantIds.split(',').map(t => t.trim()).filter(t => t);\n if (tenantIdList.length > 0) {\n jobs = jobs.filter(job => {\n const jobTenant = job.tenant;\n return tenantIdList.includes(jobTenant);\n });\n }\n }\n\n // 3. Filter by flow IDs if provided\n if (flowIds) {\n const flowIdList = flowIds.split(',').map(f => f.trim()).filter(f => f);\n if (flowIdList.length > 0) {\n jobs = jobs.filter(job => {\n const jobFlow = job.flow_id;\n return flowIdList.includes(jobFlow);\n });\n }\n }\n\n if (jobs.length === 0) {\n json\n ? printJSON({ status: 'info', message: 'No jobs found matching the filters' })\n : spinner.warn(\n themed(`Warning: ${themed('No jobs found matching the specified filters')}.`, 'secondary')\n );\n return;\n }\n\n // 4. Kill all jobs in parallel\n message = themed(`Killing ${themed(jobs.length, 'info')} job(s)...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const results = await Promise.all(\n jobs.map(async (job, index) => {\n const jobRoot = job.s3_root;\n const flow = job.flow_id;\n const tenant = job.tenant;\n\n if (!jobRoot) {\n return {\n index,\n flow,\n tenant,\n ok: false,\n error: {\n message: 'Job root (s3_root) not found in job data'\n },\n };\n }\n\n try {\n const response = await killJob({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n flow,\n user_id: tenant,\n job_root: jobRoot,\n reason,\n });\n\n return {\n index,\n flow,\n tenant,\n jobRoot,\n ok: true,\n response,\n };\n } catch (error) {\n let errorResult;\n \n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n const statusCode = error.response.status;\n const statusText = error.response.statusText;\n const responseData = error.response.data;\n const message = error.message;\n \n debug('Error response:', {\n statusCode,\n statusText,\n message,\n data: responseData\n });\n \n errorResult = {\n statusCode,\n statusText,\n message,\n data: responseData\n };\n } else if (error.request) {\n // The request was made but no response was received\n debug('Error: No response received', error.message);\n errorResult = {\n message: error.message,\n request: error.request\n };\n } else {\n // Something happened in setting up the request that triggered an Error\n debug('Error:', error.message);\n errorResult = {\n message: error.message\n };\n }\n\n return {\n index,\n flow,\n tenant,\n jobRoot,\n ok: false,\n error: errorResult,\n };\n }\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 5. Print results\n if (json) {\n printJSON(results);\n } else {\n // Generate results table\n const table = new Table({\n head: ['Index', 'Flow', 'Tenant', 'Job Root', 'Status', 'Response/Error'],\n });\n\n results.forEach((result) => {\n const status = result.ok ? 'SUCCESS' : 'FAILED';\n const responseOrError = result.ok\n ? JSON.stringify(result.response, undefined, 2)\n : JSON.stringify(result.error, undefined, 2);\n table.push([\n result.index,\n result.flow || 'N/A',\n result.tenant || 'N/A',\n result.jobRoot || 'N/A',\n status,\n responseOrError,\n ]);\n });\n\n console.log(table.toString());\n\n // Print summary\n const successCount = results.filter((r) => r.ok).length;\n const failCount = results.filter((r) => !r.ok).length;\n pr(\n themed(\n `Summary: ${themed(String(successCount), 'info')} succeeded, ${themed(String(failCount), 'error')} failed out of ${themed(\n String(results.length),\n 'info'\n )} total.`,\n 'secondary'\n )\n );\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message, stack: err.stack });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to kill jobs'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { rollbackJob, getEnvJobs } from '../../helpers/api.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:bulkRollback');\n debug(...args);\n};\n\nconst command = 'bulk-rollback';\n\nconst desc = 'Rollback jobs in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('from-utc-iso', {\n describe: 'Start date for job search (YYYY-MM-DD)',\n type: 'string',\n alias: ['from'],\n demandOption: true,\n })\n .demandOption('from-utc-iso', 'Date from is required. Example: --from-utc-iso 2024-01-01')\n .option('to-utc-iso', {\n describe: 'End date for job search (YYYY-MM-DD)',\n type: 'string',\n alias: ['to'],\n demandOption: true,\n })\n .demandOption('to-utc-iso', 'Date to is required. Example: --to-utc-iso 2024-01-31')\n .option('tenant-ids', {\n describe: 'Comma-separated list of tenant IDs to filter by',\n type: 'string',\n alias: ['tenants'],\n })\n .option('flow-ids', {\n describe: 'Comma-separated list of flow IDs to filter by',\n type: 'string',\n alias: ['flows'],\n });\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, fromUtcIso, toUtcIso, tenantIds, flowIds } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // Validate and format dates\n if (fromUtcIso.length !== 10) {\n const errorMsg = 'Date from must be in YYYY-MM-DD format';\n if (json) {\n printJSON({ status: 'error', error: errorMsg });\n } else {\n spinner.fail(themed(`Error: ${errorMsg}`, 'secondary'));\n }\n process.exit(1);\n }\n\n if (toUtcIso.length !== 10) {\n const errorMsg = 'Date to must be in YYYY-MM-DD format';\n if (json) {\n printJSON({ status: 'error', error: errorMsg });\n } else {\n spinner.fail(themed(`Error: ${errorMsg}`, 'secondary'));\n }\n process.exit(1);\n }\n\n // Format dates with time components\n const formattedDateFrom = `${fromUtcIso}T00:00:00Z`;\n const formattedDateTo = `${toUtcIso}T23:59:59.999Z`;\n\n // 1. Fetch jobs from API\n message = themed(\n `Fetching jobs from ${themed(fromUtcIso, 'info')} to ${themed(toUtcIso, 'info')}...`\n );\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const data = await getEnvJobs({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n from: formattedDateFrom,\n to: formattedDateTo,\n count: 100, // Get max jobs per page\n });\n\n !json && spinner.stop();\n\n let jobs = data.jobs || [];\n\n // 2. Filter by tenant IDs if provided\n if (tenantIds) {\n const tenantIdList = tenantIds.split(',').map(t => t.trim()).filter(t => t);\n if (tenantIdList.length > 0) {\n jobs = jobs.filter(job => {\n const jobTenant = job.tenant;\n return tenantIdList.includes(jobTenant);\n });\n }\n }\n\n // 3. Filter by flow IDs if provided\n if (flowIds) {\n const flowIdList = flowIds.split(',').map(f => f.trim()).filter(f => f);\n if (flowIdList.length > 0) {\n jobs = jobs.filter(job => {\n const jobFlow = job.flow_id || job.flowId || job.flow;\n return flowIdList.includes(jobFlow);\n });\n }\n }\n\n !json && pr(\n themed(`Found ${themed(String(jobs.length), 'info')} job(s) after filtering.`, 'secondary')\n );\n\n if (jobs.length === 0) {\n json\n ? printJSON({ status: 'info', message: 'No jobs found matching the filters' })\n : spinner.warn(\n themed(`Warning: ${themed('No jobs found matching the specified filters')}.`, 'secondary')\n );\n return;\n }\n\n // 4. Rollback all jobs in parallel\n message = themed(`Rolling back ${themed(jobs.length, 'info')} job(s)...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const results = await Promise.all(\n jobs.map(async (job, index) => {\n const jobRoot = job.s3_root || job.s3Root || job.job_root || job.jobRoot;\n const flow = job.flow_id || job.flowId || job.flow;\n const tenant = job.tenant || job.tenant_id || job.tenantId || job.user_id;\n \n // Extract tap from job data - could be in various fields\n let tap = job.tap;\n if (!tap && job.taps && Array.isArray(job.taps) && job.taps.length > 0) {\n tap = job.taps[0];\n }\n if (!tap && job.tap_name) {\n tap = job.tap_name;\n }\n if (!tap && job.connector) {\n tap = job.connector;\n }\n\n if (!jobRoot) {\n return {\n index,\n flow,\n tenant,\n ok: false,\n error: {\n message: 'Job root (s3_root) not found in job data'\n },\n };\n }\n\n if (!tap) {\n return {\n index,\n flow,\n tenant,\n jobRoot,\n ok: false,\n error: {\n message: 'Tap not found in job data'\n },\n };\n }\n\n try {\n const response = await rollbackJob({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n flow,\n user_id: tenant,\n job_root: jobRoot,\n tap,\n });\n\n return {\n index,\n flow,\n tenant,\n jobRoot,\n tap,\n ok: true,\n response,\n };\n } catch (error) {\n let errorResult;\n \n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n const statusCode = error.response.status;\n const statusText = error.response.statusText;\n const responseData = error.response.data;\n const message = error.message;\n \n debug('Error response:', {\n statusCode,\n statusText,\n message,\n data: responseData\n });\n \n errorResult = {\n statusCode,\n statusText,\n message,\n data: responseData\n };\n } else if (error.request) {\n // The request was made but no response was received\n debug('Error: No response received', error.message);\n errorResult = {\n message: error.message,\n request: error.request\n };\n } else {\n // Something happened in setting up the request that triggered an Error\n debug('Error:', error.message);\n errorResult = {\n message: error.message\n };\n }\n\n return {\n index,\n flow,\n tenant,\n jobRoot,\n tap,\n ok: false,\n error: errorResult,\n };\n }\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 5. Print results\n if (json) {\n printJSON(results);\n } else {\n // Generate results table\n const table = new Table({\n head: ['Index', 'Flow', 'Tenant', 'Job Root', 'Tap', 'Status', 'Response/Error'],\n });\n\n results.forEach((result) => {\n const status = result.ok ? 'SUCCESS' : 'FAILED';\n const responseOrError = result.ok\n ? JSON.stringify(result.response, undefined, 2)\n : JSON.stringify(result.error, undefined, 2);\n table.push([\n result.index,\n result.flow || 'N/A',\n result.tenant || 'N/A',\n result.jobRoot || 'N/A',\n result.tap || 'N/A',\n status,\n responseOrError,\n ]);\n });\n\n console.log(table.toString());\n\n // Print summary\n const successCount = results.filter((r) => r.ok).length;\n const failCount = results.filter((r) => !r.ok).length;\n pr(\n themed(\n `Summary: ${themed(String(successCount), 'info')} succeeded, ${themed(String(failCount), 'error')} failed out of ${themed(\n String(results.length),\n 'info'\n )} total.`,\n 'secondary'\n )\n );\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message, stack: err.stack });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to rollback jobs'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n\n","import * as download from './download.js';\nimport * as list from './list.js';\nimport * as bulkRun from './bulkRun.js';\nimport * as bulkRetrigger from './bulkRetrigger.js';\nimport * as bulkKill from './bulkKill.js';\nimport * as bulkRollback from './bulkRollback.js';\n\nexport const jobs = [download, list, bulkRun, bulkRetrigger, bulkKill, bulkRollback];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { jobs } from './jobs/index.js';\n\nconst debug = Debug('commands:jobs');\nconst command = 'jobs <action>';\n\nconst desc = 'Manage ETL jobs';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(jobs);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import { inspect } from 'util';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { getScheduleList, updateSchedule } from '../../helpers/api.js';\n\nconst debug = Debug('commands:schedules:bulkUpdate');\n\nconst command = 'bulk-update';\n\nconst desc = 'Update schedules in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant-ids', {\n describe: 'Comma-separated list of tenant IDs',\n type: 'string',\n alias: ['tenants'],\n })\n .option('flow-ids', {\n describe: 'Comma-separated list of flow IDs',\n type: 'string',\n alias: ['flows'],\n })\n .option('status', {\n describe: 'Schedule status: \"enable\" or \"disable\"',\n type: 'string',\n choices: ['enable', 'disable'],\n })\n .option('expression', {\n describe: 'Cron schedule expression',\n type: 'string',\n })\n .option('connector', {\n describe: 'Filter by connector ID',\n type: 'string',\n })\n .option('job-type', {\n describe: 'Filter by job type: \"read\" or \"write\"',\n type: 'string',\n choices: ['read', 'write'],\n });\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenantIds, flowIds, status, expression, connector, 'job-type': jobType } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n \n try {\n // Validate that either status or expression is provided\n if (!status && !expression) {\n const errorMsg = 'Either \"status\" or \"expression\" must be provided';\n if (json) {\n printJSON({ status: 'error', error: errorMsg });\n } else {\n spinner.fail(themed(`Error: ${errorMsg}`, 'secondary'));\n }\n process.exit(1);\n }\n\n // Parse comma-separated lists\n const tenantList = tenantIds ? tenantIds.split(',').map(t => t.trim()).filter(Boolean) : null;\n const flowList = flowIds ? flowIds.split(',').map(f => f.trim()).filter(Boolean) : null;\n\n // 1. Get all schedules\n message = themed(`Retrieving schedules for environment: ${themed(env, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n \n const allSchedules = await getScheduleList({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n includeDisabled: true, // Get both enabled and disabled schedules\n });\n \n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('response-data', allSchedules);\n\n // Parse schedules if they come as a JSON string\n const schedules = typeof allSchedules === 'string' ? JSON.parse(allSchedules) : allSchedules;\n\n if (!schedules || schedules.length === 0) {\n if (json) {\n printJSON({ updated: 0, schedules: [] });\n } else {\n spinner.warn(themed(`Warning: ${themed('No schedules found for the specified environment')}.`, 'secondary'));\n }\n return;\n }\n\n // 2. Filter schedules based on criteria\n let filteredSchedules = schedules.filter(schedule => {\n // Filter by tenants\n if (tenantList && tenantList.length > 0) {\n if (!tenantList.includes(schedule.tenantId)) {\n return false;\n }\n }\n\n // Filter by flows\n if (flowList && flowList.length > 0) {\n if (!flowList.includes(schedule.flowId)) {\n return false;\n }\n }\n\n // Filter by connector\n if (connector !== undefined && connector !== null && connector !== '') {\n // Filter by specific connector_id\n if (schedule.connectorId !== connector) {\n return false;\n }\n } else {\n // If connector not passed, get only schedules with connectorId equals to null\n if (schedule.connectorId !== null && schedule.connectorId !== undefined) {\n return false;\n }\n }\n\n // Filter by job_type\n if (jobType) {\n if (schedule.jobType !== jobType) {\n return false;\n }\n }\n\n return true;\n });\n\n if (filteredSchedules.length === 0) {\n if (json) {\n printJSON({ updated: 0, schedules: [] });\n } else {\n spinner.warn(themed(`Warning: ${themed('No schedules match the specified filters')}.`, 'secondary'));\n }\n return;\n }\n\n // 3. All filtered schedules will be updated\n // If status is provided, all schedules (both enabled and disabled) will be updated to that status\n const schedulesToUpdate = filteredSchedules;\n\n // 4. Prepare update payload\n const state = status ? (status === 'enable' ? 'ENABLED' : 'DISABLED') : undefined;\n\n // 5. Print how many schedules will be updated\n if (!json) {\n pr(themed(`Found ${themed(schedulesToUpdate.length.toString(), 'info')} schedule(s) to update`, 'secondary'));\n }\n\n // 6. Update schedules in batches of 20\n const BATCH_SIZE = 20;\n const updatedSchedules = [];\n const failedSchedules = [];\n\n for (let i = 0; i < schedulesToUpdate.length; i += BATCH_SIZE) {\n const batch = schedulesToUpdate.slice(i, i + BATCH_SIZE);\n const batchNum = Math.floor(i / BATCH_SIZE) + 1;\n const totalBatches = Math.ceil(schedulesToUpdate.length / BATCH_SIZE);\n\n message = themed(`Updating batch ${themed(`${batchNum}/${totalBatches}`, 'info')} (${batch.length} schedule(s))`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const updatePromises = batch.map(async (schedule) => {\n try {\n // Use provided expression or keep the existing one from the schedule\n const scheduleExpression = expression || schedule.expression;\n \n // Use provided state or keep the existing one from the schedule\n const scheduleState = state || (schedule.isActive ? 'ENABLED' : 'DISABLED');\n \n // Ensure we have an expression (required by the endpoint)\n if (!scheduleExpression) {\n throw new Error('Schedule expression is required but not found');\n }\n\n const result = await updateSchedule({\n debug,\n baseUri: clientApiBaseUri,\n env: schedule.envId,\n flow: schedule.flowId,\n user_id: schedule.tenantId,\n apikey,\n schedule_expression: scheduleExpression,\n state: scheduleState,\n job_type: schedule.jobType || jobType,\n connector_id: schedule.connectorId || connector,\n });\n\n return {\n success: true,\n schedule: {\n envId: schedule.envId,\n flowId: schedule.flowId,\n tenantId: schedule.tenantId,\n connectorId: schedule.connectorId,\n jobType: schedule.jobType,\n expression: scheduleExpression,\n state: scheduleState,\n },\n result,\n };\n } catch (err) {\n debug('Error updating schedule:', err);\n return {\n success: false,\n schedule: {\n envId: schedule.envId,\n flowId: schedule.flowId,\n tenantId: schedule.tenantId,\n connectorId: schedule.connectorId,\n jobType: schedule.jobType,\n },\n error: err.message || err.toString(),\n };\n }\n });\n\n const batchResults = await Promise.all(updatePromises);\n \n batchResults.forEach(result => {\n if (result.success) {\n updatedSchedules.push(result.schedule);\n } else {\n failedSchedules.push(result);\n }\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n\n // 7. Print results\n if (json) {\n printJSON({\n total: schedulesToUpdate.length,\n updated: updatedSchedules.length,\n failed: failedSchedules.length,\n schedules: updatedSchedules,\n errors: failedSchedules,\n });\n } else {\n pr(themed(`\\nUpdated ${themed(updatedSchedules.length.toString(), 'info')} schedule(s) successfully`, 'secondary'));\n \n if (failedSchedules.length > 0) {\n pr(themed(`Failed to update ${themed(failedSchedules.length.toString(), 'error')} schedule(s)`, 'secondary'));\n }\n\n if (updatedSchedules.length > 0 || failedSchedules.length > 0) {\n const table = new Table({\n head: ['Environment', 'Flow', 'Tenant', 'Connector', 'Job Type', 'Expression', 'State', 'Updated'],\n });\n \n // Add successful schedules\n updatedSchedules.forEach((schedule) => {\n table.push([\n schedule.envId,\n schedule.flowId,\n schedule.tenantId,\n schedule.connectorId || 'N/A',\n schedule.jobType || 'N/A',\n schedule.expression,\n schedule.state,\n 'yes',\n ]);\n });\n \n // Add failed schedules\n failedSchedules.forEach((failed) => {\n const schedule = failed.schedule;\n // Find the original schedule to get expression and state if available\n const originalSchedule = schedulesToUpdate.find(\n s => s.envId === schedule.envId && \n s.flowId === schedule.flowId && \n s.tenantId === schedule.tenantId &&\n s.connectorId === schedule.connectorId &&\n s.jobType === schedule.jobType\n );\n \n table.push([\n schedule.envId,\n schedule.flowId,\n schedule.tenantId,\n schedule.connectorId || 'N/A',\n schedule.jobType || 'N/A',\n originalSchedule?.expression || 'N/A',\n originalSchedule?.isActive ? 'ENABLED' : 'DISABLED',\n `no: ${failed.error}`,\n ]);\n });\n \n console.log('\\n' + table.toString());\n }\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message || err.toString() });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to update schedules'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message || err.toString())}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as bulkUpdate from './bulkUpdate.js';\n\nexport const schedules = [bulkUpdate];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { schedules } from './schedules/index.js';\n\nconst debug = Debug('commands:schedules');\nconst command = 'schedules <action>';\n\nconst desc = 'Manage schedules';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(schedules);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { readdir, readFile } from 'fs/promises';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport { getFolderFiles } from '../../helpers/utils.js';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\n\nconst debug = Debug('commands:snapshots:deploy');\n\nconst command = 'deploy';\n\nconst desc = 'Deploy Snapshots';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('sourceFolder', descriptions.options['sourceFolder'].config)\n .demandOption('sourceFolder', descriptions.options['sourceFolder'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant, sourceFolder } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n const folderPrefix = path.resolve(process.cwd(), sourceFolder);\n try {\n message = themed(`Deploying Snapshots for Tenant ${themed(tenant, 'info')} to ${themed(env, 'info')}`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n // 1. build list of deployable files\n const deployableFiles = await getFolderFiles(folderPrefix, {\n recursive: true,\n });\n if (deployableFiles.length === 0) {\n json\n ? printJSON({ status: 'error', error: 'There are no files to deploy at the specified location!' })\n : spinner.fail(\n themed(`Error: ${themed('There are no files to deploy at the specified location!')}.`, 'secondary')\n );\n return;\n }\n\n // 2. get STS credentials\n message = themed(`Verifying user and authorizing`);\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'snapshot-deploy',\n env,\n tenant,\n apikey,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // create authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n // 3. verify tenant is valid\n message = themed(`Validating tenant exists`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n try {\n const { CommonPrefixes: tenantFolders } = await s3\n .listObjectsV2({ Bucket: env, Prefix: `${tenant}/`, Delimiter: '/' })\n .promise();\n if (tenantFolders.length === 0) throw new Error('Invalid tenant');\n } catch (err) {\n debug('err', err);\n throw new Error(`Tenant doesn't exist. Please check your tenant (-u) argument.`);\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const rootKey = `${tenant}/snapshots/`;\n const table = new Table({ head: ['File', 'Status'] });\n // 4. cleanup old files\n message = themed(`Preparing deployment target`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { Contents } = await s3.listObjectsV2({ Bucket: env, Prefix: `${rootKey}` }).promise();\n !json && spinner.stop();\n debug('contents', Contents);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const filesToDelete = Contents.map((item) => ({ Key: item.Key }));\n if (filesToDelete.length > 0) {\n const delParams = {\n Bucket: env,\n Delete: { Objects: filesToDelete, Quiet: true },\n };\n await s3.deleteObjects(delParams).promise();\n filesToDelete.forEach(({ Key }) => table.push([Key.substring(rootKey.length), themed('Deleted', 'warn')]));\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 5. upload new files\n for await (const file of deployableFiles) {\n const relativePath = path.relative(sourceFolder, file);\n const key = `${rootKey}${relativePath}`;\n\n message = themed(`Deploying file: ${themed(relativePath, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const readBuffer = await readFile(file);\n const params = {\n Bucket: env,\n Key: key,\n Body: readBuffer,\n };\n\n const res = await s3.putObject(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-put-res', res);\n table.push([relativePath, themed('Deployed', 'info')]);\n }\n\n if (json) {\n printJSON({ status: 'success', deployedFiles: deployableFiles });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { mkdir, writeFile, stat } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport descriptions from '../../helpers/descriptions.js';\nimport print, { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { filterFiles, userSetOption, streamToString } from '../../helpers/utils.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\n\nconst debug = Debug('commands:snapshots:download');\n\nconst command = 'download';\n\nconst desc = 'Download Snapshots';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('downloadTo', descriptions.options['downloadTo'].config)\n .demandOption('downloadTo', descriptions.options['downloadTo'].demandText)\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('overwrite', descriptions.options['overwrite'].config)\n .demandOption('overwrite', descriptions.options['overwrite'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant, downloadTo, overwrite } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n const folderPrefix = path.resolve(process.cwd(), userSetOption('downloadTo') ? downloadTo : 'snapshots');\n try {\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'snapshot-download',\n env,\n tenant,\n apikey,\n });\n // created authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. verify tenant is valid\n message = themed(`Validating tenant exists`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n try {\n // this may also throw access denied\n const { CommonPrefixes: tenantFolders } = await s3\n .listObjectsV2({ Bucket: env, Prefix: `${tenant}/`, Delimiter: '/' })\n .promise();\n if (tenantFolders.length === 0) throw new Error('Invalid tenant');\n } catch (err) {\n debug('err', err);\n throw new Error(`Tenant doesn't exist. Please check your tenant (-u) argument.`);\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 3. get list of downloadable files\n message = themed(`Scanning for downloadable files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const keyPrefix = `${tenant}/snapshots/`;\n const params = {\n Bucket: env,\n Prefix: keyPrefix,\n };\n const { Contents: s3Files } = await s3.listObjectsV2(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-list-res', s3Files);\n // filter unwanted files from source\n const filesToDownload = s3Files ? s3Files.map((item) => item.Key).filter((item) => item !== keyPrefix) : [];\n if (!filesToDownload || filesToDownload.length === 0) {\n json\n ? printJSON({ status: 'success', downloadedFiles: [] })\n : spinner.warn(themed(`Warning: ${themed('Nothing to download!')}`, 'secondary'));\n return;\n }\n\n // 4. download files\n message = themed(`Downloading snapshot files to ${themed(folderPrefix, 'info')}`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n const table = new Table({ head: ['File', 'Status'] });\n for await (const file of filesToDownload) {\n const subPath = file.substring(keyPrefix.length);\n const fullPath = path.resolve(folderPrefix, subPath);\n debug('file', fullPath);\n if (file.endsWith('/')) {\n !existsSync(fullPath) && (await mkdir(fullPath, { recursive: true }));\n continue;\n }\n // skip if exists and overwrite is false\n if (!overwrite) {\n try {\n await stat(fullPath);\n debug('exists, skipping');\n table.push([subPath, 'Skipped']);\n continue;\n } catch (err) {\n if (err.code !== 'ENOENT') cl(err);\n }\n }\n\n message = themed(`Downloading file: ${themed(subPath, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n // ensure destination folder exists\n await mkdir(path.dirname(fullPath), { recursive: true });\n // download s3 object into destination folder\n const fileStream = s3.getObject({ Bucket: env, Key: file }).createReadStream();\n await writeFile(fullPath, await streamToString(fileStream));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n table.push([subPath, 'Downloaded']);\n }\n\n if (json) {\n printJSON({ status: 'success', downloadedFiles: filesToDownload });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as deploy from './deploy.js';\nimport * as download from './download.js';\n\nexport const snapshots = [deploy, download];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { snapshots } from './snapshots/index.js';\n\nconst debug = Debug('commands:snapshots');\n\nconst command = 'snapshots <action>';\n\nconst desc = 'Manage tenant snapshots';\n\nconst builder = async function (yargs) {\n debug('builder', command, yargs);\n const base = await baseApiBuilder(yargs);\n return base.command(snapshots);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, printJSON, themed } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi, getTenants, getLinkedSources, getSupportedSources } from '../../helpers/api.js';\nimport { buildChunks } from '../../helpers/utils.js';\n\nconst debug = Debug('commands:tenants:custom-etl');\n\nconst command = 'custom-etl';\n\nconst desc = 'List tenants with custom ETL in a specific flow';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant', descriptions.options['tenant'].config)\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText);\n};\n\nconst processTenant = async ({ debug, baseUri, apikey, env, flow, tenant, supportedSources }) => {\n // Get all linked sources of the tuple (env, flow, tenant)\n const linkedSources = await getLinkedSources({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n });\n\n let result = null;\n\n for (const { tap } of [...linkedSources, ...supportedSources]) {\n // Generate AWS credentials in order to read the S3 tap folder\n // Note(davi): I'm using \"etl-download\" because it's a \"read ETL\" operation\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri,\n task: 'etl-download',\n env,\n tenant,\n flow,\n tap,\n apikey,\n });\n\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n const keyPrefix = `${tenant}/flows/${flow}/taps/${tap}/etl/`;\n\n const params = {\n Bucket: env,\n Prefix: keyPrefix,\n };\n\n // List all files inside the S3 tap folder\n const { Contents: s3Files } = await s3.listObjectsV2(params).promise();\n\n // Check if either \"etl.py\" or \"etl.ipynb\" exist\n const hasCustomEtl = s3Files.some(({ Key }) => Key.endsWith('etl.py') || Key.endsWith('etl.ipynb'));\n\n if (hasCustomEtl) result = tenant;\n\n // If it's true, we can break already\n if (result !== null) break;\n }\n\n return result;\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow } = argv;\n\n let message;\n let spinner = ora();\n\n try {\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const [allTenants, supportedSources] = await Promise.all([\n getTenants({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n }),\n getSupportedSources({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n })\n ]);\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n let tenantsWithCustomEtl = [];\n\n message = themed(`Querying for custom ETL scripts for flow ${themed(flow, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Break the tenants array in to an array of arrays so we can make\n // parallel calls and make it faster\n for (const tenants of buildChunks(allTenants)) {\n const maybeTenantsWithCustomEtl = await Promise.all(\n tenants.map((tenant) =>\n processTenant({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n tenant,\n supportedSources,\n })\n )\n );\n\n // Note(davi): we need the `.filter(Boolean)` because sometimes\n // the function above returns `null`\n tenantsWithCustomEtl = tenantsWithCustomEtl.concat(maybeTenantsWithCustomEtl.filter(Boolean));\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON(tenantsWithCustomEtl);\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID'] });\n table.push(...tenantsWithCustomEtl.map((item) => [item]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pp, pr, printJSON, themed } from '../../helpers/print.js';\nimport {\n genCredentialsOnClientApi,\n getTenants,\n getLinkedSources,\n getSupportedFlow,\n getLinkedConnectors,\n} from '../../helpers/api.js';\nimport { buildChunks } from '../../helpers/utils.js';\n\nconst debug = Debug('commands:tenants:custom-field-map');\n\nconst command = 'custom-field-map';\n\nconst desc = 'List tenants with custom field map in a specific flow';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant', descriptions.options['tenant'].config)\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText);\n};\n\nconst processTenant = async ({ debug, baseUri, apikey, env, flow, tenant, isV2Flow }) => {\n // Get all linked connectors/sources of the tuple (env, flow, tenant)\n const linkedConnectors = isV2Flow\n ? await getLinkedConnectors({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n })\n : await getLinkedSources({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n });\n\n const connectors = [];\n\n // Generate AWS credentials in order to read the S3 tap folder\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri,\n task: 'field-map-download',\n env,\n tenant,\n flow,\n apikey,\n });\n\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n for (const { id, tap } of linkedConnectors) {\n const entityLabel = isV2Flow ? 'connectors' : 'taps';\n\n const params = {\n Bucket: env,\n Key: `${tenant}/flows/${flow}/${entityLabel}/${isV2Flow ? id : tap}/fieldMap.json`,\n };\n\n try {\n await s3.headObject(params).promise();\n\n connectors.push(isV2Flow ? id : tap);\n } catch (error) {\n // Does not have fieldMap.json\n }\n }\n\n return { tenant, connectors };\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow } = argv;\n\n let message;\n let spinner = ora();\n\n try {\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const [allTenants, supportedFlow] = await Promise.all([\n getTenants({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n }),\n getSupportedFlow({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n }),\n ]);\n\n const isV2Flow = supportedFlow?.version === 2;\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const tenantsWithCustomFieldMap = [];\n\n message = themed(`Querying for custom field maps for flow ${themed(flow, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Break the tenants array in to an array of arrays so we can make\n // parallel calls and make it faster\n for (const tenants of buildChunks(allTenants)) {\n const maybeTenantsWithCustomFieldMap = await Promise.all(\n tenants.map((tenant) =>\n processTenant({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n tenant,\n isV2Flow,\n })\n )\n );\n\n tenantsWithCustomFieldMap.push(\n ...maybeTenantsWithCustomFieldMap.filter(({ connectors }) => connectors.length > 0)\n );\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON(tenantsWithCustomFieldMap);\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID', 'Connector IDs'] });\n table.push(...tenantsWithCustomFieldMap.map(({ tenant, connectors }) => [tenant, connectors.join(', ')]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import AWS from 'aws-sdk';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport Debug from '../../helpers/debug.js';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, printJSON, themed } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi, deleteTenantSchedules } from '../../helpers/api.js';\n\nconst debug = Debug('commands:tenants:delete');\n\nconst command = 'delete';\n\nconst desc = 'Delete tenant';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs.option('tenant', descriptions.options['tenant'].config);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n if (tenant === 'default') {\n throw new Error('It\\'s not possible to delete \"default\" tenant!');\n }\n\n message = themed(`Deleting tenant ${tenant} schedules`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n await deleteTenantSchedules({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n tenant,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n message = themed(`Verifying user and authorizing`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'tenant-delete',\n env,\n tenant,\n apikey,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // created authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n message = themed(`Deleting tenant ${tenant} for environment ${themed(env, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n while (true) {\n // List objects, 1000 keys at a time\n const s3Objects = await s3\n .listObjectsV2({\n Bucket: env,\n Prefix: `${tenant}/`,\n })\n .promise();\n\n const Objects = (s3Objects.Contents || []).map(({ Key }) => ({ Key }));\n\n if (Objects.length === 0) {\n break;\n }\n\n // Purge the objects\n const response = await s3\n .deleteObjects({\n Bucket: env,\n Delete: {\n Objects,\n },\n })\n .promise();\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON({ statu: 'success', tenantDeleted: tenant });\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID'] });\n table.push([tenant]);\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n\n debug(err);\n\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pp, pr, printJSON, themed } from '../../helpers/print.js';\n\nconst debug = Debug('commands:tenants:list');\n\nconst command = 'list';\n\nconst desc = 'List tenants';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs.option('tenant', descriptions.options['tenant'].config);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant } = argv;\n\n let message;\n let spinner = ora();\n try {\n // 1. get data from client-api backend\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n const uri = `${hg.clientApiBaseUri}/tenants/${env}${tenant ? `?tenant=${tenant}` : ''}`;\n debug('requesting:', uri);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('response-data', data);\n\n // exit if there is no data\n if (!data || data.length === 0) {\n json\n ? printJSON([])\n : spinner.info(themed(`Info: ${themed('No tenants found in the specified environment')}.`, 'secondary'));\n return;\n }\n\n if (json) {\n printJSON(data);\n } else {\n // generate results table\n const table = new Table({ head: ['tenant ID'] });\n table.push(...data.map((item) => [item]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, printJSON, themed } from '../../helpers/print.js';\nimport {\n genCredentialsOnClientApi,\n getTenants,\n getLinkedSources,\n getSupportedFlow,\n getLinkedConnectors,\n} from '../../helpers/api.js';\nimport { buildChunks } from '../../helpers/utils.js';\n\nconst debug = Debug('commands:tenants:custom-catalog');\n\nconst command = 'custom-catalog';\n\nconst desc = 'List tenants with custom catalog in a specific flow';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant', descriptions.options['tenant'].config)\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText);\n};\n\nconst processTenant = async ({ debug, baseUri, apikey, env, flow, tenant, isV2Flow }) => {\n try {\n // Get all linked connectors/sources of the tuple (env, flow, tenant)\n const linkedConnectors = isV2Flow\n ? await getLinkedConnectors({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n })\n : await getLinkedSources({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n });\n\n const connectors = [];\n\n // Generate AWS credentials in order to read the S3 tap folder\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri,\n task: 'field-map-download',\n env,\n tenant,\n flow,\n apikey,\n });\n\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n for (const { id, tap } of linkedConnectors) {\n const entityLabel = isV2Flow ? 'connectors' : 'taps';\n\n const params = {\n Bucket: env,\n Key: `${tenant}/flows/${flow}/${entityLabel}/${isV2Flow ? id : tap}/catalog.json`,\n };\n\n try {\n await s3.headObject(params).promise();\n\n connectors.push(isV2Flow ? id : tap);\n } catch (error) {\n // Does not have catalog.json\n }\n }\n\n return { tenant, connectors };\n } catch (error) {\n console.error(error);\n return { tenant, connectors: [] };\n }\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow } = argv;\n\n let message;\n let spinner = ora();\n\n try {\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const [allTenants, supportedFlow] = await Promise.all([\n getTenants({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n }),\n getSupportedFlow({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n }),\n ]);\n\n const isV2Flow = supportedFlow?.version === 2;\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const tenantsWithCustomFieldMap = [];\n\n message = themed(`Querying for custom catalogs for flow ${themed(flow, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Break the tenants array in to an array of arrays so we can make\n // parallel calls and make it faster\n for (const tenants of buildChunks(allTenants)) {\n const maybeTenantsWithCustomFieldMap = await Promise.all(\n tenants.map((tenant) =>\n processTenant({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n tenant,\n isV2Flow,\n })\n )\n );\n\n tenantsWithCustomFieldMap.push(\n ...maybeTenantsWithCustomFieldMap.filter(({ connectors }) => connectors.length > 0)\n );\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON(tenantsWithCustomFieldMap);\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID', 'Connector IDs'] });\n table.push(...tenantsWithCustomFieldMap.map(({ tenant, connectors }) => [tenant, connectors.join(', ')]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, printJSON, themed } from '../../helpers/print.js';\nimport {\n getTenants,\n getLinkedSources,\n getSupportedFlow,\n getLinkedConnectors,\n patchLinkedConnectorConfig,\n patchLinkedSourceConfig,\n} from '../../helpers/api.js';\nimport { buildChunks } from '../../helpers/utils.js';\nimport { existsSync, readFileSync } from 'fs';\n\nconst debug = Debug('commands:tenants:update-config');\n\nconst command = 'update-config';\n\nconst desc = 'Update the config of a specific connector and flow for all tenants';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('connector', descriptions.options['connector'].config)\n .demandOption('connector', descriptions.options['connector'].demandText)\n .option('configFilePath', descriptions.options['configFilePath'].config)\n .demandOption('configFilePath', descriptions.options['configFilePath'].demandText);\n};\n\nconst processTenant = async ({ debug, baseUri, apikey, env, flow, tenant, connectorId, config, isV2Flow }) => {\n const lookupKey = isV2Flow ? 'id' : 'tap';\n\n // Get all linked connectors/sources of the tuple (env, flow, tenant)\n const linkedConnectors = isV2Flow\n ? await getLinkedConnectors({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n config: true,\n })\n : await getLinkedSources({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n config: true,\n });\n\n const connector = linkedConnectors.find((c) => c[lookupKey] === connectorId);\n\n if (!connector) return null;\n\n const patchFunction = isV2Flow ? patchLinkedConnectorConfig : patchLinkedSourceConfig;\n\n try {\n await patchFunction({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n connectorId,\n config,\n });\n } catch (e) {\n console.log(themed(`Error patching: ${tenant}. ${e}`, 'secondary'))\n }\n\n return tenant;\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, connector, configFilePath } = argv;\n\n let message;\n let spinner = ora();\n\n try {\n if (!configFilePath) {\n throw new Error('Config file path not provided');\n }\n\n if (!configFilePath.endsWith('.json')) {\n throw new Error('Config file must have .json extension');\n }\n\n if (!existsSync(configFilePath)) {\n throw new Error('Config file not found');\n }\n\n const config = JSON.parse(readFileSync(configFilePath, { encoding: 'utf-8' }));\n\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const [allTenants, supportedFlow] = await Promise.all([\n getTenants({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n }),\n getSupportedFlow({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n }),\n ]);\n\n const isV2Flow = supportedFlow?.version === 2;\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const tenantsUpdated = [];\n\n message = themed(`Updating config for connector ${themed(connector, 'info')} and flow ${themed(flow, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Break the tenants array in to an array of arrays so we can make\n // parallel calls and make it faster\n for (const tenants of buildChunks(allTenants)) {\n const maybeTenantsUpdated = await Promise.all(\n tenants.map((tenant) =>\n processTenant({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n tenant,\n connectorId: connector,\n config,\n isV2Flow,\n })\n )\n );\n\n tenantsUpdated.push(...maybeTenantsUpdated.filter(Boolean));\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON(tenantsUpdated);\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID'] });\n tenantsUpdated.forEach((t) => table.push([t]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as customEtl from './customEtl.js';\nimport * as customField from './customFieldMap.js';\nimport * as del from './delete.js';\nimport * as list from './list.js';\nimport * as customCatalog from './customCatalog.js';\nimport * as updateConfig from './updateConfig.js';\n\nexport const tenants = [customEtl, customField, del, list, customCatalog, updateConfig];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { tenants } from './tenants/index.js';\n\nconst debug = Debug('commands:tenants');\nconst command = 'tenants <action>';\n\nconst desc = 'Manage tenants';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(tenants);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import fs from 'fs';\nimport { generateJsonLines } from './util.js';\nimport Debug from '../../helpers/debug.js';\nimport descriptions from '../../helpers/descriptions.js';\nimport crypto from 'crypto';\nimport { printJSON } from '../../helpers/print.js';\nconst debug = Debug('commands:singer:validate');\n\nconst command = 'validate';\n\nconst desc = 'Validate Singer data';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('dataFilePath', { ...descriptions.options['dataFilePath'].config })\n .option('allowDuplicateRecords', {\n type: 'boolean',\n default: false,\n description: 'Allow duplicate records',\n })\n .option('allowFuzzyTypes', {\n type: 'boolean',\n default: false,\n description: 'Allow fields to have multiple non-null types',\n });\n};\n\nconst validateSchemaMatching = (streamName, newSchema, currentSchema) => {\n for (const [field, fieldSchema] of Object.entries(newSchema.properties)) {\n if (currentSchema.properties[field]) {\n const currentTyping = currentSchema.properties[field].type;\n const newTyping = fieldSchema.type;\n if (currentTyping.length != newTyping.length || currentTyping.some((t) => !newTyping.includes(t))) {\n throw new Error(\n `Schema for ${streamName} has different typing for field ${field}: ${currentTyping} and ${newTyping}`\n );\n }\n }\n }\n};\n\nconst validateSchemaFormat = (streamName, schema, allowFuzzyTypes) => {\n for (const [field, fieldSchema] of Object.entries(schema.properties)) {\n let typing = fieldSchema.type;\n if (!Array.isArray(typing)) {\n typing = [typing];\n }\n\n const nonNullTypes = typing.filter((t) => t !== 'null');\n if (nonNullTypes.length > 1 && !allowFuzzyTypes) {\n throw new Error(\n `Schema for ${streamName} has multiple non-null types for field ${field}: ${nonNullTypes.join(', ')}`\n );\n }\n }\n};\n\nconst validateFieldAgainstSchema = (streamName, field, value, fieldType) => {\n /*\n Currently only checks primitives\n TODO: Check types within Arrays+Objects \n (Nested validation should probably be under flag)\n */\n let typing = fieldType.type;\n if (!Array.isArray(typing)) {\n typing = [typing];\n }\n const nonNullType = typing.filter((t) => t !== 'null')[0];\n const isNullable = typing.includes('null');\n if (isNullable && value === null) {\n return;\n }\n if (nonNullType === 'string' && typeof value !== 'string') {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type string.`\n );\n }\n if (nonNullType === 'number' && typeof value !== 'number') {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type number.`\n );\n }\n if (nonNullType === 'boolean' && typeof value !== 'boolean') {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type boolean.`\n );\n }\n if (nonNullType === 'array') {\n if (!Array.isArray(value)) {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type array.`\n );\n }\n }\n if (nonNullType === 'object') {\n if (typeof value !== 'object') {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type object.`\n );\n }\n }\n};\n\nconst validateRecordAgainstSchema = (streamName, record, schema) => {\n for (const [field, value] of Object.entries(record)) {\n const fieldType = schema.properties[field];\n if (!fieldType) {\n throw new Error(`Record for ${streamName} has unknown field ${field}`);\n }\n validateFieldAgainstSchema(streamName, field, value, fieldType);\n }\n};\n\nconst validateSchemaMessage = (streams, obj, allowFuzzyTypes) => {\n const streamName = obj.stream;\n if (!streamName) {\n throw new Error('Schema record is missing stream name');\n }\n\n if (!obj.schema) {\n throw new Error(`Schema record for ${streamName} is missing schema field`);\n }\n\n if (!streams[streamName]) {\n streams[streamName] = {\n schema: obj.schema,\n keyProperties: obj.key_properties || [],\n keySet: new Set(),\n count: 0,\n };\n } else {\n for (const keyProperty of obj.key_properties) {\n if (!streams[streamName].keyProperties.includes(keyProperty)) {\n throw new Error(\n `Schema for ${streamName} has different key properties: ${streams[streamName].keyProperties.join(\n ', '\n )} and ${obj.key_properties.join(', ')}`\n );\n }\n }\n\n const currentSchema = streams[streamName].schema;\n validateSchemaMatching(streamName, obj.schema, currentSchema);\n }\n\n validateSchemaFormat(streamName, obj.schema, allowFuzzyTypes);\n return streams;\n};\n\nconst validateRecordMessage = (streams, obj, allowDuplicateRecords) => {\n const streamName = obj.stream;\n const record = obj.record;\n if (!record) {\n throw new Error('Record is missing record field');\n }\n\n if (typeof record !== 'object') {\n throw new Error(`Record has invalid type ${typeof record} for record field. Expected type object.`);\n }\n\n if (!streamName) {\n throw new Error('Record record is missing stream name');\n }\n if (!streams[streamName]) {\n throw new Error(`Record was written for stream ${streamName} before schema row was written.`);\n }\n const pks = streams[streamName].keyProperties;\n\n for (const pk of pks) {\n if (!record[pk]) {\n throw new Error(`Record for ${streamName} is missing key property ${pk}`);\n }\n streams[streamName].keySet.add(record[pk]);\n }\n if (pks.length > 0 && !allowDuplicateRecords) {\n const pkHash = crypto\n .createHash('sha256')\n .update(pks.map((pk) => `${pk}:${record[pk]}`).join(''))\n .digest('hex');\n if (streams[streamName].keySet.has(pkHash)) {\n throw new Error(\n `Duplicate record for ${streamName} with primary keys: ${pks.map((pk) => `${pk}: ${record[pk]}`).join(', ')}`\n );\n }\n streams[streamName].keySet.add(pkHash);\n }\n\n validateRecordAgainstSchema(streamName, record, streams[streamName].schema);\n\n streams[streamName].count++;\n};\n\nconst validateStateMessage = (streams, obj) => {\n if (!obj.value) {\n throw new Error(`State record is missing value`);\n }\n if (typeof obj.value !== 'object') {\n throw new Error(`State record has invalid type ${typeof obj.value} for value. Expected type object.`);\n }\n};\n\nconst validateSingerData = async (dataFilePath, options) => {\n const streams = {};\n const { allowDuplicateRecords, allowFuzzyTypes } = options;\n\n for await (const obj of generateJsonLines(dataFilePath)) {\n try {\n if (!obj.type) {\n throw new Error(`Singer row is missing type: ${JSON.stringify(obj)}`);\n }\n if (obj.type == 'SCHEMA') {\n validateSchemaMessage(streams, obj, allowFuzzyTypes);\n } else if (obj.type == 'RECORD') {\n validateRecordMessage(streams, obj, allowDuplicateRecords);\n } else if (obj.type == 'STATE') {\n validateStateMessage(streams, obj);\n }\n } catch (error) {\n if(options.json) {\n error.message =`${error.message}. Error occured on line: ${JSON.stringify(obj)}.`;\n } else {\n console.log(`Error occured on line: ${JSON.stringify(obj)} \n `);\n }\n throw error;\n }\n }\n return streams;\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { allowDuplicateRecords, allowFuzzyTypes, dataFilePath, json } = argv;\n const options = {\n allowDuplicateRecords,\n allowFuzzyTypes,\n json,\n };\n\n if (!dataFilePath) {\n throw new Error('Data file path is required');\n }\n\n if (!fs.existsSync(dataFilePath)) {\n throw new Error(`Data file path ${dataFilePath} does not exist`);\n }\n\n try {\n const streams = await validateSingerData(dataFilePath, options);\n if (json) {\n console.log(JSON.stringify({\n streams: Object.keys(streams).map((stream) => ({\n stream,\n count: streams[stream].count,\n })),\n }, null, 2));\n } else {\n console.log(`\n \n🎉🎉🎉 Singer validation passed 🎉🎉🎉\n--------------------------------------\n\n${Object.keys(streams).length} streams validated\n\nRecord count by stream:\n${Object.keys(streams)\n .map(\n (stream) => `\n ${stream}: ${streams[stream].count}`\n )\n .join('')}\n\n `);\n }\n } catch (error) {\n if (json) {\n console.log(JSON.stringify({\n error: error.message,\n }, null, 2));\n } else {\n console.log(`\n\n🚨🚨🚨 Singer validation failed 🚨🚨🚨\n--------------------------------------\n\n${error.message}\n\n `);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import fs from 'fs';\nexport async function* generateJsonLines(filePath) {\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf8' });\n let remainder = '';\n\n for await (const chunk of fileStream) {\n const lines = (remainder + chunk).split('\\n');\n remainder = lines.pop(); // Keep the last partial line\n\n for (const line of lines) {\n if (line.trim()) {\n yield JSON.parse(line);\n }\n }\n }\n\n if (remainder.trim()) {\n yield JSON.parse(remainder);\n }\n}\n","import * as validate from './validate.js';\n\nexport const singer = [validate];\n","import Debug from '../helpers/debug.js';\nimport { baseBuilder } from '../helpers/baseBuilder.js';\nimport { singer } from './singer/index.js';\n\nconst debug = Debug('commands:singer');\n\nconst command = 'singer <action>';\n\nconst desc = 'Develop and test singer taps and targets';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseBuilder(yargs);\n return base.command(singer);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import * as config from './config.js';\nimport * as env from './env.js';\nimport * as etl from './etl.js';\nimport * as flows from './flows.js';\nimport * as jobs from './jobs.js';\nimport * as schedules from './schedules.js';\nimport * as snapshots from './snapshots.js';\nimport * as tenants from './tenants.js';\nimport * as singer from './singer.js'\n\nexport const commands = [config, env, etl, flows, jobs, schedules, snapshots, tenants, singer];\n","#!/usr/bin/env node\nimport 'dotenv/config.js';\nimport _yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { staticOptions } from './helpers/config.js';\nimport { setTheme, themed } from './helpers/print.js';\nimport 'aws-sdk';\nimport { commands } from './commands/index.js';\nprocess.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE = '1';\n// set theme once here\nconst myTheme = {};\nsetTheme(myTheme);\n\nconst yargs = _yargs(process.argv.slice(2));\n\nyargs\n .usage(themed('Usage: $0 <command>'))\n .command(commands)\n .demandCommand()\n // .help()\n // .version('v')\n .alias('v', 'version')\n .alias('h', 'help')\n .string('_')\n .strictCommands()\n // .strictOptions()\n .epilogue(themed('For more information, visit https://docs.hotglue.xyz/docs/cli-overview'))\n .wrap(Math.min(yargs.terminalWidth(), 90))\n .parse(hideBin(process.argv), staticOptions);\n// .parse(hideBin(process.argv));\n\nexport {};\n"],"names":["DefaultValuesForTypeKey","fs","require$$0","path","require$$1","os","require$$2","log","message","console","RE_INI_KEY_VAL","RE_NEWLINES","NEWLINES_MATCH","parse","src","options","debug","Boolean","obj","toString","split","forEach","line","idx","keyValueArr","match","key","val","end","length","isDoubleQuoted","substring","replace","trim","trimmedLine","main","config","dotenvPath","resolve","process","cwd","encoding","override","envPath","join","homedir","slice","parsed","readFileSync","Object","keys","prototype","hasOwnProperty","call","env","e","error","getProcessArgvBinIndex","versions","electron","defaultApp","camelCase","str","toLowerCase","toUpperCase","indexOf","camelcase","nextChrUpper","leadingHyphens","i","chr","charAt","mixin","assign","DOTENV_CONFIG_ENCODING","DOTENV_CONFIG_PATH","DOTENV_CONFIG_DEBUG","DOTENV_CONFIG_OVERRIDE","envOptions","re","cliOptions","args","reduce","acc","cur","matches","argv","increment","orig","undefined","sanitizeKey","minNodeVersion","YARGS_MIN_NODE_VERSION","Number","version","Error","constructor","_mixin","argsInput","opts","alias","array","boolean","configObjects","configuration","coerce","count","default","envPrefix","narg","normalize","string","number","__","argString","Array","isArray","map","prevC","c","opening","ii","tokenizeArgString","inputIsString","aliases","aliasArrays","combined","create","change","push","concat","filter","v","splice","aliasArray","lastAlias","self","pop","combineAliases","defaults","notFlagsOption","notFlagsArgv","newAliases","defaulted","format","flags","arrays","bools","strings","numbers","counts","configs","nargs","coercions","negative","negatedBoolean","RegExp","opt","assignment","entries","value","x","test","joinString","lowercase","notCamelcase","chrLower","chrString","decamelize","y","extendAliases","find","checkAllAliases","notFlags","_","argvReturn","arg","truncatedArg","broken","letters","m","next","isUnknownOptionAsArg","pushPositional","eatArray","eatNargs","setArg","defaultValue","j","maybeCoercedNumber","maybeCoerceNumber","argAfterEqualSign","toEat","isNaN","isUndefined","available","consumed","Math","min","argsToSet","nargsCount","defVal","processValue","shouldStripQuotes","prop","addNewAlias","splitKey","setKey","keyProperties","a","shift","includes","defineProperty","enumerable","get","set","stripQuotes","isSafeInteger","floor","parseFloat","setConfigObject","prev","fullKey","hasKey","applyEnvVars","configOnly","prefix","envVar","lastIndexOf","applyDefaultsAndAliases","canLog","o","isTypeArray","isValueArray","duplicate","flag","toCheck","setAlias","hasAnyFlag","flagsKeys","k","some","hasAllFlags","hasAllShortFlags","patterns","pattern","hasFlagsMatching","isUnknownOption","type","BOOLEAN","STRING","NUMBER","ARRAY","guessType","num","configLookup","configKey","configPath","resolvedConfigPath","resolveConfig","require","ex","name","setConfig","configObject","applied","Set","has","ali","add","err","applyCoercions","setPlaceholderKeys","JSON","shim$1","writeFile","exists","file","statSync","isFile","shim","Y18N","this","directory","updateFiles","locale","fallbackToLanguage","cache","writeQueue","arguments","_taggedLiteral","cb","_readLocaleFile","_enqueueWrite","apply","__n","singular","plural","quantity","one","other","values","setLocale","getLocale","updateLocale","parts","part","work","_processWriteQueue","_this","languageFile","_resolveLocaleFile","serializedLocale","stringify","localeLookup","SyntaxError","code","_fileExistsSync","__dirname","fileURLToPath","url","exit","nextTick","stdout","columns","_shim","y18n","bind","_y18n","staticOptions","hg","appName","clientApiBaseUri","HOTGLUE_CLIENT_API_BASE_URI","defaultConfigFileName","defaultOptions","getProfileConfigFilePath","getProfileConfig","async","cosmiconfig","load","getProjectConfig","cosmic","searchPlaces","search","defaultTheme","primary","chalk","whiteBright","secondary","white","info","green","warn","yellow","redBright","success","greenBright","_currentTheme","_defaultColor","setTheme","theme","funcs","print","write","themed","content","color","objString","inspect","colors","cl","contentArgs","pr","pp","setDefault","printJSON","data","Debug","extendDebug","namespace","extend","command","yargs","option","describe","json","setting","profileConfig","yamlData","YAML","filePath","filepath","mkdir","dirname","recursive","writeConfigFile","status","action","table","Table","head","projectConfig","relative","descriptions","demandText","apikey","dataFilePath","tenant","flow","tap","connector","all","jobroot","downloadTo","sourceFolder","configFilePath","overwrite","cleanup","includeConfigs","baseApiBuilder","getCombinedConfig","demandOption","strictCommands","_getFolderFiles","dir","result","includeSymLinks","matcher","fullPath","files","readdir","withFileTypes","isSymbolicLink","isDirectory","getFolderFiles","_options","micromatch","dot","filterFiles","streamToString","stream","chunks","Promise","reject","on","Buffer","from","buildChunks","chunkSize","resultArray","chunk","resetAvailableEntities","baseUri","apiKey","urlObj","URL","axios","delete","headers","genCredentialsOnClientApi","task","params","searchParams","uri","accessKeyId","secretAccessKey","sessionToken","getTenants","getSupportedSources","getSupportedConnectors","getLinkedSources","getLinkedConnectors","patchLinkedSourceConfig","connectorId","body","patch","patchLinkedConnectorConfig","connector_id","getSupportedFlows","getSupportedFlow","getEnvJobs","to","queryParams","countNum","parseInt","allJobs","totalJobs","page","hasMore","jobsCount","jobs","total","pageJobs","retriggerJob","payload","post","updateSchedule","user_id","schedule_expression","state","job_type","extra_args","put","getJobStatus","job_root","include_export_details","validateAvailableSources","forkedSources","flows","linkedSources","id","flat","newSourceIds","source","duplicateIds","index","missingSources","isForked","label","validateAvailableTargets","forkedTargets","linkedTargets","getSupportedTargets","newTargetIds","target","missingTargets","validateAvailableConnectors","forkedConnectors","linkedConnectors","newConnectorIds","missingConnectors","folderPrefix","spinner","ora","start","deployableFiles","fail","succeed","endsWith","fileContent","readFile","String","s3","AWS","S3","rootKey","filename","basename","Bucket","Key","Body","res","putObject","promise","deployedFiles","response","Prefix","Contents","s3Files","listObjectsV2","filesToDownload","item","downloadedFiles","fileStream","getObject","createReadStream","deploy","download","isV2Flow","envId","tenantId","flowId","fileString","getEntityLabel","isV2","keyPrefix","listObjectsRes","deleteObjectsRes","deleteObjects","Delete","Objects","object","deleteObject","splittedKey","deletedObjects","filenames","ETL_SCRIPT_BLACKLISTED_FILES","ETL_SCRIPT_BLACKLISTED_DIRECTORIES","violatedDirectory","startsWith","validateEtlScriptFiles","supportedFlow","connectors","ss","ls","filesToDelete","delParams","Quiet","relativePath","platform","subPath","existsSync","stat","exports","coll","_isArrayLike2","len","createArrayIterator","iterator","_getIterator2","done","createES2015Iterator","okeys","_isArrayLike","module","_interopRequireDefault","_getIterator","Symbol","__esModule","func","_wrapAsync","isAsync","callback","handlePromise","_initialParams2","then","_initialParams","fn","_setImmediate2","setImmediate_1","fallback","wrap","_defer","hasQueueMicrotask","queueMicrotask","hasSetImmediate","setImmediate","hasNextTick","setTimeout","defer","invokeCallback","wrapAsync_1","isAsyncIterable","isAsyncGenerator","_asyncify","_asyncify2","toStringTag","asyncFn","asyncIterator","_once","wrapper","callFn","_once2","_iterator2","_onlyOnce","_onlyOnce2","require$$3","_asyncEachOfLimit","generator","limit","iteratee","canceled","awaiting","running","replenish","iterDone","iterateeCallback","catch","handleError","_breakLoop2","_asyncEachOfLimit2","require$$5","RangeError","nextElem","looping","elem","arity","cbArgs","_eachOfLimit2","_withoutIndex","_withoutIndex2","_wrapAsync2","_awaitify2","_eachLimit2","serializeError","serialized","stack","statusText","getJobFilesList","continuationToken","allFiles","isTruncated","pageCount","requestParams","ContinuationToken","keyCount","IsTruncated","hasNextToken","NextContinuationToken","text","BucketName","S3Instance","createEnvJobFile","envConfig","jobDetailsJson","localRoot","jobEnvVars","TENANT","FLOW","flow_id","ENV_ID","env_id","JOB_ID","job_id","API_URL","JOB_ROOT","s3_root","ROOT_DIR","JOB_TYPE","CONNECTOR_ID","TAP","TARGET","API_KEY","api_key","custom_env_vars","customEnvVar","envJobFilePath","getEnvConfig","filesList","customCacheBucket","cache_bucket_name","customCacheS3","customCacheBucketAccessKeyId","cache_bucket_access_key_id","customCacheBucketSecretAccessKey","cache_bucket_secret_access_key","customCacheFilesList","filteredFilesList","escapedJobRoot","isConfigFile","isTenantConfigFile","filterFilesList","Size","LastModified","toLocaleString","skippedFiles","filesCount","filesDownloaded","eachSeries","fileName","writableStream","createWriteStream","downloadedBytes","progressPercent","toFixed","pipe","destroyed","destroy","unlink","unlinkErr","downloadJobFiles","jobDetailsPath","errorMessage","jobDetails","sourceName","targetName","sourceConfigPath","targetConfigPath","fileNameFrom","fileNameTo","rename","statePath","createStateJsonFile","etl","del","setupLocalRun","sort","b","localeCompare","taps","sources","targets","list","job_name","job","uniqueFlows","flowVersions","results","jobArgs","runJob","ok","errorResult","statusCode","responseData","request","responseOrError","successCount","r","failCount","jobRoots","groupedJobs","jobRoot","groupKeys","waitForJobCompletion","maxWaitTime","startTime","Date","now","jobStatus","completed","allResults","group","groupJobRoots","groupResults","tenantIds","flowIds","reason","statusFilter","today","oneMonthAgo","setMonth","getMonth","dateFrom","toISOString","tenantIdList","t","jobTenant","flowIdList","f","jobFlow","task_arn","skip_webhooks","killJob","fromUtcIso","toUtcIso","errorMsg","formattedDateFrom","formattedDateTo","stop","s3Root","tenant_id","tap_name","rollbackJob","bulkRun","bulkRetrigger","bulkKill","bulkRollback","choices","expression","jobType","tenantList","flowList","allSchedules","includeDisabled","getScheduleList","schedules","updated","filteredSchedules","schedule","schedulesToUpdate","BATCH_SIZE","updatedSchedules","failedSchedules","batch","batchNum","totalBatches","ceil","updatePromises","scheduleExpression","scheduleState","isActive","failed","errors","originalSchedule","s","bulkUpdate","CommonPrefixes","tenantFolders","Delimiter","wasArgPassed","userSetOption","snapshots","processTenant","supportedSources","allTenants","tenantsWithCustomEtl","tenants","maybeTenantsWithCustomEtl","headObject","tenantsWithCustomFieldMap","maybeTenantsWithCustomFieldMap","deleteTenantSchedules","statu","tenantDeleted","lookupKey","patchFunction","tenantsUpdated","maybeTenantsUpdated","customEtl","customField","customCatalog","updateConfig","validateFieldAgainstSchema","streamName","field","fieldType","typing","nonNullType","validateSchemaMessage","streams","allowFuzzyTypes","schema","keyProperty","key_properties","currentSchema","newSchema","fieldSchema","properties","currentTyping","newTyping","validateSchemaMatching","keySet","nonNullTypes","validateSchemaFormat","validateRecordMessage","allowDuplicateRecords","record","pks","pk","pkHash","crypto","createHash","update","digest","validateRecordAgainstSchema","validateStateMessage","validateSingerData","remainder","lines","generateJsonLines","description","singer","validate","commands","AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE","_yargs","usage","demandCommand","epilogue","terminalWidth"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../node_modules/yargs-parser/build/lib/yargs-parser-types.js","../../../../node_modules/dotenv/lib/main.js","../../../../node_modules/yargs/build/lib/utils/process-argv.js","../../../../node_modules/yargs-parser/build/lib/string-utils.js","../../../../node_modules/yargs-parser/build/lib/yargs-parser.js","../../../../node_modules/dotenv/config.js","../../../../node_modules/dotenv/lib/env-options.js","../../../../node_modules/dotenv/lib/cli-options.js","../../../../node_modules/yargs-parser/build/lib/index.js","../../../../node_modules/yargs-parser/build/lib/tokenize-arg-string.js","../../../../node_modules/y18n/build/lib/platform-shims/node.js","../../../../node_modules/y18n/build/lib/index.js","../../../../node_modules/yargs/lib/platform-shims/esm.mjs","../../../../node_modules/y18n/index.mjs","../../src/helpers/config.js","../../src/helpers/print.js","../../src/helpers/debug.js","../../src/commands/config/set.js","../../src/commands/config/index.js","../../src/commands/config.js","../../src/helpers/descriptions.js","../../src/helpers/baseBuilder.js","../../src/helpers/utils.js","../../src/helpers/api.js","../../src/commands/env/validators.js","../../src/commands/env/deploy.js","../../src/commands/env/download.js","../../src/commands/env/index.js","../../src/commands/env.js","../../src/helpers/flow.js","../../src/commands/etl/delete.js","../../src/commands/etl/deploy.js","../../src/commands/etl/download.js","../../../../node_modules/async/internal/iterator.js","../../../../node_modules/async/internal/isArrayLike.js","../../../../node_modules/async/internal/getIterator.js","../../../../node_modules/async/asyncify.js","../../../../node_modules/async/internal/initialParams.js","../../../../node_modules/async/internal/setImmediate.js","../../../../node_modules/async/internal/wrapAsync.js","../../../../node_modules/async/internal/breakLoop.js","../../../../node_modules/async/internal/eachOfLimit.js","../../../../node_modules/async/internal/once.js","../../../../node_modules/async/internal/onlyOnce.js","../../../../node_modules/async/internal/asyncEachOfLimit.js","../../../../node_modules/async/internal/awaitify.js","../../../../node_modules/async/eachLimit.js","../../../../node_modules/async/internal/withoutIndex.js","../../../../node_modules/async/eachSeries.js","../../src/commands/etl/setup-local-run.js","../../src/commands/etl/index.js","../../src/commands/etl.js","../../src/commands/flows/list.js","../../src/commands/flows/index.js","../../src/commands/flows.js","../../src/commands/jobs/download.js","../../src/commands/jobs/list.js","../../src/commands/jobs/bulkRun.js","../../src/commands/jobs/bulkRetrigger.js","../../src/commands/jobs/bulkKill.js","../../src/commands/jobs/bulkRollback.js","../../src/commands/jobs/index.js","../../src/commands/jobs.js","../../src/commands/schedules/bulkUpdate.js","../../src/commands/schedules/index.js","../../src/commands/schedules.js","../../src/commands/snapshots/deploy.js","../../src/commands/snapshots/download.js","../../src/commands/snapshots/index.js","../../src/commands/snapshots.js","../../src/commands/tenants/customEtl.js","../../src/commands/tenants/customFieldMap.js","../../src/commands/tenants/delete.js","../../src/commands/tenants/list.js","../../src/commands/tenants/customCatalog.js","../../src/commands/tenants/updateConfig.js","../../src/commands/tenants/index.js","../../src/commands/tenants.js","../../src/commands/singer/validate.js","../../src/commands/singer/util.js","../../src/commands/singer/index.js","../../src/commands/singer.js","../../src/commands/index.js","../../src/index.js"],"sourcesContent":["/**\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\nexport var DefaultValuesForTypeKey;\n(function (DefaultValuesForTypeKey) {\n DefaultValuesForTypeKey[\"BOOLEAN\"] = \"boolean\";\n DefaultValuesForTypeKey[\"STRING\"] = \"string\";\n DefaultValuesForTypeKey[\"NUMBER\"] = \"number\";\n DefaultValuesForTypeKey[\"ARRAY\"] = \"array\";\n})(DefaultValuesForTypeKey || (DefaultValuesForTypeKey = {}));\n","const fs = require('fs')\nconst path = require('path')\nconst os = require('os')\n\nfunction log (message) {\n console.log(`[dotenv][DEBUG] ${message}`)\n}\n\nconst NEWLINE = '\\n'\nconst RE_INI_KEY_VAL = /^\\s*([\\w.-]+)\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^#]*)?(\\s*|\\s*#.*)?$/\nconst RE_NEWLINES = /\\\\n/g\nconst NEWLINES_MATCH = /\\r\\n|\\n|\\r/\n\n// Parses src into an Object\nfunction parse (src, options) {\n const debug = Boolean(options && options.debug)\n const obj = {}\n\n // convert Buffers before splitting into lines and processing\n src.toString().split(NEWLINES_MATCH).forEach(function (line, idx) {\n // matching \"KEY' and 'VAL' in 'KEY=VAL'\n const keyValueArr = line.match(RE_INI_KEY_VAL)\n // matched?\n if (keyValueArr != null) {\n const key = keyValueArr[1]\n // default undefined or missing values to empty string\n let val = (keyValueArr[2] || '')\n const end = val.length - 1\n const isDoubleQuoted = val[0] === '\"' && val[end] === '\"'\n const isSingleQuoted = val[0] === \"'\" && val[end] === \"'\"\n\n // if single or double quoted, remove quotes\n if (isSingleQuoted || isDoubleQuoted) {\n val = val.substring(1, end)\n\n // if double quoted, expand newlines\n if (isDoubleQuoted) {\n val = val.replace(RE_NEWLINES, NEWLINE)\n }\n } else {\n // remove surrounding whitespace\n val = val.trim()\n }\n\n obj[key] = val\n } else if (debug) {\n const trimmedLine = line.trim()\n\n // ignore empty and commented lines\n if (trimmedLine.length && trimmedLine[0] !== '#') {\n log(`Failed to match key and value when parsing line ${idx + 1}: ${line}`)\n }\n }\n })\n\n return obj\n}\n\nfunction resolveHome (envPath) {\n return envPath[0] === '~' ? path.join(os.homedir(), envPath.slice(1)) : envPath\n}\n\n// Populates process.env from .env file\nfunction config (options) {\n let dotenvPath = path.resolve(process.cwd(), '.env')\n let encoding = 'utf8'\n const debug = Boolean(options && options.debug)\n const override = Boolean(options && options.override)\n\n if (options) {\n if (options.path != null) {\n dotenvPath = resolveHome(options.path)\n }\n if (options.encoding != null) {\n encoding = options.encoding\n }\n }\n\n try {\n // specifying an encoding returns a string instead of a buffer\n const parsed = parse(fs.readFileSync(dotenvPath, { encoding }), { debug })\n\n Object.keys(parsed).forEach(function (key) {\n if (!Object.prototype.hasOwnProperty.call(process.env, key)) {\n process.env[key] = parsed[key]\n } else {\n if (override === true) {\n process.env[key] = parsed[key]\n }\n\n if (debug) {\n if (override === true) {\n log(`\"${key}\" is already defined in \\`process.env\\` and WAS overwritten`)\n } else {\n log(`\"${key}\" is already defined in \\`process.env\\` and was NOT overwritten`)\n }\n }\n }\n })\n\n return { parsed }\n } catch (e) {\n if (debug) {\n log(`Failed to load ${dotenvPath} ${e.message}`)\n }\n\n return { error: e }\n }\n}\n\nmodule.exports.config = config\nmodule.exports.parse = parse\n","function getProcessArgvBinIndex() {\n if (isBundledElectronApp())\n return 0;\n return 1;\n}\nfunction isBundledElectronApp() {\n return isElectronApp() && !process.defaultApp;\n}\nfunction isElectronApp() {\n return !!process.versions.electron;\n}\nexport function hideBin(argv) {\n return argv.slice(getProcessArgvBinIndex() + 1);\n}\nexport function getProcessArgvBin() {\n return process.argv[getProcessArgvBinIndex()];\n}\n","/**\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\nexport function camelCase(str) {\n // Handle the case where an argument is provided as camel case, e.g., fooBar.\n // by ensuring that the string isn't already mixed case:\n const isCamelCase = str !== str.toLowerCase() && str !== str.toUpperCase();\n if (!isCamelCase) {\n str = str.toLowerCase();\n }\n if (str.indexOf('-') === -1 && str.indexOf('_') === -1) {\n return str;\n }\n else {\n let camelcase = '';\n let nextChrUpper = false;\n const leadingHyphens = str.match(/^-+/);\n for (let i = leadingHyphens ? leadingHyphens[0].length : 0; i < str.length; i++) {\n let chr = str.charAt(i);\n if (nextChrUpper) {\n nextChrUpper = false;\n chr = chr.toUpperCase();\n }\n if (i !== 0 && (chr === '-' || chr === '_')) {\n nextChrUpper = true;\n }\n else if (chr !== '-' && chr !== '_') {\n camelcase += chr;\n }\n }\n return camelcase;\n }\n}\nexport function decamelize(str, joinString) {\n const lowercase = str.toLowerCase();\n joinString = joinString || '-';\n let notCamelcase = '';\n for (let i = 0; i < str.length; i++) {\n const chrLower = lowercase.charAt(i);\n const chrString = str.charAt(i);\n if (chrLower !== chrString && i > 0) {\n notCamelcase += `${joinString}${lowercase.charAt(i)}`;\n }\n else {\n notCamelcase += chrString;\n }\n }\n return notCamelcase;\n}\nexport function looksLikeNumber(x) {\n if (x === null || x === undefined)\n return false;\n // if loaded from config, may already be a number.\n if (typeof x === 'number')\n return true;\n // hexadecimal.\n if (/^0x[0-9a-f]+$/i.test(x))\n return true;\n // don't treat 0123 as a number; as it drops the leading '0'.\n if (/^0[^.]/.test(x))\n return false;\n return /^[-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(e[-+]?\\d+)?$/.test(x);\n}\n","/**\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\nimport { tokenizeArgString } from './tokenize-arg-string.js';\nimport { DefaultValuesForTypeKey } from './yargs-parser-types.js';\nimport { camelCase, decamelize, looksLikeNumber } from './string-utils.js';\nlet mixin;\nexport class YargsParser {\n constructor(_mixin) {\n mixin = _mixin;\n }\n parse(argsInput, options) {\n const opts = Object.assign({\n alias: undefined,\n array: undefined,\n boolean: undefined,\n config: undefined,\n configObjects: undefined,\n configuration: undefined,\n coerce: undefined,\n count: undefined,\n default: undefined,\n envPrefix: undefined,\n narg: undefined,\n normalize: undefined,\n string: undefined,\n number: undefined,\n __: undefined,\n key: undefined\n }, options);\n // allow a string argument to be passed in rather\n // than an argv array.\n const args = tokenizeArgString(argsInput);\n // tokenizeArgString adds extra quotes to args if argsInput is a string\n // only strip those extra quotes in processValue if argsInput is a string\n const inputIsString = typeof argsInput === 'string';\n // aliases might have transitive relationships, normalize this.\n const aliases = combineAliases(Object.assign(Object.create(null), opts.alias));\n const configuration = Object.assign({\n 'boolean-negation': true,\n 'camel-case-expansion': true,\n 'combine-arrays': false,\n 'dot-notation': true,\n 'duplicate-arguments-array': true,\n 'flatten-duplicate-arrays': true,\n 'greedy-arrays': true,\n 'halt-at-non-option': false,\n 'nargs-eats-options': false,\n 'negation-prefix': 'no-',\n 'parse-numbers': true,\n 'parse-positional-numbers': true,\n 'populate--': false,\n 'set-placeholder-key': false,\n 'short-option-groups': true,\n 'strip-aliased': false,\n 'strip-dashed': false,\n 'unknown-options-as-args': false\n }, opts.configuration);\n const defaults = Object.assign(Object.create(null), opts.default);\n const configObjects = opts.configObjects || [];\n const envPrefix = opts.envPrefix;\n const notFlagsOption = configuration['populate--'];\n const notFlagsArgv = notFlagsOption ? '--' : '_';\n const newAliases = Object.create(null);\n const defaulted = Object.create(null);\n // allow a i18n handler to be passed in, default to a fake one (util.format).\n const __ = opts.__ || mixin.format;\n const flags = {\n aliases: Object.create(null),\n arrays: Object.create(null),\n bools: Object.create(null),\n strings: Object.create(null),\n numbers: Object.create(null),\n counts: Object.create(null),\n normalize: Object.create(null),\n configs: Object.create(null),\n nargs: Object.create(null),\n coercions: Object.create(null),\n keys: []\n };\n const negative = /^-([0-9]+(\\.[0-9]+)?|\\.[0-9]+)$/;\n const negatedBoolean = new RegExp('^--' + configuration['negation-prefix'] + '(.+)');\n [].concat(opts.array || []).filter(Boolean).forEach(function (opt) {\n const key = typeof opt === 'object' ? opt.key : opt;\n // assign to flags[bools|strings|numbers]\n const assignment = Object.keys(opt).map(function (key) {\n const arrayFlagKeys = {\n boolean: 'bools',\n string: 'strings',\n number: 'numbers'\n };\n return arrayFlagKeys[key];\n }).filter(Boolean).pop();\n // assign key to be coerced\n if (assignment) {\n flags[assignment][key] = true;\n }\n flags.arrays[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.boolean || []).filter(Boolean).forEach(function (key) {\n flags.bools[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.string || []).filter(Boolean).forEach(function (key) {\n flags.strings[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.number || []).filter(Boolean).forEach(function (key) {\n flags.numbers[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.count || []).filter(Boolean).forEach(function (key) {\n flags.counts[key] = true;\n flags.keys.push(key);\n });\n [].concat(opts.normalize || []).filter(Boolean).forEach(function (key) {\n flags.normalize[key] = true;\n flags.keys.push(key);\n });\n if (typeof opts.narg === 'object') {\n Object.entries(opts.narg).forEach(([key, value]) => {\n if (typeof value === 'number') {\n flags.nargs[key] = value;\n flags.keys.push(key);\n }\n });\n }\n if (typeof opts.coerce === 'object') {\n Object.entries(opts.coerce).forEach(([key, value]) => {\n if (typeof value === 'function') {\n flags.coercions[key] = value;\n flags.keys.push(key);\n }\n });\n }\n if (typeof opts.config !== 'undefined') {\n if (Array.isArray(opts.config) || typeof opts.config === 'string') {\n ;\n [].concat(opts.config).filter(Boolean).forEach(function (key) {\n flags.configs[key] = true;\n });\n }\n else if (typeof opts.config === 'object') {\n Object.entries(opts.config).forEach(([key, value]) => {\n if (typeof value === 'boolean' || typeof value === 'function') {\n flags.configs[key] = value;\n }\n });\n }\n }\n // create a lookup table that takes into account all\n // combinations of aliases: {f: ['foo'], foo: ['f']}\n extendAliases(opts.key, aliases, opts.default, flags.arrays);\n // apply default values to all aliases.\n Object.keys(defaults).forEach(function (key) {\n (flags.aliases[key] || []).forEach(function (alias) {\n defaults[alias] = defaults[key];\n });\n });\n let error = null;\n checkConfiguration();\n let notFlags = [];\n const argv = Object.assign(Object.create(null), { _: [] });\n // TODO(bcoe): for the first pass at removing object prototype we didn't\n // remove all prototypes from objects returned by this API, we might want\n // to gradually move towards doing so.\n const argvReturn = {};\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n const truncatedArg = arg.replace(/^-{3,}/, '---');\n let broken;\n let key;\n let letters;\n let m;\n let next;\n let value;\n // any unknown option (except for end-of-options, \"--\")\n if (arg !== '--' && isUnknownOptionAsArg(arg)) {\n pushPositional(arg);\n // ---, ---=, ----, etc,\n }\n else if (truncatedArg.match(/---+(=|$)/)) {\n // options without key name are invalid.\n pushPositional(arg);\n continue;\n // -- separated by =\n }\n else if (arg.match(/^--.+=/) || (!configuration['short-option-groups'] && arg.match(/^-.+=/))) {\n // Using [\\s\\S] instead of . because js doesn't support the\n // 'dotall' regex modifier. See:\n // http://stackoverflow.com/a/1068308/13216\n m = arg.match(/^--?([^=]+)=([\\s\\S]*)$/);\n // arrays format = '--f=a b c'\n if (m !== null && Array.isArray(m) && m.length >= 3) {\n if (checkAllAliases(m[1], flags.arrays)) {\n i = eatArray(i, m[1], args, m[2]);\n }\n else if (checkAllAliases(m[1], flags.nargs) !== false) {\n // nargs format = '--f=monkey washing cat'\n i = eatNargs(i, m[1], args, m[2]);\n }\n else {\n setArg(m[1], m[2], true);\n }\n }\n }\n else if (arg.match(negatedBoolean) && configuration['boolean-negation']) {\n m = arg.match(negatedBoolean);\n if (m !== null && Array.isArray(m) && m.length >= 2) {\n key = m[1];\n setArg(key, checkAllAliases(key, flags.arrays) ? [false] : false);\n }\n // -- separated by space.\n }\n else if (arg.match(/^--.+/) || (!configuration['short-option-groups'] && arg.match(/^-[^-]+/))) {\n m = arg.match(/^--?(.+)/);\n if (m !== null && Array.isArray(m) && m.length >= 2) {\n key = m[1];\n if (checkAllAliases(key, flags.arrays)) {\n // array format = '--foo a b c'\n i = eatArray(i, key, args);\n }\n else if (checkAllAliases(key, flags.nargs) !== false) {\n // nargs format = '--foo a b c'\n // should be truthy even if: flags.nargs[key] === 0\n i = eatNargs(i, key, args);\n }\n else {\n next = args[i + 1];\n if (next !== undefined && (!next.match(/^-/) ||\n next.match(negative)) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next);\n i++;\n }\n else if (/^(true|false)$/.test(next)) {\n setArg(key, next);\n i++;\n }\n else {\n setArg(key, defaultValue(key));\n }\n }\n }\n // dot-notation flag separated by '='.\n }\n else if (arg.match(/^-.\\..+=/)) {\n m = arg.match(/^-([^=]+)=([\\s\\S]*)$/);\n if (m !== null && Array.isArray(m) && m.length >= 3) {\n setArg(m[1], m[2]);\n }\n // dot-notation flag separated by space.\n }\n else if (arg.match(/^-.\\..+/) && !arg.match(negative)) {\n next = args[i + 1];\n m = arg.match(/^-(.\\..+)/);\n if (m !== null && Array.isArray(m) && m.length >= 2) {\n key = m[1];\n if (next !== undefined && !next.match(/^-/) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next);\n i++;\n }\n else {\n setArg(key, defaultValue(key));\n }\n }\n }\n else if (arg.match(/^-[^-]+/) && !arg.match(negative)) {\n letters = arg.slice(1, -1).split('');\n broken = false;\n for (let j = 0; j < letters.length; j++) {\n next = arg.slice(j + 2);\n if (letters[j + 1] && letters[j + 1] === '=') {\n value = arg.slice(j + 3);\n key = letters[j];\n if (checkAllAliases(key, flags.arrays)) {\n // array format = '-f=a b c'\n i = eatArray(i, key, args, value);\n }\n else if (checkAllAliases(key, flags.nargs) !== false) {\n // nargs format = '-f=monkey washing cat'\n i = eatNargs(i, key, args, value);\n }\n else {\n setArg(key, value);\n }\n broken = true;\n break;\n }\n if (next === '-') {\n setArg(letters[j], next);\n continue;\n }\n // current letter is an alphabetic character and next value is a number\n if (/[A-Za-z]/.test(letters[j]) &&\n /^-?\\d+(\\.\\d*)?(e-?\\d+)?$/.test(next) &&\n checkAllAliases(next, flags.bools) === false) {\n setArg(letters[j], next);\n broken = true;\n break;\n }\n if (letters[j + 1] && letters[j + 1].match(/\\W/)) {\n setArg(letters[j], next);\n broken = true;\n break;\n }\n else {\n setArg(letters[j], defaultValue(letters[j]));\n }\n }\n key = arg.slice(-1)[0];\n if (!broken && key !== '-') {\n if (checkAllAliases(key, flags.arrays)) {\n // array format = '-f a b c'\n i = eatArray(i, key, args);\n }\n else if (checkAllAliases(key, flags.nargs) !== false) {\n // nargs format = '-f a b c'\n // should be truthy even if: flags.nargs[key] === 0\n i = eatNargs(i, key, args);\n }\n else {\n next = args[i + 1];\n if (next !== undefined && (!/^(-|--)[^-]/.test(next) ||\n next.match(negative)) &&\n !checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts)) {\n setArg(key, next);\n i++;\n }\n else if (/^(true|false)$/.test(next)) {\n setArg(key, next);\n i++;\n }\n else {\n setArg(key, defaultValue(key));\n }\n }\n }\n }\n else if (arg.match(/^-[0-9]$/) &&\n arg.match(negative) &&\n checkAllAliases(arg.slice(1), flags.bools)) {\n // single-digit boolean alias, e.g: xargs -0\n key = arg.slice(1);\n setArg(key, defaultValue(key));\n }\n else if (arg === '--') {\n notFlags = args.slice(i + 1);\n break;\n }\n else if (configuration['halt-at-non-option']) {\n notFlags = args.slice(i);\n break;\n }\n else {\n pushPositional(arg);\n }\n }\n // order of precedence:\n // 1. command line arg\n // 2. value from env var\n // 3. value from config file\n // 4. value from config objects\n // 5. configured default value\n applyEnvVars(argv, true); // special case: check env vars that point to config file\n applyEnvVars(argv, false);\n setConfig(argv);\n setConfigObjects();\n applyDefaultsAndAliases(argv, flags.aliases, defaults, true);\n applyCoercions(argv);\n if (configuration['set-placeholder-key'])\n setPlaceholderKeys(argv);\n // for any counts either not in args or without an explicit default, set to 0\n Object.keys(flags.counts).forEach(function (key) {\n if (!hasKey(argv, key.split('.')))\n setArg(key, 0);\n });\n // '--' defaults to undefined.\n if (notFlagsOption && notFlags.length)\n argv[notFlagsArgv] = [];\n notFlags.forEach(function (key) {\n argv[notFlagsArgv].push(key);\n });\n if (configuration['camel-case-expansion'] && configuration['strip-dashed']) {\n Object.keys(argv).filter(key => key !== '--' && key.includes('-')).forEach(key => {\n delete argv[key];\n });\n }\n if (configuration['strip-aliased']) {\n ;\n [].concat(...Object.keys(aliases).map(k => aliases[k])).forEach(alias => {\n if (configuration['camel-case-expansion'] && alias.includes('-')) {\n delete argv[alias.split('.').map(prop => camelCase(prop)).join('.')];\n }\n delete argv[alias];\n });\n }\n // Push argument into positional array, applying numeric coercion:\n function pushPositional(arg) {\n const maybeCoercedNumber = maybeCoerceNumber('_', arg);\n if (typeof maybeCoercedNumber === 'string' || typeof maybeCoercedNumber === 'number') {\n argv._.push(maybeCoercedNumber);\n }\n }\n // how many arguments should we consume, based\n // on the nargs option?\n function eatNargs(i, key, args, argAfterEqualSign) {\n let ii;\n let toEat = checkAllAliases(key, flags.nargs);\n // NaN has a special meaning for the array type, indicating that one or\n // more values are expected.\n toEat = typeof toEat !== 'number' || isNaN(toEat) ? 1 : toEat;\n if (toEat === 0) {\n if (!isUndefined(argAfterEqualSign)) {\n error = Error(__('Argument unexpected for: %s', key));\n }\n setArg(key, defaultValue(key));\n return i;\n }\n let available = isUndefined(argAfterEqualSign) ? 0 : 1;\n if (configuration['nargs-eats-options']) {\n // classic behavior, yargs eats positional and dash arguments.\n if (args.length - (i + 1) + available < toEat) {\n error = Error(__('Not enough arguments following: %s', key));\n }\n available = toEat;\n }\n else {\n // nargs will not consume flag arguments, e.g., -abc, --foo,\n // and terminates when one is observed.\n for (ii = i + 1; ii < args.length; ii++) {\n if (!args[ii].match(/^-[^0-9]/) || args[ii].match(negative) || isUnknownOptionAsArg(args[ii]))\n available++;\n else\n break;\n }\n if (available < toEat)\n error = Error(__('Not enough arguments following: %s', key));\n }\n let consumed = Math.min(available, toEat);\n if (!isUndefined(argAfterEqualSign) && consumed > 0) {\n setArg(key, argAfterEqualSign);\n consumed--;\n }\n for (ii = i + 1; ii < (consumed + i + 1); ii++) {\n setArg(key, args[ii]);\n }\n return (i + consumed);\n }\n // if an option is an array, eat all non-hyphenated arguments\n // following it... YUM!\n // e.g., --foo apple banana cat becomes [\"apple\", \"banana\", \"cat\"]\n function eatArray(i, key, args, argAfterEqualSign) {\n let argsToSet = [];\n let next = argAfterEqualSign || args[i + 1];\n // If both array and nargs are configured, enforce the nargs count:\n const nargsCount = checkAllAliases(key, flags.nargs);\n if (checkAllAliases(key, flags.bools) && !(/^(true|false)$/.test(next))) {\n argsToSet.push(true);\n }\n else if (isUndefined(next) ||\n (isUndefined(argAfterEqualSign) && /^-/.test(next) && !negative.test(next) && !isUnknownOptionAsArg(next))) {\n // for keys without value ==> argsToSet remains an empty []\n // set user default value, if available\n if (defaults[key] !== undefined) {\n const defVal = defaults[key];\n argsToSet = Array.isArray(defVal) ? defVal : [defVal];\n }\n }\n else {\n // value in --option=value is eaten as is\n if (!isUndefined(argAfterEqualSign)) {\n argsToSet.push(processValue(key, argAfterEqualSign, true));\n }\n for (let ii = i + 1; ii < args.length; ii++) {\n if ((!configuration['greedy-arrays'] && argsToSet.length > 0) ||\n (nargsCount && typeof nargsCount === 'number' && argsToSet.length >= nargsCount))\n break;\n next = args[ii];\n if (/^-/.test(next) && !negative.test(next) && !isUnknownOptionAsArg(next))\n break;\n i = ii;\n argsToSet.push(processValue(key, next, inputIsString));\n }\n }\n // If both array and nargs are configured, create an error if less than\n // nargs positionals were found. NaN has special meaning, indicating\n // that at least one value is required (more are okay).\n if (typeof nargsCount === 'number' && ((nargsCount && argsToSet.length < nargsCount) ||\n (isNaN(nargsCount) && argsToSet.length === 0))) {\n error = Error(__('Not enough arguments following: %s', key));\n }\n setArg(key, argsToSet);\n return i;\n }\n function setArg(key, val, shouldStripQuotes = inputIsString) {\n if (/-/.test(key) && configuration['camel-case-expansion']) {\n const alias = key.split('.').map(function (prop) {\n return camelCase(prop);\n }).join('.');\n addNewAlias(key, alias);\n }\n const value = processValue(key, val, shouldStripQuotes);\n const splitKey = key.split('.');\n setKey(argv, splitKey, value);\n // handle populating aliases of the full key\n if (flags.aliases[key]) {\n flags.aliases[key].forEach(function (x) {\n const keyProperties = x.split('.');\n setKey(argv, keyProperties, value);\n });\n }\n // handle populating aliases of the first element of the dot-notation key\n if (splitKey.length > 1 && configuration['dot-notation']) {\n ;\n (flags.aliases[splitKey[0]] || []).forEach(function (x) {\n let keyProperties = x.split('.');\n // expand alias with nested objects in key\n const a = [].concat(splitKey);\n a.shift(); // nuke the old key.\n keyProperties = keyProperties.concat(a);\n // populate alias only if is not already an alias of the full key\n // (already populated above)\n if (!(flags.aliases[key] || []).includes(keyProperties.join('.'))) {\n setKey(argv, keyProperties, value);\n }\n });\n }\n // Set normalize getter and setter when key is in 'normalize' but isn't an array\n if (checkAllAliases(key, flags.normalize) && !checkAllAliases(key, flags.arrays)) {\n const keys = [key].concat(flags.aliases[key] || []);\n keys.forEach(function (key) {\n Object.defineProperty(argvReturn, key, {\n enumerable: true,\n get() {\n return val;\n },\n set(value) {\n val = typeof value === 'string' ? mixin.normalize(value) : value;\n }\n });\n });\n }\n }\n function addNewAlias(key, alias) {\n if (!(flags.aliases[key] && flags.aliases[key].length)) {\n flags.aliases[key] = [alias];\n newAliases[alias] = true;\n }\n if (!(flags.aliases[alias] && flags.aliases[alias].length)) {\n addNewAlias(alias, key);\n }\n }\n function processValue(key, val, shouldStripQuotes) {\n // strings may be quoted, clean this up as we assign values.\n if (shouldStripQuotes) {\n val = stripQuotes(val);\n }\n // handle parsing boolean arguments --foo=true --bar false.\n if (checkAllAliases(key, flags.bools) || checkAllAliases(key, flags.counts)) {\n if (typeof val === 'string')\n val = val === 'true';\n }\n let value = Array.isArray(val)\n ? val.map(function (v) { return maybeCoerceNumber(key, v); })\n : maybeCoerceNumber(key, val);\n // increment a count given as arg (either no value or value parsed as boolean)\n if (checkAllAliases(key, flags.counts) && (isUndefined(value) || typeof value === 'boolean')) {\n value = increment();\n }\n // Set normalized value when key is in 'normalize' and in 'arrays'\n if (checkAllAliases(key, flags.normalize) && checkAllAliases(key, flags.arrays)) {\n if (Array.isArray(val))\n value = val.map((val) => { return mixin.normalize(val); });\n else\n value = mixin.normalize(val);\n }\n return value;\n }\n function maybeCoerceNumber(key, value) {\n if (!configuration['parse-positional-numbers'] && key === '_')\n return value;\n if (!checkAllAliases(key, flags.strings) && !checkAllAliases(key, flags.bools) && !Array.isArray(value)) {\n const shouldCoerceNumber = looksLikeNumber(value) && configuration['parse-numbers'] && (Number.isSafeInteger(Math.floor(parseFloat(`${value}`))));\n if (shouldCoerceNumber || (!isUndefined(value) && checkAllAliases(key, flags.numbers))) {\n value = Number(value);\n }\n }\n return value;\n }\n // set args from config.json file, this should be\n // applied last so that defaults can be applied.\n function setConfig(argv) {\n const configLookup = Object.create(null);\n // expand defaults/aliases, in-case any happen to reference\n // the config.json file.\n applyDefaultsAndAliases(configLookup, flags.aliases, defaults);\n Object.keys(flags.configs).forEach(function (configKey) {\n const configPath = argv[configKey] || configLookup[configKey];\n if (configPath) {\n try {\n let config = null;\n const resolvedConfigPath = mixin.resolve(mixin.cwd(), configPath);\n const resolveConfig = flags.configs[configKey];\n if (typeof resolveConfig === 'function') {\n try {\n config = resolveConfig(resolvedConfigPath);\n }\n catch (e) {\n config = e;\n }\n if (config instanceof Error) {\n error = config;\n return;\n }\n }\n else {\n config = mixin.require(resolvedConfigPath);\n }\n setConfigObject(config);\n }\n catch (ex) {\n // Deno will receive a PermissionDenied error if an attempt is\n // made to load config without the --allow-read flag:\n if (ex.name === 'PermissionDenied')\n error = ex;\n else if (argv[configKey])\n error = Error(__('Invalid JSON config file: %s', configPath));\n }\n }\n });\n }\n // set args from config object.\n // it recursively checks nested objects.\n function setConfigObject(config, prev) {\n Object.keys(config).forEach(function (key) {\n const value = config[key];\n const fullKey = prev ? prev + '.' + key : key;\n // if the value is an inner object and we have dot-notation\n // enabled, treat inner objects in config the same as\n // heavily nested dot notations (foo.bar.apple).\n if (typeof value === 'object' && value !== null && !Array.isArray(value) && configuration['dot-notation']) {\n // if the value is an object but not an array, check nested object\n setConfigObject(value, fullKey);\n }\n else {\n // setting arguments via CLI takes precedence over\n // values within the config file.\n if (!hasKey(argv, fullKey.split('.')) || (checkAllAliases(fullKey, flags.arrays) && configuration['combine-arrays'])) {\n setArg(fullKey, value);\n }\n }\n });\n }\n // set all config objects passed in opts\n function setConfigObjects() {\n if (typeof configObjects !== 'undefined') {\n configObjects.forEach(function (configObject) {\n setConfigObject(configObject);\n });\n }\n }\n function applyEnvVars(argv, configOnly) {\n if (typeof envPrefix === 'undefined')\n return;\n const prefix = typeof envPrefix === 'string' ? envPrefix : '';\n const env = mixin.env();\n Object.keys(env).forEach(function (envVar) {\n if (prefix === '' || envVar.lastIndexOf(prefix, 0) === 0) {\n // get array of nested keys and convert them to camel case\n const keys = envVar.split('__').map(function (key, i) {\n if (i === 0) {\n key = key.substring(prefix.length);\n }\n return camelCase(key);\n });\n if (((configOnly && flags.configs[keys.join('.')]) || !configOnly) && !hasKey(argv, keys)) {\n setArg(keys.join('.'), env[envVar]);\n }\n }\n });\n }\n function applyCoercions(argv) {\n let coerce;\n const applied = new Set();\n Object.keys(argv).forEach(function (key) {\n if (!applied.has(key)) { // If we haven't already coerced this option via one of its aliases\n coerce = checkAllAliases(key, flags.coercions);\n if (typeof coerce === 'function') {\n try {\n const value = maybeCoerceNumber(key, coerce(argv[key]));\n ([].concat(flags.aliases[key] || [], key)).forEach(ali => {\n applied.add(ali);\n argv[ali] = value;\n });\n }\n catch (err) {\n error = err;\n }\n }\n }\n });\n }\n function setPlaceholderKeys(argv) {\n flags.keys.forEach((key) => {\n // don't set placeholder keys for dot notation options 'foo.bar'.\n if (~key.indexOf('.'))\n return;\n if (typeof argv[key] === 'undefined')\n argv[key] = undefined;\n });\n return argv;\n }\n function applyDefaultsAndAliases(obj, aliases, defaults, canLog = false) {\n Object.keys(defaults).forEach(function (key) {\n if (!hasKey(obj, key.split('.'))) {\n setKey(obj, key.split('.'), defaults[key]);\n if (canLog)\n defaulted[key] = true;\n (aliases[key] || []).forEach(function (x) {\n if (hasKey(obj, x.split('.')))\n return;\n setKey(obj, x.split('.'), defaults[key]);\n });\n }\n });\n }\n function hasKey(obj, keys) {\n let o = obj;\n if (!configuration['dot-notation'])\n keys = [keys.join('.')];\n keys.slice(0, -1).forEach(function (key) {\n o = (o[key] || {});\n });\n const key = keys[keys.length - 1];\n if (typeof o !== 'object')\n return false;\n else\n return key in o;\n }\n function setKey(obj, keys, value) {\n let o = obj;\n if (!configuration['dot-notation'])\n keys = [keys.join('.')];\n keys.slice(0, -1).forEach(function (key) {\n // TODO(bcoe): in the next major version of yargs, switch to\n // Object.create(null) for dot notation:\n key = sanitizeKey(key);\n if (typeof o === 'object' && o[key] === undefined) {\n o[key] = {};\n }\n if (typeof o[key] !== 'object' || Array.isArray(o[key])) {\n // ensure that o[key] is an array, and that the last item is an empty object.\n if (Array.isArray(o[key])) {\n o[key].push({});\n }\n else {\n o[key] = [o[key], {}];\n }\n // we want to update the empty object at the end of the o[key] array, so set o to that object\n o = o[key][o[key].length - 1];\n }\n else {\n o = o[key];\n }\n });\n // TODO(bcoe): in the next major version of yargs, switch to\n // Object.create(null) for dot notation:\n const key = sanitizeKey(keys[keys.length - 1]);\n const isTypeArray = checkAllAliases(keys.join('.'), flags.arrays);\n const isValueArray = Array.isArray(value);\n let duplicate = configuration['duplicate-arguments-array'];\n // nargs has higher priority than duplicate\n if (!duplicate && checkAllAliases(key, flags.nargs)) {\n duplicate = true;\n if ((!isUndefined(o[key]) && flags.nargs[key] === 1) || (Array.isArray(o[key]) && o[key].length === flags.nargs[key])) {\n o[key] = undefined;\n }\n }\n if (value === increment()) {\n o[key] = increment(o[key]);\n }\n else if (Array.isArray(o[key])) {\n if (duplicate && isTypeArray && isValueArray) {\n o[key] = configuration['flatten-duplicate-arrays'] ? o[key].concat(value) : (Array.isArray(o[key][0]) ? o[key] : [o[key]]).concat([value]);\n }\n else if (!duplicate && Boolean(isTypeArray) === Boolean(isValueArray)) {\n o[key] = value;\n }\n else {\n o[key] = o[key].concat([value]);\n }\n }\n else if (o[key] === undefined && isTypeArray) {\n o[key] = isValueArray ? value : [value];\n }\n else if (duplicate && !(o[key] === undefined ||\n checkAllAliases(key, flags.counts) ||\n checkAllAliases(key, flags.bools))) {\n o[key] = [o[key], value];\n }\n else {\n o[key] = value;\n }\n }\n // extend the aliases list with inferred aliases.\n function extendAliases(...args) {\n args.forEach(function (obj) {\n Object.keys(obj || {}).forEach(function (key) {\n // short-circuit if we've already added a key\n // to the aliases array, for example it might\n // exist in both 'opts.default' and 'opts.key'.\n if (flags.aliases[key])\n return;\n flags.aliases[key] = [].concat(aliases[key] || []);\n // For \"--option-name\", also set argv.optionName\n flags.aliases[key].concat(key).forEach(function (x) {\n if (/-/.test(x) && configuration['camel-case-expansion']) {\n const c = camelCase(x);\n if (c !== key && flags.aliases[key].indexOf(c) === -1) {\n flags.aliases[key].push(c);\n newAliases[c] = true;\n }\n }\n });\n // For \"--optionName\", also set argv['option-name']\n flags.aliases[key].concat(key).forEach(function (x) {\n if (x.length > 1 && /[A-Z]/.test(x) && configuration['camel-case-expansion']) {\n const c = decamelize(x, '-');\n if (c !== key && flags.aliases[key].indexOf(c) === -1) {\n flags.aliases[key].push(c);\n newAliases[c] = true;\n }\n }\n });\n flags.aliases[key].forEach(function (x) {\n flags.aliases[x] = [key].concat(flags.aliases[key].filter(function (y) {\n return x !== y;\n }));\n });\n });\n });\n }\n function checkAllAliases(key, flag) {\n const toCheck = [].concat(flags.aliases[key] || [], key);\n const keys = Object.keys(flag);\n const setAlias = toCheck.find(key => keys.includes(key));\n return setAlias ? flag[setAlias] : false;\n }\n function hasAnyFlag(key) {\n const flagsKeys = Object.keys(flags);\n const toCheck = [].concat(flagsKeys.map(k => flags[k]));\n return toCheck.some(function (flag) {\n return Array.isArray(flag) ? flag.includes(key) : flag[key];\n });\n }\n function hasFlagsMatching(arg, ...patterns) {\n const toCheck = [].concat(...patterns);\n return toCheck.some(function (pattern) {\n const match = arg.match(pattern);\n return match && hasAnyFlag(match[1]);\n });\n }\n // based on a simplified version of the short flag group parsing logic\n function hasAllShortFlags(arg) {\n // if this is a negative number, or doesn't start with a single hyphen, it's not a short flag group\n if (arg.match(negative) || !arg.match(/^-[^-]+/)) {\n return false;\n }\n let hasAllFlags = true;\n let next;\n const letters = arg.slice(1).split('');\n for (let j = 0; j < letters.length; j++) {\n next = arg.slice(j + 2);\n if (!hasAnyFlag(letters[j])) {\n hasAllFlags = false;\n break;\n }\n if ((letters[j + 1] && letters[j + 1] === '=') ||\n next === '-' ||\n (/[A-Za-z]/.test(letters[j]) && /^-?\\d+(\\.\\d*)?(e-?\\d+)?$/.test(next)) ||\n (letters[j + 1] && letters[j + 1].match(/\\W/))) {\n break;\n }\n }\n return hasAllFlags;\n }\n function isUnknownOptionAsArg(arg) {\n return configuration['unknown-options-as-args'] && isUnknownOption(arg);\n }\n function isUnknownOption(arg) {\n arg = arg.replace(/^-{3,}/, '--');\n // ignore negative numbers\n if (arg.match(negative)) {\n return false;\n }\n // if this is a short option group and all of them are configured, it isn't unknown\n if (hasAllShortFlags(arg)) {\n return false;\n }\n // e.g. '--count=2'\n const flagWithEquals = /^-+([^=]+?)=[\\s\\S]*$/;\n // e.g. '-a' or '--arg'\n const normalFlag = /^-+([^=]+?)$/;\n // e.g. '-a-'\n const flagEndingInHyphen = /^-+([^=]+?)-$/;\n // e.g. '-abc123'\n const flagEndingInDigits = /^-+([^=]+?\\d+)$/;\n // e.g. '-a/usr/local'\n const flagEndingInNonWordCharacters = /^-+([^=]+?)\\W+.*$/;\n // check the different types of flag styles, including negatedBoolean, a pattern defined near the start of the parse method\n return !hasFlagsMatching(arg, flagWithEquals, negatedBoolean, normalFlag, flagEndingInHyphen, flagEndingInDigits, flagEndingInNonWordCharacters);\n }\n // make a best effort to pick a default value\n // for an option based on name and type.\n function defaultValue(key) {\n if (!checkAllAliases(key, flags.bools) &&\n !checkAllAliases(key, flags.counts) &&\n `${key}` in defaults) {\n return defaults[key];\n }\n else {\n return defaultForType(guessType(key));\n }\n }\n // return a default value, given the type of a flag.,\n function defaultForType(type) {\n const def = {\n [DefaultValuesForTypeKey.BOOLEAN]: true,\n [DefaultValuesForTypeKey.STRING]: '',\n [DefaultValuesForTypeKey.NUMBER]: undefined,\n [DefaultValuesForTypeKey.ARRAY]: []\n };\n return def[type];\n }\n // given a flag, enforce a default type.\n function guessType(key) {\n let type = DefaultValuesForTypeKey.BOOLEAN;\n if (checkAllAliases(key, flags.strings))\n type = DefaultValuesForTypeKey.STRING;\n else if (checkAllAliases(key, flags.numbers))\n type = DefaultValuesForTypeKey.NUMBER;\n else if (checkAllAliases(key, flags.bools))\n type = DefaultValuesForTypeKey.BOOLEAN;\n else if (checkAllAliases(key, flags.arrays))\n type = DefaultValuesForTypeKey.ARRAY;\n return type;\n }\n function isUndefined(num) {\n return num === undefined;\n }\n // check user configuration settings for inconsistencies\n function checkConfiguration() {\n // count keys should not be set as array/narg\n Object.keys(flags.counts).find(key => {\n if (checkAllAliases(key, flags.arrays)) {\n error = Error(__('Invalid configuration: %s, opts.count excludes opts.array.', key));\n return true;\n }\n else if (checkAllAliases(key, flags.nargs)) {\n error = Error(__('Invalid configuration: %s, opts.count excludes opts.narg.', key));\n return true;\n }\n return false;\n });\n }\n return {\n aliases: Object.assign({}, flags.aliases),\n argv: Object.assign(argvReturn, argv),\n configuration: configuration,\n defaulted: Object.assign({}, defaulted),\n error: error,\n newAliases: Object.assign({}, newAliases)\n };\n }\n}\n// if any aliases reference each other, we should\n// merge them together.\nfunction combineAliases(aliases) {\n const aliasArrays = [];\n const combined = Object.create(null);\n let change = true;\n // turn alias lookup hash {key: ['alias1', 'alias2']} into\n // a simple array ['key', 'alias1', 'alias2']\n Object.keys(aliases).forEach(function (key) {\n aliasArrays.push([].concat(aliases[key], key));\n });\n // combine arrays until zero changes are\n // made in an iteration.\n while (change) {\n change = false;\n for (let i = 0; i < aliasArrays.length; i++) {\n for (let ii = i + 1; ii < aliasArrays.length; ii++) {\n const intersect = aliasArrays[i].filter(function (v) {\n return aliasArrays[ii].indexOf(v) !== -1;\n });\n if (intersect.length) {\n aliasArrays[i] = aliasArrays[i].concat(aliasArrays[ii]);\n aliasArrays.splice(ii, 1);\n change = true;\n break;\n }\n }\n }\n }\n // map arrays back to the hash-lookup (de-dupe while\n // we're at it).\n aliasArrays.forEach(function (aliasArray) {\n aliasArray = aliasArray.filter(function (v, i, self) {\n return self.indexOf(v) === i;\n });\n const lastAlias = aliasArray.pop();\n if (lastAlias !== undefined && typeof lastAlias === 'string') {\n combined[lastAlias] = aliasArray;\n }\n });\n return combined;\n}\n// this function should only be called when a count is given as an arg\n// it is NOT called to set a default value\n// thus we can start the count at 1 instead of 0\nfunction increment(orig) {\n return orig !== undefined ? orig + 1 : 1;\n}\n// TODO(bcoe): in the next major version of yargs, switch to\n// Object.create(null) for dot notation:\nfunction sanitizeKey(key) {\n if (key === '__proto__')\n return '___proto___';\n return key;\n}\nfunction stripQuotes(val) {\n return (typeof val === 'string' &&\n (val[0] === \"'\" || val[0] === '\"') &&\n val[val.length - 1] === val[0])\n ? val.substring(1, val.length - 1)\n : val;\n}\n","(function () {\n require('./lib/main').config(\n Object.assign(\n {},\n require('./lib/env-options'),\n require('./lib/cli-options')(process.argv)\n )\n )\n})()\n","// ../config.js accepts options via environment variables\nconst options = {}\n\nif (process.env.DOTENV_CONFIG_ENCODING != null) {\n options.encoding = process.env.DOTENV_CONFIG_ENCODING\n}\n\nif (process.env.DOTENV_CONFIG_PATH != null) {\n options.path = process.env.DOTENV_CONFIG_PATH\n}\n\nif (process.env.DOTENV_CONFIG_DEBUG != null) {\n options.debug = process.env.DOTENV_CONFIG_DEBUG\n}\n\nif (process.env.DOTENV_CONFIG_OVERRIDE != null) {\n options.override = process.env.DOTENV_CONFIG_OVERRIDE\n}\n\nmodule.exports = options\n","const re = /^dotenv_config_(encoding|path|debug|override)=(.+)$/\n\nmodule.exports = function optionMatcher (args) {\n return args.reduce(function (acc, cur) {\n const matches = cur.match(re)\n if (matches) {\n acc[matches[1]] = matches[2]\n }\n return acc\n }, {})\n}\n","/**\n * @fileoverview Main entrypoint for libraries using yargs-parser in Node.js\n * CJS and ESM environments.\n *\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\nimport { format } from 'util';\nimport { normalize, resolve } from 'path';\nimport { camelCase, decamelize, looksLikeNumber } from './string-utils.js';\nimport { YargsParser } from './yargs-parser.js';\nimport { readFileSync } from 'fs';\n// See https://github.com/yargs/yargs-parser#supported-nodejs-versions for our\n// version support policy. The YARGS_MIN_NODE_VERSION is used for testing only.\nconst minNodeVersion = (process && process.env && process.env.YARGS_MIN_NODE_VERSION)\n ? Number(process.env.YARGS_MIN_NODE_VERSION)\n : 12;\nif (process && process.version) {\n const major = Number(process.version.match(/v([^.]+)/)[1]);\n if (major < minNodeVersion) {\n throw Error(`yargs parser supports a minimum Node.js version of ${minNodeVersion}. Read our version support policy: https://github.com/yargs/yargs-parser#supported-nodejs-versions`);\n }\n}\n// Creates a yargs-parser instance using Node.js standard libraries:\nconst env = process ? process.env : {};\nconst parser = new YargsParser({\n cwd: process.cwd,\n env: () => {\n return env;\n },\n format,\n normalize,\n resolve,\n // TODO: figure out a way to combine ESM and CJS coverage, such that\n // we can exercise all the lines below:\n require: (path) => {\n if (typeof require !== 'undefined') {\n return require(path);\n }\n else if (path.match(/\\.json$/)) {\n // Addresses: https://github.com/yargs/yargs/issues/2040\n return JSON.parse(readFileSync(path, 'utf8'));\n }\n else {\n throw Error('only .json config files are supported in ESM');\n }\n }\n});\nconst yargsParser = function Parser(args, opts) {\n const result = parser.parse(args.slice(), opts);\n return result.argv;\n};\nyargsParser.detailed = function (args, opts) {\n return parser.parse(args.slice(), opts);\n};\nyargsParser.camelCase = camelCase;\nyargsParser.decamelize = decamelize;\nyargsParser.looksLikeNumber = looksLikeNumber;\nexport default yargsParser;\n","/**\n * @license\n * Copyright (c) 2016, Contributors\n * SPDX-License-Identifier: ISC\n */\n// take an un-split argv string and tokenize it.\nexport function tokenizeArgString(argString) {\n if (Array.isArray(argString)) {\n return argString.map(e => typeof e !== 'string' ? e + '' : e);\n }\n argString = argString.trim();\n let i = 0;\n let prevC = null;\n let c = null;\n let opening = null;\n const args = [];\n for (let ii = 0; ii < argString.length; ii++) {\n prevC = c;\n c = argString.charAt(ii);\n // split on spaces unless we're in quotes.\n if (c === ' ' && !opening) {\n if (!(prevC === ' ')) {\n i++;\n }\n continue;\n }\n // don't split the string if we're in matching\n // opening or closing single and double quotes.\n if (c === opening) {\n opening = null;\n }\n else if ((c === \"'\" || c === '\"') && !opening) {\n opening = c;\n }\n if (!args[i])\n args[i] = '';\n args[i] += c;\n }\n return args;\n}\n","import { readFileSync, statSync, writeFile } from 'fs';\nimport { format } from 'util';\nimport { resolve } from 'path';\nexport default {\n fs: {\n readFileSync,\n writeFile\n },\n format,\n resolve,\n exists: (file) => {\n try {\n return statSync(file).isFile();\n }\n catch (err) {\n return false;\n }\n }\n};\n","let shim;\nclass Y18N {\n constructor(opts) {\n // configurable options.\n opts = opts || {};\n this.directory = opts.directory || './locales';\n this.updateFiles = typeof opts.updateFiles === 'boolean' ? opts.updateFiles : true;\n this.locale = opts.locale || 'en';\n this.fallbackToLanguage = typeof opts.fallbackToLanguage === 'boolean' ? opts.fallbackToLanguage : true;\n // internal stuff.\n this.cache = Object.create(null);\n this.writeQueue = [];\n }\n __(...args) {\n if (typeof arguments[0] !== 'string') {\n return this._taggedLiteral(arguments[0], ...arguments);\n }\n const str = args.shift();\n let cb = function () { }; // start with noop.\n if (typeof args[args.length - 1] === 'function')\n cb = args.pop();\n cb = cb || function () { }; // noop.\n if (!this.cache[this.locale])\n this._readLocaleFile();\n // we've observed a new string, update the language file.\n if (!this.cache[this.locale][str] && this.updateFiles) {\n this.cache[this.locale][str] = str;\n // include the current directory and locale,\n // since these values could change before the\n // write is performed.\n this._enqueueWrite({\n directory: this.directory,\n locale: this.locale,\n cb\n });\n }\n else {\n cb();\n }\n return shim.format.apply(shim.format, [this.cache[this.locale][str] || str].concat(args));\n }\n __n() {\n const args = Array.prototype.slice.call(arguments);\n const singular = args.shift();\n const plural = args.shift();\n const quantity = args.shift();\n let cb = function () { }; // start with noop.\n if (typeof args[args.length - 1] === 'function')\n cb = args.pop();\n if (!this.cache[this.locale])\n this._readLocaleFile();\n let str = quantity === 1 ? singular : plural;\n if (this.cache[this.locale][singular]) {\n const entry = this.cache[this.locale][singular];\n str = entry[quantity === 1 ? 'one' : 'other'];\n }\n // we've observed a new string, update the language file.\n if (!this.cache[this.locale][singular] && this.updateFiles) {\n this.cache[this.locale][singular] = {\n one: singular,\n other: plural\n };\n // include the current directory and locale,\n // since these values could change before the\n // write is performed.\n this._enqueueWrite({\n directory: this.directory,\n locale: this.locale,\n cb\n });\n }\n else {\n cb();\n }\n // if a %d placeholder is provided, add quantity\n // to the arguments expanded by util.format.\n const values = [str];\n if (~str.indexOf('%d'))\n values.push(quantity);\n return shim.format.apply(shim.format, values.concat(args));\n }\n setLocale(locale) {\n this.locale = locale;\n }\n getLocale() {\n return this.locale;\n }\n updateLocale(obj) {\n if (!this.cache[this.locale])\n this._readLocaleFile();\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n this.cache[this.locale][key] = obj[key];\n }\n }\n }\n _taggedLiteral(parts, ...args) {\n let str = '';\n parts.forEach(function (part, i) {\n const arg = args[i + 1];\n str += part;\n if (typeof arg !== 'undefined') {\n str += '%s';\n }\n });\n return this.__.apply(this, [str].concat([].slice.call(args, 1)));\n }\n _enqueueWrite(work) {\n this.writeQueue.push(work);\n if (this.writeQueue.length === 1)\n this._processWriteQueue();\n }\n _processWriteQueue() {\n const _this = this;\n const work = this.writeQueue[0];\n // destructure the enqueued work.\n const directory = work.directory;\n const locale = work.locale;\n const cb = work.cb;\n const languageFile = this._resolveLocaleFile(directory, locale);\n const serializedLocale = JSON.stringify(this.cache[locale], null, 2);\n shim.fs.writeFile(languageFile, serializedLocale, 'utf-8', function (err) {\n _this.writeQueue.shift();\n if (_this.writeQueue.length > 0)\n _this._processWriteQueue();\n cb(err);\n });\n }\n _readLocaleFile() {\n let localeLookup = {};\n const languageFile = this._resolveLocaleFile(this.directory, this.locale);\n try {\n // When using a bundler such as webpack, readFileSync may not be defined:\n if (shim.fs.readFileSync) {\n localeLookup = JSON.parse(shim.fs.readFileSync(languageFile, 'utf-8'));\n }\n }\n catch (err) {\n if (err instanceof SyntaxError) {\n err.message = 'syntax error in ' + languageFile;\n }\n if (err.code === 'ENOENT')\n localeLookup = {};\n else\n throw err;\n }\n this.cache[this.locale] = localeLookup;\n }\n _resolveLocaleFile(directory, locale) {\n let file = shim.resolve(directory, './', locale + '.json');\n if (this.fallbackToLanguage && !this._fileExistsSync(file) && ~locale.lastIndexOf('_')) {\n // attempt fallback to language only\n const languageFile = shim.resolve(directory, './', locale.split('_')[0] + '.json');\n if (this._fileExistsSync(languageFile))\n file = languageFile;\n }\n return file;\n }\n _fileExistsSync(file) {\n return shim.exists(file);\n }\n}\nexport function y18n(opts, _shim) {\n shim = _shim;\n const y18n = new Y18N(opts);\n return {\n __: y18n.__.bind(y18n),\n __n: y18n.__n.bind(y18n),\n setLocale: y18n.setLocale.bind(y18n),\n getLocale: y18n.getLocale.bind(y18n),\n updateLocale: y18n.updateLocale.bind(y18n),\n locale: y18n.locale\n };\n}\n","'use strict'\n\nimport { notStrictEqual, strictEqual } from 'assert'\nimport cliui from 'cliui'\nimport escalade from 'escalade/sync'\nimport { inspect } from 'util'\nimport { readFileSync } from 'fs'\nimport { fileURLToPath } from 'url';\nimport Parser from 'yargs-parser'\nimport { basename, dirname, extname, relative, resolve } from 'path'\nimport { getProcessArgvBin } from '../../build/lib/utils/process-argv.js'\nimport { YError } from '../../build/lib/yerror.js'\nimport y18n from 'y18n'\n\nconst REQUIRE_ERROR = 'require is not supported by ESM'\nconst REQUIRE_DIRECTORY_ERROR = 'loading a directory of commands is not supported yet for ESM'\n\nlet __dirname;\ntry {\n __dirname = fileURLToPath(import.meta.url);\n} catch (e) {\n __dirname = process.cwd();\n}\nconst mainFilename = __dirname.split('node_modules')[0]\n\nexport default {\n assert: {\n notStrictEqual,\n strictEqual\n },\n cliui,\n findUp: escalade,\n getEnv: (key) => {\n return process.env[key]\n },\n inspect,\n getCallerFile: () => {\n throw new YError(REQUIRE_DIRECTORY_ERROR)\n },\n getProcessArgvBin,\n mainFilename: mainFilename || process.cwd(),\n Parser,\n path: {\n basename,\n dirname,\n extname,\n relative,\n resolve\n },\n process: {\n argv: () => process.argv,\n cwd: process.cwd,\n emitWarning: (warning, type) => process.emitWarning(warning, type),\n execPath: () => process.execPath,\n exit: process.exit,\n nextTick: process.nextTick,\n stdColumns: typeof process.stdout.columns !== 'undefined' ? process.stdout.columns : null\n },\n readFileSync,\n require: () => {\n throw new YError(REQUIRE_ERROR)\n },\n requireDirectory: () => {\n throw new YError(REQUIRE_DIRECTORY_ERROR)\n },\n stringWidth: (str) => {\n return [...str].length\n },\n y18n: y18n({\n directory: resolve(__dirname, '../../../locales'),\n updateFiles: false\n })\n}\n","import shim from './build/lib/platform-shims/node.js'\nimport { y18n as _y18n } from './build/lib/index.js'\n\nconst y18n = (opts) => {\n return _y18n(opts, shim)\n}\n\nexport default y18n\n","import { homedir } from 'os';\nimport { mkdir, writeFile } from 'fs/promises';\nimport path from 'path';\nimport { cosmiconfig } from 'cosmiconfig';\n\n/*\nPrecedence of CLI configuration (from highest to lowest):\nper cli execution: pass config file (--config /path/to/.hotgluerc) option with your command\nper project: load from current project's package.json or a config folder in any folder in the path (i.e. /path/to/project/.hotgluerc)\nper user: ~/.hotglue/config.yaml\nany built-in or default config settings\n*/\n\nconst staticOptions = {\n hg: {\n appName: 'hotglue',\n clientApiBaseUri: process.env.HOTGLUE_CLIENT_API_BASE_URI || 'https://api.hotglue.com',\n defaultConfigFileName: 'config.yaml',\n },\n};\n\nconst defaultOptions = {\n // absolute path or a relative path using dot notation only\n // downloadFolder: path.resolve(process.cwd(), 'downloads'),\n};\n\nconst getProfileConfigFilePath = () =>\n path.resolve(homedir(), `.${staticOptions.hg.appName}`, staticOptions.hg.defaultConfigFileName);\n\nconst writeConfigFile = async (file, data) => {\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(file, data);\n};\n\nconst getProfileConfig = async () => {\n const { appName } = staticOptions.hg;\n\n try {\n const result = await cosmiconfig(appName).load(getProfileConfigFilePath());\n return result || {};\n // return { ...result.config };\n } catch (err) {\n // no profile config found; app not configured\n return {};\n }\n};\n\nconst getProjectConfig = async () => {\n const { appName } = staticOptions.hg;\n\n const cosmic = cosmiconfig(appName, {\n searchPlaces: [\n // primary\n `${appName}.yaml`,\n `.${appName}.yaml`,\n `.${appName}rc.yaml`,\n `.${appName}rc.yml`,\n // secondary\n `.${appName}rc`,\n `.${appName}rc.json`,\n `.${appName}rc.js`,\n // `package.json`,\n ],\n // loaders: [],\n // packageProp: `${appName}`,\n // stopDir: '',\n // cache: true,\n // transform: (res) => res\n });\n\n try {\n const result = await cosmic.search();\n return result || {};\n // return (result && result.config) || {};\n } catch (err) {\n console.log(err); // use debug()\n throw new Error(`Malformed configuration file: ${err.message}`);\n }\n};\n\nconst getCombinedConfig = async () => {\n const profileConfig = await getProfileConfig();\n\n const projectConfig = await getProjectConfig();\n\n const result = { ...defaultOptions, ...profileConfig.config, ...projectConfig.config };\n // todo: post-process config (i.e. template replacement)\n return result;\n};\n\nexport {\n getProfileConfigFilePath,\n getProfileConfig,\n getProjectConfig,\n getCombinedConfig,\n writeConfigFile,\n staticOptions,\n};\n","import { inspect } from 'util';\nimport chalk from 'chalk';\n\nconst defaultTheme = {\n primary: (str) => chalk.whiteBright(str),\n secondary: (str) => chalk.white(str),\n info: (str) => chalk.green(str),\n warn: (str) => chalk.yellow(str),\n error: (str) => chalk.redBright(str),\n success: (str) => chalk.greenBright(str),\n};\n\nlet _currentTheme = defaultTheme;\nlet _defaultColor = 'primary';\n\nfunction setTheme(theme) {\n _currentTheme = { ...defaultTheme, ...theme };\n return funcs;\n}\n\nfunction print(str) {\n process.stdout.write(str);\n}\n\n// maybe rename themed to color()\nconst themed = (content, color = _defaultColor) => {\n if (!content) return '';\n if (typeof content === 'string')\n return _currentTheme[color] ? _currentTheme[color](content) : _currentTheme[_defaultColor](content);\n\n // apply limits on returned string from inspected object\n const objString = inspect(content, { colors: true });\n return _currentTheme[color] ? _currentTheme[color](objString) : objString;\n};\n\n// console.log passthrough with default coloring\nfunction cl(...contentArgs) {\n console.log(...contentArgs);\n return funcs;\n}\n\nfunction pr(content, color) {\n print(themed(content, color));\n print('\\n');\n return funcs;\n}\n\nfunction pp(content, color) {\n print(themed(content, color));\n return funcs;\n}\n\nfunction setDefault(color = 'primary') {\n if (_currentTheme[color]) _defaultColor = color;\n return funcs;\n}\n\nconst funcs = {\n cl,\n pr,\n pp,\n setTheme,\n setDefault,\n};\n\nconst printJSON = (data) => {\n console.log(JSON.stringify(data));\n};\n\nexport { cl, pr, pp, setTheme, setDefault, themed, printJSON };\n\nexport default funcs;\n","import Debug from 'debug';\n\nconst debug = Debug('hotglue-cli');\n\nfunction extendDebug(namespace) {\n return debug.extend(namespace);\n}\n\nexport default extendDebug;\n","import Debug from '../../helpers/debug.js';\nimport YAML from 'yaml';\nimport Table from 'cli-table';\nimport { getProfileConfigFilePath, getProfileConfig, writeConfigFile } from '../../helpers/config.js';\nimport { pp, pr, printJSON } from '../../helpers/print.js';\n\nconst debug = Debug('commands:config:set');\n\nconst command = 'set <setting> <value>';\n\nconst desc = 'Set configuration key-value pairs';\n\nconst builder = async (yargs) => {\n debug('builder', command, yargs);\n yargs\n .option('setting', {\n describe: 'The configuration parameter you wish to set',\n type: 'string',\n })\n .option('value', {\n describe: \"The configuration parameter's value\",\n type: 'string',\n });\n\n return yargs;\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { json, setting, value } = argv;\n const allowedSettings = ['apikey'];\n\n if (!allowedSettings.includes(setting)) {\n json\n ? printJSON({ status: 'error', error: 'Invalid settings parameter' })\n : console.error('Invalid settings parameter');\n // throw new Error('Invalid settings parameter');\n return;\n }\n\n try {\n const profileConfig = await getProfileConfig();\n if (profileConfig && profileConfig.config) !json && pp('Updating profile config file...');\n else !json && pp('Creating profile config file...');\n\n const data =\n profileConfig && profileConfig.config ? { ...profileConfig.config, [setting]: value } : { [setting]: value };\n const yamlData = YAML.stringify(data);\n\n const filePath = profileConfig && profileConfig.filepath ? profileConfig.filepath : getProfileConfigFilePath();\n\n await writeConfigFile(filePath, yamlData);\n json ? printJSON({ status: 'success' }) : pp('Done').pr();\n } catch (err) {\n json ? printJSON({ status: 'error', error: err }) : console.log(err);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as set from './set.js';\n\nexport const config = [set];\n","import path from 'path';\nimport Debug from '../helpers/debug.js';\nimport YAML from 'yaml';\nimport Table from 'cli-table';\nimport { getProfileConfig, getProjectConfig } from '../helpers/config.js';\nimport { cl, pp, pr, themed } from '../helpers/print.js';\nimport { config } from './config/index.js';\n\nconst debug = Debug('commands:config');\n\nconst command = 'config [action]';\n\nconst desc = 'Configure your hotglue CLI';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n return yargs.command(config);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n\n const { action } = argv;\n\n // implement using yarg default command\n if (!action) {\n try {\n const profileConfig = await getProfileConfig();\n if (!profileConfig.config || Object.keys(profileConfig.config).length === 0) {\n pr('No profile configuration found. Run config set to configure the hotglue CLI.');\n }\n\n const table = new Table({ head: ['Setting', 'Value', 'Config File', 'Type'] });\n if (profileConfig.config)\n Object.entries(profileConfig.config).forEach(([k, v]) => table.push([k, v, profileConfig.filepath, `Profile`]));\n\n const projectConfig = await getProjectConfig();\n if (projectConfig.config)\n Object.entries(projectConfig.config).forEach(([k, v]) =>\n table.push([k, v, path.relative(process.cwd(), projectConfig.filepath), 'Project'])\n );\n\n if (table.length > 0) {\n // pr('CURRENT CONTEXT SETTINGS');\n console.log(table.toString());\n // console.log(YAML.stringify(fileConfig.config));\n }\n\n // pr('The configuration file is empty. Run config set to configure the hotglue CLI.');\n } catch (err) {\n // log elsewhere\n console.log(err);\n throw err;\n }\n }\n};\n\nexport { command, desc, builder, handler };\n","// get description for key: .option(...((key) => [key, descriptions[key]])('apikey'))\nexport default {\n commands: {},\n options: {\n env: {\n config: {\n describe: 'Environment Id',\n type: 'string',\n alias: ['e'],\n },\n demandText:\n 'The \"env\" parameter (Environment Id) is required. Either pass here using `-e [env_id]` or add an env property in your rc file.',\n },\n apikey: {\n config: {\n describe: 'API key',\n type: 'string',\n alias: ['k'],\n },\n demandText: 'API key is required. Either pass here using -k [key] or configure your profile using config set.',\n },\n dataFilePath: {\n config: {\n describe: 'Singer data file path',\n type: 'string',\n alias: ['data', 'data-file-path'],\n default: 'data.singer',\n },\n },\n json: {\n config: {\n describe: 'Makes the output format to be JSON',\n type: 'boolean',\n default: false,\n },\n demandText: '',\n },\n tenant: {\n config: {\n describe: 'Tenant (user) ID',\n type: 'string',\n alias: ['u'],\n },\n demandText: 'TenantId is required. You can pass it using -u [tenantId].',\n },\n flow: {\n config: {\n describe: 'Flow ID',\n type: 'string',\n alias: ['f'],\n },\n demandText: 'FlowId is required. You can pass it using -f [flow_id].',\n },\n tap: {\n config: {\n describe: 'Tap name',\n type: 'string',\n alias: ['t'],\n },\n demandText: 'Tap name is required. You can pass it using -t <tap_name>.',\n },\n connector: {\n config: {\n describe: 'Connector ID',\n type: 'string',\n alias: ['c'],\n },\n demandText: 'Connector ID is required. You can pass it using -c <connector>.',\n },\n all: {\n config: {\n describe: 'Run command for all taps/connectors',\n type: 'boolean',\n default: false,\n alias: ['a'],\n },\n demandText: 'This \"all\" flag is required. You can pass it using -a or --all.',\n },\n jobroot: {\n config: {\n describe: 'Job Root (S3 prefix)',\n type: 'string',\n alias: ['j'],\n },\n demandText: 'JobRoot key is required. You can pass it using -j [job_root].',\n },\n count: {\n config: {\n describe: 'Max returned records',\n type: 'number',\n },\n },\n downloadTo: {\n config: {\n describe: 'Download folder',\n default: '.',\n type: 'string',\n alias: ['d'],\n },\n demandText:\n 'A destination folder is required. You can pass it using -d [folder] and can be either relative from cwd or absolute.',\n },\n sourceFolder: {\n config: {\n describe: 'Source folder',\n type: 'string',\n default: '.',\n alias: ['s'],\n },\n demandText: '',\n },\n configFilePath: {\n config: {\n describe: 'Config file path',\n type: 'string',\n default: './config.json',\n alias: ['p'],\n },\n demandText: 'Local path of the config (with .json extension). Example: \"/home/hotglue/config.json\"',\n },\n overwrite: {\n config: {\n describe: 'Overwrite existing',\n type: 'boolean',\n default: false,\n alias: ['o'],\n },\n demandText: '',\n },\n cleanup: {\n config: {\n describe: 'Clean up target prior to action',\n type: 'boolean',\n default: false,\n alias: ['c'],\n },\n demandText: '',\n },\n includeConfigs: {\n config: {\n describe: 'Include configs in the download folder (source-config.json, target-config.json, tenant-config.json)',\n type: 'boolean',\n default: false,\n },\n demandText: '',\n },\n },\n};\n","import Debug from './debug.js';\nimport descriptions from './descriptions.js';\nimport { getCombinedConfig } from './config.js';\n\nconst debug = Debug('base');\n\nconst baseBuilder = (yargs) => {\n return yargs;\n};\n\nconst baseApiBuilder = async (yargs) => {\n debug('builder');\n const config = await getCombinedConfig();\n\n return baseBuilder(yargs)\n .option('apikey', descriptions.options['apikey'].config)\n .option('env', descriptions.options['env'].config)\n .option('json', descriptions.options['json'].config)\n .config(config)\n .demandOption(['env'], descriptions.options['env'].demandText)\n .demandOption(['apikey'], descriptions.options['apikey'].demandText)\n .strictCommands();\n};\n\nexport { baseBuilder, baseApiBuilder };\n","import path from 'path';\nimport { readdir } from 'fs/promises';\nimport Debug from './debug.js';\nimport micromatch from 'micromatch';\nimport { cl, pr, pp } from './print.js';\nimport descriptions from './descriptions.js';\n\nconst debug = Debug('utils.js');\n\nconst makeSetFromArray = (arr) => {\n const result = new Set();\n arr.forEach((item) => result.add(item));\n return result;\n};\n\n/**\n * Get list of files in given folder and its subfolders that match against a pattern.\n * ex: await getSubFolderFiles(process.cwd(), ['!d/sync-output', '!d/etl-output', '!d/snapshots']);\n * @param {string} dir starting directory\n * @param {Array<string>} pattern The match patterns. ex: '!my_folder', 'd/uploads', '!f/exclude.txt'\n * @returns {Array<string>} All file paths that meet the pattern criteria\n */\nconst getSubFolderFiles = async (dir, pattern) => {\n const matches = {\n excludedDirs: new Set(),\n excludedFiles: new Set(),\n includedDirs: new Set(),\n includedFiles: new Set(),\n };\n\n if (pattern && pattern.length > 0) {\n const excluded = [];\n const included = [];\n pattern.forEach((item) => {\n if (item.startsWith('!')) excluded.push(item.substring(1));\n else included.push(item);\n });\n included.forEach((item) => {\n if (item.startsWith('d/')) matches.includedDirs.add(item.substring(2));\n else if (item.startsWith('f/')) matches.includedFiles.add(item.substring(2));\n else {\n matches.includedDirs.add(item);\n matches.includedFiles.add(item);\n }\n });\n excluded.forEach((item) => {\n if (item.startsWith('d/')) matches.excludedDirs.add(item.substring(2));\n else if (item.startsWith('f/')) matches.excludedFiles.add(item.substring(2));\n else {\n matches.excludedDirs.add(item);\n matches.excludedFiles.add(item);\n }\n });\n }\n\n return _getSubFolderFiles(dir, matches);\n};\n\nconst _getSubFolderFiles = async (dir, matches) => {\n const files = await readdir(dir, { withFileTypes: true });\n\n const result = [];\n for (const file of files) {\n if (!file.isSymbolicLink()) {\n if (file.isFile() && (!matches.excludedFiles.has(file.name) || matches.includedFiles.has(file.name)))\n result.push(path.resolve(dir, file.name));\n else if (file.isDirectory() && (!matches.excludedDirs.has(file.name) || matches.includedFiles.has(file.name))) {\n const sub = await _getSubFolderFiles(path.resolve(dir, file.name), matches);\n if (sub.length > 0) result.push(...sub);\n }\n }\n }\n\n return result;\n};\n\nconst _getFolderFiles = async (dir, options, result = []) => {\n const { includeSymLinks, recursive, filter } = options;\n const { matcher } = filter;\n\n const fullPath = path.resolve(dir);\n const files = await readdir(fullPath, { withFileTypes: true });\n\n for (const file of files) {\n const filePath = path.resolve(fullPath, file.name);\n\n if (file.isSymbolicLink() && !includeSymLinks) {\n continue;\n }\n\n if (matcher && !matcher(filePath)) {\n debug('skip', filePath);\n continue;\n }\n\n if (file.isFile()) {\n result.push(path.resolve(fullPath, file.name));\n } else if (file.isDirectory() && recursive) {\n await _getFolderFiles(path.resolve(fullPath, file.name), options, result);\n }\n }\n\n return result;\n};\n\nconst getFolderFiles = async (dir, options) => {\n const _options = { includeSymLinks: false, recursive: false, filter: {}, ...options };\n const { pattern } = _options.filter;\n\n if (pattern) {\n _options.filter.matcher = micromatch.matcher(pattern, { dot: true });\n }\n\n return _getFolderFiles(dir, _options);\n};\n\nconst filterFiles = (files, filter) => {\n debug('filter-in', files);\n const { pattern } = { ...filter };\n\n let result = files;\n if (pattern) result = micromatch(result, pattern);\n debug('filter-out', result);\n\n return result;\n};\n\n/**\n * todo: implement my variant:\n * - explicit f/ and d/ prefixes\n * -\n * @param {*} pattern\n * @returns a matcher instance\n */\nfunction createMatcher(pattern) {\n const matches = {\n excludedDirs: new Set(),\n excludedFiles: new Set(),\n includedDirs: new Set(),\n includedFiles: new Set(),\n };\n const excluded = [];\n const included = [];\n pattern.forEach((item) => {\n if (item.startsWith('!')) excluded.push(item.substring(1));\n else included.push(item);\n });\n included.forEach((item) => {\n if (item.startsWith('d/')) matches.includedDirs.add(item.substring(2));\n else if (item.startsWith('f/')) matches.includedFiles.add(item.substring(2));\n else {\n matches.includedDirs.add(item);\n matches.includedFiles.add(item);\n }\n });\n excluded.forEach((item) => {\n if (item.startsWith('d/')) matches.excludedDirs.add(item.substring(2));\n else if (item.startsWith('f/')) matches.excludedFiles.add(item.substring(2));\n else {\n matches.excludedDirs.add(item);\n matches.excludedFiles.add(item);\n }\n });\n\n const match = (path) => {};\n\n return { match };\n}\n\nfunction userSetOption(option) {\n function wasArgPassed(option) {\n return process.argv.indexOf(option) > -1;\n }\n\n if (wasArgPassed(`--${option}`)) {\n return true;\n }\n\n // Handle aliases for same option\n const aliases = descriptions.options[option]?.config?.alias || [];\n for (let i in aliases) {\n if (wasArgPassed(`-${aliases[i]}`)) return true;\n }\n\n return false;\n}\n\nconst streamToString = (stream) => {\n const chunks = [];\n return new Promise((resolve, reject) => {\n stream.on('error', reject);\n stream.on('data', (c) => chunks.push(Buffer.from(c)));\n stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n });\n};\n\nconst buildChunks = (array, chunkSize = 10) => {\n const resultArray = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n const chunk = array.slice(i, i + chunkSize);\n resultArray.push(chunk);\n }\n return resultArray;\n};\n\nconst isNullOrEmptyArray = (value) => {\n if (value == null || (Array.isArray(value) && value.length === 0)) {\n // The variable is either null, undefined, or an empty array\n return true;\n }\n return false;\n}\n\nexport { makeSetFromArray, getFolderFiles, filterFiles, userSetOption, streamToString, buildChunks, isNullOrEmptyArray };\n","import axios from 'axios';\n\nconst resetAvailableEntities = async ({debug, baseUri, env, apiKey}) => {\n const urlObj = new URL(`${baseUri}/${env}/resetAvailableEntities`);\n\n const { data } = await axios.delete(\n urlObj,\n { headers: { 'x-api-key': apiKey, 'Content-type': 'application/json' } }\n );\n debug({ data });\n};\n\nconst genCredentialsOnClientApi = async ({ debug, baseUri, task, env, apikey, ...params }) => {\n const urlObj = new URL(`${baseUri}/credentials/${task}/${env}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n urlObj.searchParams.set(key, value);\n });\n }\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n const { accessKeyId, secretAccessKey, sessionToken } = data;\n return { accessKeyId, secretAccessKey, sessionToken };\n};\n\nconst getEnvConfig = async ({ debug, baseUri, env, apikey, requestSecret = false }) => {\n const urlObj = new URL(`${baseUri}/${env}/config`);\n if(requestSecret) {\n urlObj.searchParams.set('secret', 'true');\n }\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n return data;\n};\n\nconst getTenants = async ({ debug, baseUri, env, apikey }) => {\n const uri = `${baseUri}/tenants/${env}`;\n debug('requesting:', uri);\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n debug('response-data', data);\n return data;\n};\n\nconst getSupportedSources = async ({ debug, baseUri, env, flow, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/supportedSources`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getSupportedTargets = async ({ debug, baseUri, env, flow, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/supportedTargets`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getSupportedConnectors = async ({ debug, baseUri, env, flow, apikey }) => {\n const urlObj = new URL(`${baseUri}/v2/${env}/${flow}/supportedConnectors`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getLinkedSources = async ({ debug, baseUri, env, flow, tenant, apikey, config }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${tenant}/linkedSources`);\n if (config) {\n urlObj.searchParams.set('config', 'true');\n }\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getLinkedConnectors = async ({ debug, baseUri, env, flow, tenant, apikey, config }) => {\n const urlObj = new URL(`${baseUri}/v2/${env}/${flow}/${tenant}/linkedConnectors`);\n if (config) {\n urlObj.searchParams.set('config', 'true');\n }\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst patchLinkedSourceConfig = async ({ debug, baseUri, env, flow, tenant, apikey, connectorId, config }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${tenant}/linkedSources`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n const body = { tap: connectorId, config };\n debug && debug('uri:', uri);\n const { data } = await axios.patch(uri, body, { headers });\n return data;\n};\n\nconst patchLinkedConnectorConfig = async ({ debug, baseUri, env, flow, tenant, apikey, connectorId, config }) => {\n const urlObj = new URL(`${baseUri}/v2/${env}/${flow}/${tenant}/linkedConnectors`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n const body = { connector_id: connectorId, config };\n debug && debug('uri:', uri);\n const { data } = await axios.patch(uri, body, { headers });\n return data;\n};\n\nconst getSupportedFlows = async ({ debug, baseUri, env, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/flows/supported`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst getSupportedFlow = async ({ debug, baseUri, env, flow, apikey }) => {\n const urlObj = new URL(`${baseUri}/${env}/flows/${flow}/supported`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst deleteTenantSchedules = async ({ debug, baseUri, env, apikey, tenant }) => {\n const urlObj = new URL(`${baseUri}/tenant/${env}/${tenant}?schedules_only=true`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.delete(uri, { headers });\n return data;\n};\n\nconst runJob = async ({ debug, baseUri, env, apikey, tenant, flow, ...args }) => {\n const { isV2Flow = false, ...body } = args;\n const urlObj = new URL(`${baseUri}/${isV2Flow ? 'v2/' : ''}${env}/${flow}/${tenant}/jobs`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.post(uri, body, { headers });\n return data;\n};\n\nconst getEnvJobs = async ({ debug, baseUri, env, apikey, from, to, count = 10000, ...queryParams }) => {\n const headers = { 'x-api-key': apikey };\n const countNum = typeof count === 'string' ? parseInt(count, 10) : count;\n let allJobs = [];\n let totalJobs = 0;\n let page = 1;\n let hasMore = true;\n\n while (hasMore) {\n const urlObj = new URL(`${baseUri}/${env}/jobs`);\n urlObj.searchParams.set('from', from);\n if (to) {\n urlObj.searchParams.set('to', to);\n }\n urlObj.searchParams.set('count', countNum.toString());\n urlObj.searchParams.set('page', page.toString());\n \n // Add any additional query parameters\n if (queryParams) {\n Object.entries(queryParams).forEach(([key, value]) => {\n if (value !== undefined && value !== null && key !== 'count' && key !== 'page') {\n urlObj.searchParams.set(key, value);\n }\n });\n }\n\n urlObj.searchParams.set('include_export_details', 'false');\n urlObj.searchParams.set('skip_cache', 'true');\n \n const uri = urlObj.toString();\n debug && debug(`Fetching page ${page}, uri:`, uri);\n const { data } = await axios.get(uri, { headers });\n debug && debug(`Page ${page} response:`, { jobsCount: data.jobs?.length || 0, total: data.total || 0 });\n \n const pageJobs = data.jobs || [];\n allJobs = allJobs.concat(pageJobs);\n \n // Set total from first page response\n if (page === 1) {\n totalJobs = data.total || 0;\n }\n \n // If we got fewer jobs than the count, we've reached the last page\n if (pageJobs.length < countNum) {\n hasMore = false;\n } else {\n page++;\n }\n }\n\n debug && debug(`Fetched ${allJobs.length} jobs across ${page} page(s)`);\n \n return {\n jobs: allJobs,\n total: totalJobs\n };\n};\n\nconst retriggerJob = async ({ debug, baseUri, env, apikey, tenant, flow, ...args }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${tenant}/jobs/retrigger`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n \n const payload = args;\n \n debug && debug('uri:', uri);\n debug && debug('payload:', payload);\n const { data } = await axios.post(uri, payload, { headers });\n return data;\n};\n\nconst getScheduleList = async ({ debug, baseUri, env, apikey, includeDisabled }) => {\n const urlObj = new URL(`${baseUri}/tenants/${env}/schedule`);\n if (includeDisabled !== undefined) {\n urlObj.searchParams.set('includeDisabled', includeDisabled === true ? 'true' : 'false');\n }\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst updateSchedule = async ({ debug, baseUri, env, flow, user_id, apikey, schedule_expression, state, job_type, connector_id, extra_args }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${user_id}/jobs/schedule`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n \n const body = {\n schedule_expression,\n state,\n };\n \n if (job_type) {\n body.job_type = job_type;\n }\n \n if (connector_id) {\n body.connector_id = connector_id;\n }\n \n if (extra_args) {\n Object.assign(body, extra_args);\n }\n \n debug && debug('uri:', uri);\n debug && debug('body:', body);\n const { data } = await axios.put(uri, body, { headers });\n return data;\n};\n\nconst killJob = async ({ debug, baseUri, env, flow, user_id, apikey, job_root, reason, task_arn, skip_webhooks }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${user_id}/jobs/kill`);\n urlObj.searchParams.set('job_root', job_root);\n if (reason) {\n urlObj.searchParams.set('reason', reason);\n }\n if (task_arn) {\n urlObj.searchParams.set('task_arn', task_arn);\n }\n if (skip_webhooks) {\n urlObj.searchParams.set('skip_webhooks', skip_webhooks === true ? 'true' : 'false');\n }\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nconst rollbackJob = async ({ debug, baseUri, env, flow, user_id, apikey, job_root, tap }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${user_id}/jobs/rollback`);\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n \n const body = {\n job_root,\n tap,\n };\n \n debug && debug('uri:', uri);\n debug && debug('body:', body);\n const { data } = await axios.post(uri, body, { headers });\n return data;\n};\n\nconst getJobStatus = async ({ debug, baseUri, env, flow, user_id, apikey, job_root, include_export_details = false }) => {\n const urlObj = new URL(`${baseUri}/${env}/${flow}/${user_id}/jobs/status`);\n urlObj.searchParams.set('job_root', job_root);\n urlObj.searchParams.set('include_export_details', include_export_details ? 'true' : 'false');\n const headers = { 'x-api-key': apikey };\n const uri = urlObj.toString();\n debug && debug('uri:', uri);\n const { data } = await axios.get(uri, { headers });\n return data;\n};\n\nexport {\n genCredentialsOnClientApi,\n getEnvConfig,\n getTenants,\n getSupportedSources,\n getSupportedConnectors,\n getLinkedSources,\n getLinkedConnectors,\n patchLinkedSourceConfig,\n patchLinkedConnectorConfig,\n getSupportedFlows,\n deleteTenantSchedules,\n getSupportedFlow,\n getSupportedTargets,\n resetAvailableEntities,\n runJob,\n retriggerJob,\n getEnvJobs,\n getScheduleList,\n updateSchedule,\n killJob,\n rollbackJob,\n getJobStatus,\n};\n","import Debug from 'debug';\nimport { getSupportedSources, getSupportedConnectors, getSupportedTargets } from '../../helpers/api.js';\n\nconst debug = Debug('commands:env:validators');\n\nexport const validateAvailableSources = async (forkedSources, clientApiBaseUri, apikey, flows, env) => {\n\n if (!Array.isArray(forkedSources)) {\n throw new Error(`availableSources.json must be an array of objects`);\n }\n\n const linkedSources = (await Promise.all(flows.filter(flow => flow.version == 1).map(async (flow) => {\n const linkedSources = await getSupportedSources({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow: flow.id,\n apikey,\n });\n return linkedSources;\n }))).flat();\n\n const newSourceIds = forkedSources.map((source) => {\n if (!source.tap) {\n throw new Error(`Source ${JSON.stringify(source)} has no tap id`);\n }\n return source.tap;\n });\n const duplicateIds = newSourceIds.filter((id, index) => newSourceIds.indexOf(id) !== index);\n if (duplicateIds.length > 0) {\n throw new Error(`Duplicate source id(s) found in availableSources.json: ${duplicateIds.join(', ')}. All sources must have a unique tap id.`);\n }\n\n\n const missingSources = linkedSources.filter((source) => source.isForked && !newSourceIds.includes(source.tap));\n\n if (missingSources.length > 0) {\n throw new Error(`Sources ${missingSources.map((source) => source.label).join(', ')} are linked, but missing from your availableSources.json`);\n }\n}\n\n\nexport const validateAvailableTargets = async (forkedTargets, clientApiBaseUri, apikey, flows, env) => {\n if (!Array.isArray(forkedTargets)) {\n throw new Error(`availableTargets.json must be an array of objects`);\n }\n\n const linkedTargets = (await Promise.all(flows.filter(flow => flow.version == 1).map(async (flow) => {\n const linkedTargets = await getSupportedTargets({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow: flow.id,\n apikey,\n });\n return linkedTargets;\n }))).flat();\n\n const newTargetIds = forkedTargets.map((target) => {\n if (!target.target) {\n throw new Error(`Target ${JSON.stringify(target)} has no target id`);\n }\n return target.target;\n });\n const duplicateIds = newTargetIds.filter((id, index) => newTargetIds.indexOf(id) !== index);\n if (duplicateIds.length > 0) {\n throw new Error(`Duplicate target id(s) found in availableTargets.json: ${duplicateIds.join(', ')}. All targets must have a unique target id.`);\n }\n \n const missingTargets = linkedTargets.filter((target) => target.isForked && !newTargetIds.includes(target.target));\n\n if (missingTargets.length > 0) {\n throw new Error(`Targets ${missingTargets.map((target) => target.label).join(', ')} are linked, but missing from your availableTargets.json`);\n }\n}\n\nexport const validateAvailableConnectors = async (forkedConnectors, clientApiBaseUri, apikey, flows, env) => {\n if (!Array.isArray(forkedConnectors)) {\n throw new Error(`availableConnectors.json must be an array of objects`);\n }\n\n const linkedConnectors = (await Promise.all(flows.filter(flow => flow.version == 2).map(async (flow) => {\n const linkedConnectors = await getSupportedConnectors({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow: flow.id, \n apikey,\n });\n return linkedConnectors;\n }))).flat();\n\n\n const newConnectorIds = forkedConnectors.map((connector) => {\n if (!connector.id) {\n throw new Error(`Connector ${JSON.stringify(connector)} has no id`);\n }\n return connector.id;\n });\n const duplicateIds = newConnectorIds.filter((id, index) => newConnectorIds.indexOf(id) !== index);\n if (duplicateIds.length > 0) {\n throw new Error(`Duplicate connector id(s) found in availableConnectors.json: ${duplicateIds.join(', ')}. All connectors must have a unique id.`);\n }\n\n const missingConnectors = linkedConnectors.filter((connector) => {\n return connector.isForked && !newConnectorIds.includes(connector.id)\n });\n \n \n if (missingConnectors.length > 0) {\n throw new Error(`Connectors ${missingConnectors.map((connector) => connector.id).join(', ')} are linked, but missing from your availableConnectors.json`);\n }\n}\n\n","import path from 'path';\nimport { readFile } from 'fs/promises';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\n// import logUpdate from 'log-update';\nimport descriptions from '../../helpers/descriptions.js';\nimport { getFolderFiles } from '../../helpers/utils.js';\nimport { cl, pr, printJSON, themed } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi, resetAvailableEntities, getSupportedFlows } from '../../helpers/api.js';\nimport { validateAvailableConnectors, validateAvailableSources, validateAvailableTargets } from './validators.js';\n\nconst debug = Debug('commands:env:deploy');\n\nconst command = 'deploy';\n\nconst desc = 'Deploy Environment settings';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('sourceFolder', descriptions.options['sourceFolder'].config)\n .demandOption('sourceFolder', descriptions.options['sourceFolder'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, sourceFolder } = argv;\n const { clientApiBaseUri } = hg;\n\n // eslint-disable-next-line no-undef\n const folderPrefix = path.resolve(process.cwd(), sourceFolder);\n let message;\n let spinner = ora();\n try {\n // 1. build list of deployable files\n message = themed(`Scanning ${themed(folderPrefix, 'info')} for deployable files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const deployableFiles = await getFolderFiles(folderPrefix, {\n filter: {\n pattern:\n '((**/requirements.txt)|(**/availableSources.json)|(**/availableTargets.json)|(**/availableConnectors.json)|(**/customTaps.json))',\n },\n });\n if (deployableFiles.length === 0) {\n if (json) {\n printJSON({ status: 'error', error: 'There are no files to deploy at the specified location!' });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed('There are no files to deploy at the specified location!')}`, 'secondary'));\n }\n return;\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n for (const filePath of deployableFiles) {\n if (!filePath.endsWith('.json')) continue;\n\n try {\n const fileContent = await readFile(filePath, { encoding:'utf-8' });\n JSON.parse(fileContent);\n } catch (error) {\n throw new Error(`File ${filePath} is not a valid JSON: ${String(error)}`);\n }\n }\n\n // Validate files\n const flows = await getSupportedFlows({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n });\n for (const filePath of deployableFiles) {\n if (filePath.endsWith('availableSources.json')) {\n const forkedSources = JSON.parse(await readFile(filePath, { encoding:'utf-8' }));\n await validateAvailableSources(forkedSources, clientApiBaseUri, apikey, flows, env);\n }\n if (filePath.endsWith('availableTargets.json')) {\n const forkedTargets = JSON.parse(await readFile(filePath, { encoding:'utf-8' }));\n await validateAvailableTargets(forkedTargets, clientApiBaseUri, apikey, flows, env);\n }\n if (filePath.endsWith('availableConnectors.json')) {\n const forkedConnectors = JSON.parse(await readFile(filePath, { encoding:'utf-8' })); \n await validateAvailableConnectors(forkedConnectors, clientApiBaseUri, apikey, flows, env);\n }\n }\n\n // 2. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'env-deploy',\n env,\n apikey,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // create authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n // 3. upload new files\n message = themed(`Deploying environment files`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n const rootKey = `config/`;\n const table = new Table({ head: ['File', 'Status'] });\n for await (const file of deployableFiles) {\n const filename = path.basename(file);\n\n message = themed(`Pushing file: ${themed(filename, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const readBuffer = await readFile(file);\n const params = {\n Bucket: env,\n Key: `${rootKey}${filename}`,\n Body: readBuffer,\n };\n const res = await s3.putObject(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-put-res', res);\n table.push([filename, 'Deployed']);\n // handling redis change\n await resetAvailableEntities({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apiKey: apikey\n });\n }\n\n if (json) {\n printJSON({ status: 'success', deployedFiles: deployableFiles });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n !json && spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { mkdir, writeFile, stat } from 'fs/promises';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { filterFiles, streamToString } from '../../helpers/utils.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\n\nconst debug = Debug('commands:env:download');\n\nconst command = 'download';\n\nconst desc = 'Download Environment settings';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n // hotglue environment download -e <env> -o -d downloads\n return yargs.option('downloadTo', descriptions.options['downloadTo'].config);\n // .option('overwrite', descriptions.options['overwrite'].config);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, downloadTo } = argv;\n const { clientApiBaseUri } = hg;\n\n const folderPrefix = path.resolve(process.cwd(), downloadTo);\n let message;\n let spinner = ora();\n try {\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'env-download',\n env,\n apikey,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // create authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n // 2. get list of files from AWS bucket\n message = themed(`Scanning environment ${themed(env, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const params = {\n Bucket: env,\n Prefix: `config/`,\n };\n const { Contents: s3Files } = await s3.listObjectsV2(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-files', s3Files);\n\n // 3. filter only downloadable files\n const filesToDownload = s3Files\n ? filterFiles(\n s3Files.map((item) => item.Key),\n {\n pattern:\n '((*/requirements.txt)|(*/availableSources.json)|(*/availableTargets.json)|(*/availableConnectors.json)|(*/customTaps.json))',\n }\n )\n : [];\n if (!filesToDownload || filesToDownload.length === 0) {\n json\n ? printJSON({ status: 'success', downloadedFiles: [] })\n : spinner.warn(themed(`Warning: ${themed('Nothing to download!')}`, 'secondary'));\n return;\n }\n\n // 4. download environment config files\n message = themed(`Downloading to ${themed(folderPrefix, 'info')}`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n const table = new Table({ head: ['File', 'Status'] });\n for await (const item of filesToDownload) {\n // create destination folder\n const filename = path.basename(item);\n const fullPath = path.resolve(folderPrefix, filename);\n debug('local-file', fullPath);\n\n // ensure destination folder exists\n await mkdir(path.dirname(fullPath), { recursive: true });\n // download s3 object into destination folder\n message = themed(`Downloading file: ${themed(filename, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const fileStream = s3.getObject({ Bucket: env, Key: item }).createReadStream();\n await writeFile(fullPath, await streamToString(fileStream));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n // debug('downloaded', env + item);\n table.push([filename, 'Downloaded']);\n }\n\n if (json) {\n printJSON({ status: 'success', downloadedFiles: filesToDownload });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as deploy from './deploy.js';\nimport * as download from './download.js';\n\nexport const env = [deploy, download];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { env } from './env/index.js';\n\nconst debug = Debug('commands:env');\n\nconst command = 'env <action>';\n\nconst desc = 'Manage environment settings';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(env);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import { streamToString } from './utils.js';\n\nconst isV2Flow = async (s3, envId, tenantId, flowId) => {\n try {\n const fileStream = s3\n .getObject({\n Bucket: envId,\n Key: `${tenantId}/flows/${flowId}/flow.json`,\n })\n .createReadStream();\n\n const fileString = await streamToString(fileStream);\n\n const fileJson = JSON.parse(fileString);\n\n return fileJson.version === 2;\n } catch (error) {\n return false;\n }\n};\n\nconst getEntityLabel = async (s3, envId, tenantId, flowId, isV2 = undefined) => {\n const _isV2Flow = isV2 ?? (await isV2Flow(s3, envId, tenantId, flowId));\n return _isV2Flow ? 'connectors' : 'taps';\n};\n\nexport { isV2Flow, getEntityLabel };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, themed, cl, printJSON } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\nimport { getEntityLabel } from '../../helpers/flow.js';\n\nconst debug = Debug('commands:etl:delete');\n\nconst command = 'delete';\n\nconst desc = 'Delete ETL scripts';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('tap', descriptions.options['tap'].config)\n .demandOption('tap', descriptions.options['tap'].demandText)\n .option('tenant', { ...descriptions.options['tenant'].config })\n .demandOption('tenant', descriptions.options['tenant'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, tap, tenant } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n message = themed(\n `Deleting ETL scripts for Tenant ${themed(tenant, 'info')} Flow ${themed(flow, 'info')} and Tap ${themed(\n tap,\n 'info'\n )} to ${themed(env, 'info')}`\n );\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'etl-deploy',\n env,\n tenant,\n flow,\n tap,\n apikey,\n });\n // created authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. delete ETL folder\n message = themed(`Deleting ETL scripts`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const keyPrefix = `${tenant}/flows/${flow}/${await getEntityLabel(s3, env, tenant, flow)}/${tap}/etl/`;\n // 2.1 Get all objects from folder\n const listObjectsRes = await s3.listObjectsV2({ Bucket: env, Prefix: keyPrefix }).promise();\n debug('s3-list-objects-res', listObjectsRes);\n if (listObjectsRes.Contents?.length > 0) {\n // 2.2 Delete all objects\n const deleteObjectsRes = await s3\n .deleteObjects({\n Bucket: env,\n Delete: {\n Objects: listObjectsRes.Contents.map((object) => {\n return { Key: object.Key };\n }),\n },\n })\n .promise();\n debug('s3-list-objects-res', deleteObjectsRes);\n }\n // 2.3 Delete the folder if needed\n const response = await s3.deleteObject({ Bucket: env, Key: keyPrefix }).promise();\n debug('s3-delete-object-res', response);\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n if (listObjectsRes.Contents?.length > 0) {\n const table = new Table({ head: ['File', 'Status'] });\n listObjectsRes.Contents.filter(({ Key }) => {\n return Key !== keyPrefix;\n }).forEach(({ Key }) => {\n const splittedKey = Key.split('/');\n const filename = splittedKey[splittedKey.length - 1];\n table.push([filename, themed('Deleted', 'info')]);\n });\n if (json) {\n printJSON({\n status: 'success',\n deletedObjects: (listObjectsRes.Contents ?? []).map(({ Key }) => Key),\n });\n } else {\n cl(table.toString());\n }\n } else {\n message = themed(`There was no file or folder to be deleted`);\n json\n ? printJSON({ status: 'success', deletedObjects: [] })\n : spinner.info(themed(`Info: ${message}.`, 'secondary'));\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { readFile } from 'fs/promises';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport { getFolderFiles } from '../../helpers/utils.js';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, cl, themed, printJSON } from '../../helpers/print.js';\nimport {\n genCredentialsOnClientApi,\n getLinkedConnectors,\n getLinkedSources,\n getSupportedConnectors,\n getSupportedFlows,\n getSupportedSources,\n} from '../../helpers/api.js';\nimport { isV2Flow, getEntityLabel } from '../../helpers/flow.js';\n\nconst debug = Debug('commands:etl:deploy');\n\nconst command = 'deploy';\n\nconst desc = 'Deploy ETL scripts';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('tap', descriptions.options['tap'].config)\n .option('all', descriptions.options['all'].config)\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('sourceFolder', descriptions.options['sourceFolder'].config)\n .demandOption('sourceFolder', descriptions.options['sourceFolder'].demandText);\n};\n\nconst validateEtlScriptFiles = (filenames) => {\n\n const ETL_SCRIPT_BLACKLISTED_FILES = [\n \"config.json\",\n \"source-config.json\",\n \"target-config.json\",\n \"catalog.json\",\n \"target-catalog.json\",\n \"state.json\"\n ]\n\n const ETL_SCRIPT_BLACKLISTED_DIRECTORIES = [\n \"sync-output\",\n \"snapshots\",\n \"etl-output\",\n \".venv\"\n ]\n for (const filename of filenames) {\n if (ETL_SCRIPT_BLACKLISTED_FILES.includes(filename)) {\n throw new Error(`File ${filename} is a reserved file name and cannot be used in the ETL script.`);\n }\n const violatedDirectory = ETL_SCRIPT_BLACKLISTED_DIRECTORIES.find((directory) => filename.startsWith(`${directory}/`));\n if (violatedDirectory) {\n throw new Error(`Directory ${violatedDirectory} is a reserved directory name and cannot be used in the ETL script.`);\n }\n }\n}\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, tap, all, tenant, sourceFolder } = argv;\n const { clientApiBaseUri } = hg;\n\n if (!all && !tap) {\n throw new Error(\n `${descriptions.options['tap'].demandText} Or you can pass the --all flag to run this command for all taps/connectors.`\n );\n }\n\n let message;\n let spinner = ora();\n const folderPrefix = path.resolve(process.cwd(), sourceFolder);\n try {\n message = themed(\n `Deploying script for Tenant ${themed(tenant, 'info')} Flow ${themed(flow, 'info')}${\n tap ? ` and Tap ${themed(tap, 'info')}` : ''\n } to ${themed(env, 'info')}`\n );\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n // 1. build list of deployable files\n const deployableFiles = await getFolderFiles(folderPrefix, {\n recursive: true,\n filter: { pattern: '!((**/sync-output)|(**/etl-output)|(**/snapshots))' },\n });\n if (deployableFiles.length === 0) {\n json\n ? printJSON({ status: 'error', error: 'There are no files to deploy at the specified location!' })\n : spinner.fail(\n themed(`Error: ${themed('There are no files to deploy at the specified location!')}.`, 'secondary')\n );\n return;\n }\n\n // Validate files\n validateEtlScriptFiles(deployableFiles.map((file) => path.relative(sourceFolder, file)));\n\n\n // 2. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const params = {\n debug,\n baseUri: clientApiBaseUri,\n task: 'etl-deploy',\n env,\n tenant,\n flow,\n apikey,\n };\n if (tap) params.tap = tap;\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi(params);\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n // create authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n const isV2 = await isV2Flow(s3, env, tenant, flow);\n\n // 3. verify location is valid (consider ListObjects policy + listObjectsV2 + scan folder for key = config.json)\n message = themed(`Validating flow and tap location`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const supportedFlows = await getSupportedFlows({\n debug,\n baseUri: clientApiBaseUri,\n apikey,\n env,\n });\n\n const supportedFlow = supportedFlows.find(({ id }) => id === flow);\n\n let connectors = [];\n\n try {\n if (tenant === 'default' || supportedFlow?.type) {\n const supportedSources = isV2\n ? await getSupportedConnectors({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow,\n apikey,\n })\n : await getSupportedSources({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow,\n apikey,\n });\n connectors = (supportedSources ?? []).filter((ss) => (tap ? ss[isV2 ? 'id' : 'tap'] === tap : true));\n if (tap && connectors.length === 0) throw new Error('Tap is not supported');\n } else {\n const linkedSources = isV2\n ? await getLinkedConnectors({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow,\n tenant,\n apikey,\n })\n : await getLinkedSources({\n debug,\n baseUri: clientApiBaseUri,\n env,\n flow,\n tenant,\n apikey,\n });\n connectors = (linkedSources ?? []).filter((ls) => (tap ? ls[isV2 ? 'id' : 'tap'] === tap : true));\n if (tap && connectors.length === 0) throw new Error('Tap is not linked');\n }\n } catch (err) {\n debug('err', err);\n throw new Error(`Target location doesn't exist. Check your tenant, flow and tap arguments.`);\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const table = new Table({ head: ['File', 'Status'] });\n for (const connector of connectors) {\n const connectorId = connector[isV2 ? 'id' : 'tap'];\n message = themed(`Preparing ${connectorId} deployment target`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const rootKey = `${tenant}/flows/${flow}/${await getEntityLabel(\n null,\n null,\n null,\n null,\n isV2\n )}/${connectorId}/etl/`;\n const { Contents } = await s3.listObjectsV2({ Bucket: env, Prefix: `${rootKey}` }).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('contents', Contents);\n // 4. cleanup old files\n const filesToDelete = Contents.map((item) => ({ Key: item.Key }));\n if (filesToDelete.length > 0) {\n message = themed(`Removing old ${connectorId} ETL files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const delParams = {\n Bucket: env,\n Delete: { Objects: filesToDelete, Quiet: true },\n };\n await s3.deleteObjects(delParams).promise();\n filesToDelete.forEach(({ Key }) =>\n table.push([`${connectorId}/${Key.substring(rootKey.length)}`, themed('Deleted', 'warn')])\n );\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n // 5. upload new files\n // message = themed(`Deploying ETL scripts`);\n // !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n for await (const file of deployableFiles) {\n const relativePath =\n process.platform === 'win32'\n ? path.relative(sourceFolder, file).replace(/\\\\/g, '/')\n : path.relative(sourceFolder, file);\n const key = `${rootKey}${relativePath}`;\n message = themed(`Deploying file: ${themed(`${connectorId}/${relativePath}`, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const readBuffer = await readFile(file);\n const params = {\n Bucket: env,\n Key: key,\n Body: readBuffer,\n };\n const res = await s3.putObject(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-put-res', res);\n table.push([`${connectorId}/${relativePath}`, themed('Deployed', 'info')]);\n }\n }\n\n if (json) {\n printJSON({ status: 'success', deployedFiles: deployableFiles });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { mkdir, writeFile, stat } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport ProgressBar from 'progress';\nimport descriptions from '../../helpers/descriptions.js';\nimport print, { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { filterFiles, streamToString } from '../../helpers/utils.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\nimport { getEntityLabel } from '../../helpers/flow.js';\n\nconst debug = Debug('commands:etl:download');\n\nconst command = 'download';\n\nconst desc = 'Download ETL scripts';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('tap', descriptions.options['tap'].config)\n .demandOption('tap', descriptions.options['tap'].demandText)\n .option('downloadTo', descriptions.options['downloadTo'].config)\n .demandOption('downloadTo', descriptions.options['downloadTo'].demandText)\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('overwrite', descriptions.options['overwrite'].config)\n .demandOption('overwrite', descriptions.options['overwrite'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, tap, tenant, downloadTo, overwrite } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n const folderPrefix = path.resolve(process.cwd(), downloadTo);\n try {\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'etl-download',\n env,\n tenant,\n flow,\n tap,\n apikey,\n });\n // created authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. get list of downloadable files\n message = themed(`Scanning for downloadable files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const keyPrefix = `${tenant}/flows/${flow}/${await getEntityLabel(s3, env, tenant, flow)}/${tap}/etl/`;\n const params = {\n Bucket: env,\n Prefix: keyPrefix,\n };\n const { Contents: s3Files } = await s3.listObjectsV2(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-list-res', s3Files);\n // filter unwanted files from source\n const filesToDownload = s3Files\n ? filterFiles(\n s3Files.map((item) => item.Key),\n { pattern: '!(.ipynb_checkpoints/*)' }\n )\n : [];\n if (!filesToDownload || filesToDownload.length === 0) {\n json\n ? printJSON({ status: 'success', downloadedFiles: [] })\n : spinner.warn(themed(`Warning: ${themed('Nothing to download!')}`, 'secondary'));\n return;\n }\n\n // 3. download files\n message = themed(`Downloading script files to ${themed(folderPrefix, 'info')}`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n const table = new Table({ head: ['File', 'Status'] });\n for await (const file of filesToDownload) {\n const subPath = file.substring(keyPrefix.length); // path.basename(`${env}/${item.Key}`);\n const fullPath = path.resolve(folderPrefix, subPath);\n debug('file', fullPath);\n if (file.endsWith('/')) {\n !existsSync(fullPath) && (await mkdir(fullPath, { recursive: true }));\n continue;\n }\n // skip if exists and overwrite is false\n if (!overwrite) {\n try {\n await stat(fullPath);\n debug('exists, skipping');\n table.push([subPath, 'Skipped']);\n continue;\n } catch (err) {\n if (err.code !== 'ENOENT') cl(err);\n }\n }\n\n message = themed(`Downloading file: ${themed(subPath, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n // ensure destination folder exists\n await mkdir(path.dirname(fullPath), { recursive: true });\n // download s3 object into destination folder\n const fileStream = s3.getObject({ Bucket: env, Key: file }).createReadStream();\n await writeFile(fullPath, await streamToString(fileStream));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n table.push([subPath, 'Downloaded']);\n }\n\n if (json) {\n printJSON({ status: 'success', downloadedFiles: filesToDownload });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = createIterator;\n\nvar _isArrayLike = require('./isArrayLike.js');\n\nvar _isArrayLike2 = _interopRequireDefault(_isArrayLike);\n\nvar _getIterator = require('./getIterator.js');\n\nvar _getIterator2 = _interopRequireDefault(_getIterator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createArrayIterator(coll) {\n var i = -1;\n var len = coll.length;\n return function next() {\n return ++i < len ? { value: coll[i], key: i } : null;\n };\n}\n\nfunction createES2015Iterator(iterator) {\n var i = -1;\n return function next() {\n var item = iterator.next();\n if (item.done) return null;\n i++;\n return { value: item.value, key: i };\n };\n}\n\nfunction createObjectIterator(obj) {\n var okeys = obj ? Object.keys(obj) : [];\n var i = -1;\n var len = okeys.length;\n return function next() {\n var key = okeys[++i];\n if (key === '__proto__') {\n return next();\n }\n return i < len ? { value: obj[key], key } : null;\n };\n}\n\nfunction createIterator(coll) {\n if ((0, _isArrayLike2.default)(coll)) {\n return createArrayIterator(coll);\n }\n\n var iterator = (0, _getIterator2.default)(coll);\n return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll);\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = isArrayLike;\nfunction isArrayLike(value) {\n return value && typeof value.length === 'number' && value.length >= 0 && value.length % 1 === 0;\n}\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (coll) {\n return coll[Symbol.iterator] && coll[Symbol.iterator]();\n};\n\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = asyncify;\n\nvar _initialParams = require('./internal/initialParams.js');\n\nvar _initialParams2 = _interopRequireDefault(_initialParams);\n\nvar _setImmediate = require('./internal/setImmediate.js');\n\nvar _setImmediate2 = _interopRequireDefault(_setImmediate);\n\nvar _wrapAsync = require('./internal/wrapAsync.js');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Take a sync function and make it async, passing its return value to a\n * callback. This is useful for plugging sync functions into a waterfall,\n * series, or other async functions. Any arguments passed to the generated\n * function will be passed to the wrapped function (except for the final\n * callback argument). Errors thrown will be passed to the callback.\n *\n * If the function passed to `asyncify` returns a Promise, that promises's\n * resolved/rejected state will be used to call the callback, rather than simply\n * the synchronous return value.\n *\n * This also means you can asyncify ES2017 `async` functions.\n *\n * @name asyncify\n * @static\n * @memberOf module:Utils\n * @method\n * @alias wrapSync\n * @category Util\n * @param {Function} func - The synchronous function, or Promise-returning\n * function to convert to an {@link AsyncFunction}.\n * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be\n * invoked with `(args..., callback)`.\n * @example\n *\n * // passing a regular synchronous function\n * async.waterfall([\n * async.apply(fs.readFile, filename, \"utf8\"),\n * async.asyncify(JSON.parse),\n * function (data, next) {\n * // data is the result of parsing the text.\n * // If there was a parsing error, it would have been caught.\n * }\n * ], callback);\n *\n * // passing a function returning a promise\n * async.waterfall([\n * async.apply(fs.readFile, filename, \"utf8\"),\n * async.asyncify(function (contents) {\n * return db.model.create(contents);\n * }),\n * function (model, next) {\n * // `model` is the instantiated model object.\n * // If there was an error, this function would be skipped.\n * }\n * ], callback);\n *\n * // es2017 example, though `asyncify` is not needed if your JS environment\n * // supports async functions out of the box\n * var q = async.queue(async.asyncify(async function(file) {\n * var intermediateStep = await processFile(file);\n * return await somePromise(intermediateStep)\n * }));\n *\n * q.push(files);\n */\nfunction asyncify(func) {\n if ((0, _wrapAsync.isAsync)(func)) {\n return function (...args /*, callback*/) {\n const callback = args.pop();\n const promise = func.apply(this, args);\n return handlePromise(promise, callback);\n };\n }\n\n return (0, _initialParams2.default)(function (args, callback) {\n var result;\n try {\n result = func.apply(this, args);\n } catch (e) {\n return callback(e);\n }\n // if result is Promise object\n if (result && typeof result.then === 'function') {\n return handlePromise(result, callback);\n } else {\n callback(null, result);\n }\n });\n}\n\nfunction handlePromise(promise, callback) {\n return promise.then(value => {\n invokeCallback(callback, null, value);\n }, err => {\n invokeCallback(callback, err && (err instanceof Error || err.message) ? err : new Error(err));\n });\n}\n\nfunction invokeCallback(callback, error, value) {\n try {\n callback(error, value);\n } catch (err) {\n (0, _setImmediate2.default)(e => {\n throw e;\n }, err);\n }\n}\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (fn) {\n return function (...args /*, callback*/) {\n var callback = args.pop();\n return fn.call(this, args, callback);\n };\n};\n\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fallback = fallback;\nexports.wrap = wrap;\n/* istanbul ignore file */\n\nvar hasQueueMicrotask = exports.hasQueueMicrotask = typeof queueMicrotask === 'function' && queueMicrotask;\nvar hasSetImmediate = exports.hasSetImmediate = typeof setImmediate === 'function' && setImmediate;\nvar hasNextTick = exports.hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function';\n\nfunction fallback(fn) {\n setTimeout(fn, 0);\n}\n\nfunction wrap(defer) {\n return (fn, ...args) => defer(() => fn(...args));\n}\n\nvar _defer;\n\nif (hasQueueMicrotask) {\n _defer = queueMicrotask;\n} else if (hasSetImmediate) {\n _defer = setImmediate;\n} else if (hasNextTick) {\n _defer = process.nextTick;\n} else {\n _defer = fallback;\n}\n\nexports.default = wrap(_defer);","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.isAsyncIterable = exports.isAsyncGenerator = exports.isAsync = undefined;\n\nvar _asyncify = require('../asyncify.js');\n\nvar _asyncify2 = _interopRequireDefault(_asyncify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction isAsync(fn) {\n return fn[Symbol.toStringTag] === 'AsyncFunction';\n}\n\nfunction isAsyncGenerator(fn) {\n return fn[Symbol.toStringTag] === 'AsyncGenerator';\n}\n\nfunction isAsyncIterable(obj) {\n return typeof obj[Symbol.asyncIterator] === 'function';\n}\n\nfunction wrapAsync(asyncFn) {\n if (typeof asyncFn !== 'function') throw new Error('expected a function');\n return isAsync(asyncFn) ? (0, _asyncify2.default)(asyncFn) : asyncFn;\n}\n\nexports.default = wrapAsync;\nexports.isAsync = isAsync;\nexports.isAsyncGenerator = isAsyncGenerator;\nexports.isAsyncIterable = isAsyncIterable;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// A temporary value used to identify if the loop should be broken.\n// See #1064, #1293\nconst breakLoop = {};\nexports.default = breakLoop;\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _once = require('./once.js');\n\nvar _once2 = _interopRequireDefault(_once);\n\nvar _iterator = require('./iterator.js');\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _onlyOnce = require('./onlyOnce.js');\n\nvar _onlyOnce2 = _interopRequireDefault(_onlyOnce);\n\nvar _wrapAsync = require('./wrapAsync.js');\n\nvar _asyncEachOfLimit = require('./asyncEachOfLimit.js');\n\nvar _asyncEachOfLimit2 = _interopRequireDefault(_asyncEachOfLimit);\n\nvar _breakLoop = require('./breakLoop.js');\n\nvar _breakLoop2 = _interopRequireDefault(_breakLoop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = limit => {\n return (obj, iteratee, callback) => {\n callback = (0, _once2.default)(callback);\n if (limit <= 0) {\n throw new RangeError('concurrency limit cannot be less than 1');\n }\n if (!obj) {\n return callback(null);\n }\n if ((0, _wrapAsync.isAsyncGenerator)(obj)) {\n return (0, _asyncEachOfLimit2.default)(obj, limit, iteratee, callback);\n }\n if ((0, _wrapAsync.isAsyncIterable)(obj)) {\n return (0, _asyncEachOfLimit2.default)(obj[Symbol.asyncIterator](), limit, iteratee, callback);\n }\n var nextElem = (0, _iterator2.default)(obj);\n var done = false;\n var canceled = false;\n var running = 0;\n var looping = false;\n\n function iterateeCallback(err, value) {\n if (canceled) return;\n running -= 1;\n if (err) {\n done = true;\n callback(err);\n } else if (err === false) {\n done = true;\n canceled = true;\n } else if (value === _breakLoop2.default || done && running <= 0) {\n done = true;\n return callback(null);\n } else if (!looping) {\n replenish();\n }\n }\n\n function replenish() {\n looping = true;\n while (running < limit && !done) {\n var elem = nextElem();\n if (elem === null) {\n done = true;\n if (running <= 0) {\n callback(null);\n }\n return;\n }\n running += 1;\n iteratee(elem.value, elem.key, (0, _onlyOnce2.default)(iterateeCallback));\n }\n looping = false;\n }\n\n replenish();\n };\n};\n\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = once;\nfunction once(fn) {\n function wrapper(...args) {\n if (fn === null) return;\n var callFn = fn;\n fn = null;\n callFn.apply(this, args);\n }\n Object.assign(wrapper, fn);\n return wrapper;\n}\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = onlyOnce;\nfunction onlyOnce(fn) {\n return function (...args) {\n if (fn === null) throw new Error(\"Callback was already called.\");\n var callFn = fn;\n fn = null;\n callFn.apply(this, args);\n };\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = asyncEachOfLimit;\n\nvar _breakLoop = require('./breakLoop.js');\n\nvar _breakLoop2 = _interopRequireDefault(_breakLoop);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// for async generators\nfunction asyncEachOfLimit(generator, limit, iteratee, callback) {\n let done = false;\n let canceled = false;\n let awaiting = false;\n let running = 0;\n let idx = 0;\n\n function replenish() {\n //console.log('replenish')\n if (running >= limit || awaiting || done) return;\n //console.log('replenish awaiting')\n awaiting = true;\n generator.next().then(({ value, done: iterDone }) => {\n //console.log('got value', value)\n if (canceled || done) return;\n awaiting = false;\n if (iterDone) {\n done = true;\n if (running <= 0) {\n //console.log('done nextCb')\n callback(null);\n }\n return;\n }\n running++;\n iteratee(value, idx, iterateeCallback);\n idx++;\n replenish();\n }).catch(handleError);\n }\n\n function iterateeCallback(err, result) {\n //console.log('iterateeCallback')\n running -= 1;\n if (canceled) return;\n if (err) return handleError(err);\n\n if (err === false) {\n done = true;\n canceled = true;\n return;\n }\n\n if (result === _breakLoop2.default || done && running <= 0) {\n done = true;\n //console.log('done iterCb')\n return callback(null);\n }\n replenish();\n }\n\n function handleError(err) {\n if (canceled) return;\n awaiting = false;\n done = true;\n callback(err);\n }\n\n replenish();\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = awaitify;\n// conditionally promisify a function.\n// only return a promise if a callback is omitted\nfunction awaitify(asyncFn, arity) {\n if (!arity) arity = asyncFn.length;\n if (!arity) throw new Error('arity is undefined');\n function awaitable(...args) {\n if (typeof args[arity - 1] === 'function') {\n return asyncFn.apply(this, args);\n }\n\n return new Promise((resolve, reject) => {\n args[arity - 1] = (err, ...cbArgs) => {\n if (err) return reject(err);\n resolve(cbArgs.length > 1 ? cbArgs : cbArgs[0]);\n };\n asyncFn.apply(this, args);\n });\n }\n\n return awaitable;\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _eachOfLimit = require('./internal/eachOfLimit.js');\n\nvar _eachOfLimit2 = _interopRequireDefault(_eachOfLimit);\n\nvar _withoutIndex = require('./internal/withoutIndex.js');\n\nvar _withoutIndex2 = _interopRequireDefault(_withoutIndex);\n\nvar _wrapAsync = require('./internal/wrapAsync.js');\n\nvar _wrapAsync2 = _interopRequireDefault(_wrapAsync);\n\nvar _awaitify = require('./internal/awaitify.js');\n\nvar _awaitify2 = _interopRequireDefault(_awaitify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time.\n *\n * @name eachLimit\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachLimit\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {number} limit - The maximum number of async operations at a time.\n * @param {AsyncFunction} iteratee - An async function to apply to each item in\n * `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfLimit`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction eachLimit(coll, limit, iteratee, callback) {\n return (0, _eachOfLimit2.default)(limit)(coll, (0, _withoutIndex2.default)((0, _wrapAsync2.default)(iteratee)), callback);\n}\nexports.default = (0, _awaitify2.default)(eachLimit, 4);\nmodule.exports = exports.default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = _withoutIndex;\nfunction _withoutIndex(iteratee) {\n return (value, index, callback) => iteratee(value, callback);\n}\nmodule.exports = exports.default;","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _eachLimit = require('./eachLimit.js');\n\nvar _eachLimit2 = _interopRequireDefault(_eachLimit);\n\nvar _awaitify = require('./internal/awaitify.js');\n\nvar _awaitify2 = _interopRequireDefault(_awaitify);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time.\n *\n * Note, that unlike [`each`]{@link module:Collections.each}, this function applies iteratee to each item\n * in series and therefore the iteratee functions will complete in order.\n\n * @name eachSeries\n * @static\n * @memberOf module:Collections\n * @method\n * @see [async.each]{@link module:Collections.each}\n * @alias forEachSeries\n * @category Collection\n * @param {Array|Iterable|AsyncIterable|Object} coll - A collection to iterate over.\n * @param {AsyncFunction} iteratee - An async function to apply to each\n * item in `coll`.\n * The array index is not passed to the iteratee.\n * If you need the index, use `eachOfSeries`.\n * Invoked with (item, callback).\n * @param {Function} [callback] - A callback which is called when all\n * `iteratee` functions have finished, or an error occurs. Invoked with (err).\n * @returns {Promise} a promise, if a callback is omitted\n */\nfunction eachSeries(coll, iteratee, callback) {\n return (0, _eachLimit2.default)(coll, 1, iteratee, callback);\n}\nexports.default = (0, _awaitify2.default)(eachSeries, 3);\nmodule.exports = exports.default;","import path from 'path';\nimport { mkdir, writeFile, rename, unlink } from 'fs/promises';\nimport { createWriteStream, existsSync } from 'fs';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { isNullOrEmptyArray, streamToString } from '../../helpers/utils.js';\nimport { genCredentialsOnClientApi, getEnvConfig } from '../../helpers/api.js';\nimport eachSeries from 'async/eachSeries.js';\n\nconst debug = Debug('commands:etl:setup-local-run');\n\n// Helper function to serialize Error objects for JSON output\nconst serializeError = (err) => {\n if (err instanceof Error) {\n const serialized = {\n message: err.message,\n name: err.name,\n stack: err.stack,\n };\n \n // Handle axios errors which have a response property\n if (err.response) {\n serialized.response = {\n status: err.response.status,\n statusText: err.response.statusText,\n data: err.response.data,\n };\n }\n \n // Include any additional enumerable properties\n Object.keys(err).forEach((key) => {\n if (!serialized[key]) {\n serialized[key] = err[key];\n }\n });\n \n return serialized;\n }\n \n // If it's not an Error, return as-is (could be a string or other type)\n return err;\n};\n\nconst command = 'setup-local-run <jobroot>';\n\nconst desc = 'Setup job data to run ETL locally';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('downloadTo', { ...descriptions.options['downloadTo'].config, default: '.' })\n .option('overwrite', { ...descriptions.options['overwrite'].config, default: false })\n .option('include-configs', { ...descriptions.options['includeConfigs'].config, default: false })\n};\n\nconst filterFilesList = (filesList, jobroot, includeConfigs) => {\n const escapedJobRoot = jobroot.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n let allowedFiles = [\n new RegExp(`${escapedJobRoot}/snapshots/.*`),\n new RegExp(`${escapedJobRoot}/etl-output/.*`),\n new RegExp(`${escapedJobRoot}/sync-output/.*`),\n new RegExp(`${escapedJobRoot}/catalog-selected\\\\.json`),\n new RegExp(`${escapedJobRoot}/state\\\\.json`),\n new RegExp(`${escapedJobRoot}/fieldMap\\\\.json`)\n ];\n\n const tenantConfigRegex = new RegExp(`${escapedJobRoot}/snapshots/tenant-config\\\\.json`);\n\n if (includeConfigs) {\n allowedFiles.push(new RegExp(`${escapedJobRoot}/([^\\/]+)-config\\\\.json`));\n }\n\n const filteredFilesList = filesList.filter(({ Key }) => {\n if (!includeConfigs && tenantConfigRegex.test(Key)) {\n return false;\n }\n\n return allowedFiles.some((regex) => regex.test(Key));\n });\n\n return filteredFilesList;\n};\n\n\nconst downloadJobFiles = async (jobroot, filesList, json, localRoot, overwrite) => {\n let spinner = ora();\n let message;\n let skippedFiles = [];\n let downloadedFiles = [];\n\n try {\n const filesCount = filesList.length;\n let filesDownloaded = 0;\n\n // download job files one-by-one\n await eachSeries(\n filesList,\n async (item) => {\n filesDownloaded += 1;\n let fileName = item.Key.substring(jobroot.length + 1);\n fileName = fileName.replace(/^etl-output\\//, 'etl-output-reference/');\n fileName = fileName.replace(/^catalog-selected\\.json$/, 'catalog.json');\n fileName = fileName.replace(/^state\\.json$/, 'source-state.json');\n\n message = themed(`Downloading ${fileName} (${filesDownloaded}/${filesCount})`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const file = path.resolve(localRoot, fileName);\n debug('file', file);\n\n if (existsSync(file) && !overwrite) {\n skippedFiles.push(fileName);\n !json && spinner.warn(themed(`Warning: ${fileName} already exists in the local directory. Skipping download.`, 'secondary'));\n return;\n }\n\n // ensure destination folder exists\n await mkdir(path.dirname(file), { recursive: true });\n // download s3 object into destination folder\n const fileStream = item.S3Instance.getObject({ Bucket: item.BucketName, Key: item.Key }).createReadStream();\n const writableStream = createWriteStream(file, { flags: 'w' });\n let downloadedBytes = 0;\n\n // Monitor the stream's 'data' events for progress\n fileStream.on('data', (chunk) => {\n downloadedBytes += chunk.length;\n const progressPercent = ((downloadedBytes / item.Size) * 100).toFixed(2);\n !json && (spinner.text = themed(`In progress: ${message} ${progressPercent}% complete (${(downloadedBytes / 1024 / 1024).toFixed(2)} MB / ${(item.Size / 1024 / 1024).toFixed(2)} MB)`, 'secondary'));\n });\n\n fileStream.pipe(writableStream);\n\n return new Promise((resolve, reject) => {\n const cleanup = async (err) => {\n // Close/destroy streams\n if (!fileStream.destroyed) {\n fileStream.destroy();\n }\n if (!writableStream.destroyed) {\n writableStream.destroy();\n }\n \n // Delete partially written file on error\n if (err && existsSync(file)) {\n try {\n await unlink(file);\n debug(`Cleaned up partial file: ${file}`);\n } catch (unlinkErr) {\n debug(`Failed to delete partial file ${file}:`, unlinkErr);\n }\n }\n };\n\n writableStream.on('finish', () => {\n downloadedFiles.push(fileName);\n !json && spinner.succeed(`Successfully downloaded to ${fileName}`);\n resolve();\n });\n \n fileStream.on('error', async (err) => {\n !json && spinner.fail(`Download failed: ${err.message}`);\n await cleanup(err);\n reject(err);\n });\n \n writableStream.on('error', async (err) => {\n !json && spinner.fail(`File system error: ${err.message}`);\n await cleanup(err);\n reject(err);\n });\n });\n }\n );\n\n message = themed(`Downloading job files.`);\n !json && spinner.succeed(themed(`Finished: ${message}`, 'secondary'));\n return { downloadedFiles, skippedFiles };\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nconst getJobFilesList = async (env, s3, jobroot, json) => {\n let spinner = ora();\n let message = themed(`Scanning for downloadable files (${env})`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n try {\n const params = {\n Bucket: env,\n Prefix: jobroot,\n };\n\n let allFiles = [];\n let continuationToken = undefined;\n let isTruncated = true;\n let pageCount = 0;\n\n // Fetch all pages of results\n while (isTruncated) {\n pageCount += 1;\n const requestParams = { ...params };\n if (continuationToken) {\n requestParams.ContinuationToken = continuationToken;\n }\n\n const response = await s3.listObjectsV2(requestParams).promise();\n debug(`Page ${pageCount} response:`, {\n keyCount: response.Contents?.length || 0,\n isTruncated: response.IsTruncated,\n hasNextToken: !!response.NextContinuationToken,\n });\n\n if (response.Contents && response.Contents.length > 0) {\n allFiles = allFiles.concat(response.Contents);\n }\n\n isTruncated = response.IsTruncated === true;\n continuationToken = response.NextContinuationToken;\n\n // Update spinner with progress for large jobs\n if (!json && pageCount > 1) {\n spinner.text = themed(`In progress: ${message}... (found ${allFiles.length} files so far)`, 'secondary');\n }\n }\n\n debug('Total files found:', allFiles.length, 'across', pageCount, 'pages');\n\n if (allFiles.length === 0) {\n if (!json) {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed('Nothing to download!')}`, 'secondary'));\n }\n return [];\n }\n\n allFiles.forEach((item) => {\n item.BucketName = env;\n item.S3Instance = s3;\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}. Found ${allFiles.length} file${allFiles.length !== 1 ? 's' : ''}`, 'secondary'));\n\n return allFiles;\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nconst createStateJsonFile = async (jobDetailsJson, localRoot, json) => {\n let spinner = ora();\n let message = themed(`Creating state.json file`);\n\n try {\n if (jobDetailsJson.state != null && Object.keys(jobDetailsJson.state).length > 0) {\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const statePath = path.resolve(localRoot, 'state.json');\n await writeFile(statePath, JSON.stringify(jobDetailsJson.state, null, 2));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n}\n\nconst createEnvJobFile = async (envConfig, jobDetailsJson, localRoot, includeConfigs, json) => {\n let spinner = ora();\n let message = themed(`Creating .env file`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n try {\n let jobEnvVars = {\n TENANT: jobDetailsJson.tenant ?? '',\n FLOW: jobDetailsJson.flow_id ?? '',\n ENV_ID: jobDetailsJson.env_id ?? '',\n JOB_ID: jobDetailsJson.job_id ?? '',\n API_URL: 'https://api.hotglue.com',\n JOB_ROOT: jobDetailsJson.s3_root ?? '',\n ROOT_DIR: localRoot,\n JOB_TYPE: jobDetailsJson.job_type ?? '',\n CONNECTOR_ID: jobDetailsJson.connector_id ?? '',\n TAP: jobDetailsJson.tap ?? '',\n TARGET: jobDetailsJson.target ?? '',\n };\n\n if (includeConfigs) {\n jobEnvVars.API_KEY = envConfig.api_key;\n }\n\n if (!isNullOrEmptyArray(envConfig.custom_env_vars)) {\n for (const customEnvVar of envConfig.custom_env_vars) {\n jobEnvVars[customEnvVar.name] = customEnvVar.value;\n }\n }\n const envJobFilePath = path.resolve(localRoot, '.env');\n await writeFile(envJobFilePath, Object.entries(jobEnvVars).map(([key, value]) => `${key}=${value}`).join('\\n'));\n \n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n let { hg, json, apikey, env, jobroot, downloadTo, overwrite, includeConfigs } = argv;\n const { clientApiBaseUri } = hg;\n\n if (jobroot.endsWith('/')) {\n jobroot = jobroot.slice(0, -1);\n }\n\n let message;\n let spinner = ora();\n const localRoot = downloadTo !== '.' ? path.resolve(process.cwd(), downloadTo) : path.resolve(process.cwd());\n\n try {\n // get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'job-download',\n env,\n apikey,\n jobroot,\n });\n\n // setup authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n message = themed(`Fetching environment config`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const envConfig = await getEnvConfig({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n message = themed(`Fetching job details`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n let jobDetailsJson = null;\n try {\n const fileStream = s3.getObject({ Bucket: env, Key: `${jobroot}/job-details.json` }).createReadStream();\n const jobDetailsString = await streamToString(fileStream);\n jobDetailsJson = JSON.parse(jobDetailsString);\n } catch (err) {\n const errorMessage = 'No job with that jobroot found, job roots can be copied from the job page and are structured as tenant_id/flows/flow_id/jobs/YYYY/MM/DD/HH/MM/job_id';\n if (json) {\n printJSON({ status: 'error', error: errorMessage });\n } else {\n spinner.fail(themed(`Error: ${errorMessage}.`, 'secondary'));\n }\n process.exit(1);\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n message = themed(`Fetching job files (${env})`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n let filesList = await getJobFilesList(env, s3, jobroot, json);\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const customCacheBucket = envConfig.cache_bucket_name;\n let customCacheS3 = null;\n\n if (customCacheBucket) {\n message = themed(`Found custom cache bucket (${customCacheBucket}). Setting up custom cache S3 instance...`);\n\n let customCacheBucketAccessKeyId, customCacheBucketSecretAccessKey;\n try {\n const envConfigWithSecrets = await getEnvConfig({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n requestSecret: true\n });\n\n customCacheBucketAccessKeyId = envConfigWithSecrets.cache_bucket_access_key_id;\n customCacheBucketSecretAccessKey = envConfigWithSecrets.cache_bucket_secret_access_key;\n } catch (err) {\n const errorMessage = 'Insufficient permissions to access custom cache bucket';\n if (json) {\n printJSON({ status: 'error', error: errorMessage });\n } else {\n spinner.fail(themed(`Error: ${errorMessage}.`, 'secondary'));\n }\n process.exit(1);\n }\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n customCacheS3 = new AWS.S3({\n accessKeyId: customCacheBucketAccessKeyId,\n secretAccessKey: customCacheBucketSecretAccessKey,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n let customCacheFilesList = await getJobFilesList(customCacheBucket, customCacheS3, jobroot, json);\n filesList = [...filesList, ...customCacheFilesList];\n }\n\n message = themed(`Filtering job files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const filteredFilesList = filterFilesList(filesList, jobroot, includeConfigs);\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (!json) {\n // print remote files table\n const table = new Table({ head: ['File', 'Size', 'LastModified'] });\n filteredFilesList.forEach((item) => {\n const subPath = item.Key.substring(jobroot.length + 1);\n table.push([subPath, item.Size, item.LastModified.toLocaleString('en-US')]);\n });\n console.log(table.toString());\n }\n\n const { downloadedFiles, skippedFiles } = await downloadJobFiles(jobroot, filteredFilesList, json, localRoot, overwrite);\n\n const sourceName = jobDetailsJson.tap;\n const targetName = jobDetailsJson.target;\n\n const sourceConfigPath = path.resolve(localRoot, `${sourceName}-config.json`);\n const targetConfigPath = path.resolve(localRoot, `${targetName}-config.json`);\n\n // rename {tap}-config.json to source-config.json\n if (existsSync(sourceConfigPath)) {\n const fileNameFrom = sourceConfigPath;\n const fileNameTo = 'source-config.json';\n message = themed(`Renaming ${fileNameFrom} to ${fileNameTo}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n await rename(fileNameFrom, path.resolve(localRoot, fileNameTo));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n\n // rename {target}-config.json to target-config.json\n if (existsSync(targetConfigPath)) {\n const fileNameFrom = targetConfigPath;\n const fileNameTo = 'target-config.json';\n message = themed(`Renaming ${fileNameFrom} to ${fileNameTo}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n await rename(fileNameFrom, path.resolve(localRoot, fileNameTo));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n\n await createStateJsonFile(jobDetailsJson, localRoot, json);\n await createEnvJobFile(envConfig, jobDetailsJson, localRoot, includeConfigs, json);\n\n // print final success message\n if (json) {\n printJSON({ status: 'success', downloadedFiles: downloadedFiles, skippedFiles: skippedFiles });\n } else {\n message = themed(`Setting up local job files.`);\n spinner.succeed(themed(`Finished: ${message}`, 'secondary'));\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: serializeError(err) });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as del from './delete.js';\nimport * as deploy from './deploy.js';\nimport * as download from './download.js';\nimport * as setupLocalRun from './setup-local-run.js';\n\nexport const etl = [del, deploy, download, setupLocalRun];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { etl } from './etl/index.js';\nconst debug = Debug('commands:etl');\n\nconst command = 'etl <action>';\n\nconst desc = 'Manage ETL scripts';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(etl);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import { inspect } from 'util';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\n\nconst debug = Debug('commands:flows:list');\n\nconst command = 'list';\n\nconst desc = 'List flows';\n\nconst isNullOrEmptyArray = (value) => {\n if (value == null || (Array.isArray(value) && value.length === 0)) {\n // The variable is either null, undefined, or an empty array\n return true;\n }\n return false;\n}\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs.option('tenant', { ...descriptions.options['tenant'].config });\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. get data from client-api backend\n message = themed(\n `Retrieving ${!tenant ? `the` : `${themed(tenant, 'info')} tenant's`} flows for environment: ${themed(\n env,\n 'info'\n )}`\n );\n // todo: look into changing when if client-api combined these two endpoints\n const uri = `${clientApiBaseUri}/${env}/flows/${tenant ? `linked?user_id=${tenant}` : `supported`}`;\n debug('requesting:', uri);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('response-data', data);\n\n // exit if there is no data\n if (!data || data.length === 0) {\n json\n ? printJSON([])\n : spinner.warn(themed(`Warning: ${themed('No flows for specified environment and tenant')}.`, 'secondary'));\n return;\n }\n\n if (json) {\n printJSON(data);\n } else {\n // generate results table\n const table = new Table({\n head: ['ID', 'Name', 'Flow Type', 'Taps', 'Targets', 'Connectors'],\n });\n\n data.sort((a, b) => (a.name || '').localeCompare(b.name || ''));\n\n data.forEach((item) =>\n table.push([\n item.id,\n item.name || '',\n (item.version == 2 ? 'Bidirectional' : (item.type ? 'Target Flow' : 'Source Flow')),\n (!isNullOrEmptyArray(item.taps) ? item.taps : (item.sources ? item.sources : [])).join('\\n'),\n (item.targets ? item.targets : []).join('\\n'),\n (item.connectors ? item.connectors : []).join('\\n'),\n ])\n );\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as list from './list.js';\n\nexport const flows = [list];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { flows } from './flows/index.js';\n\nconst debug = Debug('commands:flows');\nconst command = 'flows <action>';\n\nconst desc = 'Manage flows';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(flows);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { mkdir } from 'node:fs/promises';\nimport { createWriteStream } from 'fs';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\nimport eachSeries from 'async/eachSeries.js';\nconst debug = Debug('commands:jobs:download');\n\nconst command = 'download <jobroot>';\n\nconst desc = 'Download Job files';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs.option('downloadTo', descriptions.options['downloadTo'].config);\n // .option('jobroot', descriptions.options['jobroot'].config)\n // .demandOption('jobroot', descriptions.options['jobroot'].demandText)\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, jobroot, downloadTo } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'job-download',\n env,\n apikey,\n jobroot,\n });\n // get data from AWS bucket\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. get list of available files\n message = themed(`Scanning for downloadable files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const params = {\n Bucket: env,\n Prefix: jobroot,\n };\n const { Contents: filesList } = await s3.listObjectsV2(params).promise();\n debug('res', filesList);\n if (!filesList || filesList.length === 0) {\n if (json) {\n printJSON({ status: 'error', error: 'Nothing to download!' });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed('Nothing to download!')}`, 'secondary'));\n }\n return;\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (!json) {\n // print remote files\n const table = new Table({ head: ['File', 'Size', 'LastModified'] });\n filesList.forEach((item) => {\n const subPath = item.Key.substring(jobroot.length + 1);\n // const details = { LastModified: item.LastModified, Size: item.Size };\n table.push([subPath, item.Size, item.LastModified.toLocaleString('en-US')]); // JSON.stringify(details, undefined, 2)]);\n });\n console.log(table.toString());\n }\n\n // 3. download job files one-by-one\n const localRoot = path.resolve(process.cwd(), downloadTo, path.basename(jobroot));\n await eachSeries(\n // Filter out tap/target config files\n filesList.filter(({ Key }) => {\n // Filter out all *-config.json files in the root of \"jobroo\"\n const regex = new RegExp(`${jobroot}/([^\\/]+)-config\\.json`);\n return !regex.test(Key);\n }),\n async (item) => {\n message = themed(`Downloading file: ${themed(item.Key, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const file = path.resolve(localRoot, item.Key.substring(jobroot.length + 1));\n debug('file', file);\n\n // ensure destination folder exists\n await mkdir(path.dirname(file), { recursive: true });\n // download s3 object into destination folder\n const fileStream = s3.getObject({ Bucket: env, Key: item.Key }).createReadStream();\n const writableStream = createWriteStream(file, { flags: 'w' });\n fileStream.pipe(writableStream);\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n );\n\n // print final success message\n if (json) {\n printJSON({ status: 'success', downloadedFiles: filesList.map(({ Key }) => Key) });\n } else {\n message = themed(`Downloading job files.`);\n spinner.succeed(themed(`Finished: ${message}`, 'secondary'));\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1)\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:list');\n debug(...args);\n};\n\nconst command = 'list';\n\nconst desc = 'List jobs';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('count', descriptions.options['count'].config);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, tenant, count } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. get data from client-api backend\n message = themed(\n `Retrieving jobs for environment: ${themed(env, 'info')} flow: ${themed(flow, 'info')} tenant: ${themed(\n tenant,\n 'info'\n )}...`\n );\n const uri = `${clientApiBaseUri}/${env}/${flow}/${tenant}/jobs${count ? `?count=${count}` : ''}`;\n debug('requesting:', uri);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('response-data', data);\n\n // exit if there is no data\n if (!data || data.length === 0) {\n json\n ? printJSON([])\n : spinner.warn(\n themed(`Warning: ${themed('No jobs for the specified environment, flow and tenant')}.`, 'secondary')\n );\n return;\n }\n\n if (json) {\n printJSON(data);\n } else {\n // generate results table\n const table = new Table({ head: ['name', 'details'] });\n data.forEach((item) => table.push([item.job_name, JSON.stringify(item, undefined, 2)]));\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport { readFileSync, existsSync } from 'fs';\nimport Table from 'cli-table';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { runJob, getSupportedFlow } from '../../helpers/api.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:bulkRun');\n debug(...args);\n};\n\nconst command = 'bulk-run';\n\nconst desc = 'Run jobs in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('file', {\n describe: 'Path to JSON file containing array of jobs to run',\n type: 'string',\n alias: ['f'],\n demandOption: true,\n })\n .demandOption('file', 'Path to JSON file is required. Example: -f ./jobs.json');\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, file } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. Read and validate JSON file\n message = themed(`Reading jobs file: ${themed(file, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n if (!existsSync(file)) {\n throw new Error(`File not found: ${file}`);\n }\n\n const fileContent = readFileSync(file, { encoding: 'utf-8' });\n const jobs = JSON.parse(fileContent);\n\n if (!Array.isArray(jobs)) {\n throw new Error('JSON file must contain an array of job objects');\n }\n\n if (jobs.length === 0) {\n json\n ? printJSON({ status: 'error', error: 'No jobs found in file' })\n : spinner.warn(themed(`Warning: ${themed('No jobs found in file')}.`, 'secondary'));\n return;\n }\n\n // Validate each job has required fields\n for (let i = 0; i < jobs.length; i++) {\n const job = jobs[i];\n if (!job.flow) {\n throw new Error(`Job at index ${i} is missing required field: flow`);\n }\n if (!job.tenant) {\n throw new Error(`Job at index ${i} is missing required field: tenant`);\n }\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. Get unique flows and check if they are V2\n message = themed(`Checking flow versions...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const uniqueFlows = [...new Set(jobs.map((job) => job.flow))];\n const flowVersions = {};\n\n await Promise.all(\n uniqueFlows.map(async (flow) => {\n try {\n const supportedFlow = await getSupportedFlow({\n debug,\n baseUri: clientApiBaseUri,\n apikey,\n env,\n flow,\n });\n flowVersions[flow] = supportedFlow?.version === 2;\n } catch (err) {\n debug(`Error checking flow ${flow}:`, err);\n // Default to false if we can't determine\n flowVersions[flow] = false;\n }\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 3. Run all jobs in parallel\n message = themed(`Running ${themed(jobs.length, 'info')} job(s)...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const results = await Promise.all(\n jobs.map(async (job, index) => {\n const { flow, tenant, ...jobArgs } = job;\n const isV2Flow = flowVersions[flow] || false;\n\n try {\n const response = await runJob({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n tenant,\n flow,\n isV2Flow,\n ...jobArgs,\n });\n\n return {\n index,\n flow,\n tenant,\n ok: true,\n response,\n };\n } catch (error) {\n let errorResult;\n \n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n const statusCode = error.response.status;\n const statusText = error.response.statusText;\n const responseData = error.response.data;\n const message = error.message;\n \n debug('Error response:', {\n statusCode,\n statusText,\n message,\n data: responseData\n });\n \n errorResult = {\n statusCode,\n statusText,\n message,\n data: responseData\n };\n } else if (error.request) {\n // The request was made but no response was received\n debug('Error: No response received', error.message);\n errorResult = {\n message: error.message,\n request: error.request\n };\n } else {\n // Something happened in setting up the request that triggered an Error\n debug('Error:', error.message);\n errorResult = {\n message: error.message\n };\n }\n\n return {\n index,\n flow,\n tenant,\n ok: false,\n error: errorResult,\n };\n }\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 4. Print results\n if (json) {\n printJSON(results);\n } else {\n // Generate results table\n const table = new Table({\n head: ['Index', 'Flow', 'Tenant', 'Status', 'Response/Error'],\n });\n\n results.forEach((result) => {\n const status = result.ok ? 'SUCCESS' : 'FAILED';\n const responseOrError = result.ok\n ? JSON.stringify(result.response, undefined, 2)\n : JSON.stringify(result.error, undefined, 2);\n table.push([result.index, result.flow, result.tenant, status, responseOrError]);\n });\n\n console.log(table.toString());\n\n // Print summary\n const successCount = results.filter((r) => r.ok).length;\n const failCount = results.filter((r) => !r.ok).length;\n pr(\n themed(\n `Summary: ${themed(String(successCount), 'info')} succeeded, ${themed(String(failCount), 'error')} failed out of ${themed(\n String(results.length),\n 'info'\n )} total.`,\n 'secondary'\n )\n );\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message, stack: err.stack });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to run jobs'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport { readFileSync, existsSync } from 'fs';\nimport Table from 'cli-table';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { retriggerJob, getJobStatus } from '../../helpers/api.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:bulkRetrigger');\n debug(...args);\n};\n\nconst command = 'bulk-retrigger';\n\nconst desc = 'Retrigger jobs in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('file', {\n describe: 'Path to JSON file containing array of jobRoots to retrigger',\n type: 'string',\n alias: ['f'],\n demandOption: true,\n })\n .demandOption('file', 'Path to JSON file is required. Example: -f ./jobRoots.json');\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, file } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. Read and validate JSON file\n message = themed(`Reading jobRoots file: ${themed(file, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n if (!existsSync(file)) {\n throw new Error(`File not found: ${file}`);\n }\n\n const fileContent = readFileSync(file, { encoding: 'utf-8' });\n const jobRoots = JSON.parse(fileContent);\n\n if (!Array.isArray(jobRoots)) {\n throw new Error('JSON file must contain an array of jobRoot strings');\n }\n\n if (jobRoots.length === 0) {\n json\n ? printJSON({ status: 'error', error: 'No jobRoots found in file' })\n : spinner.warn(themed(`Warning: ${themed('No jobRoots found in file')}.`, 'secondary'));\n return;\n }\n\n // Validate that all items are strings\n for (let i = 0; i < jobRoots.length; i++) {\n if (typeof jobRoots[i] !== 'string') {\n throw new Error(`JobRoot at index ${i} must be a string, got ${typeof jobRoots[i]}`);\n }\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. Group jobRoots by tenant/flow\n // JobRoot format: {tenantId}/flows/{flowId}/...\n const groupedJobs = {};\n \n for (const jobRoot of jobRoots) {\n const parts = jobRoot.split('/');\n if (parts.length < 3 || parts[1] !== 'flows') {\n throw new Error(`Invalid jobRoot format: ${jobRoot}. Expected format: {tenantId}/flows/{flowId}/...`);\n }\n \n const tenantId = parts[0];\n const flowId = parts[2];\n const key = `${tenantId}/flows/${flowId}`;\n \n if (!groupedJobs[key]) {\n groupedJobs[key] = {\n tenant: tenantId,\n flow: flowId,\n jobRoots: [],\n };\n }\n \n groupedJobs[key].jobRoots.push(jobRoot);\n }\n\n const groupKeys = Object.keys(groupedJobs);\n !json && pr(\n themed(`Found ${themed(String(jobRoots.length), 'info')} jobRoot(s) grouped into ${themed(String(groupKeys.length), 'info')} tenant/flow group(s).`, 'secondary')\n );\n\n // 3. Helper function to wait for job completion\n const waitForJobCompletion = async (tenant, flow, jobRoot, maxWaitTime = 3600000) => { // 1 hour default\n const startTime = Date.now();\n const pollInterval = 5000; // Poll every 5 seconds\n \n while (Date.now() - startTime < maxWaitTime) {\n try {\n const jobStatus = await getJobStatus({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n flow,\n user_id: tenant,\n job_root: jobRoot,\n });\n \n const status = jobStatus.status || jobStatus.state;\n \n if (status === 'JOB_COMPLETED' || (typeof status === 'string' && status.endsWith('_FAILED'))) {\n return { completed: true, status };\n }\n \n // Wait before next poll\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n } catch (error) {\n debug(`Error checking job status for ${jobRoot}:`, error);\n // Continue polling even if there's an error\n await new Promise(resolve => setTimeout(resolve, pollInterval));\n }\n }\n \n return { completed: false, status: 'TIMEOUT' };\n };\n\n // 4. Retrigger jobs: parallel across groups, sequential within groups\n message = themed(`Retriggering ${themed(String(jobRoots.length), 'info')} job(s) across ${themed(String(groupKeys.length), 'info')} group(s)...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const allResults = [];\n\n // Process all groups in parallel\n await Promise.all(\n groupKeys.map(async (key) => {\n const group = groupedJobs[key];\n const { tenant, flow, jobRoots: groupJobRoots } = group;\n const groupResults = [];\n\n // Process jobs sequentially within this group\n for (let i = 0; i < groupJobRoots.length; i++) {\n const jobRoot = groupJobRoots[i];\n \n try {\n // Retrigger the job\n const response = await retriggerJob({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n tenant,\n flow,\n job_root: jobRoot,\n });\n\n // Wait for job completion before retriggering the next one\n if (i < groupJobRoots.length - 1) {\n if (!json) {\n spinner.text = themed(`Waiting for job ${i + 1}/${groupJobRoots.length} in group ${tenant}/${flow} to complete...`, 'secondary');\n }\n const waitResult = await waitForJobCompletion(tenant, flow, jobRoot);\n \n if (!waitResult.completed) {\n debug(`Warning: Job ${jobRoot} did not complete within timeout period`);\n }\n }\n\n groupResults.push({\n tenant,\n flow,\n jobRoot,\n ok: true,\n response,\n });\n } catch (error) {\n let errorResult;\n \n if (error.response) {\n const statusCode = error.response.status;\n const statusText = error.response.statusText;\n const responseData = error.response.data;\n const message = error.message;\n \n debug('Error response:', {\n statusCode,\n statusText,\n message,\n data: responseData\n });\n \n errorResult = {\n statusCode,\n statusText,\n message,\n data: responseData\n };\n } else if (error.request) {\n debug('Error: No response received', error.message);\n errorResult = {\n message: error.message,\n request: error.request\n };\n } else {\n debug('Error:', error.message);\n errorResult = {\n message: error.message\n };\n }\n\n groupResults.push({\n tenant,\n flow,\n jobRoot,\n ok: false,\n error: errorResult,\n });\n }\n }\n\n allResults.push(...groupResults);\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 5. Print results\n if (json) {\n printJSON(allResults);\n } else {\n // Generate results table\n const table = new Table({\n head: ['Tenant', 'Flow', 'Job Root', 'Status', 'Response/Error'],\n });\n\n allResults.forEach((result) => {\n const status = result.ok ? 'SUCCESS' : 'FAILED';\n const responseOrError = result.ok\n ? JSON.stringify(result.response, undefined, 2)\n : JSON.stringify(result.error, undefined, 2);\n table.push([\n result.tenant || 'N/A',\n result.flow || 'N/A',\n result.jobRoot || 'N/A',\n status,\n responseOrError,\n ]);\n });\n\n console.log(table.toString());\n\n // Print summary\n const successCount = allResults.filter((r) => r.ok).length;\n const failCount = allResults.filter((r) => !r.ok).length;\n pr(\n themed(\n `Summary: ${themed(String(successCount), 'info')} succeeded, ${themed(String(failCount), 'error')} failed out of ${themed(\n String(allResults.length),\n 'info'\n )} total.`,\n 'secondary'\n )\n );\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message, stack: err.stack });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to retrigger jobs'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { killJob, getEnvJobs } from '../../helpers/api.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:bulkKill');\n debug(...args);\n};\n\nconst command = 'bulk-kill';\n\nconst desc = 'Kill jobs in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant-ids', {\n describe: 'Comma-separated list of tenant IDs to filter by',\n type: 'string',\n alias: ['tenants'],\n })\n .option('flow-ids', {\n describe: 'Comma-separated list of flow IDs to filter by',\n type: 'string',\n alias: ['flows'],\n })\n .option('reason', {\n describe: 'Reason for killing the jobs',\n type: 'string',\n });\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenantIds, flowIds, reason } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // 1. Fetch jobs from API with status filter\n const statusFilter = 'JOB_CREATED,SYNC_STARTED,SYNC_SUCCESS,ETL_STARTED,ETL_SUCCESS,EXPORT_STARTED';\n message = themed(`Fetching running jobs...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Use a date range to get jobs from the last month\n const today = new Date();\n const oneMonthAgo = new Date(today);\n oneMonthAgo.setMonth(today.getMonth() - 1);\n const dateFrom = oneMonthAgo.toISOString().split('T')[0];\n\n const data = await getEnvJobs({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n from: dateFrom,\n status: statusFilter,\n count: 100, // Get max jobs per page\n });\n\n let jobs = data.jobs || [];\n const totalJobs = data.total || 0;\n\n !json && spinner.succeed(\n themed(`Found ${themed(totalJobs, 'info')} job(s) with specified status.`, 'secondary')\n );\n\n // 2. Filter by tenant IDs if provided\n if (tenantIds) {\n const tenantIdList = tenantIds.split(',').map(t => t.trim()).filter(t => t);\n if (tenantIdList.length > 0) {\n jobs = jobs.filter(job => {\n const jobTenant = job.tenant;\n return tenantIdList.includes(jobTenant);\n });\n }\n }\n\n // 3. Filter by flow IDs if provided\n if (flowIds) {\n const flowIdList = flowIds.split(',').map(f => f.trim()).filter(f => f);\n if (flowIdList.length > 0) {\n jobs = jobs.filter(job => {\n const jobFlow = job.flow_id;\n return flowIdList.includes(jobFlow);\n });\n }\n }\n\n if (jobs.length === 0) {\n json\n ? printJSON({ status: 'info', message: 'No jobs found matching the filters' })\n : spinner.warn(\n themed(`Warning: ${themed('No jobs found matching the specified filters')}.`, 'secondary')\n );\n return;\n }\n\n // 4. Kill all jobs in parallel\n message = themed(`Killing ${themed(jobs.length, 'info')} job(s)...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const results = await Promise.all(\n jobs.map(async (job, index) => {\n const jobRoot = job.s3_root;\n const flow = job.flow_id;\n const tenant = job.tenant;\n\n if (!jobRoot) {\n return {\n index,\n flow,\n tenant,\n ok: false,\n error: {\n message: 'Job root (s3_root) not found in job data'\n },\n };\n }\n\n try {\n const response = await killJob({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n flow,\n user_id: tenant,\n job_root: jobRoot,\n reason,\n });\n\n return {\n index,\n flow,\n tenant,\n jobRoot,\n ok: true,\n response,\n };\n } catch (error) {\n let errorResult;\n \n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n const statusCode = error.response.status;\n const statusText = error.response.statusText;\n const responseData = error.response.data;\n const message = error.message;\n \n debug('Error response:', {\n statusCode,\n statusText,\n message,\n data: responseData\n });\n \n errorResult = {\n statusCode,\n statusText,\n message,\n data: responseData\n };\n } else if (error.request) {\n // The request was made but no response was received\n debug('Error: No response received', error.message);\n errorResult = {\n message: error.message,\n request: error.request\n };\n } else {\n // Something happened in setting up the request that triggered an Error\n debug('Error:', error.message);\n errorResult = {\n message: error.message\n };\n }\n\n return {\n index,\n flow,\n tenant,\n jobRoot,\n ok: false,\n error: errorResult,\n };\n }\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 5. Print results\n if (json) {\n printJSON(results);\n } else {\n // Generate results table\n const table = new Table({\n head: ['Index', 'Flow', 'Tenant', 'Job Root', 'Status', 'Response/Error'],\n });\n\n results.forEach((result) => {\n const status = result.ok ? 'SUCCESS' : 'FAILED';\n const responseOrError = result.ok\n ? JSON.stringify(result.response, undefined, 2)\n : JSON.stringify(result.error, undefined, 2);\n table.push([\n result.index,\n result.flow || 'N/A',\n result.tenant || 'N/A',\n result.jobRoot || 'N/A',\n status,\n responseOrError,\n ]);\n });\n\n console.log(table.toString());\n\n // Print summary\n const successCount = results.filter((r) => r.ok).length;\n const failCount = results.filter((r) => !r.ok).length;\n pr(\n themed(\n `Summary: ${themed(String(successCount), 'info')} succeeded, ${themed(String(failCount), 'error')} failed out of ${themed(\n String(results.length),\n 'info'\n )} total.`,\n 'secondary'\n )\n );\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message, stack: err.stack });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to kill jobs'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport { pr, themed, printJSON } from '../../helpers/print.js';\nimport { rollbackJob, getEnvJobs } from '../../helpers/api.js';\n\nconst debug = (...args) => {\n const debug = Debug('commands:jobs:bulkRollback');\n debug(...args);\n};\n\nconst command = 'bulk-rollback';\n\nconst desc = 'Rollback jobs in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('from-utc-iso', {\n describe: 'Start date for job search (YYYY-MM-DD)',\n type: 'string',\n alias: ['from'],\n demandOption: true,\n })\n .demandOption('from-utc-iso', 'Date from is required. Example: --from-utc-iso 2024-01-01')\n .option('to-utc-iso', {\n describe: 'End date for job search (YYYY-MM-DD)',\n type: 'string',\n alias: ['to'],\n demandOption: true,\n })\n .demandOption('to-utc-iso', 'Date to is required. Example: --to-utc-iso 2024-01-31')\n .option('tenant-ids', {\n describe: 'Comma-separated list of tenant IDs to filter by',\n type: 'string',\n alias: ['tenants'],\n })\n .option('flow-ids', {\n describe: 'Comma-separated list of flow IDs to filter by',\n type: 'string',\n alias: ['flows'],\n });\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, fromUtcIso, toUtcIso, tenantIds, flowIds } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n // Validate and format dates\n if (fromUtcIso.length !== 10) {\n const errorMsg = 'Date from must be in YYYY-MM-DD format';\n if (json) {\n printJSON({ status: 'error', error: errorMsg });\n } else {\n spinner.fail(themed(`Error: ${errorMsg}`, 'secondary'));\n }\n process.exit(1);\n }\n\n if (toUtcIso.length !== 10) {\n const errorMsg = 'Date to must be in YYYY-MM-DD format';\n if (json) {\n printJSON({ status: 'error', error: errorMsg });\n } else {\n spinner.fail(themed(`Error: ${errorMsg}`, 'secondary'));\n }\n process.exit(1);\n }\n\n // Format dates with time components\n const formattedDateFrom = `${fromUtcIso}T00:00:00Z`;\n const formattedDateTo = `${toUtcIso}T23:59:59.999Z`;\n\n // 1. Fetch jobs from API\n message = themed(\n `Fetching jobs from ${themed(fromUtcIso, 'info')} to ${themed(toUtcIso, 'info')}...`\n );\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const data = await getEnvJobs({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n from: formattedDateFrom,\n to: formattedDateTo,\n count: 100, // Get max jobs per page\n });\n\n !json && spinner.stop();\n\n let jobs = data.jobs || [];\n\n // 2. Filter by tenant IDs if provided\n if (tenantIds) {\n const tenantIdList = tenantIds.split(',').map(t => t.trim()).filter(t => t);\n if (tenantIdList.length > 0) {\n jobs = jobs.filter(job => {\n const jobTenant = job.tenant;\n return tenantIdList.includes(jobTenant);\n });\n }\n }\n\n // 3. Filter by flow IDs if provided\n if (flowIds) {\n const flowIdList = flowIds.split(',').map(f => f.trim()).filter(f => f);\n if (flowIdList.length > 0) {\n jobs = jobs.filter(job => {\n const jobFlow = job.flow_id || job.flowId || job.flow;\n return flowIdList.includes(jobFlow);\n });\n }\n }\n\n !json && pr(\n themed(`Found ${themed(String(jobs.length), 'info')} job(s) after filtering.`, 'secondary')\n );\n\n if (jobs.length === 0) {\n json\n ? printJSON({ status: 'info', message: 'No jobs found matching the filters' })\n : spinner.warn(\n themed(`Warning: ${themed('No jobs found matching the specified filters')}.`, 'secondary')\n );\n return;\n }\n\n // 4. Rollback all jobs in parallel\n message = themed(`Rolling back ${themed(jobs.length, 'info')} job(s)...`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const results = await Promise.all(\n jobs.map(async (job, index) => {\n const jobRoot = job.s3_root || job.s3Root || job.job_root || job.jobRoot;\n const flow = job.flow_id || job.flowId || job.flow;\n const tenant = job.tenant || job.tenant_id || job.tenantId || job.user_id;\n \n // Extract tap from job data - could be in various fields\n let tap = job.tap;\n if (!tap && job.taps && Array.isArray(job.taps) && job.taps.length > 0) {\n tap = job.taps[0];\n }\n if (!tap && job.tap_name) {\n tap = job.tap_name;\n }\n if (!tap && job.connector) {\n tap = job.connector;\n }\n\n if (!jobRoot) {\n return {\n index,\n flow,\n tenant,\n ok: false,\n error: {\n message: 'Job root (s3_root) not found in job data'\n },\n };\n }\n\n if (!tap) {\n return {\n index,\n flow,\n tenant,\n jobRoot,\n ok: false,\n error: {\n message: 'Tap not found in job data'\n },\n };\n }\n\n try {\n const response = await rollbackJob({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n flow,\n user_id: tenant,\n job_root: jobRoot,\n tap,\n });\n\n return {\n index,\n flow,\n tenant,\n jobRoot,\n tap,\n ok: true,\n response,\n };\n } catch (error) {\n let errorResult;\n \n if (error.response) {\n // The request was made and the server responded with a status code\n // that falls out of the range of 2xx\n const statusCode = error.response.status;\n const statusText = error.response.statusText;\n const responseData = error.response.data;\n const message = error.message;\n \n debug('Error response:', {\n statusCode,\n statusText,\n message,\n data: responseData\n });\n \n errorResult = {\n statusCode,\n statusText,\n message,\n data: responseData\n };\n } else if (error.request) {\n // The request was made but no response was received\n debug('Error: No response received', error.message);\n errorResult = {\n message: error.message,\n request: error.request\n };\n } else {\n // Something happened in setting up the request that triggered an Error\n debug('Error:', error.message);\n errorResult = {\n message: error.message\n };\n }\n\n return {\n index,\n flow,\n tenant,\n jobRoot,\n tap,\n ok: false,\n error: errorResult,\n };\n }\n })\n );\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 5. Print results\n if (json) {\n printJSON(results);\n } else {\n // Generate results table\n const table = new Table({\n head: ['Index', 'Flow', 'Tenant', 'Job Root', 'Tap', 'Status', 'Response/Error'],\n });\n\n results.forEach((result) => {\n const status = result.ok ? 'SUCCESS' : 'FAILED';\n const responseOrError = result.ok\n ? JSON.stringify(result.response, undefined, 2)\n : JSON.stringify(result.error, undefined, 2);\n table.push([\n result.index,\n result.flow || 'N/A',\n result.tenant || 'N/A',\n result.jobRoot || 'N/A',\n result.tap || 'N/A',\n status,\n responseOrError,\n ]);\n });\n\n console.log(table.toString());\n\n // Print summary\n const successCount = results.filter((r) => r.ok).length;\n const failCount = results.filter((r) => !r.ok).length;\n pr(\n themed(\n `Summary: ${themed(String(successCount), 'info')} succeeded, ${themed(String(failCount), 'error')} failed out of ${themed(\n String(results.length),\n 'info'\n )} total.`,\n 'secondary'\n )\n );\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message, stack: err.stack });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to rollback jobs'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n\n","import * as download from './download.js';\nimport * as list from './list.js';\nimport * as bulkRun from './bulkRun.js';\nimport * as bulkRetrigger from './bulkRetrigger.js';\nimport * as bulkKill from './bulkKill.js';\nimport * as bulkRollback from './bulkRollback.js';\n\nexport const jobs = [download, list, bulkRun, bulkRetrigger, bulkKill, bulkRollback];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { jobs } from './jobs/index.js';\n\nconst debug = Debug('commands:jobs');\nconst command = 'jobs <action>';\n\nconst desc = 'Manage ETL jobs';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(jobs);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import { inspect } from 'util';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { getScheduleList, updateSchedule } from '../../helpers/api.js';\n\nconst debug = Debug('commands:schedules:bulkUpdate');\n\nconst command = 'bulk-update';\n\nconst desc = 'Update schedules in bulk';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant-ids', {\n describe: 'Comma-separated list of tenant IDs',\n type: 'string',\n alias: ['tenants'],\n })\n .option('flow-ids', {\n describe: 'Comma-separated list of flow IDs',\n type: 'string',\n alias: ['flows'],\n })\n .option('status', {\n describe: 'Schedule status: \"enable\" or \"disable\"',\n type: 'string',\n choices: ['enable', 'disable'],\n })\n .option('expression', {\n describe: 'Cron schedule expression',\n type: 'string',\n })\n .option('connector', {\n describe: 'Filter by connector ID',\n type: 'string',\n })\n .option('job-type', {\n describe: 'Filter by job type: \"read\" or \"write\"',\n type: 'string',\n choices: ['read', 'write'],\n });\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenantIds, flowIds, status, expression, connector, 'job-type': jobType } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n \n try {\n // Validate that either status or expression is provided\n if (!status && !expression) {\n const errorMsg = 'Either \"status\" or \"expression\" must be provided';\n if (json) {\n printJSON({ status: 'error', error: errorMsg });\n } else {\n spinner.fail(themed(`Error: ${errorMsg}`, 'secondary'));\n }\n process.exit(1);\n }\n\n // Parse comma-separated lists\n const tenantList = tenantIds ? tenantIds.split(',').map(t => t.trim()).filter(Boolean) : null;\n const flowList = flowIds ? flowIds.split(',').map(f => f.trim()).filter(Boolean) : null;\n\n // 1. Get all schedules\n message = themed(`Retrieving schedules for environment: ${themed(env, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n \n const allSchedules = await getScheduleList({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n includeDisabled: true, // Get both enabled and disabled schedules\n });\n \n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('response-data', allSchedules);\n\n // Parse schedules if they come as a JSON string\n const schedules = typeof allSchedules === 'string' ? JSON.parse(allSchedules) : allSchedules;\n\n if (!schedules || schedules.length === 0) {\n if (json) {\n printJSON({ updated: 0, schedules: [] });\n } else {\n spinner.warn(themed(`Warning: ${themed('No schedules found for the specified environment')}.`, 'secondary'));\n }\n return;\n }\n\n // 2. Filter schedules based on criteria\n let filteredSchedules = schedules.filter(schedule => {\n // Filter by tenants\n if (tenantList && tenantList.length > 0) {\n if (!tenantList.includes(schedule.tenantId)) {\n return false;\n }\n }\n\n // Filter by flows\n if (flowList && flowList.length > 0) {\n if (!flowList.includes(schedule.flowId)) {\n return false;\n }\n }\n\n // Filter by connector\n if (connector !== undefined && connector !== null && connector !== '') {\n // Filter by specific connector_id\n if (schedule.connectorId !== connector) {\n return false;\n }\n } else {\n // If connector not passed, get only schedules with connectorId equals to null\n if (schedule.connectorId !== null && schedule.connectorId !== undefined) {\n return false;\n }\n }\n\n // Filter by job_type\n if (jobType) {\n if (schedule.jobType !== jobType) {\n return false;\n }\n }\n\n return true;\n });\n\n if (filteredSchedules.length === 0) {\n if (json) {\n printJSON({ updated: 0, schedules: [] });\n } else {\n spinner.warn(themed(`Warning: ${themed('No schedules match the specified filters')}.`, 'secondary'));\n }\n return;\n }\n\n // 3. All filtered schedules will be updated\n // If status is provided, all schedules (both enabled and disabled) will be updated to that status\n const schedulesToUpdate = filteredSchedules;\n\n // 4. Prepare update payload\n const state = status ? (status === 'enable' ? 'ENABLED' : 'DISABLED') : undefined;\n\n // 5. Print how many schedules will be updated\n if (!json) {\n pr(themed(`Found ${themed(schedulesToUpdate.length.toString(), 'info')} schedule(s) to update`, 'secondary'));\n }\n\n // 6. Update schedules in batches of 20\n const BATCH_SIZE = 20;\n const updatedSchedules = [];\n const failedSchedules = [];\n\n for (let i = 0; i < schedulesToUpdate.length; i += BATCH_SIZE) {\n const batch = schedulesToUpdate.slice(i, i + BATCH_SIZE);\n const batchNum = Math.floor(i / BATCH_SIZE) + 1;\n const totalBatches = Math.ceil(schedulesToUpdate.length / BATCH_SIZE);\n\n message = themed(`Updating batch ${themed(`${batchNum}/${totalBatches}`, 'info')} (${batch.length} schedule(s))`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const updatePromises = batch.map(async (schedule) => {\n try {\n // Use provided expression or keep the existing one from the schedule\n const scheduleExpression = expression || schedule.expression;\n \n // Use provided state or keep the existing one from the schedule\n const scheduleState = state || (schedule.isActive ? 'ENABLED' : 'DISABLED');\n \n // Ensure we have an expression (required by the endpoint)\n if (!scheduleExpression) {\n throw new Error('Schedule expression is required but not found');\n }\n\n const result = await updateSchedule({\n debug,\n baseUri: clientApiBaseUri,\n env: schedule.envId,\n flow: schedule.flowId,\n user_id: schedule.tenantId,\n apikey,\n schedule_expression: scheduleExpression,\n state: scheduleState,\n job_type: schedule.jobType || jobType,\n connector_id: schedule.connectorId || connector,\n });\n\n return {\n success: true,\n schedule: {\n envId: schedule.envId,\n flowId: schedule.flowId,\n tenantId: schedule.tenantId,\n connectorId: schedule.connectorId,\n jobType: schedule.jobType,\n expression: scheduleExpression,\n state: scheduleState,\n },\n result,\n };\n } catch (err) {\n debug('Error updating schedule:', err);\n return {\n success: false,\n schedule: {\n envId: schedule.envId,\n flowId: schedule.flowId,\n tenantId: schedule.tenantId,\n connectorId: schedule.connectorId,\n jobType: schedule.jobType,\n },\n error: err.message || err.toString(),\n };\n }\n });\n\n const batchResults = await Promise.all(updatePromises);\n \n batchResults.forEach(result => {\n if (result.success) {\n updatedSchedules.push(result.schedule);\n } else {\n failedSchedules.push(result);\n }\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n }\n\n // 7. Print results\n if (json) {\n printJSON({\n total: schedulesToUpdate.length,\n updated: updatedSchedules.length,\n failed: failedSchedules.length,\n schedules: updatedSchedules,\n errors: failedSchedules,\n });\n } else {\n pr(themed(`\\nUpdated ${themed(updatedSchedules.length.toString(), 'info')} schedule(s) successfully`, 'secondary'));\n \n if (failedSchedules.length > 0) {\n pr(themed(`Failed to update ${themed(failedSchedules.length.toString(), 'error')} schedule(s)`, 'secondary'));\n }\n\n if (updatedSchedules.length > 0 || failedSchedules.length > 0) {\n const table = new Table({\n head: ['Environment', 'Flow', 'Tenant', 'Connector', 'Job Type', 'Expression', 'State', 'Updated'],\n });\n \n // Add successful schedules\n updatedSchedules.forEach((schedule) => {\n table.push([\n schedule.envId,\n schedule.flowId,\n schedule.tenantId,\n schedule.connectorId || 'N/A',\n schedule.jobType || 'N/A',\n schedule.expression,\n schedule.state,\n 'yes',\n ]);\n });\n \n // Add failed schedules\n failedSchedules.forEach((failed) => {\n const schedule = failed.schedule;\n // Find the original schedule to get expression and state if available\n const originalSchedule = schedulesToUpdate.find(\n s => s.envId === schedule.envId && \n s.flowId === schedule.flowId && \n s.tenantId === schedule.tenantId &&\n s.connectorId === schedule.connectorId &&\n s.jobType === schedule.jobType\n );\n \n table.push([\n schedule.envId,\n schedule.flowId,\n schedule.tenantId,\n schedule.connectorId || 'N/A',\n schedule.jobType || 'N/A',\n originalSchedule?.expression || 'N/A',\n originalSchedule?.isActive ? 'ENABLED' : 'DISABLED',\n `no: ${failed.error}`,\n ]);\n });\n \n console.log('\\n' + table.toString());\n }\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err.message || err.toString() });\n } else {\n spinner.fail(themed(`Error: ${message || 'Failed to update schedules'}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message || err.toString())}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as bulkUpdate from './bulkUpdate.js';\n\nexport const schedules = [bulkUpdate];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { schedules } from './schedules/index.js';\n\nconst debug = Debug('commands:schedules');\nconst command = 'schedules <action>';\n\nconst desc = 'Manage schedules';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(schedules);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { readdir, readFile } from 'fs/promises';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport { getFolderFiles } from '../../helpers/utils.js';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\n\nconst debug = Debug('commands:snapshots:deploy');\n\nconst command = 'deploy';\n\nconst desc = 'Deploy Snapshots';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('sourceFolder', descriptions.options['sourceFolder'].config)\n .demandOption('sourceFolder', descriptions.options['sourceFolder'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant, sourceFolder } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n const folderPrefix = path.resolve(process.cwd(), sourceFolder);\n try {\n message = themed(`Deploying Snapshots for Tenant ${themed(tenant, 'info')} to ${themed(env, 'info')}`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n // 1. build list of deployable files\n const deployableFiles = await getFolderFiles(folderPrefix, {\n recursive: true,\n });\n if (deployableFiles.length === 0) {\n json\n ? printJSON({ status: 'error', error: 'There are no files to deploy at the specified location!' })\n : spinner.fail(\n themed(`Error: ${themed('There are no files to deploy at the specified location!')}.`, 'secondary')\n );\n return;\n }\n\n // 2. get STS credentials\n message = themed(`Verifying user and authorizing`);\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'snapshot-deploy',\n env,\n tenant,\n apikey,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // create authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n // 3. verify tenant is valid\n message = themed(`Validating tenant exists`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n try {\n const { CommonPrefixes: tenantFolders } = await s3\n .listObjectsV2({ Bucket: env, Prefix: `${tenant}/`, Delimiter: '/' })\n .promise();\n if (tenantFolders.length === 0) throw new Error('Invalid tenant');\n } catch (err) {\n debug('err', err);\n throw new Error(`Tenant doesn't exist. Please check your tenant (-u) argument.`);\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const rootKey = `${tenant}/snapshots/`;\n const table = new Table({ head: ['File', 'Status'] });\n // 4. cleanup old files\n message = themed(`Preparing deployment target`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { Contents } = await s3.listObjectsV2({ Bucket: env, Prefix: `${rootKey}` }).promise();\n !json && spinner.stop();\n debug('contents', Contents);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const filesToDelete = Contents.map((item) => ({ Key: item.Key }));\n if (filesToDelete.length > 0) {\n const delParams = {\n Bucket: env,\n Delete: { Objects: filesToDelete, Quiet: true },\n };\n await s3.deleteObjects(delParams).promise();\n filesToDelete.forEach(({ Key }) => table.push([Key.substring(rootKey.length), themed('Deleted', 'warn')]));\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 5. upload new files\n for await (const file of deployableFiles) {\n const relativePath = path.relative(sourceFolder, file);\n const key = `${rootKey}${relativePath}`;\n\n message = themed(`Deploying file: ${themed(relativePath, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const readBuffer = await readFile(file);\n const params = {\n Bucket: env,\n Key: key,\n Body: readBuffer,\n };\n\n const res = await s3.putObject(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-put-res', res);\n table.push([relativePath, themed('Deployed', 'info')]);\n }\n\n if (json) {\n printJSON({ status: 'success', deployedFiles: deployableFiles });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import path from 'path';\nimport { mkdir, writeFile, stat } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport AWS from 'aws-sdk';\nimport descriptions from '../../helpers/descriptions.js';\nimport print, { pr, pp, cl, themed, printJSON } from '../../helpers/print.js';\nimport { filterFiles, userSetOption, streamToString } from '../../helpers/utils.js';\nimport { genCredentialsOnClientApi } from '../../helpers/api.js';\n\nconst debug = Debug('commands:snapshots:download');\n\nconst command = 'download';\n\nconst desc = 'Download Snapshots';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('downloadTo', descriptions.options['downloadTo'].config)\n .demandOption('downloadTo', descriptions.options['downloadTo'].demandText)\n .option('tenant', { ...descriptions.options['tenant'].config, default: 'default' })\n .option('overwrite', descriptions.options['overwrite'].config)\n .demandOption('overwrite', descriptions.options['overwrite'].demandText);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant, downloadTo, overwrite } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n const folderPrefix = path.resolve(process.cwd(), userSetOption('downloadTo') ? downloadTo : 'snapshots');\n try {\n // 1. get STS credentials\n message = themed(`Verifying user and authorizing`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'snapshot-download',\n env,\n tenant,\n apikey,\n });\n // created authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 2. verify tenant is valid\n message = themed(`Validating tenant exists`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n try {\n // this may also throw access denied\n const { CommonPrefixes: tenantFolders } = await s3\n .listObjectsV2({ Bucket: env, Prefix: `${tenant}/`, Delimiter: '/' })\n .promise();\n if (tenantFolders.length === 0) throw new Error('Invalid tenant');\n } catch (err) {\n debug('err', err);\n throw new Error(`Tenant doesn't exist. Please check your tenant (-u) argument.`);\n }\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // 3. get list of downloadable files\n message = themed(`Scanning for downloadable files`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const keyPrefix = `${tenant}/snapshots/`;\n const params = {\n Bucket: env,\n Prefix: keyPrefix,\n };\n const { Contents: s3Files } = await s3.listObjectsV2(params).promise();\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('s3-list-res', s3Files);\n // filter unwanted files from source\n const filesToDownload = s3Files ? s3Files.map((item) => item.Key).filter((item) => item !== keyPrefix) : [];\n if (!filesToDownload || filesToDownload.length === 0) {\n json\n ? printJSON({ status: 'success', downloadedFiles: [] })\n : spinner.warn(themed(`Warning: ${themed('Nothing to download!')}`, 'secondary'));\n return;\n }\n\n // 4. download files\n message = themed(`Downloading snapshot files to ${themed(folderPrefix, 'info')}`);\n !json && spinner.info(themed(`Info: ${message}.`, 'secondary'));\n const table = new Table({ head: ['File', 'Status'] });\n for await (const file of filesToDownload) {\n const subPath = file.substring(keyPrefix.length);\n const fullPath = path.resolve(folderPrefix, subPath);\n debug('file', fullPath);\n if (file.endsWith('/')) {\n !existsSync(fullPath) && (await mkdir(fullPath, { recursive: true }));\n continue;\n }\n // skip if exists and overwrite is false\n if (!overwrite) {\n try {\n await stat(fullPath);\n debug('exists, skipping');\n table.push([subPath, 'Skipped']);\n continue;\n } catch (err) {\n if (err.code !== 'ENOENT') cl(err);\n }\n }\n\n message = themed(`Downloading file: ${themed(subPath, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n // ensure destination folder exists\n await mkdir(path.dirname(fullPath), { recursive: true });\n // download s3 object into destination folder\n const fileStream = s3.getObject({ Bucket: env, Key: file }).createReadStream();\n await writeFile(fullPath, await streamToString(fileStream));\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n table.push([subPath, 'Downloaded']);\n }\n\n if (json) {\n printJSON({ status: 'success', downloadedFiles: filesToDownload });\n } else {\n // print results\n cl(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as deploy from './deploy.js';\nimport * as download from './download.js';\n\nexport const snapshots = [deploy, download];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { snapshots } from './snapshots/index.js';\n\nconst debug = Debug('commands:snapshots');\n\nconst command = 'snapshots <action>';\n\nconst desc = 'Manage tenant snapshots';\n\nconst builder = async function (yargs) {\n debug('builder', command, yargs);\n const base = await baseApiBuilder(yargs);\n return base.command(snapshots);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, printJSON, themed } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi, getTenants, getLinkedSources, getSupportedSources } from '../../helpers/api.js';\nimport { buildChunks } from '../../helpers/utils.js';\n\nconst debug = Debug('commands:tenants:custom-etl');\n\nconst command = 'custom-etl';\n\nconst desc = 'List tenants with custom ETL in a specific flow';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant', descriptions.options['tenant'].config)\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText);\n};\n\nconst processTenant = async ({ debug, baseUri, apikey, env, flow, tenant, supportedSources }) => {\n // Get all linked sources of the tuple (env, flow, tenant)\n const linkedSources = await getLinkedSources({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n });\n\n let result = null;\n\n for (const { tap } of [...linkedSources, ...supportedSources]) {\n // Generate AWS credentials in order to read the S3 tap folder\n // Note(davi): I'm using \"etl-download\" because it's a \"read ETL\" operation\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri,\n task: 'etl-download',\n env,\n tenant,\n flow,\n tap,\n apikey,\n });\n\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n const keyPrefix = `${tenant}/flows/${flow}/taps/${tap}/etl/`;\n\n const params = {\n Bucket: env,\n Prefix: keyPrefix,\n };\n\n // List all files inside the S3 tap folder\n const { Contents: s3Files } = await s3.listObjectsV2(params).promise();\n\n // Check if either \"etl.py\" or \"etl.ipynb\" exist\n const hasCustomEtl = s3Files.some(({ Key }) => Key.endsWith('etl.py') || Key.endsWith('etl.ipynb'));\n\n if (hasCustomEtl) result = tenant;\n\n // If it's true, we can break already\n if (result !== null) break;\n }\n\n return result;\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow } = argv;\n\n let message;\n let spinner = ora();\n\n try {\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const [allTenants, supportedSources] = await Promise.all([\n getTenants({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n }),\n getSupportedSources({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n })\n ]);\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n let tenantsWithCustomEtl = [];\n\n message = themed(`Querying for custom ETL scripts for flow ${themed(flow, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Break the tenants array in to an array of arrays so we can make\n // parallel calls and make it faster\n for (const tenants of buildChunks(allTenants)) {\n const maybeTenantsWithCustomEtl = await Promise.all(\n tenants.map((tenant) =>\n processTenant({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n tenant,\n supportedSources,\n })\n )\n );\n\n // Note(davi): we need the `.filter(Boolean)` because sometimes\n // the function above returns `null`\n tenantsWithCustomEtl = tenantsWithCustomEtl.concat(maybeTenantsWithCustomEtl.filter(Boolean));\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON(tenantsWithCustomEtl);\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID'] });\n table.push(...tenantsWithCustomEtl.map((item) => [item]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pp, pr, printJSON, themed } from '../../helpers/print.js';\nimport {\n genCredentialsOnClientApi,\n getTenants,\n getLinkedSources,\n getSupportedFlow,\n getLinkedConnectors,\n} from '../../helpers/api.js';\nimport { buildChunks } from '../../helpers/utils.js';\n\nconst debug = Debug('commands:tenants:custom-field-map');\n\nconst command = 'custom-field-map';\n\nconst desc = 'List tenants with custom field map in a specific flow';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant', descriptions.options['tenant'].config)\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText);\n};\n\nconst processTenant = async ({ debug, baseUri, apikey, env, flow, tenant, isV2Flow }) => {\n // Get all linked connectors/sources of the tuple (env, flow, tenant)\n const linkedConnectors = isV2Flow\n ? await getLinkedConnectors({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n })\n : await getLinkedSources({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n });\n\n const connectors = [];\n\n // Generate AWS credentials in order to read the S3 tap folder\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri,\n task: 'field-map-download',\n env,\n tenant,\n flow,\n apikey,\n });\n\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n for (const { id, tap } of linkedConnectors) {\n const entityLabel = isV2Flow ? 'connectors' : 'taps';\n\n const params = {\n Bucket: env,\n Key: `${tenant}/flows/${flow}/${entityLabel}/${isV2Flow ? id : tap}/fieldMap.json`,\n };\n\n try {\n await s3.headObject(params).promise();\n\n connectors.push(isV2Flow ? id : tap);\n } catch (error) {\n // Does not have fieldMap.json\n }\n }\n\n return { tenant, connectors };\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow } = argv;\n\n let message;\n let spinner = ora();\n\n try {\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const [allTenants, supportedFlow] = await Promise.all([\n getTenants({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n }),\n getSupportedFlow({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n }),\n ]);\n\n const isV2Flow = supportedFlow?.version === 2;\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const tenantsWithCustomFieldMap = [];\n\n message = themed(`Querying for custom field maps for flow ${themed(flow, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Break the tenants array in to an array of arrays so we can make\n // parallel calls and make it faster\n for (const tenants of buildChunks(allTenants)) {\n const maybeTenantsWithCustomFieldMap = await Promise.all(\n tenants.map((tenant) =>\n processTenant({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n tenant,\n isV2Flow,\n })\n )\n );\n\n tenantsWithCustomFieldMap.push(\n ...maybeTenantsWithCustomFieldMap.filter(({ connectors }) => connectors.length > 0)\n );\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON(tenantsWithCustomFieldMap);\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID', 'Connector IDs'] });\n table.push(...tenantsWithCustomFieldMap.map(({ tenant, connectors }) => [tenant, connectors.join(', ')]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import AWS from 'aws-sdk';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport Debug from '../../helpers/debug.js';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, printJSON, themed } from '../../helpers/print.js';\nimport { genCredentialsOnClientApi, deleteTenantSchedules } from '../../helpers/api.js';\n\nconst debug = Debug('commands:tenants:delete');\n\nconst command = 'delete';\n\nconst desc = 'Delete tenant';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs.option('tenant', descriptions.options['tenant'].config);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant } = argv;\n const { clientApiBaseUri } = hg;\n\n let message;\n let spinner = ora();\n try {\n if (tenant === 'default') {\n throw new Error('It\\'s not possible to delete \"default\" tenant!');\n }\n\n message = themed(`Deleting tenant ${tenant} schedules`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n await deleteTenantSchedules({\n debug,\n baseUri: clientApiBaseUri,\n env,\n apikey,\n tenant,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n message = themed(`Verifying user and authorizing`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri: clientApiBaseUri,\n task: 'tenant-delete',\n env,\n tenant,\n apikey,\n });\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n // created authenticated S3 instance\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n message = themed(`Deleting tenant ${tenant} for environment ${themed(env, 'info')}`);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n while (true) {\n // List objects, 1000 keys at a time\n const s3Objects = await s3\n .listObjectsV2({\n Bucket: env,\n Prefix: `${tenant}/`,\n })\n .promise();\n\n const Objects = (s3Objects.Contents || []).map(({ Key }) => ({ Key }));\n\n if (Objects.length === 0) {\n break;\n }\n\n // Purge the objects\n const response = await s3\n .deleteObjects({\n Bucket: env,\n Delete: {\n Objects,\n },\n })\n .promise();\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON({ statu: 'success', tenantDeleted: tenant });\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID'] });\n table.push([tenant]);\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n\n debug(err);\n\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport axios from 'axios';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pp, pr, printJSON, themed } from '../../helpers/print.js';\n\nconst debug = Debug('commands:tenants:list');\n\nconst command = 'list';\n\nconst desc = 'List tenants';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs.option('tenant', descriptions.options['tenant'].config);\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, tenant } = argv;\n\n let message;\n let spinner = ora();\n try {\n // 1. get data from client-api backend\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n const uri = `${hg.clientApiBaseUri}/tenants/${env}${tenant ? `?tenant=${tenant}` : ''}`;\n debug('requesting:', uri);\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n const { data } = await axios.get(uri, { headers: { 'x-api-key': apikey } });\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n debug('response-data', data);\n\n // exit if there is no data\n if (!data || data.length === 0) {\n json\n ? printJSON([])\n : spinner.info(themed(`Info: ${themed('No tenants found in the specified environment')}.`, 'secondary'));\n return;\n }\n\n if (json) {\n printJSON(data);\n } else {\n // generate results table\n const table = new Table({ head: ['tenant ID'] });\n table.push(...data.map((item) => [item]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport AWS from 'aws-sdk';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, printJSON, themed } from '../../helpers/print.js';\nimport {\n genCredentialsOnClientApi,\n getTenants,\n getLinkedSources,\n getSupportedFlow,\n getLinkedConnectors,\n} from '../../helpers/api.js';\nimport { buildChunks } from '../../helpers/utils.js';\n\nconst debug = Debug('commands:tenants:custom-catalog');\n\nconst command = 'custom-catalog';\n\nconst desc = 'List tenants with custom catalog in a specific flow';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('tenant', descriptions.options['tenant'].config)\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText);\n};\n\nconst processTenant = async ({ debug, baseUri, apikey, env, flow, tenant, isV2Flow }) => {\n try {\n // Get all linked connectors/sources of the tuple (env, flow, tenant)\n const linkedConnectors = isV2Flow\n ? await getLinkedConnectors({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n })\n : await getLinkedSources({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n });\n\n const connectors = [];\n\n // Generate AWS credentials in order to read the S3 tap folder\n const { accessKeyId, secretAccessKey, sessionToken } = await genCredentialsOnClientApi({\n debug,\n baseUri,\n task: 'field-map-download',\n env,\n tenant,\n flow,\n apikey,\n });\n\n const s3 = new AWS.S3({\n accessKeyId,\n secretAccessKey,\n sessionToken,\n });\n\n for (const { id, tap } of linkedConnectors) {\n const entityLabel = isV2Flow ? 'connectors' : 'taps';\n\n const params = {\n Bucket: env,\n Key: `${tenant}/flows/${flow}/${entityLabel}/${isV2Flow ? id : tap}/catalog.json`,\n };\n\n try {\n await s3.headObject(params).promise();\n\n connectors.push(isV2Flow ? id : tap);\n } catch (error) {\n // Does not have catalog.json\n }\n }\n\n return { tenant, connectors };\n } catch (error) {\n console.error(error);\n return { tenant, connectors: [] };\n }\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow } = argv;\n\n let message;\n let spinner = ora();\n\n try {\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const [allTenants, supportedFlow] = await Promise.all([\n getTenants({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n }),\n getSupportedFlow({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n }),\n ]);\n\n const isV2Flow = supportedFlow?.version === 2;\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const tenantsWithCustomFieldMap = [];\n\n message = themed(`Querying for custom catalogs for flow ${themed(flow, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Break the tenants array in to an array of arrays so we can make\n // parallel calls and make it faster\n for (const tenants of buildChunks(allTenants)) {\n const maybeTenantsWithCustomFieldMap = await Promise.all(\n tenants.map((tenant) =>\n processTenant({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n tenant,\n isV2Flow,\n })\n )\n );\n\n tenantsWithCustomFieldMap.push(\n ...maybeTenantsWithCustomFieldMap.filter(({ connectors }) => connectors.length > 0)\n );\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON(tenantsWithCustomFieldMap);\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID', 'Connector IDs'] });\n table.push(...tenantsWithCustomFieldMap.map(({ tenant, connectors }) => [tenant, connectors.join(', ')]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import Debug from '../../helpers/debug.js';\nimport ora from 'ora';\nimport Table from 'cli-table';\nimport descriptions from '../../helpers/descriptions.js';\nimport { pr, printJSON, themed } from '../../helpers/print.js';\nimport {\n getTenants,\n getLinkedSources,\n getSupportedFlow,\n getLinkedConnectors,\n patchLinkedConnectorConfig,\n patchLinkedSourceConfig,\n} from '../../helpers/api.js';\nimport { buildChunks } from '../../helpers/utils.js';\nimport { existsSync, readFileSync } from 'fs';\n\nconst debug = Debug('commands:tenants:update-config');\n\nconst command = 'update-config';\n\nconst desc = 'Update the config of a specific connector and flow for all tenants';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('flow', descriptions.options['flow'].config)\n .demandOption('flow', descriptions.options['flow'].demandText)\n .option('connector', descriptions.options['connector'].config)\n .demandOption('connector', descriptions.options['connector'].demandText)\n .option('configFilePath', descriptions.options['configFilePath'].config)\n .demandOption('configFilePath', descriptions.options['configFilePath'].demandText);\n};\n\nconst processTenant = async ({ debug, baseUri, apikey, env, flow, tenant, connectorId, config, isV2Flow }) => {\n const lookupKey = isV2Flow ? 'id' : 'tap';\n\n // Get all linked connectors/sources of the tuple (env, flow, tenant)\n const linkedConnectors = isV2Flow\n ? await getLinkedConnectors({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n config: true,\n })\n : await getLinkedSources({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n config: true,\n });\n\n const connector = linkedConnectors.find((c) => c[lookupKey] === connectorId);\n\n if (!connector) return null;\n\n const patchFunction = isV2Flow ? patchLinkedConnectorConfig : patchLinkedSourceConfig;\n\n try {\n await patchFunction({\n debug,\n baseUri,\n env,\n flow,\n tenant,\n apikey,\n connectorId,\n config,\n });\n } catch (e) {\n console.log(themed(`Error patching: ${tenant}. ${e}`, 'secondary'))\n }\n\n return tenant;\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { hg, json, apikey, env, flow, connector, configFilePath } = argv;\n\n let message;\n let spinner = ora();\n\n try {\n if (!configFilePath) {\n throw new Error('Config file path not provided');\n }\n\n if (!configFilePath.endsWith('.json')) {\n throw new Error('Config file must have .json extension');\n }\n\n if (!existsSync(configFilePath)) {\n throw new Error('Config file not found');\n }\n\n const config = JSON.parse(readFileSync(configFilePath, { encoding: 'utf-8' }));\n\n message = themed(`Retrieving tenants for environment ${themed(env, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n const [allTenants, supportedFlow] = await Promise.all([\n getTenants({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n }),\n getSupportedFlow({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n }),\n ]);\n\n const isV2Flow = supportedFlow?.version === 2;\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n const tenantsUpdated = [];\n\n message = themed(`Updating config for connector ${themed(connector, 'info')} and flow ${themed(flow, 'info')}`);\n\n !json && spinner.start(themed(`In progress: ${message}...`, 'secondary'));\n\n // Break the tenants array in to an array of arrays so we can make\n // parallel calls and make it faster\n for (const tenants of buildChunks(allTenants)) {\n const maybeTenantsUpdated = await Promise.all(\n tenants.map((tenant) =>\n processTenant({\n debug,\n baseUri: hg.clientApiBaseUri,\n apikey,\n env,\n flow,\n tenant,\n connectorId: connector,\n config,\n isV2Flow,\n })\n )\n );\n\n tenantsUpdated.push(...maybeTenantsUpdated.filter(Boolean));\n }\n\n !json && spinner.succeed(themed(`Finished: ${message}.`, 'secondary'));\n\n if (json) {\n printJSON(tenantsUpdated);\n } else {\n // generate results table\n const table = new Table({ head: ['Tenant ID'] });\n tenantsUpdated.forEach((t) => table.push([t]));\n\n // print results\n console.log(table.toString());\n }\n } catch (err) {\n if (json) {\n printJSON({ status: 'error', error: err });\n } else {\n spinner.fail(themed(`Error: ${message}.`, 'secondary'));\n pr(themed(`Message: ${themed(err.message)}`, 'secondary'));\n debug(err);\n if (err && err.response && err.response.data) {\n debug('response', err.response.data);\n }\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import * as customEtl from './customEtl.js';\nimport * as customField from './customFieldMap.js';\nimport * as del from './delete.js';\nimport * as list from './list.js';\nimport * as customCatalog from './customCatalog.js';\nimport * as updateConfig from './updateConfig.js';\n\nexport const tenants = [customEtl, customField, del, list, customCatalog, updateConfig];\n","import Debug from '../helpers/debug.js';\nimport { baseApiBuilder } from '../helpers/baseBuilder.js';\nimport { tenants } from './tenants/index.js';\n\nconst debug = Debug('commands:tenants');\nconst command = 'tenants <action>';\n\nconst desc = 'Manage tenants';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseApiBuilder(yargs);\n return base.command(tenants);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import fs from 'fs';\nimport { generateJsonLines } from './util.js';\nimport Debug from '../../helpers/debug.js';\nimport descriptions from '../../helpers/descriptions.js';\nimport crypto from 'crypto';\nimport { printJSON } from '../../helpers/print.js';\nconst debug = Debug('commands:singer:validate');\n\nconst command = 'validate';\n\nconst desc = 'Validate Singer data';\n\nconst builder = async (yargs) => {\n debug('builder', command);\n\n return yargs\n .option('dataFilePath', { ...descriptions.options['dataFilePath'].config })\n .option('allowDuplicateRecords', {\n type: 'boolean',\n default: false,\n description: 'Allow duplicate records',\n })\n .option('allowFuzzyTypes', {\n type: 'boolean',\n default: false,\n description: 'Allow fields to have multiple non-null types',\n });\n};\n\nconst validateSchemaMatching = (streamName, newSchema, currentSchema) => {\n for (const [field, fieldSchema] of Object.entries(newSchema.properties)) {\n if (currentSchema.properties[field]) {\n const currentTyping = currentSchema.properties[field].type;\n const newTyping = fieldSchema.type;\n if (currentTyping.length != newTyping.length || currentTyping.some((t) => !newTyping.includes(t))) {\n throw new Error(\n `Schema for ${streamName} has different typing for field ${field}: ${currentTyping} and ${newTyping}`\n );\n }\n }\n }\n};\n\nconst validateSchemaFormat = (streamName, schema, allowFuzzyTypes) => {\n for (const [field, fieldSchema] of Object.entries(schema.properties)) {\n let typing = fieldSchema.type;\n if (!Array.isArray(typing)) {\n typing = [typing];\n }\n\n const nonNullTypes = typing.filter((t) => t !== 'null');\n if (nonNullTypes.length > 1 && !allowFuzzyTypes) {\n throw new Error(\n `Schema for ${streamName} has multiple non-null types for field ${field}: ${nonNullTypes.join(', ')}`\n );\n }\n }\n};\n\nconst validateFieldAgainstSchema = (streamName, field, value, fieldType) => {\n /*\n Currently only checks primitives\n TODO: Check types within Arrays+Objects \n (Nested validation should probably be under flag)\n */\n let typing = fieldType.type;\n if (!Array.isArray(typing)) {\n typing = [typing];\n }\n const nonNullType = typing.filter((t) => t !== 'null')[0];\n const isNullable = typing.includes('null');\n if (isNullable && value === null) {\n return;\n }\n if (nonNullType === 'string' && typeof value !== 'string') {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type string.`\n );\n }\n if (nonNullType === 'number' && typeof value !== 'number') {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type number.`\n );\n }\n if (nonNullType === 'boolean' && typeof value !== 'boolean') {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type boolean.`\n );\n }\n if (nonNullType === 'array') {\n if (!Array.isArray(value)) {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type array.`\n );\n }\n }\n if (nonNullType === 'object') {\n if (typeof value !== 'object') {\n throw new Error(\n `Record for ${streamName} has invalid type ${typeof value} for field ${field}. Expected type object.`\n );\n }\n }\n};\n\nconst validateRecordAgainstSchema = (streamName, record, schema) => {\n for (const [field, value] of Object.entries(record)) {\n const fieldType = schema.properties[field];\n if (!fieldType) {\n throw new Error(`Record for ${streamName} has unknown field ${field}`);\n }\n validateFieldAgainstSchema(streamName, field, value, fieldType);\n }\n};\n\nconst validateSchemaMessage = (streams, obj, allowFuzzyTypes) => {\n const streamName = obj.stream;\n if (!streamName) {\n throw new Error('Schema record is missing stream name');\n }\n\n if (!obj.schema) {\n throw new Error(`Schema record for ${streamName} is missing schema field`);\n }\n\n if (!streams[streamName]) {\n streams[streamName] = {\n schema: obj.schema,\n keyProperties: obj.key_properties || [],\n keySet: new Set(),\n count: 0,\n };\n } else {\n for (const keyProperty of obj.key_properties) {\n if (!streams[streamName].keyProperties.includes(keyProperty)) {\n throw new Error(\n `Schema for ${streamName} has different key properties: ${streams[streamName].keyProperties.join(\n ', '\n )} and ${obj.key_properties.join(', ')}`\n );\n }\n }\n\n const currentSchema = streams[streamName].schema;\n validateSchemaMatching(streamName, obj.schema, currentSchema);\n }\n\n validateSchemaFormat(streamName, obj.schema, allowFuzzyTypes);\n return streams;\n};\n\nconst validateRecordMessage = (streams, obj, allowDuplicateRecords) => {\n const streamName = obj.stream;\n const record = obj.record;\n if (!record) {\n throw new Error('Record is missing record field');\n }\n\n if (typeof record !== 'object') {\n throw new Error(`Record has invalid type ${typeof record} for record field. Expected type object.`);\n }\n\n if (!streamName) {\n throw new Error('Record record is missing stream name');\n }\n if (!streams[streamName]) {\n throw new Error(`Record was written for stream ${streamName} before schema row was written.`);\n }\n const pks = streams[streamName].keyProperties;\n\n for (const pk of pks) {\n if (!record[pk]) {\n throw new Error(`Record for ${streamName} is missing key property ${pk}`);\n }\n streams[streamName].keySet.add(record[pk]);\n }\n if (pks.length > 0 && !allowDuplicateRecords) {\n const pkHash = crypto\n .createHash('sha256')\n .update(pks.map((pk) => `${pk}:${record[pk]}`).join(''))\n .digest('hex');\n if (streams[streamName].keySet.has(pkHash)) {\n throw new Error(\n `Duplicate record for ${streamName} with primary keys: ${pks.map((pk) => `${pk}: ${record[pk]}`).join(', ')}`\n );\n }\n streams[streamName].keySet.add(pkHash);\n }\n\n validateRecordAgainstSchema(streamName, record, streams[streamName].schema);\n\n streams[streamName].count++;\n};\n\nconst validateStateMessage = (streams, obj) => {\n if (!obj.value) {\n throw new Error(`State record is missing value`);\n }\n if (typeof obj.value !== 'object') {\n throw new Error(`State record has invalid type ${typeof obj.value} for value. Expected type object.`);\n }\n};\n\nconst validateSingerData = async (dataFilePath, options) => {\n const streams = {};\n const { allowDuplicateRecords, allowFuzzyTypes } = options;\n\n for await (const obj of generateJsonLines(dataFilePath)) {\n try {\n if (!obj.type) {\n throw new Error(`Singer row is missing type: ${JSON.stringify(obj)}`);\n }\n if (obj.type == 'SCHEMA') {\n validateSchemaMessage(streams, obj, allowFuzzyTypes);\n } else if (obj.type == 'RECORD') {\n validateRecordMessage(streams, obj, allowDuplicateRecords);\n } else if (obj.type == 'STATE') {\n validateStateMessage(streams, obj);\n }\n } catch (error) {\n if(options.json) {\n error.message =`${error.message}. Error occured on line: ${JSON.stringify(obj)}.`;\n } else {\n console.log(`Error occured on line: ${JSON.stringify(obj)} \n `);\n }\n throw error;\n }\n }\n return streams;\n};\n\nconst handler = async (argv) => {\n debug('handler', command, argv);\n\n const { allowDuplicateRecords, allowFuzzyTypes, dataFilePath, json } = argv;\n const options = {\n allowDuplicateRecords,\n allowFuzzyTypes,\n json,\n };\n\n if (!dataFilePath) {\n throw new Error('Data file path is required');\n }\n\n if (!fs.existsSync(dataFilePath)) {\n throw new Error(`Data file path ${dataFilePath} does not exist`);\n }\n\n try {\n const streams = await validateSingerData(dataFilePath, options);\n if (json) {\n console.log(JSON.stringify({\n streams: Object.keys(streams).map((stream) => ({\n stream,\n count: streams[stream].count,\n })),\n }, null, 2));\n } else {\n console.log(`\n \n🎉🎉🎉 Singer validation passed 🎉🎉🎉\n--------------------------------------\n\n${Object.keys(streams).length} streams validated\n\nRecord count by stream:\n${Object.keys(streams)\n .map(\n (stream) => `\n ${stream}: ${streams[stream].count}`\n )\n .join('')}\n\n `);\n }\n } catch (error) {\n if (json) {\n console.log(JSON.stringify({\n error: error.message,\n }, null, 2));\n } else {\n console.log(`\n\n🚨🚨🚨 Singer validation failed 🚨🚨🚨\n--------------------------------------\n\n${error.message}\n\n `);\n }\n process.exit(1);\n }\n};\n\nexport { command, desc, builder, handler };\n","import fs from 'fs';\nexport async function* generateJsonLines(filePath) {\n const fileStream = fs.createReadStream(filePath, { encoding: 'utf8' });\n let remainder = '';\n\n for await (const chunk of fileStream) {\n const lines = (remainder + chunk).split('\\n');\n remainder = lines.pop(); // Keep the last partial line\n\n for (const line of lines) {\n if (line.trim()) {\n yield JSON.parse(line);\n }\n }\n }\n\n if (remainder.trim()) {\n yield JSON.parse(remainder);\n }\n}\n","import * as validate from './validate.js';\n\nexport const singer = [validate];\n","import Debug from '../helpers/debug.js';\nimport { baseBuilder } from '../helpers/baseBuilder.js';\nimport { singer } from './singer/index.js';\n\nconst debug = Debug('commands:singer');\n\nconst command = 'singer <action>';\n\nconst desc = 'Develop and test singer taps and targets';\n\nconst builder = async function (yargs) {\n debug('builder', command);\n const base = await baseBuilder(yargs);\n return base.command(singer);\n};\n\nconst handler = async function (argv) {\n debug('handler', command, argv);\n};\n\nexport { command, desc, builder, handler };\n","import * as config from './config.js';\nimport * as env from './env.js';\nimport * as etl from './etl.js';\nimport * as flows from './flows.js';\nimport * as jobs from './jobs.js';\nimport * as schedules from './schedules.js';\nimport * as snapshots from './snapshots.js';\nimport * as tenants from './tenants.js';\nimport * as singer from './singer.js'\n\nexport const commands = [config, env, etl, flows, jobs, schedules, snapshots, tenants, singer];\n","#!/usr/bin/env node\nimport 'dotenv/config.js';\nimport _yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\nimport { staticOptions } from './helpers/config.js';\nimport { setTheme, themed } from './helpers/print.js';\nimport 'aws-sdk';\nimport { commands } from './commands/index.js';\nprocess.env.AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE = '1';\n// set theme once here\nconst myTheme = {};\nsetTheme(myTheme);\n\nconst yargs = _yargs(process.argv.slice(2));\n\nyargs\n .usage(themed('Usage: $0 <command>'))\n .command(commands)\n .demandCommand()\n // .help()\n // .version('v')\n .alias('v', 'version')\n .alias('h', 'help')\n .string('_')\n .strictCommands()\n // .strictOptions()\n .epilogue(themed('For more information, visit https://docs.hotglue.xyz/docs/cli-overview'))\n .wrap(Math.min(yargs.terminalWidth(), 90))\n .parse(hideBin(process.argv), staticOptions);\n// .parse(hideBin(process.argv));\n\nexport {};\n"],"names":["DefaultValuesForTypeKey","fs","require$$0","path","require$$1","os","require$$2","log","message","console","RE_INI_KEY_VAL","RE_NEWLINES","NEWLINES_MATCH","parse","src","options","debug","Boolean","obj","toString","split","forEach","line","idx","keyValueArr","match","key","val","end","length","isDoubleQuoted","substring","replace","trim","trimmedLine","main","config","dotenvPath","resolve","process","cwd","encoding","override","envPath","join","homedir","slice","parsed","readFileSync","Object","keys","prototype","hasOwnProperty","call","env","e","error","getProcessArgvBinIndex","versions","electron","defaultApp","camelCase","str","toLowerCase","toUpperCase","indexOf","camelcase","nextChrUpper","leadingHyphens","i","chr","charAt","mixin","assign","DOTENV_CONFIG_ENCODING","DOTENV_CONFIG_PATH","DOTENV_CONFIG_DEBUG","DOTENV_CONFIG_OVERRIDE","envOptions","re","cliOptions","args","reduce","acc","cur","matches","argv","increment","orig","undefined","sanitizeKey","minNodeVersion","YARGS_MIN_NODE_VERSION","Number","version","Error","constructor","_mixin","argsInput","opts","alias","array","boolean","configObjects","configuration","coerce","count","default","envPrefix","narg","normalize","string","number","__","argString","Array","isArray","map","prevC","c","opening","ii","tokenizeArgString","inputIsString","aliases","aliasArrays","combined","create","change","push","concat","filter","v","splice","aliasArray","lastAlias","self","pop","combineAliases","defaults","notFlagsOption","notFlagsArgv","newAliases","defaulted","format","flags","arrays","bools","strings","numbers","counts","configs","nargs","coercions","negative","negatedBoolean","RegExp","opt","assignment","entries","value","x","test","joinString","lowercase","notCamelcase","chrLower","chrString","decamelize","y","extendAliases","find","checkAllAliases","notFlags","_","argvReturn","arg","truncatedArg","broken","letters","m","next","isUnknownOptionAsArg","pushPositional","eatArray","eatNargs","setArg","defaultValue","j","maybeCoercedNumber","maybeCoerceNumber","argAfterEqualSign","toEat","isNaN","isUndefined","available","consumed","Math","min","argsToSet","nargsCount","defVal","processValue","shouldStripQuotes","prop","addNewAlias","splitKey","setKey","keyProperties","a","shift","includes","defineProperty","enumerable","get","set","stripQuotes","isSafeInteger","floor","parseFloat","setConfigObject","prev","fullKey","hasKey","applyEnvVars","configOnly","prefix","envVar","lastIndexOf","applyDefaultsAndAliases","canLog","o","isTypeArray","isValueArray","duplicate","flag","toCheck","setAlias","hasAnyFlag","flagsKeys","k","some","hasAllFlags","hasAllShortFlags","patterns","pattern","hasFlagsMatching","isUnknownOption","type","BOOLEAN","STRING","NUMBER","ARRAY","guessType","num","configLookup","configKey","configPath","resolvedConfigPath","resolveConfig","require","ex","name","setConfig","configObject","applied","Set","has","ali","add","err","applyCoercions","setPlaceholderKeys","JSON","shim$1","writeFile","exists","file","statSync","isFile","shim","Y18N","this","directory","updateFiles","locale","fallbackToLanguage","cache","writeQueue","arguments","_taggedLiteral","cb","_readLocaleFile","_enqueueWrite","apply","__n","singular","plural","quantity","one","other","values","setLocale","getLocale","updateLocale","parts","part","work","_processWriteQueue","_this","languageFile","_resolveLocaleFile","serializedLocale","stringify","localeLookup","SyntaxError","code","_fileExistsSync","__dirname","fileURLToPath","url","exit","nextTick","stdout","columns","_shim","y18n","bind","_y18n","staticOptions","hg","appName","clientApiBaseUri","HOTGLUE_CLIENT_API_BASE_URI","defaultConfigFileName","defaultOptions","getProfileConfigFilePath","getProfileConfig","async","cosmiconfig","load","getProjectConfig","cosmic","searchPlaces","search","defaultTheme","primary","chalk","whiteBright","secondary","white","info","green","warn","yellow","redBright","success","greenBright","_currentTheme","_defaultColor","setTheme","theme","funcs","print","write","themed","content","color","objString","inspect","colors","cl","contentArgs","pr","pp","setDefault","printJSON","data","Debug","extendDebug","namespace","extend","command","yargs","option","describe","json","setting","profileConfig","yamlData","YAML","filePath","filepath","mkdir","dirname","recursive","writeConfigFile","status","action","table","Table","head","projectConfig","relative","descriptions","demandText","apikey","dataFilePath","tenant","flow","tap","connector","all","jobroot","downloadTo","sourceFolder","configFilePath","overwrite","cleanup","includeConfigs","baseApiBuilder","getCombinedConfig","demandOption","strictCommands","_getFolderFiles","dir","result","includeSymLinks","matcher","fullPath","files","readdir","withFileTypes","isSymbolicLink","isDirectory","getFolderFiles","_options","micromatch","dot","filterFiles","streamToString","stream","chunks","Promise","reject","on","Buffer","from","buildChunks","chunkSize","resultArray","chunk","resetAvailableEntities","baseUri","apiKey","urlObj","URL","axios","delete","headers","genCredentialsOnClientApi","task","params","searchParams","uri","accessKeyId","secretAccessKey","sessionToken","getEnvConfig","requestSecret","getTenants","getSupportedSources","getSupportedConnectors","getLinkedSources","getLinkedConnectors","patchLinkedSourceConfig","connectorId","body","patch","patchLinkedConnectorConfig","connector_id","getSupportedFlows","getSupportedFlow","getEnvJobs","to","queryParams","countNum","parseInt","allJobs","totalJobs","page","hasMore","jobsCount","jobs","total","pageJobs","retriggerJob","payload","post","updateSchedule","user_id","schedule_expression","state","job_type","extra_args","put","getJobStatus","job_root","include_export_details","validateAvailableSources","forkedSources","flows","linkedSources","id","flat","newSourceIds","source","duplicateIds","index","missingSources","isForked","label","validateAvailableTargets","forkedTargets","linkedTargets","getSupportedTargets","newTargetIds","target","missingTargets","validateAvailableConnectors","forkedConnectors","linkedConnectors","newConnectorIds","missingConnectors","folderPrefix","spinner","ora","start","deployableFiles","fail","succeed","endsWith","fileContent","readFile","String","s3","AWS","S3","rootKey","filename","basename","Bucket","Key","Body","res","putObject","promise","deployedFiles","response","Prefix","Contents","s3Files","listObjectsV2","filesToDownload","item","downloadedFiles","fileStream","getObject","createReadStream","deploy","download","isV2Flow","envId","tenantId","flowId","fileString","getEntityLabel","isV2","keyPrefix","listObjectsRes","deleteObjectsRes","deleteObjects","Delete","Objects","object","deleteObject","splittedKey","deletedObjects","filenames","ETL_SCRIPT_BLACKLISTED_FILES","ETL_SCRIPT_BLACKLISTED_DIRECTORIES","violatedDirectory","startsWith","validateEtlScriptFiles","supportedFlow","connectors","ss","ls","filesToDelete","delParams","Quiet","relativePath","platform","subPath","existsSync","stat","exports","coll","_isArrayLike2","len","createArrayIterator","iterator","_getIterator2","done","createES2015Iterator","okeys","_isArrayLike","module","_interopRequireDefault","_getIterator","Symbol","__esModule","func","_wrapAsync","isAsync","callback","handlePromise","_initialParams2","then","_initialParams","fn","_setImmediate2","setImmediate_1","fallback","wrap","_defer","hasQueueMicrotask","queueMicrotask","hasSetImmediate","setImmediate","hasNextTick","setTimeout","defer","invokeCallback","wrapAsync_1","isAsyncIterable","isAsyncGenerator","_asyncify","_asyncify2","toStringTag","asyncFn","asyncIterator","_once","wrapper","callFn","_once2","_iterator2","_onlyOnce","_onlyOnce2","require$$3","_asyncEachOfLimit","generator","limit","iteratee","canceled","awaiting","running","replenish","iterDone","iterateeCallback","catch","handleError","_breakLoop2","_asyncEachOfLimit2","require$$5","RangeError","nextElem","looping","elem","arity","cbArgs","_eachOfLimit2","_withoutIndex","_withoutIndex2","_wrapAsync2","_awaitify2","_eachLimit2","serializeError","serialized","stack","statusText","getJobFilesList","continuationToken","allFiles","isTruncated","pageCount","requestParams","ContinuationToken","keyCount","IsTruncated","hasNextToken","NextContinuationToken","text","BucketName","S3Instance","createEnvJobFile","envConfig","jobDetailsJson","localRoot","jobEnvVars","TENANT","FLOW","flow_id","ENV_ID","env_id","JOB_ID","job_id","API_URL","JOB_ROOT","s3_root","ROOT_DIR","JOB_TYPE","CONNECTOR_ID","TAP","TARGET","API_KEY","api_key","custom_env_vars","customEnvVar","envJobFilePath","jobDetailsString","errorMessage","filesList","customCacheBucket","cache_bucket_name","customCacheS3","customCacheBucketAccessKeyId","customCacheBucketSecretAccessKey","envConfigWithSecrets","cache_bucket_access_key_id","cache_bucket_secret_access_key","customCacheFilesList","filteredFilesList","escapedJobRoot","allowedFiles","tenantConfigRegex","regex","filterFilesList","Size","LastModified","toLocaleString","skippedFiles","filesCount","filesDownloaded","eachSeries","fileName","writableStream","createWriteStream","downloadedBytes","progressPercent","toFixed","pipe","destroyed","destroy","unlink","unlinkErr","downloadJobFiles","sourceName","targetName","sourceConfigPath","targetConfigPath","fileNameFrom","fileNameTo","rename","statePath","createStateJsonFile","etl","del","setupLocalRun","sort","b","localeCompare","taps","sources","targets","list","job_name","job","uniqueFlows","flowVersions","results","jobArgs","runJob","ok","errorResult","statusCode","responseData","request","responseOrError","successCount","r","failCount","jobRoots","groupedJobs","jobRoot","groupKeys","waitForJobCompletion","maxWaitTime","startTime","Date","now","jobStatus","completed","allResults","group","groupJobRoots","groupResults","tenantIds","flowIds","reason","statusFilter","today","oneMonthAgo","setMonth","getMonth","dateFrom","toISOString","tenantIdList","t","jobTenant","flowIdList","f","jobFlow","task_arn","skip_webhooks","killJob","fromUtcIso","toUtcIso","errorMsg","formattedDateFrom","formattedDateTo","stop","s3Root","tenant_id","tap_name","rollbackJob","bulkRun","bulkRetrigger","bulkKill","bulkRollback","choices","expression","jobType","tenantList","flowList","allSchedules","includeDisabled","getScheduleList","schedules","updated","filteredSchedules","schedule","schedulesToUpdate","BATCH_SIZE","updatedSchedules","failedSchedules","batch","batchNum","totalBatches","ceil","updatePromises","scheduleExpression","scheduleState","isActive","failed","errors","originalSchedule","s","bulkUpdate","CommonPrefixes","tenantFolders","Delimiter","wasArgPassed","userSetOption","snapshots","processTenant","supportedSources","allTenants","tenantsWithCustomEtl","tenants","maybeTenantsWithCustomEtl","headObject","tenantsWithCustomFieldMap","maybeTenantsWithCustomFieldMap","deleteTenantSchedules","statu","tenantDeleted","lookupKey","patchFunction","tenantsUpdated","maybeTenantsUpdated","customEtl","customField","customCatalog","updateConfig","validateFieldAgainstSchema","streamName","field","fieldType","typing","nonNullType","validateSchemaMessage","streams","allowFuzzyTypes","schema","keyProperty","key_properties","currentSchema","newSchema","fieldSchema","properties","currentTyping","newTyping","validateSchemaMatching","keySet","nonNullTypes","validateSchemaFormat","validateRecordMessage","allowDuplicateRecords","record","pks","pk","pkHash","crypto","createHash","update","digest","validateRecordAgainstSchema","validateStateMessage","validateSingerData","remainder","lines","generateJsonLines","description","singer","validate","commands","AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE","_yargs","usage","demandCommand","epilogue","terminalWidth"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48]}
|