dotsec 4.0.0-alpha.30 → 4.0.0-alpha.32

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/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [4.0.0-alpha.32](https://github.com/jpwesselink/dotsec/compare/v4.0.0-alpha.31...v4.0.0-alpha.32) (2023-08-17)
7
+
8
+
9
+ ### Features
10
+
11
+ * **dotsec:** docs, output background color options ([2dd7d74](https://github.com/jpwesselink/dotsec/commit/2dd7d747ac3cf55165ebc410eaceb584d3978849))
12
+
13
+
14
+
15
+
16
+
17
+ # [4.0.0-alpha.31](https://github.com/jpwesselink/dotsec/compare/v4.0.0-alpha.30...v4.0.0-alpha.31) (2023-08-17)
18
+
19
+
20
+ ### Features
21
+
22
+ * **dotsec:** docs, output background color options ([328445e](https://github.com/jpwesselink/dotsec/commit/328445e7c067a532ab27b3f0667aabd060ba5109))
23
+
24
+
25
+
26
+
27
+
6
28
  # [4.0.0-alpha.30](https://github.com/jpwesselink/dotsec/compare/v4.0.0-alpha.29...v4.0.0-alpha.30) (2023-08-17)
7
29
 
8
30
  **Note:** Version bump only for package dotsec
package/dist/cli/index.js CHANGED
@@ -39,6 +39,9 @@ var defaultConfig = {
39
39
  // plugins: {
40
40
  // pke: {},
41
41
  // },
42
+ options: {
43
+ showRedacted: false
44
+ }
42
45
  }
43
46
  };
44
47
  function jsoncParse(data) {
@@ -90,9 +93,9 @@ var getMagicalConfig = async (filename) => {
90
93
  defaults: {
91
94
  ...data?.defaults,
92
95
  ...defaultConfig.defaults,
93
- output: {
94
- ...data?.defaults?.output,
95
- ...defaultConfig.defaults?.output
96
+ options: {
97
+ ...data?.defaults?.options,
98
+ ...defaultConfig.defaults?.options
96
99
  },
97
100
  plugins: {
98
101
  ...data?.defaults?.plugins,
@@ -117,13 +120,13 @@ var getMagicalConfig = async (filename) => {
117
120
  defaults: {
118
121
  ...data?.defaults,
119
122
  ...defaultConfig.defaults,
120
- output: {
121
- ...data?.defaults?.output,
122
- ...defaultConfig.defaults?.output
123
- },
124
123
  plugins: {
125
124
  ...data?.defaults?.plugins,
126
125
  ...defaultConfig.defaults?.plugins
126
+ },
127
+ options: {
128
+ ...data?.defaults?.options,
129
+ ...defaultConfig.defaults?.options
127
130
  }
128
131
  },
129
132
  push: {
@@ -380,8 +383,9 @@ var usingNoEncryptionEngineOption = {
380
383
  };
381
384
  var showRedactedOption = {
382
385
  flags: "--show-redacted",
383
- description: 'Wether to show redacted values."',
384
- env: "DOTSEC_SHOW_REDACTED"
386
+ description: "Wether to show redacted values",
387
+ env: "DOTSEC_SHOW_REDACTED",
388
+ defaultValue: false
385
389
  };
386
390
  var showOutputPrefixOption = {
387
391
  flags: "--show-output-prefix",
@@ -393,11 +397,6 @@ var outputPrefixOption = {
393
397
  description: "Output prefix",
394
398
  env: "DOTSEC_OUTPUT_PREFIX"
395
399
  };
396
- var showOutputBackgroundColorOption = {
397
- flags: "--show-output-background-color",
398
- description: "Show output background color",
399
- env: "DOTSEC_SHOW_OUTPUT_BACKGROUND_COLOR"
400
- };
401
400
  var outputBackgroundColorOption = {
402
401
  flags: "--output-background-color <outputBackgroundColor>",
403
402
  description: "Background color of the output.",
@@ -610,7 +609,6 @@ var runCommandDefaults = {
610
609
  engine: engineOption,
611
610
  showRedacted: showRedactedOption,
612
611
  outputBackgroundColor: outputBackgroundColorOption,
613
- showOutputBackgroundColor: showOutputBackgroundColorOption,
614
612
  showOutputPrefix: showOutputPrefixOption,
615
613
  outputPrefix: outputPrefixOption
616
614
  },
@@ -648,7 +646,6 @@ $ DOTSEC_USING=env npx dotsec run node -e "console.log(process.env)"
648
646
  yes: yesOption,
649
647
  showRedacted: showRedactedOption,
650
648
  outputBackgroundColor: outputBackgroundColorOption,
651
- hideOutputBackgroundColor: showOutputBackgroundColorOption,
652
649
  hideOutputPrefix: showOutputPrefixOption,
653
650
  outputPrefix: outputPrefixOption
654
651
  },
@@ -1184,7 +1181,6 @@ var addRunProgam = (program2, options) => {
1184
1181
  engine,
1185
1182
  showRedacted,
1186
1183
  outputBackgroundColor,
1187
- showOutputBackgroundColor,
1188
1184
  showOutputPrefix,
1189
1185
  outputPrefix
1190
1186
  } = command.optsWithGlobals();
@@ -1259,17 +1255,19 @@ var addRunProgam = (program2, options) => {
1259
1255
  }
1260
1256
  });
1261
1257
  cprocess.stdout.setEncoding("utf8");
1262
- let addBackgroundColor = showOutputBackgroundColor || dotsecConfig.defaults?.options?.showBackgroundColor ? chalk2__default.default.bgRedBright : (str) => str;
1263
- if (outputBackgroundColor && (showOutputBackgroundColor || dotsecConfig.defaults?.options?.showBackgroundColor)) {
1264
- if (!backgroundColors.includes(
1265
- outputBackgroundColor
1266
- )) {
1258
+ let backgroundColor = outputBackgroundColor || dotsecConfig.defaults?.options?.outputBackgroundColor;
1259
+ if (backgroundColor === true) {
1260
+ backgroundColor = "red-bright";
1261
+ }
1262
+ let addBackgroundColor = (str) => str;
1263
+ if (backgroundColor) {
1264
+ if (!backgroundColors.includes(backgroundColor)) {
1267
1265
  throw new Error(
1268
- `Invalid background color: ${outputBackgroundColor}`
1266
+ `Invalid background color: ${backgroundColor}`
1269
1267
  );
1270
1268
  }
1271
1269
  const backgroundColorFnName = camelCase.camelCase(
1272
- `bg-${outputBackgroundColor}`
1270
+ `bg-${backgroundColor}`
1273
1271
  );
1274
1272
  if (chalk2__default.default[backgroundColorFnName]) {
1275
1273
  addBackgroundColor = chalk2__default.default[backgroundColorFnName];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/constants.ts","../../src/lib/json.ts","../../src/lib/getConfig.ts","../../src/lib/loadDotsecPlugin.ts","../../src/lib/addPluginOptions.ts","../../src/lib/io.ts","../../src/lib/parse.ts","../../src/utils/logging.ts","../../src/cli/options/index.ts","../../src/types/colors.ts","../../src/cli/options/sharedOptions.ts","../../src/cli/options/decrypt.ts","../../src/cli/options/dotsec.ts","../../src/cli/options/encrypt.ts","../../src/cli/options/init.ts","../../src/cli/options/push.ts","../../src/cli/options/run.ts","../../src/cli/commands/decrypt.ts","../../src/cli/commands/encrypt.ts","../../src/cli/commands/init.ts","../../src/cli/commands/push.ts","../../src/cli/commands/run.ts"],"names":["Command","path","fs","Option","program","options","decrypt_default","addEncryptProgram","encrypt_default","init_default","handlers","push_default","chalk","expand","run_default"],"mappings":"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","sourcesContent":["import { Command } from \"commander\";\n\nimport { getMagicalConfig } from \"../lib/getConfig\";\nimport { loadDotsecPlugin } from \"../lib/loadDotsecPlugin\";\nimport {\n\tDotsecCliPluginDecryptHandler,\n\tDotsecCliPluginEncryptHandler,\n\tDotsecCliPluginPushHandler,\n\tDotsecPluginConfig,\n} from \"../types/plugin\";\nimport addDecryptProgram from \"./commands/decrypt\";\nimport addEncryptProgram from \"./commands/encrypt\";\nimport addInitCommand from \"./commands/init\";\nimport addPushProgram from \"./commands/push\";\nimport addRunCommand from \"./commands/run\";\nimport { setProgramOptions } from \"./options\";\nimport Ajv, { KeywordDefinition } from \"ajv\";\nimport yargsParser from \"yargs-parser\";\n\nconst separator: KeywordDefinition = {\n\tkeyword: \"separator\",\n\ttype: \"string\",\n\tmetaSchema: {\n\t\ttype: \"string\",\n\t\tdescription: \"value separator\",\n\t},\n\tmodifying: true,\n\tvalid: true,\n\terrors: false,\n\tcompile: (schema) => (data, ctx) => {\n\t\tif (ctx) {\n\t\t\tconst { parentData, parentDataProperty } = ctx;\n\t\t\tparentData[parentDataProperty] = data === \"\" ? [] : data.split(schema);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n};\n\nconst program = new Command();\n\n(async () => {\n\tconst parsedOptions = yargsParser(process.argv);\n\tconst argvPluginModules: string[] = [];\n\tif (parsedOptions.plugin) {\n\t\tif (Array.isArray(parsedOptions.plugin)) {\n\t\t\targvPluginModules.push(...parsedOptions.plugin);\n\t\t} else {\n\t\t\targvPluginModules.push(parsedOptions.plugin);\n\t\t}\n\t}\n\n\tconst someConfigFile = parsedOptions.configFile || parsedOptions.c;\n\n\tconst configFile =\n\t\t[\n\t\t\t...(Array.isArray(someConfigFile) ? someConfigFile : [someConfigFile]),\n\t\t]?.[0] || process.env.DOTSEC_CONFIG_FILE;\n\tconst { contents: dotsecConfig = {} } = await getMagicalConfig(configFile);\n\tconst { defaults = {}, push: pushVariables, plugins } = dotsecConfig;\n\tprogram\n\t\t.name(\"dotsec\")\n\t\t.description(\".env, but secure\")\n\t\t.version(\"1.0.0\")\n\t\t.passThroughOptions()\n\t\t.action((_options, other: Command) => {\n\t\t\tother.help();\n\t\t});\n\tsetProgramOptions({ program, dotsecConfig: dotsecConfig });\n\tconst ajv = new Ajv({\n\t\tallErrors: true,\n\t\tremoveAdditional: true,\n\t\tuseDefaults: true,\n\t\tcoerceTypes: true,\n\t\tallowUnionTypes: true,\n\t\taddUsedSchema: false,\n\t\tkeywords: [separator],\n\t});\n\t// if we have plugins in the cli, we need to define them in pluginModules\n\tconst pluginModules: { [key: string]: string } = {};\n\n\t// check plugins\n\tif (plugins) {\n\t\tfor (const pluginName of plugins) {\n\t\t\tif (!defaults?.plugins?.[pluginName]) {\n\t\t\t\tdefaults.plugins = {\n\t\t\t\t\t...defaults.plugins,\n\t\t\t\t\t[pluginName]: {},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t// check argv\n\tif (argvPluginModules.length > 0) {\n\t\tfor (const pluginModule of argvPluginModules) {\n\t\t\t// let's load em up\n\t\t\tconst plugin = await loadDotsecPlugin({ name: pluginModule });\n\n\t\t\t// good, let's fire 'em up\n\t\t\tconst loadedPlugin = await plugin({\n\t\t\t\tdotsecConfig: dotsecConfig,\n\t\t\t\tajv,\n\t\t\t\tconfigFile,\n\t\t\t});\n\t\t\tpluginModules[loadedPlugin.name] = pluginModule;\n\n\t\t\tif (argvPluginModules.length === 1) {\n\t\t\t\t// if we only have one plugin, let's set it as the default\n\t\t\t\tdotsecConfig.defaults = {\n\t\t\t\t\t...dotsecConfig.defaults,\n\t\t\t\t\tencryptionEngine: String(loadedPlugin.name),\n\t\t\t\t\tplugins: {\n\t\t\t\t\t\t...dotsecConfig.defaults?.plugins,\n\t\t\t\t\t\t[loadedPlugin.name]: {\n\t\t\t\t\t\t\t...dotsecConfig.defaults?.plugins?.[loadedPlugin.name],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tif (defaults?.encryptionEngine) {\n\t\tif (!defaults?.plugins?.[defaults.encryptionEngine]) {\n\t\t\tdefaults.plugins = {\n\t\t\t\t...defaults.plugins,\n\t\t\t\t[defaults.encryptionEngine]: {},\n\t\t\t};\n\t\t}\n\t}\n\tif (defaults?.plugins) {\n\t\tObject.entries(defaults?.plugins).forEach(\n\t\t\t([pluginName, pluginModule]: [string, DotsecPluginConfig]) => {\n\t\t\t\tif (pluginModule?.name) {\n\t\t\t\t\tpluginModules[pluginName] = pluginModule?.name;\n\t\t\t\t} else {\n\t\t\t\t\tpluginModules[pluginName] = `@dotsec/plugin-${pluginName}`;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tObject.values(pushVariables || {}).forEach((pushVariable) => {\n\t\tObject.keys(pushVariable).forEach((pluginName) => {\n\t\t\tif (!pluginModules[pluginName]) {\n\t\t\t\tpluginModules[pluginName] = `@dotsec/plugin-${pluginName}`;\n\t\t\t}\n\t\t});\n\t});\n\n\t// configure encryption command\n\tconst cliPluginEncryptHandlers: DotsecCliPluginEncryptHandler[] = [];\n\tconst cliPluginDecryptHandlers: DotsecCliPluginDecryptHandler[] = [];\n\tconst cliPluginPushHandlers: {\n\t\tpush: DotsecCliPluginPushHandler;\n\t\tdecrypt: DotsecCliPluginDecryptHandler;\n\t}[] = [];\n\n\tfor (const pluginName of Object.keys(pluginModules)) {\n\t\tconst pluginModule = pluginModules[pluginName];\n\t\tconst initDotsecPlugin = await loadDotsecPlugin({ name: pluginModule });\n\t\tconst { addCliCommand, cliHandlers: cli } = await initDotsecPlugin({\n\t\t\tajv,\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tconfigFile,\n\t\t});\n\n\t\tif (cli?.encrypt) {\n\t\t\tcliPluginEncryptHandlers.push(cli.encrypt);\n\t\t}\n\t\tif (cli?.decrypt) {\n\t\t\tcliPluginDecryptHandlers.push(cli.decrypt);\n\t\t\tif (cli?.push) {\n\t\t\t\tcliPluginPushHandlers.push({ push: cli.push, decrypt: cli.decrypt });\n\t\t\t}\n\t\t}\n\n\t\tif (addCliCommand) {\n\t\t\taddCliCommand({ program });\n\t\t}\n\t}\n\tif (cliPluginEncryptHandlers.length) {\n\t\tawait addEncryptProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tencryptHandlers: cliPluginEncryptHandlers,\n\t\t});\n\t}\n\tif (cliPluginDecryptHandlers.length) {\n\t\tawait addDecryptProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tdecryptHandlers: cliPluginDecryptHandlers,\n\t\t});\n\t}\n\tif (cliPluginPushHandlers.length) {\n\t\tawait addPushProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\thandlers: cliPluginPushHandlers,\n\t\t});\n\t}\n\n\t// add other commands\n\tawait addInitCommand(program, { dotsecConfig: dotsecConfig });\n\tawait addRunCommand(program, {\n\t\tdotsecConfig: dotsecConfig,\n\t\tdecryptHandlers: cliPluginDecryptHandlers,\n\t});\n\tawait program.parse();\n})();\n","import { DotsecConfig } from \"./types/config\";\n\nexport const DOTSEC_DEFAULT_CONFIG_FILE = \"dotsec.config.ts\";\nexport const DOTSEC_CONFIG_FILES = [DOTSEC_DEFAULT_CONFIG_FILE];\nexport const DOTSEC_DEFAULT_DOTSEC_FILENAME = \".sec\";\nexport const DOTSEC_DEFAULT_DOTENV_FILENAME = \".env\";\nexport const defaultConfig: DotsecConfig = {\n\tdefaults: {\n\t\t// encryptionEngine: \"pke\",\n\t\t// plugins: {\n\t\t// \tpke: {},\n\t\t// },\n\t},\n};\n","import fs from \"fs\";\nimport path from \"node:path\";\n\n/**\n * Parse JSONC\n * @date 12/7/2022 - 12:48:45 PM\n *\n * @export\n * @param {string} data\n * @returns {*}\n */\nexport function jsoncParse(data: string) {\n\ttry {\n\t\treturn new Function(`return ${data.trim()}`)();\n\t} catch {\n\t\t// Silently ignore any error\n\t\t// That's what tsc/jsonc-parser did after all\n\t\treturn {};\n\t}\n}\n\n/**\n * Load JSON\n * @date 12/7/2022 - 12:48:57 PM\n *\n * @async\n * @param {string} filepath\n * @returns {unknown}\n */\nexport const loadJson = async (filepath: string) => {\n\ttry {\n\t\treturn jsoncParse(await fs.promises.readFile(filepath, \"utf8\"));\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse ${path.relative(process.cwd(), filepath)}: ${\n\t\t\t\t\terror.message\n\t\t\t\t}`,\n\t\t\t);\n\t\t} else {\n\t\t\tthrow error;\n\t\t}\n\t}\n};\n","import { DOTSEC_CONFIG_FILES, defaultConfig } from \"../constants\";\nimport { DotsecConfig } from \"../types/config\";\nimport { DotsecConfigAndSource } from \"../types/plugin\";\nimport { loadJson } from \"./json\";\nimport { bundleRequire } from \"bundle-require\";\nimport JoyCon from \"joycon\";\nimport path from \"path\";\n\nexport const getMagicalConfig = async (\n\tfilename?: string,\n): Promise<DotsecConfigAndSource> => {\n\tconst cwd = process.cwd();\n\tconst configJoycon = new JoyCon();\n\tconst configPath = await configJoycon.resolve({\n\t\tfiles: filename ? [filename] : [...DOTSEC_CONFIG_FILES, \"package.json\"],\n\t\tcwd,\n\t\tstopDir: path.parse(cwd).root,\n\t\tpackageKey: \"dotsec\",\n\t});\n\tif (filename && configPath === null) {\n\t\tthrow new Error(`Could not find config file ${filename}`);\n\t}\n\tif (configPath) {\n\t\tif (configPath.endsWith(\".json\")) {\n\t\t\tconst rawData = (await loadJson(configPath)) as Partial<DotsecConfig>;\n\n\t\t\tlet data: Partial<DotsecConfig>;\n\n\t\t\tif (\n\t\t\t\tconfigPath.endsWith(\"package.json\") &&\n\t\t\t\t(rawData as { dotsec: Partial<DotsecConfig> }).dotsec !== undefined\n\t\t\t) {\n\t\t\t\tdata = (rawData as { dotsec: Partial<DotsecConfig> }).dotsec;\n\t\t\t} else {\n\t\t\t\tdata = rawData as Partial<DotsecConfig>;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsource: \"json\",\n\t\t\t\tcontents: {\n\t\t\t\t\t...defaultConfig,\n\t\t\t\t\t...data,\n\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t...data?.defaults,\n\t\t\t\t\t\t...defaultConfig.defaults,\n\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\t...data?.defaults?.output,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.output,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t...data?.defaults?.plugins,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.plugins,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tpush: {\n\t\t\t\t\t\t...data?.push,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t} else if (configPath.endsWith(\".ts\")) {\n\t\t\tconst bundleRequireResult = await bundleRequire({\n\t\t\t\tfilepath: configPath,\n\t\t\t});\n\t\t\tconst data = (bundleRequireResult.mod.dotsec ||\n\t\t\t\tbundleRequireResult.mod.default ||\n\t\t\t\tbundleRequireResult.mod) as Partial<DotsecConfig>;\n\n\t\t\treturn {\n\t\t\t\tsource: \"ts\",\n\t\t\t\tcontents: {\n\t\t\t\t\t...defaultConfig,\n\t\t\t\t\t...data,\n\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t...data?.defaults,\n\t\t\t\t\t\t...defaultConfig.defaults,\n\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\t...data?.defaults?.output,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.output,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t...data?.defaults?.plugins,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.plugins,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tpush: {\n\t\t\t\t\t\t...data?.push,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\treturn { source: \"defaultConfig\", contents: defaultConfig };\n};\n","import { DotsecPluginModule } from \"../types/plugin\";\n\nexport const loadDotsecPlugin = async (options: {\n\tname: string;\n}): Promise<DotsecPluginModule> => {\n\treturn import(options.name).then((imported) => {\n\t\treturn imported.default;\n\t});\n};\n","import { DotsecCliOption } from \"../types/plugin\";\nimport { Command, Option } from \"commander\";\n\nexport const addPluginOptions = (\n\toptions:\n\t\t| {\n\t\t\t\t[x: string]: DotsecCliOption;\n\t\t }\n\t\t| undefined,\n\tcommand: Command,\n\tmandatory?: boolean,\n) => {\n\tif (options) {\n\t\tObject.values(options).map((option) => {\n\t\t\tlet optionProps:\n\t\t\t\t| {\n\t\t\t\t\t\tflags: string;\n\t\t\t\t\t\tdescription?: string;\n\t\t\t\t\t\tdefaultValue?: string | boolean | string[];\n\t\t\t\t\t\tchoices?: string[];\n\t\t\t\t\t\tfn?: (value: string, previous: unknown) => unknown;\n\t\t\t\t\t\tregexp?: RegExp;\n\t\t\t\t\t\tenv?: string;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t\tif (Array.isArray(option)) {\n\t\t\t\tconst [flags, description, defaultValue] = option;\n\t\t\t\toptionProps = {\n\t\t\t\t\tflags,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst { flags, description, defaultValue, choices, env, fn } = option;\n\t\t\t\toptionProps = {\n\t\t\t\t\tflags,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t\tchoices,\n\t\t\t\t\tenv,\n\t\t\t\t\tfn,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optionProps) {\n\t\t\t\tconst newOption = new Option(\n\t\t\t\t\toptionProps.flags,\n\t\t\t\t\toptionProps.description,\n\t\t\t\t);\n\t\t\t\tif (optionProps.fn) {\n\t\t\t\t\tnewOption.argParser(optionProps.fn);\n\t\t\t\t}\n\t\t\t\tif (optionProps.defaultValue) {\n\t\t\t\t\tnewOption.default(optionProps.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (optionProps.env) {\n\t\t\t\t\tnewOption.env(optionProps.env);\n\t\t\t\t}\n\t\t\t\tif (mandatory) {\n\t\t\t\t\tnewOption.makeOptionMandatory(true);\n\t\t\t\t}\n\t\t\t\tif (optionProps.choices) {\n\t\t\t\t\tnewOption.choices(optionProps.choices);\n\t\t\t\t}\n\t\t\t\tcommand.addOption(newOption);\n\t\t\t}\n\t\t});\n\t}\n};\n","import fs, { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nexport const readContentsFromFile = async (\n\tfilePath: string,\n): Promise<string> => {\n\treturn await fs.readFile(filePath, \"utf-8\");\n};\n\nexport const writeContentsToFile = async (\n\tfilePath: string,\n\tcontents: string,\n): Promise<void> => {\n\treturn await fs.writeFile(filePath, contents, \"utf-8\");\n};\n\nexport const fileExists = async (source: string): Promise<boolean> => {\n\ttry {\n\t\tawait stat(source);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const promptOverwriteIfFileExists = async ({\n\tfilePath,\n\tskip,\n}: {\n\tfilePath: string;\n\tskip?: boolean;\n}) => {\n\tlet overwriteResponse: prompts.Answers<\"overwrite\"> | undefined;\n\n\tif ((await fileExists(filePath)) && skip !== true) {\n\t\toverwriteResponse = await prompts({\n\t\t\ttype: \"confirm\",\n\t\t\tname: \"overwrite\",\n\t\t\tmessage: () => {\n\t\t\t\treturn `Overwrite './${path.relative(process.cwd(), filePath)}' ?`;\n\t\t\t},\n\t\t});\n\t} else {\n\t\toverwriteResponse = undefined;\n\t}\n\treturn overwriteResponse;\n};\n","const LINE =\n\t/^(#.*)|(\\s?\\r?\\n)|(?:^|^)\\s*(?:export\\s+)?([\\w.-]*)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?(\\s*)(#.*)?(?:$|$)/gm;\n\nexport type ParseResult = {\n\ttype: \"value\" | \"comment\" | \"whitespace\";\n\tkey?: string;\n\tvalue?: string;\n\traw?: string;\n}[];\n\n// Parser src into an Object\nexport const parse = (src: string) => {\n\tconst obj: Record<string, string> = {};\n\tconst blocks: ParseResult = [];\n\n\t// Convert buffer to string\n\tlet lines = src.toString();\n\n\t// Convert line breaks to same format\n\tlines = lines.replace(/\\r\\n?/gm, \"\\n\");\n\n\tlet match;\n\twhile ((match = LINE.exec(lines)) != null) {\n\t\tconst key = match[3];\n\n\t\tif (match?.[1]?.[0] === \"#\") {\n\t\t\tblocks.push({ type: \"comment\", raw: match[1] });\n\t\t} else if (match?.[2]) {\n\t\t\tblocks.push({ type: \"whitespace\", raw: match[2] });\n\t\t} else {\n\t\t\t// Default undefined or null to empty string\n\t\t\tlet value = match[4] || \"\";\n\n\t\t\t// Remove whitespace\n\t\t\tvalue = value.trim();\n\n\t\t\t// Check if double quoted\n\t\t\tconst maybeQuote = value[0];\n\n\t\t\t// Remove surrounding quotes\n\t\t\tvalue = value.replace(/^(['\"`])([\\s\\S]*)\\1$/gm, \"$2\");\n\n\t\t\t// Expand newlines if double quoted\n\t\t\tif (maybeQuote === '\"') {\n\t\t\t\tvalue = value.replace(/\\\\n/g, \"\\n\");\n\t\t\t\tvalue = value.replace(/\\\\r/g, \"\\r\");\n\t\t\t}\n\n\t\t\tobj[key] = value;\n\n\t\t\t// Add to object\n\t\t\tblocks.push({\n\t\t\t\ttype: \"value\",\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t\traw: value + (match[5] ? match[5] : \"\") + (match[6] ? match[6] : \"\"),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { blocks, obj };\n};\n\nif (import.meta.vitest) {\n\tconst { it, expect } = import.meta.vitest;\n\n\tit(\"parse\", () => {\n\t\tconst input1 = \"KEY=value\";\n\t\tconst input2 = 'KEY=\"value\"';\n\t\tconst input3 = \"KEY='value'\";\n\t\tconst input4 = \"KEY=value # this is a comment\";\n\n\t\t// const expectedResult1 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: 'value' },\n\t\t// ];\n\t\t// const expectedResult2 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: '\"value\"' },\n\t\t// ];\n\t\t// const expectedResult3 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: \"'value'\" },\n\t\t// ];\n\t\t// const expectedResult4 = [\n\t\t// {\n\t\t// type: 'value',\n\t\t// key: 'KEY',\n\t\t// value: 'value',\n\t\t// raw: 'value # this is a comment',\n\t\t// },\n\t\t// ];\n\n\t\texpect(parse(input1)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input2)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input3)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input4)).toMatchInlineSnapshot(`\n {\n \"blocks\": [\n {\n \"key\": \"KEY\",\n \"raw\": \"value# this is a comment\",\n \"type\": \"value\",\n \"value\": \"value\",\n },\n ],\n \"obj\": {\n \"KEY\": \"value\",\n },\n }\n `);\n\t});\n}\n","import chalk from \"chalk\";\nimport Table from \"cli-table\";\nexport { Table };\n\nlet _logger: Pick<Console, \"info\" | \"error\" | \"table\">;\nexport const getLogger = () => {\n\tif (!_logger) {\n\t\t_logger = console;\n\t}\n\n\treturn _logger;\n};\nexport const writeLine = (str: string) => {\n\tprocess.stdout.write(str);\n};\nexport const emphasis = (str: string): string => chalk.yellowBright(str);\nexport const strong = (str: string): string => chalk.yellow.bold(str);\n\nexport const clientLogger = {\n\tdebug(content: object) {\n\t\tconsole.log(content);\n\t},\n\tinfo(content: object) {\n\t\tconsole.log(content);\n\t},\n\twarn(content: object) {\n\t\tconsole.log(content);\n\t},\n\terror(content: object) {\n\t\tconsole.error(content);\n\t},\n};\n","import { DotsecConfig } from \"../../types/index\";\nimport { Command, Option } from \"commander\";\n\nimport decryptCommandDefaults from \"./decrypt\";\nimport dotsecCommandDefaults from \"./dotsec\";\nimport encryptCommandDefaults from \"./encrypt\";\nimport initCommandDefaults from \"./init\";\nimport pushCommandDefaults from \"./push\";\nimport runCommandDefaults from \"./run\";\nimport {\n\tCommandOption,\n\tDeepExpandedCommandOption,\n\tDotSecCommandsDefaults,\n\tExpandedCommandOption,\n} from \"./types\";\n\nexport const commandOptions: DotSecCommandsDefaults = {\n\t...dotsecCommandDefaults,\n\t...initCommandDefaults,\n\t...encryptCommandDefaults,\n\t...decryptCommandDefaults,\n\t...runCommandDefaults,\n\t...pushCommandDefaults,\n};\n\nconst expandCommandOption = (\n\tcommandOption: CommandOption | ExpandedCommandOption,\n): DeepExpandedCommandOption => {\n\tif (Array.isArray(commandOption)) {\n\t\tconst [flags, description, defaultValue] = commandOption;\n\t\tconst optionProps = {\n\t\t\tflags,\n\t\t\tdescription,\n\t\t\tdefaultValue,\n\t\t};\n\t\treturn optionProps;\n\t} else {\n\t\tif (\"option\" in commandOption) {\n\t\t\tconst [flags, description, defaultValue] = commandOption.option;\n\t\t\tconst optionProps = {\n\t\t\t\tflags,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue,\n\t\t\t\tenv: commandOption.env,\n\t\t\t};\n\t\t\treturn optionProps;\n\t\t}\n\t\treturn commandOption;\n\t}\n};\n\nconst createOption = (\n\tcommandOption: CommandOption | ExpandedCommandOption,\n\toptions: {\n\t\trequired?: boolean;\n\t\tdotsecConfig?: DotsecConfig;\n\t\toptionKey: string;\n\t},\n): Option => {\n\tconst defaultOptionValueFromConfig =\n\t\toptions?.dotsecConfig?.defaults?.options?.[options?.optionKey];\n\tconst optionProps = expandCommandOption(commandOption);\n\n\tconst newOption = new Option(optionProps.flags, optionProps.description);\n\tif (optionProps.fn) {\n\t\tnewOption.argParser(optionProps.fn);\n\t}\n\tif (optionProps.defaultValue) {\n\t\tnewOption.default(defaultOptionValueFromConfig || optionProps.defaultValue);\n\t}\n\tif (optionProps.env) {\n\t\tnewOption.env(optionProps.env);\n\t}\n\tif (options.required) {\n\t\tnewOption.makeOptionMandatory(true);\n\t}\n\tif (optionProps.choices) {\n\t\tnewOption.choices(optionProps.choices);\n\t}\n\n\treturn newOption;\n};\n\nexport const setProgramOptions = (params: {\n\tprogram: Command;\n\tcommandName?: string;\n\tdotsecConfig: DotsecConfig;\n}) => {\n\tconst { program, commandName, dotsecConfig } = params;\n\tconst programOptions = commandOptions[commandName || program.name()];\n\n\tif (programOptions) {\n\t\tconst { options, requiredOptions, description, usage, helpText } =\n\t\t\tprogramOptions;\n\t\tif (options) {\n\t\t\tObject.keys(options).forEach((optionKey) => {\n\t\t\t\tconst commandOption = options[optionKey];\n\t\t\t\tconst newOption = createOption(commandOption, {\n\t\t\t\t\tdotsecConfig,\n\t\t\t\t\toptionKey,\n\t\t\t\t});\n\n\t\t\t\tprogram.addOption(newOption);\n\t\t\t});\n\t\t}\n\t\tif (requiredOptions) {\n\t\t\tObject.keys(requiredOptions).forEach((requiredOptionKey) => {\n\t\t\t\tconst requiredOption = requiredOptions[requiredOptionKey];\n\t\t\t\tconst newOption = createOption(requiredOption, {\n\t\t\t\t\trequired: true,\n\t\t\t\t\tdotsecConfig,\n\t\t\t\t\toptionKey: requiredOptionKey,\n\t\t\t\t});\n\n\t\t\t\tprogram.addOption(newOption);\n\t\t\t});\n\t\t}\n\t\tif (description) {\n\t\t\tprogram.description(description);\n\t\t}\n\t\tif (usage) {\n\t\t\tprogram.usage(usage);\n\t\t}\n\t\tif (helpText) {\n\t\t\tprogram.description(helpText);\n\t\t}\n\t}\n};\n","export const backgroundColors = [\n\t\"black\",\n\t\"red\",\n\t\"green\",\n\t\"yellow\",\n\t\"blue\",\n\t\"magenta\",\n\t\"cyan\",\n\t\"white\",\n\t\"black-bright\",\n\t\"gray\",\n\t\"grey\",\n\t\"red-bright\",\n\t\"green-bright\",\n\t\"yellow-bright\",\n\t\"blue-bright\",\n\t\"magenta-bright\",\n\t\"cyan-bright\",\n\t\"white-bright\",\n] as const;\n\nexport type BackgroundColor = typeof backgroundColors[number];\n","import {\n\tDOTSEC_DEFAULT_DOTENV_FILENAME,\n\tDOTSEC_DEFAULT_DOTSEC_FILENAME,\n} from \"../../constants\";\nimport { backgroundColors } from \"../../types/colors\";\nimport { ExpandedCommandOption } from \"./types\";\n\nexport const envFileOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--env-file <envFile>\",\n\t\t`Path to .env file. If not provided, will look for value in 'ENV_FILE' environment variable. If not provided, will look for '${DOTSEC_DEFAULT_DOTENV_FILENAME}' file in current directory.`,\n\t\tDOTSEC_DEFAULT_DOTENV_FILENAME,\n\t],\n\tenv: \"ENV_FILE\",\n};\nexport const secFileOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--sec-file, <secFile>\",\n\t\t`Path to .sec file. If not provided, will look for value in 'SEC_FILE' environment variable. If not provided, will look for '${DOTSEC_DEFAULT_DOTSEC_FILENAME}' file in current directory.`,\n\t\tDOTSEC_DEFAULT_DOTSEC_FILENAME,\n\t],\n\tenv: \"SEC_FILE\",\n};\n\nexport const usingOption: ExpandedCommandOption = {\n\tflags: \"--using <using>\",\n\tdescription: \"Wether to use a dot env file or a dot sec file\",\n\tchoices: [\"env\", \"sec\"],\n\tenv: \"DOTSEC_USING\",\n};\n\nexport const usingNoEncryptionEngineOption: ExpandedCommandOption = {\n\tflags: \"--using <using>\",\n\tdescription: \"Wether to use a dot env file or a dot sec file\",\n\tchoices: [\"env\"],\n\tenv: \"DOTSEC_USING\",\n};\n\nexport const showRedactedOption: ExpandedCommandOption = {\n\tflags: \"--show-redacted\",\n\tdescription: 'Wether to show redacted values.\"',\n\tenv: \"DOTSEC_SHOW_REDACTED\",\n};\n\nexport const embellishOutputOption: ExpandedCommandOption = {\n\tflags: \"--embellish-output\",\n\tdescription:\n\t\t\"Show embellished output, with (dotsec) prefix, and background color\",\n\tenv: \"DOTSEC_EMBELLISH_OUTPUT\",\n};\n\nexport const showOutputPrefixOption: ExpandedCommandOption = {\n\tflags: \"--show-output-prefix\",\n\tdescription: \"Show output prefix\",\n\tenv: \"DOTSEC_SHOW_OUTPUT_PREFIX\",\n};\nexport const outputPrefixOption: ExpandedCommandOption = {\n\tflags: \"--output-prefix <outputPrefix>\",\n\tdescription: \"Output prefix\",\n\tenv: \"DOTSEC_OUTPUT_PREFIX\",\n};\n\nexport const showOutputBackgroundColorOption: ExpandedCommandOption = {\n\tflags: \"--show-output-background-color\",\n\tdescription: \"Show output background color\",\n\tenv: \"DOTSEC_SHOW_OUTPUT_BACKGROUND_COLOR\",\n};\n\nexport const outputBackgroundColorOption: ExpandedCommandOption = {\n\tflags: \"--output-background-color <outputBackgroundColor>\",\n\tdescription: \"Background color of the output.\",\n\tenv: \"DOTSEC_OUTPUT_BACKGROUND_COLOR\",\n\tchoices: backgroundColors as unknown as string[],\n\tdefaultValue: \"red-bright\",\n};\n\nexport const yesOption: ExpandedCommandOption = {\n\toption: [\"--yes\", \"Skip confirmation prompts\"],\n};\n\nexport const verboseOption: ExpandedCommandOption = {\n\toption: [\"--verbose\", \"Verbose output\"],\n};\n\nexport const configFileOption: ExpandedCommandOption = {\n\toption: [\"-c, --config-file, --configFile <configFile>\", \"Config file\"],\n\tenv: \"DOTSEC_CONFIG_FILE\",\n};\n\nexport const pluginOption: ExpandedCommandOption = {\n\toption: [\"--plugin <plugin>\", \"Comma-separated list of plugins to use\"],\n\tenv: \"DOTSEC_PLUGIN\",\n};\n\nexport const engineOption: ExpandedCommandOption = {\n\toption: [\"--engine <engine>\", \"Encryption engine to use\"],\n\tenv: \"DOTSEC_ENGINE\",\n};\n\nexport const createManifestOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--create-manifest\",\n\t\t\"Create a markdown manifest file. See the --manifest-file option for more information.\",\n\t],\n\tenv: \"CREATE_MANIFEST\",\n};\n\nexport const manifestFilePrefixOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--manifest-file-prefix <manifestFilePrefix>\",\n\t\t\"Mmanifest file prefix\",\n\t],\n\tenv: \"ENCRYPTION_MANIFEST_FILE\",\n};\n","import {\n\tconfigFileOption,\n\tcreateManifestOption,\n\tenvFileOption,\n\tmanifestFilePrefixOption,\n\tsecFileOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst decryptCommandDefaults: DotSecCommandsDefaults = {\n\tdecrypt: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tcreateManifest: createManifestOption,\n\t\t\tmanifestFilePrefix: manifestFilePrefixOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription: \"Decrypt a sec file\",\n\t\thelpText: `Examples:\n\n\nDecrypt .sec file to .env file\n\n$ npx dotsec decrypt\n\n\nSpecify a different .sec file\n\n$ npx dotsec decrypt --sec-file .sec.dev\n$ SEC_FILE=.sec.dev npx dotsec decrypt\n\nSpecify a different .env file\n\n$ npx dotsec decrypt --env-file .env.dev\n$ ENV_FILE=.env.dev npx dotsec decrypt\n\nWrite a manifest markdown file\n\n$ npx dotsec decrypt --create-manifest\n$ CREATE_MANIFEST=true npx dotsec decrypt\n\nSpecify a different manifest file\n\n$ npx dotsec decrypt --manifest-file .manifest.dev\n$ MANIFEST_FILE=decryption-manifest.md npx dotsec decrypt\n`,\n\t},\n};\n\nexport default decryptCommandDefaults;\n","import { configFileOption, pluginOption } from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst dotsecCommandDefaults: DotSecCommandsDefaults = {\n\tdotsec: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tplugin: pluginOption,\n\t\t},\n\t},\n};\n\nexport default dotsecCommandDefaults;\n","import {\n\tconfigFileOption,\n\tcreateManifestOption,\n\tenvFileOption,\n\tmanifestFilePrefixOption,\n\tsecFileOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst encryptCommandDefaults: DotSecCommandsDefaults = {\n\tencrypt: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tcreateManifest: createManifestOption,\n\t\t\tmanifestFile: manifestFilePrefixOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription: \"Encrypt an env file\",\n\t\thelpText: `Examples:\n\n\nEncrypt .env file to .sec file\n\n$ npx dotsec encrypt\n\n\nSpecify a different .env file\n\n$ npx dotsec encrypt --env-file .env.dev\n$ ENV_FILE=.env.dev npx dotsec encrypt\n\n\nSpecify a different .sec file\n\n$ npx dotsec encrypt --sec-file .sec.dev\n$ SEC_FILE=.sec.dev npx dotsec encrypt\n\n\nWrite a manifest markdown file\n\n$ npx dotsec encrypt --create-manifest\n$ CREATE_MANIFEST=true npx dotsec encrypt\n\n\nSpecify a different manifest file\n\n$ npx dotsec encrypt --manifest-file manifest.dev\n$ MANIFEST_FILE=encryption-manifest.md npx dotsec encrypt\n`,\n\t},\n};\n\nexport default encryptCommandDefaults;\n","import { configFileOption, yesOption } from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst initCommandDefaults: DotSecCommandsDefaults = {\n\tinit: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription:\n\t\t\t\"Initialize a dotsec project by creating a dotsec.config.ts file.\",\n\t\thelpText: `Examples:\n\nCreate a dotsec.config.ts file in the current directory\n\n$ npx dotsec init\n\n\nOverwrite an existing dotsec.config.ts file in the current directory\n\n$ npx dotsec init --yes\n\n\nCreate a dotsec config file in the current directory with a specific config file name\n\nBy specifying the --config-file option, you can create a dotsec config file with a specific name.\n\n$ npx dotsec init --config-file dotsec.config.ts\n\n$ DOTSEC_CONFIG_FILE=my.config.ts npx dotsec init\n`,\n\t},\n};\n\nexport default initCommandDefaults;\n","import {\n\tconfigFileOption,\n\tenvFileOption,\n\tsecFileOption,\n\tusingOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst pushCommandDefaults: DotSecCommandsDefaults = {\n\tpush: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingOption,\n\t\t},\n\t\tdescription: \"Push variables from env or sec file to a remote\",\n\t\thelpText: `Examples:\n\nPush variables from .env file to remote\n\n$ npx dotsec push --using env\n$ DOTSEC_USING=env npx dotsec push\n\n\nPush variables from .sec file to remote\n\n$ npx dotsec push --using sec\n$ DOTSEC_USING=sec npx dotsec push\n`,\n\t},\n};\n\nexport default pushCommandDefaults;\n","import {\n\tconfigFileOption,\n\tengineOption,\n\tenvFileOption,\n\toutputBackgroundColorOption,\n\toutputPrefixOption,\n\tsecFileOption,\n\tshowOutputBackgroundColorOption,\n\tshowOutputPrefixOption,\n\tshowRedactedOption,\n\tusingNoEncryptionEngineOption,\n\tusingOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n/*\n\nrun --env-file=.env --sec-file=.sec --with=env-file\n\n*/\nconst runCommandDefaults: DotSecCommandsDefaults = {\n\trunEnvOnly: {\n\t\tusage: \"--using env [commandArgs...]\",\n\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tyes: yesOption,\n\t\t\tengine: engineOption,\n\t\t\tshowRedacted: showRedactedOption,\n\t\t\toutputBackgroundColor: outputBackgroundColorOption,\n\t\t\tshowOutputBackgroundColor: showOutputBackgroundColorOption,\n\t\t\tshowOutputPrefix: showOutputPrefixOption,\n\t\t\toutputPrefix: outputPrefixOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingNoEncryptionEngineOption,\n\t\t},\n\n\t\tdescription:\n\t\t\t\"Run a command in a separate process and populate env with contents of a dotenv file.\",\n\t\thelpText: `Examples:\n\t\t\nRun a command with a .env file\n\t\t\n$ npx dotsec run --using env node -e \\\"console.log(process.env)\\\"\n\n\nRun a command with a specific .env file\n\n$ npx dotsec run --using env --env-file .env node -e \\\"console.log(process.env)\\\"\n\n\nRun a command with a specific ENV_FILE variable\n\n$ ENV_FILE=.env.dev npx dotsec run --using env node -e \\\"console.log(process.env)\\\"\n\n\nYou can also specify 'using' as an environment variable\n\n$ DOTSEC_USING=env npx dotsec run node -e \\\"console.log(process.env)\\\"\n\t\t`,\n\t},\n\trun: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tyes: yesOption,\n\t\t\tshowRedacted: showRedactedOption,\n\t\t\toutputBackgroundColor: outputBackgroundColorOption,\n\t\t\thideOutputBackgroundColor: showOutputBackgroundColorOption,\n\t\t\thideOutputPrefix: showOutputPrefixOption,\n\t\t\toutputPrefix: outputPrefixOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingOption,\n\t\t},\n\n\t\tusage: \"[--using env] [--using sec] [commandArgs...]\",\n\t\tdescription: `Run a command in a separate process and populate env with either \n\t\t\t- contents of a dotenv file\n\t\t\t- decrypted values of a dotsec file.\n\nThe --withEnv option will take precedence over the --withSec option. If neither are specified, the --withEnv option will be used by default.`,\n\t\thelpText: `${\"Examples:\"}\n\n${\"Run a command with a .env file\"}\n\n$ dotsec run echo \"hello world\"\n\n\n${\"Run a command with a specific .env file\"}\n\n$ dotsec run --with-env --env-file .env.dev echo \"hello world\"\n\n\n${\"Run a command with a .sec file\"}\n\n$ dotsec run --with-sec echo \"hello world\"\n\n\n${\"Run a command with a specific .sec file\"}\n\n$ dotsec run --with-sec --sec-file .sec.dev echo \"hello world\"\n`,\n\t},\n\t// push: {\n\t// \toptions: {\n\t// \t\t...dotsecCommandDefaults.dotsec.options,\n\t// \t\twithEnv: withEnvOption,\n\t// \t\twithSec: withSecOption,\n\t// \t\tenvFile: envFileOption,\n\t// \t\tsecFile: secFileOption,\n\t// \t\tyes: yesOption,\n\t// \t},\n\t// \trequiredOptions: {\n\t// \t\t...dotsecCommandDefaults.dotsec.requiredOptions,\n\t// \t},\n\t// },\n};\n\nexport default runCommandDefaults;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { parse } from \"../../lib/parse\";\nimport { DecryptCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginDecryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { Command } from \"commander\";\n\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n} & Record<string, unknown>;\n\nconst addEncryptProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\tdecryptHandlers: DotsecCliPluginDecryptHandler[];\n\t},\n) => {\n\tconst { dotsecConfig, decryptHandlers } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"decrypt\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tcreateManifest,\n\t\t\t\t\tmanifestFile,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<DecryptCommandOptions>();\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\tconst pluginCliDecrypt = (decryptHandlers || []).find((handler) => {\n\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t});\n\n\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${options.decryptHandlers\n\t\t\t\t\t\t\t.map((e) => `--${e.triggerOptionValue}`)\n\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t\"Decrypting with\",\n\t\t\t\t\tstrong(\n\t\t\t\t\t\tpluginCliDecrypt.encryptionEngineName ||\n\t\t\t\t\t\t\tpluginCliDecrypt.triggerOptionValue,\n\t\t\t\t\t),\n\t\t\t\t\t\"engine\",\n\t\t\t\t);\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliDecrypt.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliDecrypt.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\t// get current dot env file\n\t\t\t\tconst dotsecString = await readContentsFromFile(secFile);\n\n\t\t\t\tconst plaintext = await pluginCliDecrypt.handler({\n\t\t\t\t\tciphertext: dotsecString,\n\t\t\t\t\t...allOptionsValues,\n\t\t\t\t});\n\n\t\t\t\tconst dotenvOverwriteResponse = await promptOverwriteIfFileExists({\n\t\t\t\t\tfilePath: envFile,\n\t\t\t\t\tskip: yes,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tdotenvOverwriteResponse === undefined ||\n\t\t\t\t\tdotenvOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(envFile, plaintext);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote plaintext contents of ${strong(secFile)} file to ${strong(\n\t\t\t\t\t\t\tenvFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (createManifest || dotsecConfig?.defaults?.options?.createManifest) {\n\t\t\t\t\t// parse raw env contents into key value pairs using the dotenv package\n\t\t\t\t\tconst dotenvVars = parse(plaintext).obj;\n\t\t\t\t\t// expand env vars\n\t\t\t\t\tconst markdownManifest = `# Dotsec decryption manifest\n\n## Overview\n\n- plaintext source: ${envFile}\n- ciphertext target: ${secFile}\n- created: ${new Date().toUTCString()}\n- Decryption engine: ${\n\t\t\t\t\t\tpluginCliDecrypt.encryptionEngineName ||\n\t\t\t\t\t\tpluginCliDecrypt.triggerOptionValue\n\t\t\t\t\t}\n- Decryption engine options: ${JSON.stringify(allOptionsValues)}\n\n## Variables\n\n| Key |\n| --- |\n${Object.keys(dotenvVars)\n\t.map((key) => {\n\t\treturn `| \\`${key} \\`| `;\n\t})\n\t.join(\"\\n\")}\n`;\n\n\t\t\t\t\t// write manifest file, don't prompt to overwrite\n\t\t\t\t\tconst manifestTargetFile =\n\t\t\t\t\t\tmanifestFile || `${envFile}.decryption-manifest.md`;\n\t\t\t\t\tawait writeContentsToFile(manifestTargetFile, markdownManifest);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote manifest of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\tmanifestTargetFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\tcommand.help();\n\t\t\t}\n\t\t});\n\n\toptions.decryptHandlers.map((decryption) => {\n\t\tconst { options, requiredOptions } = decryption;\n\t\taddPluginOptions(options, subProgram);\n\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t});\n\n\tconst engines = options.decryptHandlers.map((e) => e.triggerOptionValue);\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"} to use: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\n\treturn subProgram;\n};\n\nexport default addEncryptProgram;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { parse } from \"../../lib/parse\";\nimport { EncryptCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginEncryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { Command } from \"commander\";\n\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n} & Record<string, unknown>;\n\nconst addEncryptProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tencryptHandlers: DotsecCliPluginEncryptHandler[];\n\t\tdotsecConfig: DotsecConfig;\n\t},\n) => {\n\tconst { encryptHandlers, dotsecConfig } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"encrypt\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tcreateManifest,\n\t\t\t\t\tmanifestFile,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<EncryptCommandOptions>();\n\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\t\t\t\tconst pluginCliEncrypt = (encryptHandlers || []).find((handler) => {\n\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t});\n\n\t\t\t\tif (!pluginCliEncrypt) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No encryption plugin found, available encryption engine(s): ${options.encryptHandlers\n\t\t\t\t\t\t\t.map((e) => e.triggerOptionValue)\n\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliEncrypt.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliEncrypt.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst dotenvString = await readContentsFromFile(envFile);\n\t\t\t\tlet dotsecString: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tdotsecString = await readContentsFromFile(secFile);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t\tconst cipherText = await pluginCliEncrypt.handler({\n\t\t\t\t\tplaintext: dotenvString,\n\t\t\t\t\tciphertext: dotsecString,\n\t\t\t\t\t...allOptionsValues,\n\t\t\t\t});\n\n\t\t\t\tconst dotsecOverwriteResponse = await promptOverwriteIfFileExists({\n\t\t\t\t\tfilePath: secFile,\n\t\t\t\t\tskip: yes,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tdotsecOverwriteResponse === undefined ||\n\t\t\t\t\tdotsecOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(secFile, cipherText);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote encrypted contents of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\tsecFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tcreateManifest ||\n\t\t\t\t\t\tdotsecConfig?.defaults?.options?.createManifest\n\t\t\t\t\t) {\n\t\t\t\t\t\t// parse raw env contents into key value pairs using the dotenv package\n\t\t\t\t\t\tconst dotenvVars = parse(dotenvString).obj;\n\t\t\t\t\t\t// expand env vars\n\t\t\t\t\t\tconst markdownManifest = `# Dotsec encryption manifest \n\n## Overview\n\n- plaintext source: ${envFile}\n- ciphertext target: ${secFile}\n- created: ${new Date().toUTCString()}\n- encryption engine: ${\n\t\t\t\t\t\t\tpluginCliEncrypt.encryptionEngineName ||\n\t\t\t\t\t\t\tpluginCliEncrypt.triggerOptionValue\n\t\t\t\t\t\t}\n- encryption engine options: ${JSON.stringify(allOptionsValues)}\n\n## Variables\n\n| Key | \n| --- | \n${Object.keys(dotenvVars)\n\t.map((key) => {\n\t\treturn `| \\`${key} \\`| `;\n\t})\n\t.join(\"\\n\")}\n`;\n\n\t\t\t\t\t\t// write manifest file, don't prompt to overwrite\n\t\t\t\t\t\tconst manifestTargetFile =\n\t\t\t\t\t\t\tmanifestFile || `${secFile}.encryption-manifest.md`;\n\t\t\t\t\t\tawait writeContentsToFile(manifestTargetFile, markdownManifest);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`Wrote manifest of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\t\tmanifestTargetFile,\n\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\tcommand.help();\n\t\t\t}\n\t\t});\n\n\toptions.encryptHandlers.map((encryptionHandler) => {\n\t\tconst { options, requiredOptions } = encryptionHandler;\n\t\taddPluginOptions(options, subProgram);\n\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t});\n\tconst engines = options.encryptHandlers.map((e) => e.triggerOptionValue);\n\tconst encryptionEngineNames = options.encryptHandlers.map(\n\t\t(e) => e.encryptionEngineName,\n\t);\n\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"}: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\tsubProgram.description(\n\t\t`Encrypt .env file using ${encryptionEngineNames.join(\", \")}`,\n\t);\n\treturn subProgram;\n};\n\nexport default addEncryptProgram;\n","import {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { DotsecConfig, InitCommandOptions } from \"../../types\";\nimport { Command } from \"commander\";\n\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport path from \"node:path\";\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n};\n\nconst addInitProgram = async (\n\tprogram: Command,\n\toptions: { dotsecConfig: DotsecConfig },\n) => {\n\tconst { dotsecConfig } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"init\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\tconst { configFile = \"dotsec.config.ts\", yes } =\n\t\t\t\tcommand.optsWithGlobals<InitCommandOptions>();\n\t\t\ttry {\n\t\t\t\tconst configTemplate = await readContentsFromFile(\n\t\t\t\t\tpath.resolve(__dirname, \"../../src/templates/dotsec.config.ts\"),\n\t\t\t\t);\n\n\t\t\t\tconst dotsecConfigOverwriteResponse = await promptOverwriteIfFileExists(\n\t\t\t\t\t{\n\t\t\t\t\t\tfilePath: configFile,\n\t\t\t\t\t\tskip: yes,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\tdotsecConfigOverwriteResponse === undefined ||\n\t\t\t\t\tdotsecConfigOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(configFile, configTemplate);\n\t\t\t\t\tconsole.log(`Wrote config file to ${strong(configFile)}`);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tcommand.error(e);\n\t\t\t}\n\t\t});\n\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\n\treturn subProgram;\n};\n\nexport default addInitProgram;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport { parse } from \"../../lib/parse\";\nimport { PushCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport {\n\tDotsecCliOption,\n\tDotsecCliPluginDecryptHandler,\n\tDotsecCliPluginPushHandler,\n} from \"../../types/plugin\";\nimport { setProgramOptions } from \"../options/index\";\nimport { Command } from \"commander\";\nimport { expand } from \"dotenv-expand\";\nimport fs from \"node:fs\";\n\n/**\n * Decrypts, and pushes the contents of a .env file to AWS SSM, AWS Secrets Manager or GitHub Actions Secrets\n * @date 12/7/2022 - 9:16:48 AM\n *\n * @async\n * @param {Command} program\n * @returns {unknown}\n */\nconst addPushProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\thandlers: {\n\t\t\tpush: DotsecCliPluginPushHandler;\n\t\t\tdecrypt: DotsecCliPluginDecryptHandler;\n\t\t}[];\n\t},\n) => {\n\tconst { dotsecConfig, handlers } = options;\n\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"push\")\n\t\t.action(async (_options: Record<string, string>, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tusing,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<PushCommandOptions>();\n\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\tconst pluginCliDecrypt = (handlers || []).find((handler) => {\n\t\t\t\t\treturn handler.decrypt?.triggerOptionValue === encryptionEngine;\n\t\t\t\t})?.decrypt;\n\n\t\t\t\tconst pluginCliPush = (handlers || []).find((handler) => {\n\t\t\t\t\treturn handler.push?.triggerOptionValue === encryptionEngine;\n\t\t\t\t})?.push;\n\n\t\t\t\tif (!pluginCliPush) {\n\t\t\t\t\tthrow new Error(\"No push plugin found!\");\n\t\t\t\t}\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliDecrypt?.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliDecrypt?.requiredOptions || {}),\n\t\t\t\t\t...Object.keys(pluginCliPush?.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliPush?.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tlet envContents: string | undefined;\n\n\t\t\t\tif (using === \"env\") {\n\t\t\t\t\tif (!envFile) {\n\t\t\t\t\t\tthrow new Error(\"No dotenv file specified in --env-file option\");\n\t\t\t\t\t}\n\t\t\t\t\tenvContents = fs.readFileSync(envFile, \"utf8\");\n\t\t\t\t} else {\n\t\t\t\t\tif (!secFile) {\n\t\t\t\t\t\tthrow new Error(\"No dotsec file specified in --sec-file option\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${handlers\n\t\t\t\t\t\t\t\t.map((e) => `--${e.decrypt?.triggerOptionValue}`)\n\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dotSecContents = fs.readFileSync(secFile, \"utf8\");\n\t\t\t\t\tenvContents = await pluginCliDecrypt.handler({\n\t\t\t\t\t\tciphertext: dotSecContents,\n\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (envContents) {\n\t\t\t\t\t// convert to object\n\t\t\t\t\tconst dotenvVars = parse(envContents).obj;\n\t\t\t\t\t// expand env vars\n\t\t\t\t\tconst expandedEnvVars = expand({\n\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t...(process.env as Record<string, string>),\n\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tif (expandedEnvVars.parsed) {\n\t\t\t\t\t\tawait pluginCliPush.handler({\n\t\t\t\t\t\t\tpush: expandedEnvVars.parsed,\n\t\t\t\t\t\t\tyes,\n\t\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"No .env or .sec file provided\");\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t});\n\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\tconst engines = options.handlers.map(\n\t\t({ decrypt }) => decrypt.triggerOptionValue,\n\t);\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"} to use: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tconst allOptions: {\n\t\t[x: string]: DotsecCliOption & { required?: boolean };\n\t} = {};\n\toptions.handlers.forEach((handlers) => {\n\t\tObject.keys(handlers).map((handlerName) => {\n\t\t\tconst { options: cliOptions, requiredOptions } = handlers[handlerName];\n\t\t\tObject.keys(cliOptions || {}).forEach((key) => {\n\t\t\t\tallOptions[key] = Array.isArray(cliOptions[key])\n\t\t\t\t\t? cliOptions[key]\n\t\t\t\t\t: { ...allOptions[key], ...cliOptions[key] };\n\t\t\t});\n\t\t\tObject.keys(requiredOptions || {}).forEach((key) => {\n\t\t\t\tallOptions[key] = Array.isArray(requiredOptions[key])\n\t\t\t\t\t? requiredOptions[key]\n\t\t\t\t\t: {\n\t\t\t\t\t\t\t...allOptions[key],\n\t\t\t\t\t\t\t...requiredOptions[key],\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t };\n\t\t\t});\n\t\t});\n\t});\n\n\tconst usage: string[] = [];\n\tconst descriptions: string[] = [];\n\n\thandlers.forEach((handler) => {\n\t\tif (handler.push?.description) {\n\t\t\tdescriptions.push(handler.push.description);\n\t\t}\n\n\t\tif (handler.push?.usage) {\n\t\t\tusage.push(handler.push.usage);\n\t\t}\n\t});\n\n\tif (descriptions.length > 0) {\n\t\tsubProgram.description(descriptions.join(\"\\n\"));\n\t}\n\n\tif (usage.length > 0) {\n\t\tsubProgram.usage(usage.join(\"\\n\"));\n\t}\n\n\taddPluginOptions(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(allOptions).filter(\n\t\t\t\t([_key, value]) => value.required !== true,\n\t\t\t),\n\t\t),\n\t\tsubProgram,\n\t);\n\taddPluginOptions(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(allOptions).filter(\n\t\t\t\t([_key, value]) => value.required === true,\n\t\t\t),\n\t\t),\n\t\tsubProgram,\n\t\ttrue,\n\t);\n\n\treturn subProgram;\n};\n\nexport default addPushProgram;\n","import fs from \"node:fs\";\n\nimport { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport { parse } from \"../../lib/parse\";\nimport { RunCommandOptions } from \"../../types\";\nimport { BackgroundColor, backgroundColors } from \"../../types/colors\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginDecryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { camelCase } from \"camel-case\";\nimport chalk from \"chalk\";\n\nimport { Command } from \"commander\";\nimport { expand } from \"dotenv-expand\";\nimport { spawn } from \"node:child_process\";\nconst addRunProgam = (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\tdecryptHandlers?: DotsecCliPluginDecryptHandler[];\n\t},\n) => {\n\tconst { dotsecConfig, decryptHandlers } = options || {};\n\t// create api here\n\n\t// is there an encryption engine?\n\tconst hasDecryptEngine =\n\t\tdecryptHandlers !== undefined && decryptHandlers.length > 0;\n\n\tconst subProgram = program\n\t\t.command(\"run <command...>\")\n\t\t.allowUnknownOption(true)\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.showHelpAfterError(true)\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tcommands: string[],\n\t\t\t\t_options: Record<string, string>,\n\t\t\t\tcommand: Command,\n\t\t\t) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tenvFile,\n\t\t\t\t\t\tusing,\n\t\t\t\t\t\tsecFile,\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tshowRedacted,\n\t\t\t\t\t\toutputBackgroundColor,\n\t\t\t\t\t\tshowOutputBackgroundColor,\n\t\t\t\t\t\tshowOutputPrefix,\n\t\t\t\t\t\toutputPrefix,\n\t\t\t\t\t} = command.optsWithGlobals<RunCommandOptions>();\n\n\t\t\t\t\tlet envContents: string | undefined;\n\n\t\t\t\t\tif (using === \"env\" || hasDecryptEngine === false) {\n\t\t\t\t\t\tif (!envFile) {\n\t\t\t\t\t\t\tthrow new Error(\"No dotenv file specified in --env-file option\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenvContents = fs.readFileSync(envFile, \"utf8\");\n\t\t\t\t\t} else if (using === \"sec\") {\n\t\t\t\t\t\tif (!secFile) {\n\t\t\t\t\t\t\tthrow new Error(\"No dotsec file specified in --sec-file option\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst encryptionEngine =\n\t\t\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\t\t\tconst pluginCliDecrypt = (decryptHandlers || []).find((handler) => {\n\t\t\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${(\n\t\t\t\t\t\t\t\t\tdecryptHandlers || []\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.map((e) => `--${e.triggerOptionValue}`)\n\t\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t\t\t...Object.keys(pluginCliDecrypt.options || {}),\n\t\t\t\t\t\t\t...Object.keys(pluginCliDecrypt.requiredOptions || {}),\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst dotSecContents = fs.readFileSync(secFile, \"utf8\");\n\t\t\t\t\t\t\tenvContents = await pluginCliDecrypt.handler({\n\t\t\t\t\t\t\t\tciphertext: dotSecContents,\n\t\t\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error(\"Something bad happened while decrypting.\");\n\t\t\t\t\t\t\tconsole.error(`File: ${secFile}`);\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (envContents) {\n\t\t\t\t\t\tconst dotenvVars = parse(envContents).obj;\n\t\t\t\t\t\t// expand env vars\n\t\t\t\t\t\tconst expandedEnvVars = expand({\n\t\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t\t...(process.env as Record<string, string>),\n\t\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst [userCommand, ...userCommandArgs] = commands;\n\t\t\t\t\t\tconst waiter: number | undefined = await new Promise((resolve) => {\n\t\t\t\t\t\t\tconst cprocess = spawn(userCommand, [...userCommandArgs], {\n\t\t\t\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t\t\t\t\tshell: false,\n\t\t\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t\t\t...expandedEnvVars.parsed,\n\t\t\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t\t\t__DOTSEC_ENV__: JSON.stringify(Object.keys(dotenvVars)),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst expandedEnvVarsWithoutEnv = expand({\n\t\t\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.stdout.setEncoding(\"utf8\");\n\n\t\t\t\t\t\t\t// hideOutputBackgroundColor;\n\t\t\t\t\t\t\tlet addBackgroundColor: chalk.Chalk | ((str: string) => string) =\n\t\t\t\t\t\t\t\tshowOutputBackgroundColor ||\n\t\t\t\t\t\t\t\tdotsecConfig.defaults?.options?.showBackgroundColor\n\t\t\t\t\t\t\t\t\t? chalk.bgRedBright\n\t\t\t\t\t\t\t\t\t: (str: string) => str;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\toutputBackgroundColor &&\n\t\t\t\t\t\t\t\t(showOutputBackgroundColor ||\n\t\t\t\t\t\t\t\t\tdotsecConfig.defaults?.options?.showBackgroundColor)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!backgroundColors.includes(\n\t\t\t\t\t\t\t\t\t\toutputBackgroundColor as BackgroundColor,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// throw error\n\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`Invalid background color: ${outputBackgroundColor}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst backgroundColorFnName = camelCase(\n\t\t\t\t\t\t\t\t\t`bg-${outputBackgroundColor}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (chalk[backgroundColorFnName]) {\n\t\t\t\t\t\t\t\t\taddBackgroundColor = chalk[\n\t\t\t\t\t\t\t\t\t\tbackgroundColorFnName\n\t\t\t\t\t\t\t\t\t] as chalk.Chalk;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\t\t`Invalid background color: ${backgroundColorFnName}, using default: red`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\taddBackgroundColor = chalk.bgRedBright;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst prefix =\n\t\t\t\t\t\t\t\tshowOutputPrefix ||\n\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.showOutputPrefix\n\t\t\t\t\t\t\t\t\t? `${\n\t\t\t\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.outputPrefix ||\n\t\t\t\t\t\t\t\t\t\t\toutputPrefix ||\n\t\t\t\t\t\t\t\t\t\t\t\"(dotsec) \"\n\t\t\t\t\t\t\t\t\t }`\n\t\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tcprocess.stdout.on(\"data\", function (data) {\n\t\t\t\t\t\t\t\t//Here is where the output goes\n\t\t\t\t\t\t\t\t// split by new line\n\t\t\t\t\t\t\t\tconst lines = addBackgroundColor(\n\t\t\t\t\t\t\t\t\tdata\n\t\t\t\t\t\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t\t\t\t\t\t.map((line) => `${prefix}${line}`)\n\t\t\t\t\t\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t// redact\n\t\t\t\t\t\t\t\t// iterate over each env var\n\t\t\t\t\t\t\t\t// for each env var, replace the value with a redacted version\n\n\t\t\t\t\t\t\t\tconst redactedLines =\n\t\t\t\t\t\t\t\t\t(showRedacted ||\n\t\t\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.showRedacted) !== true\n\t\t\t\t\t\t\t\t\t\t? Object.entries(expandedEnvVarsWithoutEnv.parsed || {})\n\t\t\t\t\t\t\t\t\t\t\t\t.sort(([, a], [, b]) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (a.length > b.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else if (a.length < b.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t.reduce((acc, [key, value]) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (dotsecConfig?.redaction?.show?.includes(key)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst redactedValue = value.replace(/./g, \"*\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn acc.replace(value, redactedValue);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}, lines as string)\n\t\t\t\t\t\t\t\t\t\t: lines;\n\n\t\t\t\t\t\t\t\tconsole.log(redactedLines);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.stderr.setEncoding(\"utf8\");\n\t\t\t\t\t\t\tcprocess.stderr.on(\"data\", function (data) {\n\t\t\t\t\t\t\t\tprocess.stderr.write(data.toString());\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.on(\"exit\", (code: number) => {\n\t\t\t\t\t\t\t\tresolve(code);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (waiter !== 0) {\n\t\t\t\t\t\t\tprocess.exit(waiter || 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\"No .env or .sec file provided\");\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\t\tcommand.help();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\tsetProgramOptions({\n\t\tprogram: subProgram,\n\t\tcommandName: hasDecryptEngine ? \"run\" : \"runEnvOnly\",\n\t\tdotsecConfig,\n\t});\n\n\tif (hasDecryptEngine) {\n\t\tdecryptHandlers?.map((run) => {\n\t\t\tconst { options, requiredOptions } = run;\n\t\t\taddPluginOptions(options, subProgram);\n\t\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t\t});\n\t\tconst engines = decryptHandlers?.map((e) => e.triggerOptionValue);\n\n\t\tsubProgram.option(\n\t\t\t\"--engine <engine>\",\n\t\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"}: ${\n\t\t\t\t(engines.join(\", \"), engines.length === 1 ? engines[0] : undefined)\n\t\t\t}`,\n\t\t\t// engines.length === 1 ? engines[0] : undefined,\n\t\t);\n\t}\n\treturn subProgram;\n};\n\nexport default addRunProgam;\n"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/constants.ts","../../src/lib/json.ts","../../src/lib/getConfig.ts","../../src/lib/loadDotsecPlugin.ts","../../src/lib/addPluginOptions.ts","../../src/lib/io.ts","../../src/lib/parse.ts","../../src/utils/logging.ts","../../src/cli/options/index.ts","../../src/types/colors.ts","../../src/cli/options/sharedOptions.ts","../../src/cli/options/decrypt.ts","../../src/cli/options/dotsec.ts","../../src/cli/options/encrypt.ts","../../src/cli/options/init.ts","../../src/cli/options/push.ts","../../src/cli/options/run.ts","../../src/cli/commands/decrypt.ts","../../src/cli/commands/encrypt.ts","../../src/cli/commands/init.ts","../../src/cli/commands/push.ts","../../src/cli/commands/run.ts"],"names":["Command","path","fs","Option","program","options","decrypt_default","addEncryptProgram","encrypt_default","init_default","handlers","push_default","chalk","expand","run_default"],"mappings":";AAAA,SAAS,WAAAA,gBAAe;;;ACEjB,IAAM,6BAA6B;AACnC,IAAM,sBAAsB,CAAC,0BAA0B;AACvD,IAAM,iCAAiC;AACvC,IAAM,iCAAiC;AACvC,IAAM,gBAA8B;AAAA,EAC1C,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT,SAAS;AAAA,MACR,cAAc;AAAA,IACf;AAAA,EACD;AACD;;;AChBA,OAAO,QAAQ;AACf,OAAO,UAAU;AAUV,SAAS,WAAW,MAAc;AACxC,MAAI;AACH,WAAO,IAAI,SAAS,UAAU,KAAK,KAAK,GAAG,EAAE;AAAA,EAC9C,QAAE;AAGD,WAAO,CAAC;AAAA,EACT;AACD;AAUO,IAAM,WAAW,OAAO,aAAqB;AACnD,MAAI;AACH,WAAO,WAAW,MAAM,GAAG,SAAS,SAAS,UAAU,MAAM,CAAC;AAAA,EAC/D,SAAS,OAAP;AACD,QAAI,iBAAiB,OAAO;AAC3B,YAAM,IAAI;AAAA,QACT,mBAAmB,KAAK,SAAS,QAAQ,IAAI,GAAG,QAAQ,MACvD,MAAM;AAAA,MAER;AAAA,IACD,OAAO;AACN,YAAM;AAAA,IACP;AAAA,EACD;AACD;;;ACvCA,SAAS,qBAAqB;AAC9B,OAAO,YAAY;AACnB,OAAOC,WAAU;AAEV,IAAM,mBAAmB,OAC/B,aACoC;AACpC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,eAAe,IAAI,OAAO;AAChC,QAAM,aAAa,MAAM,aAAa,QAAQ;AAAA,IAC7C,OAAO,WAAW,CAAC,QAAQ,IAAI,CAAC,GAAG,qBAAqB,cAAc;AAAA,IACtE;AAAA,IACA,SAASA,MAAK,MAAM,GAAG,EAAE;AAAA,IACzB,YAAY;AAAA,EACb,CAAC;AACD,MAAI,YAAY,eAAe,MAAM;AACpC,UAAM,IAAI,MAAM,8BAA8B,UAAU;AAAA,EACzD;AACA,MAAI,YAAY;AACf,QAAI,WAAW,SAAS,OAAO,GAAG;AACjC,YAAM,UAAW,MAAM,SAAS,UAAU;AAE1C,UAAI;AAEJ,UACC,WAAW,SAAS,cAAc,KACjC,QAA8C,WAAW,QACzD;AACD,eAAQ,QAA8C;AAAA,MACvD,OAAO;AACN,eAAO;AAAA,MACR;AAEA,aAAO;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,UACT,GAAG;AAAA,UACH,GAAG;AAAA,UACH,UAAU;AAAA,YACT,GAAG,MAAM;AAAA,YACT,GAAG,cAAc;AAAA,YACjB,SAAS;AAAA,cACR,GAAG,MAAM,UAAU;AAAA,cACnB,GAAG,cAAc,UAAU;AAAA,YAC5B;AAAA,YACA,SAAS;AAAA,cACR,GAAG,MAAM,UAAU;AAAA,cACnB,GAAG,cAAc,UAAU;AAAA,YAC5B;AAAA,UACD;AAAA,UACA,MAAM;AAAA,YACL,GAAG,MAAM;AAAA,UACV;AAAA,QACD;AAAA,MACD;AAAA,IACD,WAAW,WAAW,SAAS,KAAK,GAAG;AACtC,YAAM,sBAAsB,MAAM,cAAc;AAAA,QAC/C,UAAU;AAAA,MACX,CAAC;AACD,YAAM,OAAQ,oBAAoB,IAAI,UACrC,oBAAoB,IAAI,WACxB,oBAAoB;AAErB,aAAO;AAAA,QACN,QAAQ;AAAA,QACR,UAAU;AAAA,UACT,GAAG;AAAA,UACH,GAAG;AAAA,UACH,UAAU;AAAA,YACT,GAAG,MAAM;AAAA,YACT,GAAG,cAAc;AAAA,YACjB,SAAS;AAAA,cACR,GAAG,MAAM,UAAU;AAAA,cACnB,GAAG,cAAc,UAAU;AAAA,YAC5B;AAAA,YACA,SAAS;AAAA,cACR,GAAG,MAAM,UAAU;AAAA,cACnB,GAAG,cAAc,UAAU;AAAA,YAC5B;AAAA,UACD;AAAA,UACA,MAAM;AAAA,YACL,GAAG,MAAM;AAAA,UACV;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,SAAO,EAAE,QAAQ,iBAAiB,UAAU,cAAc;AAC3D;;;AC3FO,IAAM,mBAAmB,OAAO,YAEJ;AAClC,SAAO,OAAO,QAAQ,MAAM,KAAK,CAAC,aAAa;AAC9C,WAAO,SAAS;AAAA,EACjB,CAAC;AACF;;;ACPA,SAAkB,cAAc;AAEzB,IAAM,mBAAmB,CAC/B,SAKA,SACA,cACI;AACJ,MAAI,SAAS;AACZ,WAAO,OAAO,OAAO,EAAE,IAAI,CAAC,WAAW;AACtC,UAAI;AAWJ,UAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,cAAM,CAAC,OAAO,aAAa,YAAY,IAAI;AAC3C,sBAAc;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD,OAAO;AACN,cAAM,EAAE,OAAO,aAAa,cAAc,SAAS,KAAK,GAAG,IAAI;AAC/D,sBAAc;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAEA,UAAI,aAAa;AAChB,cAAM,YAAY,IAAI;AAAA,UACrB,YAAY;AAAA,UACZ,YAAY;AAAA,QACb;AACA,YAAI,YAAY,IAAI;AACnB,oBAAU,UAAU,YAAY,EAAE;AAAA,QACnC;AACA,YAAI,YAAY,cAAc;AAC7B,oBAAU,QAAQ,YAAY,YAAY;AAAA,QAC3C;AACA,YAAI,YAAY,KAAK;AACpB,oBAAU,IAAI,YAAY,GAAG;AAAA,QAC9B;AACA,YAAI,WAAW;AACd,oBAAU,oBAAoB,IAAI;AAAA,QACnC;AACA,YAAI,YAAY,SAAS;AACxB,oBAAU,QAAQ,YAAY,OAAO;AAAA,QACtC;AACA,gBAAQ,UAAU,SAAS;AAAA,MAC5B;AAAA,IACD,CAAC;AAAA,EACF;AACD;;;ACpEA,OAAOC,OAAM,YAAY;AACzB,OAAOD,WAAU;AACjB,OAAO,aAAa;AAEb,IAAM,uBAAuB,OACnC,aACqB;AACrB,SAAO,MAAMC,IAAG,SAAS,UAAU,OAAO;AAC3C;AAEO,IAAM,sBAAsB,OAClC,UACA,aACmB;AACnB,SAAO,MAAMA,IAAG,UAAU,UAAU,UAAU,OAAO;AACtD;AAEO,IAAM,aAAa,OAAO,WAAqC;AACrE,MAAI;AACH,UAAM,KAAK,MAAM;AACjB,WAAO;AAAA,EACR,QAAE;AACD,WAAO;AAAA,EACR;AACD;AAEO,IAAM,8BAA8B,OAAO;AAAA,EACjD;AAAA,EACA;AACD,MAGM;AACL,MAAI;AAEJ,MAAK,MAAM,WAAW,QAAQ,KAAM,SAAS,MAAM;AAClD,wBAAoB,MAAM,QAAQ;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,MAAM;AACd,eAAO,gBAAgBD,MAAK,SAAS,QAAQ,IAAI,GAAG,QAAQ;AAAA,MAC7D;AAAA,IACD,CAAC;AAAA,EACF,OAAO;AACN,wBAAoB;AAAA,EACrB;AACA,SAAO;AACR;;;AC/CA,IAAM,OACL;AAUM,IAAM,QAAQ,CAAC,QAAgB;AACrC,QAAM,MAA8B,CAAC;AACrC,QAAM,SAAsB,CAAC;AAG7B,MAAI,QAAQ,IAAI,SAAS;AAGzB,UAAQ,MAAM,QAAQ,WAAW,IAAI;AAErC,MAAI;AACJ,UAAQ,QAAQ,KAAK,KAAK,KAAK,MAAM,MAAM;AAC1C,UAAM,MAAM,MAAM,CAAC;AAEnB,QAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK;AAC5B,aAAO,KAAK,EAAE,MAAM,WAAW,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,IAC/C,WAAW,QAAQ,CAAC,GAAG;AACtB,aAAO,KAAK,EAAE,MAAM,cAAc,KAAK,MAAM,CAAC,EAAE,CAAC;AAAA,IAClD,OAAO;AAEN,UAAI,QAAQ,MAAM,CAAC,KAAK;AAGxB,cAAQ,MAAM,KAAK;AAGnB,YAAM,aAAa,MAAM,CAAC;AAG1B,cAAQ,MAAM,QAAQ,0BAA0B,IAAI;AAGpD,UAAI,eAAe,KAAK;AACvB,gBAAQ,MAAM,QAAQ,QAAQ,IAAI;AAClC,gBAAQ,MAAM,QAAQ,QAAQ,IAAI;AAAA,MACnC;AAEA,UAAI,GAAG,IAAI;AAGX,aAAO,KAAK;AAAA,QACX,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,KAAK,SAAS,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI;AAAA,MAClE,CAAC;AAAA,IACF;AAAA,EACD;AAEA,SAAO,EAAE,QAAQ,IAAI;AACtB;AAEA,IAAI,YAAY,QAAQ;AACvB,QAAM,EAAE,IAAI,OAAO,IAAI,YAAY;AAEnC,KAAG,SAAS,MAAM;AACjB,UAAM,SAAS;AACf,UAAM,SAAS;AACf,UAAM,SAAS;AACf,UAAM,SAAS;AAoBf,WAAO,MAAM,MAAM,CAAC,EAAE,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAc3C;AACD,WAAO,MAAM,MAAM,CAAC,EAAE,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAc3C;AACD,WAAO,MAAM,MAAM,CAAC,EAAE,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAc3C;AACD,WAAO,MAAM,MAAM,CAAC,EAAE,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAczC;AAAA,EACJ,CAAC;AACF;;;ACvJA,OAAO,WAAW;AAClB,OAAO,WAAW;AAeX,IAAM,SAAS,CAAC,QAAwB,MAAM,OAAO,KAAK,GAAG;;;ACfpE,SAAkB,UAAAE,eAAc;;;ACDzB,IAAM,mBAAmB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;;;ACZO,IAAM,gBAAuC;AAAA,EACnD,QAAQ;AAAA,IACP;AAAA,IACA,+HAA+H;AAAA,IAC/H;AAAA,EACD;AAAA,EACA,KAAK;AACN;AACO,IAAM,gBAAuC;AAAA,EACnD,QAAQ;AAAA,IACP;AAAA,IACA,+HAA+H;AAAA,IAC/H;AAAA,EACD;AAAA,EACA,KAAK;AACN;AAEO,IAAM,cAAqC;AAAA,EACjD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,SAAS,CAAC,OAAO,KAAK;AAAA,EACtB,KAAK;AACN;AAEO,IAAM,gCAAuD;AAAA,EACnE,OAAO;AAAA,EACP,aAAa;AAAA,EACb,SAAS,CAAC,KAAK;AAAA,EACf,KAAK;AACN;AAEO,IAAM,qBAA4C;AAAA,EACxD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,KAAK;AAAA,EACL,cAAc;AACf;AAEO,IAAM,yBAAgD;AAAA,EAC5D,OAAO;AAAA,EACP,aAAa;AAAA,EACb,KAAK;AACN;AACO,IAAM,qBAA4C;AAAA,EACxD,OAAO;AAAA,EACP,aAAa;AAAA,EACb,KAAK;AACN;AAEO,IAAM,8BAAqD;AAAA,EACjE,OAAO;AAAA,EACP,aAAa;AAAA,EACb,KAAK;AAAA,EACL,SAAS;AAAA,EACT,cAAc;AACf;AAEO,IAAM,YAAmC;AAAA,EAC/C,QAAQ,CAAC,SAAS,2BAA2B;AAC9C;AAMO,IAAM,mBAA0C;AAAA,EACtD,QAAQ,CAAC,gDAAgD,aAAa;AAAA,EACtE,KAAK;AACN;AAEO,IAAM,eAAsC;AAAA,EAClD,QAAQ,CAAC,qBAAqB,wCAAwC;AAAA,EACtE,KAAK;AACN;AAEO,IAAM,eAAsC;AAAA,EAClD,QAAQ,CAAC,qBAAqB,0BAA0B;AAAA,EACxD,KAAK;AACN;AAEO,IAAM,uBAA8C;AAAA,EAC1D,QAAQ;AAAA,IACP;AAAA,IACA;AAAA,EACD;AAAA,EACA,KAAK;AACN;AAEO,IAAM,2BAAkD;AAAA,EAC9D,QAAQ;AAAA,IACP;AAAA,IACA;AAAA,EACD;AAAA,EACA,KAAK;AACN;;;AC3FA,IAAM,yBAAiD;AAAA,EACtD,SAAS;AAAA,IACR,SAAS;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,KAAK;AAAA,IACN;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BX;AACD;AAEA,IAAO,kBAAQ;;;ACjDf,IAAM,wBAAgD;AAAA,EACrD,QAAQ;AAAA,IACP,SAAS;AAAA,MACR,YAAY;AAAA,MACZ,QAAQ;AAAA,IACT;AAAA,EACD;AACD;AAEA,IAAO,iBAAQ;;;ACFf,IAAM,yBAAiD;AAAA,EACtD,SAAS;AAAA,IACR,SAAS;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,KAAK;AAAA,IACN;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BX;AACD;AAEA,IAAO,kBAAQ;;;ACpDf,IAAM,sBAA8C;AAAA,EACnD,MAAM;AAAA,IACL,SAAS;AAAA,MACR,YAAY;AAAA,MACZ,KAAK;AAAA,IACN;AAAA,IACA,aACC;AAAA,IACD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBX;AACD;AAEA,IAAO,eAAQ;;;ACzBf,IAAM,sBAA8C;AAAA,EACnD,MAAM;AAAA,IACL,SAAS;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,KAAK;AAAA,IACN;AAAA,IACA,iBAAiB;AAAA,MAChB,OAAO;AAAA,IACR;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaX;AACD;AAEA,IAAO,eAAQ;;;AClBf,IAAM,qBAA6C;AAAA,EAClD,YAAY;AAAA,IACX,OAAO;AAAA,IAEP,SAAS;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,uBAAuB;AAAA,MACvB,kBAAkB;AAAA,MAClB,cAAc;AAAA,IACf;AAAA,IACA,iBAAiB;AAAA,MAChB,OAAO;AAAA,IACR;AAAA,IAEA,aACC;AAAA,IACD,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBX;AAAA,EACA,KAAK;AAAA,IACJ,SAAS;AAAA,MACR,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,KAAK;AAAA,MACL,cAAc;AAAA,MACd,uBAAuB;AAAA,MACvB,kBAAkB;AAAA,MAClB,cAAc;AAAA,IACf;AAAA,IACA,iBAAiB;AAAA,MAChB,OAAO;AAAA,IACR;AAAA,IAEA,OAAO;AAAA,IACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKb,UAAU,GAAG;AAAA;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAID;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcD;AAEA,IAAO,cAAQ;;;ARvGR,IAAM,iBAAyC;AAAA,EACrD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACJ;AAEA,IAAM,sBAAsB,CAC3B,kBAC+B;AAC/B,MAAI,MAAM,QAAQ,aAAa,GAAG;AACjC,UAAM,CAAC,OAAO,aAAa,YAAY,IAAI;AAC3C,UAAM,cAAc;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACD;AACA,WAAO;AAAA,EACR,OAAO;AACN,QAAI,YAAY,eAAe;AAC9B,YAAM,CAAC,OAAO,aAAa,YAAY,IAAI,cAAc;AACzD,YAAM,cAAc;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,cAAc;AAAA,MACpB;AACA,aAAO;AAAA,IACR;AACA,WAAO;AAAA,EACR;AACD;AAEA,IAAM,eAAe,CACpB,eACA,YAKY;AACZ,QAAM,+BACL,SAAS,cAAc,UAAU,UAAU,SAAS,SAAS;AAC9D,QAAM,cAAc,oBAAoB,aAAa;AAErD,QAAM,YAAY,IAAIA,QAAO,YAAY,OAAO,YAAY,WAAW;AACvE,MAAI,YAAY,IAAI;AACnB,cAAU,UAAU,YAAY,EAAE;AAAA,EACnC;AACA,MAAI,YAAY,cAAc;AAC7B,cAAU,QAAQ,gCAAgC,YAAY,YAAY;AAAA,EAC3E;AACA,MAAI,YAAY,KAAK;AACpB,cAAU,IAAI,YAAY,GAAG;AAAA,EAC9B;AACA,MAAI,QAAQ,UAAU;AACrB,cAAU,oBAAoB,IAAI;AAAA,EACnC;AACA,MAAI,YAAY,SAAS;AACxB,cAAU,QAAQ,YAAY,OAAO;AAAA,EACtC;AAEA,SAAO;AACR;AAEO,IAAM,oBAAoB,CAAC,WAI5B;AACL,QAAM,EAAE,SAAAC,UAAS,aAAa,aAAa,IAAI;AAC/C,QAAM,iBAAiB,eAAe,eAAeA,SAAQ,KAAK,CAAC;AAEnE,MAAI,gBAAgB;AACnB,UAAM,EAAE,SAAS,iBAAiB,aAAa,OAAO,SAAS,IAC9D;AACD,QAAI,SAAS;AACZ,aAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,cAAc;AAC3C,cAAM,gBAAgB,QAAQ,SAAS;AACvC,cAAM,YAAY,aAAa,eAAe;AAAA,UAC7C;AAAA,UACA;AAAA,QACD,CAAC;AAED,QAAAA,SAAQ,UAAU,SAAS;AAAA,MAC5B,CAAC;AAAA,IACF;AACA,QAAI,iBAAiB;AACpB,aAAO,KAAK,eAAe,EAAE,QAAQ,CAAC,sBAAsB;AAC3D,cAAM,iBAAiB,gBAAgB,iBAAiB;AACxD,cAAM,YAAY,aAAa,gBAAgB;AAAA,UAC9C,UAAU;AAAA,UACV;AAAA,UACA,WAAW;AAAA,QACZ,CAAC;AAED,QAAAA,SAAQ,UAAU,SAAS;AAAA,MAC5B,CAAC;AAAA,IACF;AACA,QAAI,aAAa;AAChB,MAAAA,SAAQ,YAAY,WAAW;AAAA,IAChC;AACA,QAAI,OAAO;AACV,MAAAA,SAAQ,MAAM,KAAK;AAAA,IACpB;AACA,QAAI,UAAU;AACb,MAAAA,SAAQ,YAAY,QAAQ;AAAA,IAC7B;AAAA,EACD;AACD;;;AS5GA,IAAM,oBAAoB,OACzBA,UACA,YAII;AACJ,QAAM,EAAE,cAAc,gBAAgB,IAAI;AAC1C,QAAM,aAAaA,SACjB,wBAAwB,EACxB,mBAAmB,EACnB,QAAQ,SAAS,EACjB,OAAO,OAAO,UAAmB,YAAqB;AACtD,QAAI;AACH,YAAM;AAAA;AAAA,QAEL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,IAAI,QAAQ,gBAAuC;AACnD,YAAM,mBACL,UAAU,cAAc,UAAU;AAEnC,YAAM,oBAAoB,mBAAmB,CAAC,GAAG,KAAK,CAAC,YAAY;AAClE,eAAO,QAAQ,uBAAuB;AAAA,MACvC,CAAC;AAED,UAAI,CAAC,kBAAkB;AACtB,cAAM,IAAI;AAAA,UACT,+DAA+D,QAAQ,gBACrE,IAAI,CAAC,MAAM,KAAK,EAAE,oBAAoB,EACtC,KAAK,IAAI;AAAA,QACZ;AAAA,MACD;AAEA,cAAQ;AAAA,QACP;AAAA,QACA;AAAA,UACC,iBAAiB,wBAChB,iBAAiB;AAAA,QACnB;AAAA,QACA;AAAA,MACD;AACA,YAAM,gBAAgB;AAAA,QACrB,GAAG,OAAO,KAAK,iBAAiB,WAAW,CAAC,CAAC;AAAA,QAC7C,GAAG,OAAO,KAAK,iBAAiB,mBAAmB,CAAC,CAAC;AAAA,MACtD;AAEA,YAAM,mBAAmB,OAAO;AAAA,QAC/B,cAAc,IAAI,CAAC,QAAQ;AAC1B,iBAAO,CAAC,KAAK,SAAS,GAAG,CAAC;AAAA,QAC3B,CAAC;AAAA,MACF;AAEA,YAAM,eAAe,MAAM,qBAAqB,OAAO;AAEvD,YAAM,YAAY,MAAM,iBAAiB,QAAQ;AAAA,QAChD,YAAY;AAAA,QACZ,GAAG;AAAA,MACJ,CAAC;AAED,YAAM,0BAA0B,MAAM,4BAA4B;AAAA,QACjE,UAAU;AAAA,QACV,MAAM;AAAA,MACP,CAAC;AACD,UACC,4BAA4B,UAC5B,wBAAwB,cAAc,MACrC;AACD,cAAM,oBAAoB,SAAS,SAAS;AAC5C,gBAAQ;AAAA,UACP,+BAA+B,OAAO,OAAO,aAAa;AAAA,YACzD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAEA,UAAI,kBAAkB,cAAc,UAAU,SAAS,gBAAgB;AAEtE,cAAM,aAAa,MAAM,SAAS,EAAE;AAEpC,cAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA,sBAIR;AAAA,uBACC;AAAA,cACV,oBAAI,KAAK,GAAE,YAAY;AAAA,uBAE9B,iBAAiB,wBACjB,iBAAiB;AAAA,+BAEQ,KAAK,UAAU,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5D,OAAO,KAAK,UAAU,EACtB,IAAI,CAAC,QAAQ;AACb,iBAAO,OAAO;AAAA,QACf,CAAC,EACA,KAAK,IAAI;AAAA;AAIN,cAAM,qBACL,gBAAgB,GAAG;AACpB,cAAM,oBAAoB,oBAAoB,gBAAgB;AAC9D,gBAAQ;AAAA,UACP,qBAAqB,OAAO,OAAO,aAAa;AAAA,YAC/C;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD,SAAS,GAAP;AACD,cAAQ,MAAM,OAAO,EAAE,OAAO,CAAC;AAC/B,cAAQ,KAAK;AAAA,IACd;AAAA,EACD,CAAC;AAEF,UAAQ,gBAAgB,IAAI,CAAC,eAAe;AAC3C,UAAM,EAAE,SAAAC,UAAS,gBAAgB,IAAI;AACrC,qBAAiBA,UAAS,UAAU;AACpC,qBAAiB,iBAAiB,YAAY,IAAI;AAAA,EACnD,CAAC;AAED,QAAM,UAAU,QAAQ,gBAAgB,IAAI,CAAC,MAAM,EAAE,kBAAkB;AACvE,aAAW;AAAA,IACV;AAAA,IACA,oBAAoB,QAAQ,SAAS,IAAI,MAAM,cAC9C,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI,QAAQ,KAAK,IAAI;AAAA,IAEtD,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAAA,EACrC;AACA,oBAAkB,EAAE,SAAS,YAAY,aAAa,CAAC;AAEvD,SAAO;AACR;AAEA,IAAOC,mBAAQ;;;AC/If,IAAMC,qBAAoB,OACzBH,UACA,YAII;AACJ,QAAM,EAAE,iBAAiB,aAAa,IAAI;AAC1C,QAAM,aAAaA,SACjB,wBAAwB,EACxB,mBAAmB,EACnB,QAAQ,SAAS,EACjB,OAAO,OAAO,UAAmB,YAAqB;AACtD,QAAI;AACH,YAAM;AAAA;AAAA,QAEL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,IAAI,QAAQ,gBAAuC;AAEnD,YAAM,mBACL,UAAU,cAAc,UAAU;AACnC,YAAM,oBAAoB,mBAAmB,CAAC,GAAG,KAAK,CAAC,YAAY;AAClE,eAAO,QAAQ,uBAAuB;AAAA,MACvC,CAAC;AAED,UAAI,CAAC,kBAAkB;AACtB,cAAM,IAAI;AAAA,UACT,+DAA+D,QAAQ,gBACrE,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAC/B,KAAK,IAAI;AAAA,QACZ;AAAA,MACD;AAEA,YAAM,gBAAgB;AAAA,QACrB,GAAG,OAAO,KAAK,iBAAiB,WAAW,CAAC,CAAC;AAAA,QAC7C,GAAG,OAAO,KAAK,iBAAiB,mBAAmB,CAAC,CAAC;AAAA,MACtD;AAEA,YAAM,mBAAmB,OAAO;AAAA,QAC/B,cAAc,IAAI,CAAC,QAAQ;AAC1B,iBAAO,CAAC,KAAK,SAAS,GAAG,CAAC;AAAA,QAC3B,CAAC;AAAA,MACF;AAEA,YAAM,eAAe,MAAM,qBAAqB,OAAO;AACvD,UAAI;AACJ,UAAI;AACH,uBAAe,MAAM,qBAAqB,OAAO;AAAA,MAClD,SAAS,GAAP;AAAA,MAEF;AACA,YAAM,aAAa,MAAM,iBAAiB,QAAQ;AAAA,QACjD,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,GAAG;AAAA,MACJ,CAAC;AAED,YAAM,0BAA0B,MAAM,4BAA4B;AAAA,QACjE,UAAU;AAAA,QACV,MAAM;AAAA,MACP,CAAC;AACD,UACC,4BAA4B,UAC5B,wBAAwB,cAAc,MACrC;AACD,cAAM,oBAAoB,SAAS,UAAU;AAC7C,gBAAQ;AAAA,UACP,+BAA+B,OAAO,OAAO,aAAa;AAAA,YACzD;AAAA,UACD;AAAA,QACD;AAEA,YACC,kBACA,cAAc,UAAU,SAAS,gBAChC;AAED,gBAAM,aAAa,MAAM,YAAY,EAAE;AAEvC,gBAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA,sBAIT;AAAA,uBACC;AAAA,cACV,oBAAI,KAAK,GAAE,YAAY;AAAA,uBAE7B,iBAAiB,wBACjB,iBAAiB;AAAA,+BAEO,KAAK,UAAU,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5D,OAAO,KAAK,UAAU,EACtB,IAAI,CAAC,QAAQ;AACb,mBAAO,OAAO;AAAA,UACf,CAAC,EACA,KAAK,IAAI;AAAA;AAIL,gBAAM,qBACL,gBAAgB,GAAG;AACpB,gBAAM,oBAAoB,oBAAoB,gBAAgB;AAC9D,kBAAQ;AAAA,YACP,qBAAqB,OAAO,OAAO,aAAa;AAAA,cAC/C;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD,SAAS,GAAP;AACD,cAAQ,MAAM,OAAO,EAAE,OAAO,CAAC;AAC/B,cAAQ,KAAK;AAAA,IACd;AAAA,EACD,CAAC;AAEF,UAAQ,gBAAgB,IAAI,CAAC,sBAAsB;AAClD,UAAM,EAAE,SAAAC,UAAS,gBAAgB,IAAI;AACrC,qBAAiBA,UAAS,UAAU;AACpC,qBAAiB,iBAAiB,YAAY,IAAI;AAAA,EACnD,CAAC;AACD,QAAM,UAAU,QAAQ,gBAAgB,IAAI,CAAC,MAAM,EAAE,kBAAkB;AACvE,QAAM,wBAAwB,QAAQ,gBAAgB;AAAA,IACrD,CAAC,MAAM,EAAE;AAAA,EACV;AAEA,aAAW;AAAA,IACV;AAAA,IACA,oBAAoB,QAAQ,SAAS,IAAI,MAAM,OAC9C,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI,QAAQ,KAAK,IAAI;AAAA,IAEtD,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAAA,EACrC;AACA,oBAAkB,EAAE,SAAS,YAAY,aAAa,CAAC;AACvD,aAAW;AAAA,IACV,2BAA2B,sBAAsB,KAAK,IAAI;AAAA,EAC3D;AACA,SAAO;AACR;AAEA,IAAOG,mBAAQD;;;AC9Jf,OAAON,WAAU;AAMjB,IAAM,iBAAiB,OACtBG,UACA,YACI;AACJ,QAAM,EAAE,aAAa,IAAI;AACzB,QAAM,aAAaA,SACjB,wBAAwB,EACxB,mBAAmB,EACnB,QAAQ,MAAM,EACd,OAAO,OAAO,UAAmB,YAAqB;AACtD,UAAM,EAAE,aAAa,oBAAoB,IAAI,IAC5C,QAAQ,gBAAoC;AAC7C,QAAI;AACH,YAAM,iBAAiB,MAAM;AAAA,QAC5BH,MAAK,QAAQ,WAAW,sCAAsC;AAAA,MAC/D;AAEA,YAAM,gCAAgC,MAAM;AAAA,QAC3C;AAAA,UACC,UAAU;AAAA,UACV,MAAM;AAAA,QACP;AAAA,MACD;AACA,UACC,kCAAkC,UAClC,8BAA8B,cAAc,MAC3C;AACD,cAAM,oBAAoB,YAAY,cAAc;AACpD,gBAAQ,IAAI,wBAAwB,OAAO,UAAU,GAAG;AAAA,MACzD;AAAA,IACD,SAAS,GAAP;AACD,cAAQ,MAAM,CAAC;AAAA,IAChB;AAAA,EACD,CAAC;AAEF,oBAAkB,EAAE,SAAS,YAAY,aAAa,CAAC;AAEvD,SAAO;AACR;AAEA,IAAOQ,gBAAQ;;;AC7Cf,SAAS,cAAc;AACvB,OAAOP,SAAQ;AAUf,IAAM,iBAAiB,OACtBE,UACA,YAOI;AACJ,QAAM,EAAE,cAAc,SAAS,IAAI;AAEnC,QAAM,aAAaA,SACjB,wBAAwB,EACxB,mBAAmB,EACnB,QAAQ,MAAM,EACd,OAAO,OAAO,UAAkC,YAAqB;AACrE,QAAI;AACH,YAAM;AAAA;AAAA,QAEL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACD,IAAI,QAAQ,gBAAoC;AAEhD,YAAM,mBACL,UAAU,cAAc,UAAU;AAEnC,YAAM,oBAAoB,YAAY,CAAC,GAAG,KAAK,CAAC,YAAY;AAC3D,eAAO,QAAQ,SAAS,uBAAuB;AAAA,MAChD,CAAC,GAAG;AAEJ,YAAM,iBAAiB,YAAY,CAAC,GAAG,KAAK,CAAC,YAAY;AACxD,eAAO,QAAQ,MAAM,uBAAuB;AAAA,MAC7C,CAAC,GAAG;AAEJ,UAAI,CAAC,eAAe;AACnB,cAAM,IAAI,MAAM,uBAAuB;AAAA,MACxC;AACA,YAAM,gBAAgB;AAAA,QACrB,GAAG,OAAO,KAAK,kBAAkB,WAAW,CAAC,CAAC;AAAA,QAC9C,GAAG,OAAO,KAAK,kBAAkB,mBAAmB,CAAC,CAAC;AAAA,QACtD,GAAG,OAAO,KAAK,eAAe,WAAW,CAAC,CAAC;AAAA,QAC3C,GAAG,OAAO,KAAK,eAAe,mBAAmB,CAAC,CAAC;AAAA,MACpD;AAEA,YAAM,mBAAmB,OAAO;AAAA,QAC/B,cAAc,IAAI,CAAC,QAAQ;AAC1B,iBAAO,CAAC,KAAK,SAAS,GAAG,CAAC;AAAA,QAC3B,CAAC;AAAA,MACF;AAEA,UAAI;AAEJ,UAAI,UAAU,OAAO;AACpB,YAAI,CAAC,SAAS;AACb,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QAChE;AACA,sBAAcF,IAAG,aAAa,SAAS,MAAM;AAAA,MAC9C,OAAO;AACN,YAAI,CAAC,SAAS;AACb,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QAChE;AAEA,YAAI,CAAC,kBAAkB;AACtB,gBAAM,IAAI;AAAA,YACT,+DAA+D,SAC7D,IAAI,CAAC,MAAM,KAAK,EAAE,SAAS,oBAAoB,EAC/C,KAAK,IAAI;AAAA,UACZ;AAAA,QACD;AAEA,cAAM,iBAAiBA,IAAG,aAAa,SAAS,MAAM;AACtD,sBAAc,MAAM,iBAAiB,QAAQ;AAAA,UAC5C,YAAY;AAAA,UACZ,GAAG;AAAA,QACJ,CAAC;AAAA,MACF;AACA,UAAI,aAAa;AAEhB,cAAM,aAAa,MAAM,WAAW,EAAE;AAEtC,cAAM,kBAAkB,OAAO;AAAA,UAC9B,kBAAkB;AAAA,UAClB,QAAQ;AAAA;AAAA,YAEP,GAAI,QAAQ;AAAA;AAAA,YAEZ,GAAG;AAAA,UACJ;AAAA,QACD,CAAC;AAED,YAAI,gBAAgB,QAAQ;AAC3B,gBAAM,cAAc,QAAQ;AAAA,YAC3B,MAAM,gBAAgB;AAAA,YACtB;AAAA,YACA,GAAG;AAAA,UACJ,CAAC;AAAA,QACF;AAAA,MACD,OAAO;AACN,cAAM,IAAI,MAAM,+BAA+B;AAAA,MAChD;AAAA,IACD,SAAS,GAAP;AACD,cAAQ,MAAM,CAAC;AACf,cAAQ,KAAK,CAAC;AAAA,IACf;AAAA,EACD,CAAC;AAEF,oBAAkB,EAAE,SAAS,YAAY,aAAa,CAAC;AACvD,QAAM,UAAU,QAAQ,SAAS;AAAA,IAChC,CAAC,EAAE,QAAQ,MAAM,QAAQ;AAAA,EAC1B;AACA,aAAW;AAAA,IACV;AAAA,IACA,oBAAoB,QAAQ,SAAS,IAAI,MAAM,cAC9C,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI,QAAQ,KAAK,IAAI;AAAA,IAEtD,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAAA,EACrC;AACA,QAAM,aAEF,CAAC;AACL,UAAQ,SAAS,QAAQ,CAACQ,cAAa;AACtC,WAAO,KAAKA,SAAQ,EAAE,IAAI,CAAC,gBAAgB;AAC1C,YAAM,EAAE,SAAS,YAAY,gBAAgB,IAAIA,UAAS,WAAW;AACrE,aAAO,KAAK,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AAC9C,mBAAW,GAAG,IAAI,MAAM,QAAQ,WAAW,GAAG,CAAC,IAC5C,WAAW,GAAG,IACd,EAAE,GAAG,WAAW,GAAG,GAAG,GAAG,WAAW,GAAG,EAAE;AAAA,MAC7C,CAAC;AACD,aAAO,KAAK,mBAAmB,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACnD,mBAAW,GAAG,IAAI,MAAM,QAAQ,gBAAgB,GAAG,CAAC,IACjD,gBAAgB,GAAG,IACnB;AAAA,UACA,GAAG,WAAW,GAAG;AAAA,UACjB,GAAG,gBAAgB,GAAG;AAAA,UACtB,UAAU;AAAA,QACV;AAAA,MACJ,CAAC;AAAA,IACF,CAAC;AAAA,EACF,CAAC;AAED,QAAM,QAAkB,CAAC;AACzB,QAAM,eAAyB,CAAC;AAEhC,WAAS,QAAQ,CAAC,YAAY;AAC7B,QAAI,QAAQ,MAAM,aAAa;AAC9B,mBAAa,KAAK,QAAQ,KAAK,WAAW;AAAA,IAC3C;AAEA,QAAI,QAAQ,MAAM,OAAO;AACxB,YAAM,KAAK,QAAQ,KAAK,KAAK;AAAA,IAC9B;AAAA,EACD,CAAC;AAED,MAAI,aAAa,SAAS,GAAG;AAC5B,eAAW,YAAY,aAAa,KAAK,IAAI,CAAC;AAAA,EAC/C;AAEA,MAAI,MAAM,SAAS,GAAG;AACrB,eAAW,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,EAClC;AAEA;AAAA,IACC,OAAO;AAAA,MACN,OAAO,QAAQ,UAAU,EAAE;AAAA,QAC1B,CAAC,CAAC,MAAM,KAAK,MAAM,MAAM,aAAa;AAAA,MACvC;AAAA,IACD;AAAA,IACA;AAAA,EACD;AACA;AAAA,IACC,OAAO;AAAA,MACN,OAAO,QAAQ,UAAU,EAAE;AAAA,QAC1B,CAAC,CAAC,MAAM,KAAK,MAAM,MAAM,aAAa;AAAA,MACvC;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,SAAO;AACR;AAEA,IAAOC,gBAAQ;;;AChNf,OAAOT,SAAQ;AAUf,SAAS,iBAAiB;AAC1B,OAAOU,YAAW;AAIlB,SAAS,UAAAC,eAAc;AACvB,SAAS,aAAa;AACtB,IAAM,eAAe,CACpBT,UACA,YAII;AACJ,QAAM,EAAE,cAAc,gBAAgB,IAAI,WAAW,CAAC;AAItD,QAAM,mBACL,oBAAoB,UAAa,gBAAgB,SAAS;AAE3D,QAAM,aAAaA,SACjB,QAAQ,kBAAkB,EAC1B,mBAAmB,IAAI,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,IAAI,EACvB;AAAA,IACA,OACC,UACA,UACA,YACI;AACJ,UAAI;AACH,cAAM;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD,IAAI,QAAQ,gBAAmC;AAE/C,YAAI;AAEJ,YAAI,UAAU,SAAS,qBAAqB,OAAO;AAClD,cAAI,CAAC,SAAS;AACb,kBAAM,IAAI,MAAM,+CAA+C;AAAA,UAChE;AACA,wBAAcF,IAAG,aAAa,SAAS,MAAM;AAAA,QAC9C,WAAW,UAAU,OAAO;AAC3B,cAAI,CAAC,SAAS;AACb,kBAAM,IAAI,MAAM,+CAA+C;AAAA,UAChE;AAEA,gBAAM,mBACL,UAAU,cAAc,UAAU;AAEnC,gBAAM,oBAAoB,mBAAmB,CAAC,GAAG,KAAK,CAAC,YAAY;AAClE,mBAAO,QAAQ,uBAAuB;AAAA,UACvC,CAAC;AAED,cAAI,CAAC,kBAAkB;AACtB,kBAAM,IAAI;AAAA,cACT,gEACC,mBAAmB,CAAC,GAEnB,IAAI,CAAC,MAAM,KAAK,EAAE,oBAAoB,EACtC,KAAK,IAAI;AAAA,YACZ;AAAA,UACD;AAEA,gBAAM,gBAAgB;AAAA,YACrB,GAAG,OAAO,KAAK,iBAAiB,WAAW,CAAC,CAAC;AAAA,YAC7C,GAAG,OAAO,KAAK,iBAAiB,mBAAmB,CAAC,CAAC;AAAA,UACtD;AAEA,gBAAM,mBAAmB,OAAO;AAAA,YAC/B,cAAc,IAAI,CAAC,QAAQ;AAC1B,qBAAO,CAAC,KAAK,SAAS,GAAG,CAAC;AAAA,YAC3B,CAAC;AAAA,UACF;AACA,cAAI;AACH,kBAAM,iBAAiBA,IAAG,aAAa,SAAS,MAAM;AACtD,0BAAc,MAAM,iBAAiB,QAAQ;AAAA,cAC5C,YAAY;AAAA,cACZ,GAAG;AAAA,YACJ,CAAC;AAAA,UACF,SAAS,GAAP;AACD,oBAAQ,MAAM,0CAA0C;AACxD,oBAAQ,MAAM,SAAS,SAAS;AAChC,kBAAM;AAAA,UACP;AAAA,QACD;AACA,YAAI,aAAa;AAChB,gBAAM,aAAa,MAAM,WAAW,EAAE;AAEtC,gBAAM,kBAAkBW,QAAO;AAAA,YAC9B,kBAAkB;AAAA,YAClB,QAAQ;AAAA;AAAA,cAEP,GAAI,QAAQ;AAAA;AAAA,cAEZ,GAAG;AAAA,YACJ;AAAA,UACD,CAAC;AAED,gBAAM,CAAC,aAAa,GAAG,eAAe,IAAI;AAC1C,gBAAM,SAA6B,MAAM,IAAI,QAAQ,CAAC,YAAY;AACjE,kBAAM,WAAW,MAAM,aAAa,CAAC,GAAG,eAAe,GAAG;AAAA,cACzD,OAAO;AAAA,cACP,OAAO;AAAA,cACP,KAAK;AAAA,gBACJ,GAAG,gBAAgB;AAAA,gBACnB,GAAG,QAAQ;AAAA,gBACX,gBAAgB,KAAK,UAAU,OAAO,KAAK,UAAU,CAAC;AAAA,cACvD;AAAA,YACD,CAAC;AAED,kBAAM,4BAA4BA,QAAO;AAAA,cACxC,kBAAkB;AAAA,cAClB,QAAQ;AAAA;AAAA;AAAA,gBAGP,GAAG;AAAA,cACJ;AAAA,YACD,CAAC;AAED,qBAAS,OAAO,YAAY,MAAM;AAElC,gBAAI,kBACH,yBACA,aAAa,UAAU,SAAS;AACjC,gBAAI,oBAAoB,MAAM;AAC7B,gCAAkB;AAAA,YACnB;AAGA,gBAAI,qBACH,CAAC,QAAgB;AAClB,gBAAI,iBAAiB;AACpB,kBACC,CAAC,iBAAiB,SAAS,eAAkC,GAC5D;AAED,sBAAM,IAAI;AAAA,kBACT,6BAA6B;AAAA,gBAC9B;AAAA,cACD;AACA,oBAAM,wBAAwB;AAAA,gBAC7B,MAAM;AAAA,cACP;AACA,kBAAID,OAAM,qBAAqB,GAAG;AACjC,qCAAqBA,OACpB,qBACD;AAAA,cACD,OAAO;AACN,wBAAQ;AAAA,kBACP,6BAA6B;AAAA,gBAC9B;AACA,qCAAqBA,OAAM;AAAA,cAC5B;AAAA,YACD;AAEA,kBAAM,SACL,oBACA,cAAc,UAAU,SAAS,mBAC9B,GACA,cAAc,UAAU,SAAS,gBACjC,gBACA,gBAEA;AACJ,qBAAS,OAAO,GAAG,QAAQ,SAAU,MAAM;AAG1C,oBAAM,QAAQ;AAAA,gBACb,KACE,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,GAAG,SAAS,MAAM,EAChC,KAAK,IAAI;AAAA,cACZ;AAKA,oBAAM,iBACJ,gBACA,cAAc,UAAU,SAAS,kBAAkB,OACjD,OAAO,QAAQ,0BAA0B,UAAU,CAAC,CAAC,EACpD,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM;AACvB,oBAAI,EAAE,SAAS,EAAE,QAAQ;AACxB,yBAAO;AAAA,gBACR,WAAW,EAAE,SAAS,EAAE,QAAQ;AAC/B,yBAAO;AAAA,gBACR,OAAO;AACN,yBAAO;AAAA,gBACR;AAAA,cACD,CAAC,EACA,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;AAC9B,oBAAI,cAAc,WAAW,MAAM,SAAS,GAAG,GAAG;AACjD,yBAAO;AAAA,gBACR,OAAO;AACN,wBAAM,gBAAgB,MAAM,QAAQ,MAAM,GAAG;AAC7C,yBAAO,IAAI,QAAQ,OAAO,aAAa;AAAA,gBACxC;AAAA,cACD,GAAG,KAAe,IAClB;AAEJ,sBAAQ,IAAI,aAAa;AAAA,YAC1B,CAAC;AAED,qBAAS,OAAO,YAAY,MAAM;AAClC,qBAAS,OAAO,GAAG,QAAQ,SAAU,MAAM;AAC1C,sBAAQ,OAAO,MAAM,KAAK,SAAS,CAAC;AAAA,YACrC,CAAC;AAED,qBAAS,GAAG,QAAQ,CAAC,SAAiB;AACrC,sBAAQ,IAAI;AAAA,YACb,CAAC;AAAA,UACF,CAAC;AAED,cAAI,WAAW,GAAG;AACjB,oBAAQ,KAAK,UAAU,CAAC;AAAA,UACzB;AAAA,QACD,OAAO;AACN,gBAAM,IAAI,MAAM,+BAA+B;AAAA,QAChD;AAAA,MACD,SAAS,GAAP;AACD,gBAAQ,MAAM,OAAO,EAAE,OAAO,CAAC;AAC/B,gBAAQ,KAAK;AAAA,MACd;AAAA,IACD;AAAA,EACD;AACD,oBAAkB;AAAA,IACjB,SAAS;AAAA,IACT,aAAa,mBAAmB,QAAQ;AAAA,IACxC;AAAA,EACD,CAAC;AAED,MAAI,kBAAkB;AACrB,qBAAiB,IAAI,CAAC,QAAQ;AAC7B,YAAM,EAAE,SAAAP,UAAS,gBAAgB,IAAI;AACrC,uBAAiBA,UAAS,UAAU;AACpC,uBAAiB,iBAAiB,YAAY,IAAI;AAAA,IACnD,CAAC;AACD,UAAM,UAAU,iBAAiB,IAAI,CAAC,MAAM,EAAE,kBAAkB;AAEhE,eAAW;AAAA,MACV;AAAA,MACA,oBAAoB,QAAQ,SAAS,IAAI,MAAM,OAC7C,QAAQ,KAAK,IAAI,GAAG,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI;AAAA;AAAA,IAG3D;AAAA,EACD;AACA,SAAO;AACR;AAEA,IAAOS,eAAQ;;;AtB/Pf,OAAO,SAAgC;AACvC,OAAO,iBAAiB;AAExB,IAAM,YAA+B;AAAA,EACpC,SAAS;AAAA,EACT,MAAM;AAAA,EACN,YAAY;AAAA,IACX,MAAM;AAAA,IACN,aAAa;AAAA,EACd;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS,CAAC,WAAW,CAAC,MAAM,QAAQ;AACnC,QAAI,KAAK;AACR,YAAM,EAAE,YAAY,mBAAmB,IAAI;AAC3C,iBAAW,kBAAkB,IAAI,SAAS,KAAK,CAAC,IAAI,KAAK,MAAM,MAAM;AACrE,aAAO;AAAA,IACR,OAAO;AACN,aAAO;AAAA,IACR;AAAA,EACD;AACD;AAEA,IAAM,UAAU,IAAId,SAAQ;AAAA,CAE3B,YAAY;AACZ,QAAM,gBAAgB,YAAY,QAAQ,IAAI;AAC9C,QAAM,oBAA8B,CAAC;AACrC,MAAI,cAAc,QAAQ;AACzB,QAAI,MAAM,QAAQ,cAAc,MAAM,GAAG;AACxC,wBAAkB,KAAK,GAAG,cAAc,MAAM;AAAA,IAC/C,OAAO;AACN,wBAAkB,KAAK,cAAc,MAAM;AAAA,IAC5C;AAAA,EACD;AAEA,QAAM,iBAAiB,cAAc,cAAc,cAAc;AAEjE,QAAM,aACL;AAAA,IACC,GAAI,MAAM,QAAQ,cAAc,IAAI,iBAAiB,CAAC,cAAc;AAAA,EACrE,IAAI,CAAC,KAAK,QAAQ,IAAI;AACvB,QAAM,EAAE,UAAU,eAAe,CAAC,EAAE,IAAI,MAAM,iBAAiB,UAAU;AACzE,QAAM,EAAE,WAAW,CAAC,GAAG,MAAM,eAAe,QAAQ,IAAI;AACxD,UACE,KAAK,QAAQ,EACb,YAAY,kBAAkB,EAC9B,QAAQ,OAAO,EACf,mBAAmB,EACnB,OAAO,CAAC,UAAU,UAAmB;AACrC,UAAM,KAAK;AAAA,EACZ,CAAC;AACF,oBAAkB,EAAE,SAAS,aAA2B,CAAC;AACzD,QAAM,MAAM,IAAI,IAAI;AAAA,IACnB,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,UAAU,CAAC,SAAS;AAAA,EACrB,CAAC;AAED,QAAM,gBAA2C,CAAC;AAGlD,MAAI,SAAS;AACZ,eAAW,cAAc,SAAS;AACjC,UAAI,CAAC,UAAU,UAAU,UAAU,GAAG;AACrC,iBAAS,UAAU;AAAA,UAClB,GAAG,SAAS;AAAA,UACZ,CAAC,UAAU,GAAG,CAAC;AAAA,QAChB;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAGA,MAAI,kBAAkB,SAAS,GAAG;AACjC,eAAW,gBAAgB,mBAAmB;AAE7C,YAAM,SAAS,MAAM,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG5D,YAAM,eAAe,MAAM,OAAO;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AACD,oBAAc,aAAa,IAAI,IAAI;AAEnC,UAAI,kBAAkB,WAAW,GAAG;AAEnC,qBAAa,WAAW;AAAA,UACvB,GAAG,aAAa;AAAA,UAChB,kBAAkB,OAAO,aAAa,IAAI;AAAA,UAC1C,SAAS;AAAA,YACR,GAAG,aAAa,UAAU;AAAA,YAC1B,CAAC,aAAa,IAAI,GAAG;AAAA,cACpB,GAAG,aAAa,UAAU,UAAU,aAAa,IAAI;AAAA,YACtD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,MAAI,UAAU,kBAAkB;AAC/B,QAAI,CAAC,UAAU,UAAU,SAAS,gBAAgB,GAAG;AACpD,eAAS,UAAU;AAAA,QAClB,GAAG,SAAS;AAAA,QACZ,CAAC,SAAS,gBAAgB,GAAG,CAAC;AAAA,MAC/B;AAAA,IACD;AAAA,EACD;AACA,MAAI,UAAU,SAAS;AACtB,WAAO,QAAQ,UAAU,OAAO,EAAE;AAAA,MACjC,CAAC,CAAC,YAAY,YAAY,MAAoC;AAC7D,YAAI,cAAc,MAAM;AACvB,wBAAc,UAAU,IAAI,cAAc;AAAA,QAC3C,OAAO;AACN,wBAAc,UAAU,IAAI,kBAAkB;AAAA,QAC/C;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAEA,SAAO,OAAO,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,iBAAiB;AAC5D,WAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,eAAe;AACjD,UAAI,CAAC,cAAc,UAAU,GAAG;AAC/B,sBAAc,UAAU,IAAI,kBAAkB;AAAA,MAC/C;AAAA,IACD,CAAC;AAAA,EACF,CAAC;AAGD,QAAM,2BAA4D,CAAC;AACnE,QAAM,2BAA4D,CAAC;AACnE,QAAM,wBAGA,CAAC;AAEP,aAAW,cAAc,OAAO,KAAK,aAAa,GAAG;AACpD,UAAM,eAAe,cAAc,UAAU;AAC7C,UAAM,mBAAmB,MAAM,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACtE,UAAM,EAAE,eAAe,aAAa,IAAI,IAAI,MAAM,iBAAiB;AAAA,MAClE;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAED,QAAI,KAAK,SAAS;AACjB,+BAAyB,KAAK,IAAI,OAAO;AAAA,IAC1C;AACA,QAAI,KAAK,SAAS;AACjB,+BAAyB,KAAK,IAAI,OAAO;AACzC,UAAI,KAAK,MAAM;AACd,8BAAsB,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,MACpE;AAAA,IACD;AAEA,QAAI,eAAe;AAClB,oBAAc,EAAE,QAAQ,CAAC;AAAA,IAC1B;AAAA,EACD;AACA,MAAI,yBAAyB,QAAQ;AACpC,UAAMQ,iBAAkB,SAAS;AAAA,MAChC;AAAA,MACA,iBAAiB;AAAA,IAClB,CAAC;AAAA,EACF;AACA,MAAI,yBAAyB,QAAQ;AACpC,UAAMF,iBAAkB,SAAS;AAAA,MAChC;AAAA,MACA,iBAAiB;AAAA,IAClB,CAAC;AAAA,EACF;AACA,MAAI,sBAAsB,QAAQ;AACjC,UAAMK,cAAe,SAAS;AAAA,MAC7B;AAAA,MACA,UAAU;AAAA,IACX,CAAC;AAAA,EACF;AAGA,QAAMF,cAAe,SAAS,EAAE,aAA2B,CAAC;AAC5D,QAAMK,aAAc,SAAS;AAAA,IAC5B;AAAA,IACA,iBAAiB;AAAA,EAClB,CAAC;AACD,QAAM,QAAQ,MAAM;AACrB,GAAG","sourcesContent":["import { Command } from \"commander\";\n\nimport { getMagicalConfig } from \"../lib/getConfig\";\nimport { loadDotsecPlugin } from \"../lib/loadDotsecPlugin\";\nimport {\n\tDotsecCliPluginDecryptHandler,\n\tDotsecCliPluginEncryptHandler,\n\tDotsecCliPluginPushHandler,\n\tDotsecPluginConfig,\n} from \"../types/plugin\";\nimport addDecryptProgram from \"./commands/decrypt\";\nimport addEncryptProgram from \"./commands/encrypt\";\nimport addInitCommand from \"./commands/init\";\nimport addPushProgram from \"./commands/push\";\nimport addRunCommand from \"./commands/run\";\nimport { setProgramOptions } from \"./options\";\nimport Ajv, { KeywordDefinition } from \"ajv\";\nimport yargsParser from \"yargs-parser\";\n\nconst separator: KeywordDefinition = {\n\tkeyword: \"separator\",\n\ttype: \"string\",\n\tmetaSchema: {\n\t\ttype: \"string\",\n\t\tdescription: \"value separator\",\n\t},\n\tmodifying: true,\n\tvalid: true,\n\terrors: false,\n\tcompile: (schema) => (data, ctx) => {\n\t\tif (ctx) {\n\t\t\tconst { parentData, parentDataProperty } = ctx;\n\t\t\tparentData[parentDataProperty] = data === \"\" ? [] : data.split(schema);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n};\n\nconst program = new Command();\n\n(async () => {\n\tconst parsedOptions = yargsParser(process.argv);\n\tconst argvPluginModules: string[] = [];\n\tif (parsedOptions.plugin) {\n\t\tif (Array.isArray(parsedOptions.plugin)) {\n\t\t\targvPluginModules.push(...parsedOptions.plugin);\n\t\t} else {\n\t\t\targvPluginModules.push(parsedOptions.plugin);\n\t\t}\n\t}\n\n\tconst someConfigFile = parsedOptions.configFile || parsedOptions.c;\n\n\tconst configFile =\n\t\t[\n\t\t\t...(Array.isArray(someConfigFile) ? someConfigFile : [someConfigFile]),\n\t\t]?.[0] || process.env.DOTSEC_CONFIG_FILE;\n\tconst { contents: dotsecConfig = {} } = await getMagicalConfig(configFile);\n\tconst { defaults = {}, push: pushVariables, plugins } = dotsecConfig;\n\tprogram\n\t\t.name(\"dotsec\")\n\t\t.description(\".env, but secure\")\n\t\t.version(\"1.0.0\")\n\t\t.passThroughOptions()\n\t\t.action((_options, other: Command) => {\n\t\t\tother.help();\n\t\t});\n\tsetProgramOptions({ program, dotsecConfig: dotsecConfig });\n\tconst ajv = new Ajv({\n\t\tallErrors: true,\n\t\tremoveAdditional: true,\n\t\tuseDefaults: true,\n\t\tcoerceTypes: true,\n\t\tallowUnionTypes: true,\n\t\taddUsedSchema: false,\n\t\tkeywords: [separator],\n\t});\n\t// if we have plugins in the cli, we need to define them in pluginModules\n\tconst pluginModules: { [key: string]: string } = {};\n\n\t// check plugins\n\tif (plugins) {\n\t\tfor (const pluginName of plugins) {\n\t\t\tif (!defaults?.plugins?.[pluginName]) {\n\t\t\t\tdefaults.plugins = {\n\t\t\t\t\t...defaults.plugins,\n\t\t\t\t\t[pluginName]: {},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t// check argv\n\tif (argvPluginModules.length > 0) {\n\t\tfor (const pluginModule of argvPluginModules) {\n\t\t\t// let's load em up\n\t\t\tconst plugin = await loadDotsecPlugin({ name: pluginModule });\n\n\t\t\t// good, let's fire 'em up\n\t\t\tconst loadedPlugin = await plugin({\n\t\t\t\tdotsecConfig: dotsecConfig,\n\t\t\t\tajv,\n\t\t\t\tconfigFile,\n\t\t\t});\n\t\t\tpluginModules[loadedPlugin.name] = pluginModule;\n\n\t\t\tif (argvPluginModules.length === 1) {\n\t\t\t\t// if we only have one plugin, let's set it as the default\n\t\t\t\tdotsecConfig.defaults = {\n\t\t\t\t\t...dotsecConfig.defaults,\n\t\t\t\t\tencryptionEngine: String(loadedPlugin.name),\n\t\t\t\t\tplugins: {\n\t\t\t\t\t\t...dotsecConfig.defaults?.plugins,\n\t\t\t\t\t\t[loadedPlugin.name]: {\n\t\t\t\t\t\t\t...dotsecConfig.defaults?.plugins?.[loadedPlugin.name],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tif (defaults?.encryptionEngine) {\n\t\tif (!defaults?.plugins?.[defaults.encryptionEngine]) {\n\t\t\tdefaults.plugins = {\n\t\t\t\t...defaults.plugins,\n\t\t\t\t[defaults.encryptionEngine]: {},\n\t\t\t};\n\t\t}\n\t}\n\tif (defaults?.plugins) {\n\t\tObject.entries(defaults?.plugins).forEach(\n\t\t\t([pluginName, pluginModule]: [string, DotsecPluginConfig]) => {\n\t\t\t\tif (pluginModule?.name) {\n\t\t\t\t\tpluginModules[pluginName] = pluginModule?.name;\n\t\t\t\t} else {\n\t\t\t\t\tpluginModules[pluginName] = `@dotsec/plugin-${pluginName}`;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tObject.values(pushVariables || {}).forEach((pushVariable) => {\n\t\tObject.keys(pushVariable).forEach((pluginName) => {\n\t\t\tif (!pluginModules[pluginName]) {\n\t\t\t\tpluginModules[pluginName] = `@dotsec/plugin-${pluginName}`;\n\t\t\t}\n\t\t});\n\t});\n\n\t// configure encryption command\n\tconst cliPluginEncryptHandlers: DotsecCliPluginEncryptHandler[] = [];\n\tconst cliPluginDecryptHandlers: DotsecCliPluginDecryptHandler[] = [];\n\tconst cliPluginPushHandlers: {\n\t\tpush: DotsecCliPluginPushHandler;\n\t\tdecrypt: DotsecCliPluginDecryptHandler;\n\t}[] = [];\n\n\tfor (const pluginName of Object.keys(pluginModules)) {\n\t\tconst pluginModule = pluginModules[pluginName];\n\t\tconst initDotsecPlugin = await loadDotsecPlugin({ name: pluginModule });\n\t\tconst { addCliCommand, cliHandlers: cli } = await initDotsecPlugin({\n\t\t\tajv,\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tconfigFile,\n\t\t});\n\n\t\tif (cli?.encrypt) {\n\t\t\tcliPluginEncryptHandlers.push(cli.encrypt);\n\t\t}\n\t\tif (cli?.decrypt) {\n\t\t\tcliPluginDecryptHandlers.push(cli.decrypt);\n\t\t\tif (cli?.push) {\n\t\t\t\tcliPluginPushHandlers.push({ push: cli.push, decrypt: cli.decrypt });\n\t\t\t}\n\t\t}\n\n\t\tif (addCliCommand) {\n\t\t\taddCliCommand({ program });\n\t\t}\n\t}\n\tif (cliPluginEncryptHandlers.length) {\n\t\tawait addEncryptProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tencryptHandlers: cliPluginEncryptHandlers,\n\t\t});\n\t}\n\tif (cliPluginDecryptHandlers.length) {\n\t\tawait addDecryptProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tdecryptHandlers: cliPluginDecryptHandlers,\n\t\t});\n\t}\n\tif (cliPluginPushHandlers.length) {\n\t\tawait addPushProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\thandlers: cliPluginPushHandlers,\n\t\t});\n\t}\n\n\t// add other commands\n\tawait addInitCommand(program, { dotsecConfig: dotsecConfig });\n\tawait addRunCommand(program, {\n\t\tdotsecConfig: dotsecConfig,\n\t\tdecryptHandlers: cliPluginDecryptHandlers,\n\t});\n\tawait program.parse();\n})();\n","import { DotsecConfig } from \"./types/config\";\n\nexport const DOTSEC_DEFAULT_CONFIG_FILE = \"dotsec.config.ts\";\nexport const DOTSEC_CONFIG_FILES = [DOTSEC_DEFAULT_CONFIG_FILE];\nexport const DOTSEC_DEFAULT_DOTSEC_FILENAME = \".sec\";\nexport const DOTSEC_DEFAULT_DOTENV_FILENAME = \".env\";\nexport const defaultConfig: DotsecConfig = {\n\tdefaults: {\n\t\t// encryptionEngine: \"pke\",\n\t\t// plugins: {\n\t\t// \tpke: {},\n\t\t// },\n\t\toptions: {\n\t\t\tshowRedacted: false,\n\t\t},\n\t},\n};\n","import fs from \"fs\";\nimport path from \"node:path\";\n\n/**\n * Parse JSONC\n * @date 12/7/2022 - 12:48:45 PM\n *\n * @export\n * @param {string} data\n * @returns {*}\n */\nexport function jsoncParse(data: string) {\n\ttry {\n\t\treturn new Function(`return ${data.trim()}`)();\n\t} catch {\n\t\t// Silently ignore any error\n\t\t// That's what tsc/jsonc-parser did after all\n\t\treturn {};\n\t}\n}\n\n/**\n * Load JSON\n * @date 12/7/2022 - 12:48:57 PM\n *\n * @async\n * @param {string} filepath\n * @returns {unknown}\n */\nexport const loadJson = async (filepath: string) => {\n\ttry {\n\t\treturn jsoncParse(await fs.promises.readFile(filepath, \"utf8\"));\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse ${path.relative(process.cwd(), filepath)}: ${\n\t\t\t\t\terror.message\n\t\t\t\t}`,\n\t\t\t);\n\t\t} else {\n\t\t\tthrow error;\n\t\t}\n\t}\n};\n","import { DOTSEC_CONFIG_FILES, defaultConfig } from \"../constants\";\nimport { DotsecConfig } from \"../types/config\";\nimport { DotsecConfigAndSource } from \"../types/plugin\";\nimport { loadJson } from \"./json\";\nimport { bundleRequire } from \"bundle-require\";\nimport JoyCon from \"joycon\";\nimport path from \"path\";\n\nexport const getMagicalConfig = async (\n\tfilename?: string,\n): Promise<DotsecConfigAndSource> => {\n\tconst cwd = process.cwd();\n\tconst configJoycon = new JoyCon();\n\tconst configPath = await configJoycon.resolve({\n\t\tfiles: filename ? [filename] : [...DOTSEC_CONFIG_FILES, \"package.json\"],\n\t\tcwd,\n\t\tstopDir: path.parse(cwd).root,\n\t\tpackageKey: \"dotsec\",\n\t});\n\tif (filename && configPath === null) {\n\t\tthrow new Error(`Could not find config file ${filename}`);\n\t}\n\tif (configPath) {\n\t\tif (configPath.endsWith(\".json\")) {\n\t\t\tconst rawData = (await loadJson(configPath)) as Partial<DotsecConfig>;\n\n\t\t\tlet data: Partial<DotsecConfig>;\n\n\t\t\tif (\n\t\t\t\tconfigPath.endsWith(\"package.json\") &&\n\t\t\t\t(rawData as { dotsec: Partial<DotsecConfig> }).dotsec !== undefined\n\t\t\t) {\n\t\t\t\tdata = (rawData as { dotsec: Partial<DotsecConfig> }).dotsec;\n\t\t\t} else {\n\t\t\t\tdata = rawData as Partial<DotsecConfig>;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsource: \"json\",\n\t\t\t\tcontents: {\n\t\t\t\t\t...defaultConfig,\n\t\t\t\t\t...data,\n\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t...data?.defaults,\n\t\t\t\t\t\t...defaultConfig.defaults,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t...data?.defaults?.options,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.options,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t...data?.defaults?.plugins,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.plugins,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tpush: {\n\t\t\t\t\t\t...data?.push,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t} else if (configPath.endsWith(\".ts\")) {\n\t\t\tconst bundleRequireResult = await bundleRequire({\n\t\t\t\tfilepath: configPath,\n\t\t\t});\n\t\t\tconst data = (bundleRequireResult.mod.dotsec ||\n\t\t\t\tbundleRequireResult.mod.default ||\n\t\t\t\tbundleRequireResult.mod) as Partial<DotsecConfig>;\n\n\t\t\treturn {\n\t\t\t\tsource: \"ts\",\n\t\t\t\tcontents: {\n\t\t\t\t\t...defaultConfig,\n\t\t\t\t\t...data,\n\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t...data?.defaults,\n\t\t\t\t\t\t...defaultConfig.defaults,\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t...data?.defaults?.plugins,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.plugins,\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t...data?.defaults?.options,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.options,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tpush: {\n\t\t\t\t\t\t...data?.push,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\treturn { source: \"defaultConfig\", contents: defaultConfig };\n};\n","import { DotsecPluginModule } from \"../types/plugin\";\n\nexport const loadDotsecPlugin = async (options: {\n\tname: string;\n}): Promise<DotsecPluginModule> => {\n\treturn import(options.name).then((imported) => {\n\t\treturn imported.default;\n\t});\n};\n","import { DotsecCliOption } from \"../types/plugin\";\nimport { Command, Option } from \"commander\";\n\nexport const addPluginOptions = (\n\toptions:\n\t\t| {\n\t\t\t\t[x: string]: DotsecCliOption;\n\t\t }\n\t\t| undefined,\n\tcommand: Command,\n\tmandatory?: boolean,\n) => {\n\tif (options) {\n\t\tObject.values(options).map((option) => {\n\t\t\tlet optionProps:\n\t\t\t\t| {\n\t\t\t\t\t\tflags: string;\n\t\t\t\t\t\tdescription?: string;\n\t\t\t\t\t\tdefaultValue?: string | boolean | string[];\n\t\t\t\t\t\tchoices?: string[];\n\t\t\t\t\t\tfn?: (value: string, previous: unknown) => unknown;\n\t\t\t\t\t\tregexp?: RegExp;\n\t\t\t\t\t\tenv?: string;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t\tif (Array.isArray(option)) {\n\t\t\t\tconst [flags, description, defaultValue] = option;\n\t\t\t\toptionProps = {\n\t\t\t\t\tflags,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst { flags, description, defaultValue, choices, env, fn } = option;\n\t\t\t\toptionProps = {\n\t\t\t\t\tflags,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t\tchoices,\n\t\t\t\t\tenv,\n\t\t\t\t\tfn,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optionProps) {\n\t\t\t\tconst newOption = new Option(\n\t\t\t\t\toptionProps.flags,\n\t\t\t\t\toptionProps.description,\n\t\t\t\t);\n\t\t\t\tif (optionProps.fn) {\n\t\t\t\t\tnewOption.argParser(optionProps.fn);\n\t\t\t\t}\n\t\t\t\tif (optionProps.defaultValue) {\n\t\t\t\t\tnewOption.default(optionProps.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (optionProps.env) {\n\t\t\t\t\tnewOption.env(optionProps.env);\n\t\t\t\t}\n\t\t\t\tif (mandatory) {\n\t\t\t\t\tnewOption.makeOptionMandatory(true);\n\t\t\t\t}\n\t\t\t\tif (optionProps.choices) {\n\t\t\t\t\tnewOption.choices(optionProps.choices);\n\t\t\t\t}\n\t\t\t\tcommand.addOption(newOption);\n\t\t\t}\n\t\t});\n\t}\n};\n","import fs, { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nexport const readContentsFromFile = async (\n\tfilePath: string,\n): Promise<string> => {\n\treturn await fs.readFile(filePath, \"utf-8\");\n};\n\nexport const writeContentsToFile = async (\n\tfilePath: string,\n\tcontents: string,\n): Promise<void> => {\n\treturn await fs.writeFile(filePath, contents, \"utf-8\");\n};\n\nexport const fileExists = async (source: string): Promise<boolean> => {\n\ttry {\n\t\tawait stat(source);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const promptOverwriteIfFileExists = async ({\n\tfilePath,\n\tskip,\n}: {\n\tfilePath: string;\n\tskip?: boolean;\n}) => {\n\tlet overwriteResponse: prompts.Answers<\"overwrite\"> | undefined;\n\n\tif ((await fileExists(filePath)) && skip !== true) {\n\t\toverwriteResponse = await prompts({\n\t\t\ttype: \"confirm\",\n\t\t\tname: \"overwrite\",\n\t\t\tmessage: () => {\n\t\t\t\treturn `Overwrite './${path.relative(process.cwd(), filePath)}' ?`;\n\t\t\t},\n\t\t});\n\t} else {\n\t\toverwriteResponse = undefined;\n\t}\n\treturn overwriteResponse;\n};\n","const LINE =\n\t/^(#.*)|(\\s?\\r?\\n)|(?:^|^)\\s*(?:export\\s+)?([\\w.-]*)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?(\\s*)(#.*)?(?:$|$)/gm;\n\nexport type ParseResult = {\n\ttype: \"value\" | \"comment\" | \"whitespace\";\n\tkey?: string;\n\tvalue?: string;\n\traw?: string;\n}[];\n\n// Parser src into an Object\nexport const parse = (src: string) => {\n\tconst obj: Record<string, string> = {};\n\tconst blocks: ParseResult = [];\n\n\t// Convert buffer to string\n\tlet lines = src.toString();\n\n\t// Convert line breaks to same format\n\tlines = lines.replace(/\\r\\n?/gm, \"\\n\");\n\n\tlet match;\n\twhile ((match = LINE.exec(lines)) != null) {\n\t\tconst key = match[3];\n\n\t\tif (match?.[1]?.[0] === \"#\") {\n\t\t\tblocks.push({ type: \"comment\", raw: match[1] });\n\t\t} else if (match?.[2]) {\n\t\t\tblocks.push({ type: \"whitespace\", raw: match[2] });\n\t\t} else {\n\t\t\t// Default undefined or null to empty string\n\t\t\tlet value = match[4] || \"\";\n\n\t\t\t// Remove whitespace\n\t\t\tvalue = value.trim();\n\n\t\t\t// Check if double quoted\n\t\t\tconst maybeQuote = value[0];\n\n\t\t\t// Remove surrounding quotes\n\t\t\tvalue = value.replace(/^(['\"`])([\\s\\S]*)\\1$/gm, \"$2\");\n\n\t\t\t// Expand newlines if double quoted\n\t\t\tif (maybeQuote === '\"') {\n\t\t\t\tvalue = value.replace(/\\\\n/g, \"\\n\");\n\t\t\t\tvalue = value.replace(/\\\\r/g, \"\\r\");\n\t\t\t}\n\n\t\t\tobj[key] = value;\n\n\t\t\t// Add to object\n\t\t\tblocks.push({\n\t\t\t\ttype: \"value\",\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t\traw: value + (match[5] ? match[5] : \"\") + (match[6] ? match[6] : \"\"),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { blocks, obj };\n};\n\nif (import.meta.vitest) {\n\tconst { it, expect } = import.meta.vitest;\n\n\tit(\"parse\", () => {\n\t\tconst input1 = \"KEY=value\";\n\t\tconst input2 = 'KEY=\"value\"';\n\t\tconst input3 = \"KEY='value'\";\n\t\tconst input4 = \"KEY=value # this is a comment\";\n\n\t\t// const expectedResult1 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: 'value' },\n\t\t// ];\n\t\t// const expectedResult2 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: '\"value\"' },\n\t\t// ];\n\t\t// const expectedResult3 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: \"'value'\" },\n\t\t// ];\n\t\t// const expectedResult4 = [\n\t\t// {\n\t\t// type: 'value',\n\t\t// key: 'KEY',\n\t\t// value: 'value',\n\t\t// raw: 'value # this is a comment',\n\t\t// },\n\t\t// ];\n\n\t\texpect(parse(input1)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input2)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input3)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input4)).toMatchInlineSnapshot(`\n {\n \"blocks\": [\n {\n \"key\": \"KEY\",\n \"raw\": \"value# this is a comment\",\n \"type\": \"value\",\n \"value\": \"value\",\n },\n ],\n \"obj\": {\n \"KEY\": \"value\",\n },\n }\n `);\n\t});\n}\n","import chalk from \"chalk\";\nimport Table from \"cli-table\";\nexport { Table };\n\nlet _logger: Pick<Console, \"info\" | \"error\" | \"table\">;\nexport const getLogger = () => {\n\tif (!_logger) {\n\t\t_logger = console;\n\t}\n\n\treturn _logger;\n};\nexport const writeLine = (str: string) => {\n\tprocess.stdout.write(str);\n};\nexport const emphasis = (str: string): string => chalk.yellowBright(str);\nexport const strong = (str: string): string => chalk.yellow.bold(str);\n\nexport const clientLogger = {\n\tdebug(content: object) {\n\t\tconsole.log(content);\n\t},\n\tinfo(content: object) {\n\t\tconsole.log(content);\n\t},\n\twarn(content: object) {\n\t\tconsole.log(content);\n\t},\n\terror(content: object) {\n\t\tconsole.error(content);\n\t},\n};\n","import { DotsecConfig } from \"../../types/index\";\nimport { Command, Option } from \"commander\";\n\nimport decryptCommandDefaults from \"./decrypt\";\nimport dotsecCommandDefaults from \"./dotsec\";\nimport encryptCommandDefaults from \"./encrypt\";\nimport initCommandDefaults from \"./init\";\nimport pushCommandDefaults from \"./push\";\nimport runCommandDefaults from \"./run\";\nimport {\n\tCommandOption,\n\tDeepExpandedCommandOption,\n\tDotSecCommandsDefaults,\n\tExpandedCommandOption,\n} from \"./types\";\n\nexport const commandOptions: DotSecCommandsDefaults = {\n\t...dotsecCommandDefaults,\n\t...initCommandDefaults,\n\t...encryptCommandDefaults,\n\t...decryptCommandDefaults,\n\t...runCommandDefaults,\n\t...pushCommandDefaults,\n};\n\nconst expandCommandOption = (\n\tcommandOption: CommandOption | ExpandedCommandOption,\n): DeepExpandedCommandOption => {\n\tif (Array.isArray(commandOption)) {\n\t\tconst [flags, description, defaultValue] = commandOption;\n\t\tconst optionProps = {\n\t\t\tflags,\n\t\t\tdescription,\n\t\t\tdefaultValue,\n\t\t};\n\t\treturn optionProps;\n\t} else {\n\t\tif (\"option\" in commandOption) {\n\t\t\tconst [flags, description, defaultValue] = commandOption.option;\n\t\t\tconst optionProps = {\n\t\t\t\tflags,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue,\n\t\t\t\tenv: commandOption.env,\n\t\t\t};\n\t\t\treturn optionProps;\n\t\t}\n\t\treturn commandOption;\n\t}\n};\n\nconst createOption = (\n\tcommandOption: CommandOption | ExpandedCommandOption,\n\toptions: {\n\t\trequired?: boolean;\n\t\tdotsecConfig?: DotsecConfig;\n\t\toptionKey: string;\n\t},\n): Option => {\n\tconst defaultOptionValueFromConfig =\n\t\toptions?.dotsecConfig?.defaults?.options?.[options?.optionKey];\n\tconst optionProps = expandCommandOption(commandOption);\n\n\tconst newOption = new Option(optionProps.flags, optionProps.description);\n\tif (optionProps.fn) {\n\t\tnewOption.argParser(optionProps.fn);\n\t}\n\tif (optionProps.defaultValue) {\n\t\tnewOption.default(defaultOptionValueFromConfig || optionProps.defaultValue);\n\t}\n\tif (optionProps.env) {\n\t\tnewOption.env(optionProps.env);\n\t}\n\tif (options.required) {\n\t\tnewOption.makeOptionMandatory(true);\n\t}\n\tif (optionProps.choices) {\n\t\tnewOption.choices(optionProps.choices);\n\t}\n\n\treturn newOption;\n};\n\nexport const setProgramOptions = (params: {\n\tprogram: Command;\n\tcommandName?: string;\n\tdotsecConfig: DotsecConfig;\n}) => {\n\tconst { program, commandName, dotsecConfig } = params;\n\tconst programOptions = commandOptions[commandName || program.name()];\n\n\tif (programOptions) {\n\t\tconst { options, requiredOptions, description, usage, helpText } =\n\t\t\tprogramOptions;\n\t\tif (options) {\n\t\t\tObject.keys(options).forEach((optionKey) => {\n\t\t\t\tconst commandOption = options[optionKey];\n\t\t\t\tconst newOption = createOption(commandOption, {\n\t\t\t\t\tdotsecConfig,\n\t\t\t\t\toptionKey,\n\t\t\t\t});\n\n\t\t\t\tprogram.addOption(newOption);\n\t\t\t});\n\t\t}\n\t\tif (requiredOptions) {\n\t\t\tObject.keys(requiredOptions).forEach((requiredOptionKey) => {\n\t\t\t\tconst requiredOption = requiredOptions[requiredOptionKey];\n\t\t\t\tconst newOption = createOption(requiredOption, {\n\t\t\t\t\trequired: true,\n\t\t\t\t\tdotsecConfig,\n\t\t\t\t\toptionKey: requiredOptionKey,\n\t\t\t\t});\n\n\t\t\t\tprogram.addOption(newOption);\n\t\t\t});\n\t\t}\n\t\tif (description) {\n\t\t\tprogram.description(description);\n\t\t}\n\t\tif (usage) {\n\t\t\tprogram.usage(usage);\n\t\t}\n\t\tif (helpText) {\n\t\t\tprogram.description(helpText);\n\t\t}\n\t}\n};\n","export const backgroundColors = [\n\t\"black\",\n\t\"red\",\n\t\"green\",\n\t\"yellow\",\n\t\"blue\",\n\t\"magenta\",\n\t\"cyan\",\n\t\"white\",\n\t\"black-bright\",\n\t\"gray\",\n\t\"grey\",\n\t\"red-bright\",\n\t\"green-bright\",\n\t\"yellow-bright\",\n\t\"blue-bright\",\n\t\"magenta-bright\",\n\t\"cyan-bright\",\n\t\"white-bright\",\n] as const;\n\nexport type BackgroundColor = typeof backgroundColors[number];\n","import {\n\tDOTSEC_DEFAULT_DOTENV_FILENAME,\n\tDOTSEC_DEFAULT_DOTSEC_FILENAME,\n} from \"../../constants\";\nimport { backgroundColors } from \"../../types/colors\";\nimport { ExpandedCommandOption } from \"./types\";\n\nexport const envFileOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--env-file <envFile>\",\n\t\t`Path to .env file. If not provided, will look for value in 'ENV_FILE' environment variable. If not provided, will look for '${DOTSEC_DEFAULT_DOTENV_FILENAME}' file in current directory.`,\n\t\tDOTSEC_DEFAULT_DOTENV_FILENAME,\n\t],\n\tenv: \"ENV_FILE\",\n};\nexport const secFileOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--sec-file, <secFile>\",\n\t\t`Path to .sec file. If not provided, will look for value in 'SEC_FILE' environment variable. If not provided, will look for '${DOTSEC_DEFAULT_DOTSEC_FILENAME}' file in current directory.`,\n\t\tDOTSEC_DEFAULT_DOTSEC_FILENAME,\n\t],\n\tenv: \"SEC_FILE\",\n};\n\nexport const usingOption: ExpandedCommandOption = {\n\tflags: \"--using <using>\",\n\tdescription: \"Wether to use a dot env file or a dot sec file\",\n\tchoices: [\"env\", \"sec\"],\n\tenv: \"DOTSEC_USING\",\n};\n\nexport const usingNoEncryptionEngineOption: ExpandedCommandOption = {\n\tflags: \"--using <using>\",\n\tdescription: \"Wether to use a dot env file or a dot sec file\",\n\tchoices: [\"env\"],\n\tenv: \"DOTSEC_USING\",\n};\n\nexport const showRedactedOption: ExpandedCommandOption = {\n\tflags: \"--show-redacted\",\n\tdescription: \"Wether to show redacted values\",\n\tenv: \"DOTSEC_SHOW_REDACTED\",\n\tdefaultValue: false,\n};\n\nexport const showOutputPrefixOption: ExpandedCommandOption = {\n\tflags: \"--show-output-prefix\",\n\tdescription: \"Show output prefix\",\n\tenv: \"DOTSEC_SHOW_OUTPUT_PREFIX\",\n};\nexport const outputPrefixOption: ExpandedCommandOption = {\n\tflags: \"--output-prefix <outputPrefix>\",\n\tdescription: \"Output prefix\",\n\tenv: \"DOTSEC_OUTPUT_PREFIX\",\n};\n\nexport const outputBackgroundColorOption: ExpandedCommandOption = {\n\tflags: \"--output-background-color <outputBackgroundColor>\",\n\tdescription: \"Background color of the output.\",\n\tenv: \"DOTSEC_OUTPUT_BACKGROUND_COLOR\",\n\tchoices: backgroundColors as unknown as string[],\n\tdefaultValue: \"red-bright\",\n};\n\nexport const yesOption: ExpandedCommandOption = {\n\toption: [\"--yes\", \"Skip confirmation prompts\"],\n};\n\nexport const verboseOption: ExpandedCommandOption = {\n\toption: [\"--verbose\", \"Verbose output\"],\n};\n\nexport const configFileOption: ExpandedCommandOption = {\n\toption: [\"-c, --config-file, --configFile <configFile>\", \"Config file\"],\n\tenv: \"DOTSEC_CONFIG_FILE\",\n};\n\nexport const pluginOption: ExpandedCommandOption = {\n\toption: [\"--plugin <plugin>\", \"Comma-separated list of plugins to use\"],\n\tenv: \"DOTSEC_PLUGIN\",\n};\n\nexport const engineOption: ExpandedCommandOption = {\n\toption: [\"--engine <engine>\", \"Encryption engine to use\"],\n\tenv: \"DOTSEC_ENGINE\",\n};\n\nexport const createManifestOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--create-manifest\",\n\t\t\"Create a markdown manifest file. See the --manifest-file option for more information.\",\n\t],\n\tenv: \"CREATE_MANIFEST\",\n};\n\nexport const manifestFilePrefixOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--manifest-file-prefix <manifestFilePrefix>\",\n\t\t\"Mmanifest file prefix\",\n\t],\n\tenv: \"ENCRYPTION_MANIFEST_FILE\",\n};\n","import {\n\tconfigFileOption,\n\tcreateManifestOption,\n\tenvFileOption,\n\tmanifestFilePrefixOption,\n\tsecFileOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst decryptCommandDefaults: DotSecCommandsDefaults = {\n\tdecrypt: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tcreateManifest: createManifestOption,\n\t\t\tmanifestFilePrefix: manifestFilePrefixOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription: \"Decrypt a sec file\",\n\t\thelpText: `Examples:\n\n\nDecrypt .sec file to .env file\n\n$ npx dotsec decrypt\n\n\nSpecify a different .sec file\n\n$ npx dotsec decrypt --sec-file .sec.dev\n$ SEC_FILE=.sec.dev npx dotsec decrypt\n\nSpecify a different .env file\n\n$ npx dotsec decrypt --env-file .env.dev\n$ ENV_FILE=.env.dev npx dotsec decrypt\n\nWrite a manifest markdown file\n\n$ npx dotsec decrypt --create-manifest\n$ CREATE_MANIFEST=true npx dotsec decrypt\n\nSpecify a different manifest file\n\n$ npx dotsec decrypt --manifest-file .manifest.dev\n$ MANIFEST_FILE=decryption-manifest.md npx dotsec decrypt\n`,\n\t},\n};\n\nexport default decryptCommandDefaults;\n","import { configFileOption, pluginOption } from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst dotsecCommandDefaults: DotSecCommandsDefaults = {\n\tdotsec: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tplugin: pluginOption,\n\t\t},\n\t},\n};\n\nexport default dotsecCommandDefaults;\n","import {\n\tconfigFileOption,\n\tcreateManifestOption,\n\tenvFileOption,\n\tmanifestFilePrefixOption,\n\tsecFileOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst encryptCommandDefaults: DotSecCommandsDefaults = {\n\tencrypt: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tcreateManifest: createManifestOption,\n\t\t\tmanifestFile: manifestFilePrefixOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription: \"Encrypt an env file\",\n\t\thelpText: `Examples:\n\n\nEncrypt .env file to .sec file\n\n$ npx dotsec encrypt\n\n\nSpecify a different .env file\n\n$ npx dotsec encrypt --env-file .env.dev\n$ ENV_FILE=.env.dev npx dotsec encrypt\n\n\nSpecify a different .sec file\n\n$ npx dotsec encrypt --sec-file .sec.dev\n$ SEC_FILE=.sec.dev npx dotsec encrypt\n\n\nWrite a manifest markdown file\n\n$ npx dotsec encrypt --create-manifest\n$ CREATE_MANIFEST=true npx dotsec encrypt\n\n\nSpecify a different manifest file\n\n$ npx dotsec encrypt --manifest-file manifest.dev\n$ MANIFEST_FILE=encryption-manifest.md npx dotsec encrypt\n`,\n\t},\n};\n\nexport default encryptCommandDefaults;\n","import { configFileOption, yesOption } from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst initCommandDefaults: DotSecCommandsDefaults = {\n\tinit: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription:\n\t\t\t\"Initialize a dotsec project by creating a dotsec.config.ts file.\",\n\t\thelpText: `Examples:\n\nCreate a dotsec.config.ts file in the current directory\n\n$ npx dotsec init\n\n\nOverwrite an existing dotsec.config.ts file in the current directory\n\n$ npx dotsec init --yes\n\n\nCreate a dotsec config file in the current directory with a specific config file name\n\nBy specifying the --config-file option, you can create a dotsec config file with a specific name.\n\n$ npx dotsec init --config-file dotsec.config.ts\n\n$ DOTSEC_CONFIG_FILE=my.config.ts npx dotsec init\n`,\n\t},\n};\n\nexport default initCommandDefaults;\n","import {\n\tconfigFileOption,\n\tenvFileOption,\n\tsecFileOption,\n\tusingOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst pushCommandDefaults: DotSecCommandsDefaults = {\n\tpush: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingOption,\n\t\t},\n\t\tdescription: \"Push variables from env or sec file to a remote\",\n\t\thelpText: `Examples:\n\nPush variables from .env file to remote\n\n$ npx dotsec push --using env\n$ DOTSEC_USING=env npx dotsec push\n\n\nPush variables from .sec file to remote\n\n$ npx dotsec push --using sec\n$ DOTSEC_USING=sec npx dotsec push\n`,\n\t},\n};\n\nexport default pushCommandDefaults;\n","import {\n\tconfigFileOption,\n\tengineOption,\n\tenvFileOption,\n\toutputBackgroundColorOption,\n\toutputPrefixOption,\n\tsecFileOption,\n\tshowOutputPrefixOption,\n\tshowRedactedOption,\n\tusingNoEncryptionEngineOption,\n\tusingOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n/*\n\nrun --env-file=.env --sec-file=.sec --with=env-file\n\n*/\nconst runCommandDefaults: DotSecCommandsDefaults = {\n\trunEnvOnly: {\n\t\tusage: \"--using env [commandArgs...]\",\n\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tyes: yesOption,\n\t\t\tengine: engineOption,\n\t\t\tshowRedacted: showRedactedOption,\n\t\t\toutputBackgroundColor: outputBackgroundColorOption,\n\t\t\tshowOutputPrefix: showOutputPrefixOption,\n\t\t\toutputPrefix: outputPrefixOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingNoEncryptionEngineOption,\n\t\t},\n\n\t\tdescription:\n\t\t\t\"Run a command in a separate process and populate env with contents of a dotenv file.\",\n\t\thelpText: `Examples:\n\t\t\nRun a command with a .env file\n\t\t\n$ npx dotsec run --using env node -e \\\"console.log(process.env)\\\"\n\n\nRun a command with a specific .env file\n\n$ npx dotsec run --using env --env-file .env node -e \\\"console.log(process.env)\\\"\n\n\nRun a command with a specific ENV_FILE variable\n\n$ ENV_FILE=.env.dev npx dotsec run --using env node -e \\\"console.log(process.env)\\\"\n\n\nYou can also specify 'using' as an environment variable\n\n$ DOTSEC_USING=env npx dotsec run node -e \\\"console.log(process.env)\\\"\n\t\t`,\n\t},\n\trun: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tyes: yesOption,\n\t\t\tshowRedacted: showRedactedOption,\n\t\t\toutputBackgroundColor: outputBackgroundColorOption,\n\t\t\thideOutputPrefix: showOutputPrefixOption,\n\t\t\toutputPrefix: outputPrefixOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingOption,\n\t\t},\n\n\t\tusage: \"[--using env] [--using sec] [commandArgs...]\",\n\t\tdescription: `Run a command in a separate process and populate env with either \n\t\t\t- contents of a dotenv file\n\t\t\t- decrypted values of a dotsec file.\n\nThe --withEnv option will take precedence over the --withSec option. If neither are specified, the --withEnv option will be used by default.`,\n\t\thelpText: `${\"Examples:\"}\n\n${\"Run a command with a .env file\"}\n\n$ dotsec run echo \"hello world\"\n\n\n${\"Run a command with a specific .env file\"}\n\n$ dotsec run --with-env --env-file .env.dev echo \"hello world\"\n\n\n${\"Run a command with a .sec file\"}\n\n$ dotsec run --with-sec echo \"hello world\"\n\n\n${\"Run a command with a specific .sec file\"}\n\n$ dotsec run --with-sec --sec-file .sec.dev echo \"hello world\"\n`,\n\t},\n\t// push: {\n\t// \toptions: {\n\t// \t\t...dotsecCommandDefaults.dotsec.options,\n\t// \t\twithEnv: withEnvOption,\n\t// \t\twithSec: withSecOption,\n\t// \t\tenvFile: envFileOption,\n\t// \t\tsecFile: secFileOption,\n\t// \t\tyes: yesOption,\n\t// \t},\n\t// \trequiredOptions: {\n\t// \t\t...dotsecCommandDefaults.dotsec.requiredOptions,\n\t// \t},\n\t// },\n};\n\nexport default runCommandDefaults;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { parse } from \"../../lib/parse\";\nimport { DecryptCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginDecryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { Command } from \"commander\";\n\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n} & Record<string, unknown>;\n\nconst addEncryptProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\tdecryptHandlers: DotsecCliPluginDecryptHandler[];\n\t},\n) => {\n\tconst { dotsecConfig, decryptHandlers } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"decrypt\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tcreateManifest,\n\t\t\t\t\tmanifestFile,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<DecryptCommandOptions>();\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\tconst pluginCliDecrypt = (decryptHandlers || []).find((handler) => {\n\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t});\n\n\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${options.decryptHandlers\n\t\t\t\t\t\t\t.map((e) => `--${e.triggerOptionValue}`)\n\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t\"Decrypting with\",\n\t\t\t\t\tstrong(\n\t\t\t\t\t\tpluginCliDecrypt.encryptionEngineName ||\n\t\t\t\t\t\t\tpluginCliDecrypt.triggerOptionValue,\n\t\t\t\t\t),\n\t\t\t\t\t\"engine\",\n\t\t\t\t);\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliDecrypt.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliDecrypt.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\t// get current dot env file\n\t\t\t\tconst dotsecString = await readContentsFromFile(secFile);\n\n\t\t\t\tconst plaintext = await pluginCliDecrypt.handler({\n\t\t\t\t\tciphertext: dotsecString,\n\t\t\t\t\t...allOptionsValues,\n\t\t\t\t});\n\n\t\t\t\tconst dotenvOverwriteResponse = await promptOverwriteIfFileExists({\n\t\t\t\t\tfilePath: envFile,\n\t\t\t\t\tskip: yes,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tdotenvOverwriteResponse === undefined ||\n\t\t\t\t\tdotenvOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(envFile, plaintext);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote plaintext contents of ${strong(secFile)} file to ${strong(\n\t\t\t\t\t\t\tenvFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (createManifest || dotsecConfig?.defaults?.options?.createManifest) {\n\t\t\t\t\t// parse raw env contents into key value pairs using the dotenv package\n\t\t\t\t\tconst dotenvVars = parse(plaintext).obj;\n\t\t\t\t\t// expand env vars\n\t\t\t\t\tconst markdownManifest = `# Dotsec decryption manifest\n\n## Overview\n\n- plaintext source: ${envFile}\n- ciphertext target: ${secFile}\n- created: ${new Date().toUTCString()}\n- Decryption engine: ${\n\t\t\t\t\t\tpluginCliDecrypt.encryptionEngineName ||\n\t\t\t\t\t\tpluginCliDecrypt.triggerOptionValue\n\t\t\t\t\t}\n- Decryption engine options: ${JSON.stringify(allOptionsValues)}\n\n## Variables\n\n| Key |\n| --- |\n${Object.keys(dotenvVars)\n\t.map((key) => {\n\t\treturn `| \\`${key} \\`| `;\n\t})\n\t.join(\"\\n\")}\n`;\n\n\t\t\t\t\t// write manifest file, don't prompt to overwrite\n\t\t\t\t\tconst manifestTargetFile =\n\t\t\t\t\t\tmanifestFile || `${envFile}.decryption-manifest.md`;\n\t\t\t\t\tawait writeContentsToFile(manifestTargetFile, markdownManifest);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote manifest of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\tmanifestTargetFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\tcommand.help();\n\t\t\t}\n\t\t});\n\n\toptions.decryptHandlers.map((decryption) => {\n\t\tconst { options, requiredOptions } = decryption;\n\t\taddPluginOptions(options, subProgram);\n\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t});\n\n\tconst engines = options.decryptHandlers.map((e) => e.triggerOptionValue);\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"} to use: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\n\treturn subProgram;\n};\n\nexport default addEncryptProgram;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { parse } from \"../../lib/parse\";\nimport { EncryptCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginEncryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { Command } from \"commander\";\n\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n} & Record<string, unknown>;\n\nconst addEncryptProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tencryptHandlers: DotsecCliPluginEncryptHandler[];\n\t\tdotsecConfig: DotsecConfig;\n\t},\n) => {\n\tconst { encryptHandlers, dotsecConfig } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"encrypt\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tcreateManifest,\n\t\t\t\t\tmanifestFile,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<EncryptCommandOptions>();\n\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\t\t\t\tconst pluginCliEncrypt = (encryptHandlers || []).find((handler) => {\n\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t});\n\n\t\t\t\tif (!pluginCliEncrypt) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No encryption plugin found, available encryption engine(s): ${options.encryptHandlers\n\t\t\t\t\t\t\t.map((e) => e.triggerOptionValue)\n\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliEncrypt.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliEncrypt.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst dotenvString = await readContentsFromFile(envFile);\n\t\t\t\tlet dotsecString: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tdotsecString = await readContentsFromFile(secFile);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t\tconst cipherText = await pluginCliEncrypt.handler({\n\t\t\t\t\tplaintext: dotenvString,\n\t\t\t\t\tciphertext: dotsecString,\n\t\t\t\t\t...allOptionsValues,\n\t\t\t\t});\n\n\t\t\t\tconst dotsecOverwriteResponse = await promptOverwriteIfFileExists({\n\t\t\t\t\tfilePath: secFile,\n\t\t\t\t\tskip: yes,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tdotsecOverwriteResponse === undefined ||\n\t\t\t\t\tdotsecOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(secFile, cipherText);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote encrypted contents of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\tsecFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tcreateManifest ||\n\t\t\t\t\t\tdotsecConfig?.defaults?.options?.createManifest\n\t\t\t\t\t) {\n\t\t\t\t\t\t// parse raw env contents into key value pairs using the dotenv package\n\t\t\t\t\t\tconst dotenvVars = parse(dotenvString).obj;\n\t\t\t\t\t\t// expand env vars\n\t\t\t\t\t\tconst markdownManifest = `# Dotsec encryption manifest \n\n## Overview\n\n- plaintext source: ${envFile}\n- ciphertext target: ${secFile}\n- created: ${new Date().toUTCString()}\n- encryption engine: ${\n\t\t\t\t\t\t\tpluginCliEncrypt.encryptionEngineName ||\n\t\t\t\t\t\t\tpluginCliEncrypt.triggerOptionValue\n\t\t\t\t\t\t}\n- encryption engine options: ${JSON.stringify(allOptionsValues)}\n\n## Variables\n\n| Key | \n| --- | \n${Object.keys(dotenvVars)\n\t.map((key) => {\n\t\treturn `| \\`${key} \\`| `;\n\t})\n\t.join(\"\\n\")}\n`;\n\n\t\t\t\t\t\t// write manifest file, don't prompt to overwrite\n\t\t\t\t\t\tconst manifestTargetFile =\n\t\t\t\t\t\t\tmanifestFile || `${secFile}.encryption-manifest.md`;\n\t\t\t\t\t\tawait writeContentsToFile(manifestTargetFile, markdownManifest);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`Wrote manifest of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\t\tmanifestTargetFile,\n\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\tcommand.help();\n\t\t\t}\n\t\t});\n\n\toptions.encryptHandlers.map((encryptionHandler) => {\n\t\tconst { options, requiredOptions } = encryptionHandler;\n\t\taddPluginOptions(options, subProgram);\n\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t});\n\tconst engines = options.encryptHandlers.map((e) => e.triggerOptionValue);\n\tconst encryptionEngineNames = options.encryptHandlers.map(\n\t\t(e) => e.encryptionEngineName,\n\t);\n\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"}: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\tsubProgram.description(\n\t\t`Encrypt .env file using ${encryptionEngineNames.join(\", \")}`,\n\t);\n\treturn subProgram;\n};\n\nexport default addEncryptProgram;\n","import {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { DotsecConfig, InitCommandOptions } from \"../../types\";\nimport { Command } from \"commander\";\n\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport path from \"node:path\";\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n};\n\nconst addInitProgram = async (\n\tprogram: Command,\n\toptions: { dotsecConfig: DotsecConfig },\n) => {\n\tconst { dotsecConfig } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"init\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\tconst { configFile = \"dotsec.config.ts\", yes } =\n\t\t\t\tcommand.optsWithGlobals<InitCommandOptions>();\n\t\t\ttry {\n\t\t\t\tconst configTemplate = await readContentsFromFile(\n\t\t\t\t\tpath.resolve(__dirname, \"../../src/templates/dotsec.config.ts\"),\n\t\t\t\t);\n\n\t\t\t\tconst dotsecConfigOverwriteResponse = await promptOverwriteIfFileExists(\n\t\t\t\t\t{\n\t\t\t\t\t\tfilePath: configFile,\n\t\t\t\t\t\tskip: yes,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\tdotsecConfigOverwriteResponse === undefined ||\n\t\t\t\t\tdotsecConfigOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(configFile, configTemplate);\n\t\t\t\t\tconsole.log(`Wrote config file to ${strong(configFile)}`);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tcommand.error(e);\n\t\t\t}\n\t\t});\n\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\n\treturn subProgram;\n};\n\nexport default addInitProgram;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport { parse } from \"../../lib/parse\";\nimport { PushCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport {\n\tDotsecCliOption,\n\tDotsecCliPluginDecryptHandler,\n\tDotsecCliPluginPushHandler,\n} from \"../../types/plugin\";\nimport { setProgramOptions } from \"../options/index\";\nimport { Command } from \"commander\";\nimport { expand } from \"dotenv-expand\";\nimport fs from \"node:fs\";\n\n/**\n * Decrypts, and pushes the contents of a .env file to AWS SSM, AWS Secrets Manager or GitHub Actions Secrets\n * @date 12/7/2022 - 9:16:48 AM\n *\n * @async\n * @param {Command} program\n * @returns {unknown}\n */\nconst addPushProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\thandlers: {\n\t\t\tpush: DotsecCliPluginPushHandler;\n\t\t\tdecrypt: DotsecCliPluginDecryptHandler;\n\t\t}[];\n\t},\n) => {\n\tconst { dotsecConfig, handlers } = options;\n\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"push\")\n\t\t.action(async (_options: Record<string, string>, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tusing,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<PushCommandOptions>();\n\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\tconst pluginCliDecrypt = (handlers || []).find((handler) => {\n\t\t\t\t\treturn handler.decrypt?.triggerOptionValue === encryptionEngine;\n\t\t\t\t})?.decrypt;\n\n\t\t\t\tconst pluginCliPush = (handlers || []).find((handler) => {\n\t\t\t\t\treturn handler.push?.triggerOptionValue === encryptionEngine;\n\t\t\t\t})?.push;\n\n\t\t\t\tif (!pluginCliPush) {\n\t\t\t\t\tthrow new Error(\"No push plugin found!\");\n\t\t\t\t}\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliDecrypt?.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliDecrypt?.requiredOptions || {}),\n\t\t\t\t\t...Object.keys(pluginCliPush?.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliPush?.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tlet envContents: string | undefined;\n\n\t\t\t\tif (using === \"env\") {\n\t\t\t\t\tif (!envFile) {\n\t\t\t\t\t\tthrow new Error(\"No dotenv file specified in --env-file option\");\n\t\t\t\t\t}\n\t\t\t\t\tenvContents = fs.readFileSync(envFile, \"utf8\");\n\t\t\t\t} else {\n\t\t\t\t\tif (!secFile) {\n\t\t\t\t\t\tthrow new Error(\"No dotsec file specified in --sec-file option\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${handlers\n\t\t\t\t\t\t\t\t.map((e) => `--${e.decrypt?.triggerOptionValue}`)\n\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dotSecContents = fs.readFileSync(secFile, \"utf8\");\n\t\t\t\t\tenvContents = await pluginCliDecrypt.handler({\n\t\t\t\t\t\tciphertext: dotSecContents,\n\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (envContents) {\n\t\t\t\t\t// convert to object\n\t\t\t\t\tconst dotenvVars = parse(envContents).obj;\n\t\t\t\t\t// expand env vars\n\t\t\t\t\tconst expandedEnvVars = expand({\n\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t...(process.env as Record<string, string>),\n\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tif (expandedEnvVars.parsed) {\n\t\t\t\t\t\tawait pluginCliPush.handler({\n\t\t\t\t\t\t\tpush: expandedEnvVars.parsed,\n\t\t\t\t\t\t\tyes,\n\t\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"No .env or .sec file provided\");\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t});\n\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\tconst engines = options.handlers.map(\n\t\t({ decrypt }) => decrypt.triggerOptionValue,\n\t);\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"} to use: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tconst allOptions: {\n\t\t[x: string]: DotsecCliOption & { required?: boolean };\n\t} = {};\n\toptions.handlers.forEach((handlers) => {\n\t\tObject.keys(handlers).map((handlerName) => {\n\t\t\tconst { options: cliOptions, requiredOptions } = handlers[handlerName];\n\t\t\tObject.keys(cliOptions || {}).forEach((key) => {\n\t\t\t\tallOptions[key] = Array.isArray(cliOptions[key])\n\t\t\t\t\t? cliOptions[key]\n\t\t\t\t\t: { ...allOptions[key], ...cliOptions[key] };\n\t\t\t});\n\t\t\tObject.keys(requiredOptions || {}).forEach((key) => {\n\t\t\t\tallOptions[key] = Array.isArray(requiredOptions[key])\n\t\t\t\t\t? requiredOptions[key]\n\t\t\t\t\t: {\n\t\t\t\t\t\t\t...allOptions[key],\n\t\t\t\t\t\t\t...requiredOptions[key],\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t };\n\t\t\t});\n\t\t});\n\t});\n\n\tconst usage: string[] = [];\n\tconst descriptions: string[] = [];\n\n\thandlers.forEach((handler) => {\n\t\tif (handler.push?.description) {\n\t\t\tdescriptions.push(handler.push.description);\n\t\t}\n\n\t\tif (handler.push?.usage) {\n\t\t\tusage.push(handler.push.usage);\n\t\t}\n\t});\n\n\tif (descriptions.length > 0) {\n\t\tsubProgram.description(descriptions.join(\"\\n\"));\n\t}\n\n\tif (usage.length > 0) {\n\t\tsubProgram.usage(usage.join(\"\\n\"));\n\t}\n\n\taddPluginOptions(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(allOptions).filter(\n\t\t\t\t([_key, value]) => value.required !== true,\n\t\t\t),\n\t\t),\n\t\tsubProgram,\n\t);\n\taddPluginOptions(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(allOptions).filter(\n\t\t\t\t([_key, value]) => value.required === true,\n\t\t\t),\n\t\t),\n\t\tsubProgram,\n\t\ttrue,\n\t);\n\n\treturn subProgram;\n};\n\nexport default addPushProgram;\n","import fs from \"node:fs\";\n\nimport { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport { parse } from \"../../lib/parse\";\nimport { RunCommandOptions } from \"../../types\";\nimport { BackgroundColor, backgroundColors } from \"../../types/colors\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginDecryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { camelCase } from \"camel-case\";\nimport chalk from \"chalk\";\n\nimport { dotsec } from \"_dotsec.config\";\nimport { Command } from \"commander\";\nimport { expand } from \"dotenv-expand\";\nimport { spawn } from \"node:child_process\";\nconst addRunProgam = (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\tdecryptHandlers?: DotsecCliPluginDecryptHandler[];\n\t},\n) => {\n\tconst { dotsecConfig, decryptHandlers } = options || {};\n\t// create api here\n\n\t// is there an encryption engine?\n\tconst hasDecryptEngine =\n\t\tdecryptHandlers !== undefined && decryptHandlers.length > 0;\n\n\tconst subProgram = program\n\t\t.command(\"run <command...>\")\n\t\t.allowUnknownOption(true)\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.showHelpAfterError(true)\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tcommands: string[],\n\t\t\t\t_options: Record<string, string>,\n\t\t\t\tcommand: Command,\n\t\t\t) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tenvFile,\n\t\t\t\t\t\tusing,\n\t\t\t\t\t\tsecFile,\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tshowRedacted,\n\t\t\t\t\t\toutputBackgroundColor,\n\t\t\t\t\t\tshowOutputPrefix,\n\t\t\t\t\t\toutputPrefix,\n\t\t\t\t\t} = command.optsWithGlobals<RunCommandOptions>();\n\n\t\t\t\t\tlet envContents: string | undefined;\n\n\t\t\t\t\tif (using === \"env\" || hasDecryptEngine === false) {\n\t\t\t\t\t\tif (!envFile) {\n\t\t\t\t\t\t\tthrow new Error(\"No dotenv file specified in --env-file option\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenvContents = fs.readFileSync(envFile, \"utf8\");\n\t\t\t\t\t} else if (using === \"sec\") {\n\t\t\t\t\t\tif (!secFile) {\n\t\t\t\t\t\t\tthrow new Error(\"No dotsec file specified in --sec-file option\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst encryptionEngine =\n\t\t\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\t\t\tconst pluginCliDecrypt = (decryptHandlers || []).find((handler) => {\n\t\t\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${(\n\t\t\t\t\t\t\t\t\tdecryptHandlers || []\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.map((e) => `--${e.triggerOptionValue}`)\n\t\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t\t\t...Object.keys(pluginCliDecrypt.options || {}),\n\t\t\t\t\t\t\t...Object.keys(pluginCliDecrypt.requiredOptions || {}),\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst dotSecContents = fs.readFileSync(secFile, \"utf8\");\n\t\t\t\t\t\t\tenvContents = await pluginCliDecrypt.handler({\n\t\t\t\t\t\t\t\tciphertext: dotSecContents,\n\t\t\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error(\"Something bad happened while decrypting.\");\n\t\t\t\t\t\t\tconsole.error(`File: ${secFile}`);\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (envContents) {\n\t\t\t\t\t\tconst dotenvVars = parse(envContents).obj;\n\t\t\t\t\t\t// expand env vars\n\t\t\t\t\t\tconst expandedEnvVars = expand({\n\t\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t\t...(process.env as Record<string, string>),\n\t\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst [userCommand, ...userCommandArgs] = commands;\n\t\t\t\t\t\tconst waiter: number | undefined = await new Promise((resolve) => {\n\t\t\t\t\t\t\tconst cprocess = spawn(userCommand, [...userCommandArgs], {\n\t\t\t\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t\t\t\t\tshell: false,\n\t\t\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t\t\t...expandedEnvVars.parsed,\n\t\t\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t\t\t__DOTSEC_ENV__: JSON.stringify(Object.keys(dotenvVars)),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst expandedEnvVarsWithoutEnv = expand({\n\t\t\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.stdout.setEncoding(\"utf8\");\n\n\t\t\t\t\t\t\tlet backgroundColor =\n\t\t\t\t\t\t\t\toutputBackgroundColor ||\n\t\t\t\t\t\t\t\tdotsecConfig.defaults?.options?.outputBackgroundColor;\n\t\t\t\t\t\t\tif (backgroundColor === true) {\n\t\t\t\t\t\t\t\tbackgroundColor = \"red-bright\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// hideOutputBackgroundColor;\n\t\t\t\t\t\t\tlet addBackgroundColor: chalk.Chalk | ((str: string) => string) =\n\t\t\t\t\t\t\t\t(str: string) => str;\n\t\t\t\t\t\t\tif (backgroundColor) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!backgroundColors.includes(backgroundColor as BackgroundColor)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// throw error\n\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`Invalid background color: ${backgroundColor}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst backgroundColorFnName = camelCase(\n\t\t\t\t\t\t\t\t\t`bg-${backgroundColor}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (chalk[backgroundColorFnName]) {\n\t\t\t\t\t\t\t\t\taddBackgroundColor = chalk[\n\t\t\t\t\t\t\t\t\t\tbackgroundColorFnName\n\t\t\t\t\t\t\t\t\t] as chalk.Chalk;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\t\t`Invalid background color: ${backgroundColorFnName}, using default: red`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\taddBackgroundColor = chalk.bgRedBright;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst prefix =\n\t\t\t\t\t\t\t\tshowOutputPrefix ||\n\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.showOutputPrefix\n\t\t\t\t\t\t\t\t\t? `${\n\t\t\t\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.outputPrefix ||\n\t\t\t\t\t\t\t\t\t\t\toutputPrefix ||\n\t\t\t\t\t\t\t\t\t\t\t\"(dotsec) \"\n\t\t\t\t\t\t\t\t\t }`\n\t\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tcprocess.stdout.on(\"data\", function (data) {\n\t\t\t\t\t\t\t\t//Here is where the output goes\n\t\t\t\t\t\t\t\t// split by new line\n\t\t\t\t\t\t\t\tconst lines = addBackgroundColor(\n\t\t\t\t\t\t\t\t\tdata\n\t\t\t\t\t\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t\t\t\t\t\t.map((line) => `${prefix}${line}`)\n\t\t\t\t\t\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t// redact\n\t\t\t\t\t\t\t\t// iterate over each env var\n\t\t\t\t\t\t\t\t// for each env var, replace the value with a redacted version\n\n\t\t\t\t\t\t\t\tconst redactedLines =\n\t\t\t\t\t\t\t\t\t(showRedacted ||\n\t\t\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.showRedacted) !== true\n\t\t\t\t\t\t\t\t\t\t? Object.entries(expandedEnvVarsWithoutEnv.parsed || {})\n\t\t\t\t\t\t\t\t\t\t\t\t.sort(([, a], [, b]) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (a.length > b.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else if (a.length < b.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t.reduce((acc, [key, value]) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (dotsecConfig?.redaction?.show?.includes(key)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst redactedValue = value.replace(/./g, \"*\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn acc.replace(value, redactedValue);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}, lines as string)\n\t\t\t\t\t\t\t\t\t\t: lines;\n\n\t\t\t\t\t\t\t\tconsole.log(redactedLines);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.stderr.setEncoding(\"utf8\");\n\t\t\t\t\t\t\tcprocess.stderr.on(\"data\", function (data) {\n\t\t\t\t\t\t\t\tprocess.stderr.write(data.toString());\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.on(\"exit\", (code: number) => {\n\t\t\t\t\t\t\t\tresolve(code);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (waiter !== 0) {\n\t\t\t\t\t\t\tprocess.exit(waiter || 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\"No .env or .sec file provided\");\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\t\tcommand.help();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\tsetProgramOptions({\n\t\tprogram: subProgram,\n\t\tcommandName: hasDecryptEngine ? \"run\" : \"runEnvOnly\",\n\t\tdotsecConfig,\n\t});\n\n\tif (hasDecryptEngine) {\n\t\tdecryptHandlers?.map((run) => {\n\t\t\tconst { options, requiredOptions } = run;\n\t\t\taddPluginOptions(options, subProgram);\n\t\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t\t});\n\t\tconst engines = decryptHandlers?.map((e) => e.triggerOptionValue);\n\n\t\tsubProgram.option(\n\t\t\t\"--engine <engine>\",\n\t\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"}: ${\n\t\t\t\t(engines.join(\", \"), engines.length === 1 ? engines[0] : undefined)\n\t\t\t}`,\n\t\t\t// engines.length === 1 ? engines[0] : undefined,\n\t\t);\n\t}\n\treturn subProgram;\n};\n\nexport default addRunProgam;\n"]}
@@ -28,6 +28,9 @@ var defaultConfig = {
28
28
  // plugins: {
29
29
  // pke: {},
30
30
  // },
31
+ options: {
32
+ showRedacted: false
33
+ }
31
34
  }
32
35
  };
33
36
  function jsoncParse(data) {
@@ -79,9 +82,9 @@ var getMagicalConfig = async (filename) => {
79
82
  defaults: {
80
83
  ...data?.defaults,
81
84
  ...defaultConfig.defaults,
82
- output: {
83
- ...data?.defaults?.output,
84
- ...defaultConfig.defaults?.output
85
+ options: {
86
+ ...data?.defaults?.options,
87
+ ...defaultConfig.defaults?.options
85
88
  },
86
89
  plugins: {
87
90
  ...data?.defaults?.plugins,
@@ -106,13 +109,13 @@ var getMagicalConfig = async (filename) => {
106
109
  defaults: {
107
110
  ...data?.defaults,
108
111
  ...defaultConfig.defaults,
109
- output: {
110
- ...data?.defaults?.output,
111
- ...defaultConfig.defaults?.output
112
- },
113
112
  plugins: {
114
113
  ...data?.defaults?.plugins,
115
114
  ...defaultConfig.defaults?.plugins
115
+ },
116
+ options: {
117
+ ...data?.defaults?.options,
118
+ ...defaultConfig.defaults?.options
116
119
  }
117
120
  },
118
121
  push: {
@@ -369,8 +372,9 @@ var usingNoEncryptionEngineOption = {
369
372
  };
370
373
  var showRedactedOption = {
371
374
  flags: "--show-redacted",
372
- description: 'Wether to show redacted values."',
373
- env: "DOTSEC_SHOW_REDACTED"
375
+ description: "Wether to show redacted values",
376
+ env: "DOTSEC_SHOW_REDACTED",
377
+ defaultValue: false
374
378
  };
375
379
  var showOutputPrefixOption = {
376
380
  flags: "--show-output-prefix",
@@ -382,11 +386,6 @@ var outputPrefixOption = {
382
386
  description: "Output prefix",
383
387
  env: "DOTSEC_OUTPUT_PREFIX"
384
388
  };
385
- var showOutputBackgroundColorOption = {
386
- flags: "--show-output-background-color",
387
- description: "Show output background color",
388
- env: "DOTSEC_SHOW_OUTPUT_BACKGROUND_COLOR"
389
- };
390
389
  var outputBackgroundColorOption = {
391
390
  flags: "--output-background-color <outputBackgroundColor>",
392
391
  description: "Background color of the output.",
@@ -599,7 +598,6 @@ var runCommandDefaults = {
599
598
  engine: engineOption,
600
599
  showRedacted: showRedactedOption,
601
600
  outputBackgroundColor: outputBackgroundColorOption,
602
- showOutputBackgroundColor: showOutputBackgroundColorOption,
603
601
  showOutputPrefix: showOutputPrefixOption,
604
602
  outputPrefix: outputPrefixOption
605
603
  },
@@ -637,7 +635,6 @@ $ DOTSEC_USING=env npx dotsec run node -e "console.log(process.env)"
637
635
  yes: yesOption,
638
636
  showRedacted: showRedactedOption,
639
637
  outputBackgroundColor: outputBackgroundColorOption,
640
- hideOutputBackgroundColor: showOutputBackgroundColorOption,
641
638
  hideOutputPrefix: showOutputPrefixOption,
642
639
  outputPrefix: outputPrefixOption
643
640
  },
@@ -1173,7 +1170,6 @@ var addRunProgam = (program2, options) => {
1173
1170
  engine,
1174
1171
  showRedacted,
1175
1172
  outputBackgroundColor,
1176
- showOutputBackgroundColor,
1177
1173
  showOutputPrefix,
1178
1174
  outputPrefix
1179
1175
  } = command.optsWithGlobals();
@@ -1248,17 +1244,19 @@ var addRunProgam = (program2, options) => {
1248
1244
  }
1249
1245
  });
1250
1246
  cprocess.stdout.setEncoding("utf8");
1251
- let addBackgroundColor = showOutputBackgroundColor || dotsecConfig.defaults?.options?.showBackgroundColor ? chalk2.bgRedBright : (str) => str;
1252
- if (outputBackgroundColor && (showOutputBackgroundColor || dotsecConfig.defaults?.options?.showBackgroundColor)) {
1253
- if (!backgroundColors.includes(
1254
- outputBackgroundColor
1255
- )) {
1247
+ let backgroundColor = outputBackgroundColor || dotsecConfig.defaults?.options?.outputBackgroundColor;
1248
+ if (backgroundColor === true) {
1249
+ backgroundColor = "red-bright";
1250
+ }
1251
+ let addBackgroundColor = (str) => str;
1252
+ if (backgroundColor) {
1253
+ if (!backgroundColors.includes(backgroundColor)) {
1256
1254
  throw new Error(
1257
- `Invalid background color: ${outputBackgroundColor}`
1255
+ `Invalid background color: ${backgroundColor}`
1258
1256
  );
1259
1257
  }
1260
1258
  const backgroundColorFnName = camelCase(
1261
- `bg-${outputBackgroundColor}`
1259
+ `bg-${backgroundColor}`
1262
1260
  );
1263
1261
  if (chalk2[backgroundColorFnName]) {
1264
1262
  addBackgroundColor = chalk2[backgroundColorFnName];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/constants.ts","../../src/lib/json.ts","../../src/lib/getConfig.ts","../../src/lib/loadDotsecPlugin.ts","../../src/lib/addPluginOptions.ts","../../src/lib/io.ts","../../src/lib/parse.ts","../../src/utils/logging.ts","../../src/cli/options/index.ts","../../src/types/colors.ts","../../src/cli/options/sharedOptions.ts","../../src/cli/options/decrypt.ts","../../src/cli/options/dotsec.ts","../../src/cli/options/encrypt.ts","../../src/cli/options/init.ts","../../src/cli/options/push.ts","../../src/cli/options/run.ts","../../src/cli/commands/decrypt.ts","../../src/cli/commands/encrypt.ts","../../src/cli/commands/init.ts","../../src/cli/commands/push.ts","../../src/cli/commands/run.ts"],"names":["Command","path","fs","Option","program","options","decrypt_default","addEncryptProgram","encrypt_default","init_default","handlers","push_default","chalk","expand","run_default"],"mappings":"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","sourcesContent":["import { Command } from \"commander\";\n\nimport { getMagicalConfig } from \"../lib/getConfig\";\nimport { loadDotsecPlugin } from \"../lib/loadDotsecPlugin\";\nimport {\n\tDotsecCliPluginDecryptHandler,\n\tDotsecCliPluginEncryptHandler,\n\tDotsecCliPluginPushHandler,\n\tDotsecPluginConfig,\n} from \"../types/plugin\";\nimport addDecryptProgram from \"./commands/decrypt\";\nimport addEncryptProgram from \"./commands/encrypt\";\nimport addInitCommand from \"./commands/init\";\nimport addPushProgram from \"./commands/push\";\nimport addRunCommand from \"./commands/run\";\nimport { setProgramOptions } from \"./options\";\nimport Ajv, { KeywordDefinition } from \"ajv\";\nimport yargsParser from \"yargs-parser\";\n\nconst separator: KeywordDefinition = {\n\tkeyword: \"separator\",\n\ttype: \"string\",\n\tmetaSchema: {\n\t\ttype: \"string\",\n\t\tdescription: \"value separator\",\n\t},\n\tmodifying: true,\n\tvalid: true,\n\terrors: false,\n\tcompile: (schema) => (data, ctx) => {\n\t\tif (ctx) {\n\t\t\tconst { parentData, parentDataProperty } = ctx;\n\t\t\tparentData[parentDataProperty] = data === \"\" ? [] : data.split(schema);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n};\n\nconst program = new Command();\n\n(async () => {\n\tconst parsedOptions = yargsParser(process.argv);\n\tconst argvPluginModules: string[] = [];\n\tif (parsedOptions.plugin) {\n\t\tif (Array.isArray(parsedOptions.plugin)) {\n\t\t\targvPluginModules.push(...parsedOptions.plugin);\n\t\t} else {\n\t\t\targvPluginModules.push(parsedOptions.plugin);\n\t\t}\n\t}\n\n\tconst someConfigFile = parsedOptions.configFile || parsedOptions.c;\n\n\tconst configFile =\n\t\t[\n\t\t\t...(Array.isArray(someConfigFile) ? someConfigFile : [someConfigFile]),\n\t\t]?.[0] || process.env.DOTSEC_CONFIG_FILE;\n\tconst { contents: dotsecConfig = {} } = await getMagicalConfig(configFile);\n\tconst { defaults = {}, push: pushVariables, plugins } = dotsecConfig;\n\tprogram\n\t\t.name(\"dotsec\")\n\t\t.description(\".env, but secure\")\n\t\t.version(\"1.0.0\")\n\t\t.passThroughOptions()\n\t\t.action((_options, other: Command) => {\n\t\t\tother.help();\n\t\t});\n\tsetProgramOptions({ program, dotsecConfig: dotsecConfig });\n\tconst ajv = new Ajv({\n\t\tallErrors: true,\n\t\tremoveAdditional: true,\n\t\tuseDefaults: true,\n\t\tcoerceTypes: true,\n\t\tallowUnionTypes: true,\n\t\taddUsedSchema: false,\n\t\tkeywords: [separator],\n\t});\n\t// if we have plugins in the cli, we need to define them in pluginModules\n\tconst pluginModules: { [key: string]: string } = {};\n\n\t// check plugins\n\tif (plugins) {\n\t\tfor (const pluginName of plugins) {\n\t\t\tif (!defaults?.plugins?.[pluginName]) {\n\t\t\t\tdefaults.plugins = {\n\t\t\t\t\t...defaults.plugins,\n\t\t\t\t\t[pluginName]: {},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t// check argv\n\tif (argvPluginModules.length > 0) {\n\t\tfor (const pluginModule of argvPluginModules) {\n\t\t\t// let's load em up\n\t\t\tconst plugin = await loadDotsecPlugin({ name: pluginModule });\n\n\t\t\t// good, let's fire 'em up\n\t\t\tconst loadedPlugin = await plugin({\n\t\t\t\tdotsecConfig: dotsecConfig,\n\t\t\t\tajv,\n\t\t\t\tconfigFile,\n\t\t\t});\n\t\t\tpluginModules[loadedPlugin.name] = pluginModule;\n\n\t\t\tif (argvPluginModules.length === 1) {\n\t\t\t\t// if we only have one plugin, let's set it as the default\n\t\t\t\tdotsecConfig.defaults = {\n\t\t\t\t\t...dotsecConfig.defaults,\n\t\t\t\t\tencryptionEngine: String(loadedPlugin.name),\n\t\t\t\t\tplugins: {\n\t\t\t\t\t\t...dotsecConfig.defaults?.plugins,\n\t\t\t\t\t\t[loadedPlugin.name]: {\n\t\t\t\t\t\t\t...dotsecConfig.defaults?.plugins?.[loadedPlugin.name],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tif (defaults?.encryptionEngine) {\n\t\tif (!defaults?.plugins?.[defaults.encryptionEngine]) {\n\t\t\tdefaults.plugins = {\n\t\t\t\t...defaults.plugins,\n\t\t\t\t[defaults.encryptionEngine]: {},\n\t\t\t};\n\t\t}\n\t}\n\tif (defaults?.plugins) {\n\t\tObject.entries(defaults?.plugins).forEach(\n\t\t\t([pluginName, pluginModule]: [string, DotsecPluginConfig]) => {\n\t\t\t\tif (pluginModule?.name) {\n\t\t\t\t\tpluginModules[pluginName] = pluginModule?.name;\n\t\t\t\t} else {\n\t\t\t\t\tpluginModules[pluginName] = `@dotsec/plugin-${pluginName}`;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tObject.values(pushVariables || {}).forEach((pushVariable) => {\n\t\tObject.keys(pushVariable).forEach((pluginName) => {\n\t\t\tif (!pluginModules[pluginName]) {\n\t\t\t\tpluginModules[pluginName] = `@dotsec/plugin-${pluginName}`;\n\t\t\t}\n\t\t});\n\t});\n\n\t// configure encryption command\n\tconst cliPluginEncryptHandlers: DotsecCliPluginEncryptHandler[] = [];\n\tconst cliPluginDecryptHandlers: DotsecCliPluginDecryptHandler[] = [];\n\tconst cliPluginPushHandlers: {\n\t\tpush: DotsecCliPluginPushHandler;\n\t\tdecrypt: DotsecCliPluginDecryptHandler;\n\t}[] = [];\n\n\tfor (const pluginName of Object.keys(pluginModules)) {\n\t\tconst pluginModule = pluginModules[pluginName];\n\t\tconst initDotsecPlugin = await loadDotsecPlugin({ name: pluginModule });\n\t\tconst { addCliCommand, cliHandlers: cli } = await initDotsecPlugin({\n\t\t\tajv,\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tconfigFile,\n\t\t});\n\n\t\tif (cli?.encrypt) {\n\t\t\tcliPluginEncryptHandlers.push(cli.encrypt);\n\t\t}\n\t\tif (cli?.decrypt) {\n\t\t\tcliPluginDecryptHandlers.push(cli.decrypt);\n\t\t\tif (cli?.push) {\n\t\t\t\tcliPluginPushHandlers.push({ push: cli.push, decrypt: cli.decrypt });\n\t\t\t}\n\t\t}\n\n\t\tif (addCliCommand) {\n\t\t\taddCliCommand({ program });\n\t\t}\n\t}\n\tif (cliPluginEncryptHandlers.length) {\n\t\tawait addEncryptProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tencryptHandlers: cliPluginEncryptHandlers,\n\t\t});\n\t}\n\tif (cliPluginDecryptHandlers.length) {\n\t\tawait addDecryptProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tdecryptHandlers: cliPluginDecryptHandlers,\n\t\t});\n\t}\n\tif (cliPluginPushHandlers.length) {\n\t\tawait addPushProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\thandlers: cliPluginPushHandlers,\n\t\t});\n\t}\n\n\t// add other commands\n\tawait addInitCommand(program, { dotsecConfig: dotsecConfig });\n\tawait addRunCommand(program, {\n\t\tdotsecConfig: dotsecConfig,\n\t\tdecryptHandlers: cliPluginDecryptHandlers,\n\t});\n\tawait program.parse();\n})();\n","import { DotsecConfig } from \"./types/config\";\n\nexport const DOTSEC_DEFAULT_CONFIG_FILE = \"dotsec.config.ts\";\nexport const DOTSEC_CONFIG_FILES = [DOTSEC_DEFAULT_CONFIG_FILE];\nexport const DOTSEC_DEFAULT_DOTSEC_FILENAME = \".sec\";\nexport const DOTSEC_DEFAULT_DOTENV_FILENAME = \".env\";\nexport const defaultConfig: DotsecConfig = {\n\tdefaults: {\n\t\t// encryptionEngine: \"pke\",\n\t\t// plugins: {\n\t\t// \tpke: {},\n\t\t// },\n\t},\n};\n","import fs from \"fs\";\nimport path from \"node:path\";\n\n/**\n * Parse JSONC\n * @date 12/7/2022 - 12:48:45 PM\n *\n * @export\n * @param {string} data\n * @returns {*}\n */\nexport function jsoncParse(data: string) {\n\ttry {\n\t\treturn new Function(`return ${data.trim()}`)();\n\t} catch {\n\t\t// Silently ignore any error\n\t\t// That's what tsc/jsonc-parser did after all\n\t\treturn {};\n\t}\n}\n\n/**\n * Load JSON\n * @date 12/7/2022 - 12:48:57 PM\n *\n * @async\n * @param {string} filepath\n * @returns {unknown}\n */\nexport const loadJson = async (filepath: string) => {\n\ttry {\n\t\treturn jsoncParse(await fs.promises.readFile(filepath, \"utf8\"));\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse ${path.relative(process.cwd(), filepath)}: ${\n\t\t\t\t\terror.message\n\t\t\t\t}`,\n\t\t\t);\n\t\t} else {\n\t\t\tthrow error;\n\t\t}\n\t}\n};\n","import { DOTSEC_CONFIG_FILES, defaultConfig } from \"../constants\";\nimport { DotsecConfig } from \"../types/config\";\nimport { DotsecConfigAndSource } from \"../types/plugin\";\nimport { loadJson } from \"./json\";\nimport { bundleRequire } from \"bundle-require\";\nimport JoyCon from \"joycon\";\nimport path from \"path\";\n\nexport const getMagicalConfig = async (\n\tfilename?: string,\n): Promise<DotsecConfigAndSource> => {\n\tconst cwd = process.cwd();\n\tconst configJoycon = new JoyCon();\n\tconst configPath = await configJoycon.resolve({\n\t\tfiles: filename ? [filename] : [...DOTSEC_CONFIG_FILES, \"package.json\"],\n\t\tcwd,\n\t\tstopDir: path.parse(cwd).root,\n\t\tpackageKey: \"dotsec\",\n\t});\n\tif (filename && configPath === null) {\n\t\tthrow new Error(`Could not find config file ${filename}`);\n\t}\n\tif (configPath) {\n\t\tif (configPath.endsWith(\".json\")) {\n\t\t\tconst rawData = (await loadJson(configPath)) as Partial<DotsecConfig>;\n\n\t\t\tlet data: Partial<DotsecConfig>;\n\n\t\t\tif (\n\t\t\t\tconfigPath.endsWith(\"package.json\") &&\n\t\t\t\t(rawData as { dotsec: Partial<DotsecConfig> }).dotsec !== undefined\n\t\t\t) {\n\t\t\t\tdata = (rawData as { dotsec: Partial<DotsecConfig> }).dotsec;\n\t\t\t} else {\n\t\t\t\tdata = rawData as Partial<DotsecConfig>;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsource: \"json\",\n\t\t\t\tcontents: {\n\t\t\t\t\t...defaultConfig,\n\t\t\t\t\t...data,\n\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t...data?.defaults,\n\t\t\t\t\t\t...defaultConfig.defaults,\n\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\t...data?.defaults?.output,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.output,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t...data?.defaults?.plugins,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.plugins,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tpush: {\n\t\t\t\t\t\t...data?.push,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t} else if (configPath.endsWith(\".ts\")) {\n\t\t\tconst bundleRequireResult = await bundleRequire({\n\t\t\t\tfilepath: configPath,\n\t\t\t});\n\t\t\tconst data = (bundleRequireResult.mod.dotsec ||\n\t\t\t\tbundleRequireResult.mod.default ||\n\t\t\t\tbundleRequireResult.mod) as Partial<DotsecConfig>;\n\n\t\t\treturn {\n\t\t\t\tsource: \"ts\",\n\t\t\t\tcontents: {\n\t\t\t\t\t...defaultConfig,\n\t\t\t\t\t...data,\n\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t...data?.defaults,\n\t\t\t\t\t\t...defaultConfig.defaults,\n\t\t\t\t\t\toutput: {\n\t\t\t\t\t\t\t...data?.defaults?.output,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.output,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t...data?.defaults?.plugins,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.plugins,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tpush: {\n\t\t\t\t\t\t...data?.push,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\treturn { source: \"defaultConfig\", contents: defaultConfig };\n};\n","import { DotsecPluginModule } from \"../types/plugin\";\n\nexport const loadDotsecPlugin = async (options: {\n\tname: string;\n}): Promise<DotsecPluginModule> => {\n\treturn import(options.name).then((imported) => {\n\t\treturn imported.default;\n\t});\n};\n","import { DotsecCliOption } from \"../types/plugin\";\nimport { Command, Option } from \"commander\";\n\nexport const addPluginOptions = (\n\toptions:\n\t\t| {\n\t\t\t\t[x: string]: DotsecCliOption;\n\t\t }\n\t\t| undefined,\n\tcommand: Command,\n\tmandatory?: boolean,\n) => {\n\tif (options) {\n\t\tObject.values(options).map((option) => {\n\t\t\tlet optionProps:\n\t\t\t\t| {\n\t\t\t\t\t\tflags: string;\n\t\t\t\t\t\tdescription?: string;\n\t\t\t\t\t\tdefaultValue?: string | boolean | string[];\n\t\t\t\t\t\tchoices?: string[];\n\t\t\t\t\t\tfn?: (value: string, previous: unknown) => unknown;\n\t\t\t\t\t\tregexp?: RegExp;\n\t\t\t\t\t\tenv?: string;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t\tif (Array.isArray(option)) {\n\t\t\t\tconst [flags, description, defaultValue] = option;\n\t\t\t\toptionProps = {\n\t\t\t\t\tflags,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst { flags, description, defaultValue, choices, env, fn } = option;\n\t\t\t\toptionProps = {\n\t\t\t\t\tflags,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t\tchoices,\n\t\t\t\t\tenv,\n\t\t\t\t\tfn,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optionProps) {\n\t\t\t\tconst newOption = new Option(\n\t\t\t\t\toptionProps.flags,\n\t\t\t\t\toptionProps.description,\n\t\t\t\t);\n\t\t\t\tif (optionProps.fn) {\n\t\t\t\t\tnewOption.argParser(optionProps.fn);\n\t\t\t\t}\n\t\t\t\tif (optionProps.defaultValue) {\n\t\t\t\t\tnewOption.default(optionProps.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (optionProps.env) {\n\t\t\t\t\tnewOption.env(optionProps.env);\n\t\t\t\t}\n\t\t\t\tif (mandatory) {\n\t\t\t\t\tnewOption.makeOptionMandatory(true);\n\t\t\t\t}\n\t\t\t\tif (optionProps.choices) {\n\t\t\t\t\tnewOption.choices(optionProps.choices);\n\t\t\t\t}\n\t\t\t\tcommand.addOption(newOption);\n\t\t\t}\n\t\t});\n\t}\n};\n","import fs, { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nexport const readContentsFromFile = async (\n\tfilePath: string,\n): Promise<string> => {\n\treturn await fs.readFile(filePath, \"utf-8\");\n};\n\nexport const writeContentsToFile = async (\n\tfilePath: string,\n\tcontents: string,\n): Promise<void> => {\n\treturn await fs.writeFile(filePath, contents, \"utf-8\");\n};\n\nexport const fileExists = async (source: string): Promise<boolean> => {\n\ttry {\n\t\tawait stat(source);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const promptOverwriteIfFileExists = async ({\n\tfilePath,\n\tskip,\n}: {\n\tfilePath: string;\n\tskip?: boolean;\n}) => {\n\tlet overwriteResponse: prompts.Answers<\"overwrite\"> | undefined;\n\n\tif ((await fileExists(filePath)) && skip !== true) {\n\t\toverwriteResponse = await prompts({\n\t\t\ttype: \"confirm\",\n\t\t\tname: \"overwrite\",\n\t\t\tmessage: () => {\n\t\t\t\treturn `Overwrite './${path.relative(process.cwd(), filePath)}' ?`;\n\t\t\t},\n\t\t});\n\t} else {\n\t\toverwriteResponse = undefined;\n\t}\n\treturn overwriteResponse;\n};\n","const LINE =\n\t/^(#.*)|(\\s?\\r?\\n)|(?:^|^)\\s*(?:export\\s+)?([\\w.-]*)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?(\\s*)(#.*)?(?:$|$)/gm;\n\nexport type ParseResult = {\n\ttype: \"value\" | \"comment\" | \"whitespace\";\n\tkey?: string;\n\tvalue?: string;\n\traw?: string;\n}[];\n\n// Parser src into an Object\nexport const parse = (src: string) => {\n\tconst obj: Record<string, string> = {};\n\tconst blocks: ParseResult = [];\n\n\t// Convert buffer to string\n\tlet lines = src.toString();\n\n\t// Convert line breaks to same format\n\tlines = lines.replace(/\\r\\n?/gm, \"\\n\");\n\n\tlet match;\n\twhile ((match = LINE.exec(lines)) != null) {\n\t\tconst key = match[3];\n\n\t\tif (match?.[1]?.[0] === \"#\") {\n\t\t\tblocks.push({ type: \"comment\", raw: match[1] });\n\t\t} else if (match?.[2]) {\n\t\t\tblocks.push({ type: \"whitespace\", raw: match[2] });\n\t\t} else {\n\t\t\t// Default undefined or null to empty string\n\t\t\tlet value = match[4] || \"\";\n\n\t\t\t// Remove whitespace\n\t\t\tvalue = value.trim();\n\n\t\t\t// Check if double quoted\n\t\t\tconst maybeQuote = value[0];\n\n\t\t\t// Remove surrounding quotes\n\t\t\tvalue = value.replace(/^(['\"`])([\\s\\S]*)\\1$/gm, \"$2\");\n\n\t\t\t// Expand newlines if double quoted\n\t\t\tif (maybeQuote === '\"') {\n\t\t\t\tvalue = value.replace(/\\\\n/g, \"\\n\");\n\t\t\t\tvalue = value.replace(/\\\\r/g, \"\\r\");\n\t\t\t}\n\n\t\t\tobj[key] = value;\n\n\t\t\t// Add to object\n\t\t\tblocks.push({\n\t\t\t\ttype: \"value\",\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t\traw: value + (match[5] ? match[5] : \"\") + (match[6] ? match[6] : \"\"),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { blocks, obj };\n};\n\nif (import.meta.vitest) {\n\tconst { it, expect } = import.meta.vitest;\n\n\tit(\"parse\", () => {\n\t\tconst input1 = \"KEY=value\";\n\t\tconst input2 = 'KEY=\"value\"';\n\t\tconst input3 = \"KEY='value'\";\n\t\tconst input4 = \"KEY=value # this is a comment\";\n\n\t\t// const expectedResult1 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: 'value' },\n\t\t// ];\n\t\t// const expectedResult2 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: '\"value\"' },\n\t\t// ];\n\t\t// const expectedResult3 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: \"'value'\" },\n\t\t// ];\n\t\t// const expectedResult4 = [\n\t\t// {\n\t\t// type: 'value',\n\t\t// key: 'KEY',\n\t\t// value: 'value',\n\t\t// raw: 'value # this is a comment',\n\t\t// },\n\t\t// ];\n\n\t\texpect(parse(input1)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input2)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input3)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input4)).toMatchInlineSnapshot(`\n {\n \"blocks\": [\n {\n \"key\": \"KEY\",\n \"raw\": \"value# this is a comment\",\n \"type\": \"value\",\n \"value\": \"value\",\n },\n ],\n \"obj\": {\n \"KEY\": \"value\",\n },\n }\n `);\n\t});\n}\n","import chalk from \"chalk\";\nimport Table from \"cli-table\";\nexport { Table };\n\nlet _logger: Pick<Console, \"info\" | \"error\" | \"table\">;\nexport const getLogger = () => {\n\tif (!_logger) {\n\t\t_logger = console;\n\t}\n\n\treturn _logger;\n};\nexport const writeLine = (str: string) => {\n\tprocess.stdout.write(str);\n};\nexport const emphasis = (str: string): string => chalk.yellowBright(str);\nexport const strong = (str: string): string => chalk.yellow.bold(str);\n\nexport const clientLogger = {\n\tdebug(content: object) {\n\t\tconsole.log(content);\n\t},\n\tinfo(content: object) {\n\t\tconsole.log(content);\n\t},\n\twarn(content: object) {\n\t\tconsole.log(content);\n\t},\n\terror(content: object) {\n\t\tconsole.error(content);\n\t},\n};\n","import { DotsecConfig } from \"../../types/index\";\nimport { Command, Option } from \"commander\";\n\nimport decryptCommandDefaults from \"./decrypt\";\nimport dotsecCommandDefaults from \"./dotsec\";\nimport encryptCommandDefaults from \"./encrypt\";\nimport initCommandDefaults from \"./init\";\nimport pushCommandDefaults from \"./push\";\nimport runCommandDefaults from \"./run\";\nimport {\n\tCommandOption,\n\tDeepExpandedCommandOption,\n\tDotSecCommandsDefaults,\n\tExpandedCommandOption,\n} from \"./types\";\n\nexport const commandOptions: DotSecCommandsDefaults = {\n\t...dotsecCommandDefaults,\n\t...initCommandDefaults,\n\t...encryptCommandDefaults,\n\t...decryptCommandDefaults,\n\t...runCommandDefaults,\n\t...pushCommandDefaults,\n};\n\nconst expandCommandOption = (\n\tcommandOption: CommandOption | ExpandedCommandOption,\n): DeepExpandedCommandOption => {\n\tif (Array.isArray(commandOption)) {\n\t\tconst [flags, description, defaultValue] = commandOption;\n\t\tconst optionProps = {\n\t\t\tflags,\n\t\t\tdescription,\n\t\t\tdefaultValue,\n\t\t};\n\t\treturn optionProps;\n\t} else {\n\t\tif (\"option\" in commandOption) {\n\t\t\tconst [flags, description, defaultValue] = commandOption.option;\n\t\t\tconst optionProps = {\n\t\t\t\tflags,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue,\n\t\t\t\tenv: commandOption.env,\n\t\t\t};\n\t\t\treturn optionProps;\n\t\t}\n\t\treturn commandOption;\n\t}\n};\n\nconst createOption = (\n\tcommandOption: CommandOption | ExpandedCommandOption,\n\toptions: {\n\t\trequired?: boolean;\n\t\tdotsecConfig?: DotsecConfig;\n\t\toptionKey: string;\n\t},\n): Option => {\n\tconst defaultOptionValueFromConfig =\n\t\toptions?.dotsecConfig?.defaults?.options?.[options?.optionKey];\n\tconst optionProps = expandCommandOption(commandOption);\n\n\tconst newOption = new Option(optionProps.flags, optionProps.description);\n\tif (optionProps.fn) {\n\t\tnewOption.argParser(optionProps.fn);\n\t}\n\tif (optionProps.defaultValue) {\n\t\tnewOption.default(defaultOptionValueFromConfig || optionProps.defaultValue);\n\t}\n\tif (optionProps.env) {\n\t\tnewOption.env(optionProps.env);\n\t}\n\tif (options.required) {\n\t\tnewOption.makeOptionMandatory(true);\n\t}\n\tif (optionProps.choices) {\n\t\tnewOption.choices(optionProps.choices);\n\t}\n\n\treturn newOption;\n};\n\nexport const setProgramOptions = (params: {\n\tprogram: Command;\n\tcommandName?: string;\n\tdotsecConfig: DotsecConfig;\n}) => {\n\tconst { program, commandName, dotsecConfig } = params;\n\tconst programOptions = commandOptions[commandName || program.name()];\n\n\tif (programOptions) {\n\t\tconst { options, requiredOptions, description, usage, helpText } =\n\t\t\tprogramOptions;\n\t\tif (options) {\n\t\t\tObject.keys(options).forEach((optionKey) => {\n\t\t\t\tconst commandOption = options[optionKey];\n\t\t\t\tconst newOption = createOption(commandOption, {\n\t\t\t\t\tdotsecConfig,\n\t\t\t\t\toptionKey,\n\t\t\t\t});\n\n\t\t\t\tprogram.addOption(newOption);\n\t\t\t});\n\t\t}\n\t\tif (requiredOptions) {\n\t\t\tObject.keys(requiredOptions).forEach((requiredOptionKey) => {\n\t\t\t\tconst requiredOption = requiredOptions[requiredOptionKey];\n\t\t\t\tconst newOption = createOption(requiredOption, {\n\t\t\t\t\trequired: true,\n\t\t\t\t\tdotsecConfig,\n\t\t\t\t\toptionKey: requiredOptionKey,\n\t\t\t\t});\n\n\t\t\t\tprogram.addOption(newOption);\n\t\t\t});\n\t\t}\n\t\tif (description) {\n\t\t\tprogram.description(description);\n\t\t}\n\t\tif (usage) {\n\t\t\tprogram.usage(usage);\n\t\t}\n\t\tif (helpText) {\n\t\t\tprogram.description(helpText);\n\t\t}\n\t}\n};\n","export const backgroundColors = [\n\t\"black\",\n\t\"red\",\n\t\"green\",\n\t\"yellow\",\n\t\"blue\",\n\t\"magenta\",\n\t\"cyan\",\n\t\"white\",\n\t\"black-bright\",\n\t\"gray\",\n\t\"grey\",\n\t\"red-bright\",\n\t\"green-bright\",\n\t\"yellow-bright\",\n\t\"blue-bright\",\n\t\"magenta-bright\",\n\t\"cyan-bright\",\n\t\"white-bright\",\n] as const;\n\nexport type BackgroundColor = typeof backgroundColors[number];\n","import {\n\tDOTSEC_DEFAULT_DOTENV_FILENAME,\n\tDOTSEC_DEFAULT_DOTSEC_FILENAME,\n} from \"../../constants\";\nimport { backgroundColors } from \"../../types/colors\";\nimport { ExpandedCommandOption } from \"./types\";\n\nexport const envFileOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--env-file <envFile>\",\n\t\t`Path to .env file. If not provided, will look for value in 'ENV_FILE' environment variable. If not provided, will look for '${DOTSEC_DEFAULT_DOTENV_FILENAME}' file in current directory.`,\n\t\tDOTSEC_DEFAULT_DOTENV_FILENAME,\n\t],\n\tenv: \"ENV_FILE\",\n};\nexport const secFileOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--sec-file, <secFile>\",\n\t\t`Path to .sec file. If not provided, will look for value in 'SEC_FILE' environment variable. If not provided, will look for '${DOTSEC_DEFAULT_DOTSEC_FILENAME}' file in current directory.`,\n\t\tDOTSEC_DEFAULT_DOTSEC_FILENAME,\n\t],\n\tenv: \"SEC_FILE\",\n};\n\nexport const usingOption: ExpandedCommandOption = {\n\tflags: \"--using <using>\",\n\tdescription: \"Wether to use a dot env file or a dot sec file\",\n\tchoices: [\"env\", \"sec\"],\n\tenv: \"DOTSEC_USING\",\n};\n\nexport const usingNoEncryptionEngineOption: ExpandedCommandOption = {\n\tflags: \"--using <using>\",\n\tdescription: \"Wether to use a dot env file or a dot sec file\",\n\tchoices: [\"env\"],\n\tenv: \"DOTSEC_USING\",\n};\n\nexport const showRedactedOption: ExpandedCommandOption = {\n\tflags: \"--show-redacted\",\n\tdescription: 'Wether to show redacted values.\"',\n\tenv: \"DOTSEC_SHOW_REDACTED\",\n};\n\nexport const embellishOutputOption: ExpandedCommandOption = {\n\tflags: \"--embellish-output\",\n\tdescription:\n\t\t\"Show embellished output, with (dotsec) prefix, and background color\",\n\tenv: \"DOTSEC_EMBELLISH_OUTPUT\",\n};\n\nexport const showOutputPrefixOption: ExpandedCommandOption = {\n\tflags: \"--show-output-prefix\",\n\tdescription: \"Show output prefix\",\n\tenv: \"DOTSEC_SHOW_OUTPUT_PREFIX\",\n};\nexport const outputPrefixOption: ExpandedCommandOption = {\n\tflags: \"--output-prefix <outputPrefix>\",\n\tdescription: \"Output prefix\",\n\tenv: \"DOTSEC_OUTPUT_PREFIX\",\n};\n\nexport const showOutputBackgroundColorOption: ExpandedCommandOption = {\n\tflags: \"--show-output-background-color\",\n\tdescription: \"Show output background color\",\n\tenv: \"DOTSEC_SHOW_OUTPUT_BACKGROUND_COLOR\",\n};\n\nexport const outputBackgroundColorOption: ExpandedCommandOption = {\n\tflags: \"--output-background-color <outputBackgroundColor>\",\n\tdescription: \"Background color of the output.\",\n\tenv: \"DOTSEC_OUTPUT_BACKGROUND_COLOR\",\n\tchoices: backgroundColors as unknown as string[],\n\tdefaultValue: \"red-bright\",\n};\n\nexport const yesOption: ExpandedCommandOption = {\n\toption: [\"--yes\", \"Skip confirmation prompts\"],\n};\n\nexport const verboseOption: ExpandedCommandOption = {\n\toption: [\"--verbose\", \"Verbose output\"],\n};\n\nexport const configFileOption: ExpandedCommandOption = {\n\toption: [\"-c, --config-file, --configFile <configFile>\", \"Config file\"],\n\tenv: \"DOTSEC_CONFIG_FILE\",\n};\n\nexport const pluginOption: ExpandedCommandOption = {\n\toption: [\"--plugin <plugin>\", \"Comma-separated list of plugins to use\"],\n\tenv: \"DOTSEC_PLUGIN\",\n};\n\nexport const engineOption: ExpandedCommandOption = {\n\toption: [\"--engine <engine>\", \"Encryption engine to use\"],\n\tenv: \"DOTSEC_ENGINE\",\n};\n\nexport const createManifestOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--create-manifest\",\n\t\t\"Create a markdown manifest file. See the --manifest-file option for more information.\",\n\t],\n\tenv: \"CREATE_MANIFEST\",\n};\n\nexport const manifestFilePrefixOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--manifest-file-prefix <manifestFilePrefix>\",\n\t\t\"Mmanifest file prefix\",\n\t],\n\tenv: \"ENCRYPTION_MANIFEST_FILE\",\n};\n","import {\n\tconfigFileOption,\n\tcreateManifestOption,\n\tenvFileOption,\n\tmanifestFilePrefixOption,\n\tsecFileOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst decryptCommandDefaults: DotSecCommandsDefaults = {\n\tdecrypt: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tcreateManifest: createManifestOption,\n\t\t\tmanifestFilePrefix: manifestFilePrefixOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription: \"Decrypt a sec file\",\n\t\thelpText: `Examples:\n\n\nDecrypt .sec file to .env file\n\n$ npx dotsec decrypt\n\n\nSpecify a different .sec file\n\n$ npx dotsec decrypt --sec-file .sec.dev\n$ SEC_FILE=.sec.dev npx dotsec decrypt\n\nSpecify a different .env file\n\n$ npx dotsec decrypt --env-file .env.dev\n$ ENV_FILE=.env.dev npx dotsec decrypt\n\nWrite a manifest markdown file\n\n$ npx dotsec decrypt --create-manifest\n$ CREATE_MANIFEST=true npx dotsec decrypt\n\nSpecify a different manifest file\n\n$ npx dotsec decrypt --manifest-file .manifest.dev\n$ MANIFEST_FILE=decryption-manifest.md npx dotsec decrypt\n`,\n\t},\n};\n\nexport default decryptCommandDefaults;\n","import { configFileOption, pluginOption } from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst dotsecCommandDefaults: DotSecCommandsDefaults = {\n\tdotsec: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tplugin: pluginOption,\n\t\t},\n\t},\n};\n\nexport default dotsecCommandDefaults;\n","import {\n\tconfigFileOption,\n\tcreateManifestOption,\n\tenvFileOption,\n\tmanifestFilePrefixOption,\n\tsecFileOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst encryptCommandDefaults: DotSecCommandsDefaults = {\n\tencrypt: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tcreateManifest: createManifestOption,\n\t\t\tmanifestFile: manifestFilePrefixOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription: \"Encrypt an env file\",\n\t\thelpText: `Examples:\n\n\nEncrypt .env file to .sec file\n\n$ npx dotsec encrypt\n\n\nSpecify a different .env file\n\n$ npx dotsec encrypt --env-file .env.dev\n$ ENV_FILE=.env.dev npx dotsec encrypt\n\n\nSpecify a different .sec file\n\n$ npx dotsec encrypt --sec-file .sec.dev\n$ SEC_FILE=.sec.dev npx dotsec encrypt\n\n\nWrite a manifest markdown file\n\n$ npx dotsec encrypt --create-manifest\n$ CREATE_MANIFEST=true npx dotsec encrypt\n\n\nSpecify a different manifest file\n\n$ npx dotsec encrypt --manifest-file manifest.dev\n$ MANIFEST_FILE=encryption-manifest.md npx dotsec encrypt\n`,\n\t},\n};\n\nexport default encryptCommandDefaults;\n","import { configFileOption, yesOption } from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst initCommandDefaults: DotSecCommandsDefaults = {\n\tinit: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription:\n\t\t\t\"Initialize a dotsec project by creating a dotsec.config.ts file.\",\n\t\thelpText: `Examples:\n\nCreate a dotsec.config.ts file in the current directory\n\n$ npx dotsec init\n\n\nOverwrite an existing dotsec.config.ts file in the current directory\n\n$ npx dotsec init --yes\n\n\nCreate a dotsec config file in the current directory with a specific config file name\n\nBy specifying the --config-file option, you can create a dotsec config file with a specific name.\n\n$ npx dotsec init --config-file dotsec.config.ts\n\n$ DOTSEC_CONFIG_FILE=my.config.ts npx dotsec init\n`,\n\t},\n};\n\nexport default initCommandDefaults;\n","import {\n\tconfigFileOption,\n\tenvFileOption,\n\tsecFileOption,\n\tusingOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst pushCommandDefaults: DotSecCommandsDefaults = {\n\tpush: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingOption,\n\t\t},\n\t\tdescription: \"Push variables from env or sec file to a remote\",\n\t\thelpText: `Examples:\n\nPush variables from .env file to remote\n\n$ npx dotsec push --using env\n$ DOTSEC_USING=env npx dotsec push\n\n\nPush variables from .sec file to remote\n\n$ npx dotsec push --using sec\n$ DOTSEC_USING=sec npx dotsec push\n`,\n\t},\n};\n\nexport default pushCommandDefaults;\n","import {\n\tconfigFileOption,\n\tengineOption,\n\tenvFileOption,\n\toutputBackgroundColorOption,\n\toutputPrefixOption,\n\tsecFileOption,\n\tshowOutputBackgroundColorOption,\n\tshowOutputPrefixOption,\n\tshowRedactedOption,\n\tusingNoEncryptionEngineOption,\n\tusingOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n/*\n\nrun --env-file=.env --sec-file=.sec --with=env-file\n\n*/\nconst runCommandDefaults: DotSecCommandsDefaults = {\n\trunEnvOnly: {\n\t\tusage: \"--using env [commandArgs...]\",\n\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tyes: yesOption,\n\t\t\tengine: engineOption,\n\t\t\tshowRedacted: showRedactedOption,\n\t\t\toutputBackgroundColor: outputBackgroundColorOption,\n\t\t\tshowOutputBackgroundColor: showOutputBackgroundColorOption,\n\t\t\tshowOutputPrefix: showOutputPrefixOption,\n\t\t\toutputPrefix: outputPrefixOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingNoEncryptionEngineOption,\n\t\t},\n\n\t\tdescription:\n\t\t\t\"Run a command in a separate process and populate env with contents of a dotenv file.\",\n\t\thelpText: `Examples:\n\t\t\nRun a command with a .env file\n\t\t\n$ npx dotsec run --using env node -e \\\"console.log(process.env)\\\"\n\n\nRun a command with a specific .env file\n\n$ npx dotsec run --using env --env-file .env node -e \\\"console.log(process.env)\\\"\n\n\nRun a command with a specific ENV_FILE variable\n\n$ ENV_FILE=.env.dev npx dotsec run --using env node -e \\\"console.log(process.env)\\\"\n\n\nYou can also specify 'using' as an environment variable\n\n$ DOTSEC_USING=env npx dotsec run node -e \\\"console.log(process.env)\\\"\n\t\t`,\n\t},\n\trun: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tyes: yesOption,\n\t\t\tshowRedacted: showRedactedOption,\n\t\t\toutputBackgroundColor: outputBackgroundColorOption,\n\t\t\thideOutputBackgroundColor: showOutputBackgroundColorOption,\n\t\t\thideOutputPrefix: showOutputPrefixOption,\n\t\t\toutputPrefix: outputPrefixOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingOption,\n\t\t},\n\n\t\tusage: \"[--using env] [--using sec] [commandArgs...]\",\n\t\tdescription: `Run a command in a separate process and populate env with either \n\t\t\t- contents of a dotenv file\n\t\t\t- decrypted values of a dotsec file.\n\nThe --withEnv option will take precedence over the --withSec option. If neither are specified, the --withEnv option will be used by default.`,\n\t\thelpText: `${\"Examples:\"}\n\n${\"Run a command with a .env file\"}\n\n$ dotsec run echo \"hello world\"\n\n\n${\"Run a command with a specific .env file\"}\n\n$ dotsec run --with-env --env-file .env.dev echo \"hello world\"\n\n\n${\"Run a command with a .sec file\"}\n\n$ dotsec run --with-sec echo \"hello world\"\n\n\n${\"Run a command with a specific .sec file\"}\n\n$ dotsec run --with-sec --sec-file .sec.dev echo \"hello world\"\n`,\n\t},\n\t// push: {\n\t// \toptions: {\n\t// \t\t...dotsecCommandDefaults.dotsec.options,\n\t// \t\twithEnv: withEnvOption,\n\t// \t\twithSec: withSecOption,\n\t// \t\tenvFile: envFileOption,\n\t// \t\tsecFile: secFileOption,\n\t// \t\tyes: yesOption,\n\t// \t},\n\t// \trequiredOptions: {\n\t// \t\t...dotsecCommandDefaults.dotsec.requiredOptions,\n\t// \t},\n\t// },\n};\n\nexport default runCommandDefaults;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { parse } from \"../../lib/parse\";\nimport { DecryptCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginDecryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { Command } from \"commander\";\n\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n} & Record<string, unknown>;\n\nconst addEncryptProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\tdecryptHandlers: DotsecCliPluginDecryptHandler[];\n\t},\n) => {\n\tconst { dotsecConfig, decryptHandlers } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"decrypt\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tcreateManifest,\n\t\t\t\t\tmanifestFile,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<DecryptCommandOptions>();\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\tconst pluginCliDecrypt = (decryptHandlers || []).find((handler) => {\n\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t});\n\n\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${options.decryptHandlers\n\t\t\t\t\t\t\t.map((e) => `--${e.triggerOptionValue}`)\n\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t\"Decrypting with\",\n\t\t\t\t\tstrong(\n\t\t\t\t\t\tpluginCliDecrypt.encryptionEngineName ||\n\t\t\t\t\t\t\tpluginCliDecrypt.triggerOptionValue,\n\t\t\t\t\t),\n\t\t\t\t\t\"engine\",\n\t\t\t\t);\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliDecrypt.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliDecrypt.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\t// get current dot env file\n\t\t\t\tconst dotsecString = await readContentsFromFile(secFile);\n\n\t\t\t\tconst plaintext = await pluginCliDecrypt.handler({\n\t\t\t\t\tciphertext: dotsecString,\n\t\t\t\t\t...allOptionsValues,\n\t\t\t\t});\n\n\t\t\t\tconst dotenvOverwriteResponse = await promptOverwriteIfFileExists({\n\t\t\t\t\tfilePath: envFile,\n\t\t\t\t\tskip: yes,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tdotenvOverwriteResponse === undefined ||\n\t\t\t\t\tdotenvOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(envFile, plaintext);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote plaintext contents of ${strong(secFile)} file to ${strong(\n\t\t\t\t\t\t\tenvFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (createManifest || dotsecConfig?.defaults?.options?.createManifest) {\n\t\t\t\t\t// parse raw env contents into key value pairs using the dotenv package\n\t\t\t\t\tconst dotenvVars = parse(plaintext).obj;\n\t\t\t\t\t// expand env vars\n\t\t\t\t\tconst markdownManifest = `# Dotsec decryption manifest\n\n## Overview\n\n- plaintext source: ${envFile}\n- ciphertext target: ${secFile}\n- created: ${new Date().toUTCString()}\n- Decryption engine: ${\n\t\t\t\t\t\tpluginCliDecrypt.encryptionEngineName ||\n\t\t\t\t\t\tpluginCliDecrypt.triggerOptionValue\n\t\t\t\t\t}\n- Decryption engine options: ${JSON.stringify(allOptionsValues)}\n\n## Variables\n\n| Key |\n| --- |\n${Object.keys(dotenvVars)\n\t.map((key) => {\n\t\treturn `| \\`${key} \\`| `;\n\t})\n\t.join(\"\\n\")}\n`;\n\n\t\t\t\t\t// write manifest file, don't prompt to overwrite\n\t\t\t\t\tconst manifestTargetFile =\n\t\t\t\t\t\tmanifestFile || `${envFile}.decryption-manifest.md`;\n\t\t\t\t\tawait writeContentsToFile(manifestTargetFile, markdownManifest);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote manifest of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\tmanifestTargetFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\tcommand.help();\n\t\t\t}\n\t\t});\n\n\toptions.decryptHandlers.map((decryption) => {\n\t\tconst { options, requiredOptions } = decryption;\n\t\taddPluginOptions(options, subProgram);\n\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t});\n\n\tconst engines = options.decryptHandlers.map((e) => e.triggerOptionValue);\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"} to use: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\n\treturn subProgram;\n};\n\nexport default addEncryptProgram;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { parse } from \"../../lib/parse\";\nimport { EncryptCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginEncryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { Command } from \"commander\";\n\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n} & Record<string, unknown>;\n\nconst addEncryptProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tencryptHandlers: DotsecCliPluginEncryptHandler[];\n\t\tdotsecConfig: DotsecConfig;\n\t},\n) => {\n\tconst { encryptHandlers, dotsecConfig } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"encrypt\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tcreateManifest,\n\t\t\t\t\tmanifestFile,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<EncryptCommandOptions>();\n\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\t\t\t\tconst pluginCliEncrypt = (encryptHandlers || []).find((handler) => {\n\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t});\n\n\t\t\t\tif (!pluginCliEncrypt) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No encryption plugin found, available encryption engine(s): ${options.encryptHandlers\n\t\t\t\t\t\t\t.map((e) => e.triggerOptionValue)\n\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliEncrypt.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliEncrypt.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst dotenvString = await readContentsFromFile(envFile);\n\t\t\t\tlet dotsecString: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tdotsecString = await readContentsFromFile(secFile);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t\tconst cipherText = await pluginCliEncrypt.handler({\n\t\t\t\t\tplaintext: dotenvString,\n\t\t\t\t\tciphertext: dotsecString,\n\t\t\t\t\t...allOptionsValues,\n\t\t\t\t});\n\n\t\t\t\tconst dotsecOverwriteResponse = await promptOverwriteIfFileExists({\n\t\t\t\t\tfilePath: secFile,\n\t\t\t\t\tskip: yes,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tdotsecOverwriteResponse === undefined ||\n\t\t\t\t\tdotsecOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(secFile, cipherText);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote encrypted contents of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\tsecFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tcreateManifest ||\n\t\t\t\t\t\tdotsecConfig?.defaults?.options?.createManifest\n\t\t\t\t\t) {\n\t\t\t\t\t\t// parse raw env contents into key value pairs using the dotenv package\n\t\t\t\t\t\tconst dotenvVars = parse(dotenvString).obj;\n\t\t\t\t\t\t// expand env vars\n\t\t\t\t\t\tconst markdownManifest = `# Dotsec encryption manifest \n\n## Overview\n\n- plaintext source: ${envFile}\n- ciphertext target: ${secFile}\n- created: ${new Date().toUTCString()}\n- encryption engine: ${\n\t\t\t\t\t\t\tpluginCliEncrypt.encryptionEngineName ||\n\t\t\t\t\t\t\tpluginCliEncrypt.triggerOptionValue\n\t\t\t\t\t\t}\n- encryption engine options: ${JSON.stringify(allOptionsValues)}\n\n## Variables\n\n| Key | \n| --- | \n${Object.keys(dotenvVars)\n\t.map((key) => {\n\t\treturn `| \\`${key} \\`| `;\n\t})\n\t.join(\"\\n\")}\n`;\n\n\t\t\t\t\t\t// write manifest file, don't prompt to overwrite\n\t\t\t\t\t\tconst manifestTargetFile =\n\t\t\t\t\t\t\tmanifestFile || `${secFile}.encryption-manifest.md`;\n\t\t\t\t\t\tawait writeContentsToFile(manifestTargetFile, markdownManifest);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`Wrote manifest of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\t\tmanifestTargetFile,\n\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\tcommand.help();\n\t\t\t}\n\t\t});\n\n\toptions.encryptHandlers.map((encryptionHandler) => {\n\t\tconst { options, requiredOptions } = encryptionHandler;\n\t\taddPluginOptions(options, subProgram);\n\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t});\n\tconst engines = options.encryptHandlers.map((e) => e.triggerOptionValue);\n\tconst encryptionEngineNames = options.encryptHandlers.map(\n\t\t(e) => e.encryptionEngineName,\n\t);\n\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"}: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\tsubProgram.description(\n\t\t`Encrypt .env file using ${encryptionEngineNames.join(\", \")}`,\n\t);\n\treturn subProgram;\n};\n\nexport default addEncryptProgram;\n","import {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { DotsecConfig, InitCommandOptions } from \"../../types\";\nimport { Command } from \"commander\";\n\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport path from \"node:path\";\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n};\n\nconst addInitProgram = async (\n\tprogram: Command,\n\toptions: { dotsecConfig: DotsecConfig },\n) => {\n\tconst { dotsecConfig } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"init\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\tconst { configFile = \"dotsec.config.ts\", yes } =\n\t\t\t\tcommand.optsWithGlobals<InitCommandOptions>();\n\t\t\ttry {\n\t\t\t\tconst configTemplate = await readContentsFromFile(\n\t\t\t\t\tpath.resolve(__dirname, \"../../src/templates/dotsec.config.ts\"),\n\t\t\t\t);\n\n\t\t\t\tconst dotsecConfigOverwriteResponse = await promptOverwriteIfFileExists(\n\t\t\t\t\t{\n\t\t\t\t\t\tfilePath: configFile,\n\t\t\t\t\t\tskip: yes,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\tdotsecConfigOverwriteResponse === undefined ||\n\t\t\t\t\tdotsecConfigOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(configFile, configTemplate);\n\t\t\t\t\tconsole.log(`Wrote config file to ${strong(configFile)}`);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tcommand.error(e);\n\t\t\t}\n\t\t});\n\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\n\treturn subProgram;\n};\n\nexport default addInitProgram;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport { parse } from \"../../lib/parse\";\nimport { PushCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport {\n\tDotsecCliOption,\n\tDotsecCliPluginDecryptHandler,\n\tDotsecCliPluginPushHandler,\n} from \"../../types/plugin\";\nimport { setProgramOptions } from \"../options/index\";\nimport { Command } from \"commander\";\nimport { expand } from \"dotenv-expand\";\nimport fs from \"node:fs\";\n\n/**\n * Decrypts, and pushes the contents of a .env file to AWS SSM, AWS Secrets Manager or GitHub Actions Secrets\n * @date 12/7/2022 - 9:16:48 AM\n *\n * @async\n * @param {Command} program\n * @returns {unknown}\n */\nconst addPushProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\thandlers: {\n\t\t\tpush: DotsecCliPluginPushHandler;\n\t\t\tdecrypt: DotsecCliPluginDecryptHandler;\n\t\t}[];\n\t},\n) => {\n\tconst { dotsecConfig, handlers } = options;\n\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"push\")\n\t\t.action(async (_options: Record<string, string>, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tusing,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<PushCommandOptions>();\n\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\tconst pluginCliDecrypt = (handlers || []).find((handler) => {\n\t\t\t\t\treturn handler.decrypt?.triggerOptionValue === encryptionEngine;\n\t\t\t\t})?.decrypt;\n\n\t\t\t\tconst pluginCliPush = (handlers || []).find((handler) => {\n\t\t\t\t\treturn handler.push?.triggerOptionValue === encryptionEngine;\n\t\t\t\t})?.push;\n\n\t\t\t\tif (!pluginCliPush) {\n\t\t\t\t\tthrow new Error(\"No push plugin found!\");\n\t\t\t\t}\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliDecrypt?.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliDecrypt?.requiredOptions || {}),\n\t\t\t\t\t...Object.keys(pluginCliPush?.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliPush?.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tlet envContents: string | undefined;\n\n\t\t\t\tif (using === \"env\") {\n\t\t\t\t\tif (!envFile) {\n\t\t\t\t\t\tthrow new Error(\"No dotenv file specified in --env-file option\");\n\t\t\t\t\t}\n\t\t\t\t\tenvContents = fs.readFileSync(envFile, \"utf8\");\n\t\t\t\t} else {\n\t\t\t\t\tif (!secFile) {\n\t\t\t\t\t\tthrow new Error(\"No dotsec file specified in --sec-file option\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${handlers\n\t\t\t\t\t\t\t\t.map((e) => `--${e.decrypt?.triggerOptionValue}`)\n\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dotSecContents = fs.readFileSync(secFile, \"utf8\");\n\t\t\t\t\tenvContents = await pluginCliDecrypt.handler({\n\t\t\t\t\t\tciphertext: dotSecContents,\n\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (envContents) {\n\t\t\t\t\t// convert to object\n\t\t\t\t\tconst dotenvVars = parse(envContents).obj;\n\t\t\t\t\t// expand env vars\n\t\t\t\t\tconst expandedEnvVars = expand({\n\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t...(process.env as Record<string, string>),\n\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tif (expandedEnvVars.parsed) {\n\t\t\t\t\t\tawait pluginCliPush.handler({\n\t\t\t\t\t\t\tpush: expandedEnvVars.parsed,\n\t\t\t\t\t\t\tyes,\n\t\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"No .env or .sec file provided\");\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t});\n\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\tconst engines = options.handlers.map(\n\t\t({ decrypt }) => decrypt.triggerOptionValue,\n\t);\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"} to use: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tconst allOptions: {\n\t\t[x: string]: DotsecCliOption & { required?: boolean };\n\t} = {};\n\toptions.handlers.forEach((handlers) => {\n\t\tObject.keys(handlers).map((handlerName) => {\n\t\t\tconst { options: cliOptions, requiredOptions } = handlers[handlerName];\n\t\t\tObject.keys(cliOptions || {}).forEach((key) => {\n\t\t\t\tallOptions[key] = Array.isArray(cliOptions[key])\n\t\t\t\t\t? cliOptions[key]\n\t\t\t\t\t: { ...allOptions[key], ...cliOptions[key] };\n\t\t\t});\n\t\t\tObject.keys(requiredOptions || {}).forEach((key) => {\n\t\t\t\tallOptions[key] = Array.isArray(requiredOptions[key])\n\t\t\t\t\t? requiredOptions[key]\n\t\t\t\t\t: {\n\t\t\t\t\t\t\t...allOptions[key],\n\t\t\t\t\t\t\t...requiredOptions[key],\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t };\n\t\t\t});\n\t\t});\n\t});\n\n\tconst usage: string[] = [];\n\tconst descriptions: string[] = [];\n\n\thandlers.forEach((handler) => {\n\t\tif (handler.push?.description) {\n\t\t\tdescriptions.push(handler.push.description);\n\t\t}\n\n\t\tif (handler.push?.usage) {\n\t\t\tusage.push(handler.push.usage);\n\t\t}\n\t});\n\n\tif (descriptions.length > 0) {\n\t\tsubProgram.description(descriptions.join(\"\\n\"));\n\t}\n\n\tif (usage.length > 0) {\n\t\tsubProgram.usage(usage.join(\"\\n\"));\n\t}\n\n\taddPluginOptions(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(allOptions).filter(\n\t\t\t\t([_key, value]) => value.required !== true,\n\t\t\t),\n\t\t),\n\t\tsubProgram,\n\t);\n\taddPluginOptions(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(allOptions).filter(\n\t\t\t\t([_key, value]) => value.required === true,\n\t\t\t),\n\t\t),\n\t\tsubProgram,\n\t\ttrue,\n\t);\n\n\treturn subProgram;\n};\n\nexport default addPushProgram;\n","import fs from \"node:fs\";\n\nimport { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport { parse } from \"../../lib/parse\";\nimport { RunCommandOptions } from \"../../types\";\nimport { BackgroundColor, backgroundColors } from \"../../types/colors\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginDecryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { camelCase } from \"camel-case\";\nimport chalk from \"chalk\";\n\nimport { Command } from \"commander\";\nimport { expand } from \"dotenv-expand\";\nimport { spawn } from \"node:child_process\";\nconst addRunProgam = (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\tdecryptHandlers?: DotsecCliPluginDecryptHandler[];\n\t},\n) => {\n\tconst { dotsecConfig, decryptHandlers } = options || {};\n\t// create api here\n\n\t// is there an encryption engine?\n\tconst hasDecryptEngine =\n\t\tdecryptHandlers !== undefined && decryptHandlers.length > 0;\n\n\tconst subProgram = program\n\t\t.command(\"run <command...>\")\n\t\t.allowUnknownOption(true)\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.showHelpAfterError(true)\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tcommands: string[],\n\t\t\t\t_options: Record<string, string>,\n\t\t\t\tcommand: Command,\n\t\t\t) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tenvFile,\n\t\t\t\t\t\tusing,\n\t\t\t\t\t\tsecFile,\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tshowRedacted,\n\t\t\t\t\t\toutputBackgroundColor,\n\t\t\t\t\t\tshowOutputBackgroundColor,\n\t\t\t\t\t\tshowOutputPrefix,\n\t\t\t\t\t\toutputPrefix,\n\t\t\t\t\t} = command.optsWithGlobals<RunCommandOptions>();\n\n\t\t\t\t\tlet envContents: string | undefined;\n\n\t\t\t\t\tif (using === \"env\" || hasDecryptEngine === false) {\n\t\t\t\t\t\tif (!envFile) {\n\t\t\t\t\t\t\tthrow new Error(\"No dotenv file specified in --env-file option\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenvContents = fs.readFileSync(envFile, \"utf8\");\n\t\t\t\t\t} else if (using === \"sec\") {\n\t\t\t\t\t\tif (!secFile) {\n\t\t\t\t\t\t\tthrow new Error(\"No dotsec file specified in --sec-file option\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst encryptionEngine =\n\t\t\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\t\t\tconst pluginCliDecrypt = (decryptHandlers || []).find((handler) => {\n\t\t\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${(\n\t\t\t\t\t\t\t\t\tdecryptHandlers || []\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.map((e) => `--${e.triggerOptionValue}`)\n\t\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t\t\t...Object.keys(pluginCliDecrypt.options || {}),\n\t\t\t\t\t\t\t...Object.keys(pluginCliDecrypt.requiredOptions || {}),\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst dotSecContents = fs.readFileSync(secFile, \"utf8\");\n\t\t\t\t\t\t\tenvContents = await pluginCliDecrypt.handler({\n\t\t\t\t\t\t\t\tciphertext: dotSecContents,\n\t\t\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error(\"Something bad happened while decrypting.\");\n\t\t\t\t\t\t\tconsole.error(`File: ${secFile}`);\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (envContents) {\n\t\t\t\t\t\tconst dotenvVars = parse(envContents).obj;\n\t\t\t\t\t\t// expand env vars\n\t\t\t\t\t\tconst expandedEnvVars = expand({\n\t\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t\t...(process.env as Record<string, string>),\n\t\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst [userCommand, ...userCommandArgs] = commands;\n\t\t\t\t\t\tconst waiter: number | undefined = await new Promise((resolve) => {\n\t\t\t\t\t\t\tconst cprocess = spawn(userCommand, [...userCommandArgs], {\n\t\t\t\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t\t\t\t\tshell: false,\n\t\t\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t\t\t...expandedEnvVars.parsed,\n\t\t\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t\t\t__DOTSEC_ENV__: JSON.stringify(Object.keys(dotenvVars)),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst expandedEnvVarsWithoutEnv = expand({\n\t\t\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.stdout.setEncoding(\"utf8\");\n\n\t\t\t\t\t\t\t// hideOutputBackgroundColor;\n\t\t\t\t\t\t\tlet addBackgroundColor: chalk.Chalk | ((str: string) => string) =\n\t\t\t\t\t\t\t\tshowOutputBackgroundColor ||\n\t\t\t\t\t\t\t\tdotsecConfig.defaults?.options?.showBackgroundColor\n\t\t\t\t\t\t\t\t\t? chalk.bgRedBright\n\t\t\t\t\t\t\t\t\t: (str: string) => str;\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\toutputBackgroundColor &&\n\t\t\t\t\t\t\t\t(showOutputBackgroundColor ||\n\t\t\t\t\t\t\t\t\tdotsecConfig.defaults?.options?.showBackgroundColor)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!backgroundColors.includes(\n\t\t\t\t\t\t\t\t\t\toutputBackgroundColor as BackgroundColor,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// throw error\n\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`Invalid background color: ${outputBackgroundColor}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst backgroundColorFnName = camelCase(\n\t\t\t\t\t\t\t\t\t`bg-${outputBackgroundColor}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (chalk[backgroundColorFnName]) {\n\t\t\t\t\t\t\t\t\taddBackgroundColor = chalk[\n\t\t\t\t\t\t\t\t\t\tbackgroundColorFnName\n\t\t\t\t\t\t\t\t\t] as chalk.Chalk;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\t\t`Invalid background color: ${backgroundColorFnName}, using default: red`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\taddBackgroundColor = chalk.bgRedBright;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst prefix =\n\t\t\t\t\t\t\t\tshowOutputPrefix ||\n\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.showOutputPrefix\n\t\t\t\t\t\t\t\t\t? `${\n\t\t\t\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.outputPrefix ||\n\t\t\t\t\t\t\t\t\t\t\toutputPrefix ||\n\t\t\t\t\t\t\t\t\t\t\t\"(dotsec) \"\n\t\t\t\t\t\t\t\t\t }`\n\t\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tcprocess.stdout.on(\"data\", function (data) {\n\t\t\t\t\t\t\t\t//Here is where the output goes\n\t\t\t\t\t\t\t\t// split by new line\n\t\t\t\t\t\t\t\tconst lines = addBackgroundColor(\n\t\t\t\t\t\t\t\t\tdata\n\t\t\t\t\t\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t\t\t\t\t\t.map((line) => `${prefix}${line}`)\n\t\t\t\t\t\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t// redact\n\t\t\t\t\t\t\t\t// iterate over each env var\n\t\t\t\t\t\t\t\t// for each env var, replace the value with a redacted version\n\n\t\t\t\t\t\t\t\tconst redactedLines =\n\t\t\t\t\t\t\t\t\t(showRedacted ||\n\t\t\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.showRedacted) !== true\n\t\t\t\t\t\t\t\t\t\t? Object.entries(expandedEnvVarsWithoutEnv.parsed || {})\n\t\t\t\t\t\t\t\t\t\t\t\t.sort(([, a], [, b]) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (a.length > b.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else if (a.length < b.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t.reduce((acc, [key, value]) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (dotsecConfig?.redaction?.show?.includes(key)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst redactedValue = value.replace(/./g, \"*\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn acc.replace(value, redactedValue);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}, lines as string)\n\t\t\t\t\t\t\t\t\t\t: lines;\n\n\t\t\t\t\t\t\t\tconsole.log(redactedLines);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.stderr.setEncoding(\"utf8\");\n\t\t\t\t\t\t\tcprocess.stderr.on(\"data\", function (data) {\n\t\t\t\t\t\t\t\tprocess.stderr.write(data.toString());\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.on(\"exit\", (code: number) => {\n\t\t\t\t\t\t\t\tresolve(code);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (waiter !== 0) {\n\t\t\t\t\t\t\tprocess.exit(waiter || 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\"No .env or .sec file provided\");\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\t\tcommand.help();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\tsetProgramOptions({\n\t\tprogram: subProgram,\n\t\tcommandName: hasDecryptEngine ? \"run\" : \"runEnvOnly\",\n\t\tdotsecConfig,\n\t});\n\n\tif (hasDecryptEngine) {\n\t\tdecryptHandlers?.map((run) => {\n\t\t\tconst { options, requiredOptions } = run;\n\t\t\taddPluginOptions(options, subProgram);\n\t\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t\t});\n\t\tconst engines = decryptHandlers?.map((e) => e.triggerOptionValue);\n\n\t\tsubProgram.option(\n\t\t\t\"--engine <engine>\",\n\t\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"}: ${\n\t\t\t\t(engines.join(\", \"), engines.length === 1 ? engines[0] : undefined)\n\t\t\t}`,\n\t\t\t// engines.length === 1 ? engines[0] : undefined,\n\t\t);\n\t}\n\treturn subProgram;\n};\n\nexport default addRunProgam;\n"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/constants.ts","../../src/lib/json.ts","../../src/lib/getConfig.ts","../../src/lib/loadDotsecPlugin.ts","../../src/lib/addPluginOptions.ts","../../src/lib/io.ts","../../src/lib/parse.ts","../../src/utils/logging.ts","../../src/cli/options/index.ts","../../src/types/colors.ts","../../src/cli/options/sharedOptions.ts","../../src/cli/options/decrypt.ts","../../src/cli/options/dotsec.ts","../../src/cli/options/encrypt.ts","../../src/cli/options/init.ts","../../src/cli/options/push.ts","../../src/cli/options/run.ts","../../src/cli/commands/decrypt.ts","../../src/cli/commands/encrypt.ts","../../src/cli/commands/init.ts","../../src/cli/commands/push.ts","../../src/cli/commands/run.ts"],"names":["Command","path","fs","Option","program","options","decrypt_default","addEncryptProgram","encrypt_default","init_default","handlers","push_default","chalk","expand","run_default"],"mappings":"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","sourcesContent":["import { Command } from \"commander\";\n\nimport { getMagicalConfig } from \"../lib/getConfig\";\nimport { loadDotsecPlugin } from \"../lib/loadDotsecPlugin\";\nimport {\n\tDotsecCliPluginDecryptHandler,\n\tDotsecCliPluginEncryptHandler,\n\tDotsecCliPluginPushHandler,\n\tDotsecPluginConfig,\n} from \"../types/plugin\";\nimport addDecryptProgram from \"./commands/decrypt\";\nimport addEncryptProgram from \"./commands/encrypt\";\nimport addInitCommand from \"./commands/init\";\nimport addPushProgram from \"./commands/push\";\nimport addRunCommand from \"./commands/run\";\nimport { setProgramOptions } from \"./options\";\nimport Ajv, { KeywordDefinition } from \"ajv\";\nimport yargsParser from \"yargs-parser\";\n\nconst separator: KeywordDefinition = {\n\tkeyword: \"separator\",\n\ttype: \"string\",\n\tmetaSchema: {\n\t\ttype: \"string\",\n\t\tdescription: \"value separator\",\n\t},\n\tmodifying: true,\n\tvalid: true,\n\terrors: false,\n\tcompile: (schema) => (data, ctx) => {\n\t\tif (ctx) {\n\t\t\tconst { parentData, parentDataProperty } = ctx;\n\t\t\tparentData[parentDataProperty] = data === \"\" ? [] : data.split(schema);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t},\n};\n\nconst program = new Command();\n\n(async () => {\n\tconst parsedOptions = yargsParser(process.argv);\n\tconst argvPluginModules: string[] = [];\n\tif (parsedOptions.plugin) {\n\t\tif (Array.isArray(parsedOptions.plugin)) {\n\t\t\targvPluginModules.push(...parsedOptions.plugin);\n\t\t} else {\n\t\t\targvPluginModules.push(parsedOptions.plugin);\n\t\t}\n\t}\n\n\tconst someConfigFile = parsedOptions.configFile || parsedOptions.c;\n\n\tconst configFile =\n\t\t[\n\t\t\t...(Array.isArray(someConfigFile) ? someConfigFile : [someConfigFile]),\n\t\t]?.[0] || process.env.DOTSEC_CONFIG_FILE;\n\tconst { contents: dotsecConfig = {} } = await getMagicalConfig(configFile);\n\tconst { defaults = {}, push: pushVariables, plugins } = dotsecConfig;\n\tprogram\n\t\t.name(\"dotsec\")\n\t\t.description(\".env, but secure\")\n\t\t.version(\"1.0.0\")\n\t\t.passThroughOptions()\n\t\t.action((_options, other: Command) => {\n\t\t\tother.help();\n\t\t});\n\tsetProgramOptions({ program, dotsecConfig: dotsecConfig });\n\tconst ajv = new Ajv({\n\t\tallErrors: true,\n\t\tremoveAdditional: true,\n\t\tuseDefaults: true,\n\t\tcoerceTypes: true,\n\t\tallowUnionTypes: true,\n\t\taddUsedSchema: false,\n\t\tkeywords: [separator],\n\t});\n\t// if we have plugins in the cli, we need to define them in pluginModules\n\tconst pluginModules: { [key: string]: string } = {};\n\n\t// check plugins\n\tif (plugins) {\n\t\tfor (const pluginName of plugins) {\n\t\t\tif (!defaults?.plugins?.[pluginName]) {\n\t\t\t\tdefaults.plugins = {\n\t\t\t\t\t...defaults.plugins,\n\t\t\t\t\t[pluginName]: {},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\t// check argv\n\tif (argvPluginModules.length > 0) {\n\t\tfor (const pluginModule of argvPluginModules) {\n\t\t\t// let's load em up\n\t\t\tconst plugin = await loadDotsecPlugin({ name: pluginModule });\n\n\t\t\t// good, let's fire 'em up\n\t\t\tconst loadedPlugin = await plugin({\n\t\t\t\tdotsecConfig: dotsecConfig,\n\t\t\t\tajv,\n\t\t\t\tconfigFile,\n\t\t\t});\n\t\t\tpluginModules[loadedPlugin.name] = pluginModule;\n\n\t\t\tif (argvPluginModules.length === 1) {\n\t\t\t\t// if we only have one plugin, let's set it as the default\n\t\t\t\tdotsecConfig.defaults = {\n\t\t\t\t\t...dotsecConfig.defaults,\n\t\t\t\t\tencryptionEngine: String(loadedPlugin.name),\n\t\t\t\t\tplugins: {\n\t\t\t\t\t\t...dotsecConfig.defaults?.plugins,\n\t\t\t\t\t\t[loadedPlugin.name]: {\n\t\t\t\t\t\t\t...dotsecConfig.defaults?.plugins?.[loadedPlugin.name],\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tif (defaults?.encryptionEngine) {\n\t\tif (!defaults?.plugins?.[defaults.encryptionEngine]) {\n\t\t\tdefaults.plugins = {\n\t\t\t\t...defaults.plugins,\n\t\t\t\t[defaults.encryptionEngine]: {},\n\t\t\t};\n\t\t}\n\t}\n\tif (defaults?.plugins) {\n\t\tObject.entries(defaults?.plugins).forEach(\n\t\t\t([pluginName, pluginModule]: [string, DotsecPluginConfig]) => {\n\t\t\t\tif (pluginModule?.name) {\n\t\t\t\t\tpluginModules[pluginName] = pluginModule?.name;\n\t\t\t\t} else {\n\t\t\t\t\tpluginModules[pluginName] = `@dotsec/plugin-${pluginName}`;\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tObject.values(pushVariables || {}).forEach((pushVariable) => {\n\t\tObject.keys(pushVariable).forEach((pluginName) => {\n\t\t\tif (!pluginModules[pluginName]) {\n\t\t\t\tpluginModules[pluginName] = `@dotsec/plugin-${pluginName}`;\n\t\t\t}\n\t\t});\n\t});\n\n\t// configure encryption command\n\tconst cliPluginEncryptHandlers: DotsecCliPluginEncryptHandler[] = [];\n\tconst cliPluginDecryptHandlers: DotsecCliPluginDecryptHandler[] = [];\n\tconst cliPluginPushHandlers: {\n\t\tpush: DotsecCliPluginPushHandler;\n\t\tdecrypt: DotsecCliPluginDecryptHandler;\n\t}[] = [];\n\n\tfor (const pluginName of Object.keys(pluginModules)) {\n\t\tconst pluginModule = pluginModules[pluginName];\n\t\tconst initDotsecPlugin = await loadDotsecPlugin({ name: pluginModule });\n\t\tconst { addCliCommand, cliHandlers: cli } = await initDotsecPlugin({\n\t\t\tajv,\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tconfigFile,\n\t\t});\n\n\t\tif (cli?.encrypt) {\n\t\t\tcliPluginEncryptHandlers.push(cli.encrypt);\n\t\t}\n\t\tif (cli?.decrypt) {\n\t\t\tcliPluginDecryptHandlers.push(cli.decrypt);\n\t\t\tif (cli?.push) {\n\t\t\t\tcliPluginPushHandlers.push({ push: cli.push, decrypt: cli.decrypt });\n\t\t\t}\n\t\t}\n\n\t\tif (addCliCommand) {\n\t\t\taddCliCommand({ program });\n\t\t}\n\t}\n\tif (cliPluginEncryptHandlers.length) {\n\t\tawait addEncryptProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tencryptHandlers: cliPluginEncryptHandlers,\n\t\t});\n\t}\n\tif (cliPluginDecryptHandlers.length) {\n\t\tawait addDecryptProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\tdecryptHandlers: cliPluginDecryptHandlers,\n\t\t});\n\t}\n\tif (cliPluginPushHandlers.length) {\n\t\tawait addPushProgram(program, {\n\t\t\tdotsecConfig: dotsecConfig,\n\t\t\thandlers: cliPluginPushHandlers,\n\t\t});\n\t}\n\n\t// add other commands\n\tawait addInitCommand(program, { dotsecConfig: dotsecConfig });\n\tawait addRunCommand(program, {\n\t\tdotsecConfig: dotsecConfig,\n\t\tdecryptHandlers: cliPluginDecryptHandlers,\n\t});\n\tawait program.parse();\n})();\n","import { DotsecConfig } from \"./types/config\";\n\nexport const DOTSEC_DEFAULT_CONFIG_FILE = \"dotsec.config.ts\";\nexport const DOTSEC_CONFIG_FILES = [DOTSEC_DEFAULT_CONFIG_FILE];\nexport const DOTSEC_DEFAULT_DOTSEC_FILENAME = \".sec\";\nexport const DOTSEC_DEFAULT_DOTENV_FILENAME = \".env\";\nexport const defaultConfig: DotsecConfig = {\n\tdefaults: {\n\t\t// encryptionEngine: \"pke\",\n\t\t// plugins: {\n\t\t// \tpke: {},\n\t\t// },\n\t\toptions: {\n\t\t\tshowRedacted: false,\n\t\t},\n\t},\n};\n","import fs from \"fs\";\nimport path from \"node:path\";\n\n/**\n * Parse JSONC\n * @date 12/7/2022 - 12:48:45 PM\n *\n * @export\n * @param {string} data\n * @returns {*}\n */\nexport function jsoncParse(data: string) {\n\ttry {\n\t\treturn new Function(`return ${data.trim()}`)();\n\t} catch {\n\t\t// Silently ignore any error\n\t\t// That's what tsc/jsonc-parser did after all\n\t\treturn {};\n\t}\n}\n\n/**\n * Load JSON\n * @date 12/7/2022 - 12:48:57 PM\n *\n * @async\n * @param {string} filepath\n * @returns {unknown}\n */\nexport const loadJson = async (filepath: string) => {\n\ttry {\n\t\treturn jsoncParse(await fs.promises.readFile(filepath, \"utf8\"));\n\t} catch (error) {\n\t\tif (error instanceof Error) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to parse ${path.relative(process.cwd(), filepath)}: ${\n\t\t\t\t\terror.message\n\t\t\t\t}`,\n\t\t\t);\n\t\t} else {\n\t\t\tthrow error;\n\t\t}\n\t}\n};\n","import { DOTSEC_CONFIG_FILES, defaultConfig } from \"../constants\";\nimport { DotsecConfig } from \"../types/config\";\nimport { DotsecConfigAndSource } from \"../types/plugin\";\nimport { loadJson } from \"./json\";\nimport { bundleRequire } from \"bundle-require\";\nimport JoyCon from \"joycon\";\nimport path from \"path\";\n\nexport const getMagicalConfig = async (\n\tfilename?: string,\n): Promise<DotsecConfigAndSource> => {\n\tconst cwd = process.cwd();\n\tconst configJoycon = new JoyCon();\n\tconst configPath = await configJoycon.resolve({\n\t\tfiles: filename ? [filename] : [...DOTSEC_CONFIG_FILES, \"package.json\"],\n\t\tcwd,\n\t\tstopDir: path.parse(cwd).root,\n\t\tpackageKey: \"dotsec\",\n\t});\n\tif (filename && configPath === null) {\n\t\tthrow new Error(`Could not find config file ${filename}`);\n\t}\n\tif (configPath) {\n\t\tif (configPath.endsWith(\".json\")) {\n\t\t\tconst rawData = (await loadJson(configPath)) as Partial<DotsecConfig>;\n\n\t\t\tlet data: Partial<DotsecConfig>;\n\n\t\t\tif (\n\t\t\t\tconfigPath.endsWith(\"package.json\") &&\n\t\t\t\t(rawData as { dotsec: Partial<DotsecConfig> }).dotsec !== undefined\n\t\t\t) {\n\t\t\t\tdata = (rawData as { dotsec: Partial<DotsecConfig> }).dotsec;\n\t\t\t} else {\n\t\t\t\tdata = rawData as Partial<DotsecConfig>;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsource: \"json\",\n\t\t\t\tcontents: {\n\t\t\t\t\t...defaultConfig,\n\t\t\t\t\t...data,\n\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t...data?.defaults,\n\t\t\t\t\t\t...defaultConfig.defaults,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t...data?.defaults?.options,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.options,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t...data?.defaults?.plugins,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.plugins,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tpush: {\n\t\t\t\t\t\t...data?.push,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t} else if (configPath.endsWith(\".ts\")) {\n\t\t\tconst bundleRequireResult = await bundleRequire({\n\t\t\t\tfilepath: configPath,\n\t\t\t});\n\t\t\tconst data = (bundleRequireResult.mod.dotsec ||\n\t\t\t\tbundleRequireResult.mod.default ||\n\t\t\t\tbundleRequireResult.mod) as Partial<DotsecConfig>;\n\n\t\t\treturn {\n\t\t\t\tsource: \"ts\",\n\t\t\t\tcontents: {\n\t\t\t\t\t...defaultConfig,\n\t\t\t\t\t...data,\n\t\t\t\t\tdefaults: {\n\t\t\t\t\t\t...data?.defaults,\n\t\t\t\t\t\t...defaultConfig.defaults,\n\t\t\t\t\t\tplugins: {\n\t\t\t\t\t\t\t...data?.defaults?.plugins,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.plugins,\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t...data?.defaults?.options,\n\t\t\t\t\t\t\t...defaultConfig.defaults?.options,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tpush: {\n\t\t\t\t\t\t...data?.push,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\treturn { source: \"defaultConfig\", contents: defaultConfig };\n};\n","import { DotsecPluginModule } from \"../types/plugin\";\n\nexport const loadDotsecPlugin = async (options: {\n\tname: string;\n}): Promise<DotsecPluginModule> => {\n\treturn import(options.name).then((imported) => {\n\t\treturn imported.default;\n\t});\n};\n","import { DotsecCliOption } from \"../types/plugin\";\nimport { Command, Option } from \"commander\";\n\nexport const addPluginOptions = (\n\toptions:\n\t\t| {\n\t\t\t\t[x: string]: DotsecCliOption;\n\t\t }\n\t\t| undefined,\n\tcommand: Command,\n\tmandatory?: boolean,\n) => {\n\tif (options) {\n\t\tObject.values(options).map((option) => {\n\t\t\tlet optionProps:\n\t\t\t\t| {\n\t\t\t\t\t\tflags: string;\n\t\t\t\t\t\tdescription?: string;\n\t\t\t\t\t\tdefaultValue?: string | boolean | string[];\n\t\t\t\t\t\tchoices?: string[];\n\t\t\t\t\t\tfn?: (value: string, previous: unknown) => unknown;\n\t\t\t\t\t\tregexp?: RegExp;\n\t\t\t\t\t\tenv?: string;\n\t\t\t\t }\n\t\t\t\t| undefined;\n\t\t\tif (Array.isArray(option)) {\n\t\t\t\tconst [flags, description, defaultValue] = option;\n\t\t\t\toptionProps = {\n\t\t\t\t\tflags,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconst { flags, description, defaultValue, choices, env, fn } = option;\n\t\t\t\toptionProps = {\n\t\t\t\t\tflags,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdefaultValue,\n\t\t\t\t\tchoices,\n\t\t\t\t\tenv,\n\t\t\t\t\tfn,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optionProps) {\n\t\t\t\tconst newOption = new Option(\n\t\t\t\t\toptionProps.flags,\n\t\t\t\t\toptionProps.description,\n\t\t\t\t);\n\t\t\t\tif (optionProps.fn) {\n\t\t\t\t\tnewOption.argParser(optionProps.fn);\n\t\t\t\t}\n\t\t\t\tif (optionProps.defaultValue) {\n\t\t\t\t\tnewOption.default(optionProps.defaultValue);\n\t\t\t\t}\n\t\t\t\tif (optionProps.env) {\n\t\t\t\t\tnewOption.env(optionProps.env);\n\t\t\t\t}\n\t\t\t\tif (mandatory) {\n\t\t\t\t\tnewOption.makeOptionMandatory(true);\n\t\t\t\t}\n\t\t\t\tif (optionProps.choices) {\n\t\t\t\t\tnewOption.choices(optionProps.choices);\n\t\t\t\t}\n\t\t\t\tcommand.addOption(newOption);\n\t\t\t}\n\t\t});\n\t}\n};\n","import fs, { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport prompts from \"prompts\";\n\nexport const readContentsFromFile = async (\n\tfilePath: string,\n): Promise<string> => {\n\treturn await fs.readFile(filePath, \"utf-8\");\n};\n\nexport const writeContentsToFile = async (\n\tfilePath: string,\n\tcontents: string,\n): Promise<void> => {\n\treturn await fs.writeFile(filePath, contents, \"utf-8\");\n};\n\nexport const fileExists = async (source: string): Promise<boolean> => {\n\ttry {\n\t\tawait stat(source);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport const promptOverwriteIfFileExists = async ({\n\tfilePath,\n\tskip,\n}: {\n\tfilePath: string;\n\tskip?: boolean;\n}) => {\n\tlet overwriteResponse: prompts.Answers<\"overwrite\"> | undefined;\n\n\tif ((await fileExists(filePath)) && skip !== true) {\n\t\toverwriteResponse = await prompts({\n\t\t\ttype: \"confirm\",\n\t\t\tname: \"overwrite\",\n\t\t\tmessage: () => {\n\t\t\t\treturn `Overwrite './${path.relative(process.cwd(), filePath)}' ?`;\n\t\t\t},\n\t\t});\n\t} else {\n\t\toverwriteResponse = undefined;\n\t}\n\treturn overwriteResponse;\n};\n","const LINE =\n\t/^(#.*)|(\\s?\\r?\\n)|(?:^|^)\\s*(?:export\\s+)?([\\w.-]*)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?(\\s*)(#.*)?(?:$|$)/gm;\n\nexport type ParseResult = {\n\ttype: \"value\" | \"comment\" | \"whitespace\";\n\tkey?: string;\n\tvalue?: string;\n\traw?: string;\n}[];\n\n// Parser src into an Object\nexport const parse = (src: string) => {\n\tconst obj: Record<string, string> = {};\n\tconst blocks: ParseResult = [];\n\n\t// Convert buffer to string\n\tlet lines = src.toString();\n\n\t// Convert line breaks to same format\n\tlines = lines.replace(/\\r\\n?/gm, \"\\n\");\n\n\tlet match;\n\twhile ((match = LINE.exec(lines)) != null) {\n\t\tconst key = match[3];\n\n\t\tif (match?.[1]?.[0] === \"#\") {\n\t\t\tblocks.push({ type: \"comment\", raw: match[1] });\n\t\t} else if (match?.[2]) {\n\t\t\tblocks.push({ type: \"whitespace\", raw: match[2] });\n\t\t} else {\n\t\t\t// Default undefined or null to empty string\n\t\t\tlet value = match[4] || \"\";\n\n\t\t\t// Remove whitespace\n\t\t\tvalue = value.trim();\n\n\t\t\t// Check if double quoted\n\t\t\tconst maybeQuote = value[0];\n\n\t\t\t// Remove surrounding quotes\n\t\t\tvalue = value.replace(/^(['\"`])([\\s\\S]*)\\1$/gm, \"$2\");\n\n\t\t\t// Expand newlines if double quoted\n\t\t\tif (maybeQuote === '\"') {\n\t\t\t\tvalue = value.replace(/\\\\n/g, \"\\n\");\n\t\t\t\tvalue = value.replace(/\\\\r/g, \"\\r\");\n\t\t\t}\n\n\t\t\tobj[key] = value;\n\n\t\t\t// Add to object\n\t\t\tblocks.push({\n\t\t\t\ttype: \"value\",\n\t\t\t\tkey,\n\t\t\t\tvalue,\n\t\t\t\traw: value + (match[5] ? match[5] : \"\") + (match[6] ? match[6] : \"\"),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { blocks, obj };\n};\n\nif (import.meta.vitest) {\n\tconst { it, expect } = import.meta.vitest;\n\n\tit(\"parse\", () => {\n\t\tconst input1 = \"KEY=value\";\n\t\tconst input2 = 'KEY=\"value\"';\n\t\tconst input3 = \"KEY='value'\";\n\t\tconst input4 = \"KEY=value # this is a comment\";\n\n\t\t// const expectedResult1 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: 'value' },\n\t\t// ];\n\t\t// const expectedResult2 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: '\"value\"' },\n\t\t// ];\n\t\t// const expectedResult3 = [\n\t\t// { type: 'value', key: 'KEY', value: 'value', raw: \"'value'\" },\n\t\t// ];\n\t\t// const expectedResult4 = [\n\t\t// {\n\t\t// type: 'value',\n\t\t// key: 'KEY',\n\t\t// value: 'value',\n\t\t// raw: 'value # this is a comment',\n\t\t// },\n\t\t// ];\n\n\t\texpect(parse(input1)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input2)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input3)).toMatchInlineSnapshot(`\n\t\t\t{\n\t\t\t \"blocks\": [\n\t\t\t {\n\t\t\t \"key\": \"KEY\",\n\t\t\t \"raw\": \"value\",\n\t\t\t \"type\": \"value\",\n\t\t\t \"value\": \"value\",\n\t\t\t },\n\t\t\t ],\n\t\t\t \"obj\": {\n\t\t\t \"KEY\": \"value\",\n\t\t\t },\n\t\t\t}\n\t\t`);\n\t\texpect(parse(input4)).toMatchInlineSnapshot(`\n {\n \"blocks\": [\n {\n \"key\": \"KEY\",\n \"raw\": \"value# this is a comment\",\n \"type\": \"value\",\n \"value\": \"value\",\n },\n ],\n \"obj\": {\n \"KEY\": \"value\",\n },\n }\n `);\n\t});\n}\n","import chalk from \"chalk\";\nimport Table from \"cli-table\";\nexport { Table };\n\nlet _logger: Pick<Console, \"info\" | \"error\" | \"table\">;\nexport const getLogger = () => {\n\tif (!_logger) {\n\t\t_logger = console;\n\t}\n\n\treturn _logger;\n};\nexport const writeLine = (str: string) => {\n\tprocess.stdout.write(str);\n};\nexport const emphasis = (str: string): string => chalk.yellowBright(str);\nexport const strong = (str: string): string => chalk.yellow.bold(str);\n\nexport const clientLogger = {\n\tdebug(content: object) {\n\t\tconsole.log(content);\n\t},\n\tinfo(content: object) {\n\t\tconsole.log(content);\n\t},\n\twarn(content: object) {\n\t\tconsole.log(content);\n\t},\n\terror(content: object) {\n\t\tconsole.error(content);\n\t},\n};\n","import { DotsecConfig } from \"../../types/index\";\nimport { Command, Option } from \"commander\";\n\nimport decryptCommandDefaults from \"./decrypt\";\nimport dotsecCommandDefaults from \"./dotsec\";\nimport encryptCommandDefaults from \"./encrypt\";\nimport initCommandDefaults from \"./init\";\nimport pushCommandDefaults from \"./push\";\nimport runCommandDefaults from \"./run\";\nimport {\n\tCommandOption,\n\tDeepExpandedCommandOption,\n\tDotSecCommandsDefaults,\n\tExpandedCommandOption,\n} from \"./types\";\n\nexport const commandOptions: DotSecCommandsDefaults = {\n\t...dotsecCommandDefaults,\n\t...initCommandDefaults,\n\t...encryptCommandDefaults,\n\t...decryptCommandDefaults,\n\t...runCommandDefaults,\n\t...pushCommandDefaults,\n};\n\nconst expandCommandOption = (\n\tcommandOption: CommandOption | ExpandedCommandOption,\n): DeepExpandedCommandOption => {\n\tif (Array.isArray(commandOption)) {\n\t\tconst [flags, description, defaultValue] = commandOption;\n\t\tconst optionProps = {\n\t\t\tflags,\n\t\t\tdescription,\n\t\t\tdefaultValue,\n\t\t};\n\t\treturn optionProps;\n\t} else {\n\t\tif (\"option\" in commandOption) {\n\t\t\tconst [flags, description, defaultValue] = commandOption.option;\n\t\t\tconst optionProps = {\n\t\t\t\tflags,\n\t\t\t\tdescription,\n\t\t\t\tdefaultValue,\n\t\t\t\tenv: commandOption.env,\n\t\t\t};\n\t\t\treturn optionProps;\n\t\t}\n\t\treturn commandOption;\n\t}\n};\n\nconst createOption = (\n\tcommandOption: CommandOption | ExpandedCommandOption,\n\toptions: {\n\t\trequired?: boolean;\n\t\tdotsecConfig?: DotsecConfig;\n\t\toptionKey: string;\n\t},\n): Option => {\n\tconst defaultOptionValueFromConfig =\n\t\toptions?.dotsecConfig?.defaults?.options?.[options?.optionKey];\n\tconst optionProps = expandCommandOption(commandOption);\n\n\tconst newOption = new Option(optionProps.flags, optionProps.description);\n\tif (optionProps.fn) {\n\t\tnewOption.argParser(optionProps.fn);\n\t}\n\tif (optionProps.defaultValue) {\n\t\tnewOption.default(defaultOptionValueFromConfig || optionProps.defaultValue);\n\t}\n\tif (optionProps.env) {\n\t\tnewOption.env(optionProps.env);\n\t}\n\tif (options.required) {\n\t\tnewOption.makeOptionMandatory(true);\n\t}\n\tif (optionProps.choices) {\n\t\tnewOption.choices(optionProps.choices);\n\t}\n\n\treturn newOption;\n};\n\nexport const setProgramOptions = (params: {\n\tprogram: Command;\n\tcommandName?: string;\n\tdotsecConfig: DotsecConfig;\n}) => {\n\tconst { program, commandName, dotsecConfig } = params;\n\tconst programOptions = commandOptions[commandName || program.name()];\n\n\tif (programOptions) {\n\t\tconst { options, requiredOptions, description, usage, helpText } =\n\t\t\tprogramOptions;\n\t\tif (options) {\n\t\t\tObject.keys(options).forEach((optionKey) => {\n\t\t\t\tconst commandOption = options[optionKey];\n\t\t\t\tconst newOption = createOption(commandOption, {\n\t\t\t\t\tdotsecConfig,\n\t\t\t\t\toptionKey,\n\t\t\t\t});\n\n\t\t\t\tprogram.addOption(newOption);\n\t\t\t});\n\t\t}\n\t\tif (requiredOptions) {\n\t\t\tObject.keys(requiredOptions).forEach((requiredOptionKey) => {\n\t\t\t\tconst requiredOption = requiredOptions[requiredOptionKey];\n\t\t\t\tconst newOption = createOption(requiredOption, {\n\t\t\t\t\trequired: true,\n\t\t\t\t\tdotsecConfig,\n\t\t\t\t\toptionKey: requiredOptionKey,\n\t\t\t\t});\n\n\t\t\t\tprogram.addOption(newOption);\n\t\t\t});\n\t\t}\n\t\tif (description) {\n\t\t\tprogram.description(description);\n\t\t}\n\t\tif (usage) {\n\t\t\tprogram.usage(usage);\n\t\t}\n\t\tif (helpText) {\n\t\t\tprogram.description(helpText);\n\t\t}\n\t}\n};\n","export const backgroundColors = [\n\t\"black\",\n\t\"red\",\n\t\"green\",\n\t\"yellow\",\n\t\"blue\",\n\t\"magenta\",\n\t\"cyan\",\n\t\"white\",\n\t\"black-bright\",\n\t\"gray\",\n\t\"grey\",\n\t\"red-bright\",\n\t\"green-bright\",\n\t\"yellow-bright\",\n\t\"blue-bright\",\n\t\"magenta-bright\",\n\t\"cyan-bright\",\n\t\"white-bright\",\n] as const;\n\nexport type BackgroundColor = typeof backgroundColors[number];\n","import {\n\tDOTSEC_DEFAULT_DOTENV_FILENAME,\n\tDOTSEC_DEFAULT_DOTSEC_FILENAME,\n} from \"../../constants\";\nimport { backgroundColors } from \"../../types/colors\";\nimport { ExpandedCommandOption } from \"./types\";\n\nexport const envFileOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--env-file <envFile>\",\n\t\t`Path to .env file. If not provided, will look for value in 'ENV_FILE' environment variable. If not provided, will look for '${DOTSEC_DEFAULT_DOTENV_FILENAME}' file in current directory.`,\n\t\tDOTSEC_DEFAULT_DOTENV_FILENAME,\n\t],\n\tenv: \"ENV_FILE\",\n};\nexport const secFileOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--sec-file, <secFile>\",\n\t\t`Path to .sec file. If not provided, will look for value in 'SEC_FILE' environment variable. If not provided, will look for '${DOTSEC_DEFAULT_DOTSEC_FILENAME}' file in current directory.`,\n\t\tDOTSEC_DEFAULT_DOTSEC_FILENAME,\n\t],\n\tenv: \"SEC_FILE\",\n};\n\nexport const usingOption: ExpandedCommandOption = {\n\tflags: \"--using <using>\",\n\tdescription: \"Wether to use a dot env file or a dot sec file\",\n\tchoices: [\"env\", \"sec\"],\n\tenv: \"DOTSEC_USING\",\n};\n\nexport const usingNoEncryptionEngineOption: ExpandedCommandOption = {\n\tflags: \"--using <using>\",\n\tdescription: \"Wether to use a dot env file or a dot sec file\",\n\tchoices: [\"env\"],\n\tenv: \"DOTSEC_USING\",\n};\n\nexport const showRedactedOption: ExpandedCommandOption = {\n\tflags: \"--show-redacted\",\n\tdescription: \"Wether to show redacted values\",\n\tenv: \"DOTSEC_SHOW_REDACTED\",\n\tdefaultValue: false,\n};\n\nexport const showOutputPrefixOption: ExpandedCommandOption = {\n\tflags: \"--show-output-prefix\",\n\tdescription: \"Show output prefix\",\n\tenv: \"DOTSEC_SHOW_OUTPUT_PREFIX\",\n};\nexport const outputPrefixOption: ExpandedCommandOption = {\n\tflags: \"--output-prefix <outputPrefix>\",\n\tdescription: \"Output prefix\",\n\tenv: \"DOTSEC_OUTPUT_PREFIX\",\n};\n\nexport const outputBackgroundColorOption: ExpandedCommandOption = {\n\tflags: \"--output-background-color <outputBackgroundColor>\",\n\tdescription: \"Background color of the output.\",\n\tenv: \"DOTSEC_OUTPUT_BACKGROUND_COLOR\",\n\tchoices: backgroundColors as unknown as string[],\n\tdefaultValue: \"red-bright\",\n};\n\nexport const yesOption: ExpandedCommandOption = {\n\toption: [\"--yes\", \"Skip confirmation prompts\"],\n};\n\nexport const verboseOption: ExpandedCommandOption = {\n\toption: [\"--verbose\", \"Verbose output\"],\n};\n\nexport const configFileOption: ExpandedCommandOption = {\n\toption: [\"-c, --config-file, --configFile <configFile>\", \"Config file\"],\n\tenv: \"DOTSEC_CONFIG_FILE\",\n};\n\nexport const pluginOption: ExpandedCommandOption = {\n\toption: [\"--plugin <plugin>\", \"Comma-separated list of plugins to use\"],\n\tenv: \"DOTSEC_PLUGIN\",\n};\n\nexport const engineOption: ExpandedCommandOption = {\n\toption: [\"--engine <engine>\", \"Encryption engine to use\"],\n\tenv: \"DOTSEC_ENGINE\",\n};\n\nexport const createManifestOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--create-manifest\",\n\t\t\"Create a markdown manifest file. See the --manifest-file option for more information.\",\n\t],\n\tenv: \"CREATE_MANIFEST\",\n};\n\nexport const manifestFilePrefixOption: ExpandedCommandOption = {\n\toption: [\n\t\t\"--manifest-file-prefix <manifestFilePrefix>\",\n\t\t\"Mmanifest file prefix\",\n\t],\n\tenv: \"ENCRYPTION_MANIFEST_FILE\",\n};\n","import {\n\tconfigFileOption,\n\tcreateManifestOption,\n\tenvFileOption,\n\tmanifestFilePrefixOption,\n\tsecFileOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst decryptCommandDefaults: DotSecCommandsDefaults = {\n\tdecrypt: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tcreateManifest: createManifestOption,\n\t\t\tmanifestFilePrefix: manifestFilePrefixOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription: \"Decrypt a sec file\",\n\t\thelpText: `Examples:\n\n\nDecrypt .sec file to .env file\n\n$ npx dotsec decrypt\n\n\nSpecify a different .sec file\n\n$ npx dotsec decrypt --sec-file .sec.dev\n$ SEC_FILE=.sec.dev npx dotsec decrypt\n\nSpecify a different .env file\n\n$ npx dotsec decrypt --env-file .env.dev\n$ ENV_FILE=.env.dev npx dotsec decrypt\n\nWrite a manifest markdown file\n\n$ npx dotsec decrypt --create-manifest\n$ CREATE_MANIFEST=true npx dotsec decrypt\n\nSpecify a different manifest file\n\n$ npx dotsec decrypt --manifest-file .manifest.dev\n$ MANIFEST_FILE=decryption-manifest.md npx dotsec decrypt\n`,\n\t},\n};\n\nexport default decryptCommandDefaults;\n","import { configFileOption, pluginOption } from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst dotsecCommandDefaults: DotSecCommandsDefaults = {\n\tdotsec: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tplugin: pluginOption,\n\t\t},\n\t},\n};\n\nexport default dotsecCommandDefaults;\n","import {\n\tconfigFileOption,\n\tcreateManifestOption,\n\tenvFileOption,\n\tmanifestFilePrefixOption,\n\tsecFileOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst encryptCommandDefaults: DotSecCommandsDefaults = {\n\tencrypt: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tcreateManifest: createManifestOption,\n\t\t\tmanifestFile: manifestFilePrefixOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription: \"Encrypt an env file\",\n\t\thelpText: `Examples:\n\n\nEncrypt .env file to .sec file\n\n$ npx dotsec encrypt\n\n\nSpecify a different .env file\n\n$ npx dotsec encrypt --env-file .env.dev\n$ ENV_FILE=.env.dev npx dotsec encrypt\n\n\nSpecify a different .sec file\n\n$ npx dotsec encrypt --sec-file .sec.dev\n$ SEC_FILE=.sec.dev npx dotsec encrypt\n\n\nWrite a manifest markdown file\n\n$ npx dotsec encrypt --create-manifest\n$ CREATE_MANIFEST=true npx dotsec encrypt\n\n\nSpecify a different manifest file\n\n$ npx dotsec encrypt --manifest-file manifest.dev\n$ MANIFEST_FILE=encryption-manifest.md npx dotsec encrypt\n`,\n\t},\n};\n\nexport default encryptCommandDefaults;\n","import { configFileOption, yesOption } from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst initCommandDefaults: DotSecCommandsDefaults = {\n\tinit: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\tdescription:\n\t\t\t\"Initialize a dotsec project by creating a dotsec.config.ts file.\",\n\t\thelpText: `Examples:\n\nCreate a dotsec.config.ts file in the current directory\n\n$ npx dotsec init\n\n\nOverwrite an existing dotsec.config.ts file in the current directory\n\n$ npx dotsec init --yes\n\n\nCreate a dotsec config file in the current directory with a specific config file name\n\nBy specifying the --config-file option, you can create a dotsec config file with a specific name.\n\n$ npx dotsec init --config-file dotsec.config.ts\n\n$ DOTSEC_CONFIG_FILE=my.config.ts npx dotsec init\n`,\n\t},\n};\n\nexport default initCommandDefaults;\n","import {\n\tconfigFileOption,\n\tenvFileOption,\n\tsecFileOption,\n\tusingOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n\nconst pushCommandDefaults: DotSecCommandsDefaults = {\n\tpush: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tyes: yesOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingOption,\n\t\t},\n\t\tdescription: \"Push variables from env or sec file to a remote\",\n\t\thelpText: `Examples:\n\nPush variables from .env file to remote\n\n$ npx dotsec push --using env\n$ DOTSEC_USING=env npx dotsec push\n\n\nPush variables from .sec file to remote\n\n$ npx dotsec push --using sec\n$ DOTSEC_USING=sec npx dotsec push\n`,\n\t},\n};\n\nexport default pushCommandDefaults;\n","import {\n\tconfigFileOption,\n\tengineOption,\n\tenvFileOption,\n\toutputBackgroundColorOption,\n\toutputPrefixOption,\n\tsecFileOption,\n\tshowOutputPrefixOption,\n\tshowRedactedOption,\n\tusingNoEncryptionEngineOption,\n\tusingOption,\n\tyesOption,\n} from \"./sharedOptions\";\nimport { DotSecCommandsDefaults } from \"./types\";\n/*\n\nrun --env-file=.env --sec-file=.sec --with=env-file\n\n*/\nconst runCommandDefaults: DotSecCommandsDefaults = {\n\trunEnvOnly: {\n\t\tusage: \"--using env [commandArgs...]\",\n\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tyes: yesOption,\n\t\t\tengine: engineOption,\n\t\t\tshowRedacted: showRedactedOption,\n\t\t\toutputBackgroundColor: outputBackgroundColorOption,\n\t\t\tshowOutputPrefix: showOutputPrefixOption,\n\t\t\toutputPrefix: outputPrefixOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingNoEncryptionEngineOption,\n\t\t},\n\n\t\tdescription:\n\t\t\t\"Run a command in a separate process and populate env with contents of a dotenv file.\",\n\t\thelpText: `Examples:\n\t\t\nRun a command with a .env file\n\t\t\n$ npx dotsec run --using env node -e \\\"console.log(process.env)\\\"\n\n\nRun a command with a specific .env file\n\n$ npx dotsec run --using env --env-file .env node -e \\\"console.log(process.env)\\\"\n\n\nRun a command with a specific ENV_FILE variable\n\n$ ENV_FILE=.env.dev npx dotsec run --using env node -e \\\"console.log(process.env)\\\"\n\n\nYou can also specify 'using' as an environment variable\n\n$ DOTSEC_USING=env npx dotsec run node -e \\\"console.log(process.env)\\\"\n\t\t`,\n\t},\n\trun: {\n\t\toptions: {\n\t\t\tconfigFile: configFileOption,\n\t\t\tenvFile: envFileOption,\n\t\t\tsecFile: secFileOption,\n\t\t\tyes: yesOption,\n\t\t\tshowRedacted: showRedactedOption,\n\t\t\toutputBackgroundColor: outputBackgroundColorOption,\n\t\t\thideOutputPrefix: showOutputPrefixOption,\n\t\t\toutputPrefix: outputPrefixOption,\n\t\t},\n\t\trequiredOptions: {\n\t\t\tusing: usingOption,\n\t\t},\n\n\t\tusage: \"[--using env] [--using sec] [commandArgs...]\",\n\t\tdescription: `Run a command in a separate process and populate env with either \n\t\t\t- contents of a dotenv file\n\t\t\t- decrypted values of a dotsec file.\n\nThe --withEnv option will take precedence over the --withSec option. If neither are specified, the --withEnv option will be used by default.`,\n\t\thelpText: `${\"Examples:\"}\n\n${\"Run a command with a .env file\"}\n\n$ dotsec run echo \"hello world\"\n\n\n${\"Run a command with a specific .env file\"}\n\n$ dotsec run --with-env --env-file .env.dev echo \"hello world\"\n\n\n${\"Run a command with a .sec file\"}\n\n$ dotsec run --with-sec echo \"hello world\"\n\n\n${\"Run a command with a specific .sec file\"}\n\n$ dotsec run --with-sec --sec-file .sec.dev echo \"hello world\"\n`,\n\t},\n\t// push: {\n\t// \toptions: {\n\t// \t\t...dotsecCommandDefaults.dotsec.options,\n\t// \t\twithEnv: withEnvOption,\n\t// \t\twithSec: withSecOption,\n\t// \t\tenvFile: envFileOption,\n\t// \t\tsecFile: secFileOption,\n\t// \t\tyes: yesOption,\n\t// \t},\n\t// \trequiredOptions: {\n\t// \t\t...dotsecCommandDefaults.dotsec.requiredOptions,\n\t// \t},\n\t// },\n};\n\nexport default runCommandDefaults;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { parse } from \"../../lib/parse\";\nimport { DecryptCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginDecryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { Command } from \"commander\";\n\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n} & Record<string, unknown>;\n\nconst addEncryptProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\tdecryptHandlers: DotsecCliPluginDecryptHandler[];\n\t},\n) => {\n\tconst { dotsecConfig, decryptHandlers } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"decrypt\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tcreateManifest,\n\t\t\t\t\tmanifestFile,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<DecryptCommandOptions>();\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\tconst pluginCliDecrypt = (decryptHandlers || []).find((handler) => {\n\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t});\n\n\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${options.decryptHandlers\n\t\t\t\t\t\t\t.map((e) => `--${e.triggerOptionValue}`)\n\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconsole.log(\n\t\t\t\t\t\"Decrypting with\",\n\t\t\t\t\tstrong(\n\t\t\t\t\t\tpluginCliDecrypt.encryptionEngineName ||\n\t\t\t\t\t\t\tpluginCliDecrypt.triggerOptionValue,\n\t\t\t\t\t),\n\t\t\t\t\t\"engine\",\n\t\t\t\t);\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliDecrypt.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliDecrypt.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\t// get current dot env file\n\t\t\t\tconst dotsecString = await readContentsFromFile(secFile);\n\n\t\t\t\tconst plaintext = await pluginCliDecrypt.handler({\n\t\t\t\t\tciphertext: dotsecString,\n\t\t\t\t\t...allOptionsValues,\n\t\t\t\t});\n\n\t\t\t\tconst dotenvOverwriteResponse = await promptOverwriteIfFileExists({\n\t\t\t\t\tfilePath: envFile,\n\t\t\t\t\tskip: yes,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tdotenvOverwriteResponse === undefined ||\n\t\t\t\t\tdotenvOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(envFile, plaintext);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote plaintext contents of ${strong(secFile)} file to ${strong(\n\t\t\t\t\t\t\tenvFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (createManifest || dotsecConfig?.defaults?.options?.createManifest) {\n\t\t\t\t\t// parse raw env contents into key value pairs using the dotenv package\n\t\t\t\t\tconst dotenvVars = parse(plaintext).obj;\n\t\t\t\t\t// expand env vars\n\t\t\t\t\tconst markdownManifest = `# Dotsec decryption manifest\n\n## Overview\n\n- plaintext source: ${envFile}\n- ciphertext target: ${secFile}\n- created: ${new Date().toUTCString()}\n- Decryption engine: ${\n\t\t\t\t\t\tpluginCliDecrypt.encryptionEngineName ||\n\t\t\t\t\t\tpluginCliDecrypt.triggerOptionValue\n\t\t\t\t\t}\n- Decryption engine options: ${JSON.stringify(allOptionsValues)}\n\n## Variables\n\n| Key |\n| --- |\n${Object.keys(dotenvVars)\n\t.map((key) => {\n\t\treturn `| \\`${key} \\`| `;\n\t})\n\t.join(\"\\n\")}\n`;\n\n\t\t\t\t\t// write manifest file, don't prompt to overwrite\n\t\t\t\t\tconst manifestTargetFile =\n\t\t\t\t\t\tmanifestFile || `${envFile}.decryption-manifest.md`;\n\t\t\t\t\tawait writeContentsToFile(manifestTargetFile, markdownManifest);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote manifest of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\tmanifestTargetFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\tcommand.help();\n\t\t\t}\n\t\t});\n\n\toptions.decryptHandlers.map((decryption) => {\n\t\tconst { options, requiredOptions } = decryption;\n\t\taddPluginOptions(options, subProgram);\n\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t});\n\n\tconst engines = options.decryptHandlers.map((e) => e.triggerOptionValue);\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"} to use: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\n\treturn subProgram;\n};\n\nexport default addEncryptProgram;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { parse } from \"../../lib/parse\";\nimport { EncryptCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginEncryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { Command } from \"commander\";\n\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n} & Record<string, unknown>;\n\nconst addEncryptProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tencryptHandlers: DotsecCliPluginEncryptHandler[];\n\t\tdotsecConfig: DotsecConfig;\n\t},\n) => {\n\tconst { encryptHandlers, dotsecConfig } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"encrypt\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tcreateManifest,\n\t\t\t\t\tmanifestFile,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<EncryptCommandOptions>();\n\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\t\t\t\tconst pluginCliEncrypt = (encryptHandlers || []).find((handler) => {\n\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t});\n\n\t\t\t\tif (!pluginCliEncrypt) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`No encryption plugin found, available encryption engine(s): ${options.encryptHandlers\n\t\t\t\t\t\t\t.map((e) => e.triggerOptionValue)\n\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliEncrypt.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliEncrypt.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tconst dotenvString = await readContentsFromFile(envFile);\n\t\t\t\tlet dotsecString: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tdotsecString = await readContentsFromFile(secFile);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t\tconst cipherText = await pluginCliEncrypt.handler({\n\t\t\t\t\tplaintext: dotenvString,\n\t\t\t\t\tciphertext: dotsecString,\n\t\t\t\t\t...allOptionsValues,\n\t\t\t\t});\n\n\t\t\t\tconst dotsecOverwriteResponse = await promptOverwriteIfFileExists({\n\t\t\t\t\tfilePath: secFile,\n\t\t\t\t\tskip: yes,\n\t\t\t\t});\n\t\t\t\tif (\n\t\t\t\t\tdotsecOverwriteResponse === undefined ||\n\t\t\t\t\tdotsecOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(secFile, cipherText);\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`Wrote encrypted contents of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\tsecFile,\n\t\t\t\t\t\t)}`,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tcreateManifest ||\n\t\t\t\t\t\tdotsecConfig?.defaults?.options?.createManifest\n\t\t\t\t\t) {\n\t\t\t\t\t\t// parse raw env contents into key value pairs using the dotenv package\n\t\t\t\t\t\tconst dotenvVars = parse(dotenvString).obj;\n\t\t\t\t\t\t// expand env vars\n\t\t\t\t\t\tconst markdownManifest = `# Dotsec encryption manifest \n\n## Overview\n\n- plaintext source: ${envFile}\n- ciphertext target: ${secFile}\n- created: ${new Date().toUTCString()}\n- encryption engine: ${\n\t\t\t\t\t\t\tpluginCliEncrypt.encryptionEngineName ||\n\t\t\t\t\t\t\tpluginCliEncrypt.triggerOptionValue\n\t\t\t\t\t\t}\n- encryption engine options: ${JSON.stringify(allOptionsValues)}\n\n## Variables\n\n| Key | \n| --- | \n${Object.keys(dotenvVars)\n\t.map((key) => {\n\t\treturn `| \\`${key} \\`| `;\n\t})\n\t.join(\"\\n\")}\n`;\n\n\t\t\t\t\t\t// write manifest file, don't prompt to overwrite\n\t\t\t\t\t\tconst manifestTargetFile =\n\t\t\t\t\t\t\tmanifestFile || `${secFile}.encryption-manifest.md`;\n\t\t\t\t\t\tawait writeContentsToFile(manifestTargetFile, markdownManifest);\n\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t`Wrote manifest of ${strong(envFile)} file to ${strong(\n\t\t\t\t\t\t\t\tmanifestTargetFile,\n\t\t\t\t\t\t\t)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\tcommand.help();\n\t\t\t}\n\t\t});\n\n\toptions.encryptHandlers.map((encryptionHandler) => {\n\t\tconst { options, requiredOptions } = encryptionHandler;\n\t\taddPluginOptions(options, subProgram);\n\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t});\n\tconst engines = options.encryptHandlers.map((e) => e.triggerOptionValue);\n\tconst encryptionEngineNames = options.encryptHandlers.map(\n\t\t(e) => e.encryptionEngineName,\n\t);\n\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"}: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\tsubProgram.description(\n\t\t`Encrypt .env file using ${encryptionEngineNames.join(\", \")}`,\n\t);\n\treturn subProgram;\n};\n\nexport default addEncryptProgram;\n","import {\n\tpromptOverwriteIfFileExists,\n\treadContentsFromFile,\n\twriteContentsToFile,\n} from \"../../lib/io\";\nimport { DotsecConfig, InitCommandOptions } from \"../../types\";\nimport { Command } from \"commander\";\n\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport path from \"node:path\";\ntype Formats = {\n\tenv?: string;\n\tawsKeyAlias?: string;\n};\n\nconst addInitProgram = async (\n\tprogram: Command,\n\toptions: { dotsecConfig: DotsecConfig },\n) => {\n\tconst { dotsecConfig } = options;\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"init\")\n\t\t.action(async (_options: Formats, command: Command) => {\n\t\t\tconst { configFile = \"dotsec.config.ts\", yes } =\n\t\t\t\tcommand.optsWithGlobals<InitCommandOptions>();\n\t\t\ttry {\n\t\t\t\tconst configTemplate = await readContentsFromFile(\n\t\t\t\t\tpath.resolve(__dirname, \"../../src/templates/dotsec.config.ts\"),\n\t\t\t\t);\n\n\t\t\t\tconst dotsecConfigOverwriteResponse = await promptOverwriteIfFileExists(\n\t\t\t\t\t{\n\t\t\t\t\t\tfilePath: configFile,\n\t\t\t\t\t\tskip: yes,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\tdotsecConfigOverwriteResponse === undefined ||\n\t\t\t\t\tdotsecConfigOverwriteResponse.overwrite === true\n\t\t\t\t) {\n\t\t\t\t\tawait writeContentsToFile(configFile, configTemplate);\n\t\t\t\t\tconsole.log(`Wrote config file to ${strong(configFile)}`);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tcommand.error(e);\n\t\t\t}\n\t\t});\n\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\n\treturn subProgram;\n};\n\nexport default addInitProgram;\n","import { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport { parse } from \"../../lib/parse\";\nimport { PushCommandOptions } from \"../../types\";\nimport { DotsecConfig } from \"../../types/config\";\nimport {\n\tDotsecCliOption,\n\tDotsecCliPluginDecryptHandler,\n\tDotsecCliPluginPushHandler,\n} from \"../../types/plugin\";\nimport { setProgramOptions } from \"../options/index\";\nimport { Command } from \"commander\";\nimport { expand } from \"dotenv-expand\";\nimport fs from \"node:fs\";\n\n/**\n * Decrypts, and pushes the contents of a .env file to AWS SSM, AWS Secrets Manager or GitHub Actions Secrets\n * @date 12/7/2022 - 9:16:48 AM\n *\n * @async\n * @param {Command} program\n * @returns {unknown}\n */\nconst addPushProgram = async (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\thandlers: {\n\t\t\tpush: DotsecCliPluginPushHandler;\n\t\t\tdecrypt: DotsecCliPluginDecryptHandler;\n\t\t}[];\n\t},\n) => {\n\tconst { dotsecConfig, handlers } = options;\n\n\tconst subProgram = program\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.command(\"push\")\n\t\t.action(async (_options: Record<string, string>, command: Command) => {\n\t\t\ttry {\n\t\t\t\tconst {\n\t\t\t\t\t// verbose,\n\t\t\t\t\tusing,\n\t\t\t\t\tenvFile,\n\t\t\t\t\tsecFile,\n\t\t\t\t\tengine,\n\t\t\t\t\tyes,\n\t\t\t\t} = command.optsWithGlobals<PushCommandOptions>();\n\n\t\t\t\tconst encryptionEngine =\n\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\tconst pluginCliDecrypt = (handlers || []).find((handler) => {\n\t\t\t\t\treturn handler.decrypt?.triggerOptionValue === encryptionEngine;\n\t\t\t\t})?.decrypt;\n\n\t\t\t\tconst pluginCliPush = (handlers || []).find((handler) => {\n\t\t\t\t\treturn handler.push?.triggerOptionValue === encryptionEngine;\n\t\t\t\t})?.push;\n\n\t\t\t\tif (!pluginCliPush) {\n\t\t\t\t\tthrow new Error(\"No push plugin found!\");\n\t\t\t\t}\n\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t...Object.keys(pluginCliDecrypt?.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliDecrypt?.requiredOptions || {}),\n\t\t\t\t\t...Object.keys(pluginCliPush?.options || {}),\n\t\t\t\t\t...Object.keys(pluginCliPush?.requiredOptions || {}),\n\t\t\t\t];\n\n\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\tlet envContents: string | undefined;\n\n\t\t\t\tif (using === \"env\") {\n\t\t\t\t\tif (!envFile) {\n\t\t\t\t\t\tthrow new Error(\"No dotenv file specified in --env-file option\");\n\t\t\t\t\t}\n\t\t\t\t\tenvContents = fs.readFileSync(envFile, \"utf8\");\n\t\t\t\t} else {\n\t\t\t\t\tif (!secFile) {\n\t\t\t\t\t\tthrow new Error(\"No dotsec file specified in --sec-file option\");\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${handlers\n\t\t\t\t\t\t\t\t.map((e) => `--${e.decrypt?.triggerOptionValue}`)\n\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dotSecContents = fs.readFileSync(secFile, \"utf8\");\n\t\t\t\t\tenvContents = await pluginCliDecrypt.handler({\n\t\t\t\t\t\tciphertext: dotSecContents,\n\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (envContents) {\n\t\t\t\t\t// convert to object\n\t\t\t\t\tconst dotenvVars = parse(envContents).obj;\n\t\t\t\t\t// expand env vars\n\t\t\t\t\tconst expandedEnvVars = expand({\n\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t...(process.env as Record<string, string>),\n\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tif (expandedEnvVars.parsed) {\n\t\t\t\t\t\tawait pluginCliPush.handler({\n\t\t\t\t\t\t\tpush: expandedEnvVars.parsed,\n\t\t\t\t\t\t\tyes,\n\t\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\"No .env or .sec file provided\");\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t});\n\n\tsetProgramOptions({ program: subProgram, dotsecConfig });\n\tconst engines = options.handlers.map(\n\t\t({ decrypt }) => decrypt.triggerOptionValue,\n\t);\n\tsubProgram.option(\n\t\t\"--engine <engine>\",\n\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"} to use: ${\n\t\t\tengines.length === 1 ? engines[0] : engines.join(\", \")\n\t\t}`,\n\t\tengines.length === 1 ? engines[0] : undefined,\n\t);\n\tconst allOptions: {\n\t\t[x: string]: DotsecCliOption & { required?: boolean };\n\t} = {};\n\toptions.handlers.forEach((handlers) => {\n\t\tObject.keys(handlers).map((handlerName) => {\n\t\t\tconst { options: cliOptions, requiredOptions } = handlers[handlerName];\n\t\t\tObject.keys(cliOptions || {}).forEach((key) => {\n\t\t\t\tallOptions[key] = Array.isArray(cliOptions[key])\n\t\t\t\t\t? cliOptions[key]\n\t\t\t\t\t: { ...allOptions[key], ...cliOptions[key] };\n\t\t\t});\n\t\t\tObject.keys(requiredOptions || {}).forEach((key) => {\n\t\t\t\tallOptions[key] = Array.isArray(requiredOptions[key])\n\t\t\t\t\t? requiredOptions[key]\n\t\t\t\t\t: {\n\t\t\t\t\t\t\t...allOptions[key],\n\t\t\t\t\t\t\t...requiredOptions[key],\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t };\n\t\t\t});\n\t\t});\n\t});\n\n\tconst usage: string[] = [];\n\tconst descriptions: string[] = [];\n\n\thandlers.forEach((handler) => {\n\t\tif (handler.push?.description) {\n\t\t\tdescriptions.push(handler.push.description);\n\t\t}\n\n\t\tif (handler.push?.usage) {\n\t\t\tusage.push(handler.push.usage);\n\t\t}\n\t});\n\n\tif (descriptions.length > 0) {\n\t\tsubProgram.description(descriptions.join(\"\\n\"));\n\t}\n\n\tif (usage.length > 0) {\n\t\tsubProgram.usage(usage.join(\"\\n\"));\n\t}\n\n\taddPluginOptions(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(allOptions).filter(\n\t\t\t\t([_key, value]) => value.required !== true,\n\t\t\t),\n\t\t),\n\t\tsubProgram,\n\t);\n\taddPluginOptions(\n\t\tObject.fromEntries(\n\t\t\tObject.entries(allOptions).filter(\n\t\t\t\t([_key, value]) => value.required === true,\n\t\t\t),\n\t\t),\n\t\tsubProgram,\n\t\ttrue,\n\t);\n\n\treturn subProgram;\n};\n\nexport default addPushProgram;\n","import fs from \"node:fs\";\n\nimport { addPluginOptions } from \"../../lib/addPluginOptions\";\nimport { parse } from \"../../lib/parse\";\nimport { RunCommandOptions } from \"../../types\";\nimport { BackgroundColor, backgroundColors } from \"../../types/colors\";\nimport { DotsecConfig } from \"../../types/config\";\nimport { DotsecCliPluginDecryptHandler } from \"../../types/plugin\";\nimport { strong } from \"../../utils/logging\";\nimport { setProgramOptions } from \"../options\";\nimport { camelCase } from \"camel-case\";\nimport chalk from \"chalk\";\n\nimport { dotsec } from \"_dotsec.config\";\nimport { Command } from \"commander\";\nimport { expand } from \"dotenv-expand\";\nimport { spawn } from \"node:child_process\";\nconst addRunProgam = (\n\tprogram: Command,\n\toptions: {\n\t\tdotsecConfig: DotsecConfig;\n\t\tdecryptHandlers?: DotsecCliPluginDecryptHandler[];\n\t},\n) => {\n\tconst { dotsecConfig, decryptHandlers } = options || {};\n\t// create api here\n\n\t// is there an encryption engine?\n\tconst hasDecryptEngine =\n\t\tdecryptHandlers !== undefined && decryptHandlers.length > 0;\n\n\tconst subProgram = program\n\t\t.command(\"run <command...>\")\n\t\t.allowUnknownOption(true)\n\t\t.enablePositionalOptions()\n\t\t.passThroughOptions()\n\t\t.showHelpAfterError(true)\n\t\t.action(\n\t\t\tasync (\n\t\t\t\tcommands: string[],\n\t\t\t\t_options: Record<string, string>,\n\t\t\t\tcommand: Command,\n\t\t\t) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tenvFile,\n\t\t\t\t\t\tusing,\n\t\t\t\t\t\tsecFile,\n\t\t\t\t\t\tengine,\n\t\t\t\t\t\tshowRedacted,\n\t\t\t\t\t\toutputBackgroundColor,\n\t\t\t\t\t\tshowOutputPrefix,\n\t\t\t\t\t\toutputPrefix,\n\t\t\t\t\t} = command.optsWithGlobals<RunCommandOptions>();\n\n\t\t\t\t\tlet envContents: string | undefined;\n\n\t\t\t\t\tif (using === \"env\" || hasDecryptEngine === false) {\n\t\t\t\t\t\tif (!envFile) {\n\t\t\t\t\t\t\tthrow new Error(\"No dotenv file specified in --env-file option\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenvContents = fs.readFileSync(envFile, \"utf8\");\n\t\t\t\t\t} else if (using === \"sec\") {\n\t\t\t\t\t\tif (!secFile) {\n\t\t\t\t\t\t\tthrow new Error(\"No dotsec file specified in --sec-file option\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst encryptionEngine =\n\t\t\t\t\t\t\tengine || dotsecConfig?.defaults?.encryptionEngine;\n\n\t\t\t\t\t\tconst pluginCliDecrypt = (decryptHandlers || []).find((handler) => {\n\t\t\t\t\t\t\treturn handler.triggerOptionValue === encryptionEngine;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!pluginCliDecrypt) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`No decryption plugin found, available decryption engine(s): ${(\n\t\t\t\t\t\t\t\t\tdecryptHandlers || []\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.map((e) => `--${e.triggerOptionValue}`)\n\t\t\t\t\t\t\t\t\t.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst allOptionKeys = [\n\t\t\t\t\t\t\t...Object.keys(pluginCliDecrypt.options || {}),\n\t\t\t\t\t\t\t...Object.keys(pluginCliDecrypt.requiredOptions || {}),\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tconst allOptionsValues = Object.fromEntries(\n\t\t\t\t\t\t\tallOptionKeys.map((key) => {\n\t\t\t\t\t\t\t\treturn [key, _options[key]];\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst dotSecContents = fs.readFileSync(secFile, \"utf8\");\n\t\t\t\t\t\t\tenvContents = await pluginCliDecrypt.handler({\n\t\t\t\t\t\t\t\tciphertext: dotSecContents,\n\t\t\t\t\t\t\t\t...allOptionsValues,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error(\"Something bad happened while decrypting.\");\n\t\t\t\t\t\t\tconsole.error(`File: ${secFile}`);\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (envContents) {\n\t\t\t\t\t\tconst dotenvVars = parse(envContents).obj;\n\t\t\t\t\t\t// expand env vars\n\t\t\t\t\t\tconst expandedEnvVars = expand({\n\t\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t\t...(process.env as Record<string, string>),\n\t\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst [userCommand, ...userCommandArgs] = commands;\n\t\t\t\t\t\tconst waiter: number | undefined = await new Promise((resolve) => {\n\t\t\t\t\t\t\tconst cprocess = spawn(userCommand, [...userCommandArgs], {\n\t\t\t\t\t\t\t\tstdio: \"pipe\",\n\t\t\t\t\t\t\t\tshell: false,\n\t\t\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t\t\t...expandedEnvVars.parsed,\n\t\t\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t\t\t__DOTSEC_ENV__: JSON.stringify(Object.keys(dotenvVars)),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst expandedEnvVarsWithoutEnv = expand({\n\t\t\t\t\t\t\t\tignoreProcessEnv: true,\n\t\t\t\t\t\t\t\tparsed: {\n\t\t\t\t\t\t\t\t\t// add standard env variables\n\t\t\t\t\t\t\t\t\t// add custom env variables, either from .env or .sec, (or empty object if none)\n\t\t\t\t\t\t\t\t\t...dotenvVars,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.stdout.setEncoding(\"utf8\");\n\n\t\t\t\t\t\t\tlet backgroundColor =\n\t\t\t\t\t\t\t\toutputBackgroundColor ||\n\t\t\t\t\t\t\t\tdotsecConfig.defaults?.options?.outputBackgroundColor;\n\t\t\t\t\t\t\tif (backgroundColor === true) {\n\t\t\t\t\t\t\t\tbackgroundColor = \"red-bright\";\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// hideOutputBackgroundColor;\n\t\t\t\t\t\t\tlet addBackgroundColor: chalk.Chalk | ((str: string) => string) =\n\t\t\t\t\t\t\t\t(str: string) => str;\n\t\t\t\t\t\t\tif (backgroundColor) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t!backgroundColors.includes(backgroundColor as BackgroundColor)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// throw error\n\t\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t\t`Invalid background color: ${backgroundColor}`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst backgroundColorFnName = camelCase(\n\t\t\t\t\t\t\t\t\t`bg-${backgroundColor}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (chalk[backgroundColorFnName]) {\n\t\t\t\t\t\t\t\t\taddBackgroundColor = chalk[\n\t\t\t\t\t\t\t\t\t\tbackgroundColorFnName\n\t\t\t\t\t\t\t\t\t] as chalk.Chalk;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t\t\t\t`Invalid background color: ${backgroundColorFnName}, using default: red`,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\taddBackgroundColor = chalk.bgRedBright;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst prefix =\n\t\t\t\t\t\t\t\tshowOutputPrefix ||\n\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.showOutputPrefix\n\t\t\t\t\t\t\t\t\t? `${\n\t\t\t\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.outputPrefix ||\n\t\t\t\t\t\t\t\t\t\t\toutputPrefix ||\n\t\t\t\t\t\t\t\t\t\t\t\"(dotsec) \"\n\t\t\t\t\t\t\t\t\t }`\n\t\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tcprocess.stdout.on(\"data\", function (data) {\n\t\t\t\t\t\t\t\t//Here is where the output goes\n\t\t\t\t\t\t\t\t// split by new line\n\t\t\t\t\t\t\t\tconst lines = addBackgroundColor(\n\t\t\t\t\t\t\t\t\tdata\n\t\t\t\t\t\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t\t\t\t\t\t.map((line) => `${prefix}${line}`)\n\t\t\t\t\t\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t// redact\n\t\t\t\t\t\t\t\t// iterate over each env var\n\t\t\t\t\t\t\t\t// for each env var, replace the value with a redacted version\n\n\t\t\t\t\t\t\t\tconst redactedLines =\n\t\t\t\t\t\t\t\t\t(showRedacted ||\n\t\t\t\t\t\t\t\t\t\tdotsecConfig?.defaults?.options?.showRedacted) !== true\n\t\t\t\t\t\t\t\t\t\t? Object.entries(expandedEnvVarsWithoutEnv.parsed || {})\n\t\t\t\t\t\t\t\t\t\t\t\t.sort(([, a], [, b]) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (a.length > b.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else if (a.length < b.length) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t\t\t.reduce((acc, [key, value]) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (dotsecConfig?.redaction?.show?.includes(key)) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst redactedValue = value.replace(/./g, \"*\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn acc.replace(value, redactedValue);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}, lines as string)\n\t\t\t\t\t\t\t\t\t\t: lines;\n\n\t\t\t\t\t\t\t\tconsole.log(redactedLines);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.stderr.setEncoding(\"utf8\");\n\t\t\t\t\t\t\tcprocess.stderr.on(\"data\", function (data) {\n\t\t\t\t\t\t\t\tprocess.stderr.write(data.toString());\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tcprocess.on(\"exit\", (code: number) => {\n\t\t\t\t\t\t\t\tresolve(code);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (waiter !== 0) {\n\t\t\t\t\t\t\tprocess.exit(waiter || 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow new Error(\"No .env or .sec file provided\");\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(strong(e.message));\n\t\t\t\t\tcommand.help();\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\tsetProgramOptions({\n\t\tprogram: subProgram,\n\t\tcommandName: hasDecryptEngine ? \"run\" : \"runEnvOnly\",\n\t\tdotsecConfig,\n\t});\n\n\tif (hasDecryptEngine) {\n\t\tdecryptHandlers?.map((run) => {\n\t\t\tconst { options, requiredOptions } = run;\n\t\t\taddPluginOptions(options, subProgram);\n\t\t\taddPluginOptions(requiredOptions, subProgram, true);\n\t\t});\n\t\tconst engines = decryptHandlers?.map((e) => e.triggerOptionValue);\n\n\t\tsubProgram.option(\n\t\t\t\"--engine <engine>\",\n\t\t\t`Encryption engine${engines.length > 0 ? \"s\" : \"\"}: ${\n\t\t\t\t(engines.join(\", \"), engines.length === 1 ? engines[0] : undefined)\n\t\t\t}`,\n\t\t\t// engines.length === 1 ? engines[0] : undefined,\n\t\t);\n\t}\n\treturn subProgram;\n};\n\nexport default addRunProgam;\n"]}
package/dist/index.d.ts CHANGED
@@ -167,12 +167,11 @@ type DotsecConfig<T extends DotsecPlugins = DotsecPlugins> = {
167
167
  showRedacted?: boolean;
168
168
  showOutputPrefix?: boolean;
169
169
  outputPrefix?: string;
170
- showBackgroundColor?: boolean;
171
- outputBackgroundColor?: BackgroundColor;
170
+ outputBackgroundColor?: boolean | BackgroundColor;
172
171
  };
173
172
  };
174
173
  redaction?: {
175
- show?: string[];
174
+ show: string[];
176
175
  };
177
176
  push?: {
178
177
  [key: string]: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dotsec",
3
- "version": "4.0.0-alpha.30",
3
+ "version": "4.0.0-alpha.32",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -63,5 +63,5 @@
63
63
  "typescript": "~4.9.3",
64
64
  "yargs-parser": "^21.1.1"
65
65
  },
66
- "gitHead": "bd71513c0f04ba1ae961fee4c1e8730606854be7"
66
+ "gitHead": "314aef13781214ad9d309de7c76ced2dd752bafe"
67
67
  }