@rockcarver/frodo-cli 2.0.0-37 → 2.0.0-38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.0.0-37] - 2023-12-06
11
+
10
12
  ## [2.0.0-36] - 2023-12-01
11
13
 
12
14
  ## [2.0.0-35] - 2023-11-30
@@ -1439,7 +1441,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1439
1441
  - Fixed problem with adding connection profiles
1440
1442
  - Miscellaneous bug fixes
1441
1443
 
1442
- [Unreleased]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-36...HEAD
1444
+ [Unreleased]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-37...HEAD
1445
+
1446
+ [2.0.0-37]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-36...v2.0.0-37
1443
1447
 
1444
1448
  [2.0.0-36]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-35...v2.0.0-36
1445
1449
 
@@ -7,13 +7,13 @@ const {
7
7
  getTokens
8
8
  } = frodo.login;
9
9
  const program = new FrodoCommand('frodo esv secret list');
10
- program.description('List secrets.').addOption(new Option('-l, --long', 'Long with all fields.').default(false, 'false')).action(
10
+ program.description('List secrets.').addOption(new Option('-l, --long', 'Long with all fields besides usage.').default(false, 'false')).addOption(new Option('-u, --usage', 'Display usage field. If a file is provided with -f or --file, it will search for usage in the file. If a directory is provided with -D or --directory, it will search for usage in all .json files in the directory and sub-directories. If no file or directory is provided, it will perform a full export automatically to determine usage.').default(false, 'false')).addOption(new Option('-f, --file [file]', 'Optional export file to use to determine usage. Overrides -D, --directory. Only used if -u or --usage is provided as well.')).action(
11
11
  // implement command logic inside action handler
12
12
  async (host, realm, user, password, options, command) => {
13
13
  command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
14
14
  if (await getTokens()) {
15
15
  verboseMessage('Listing secrets...');
16
- const outcome = await listSecrets(options.long);
16
+ const outcome = await listSecrets(options.long, options.usage, options.file);
17
17
  if (!outcome) process.exitCode = 1;
18
18
  } else {
19
19
  process.exitCode = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"esv-secret-list.js","names":["frodo","Option","listSecrets","verboseMessage","FrodoCommand","getTokens","login","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","outcome","long","process","exitCode","parse"],"sources":["../../../src/cli/esv/esv-secret-list.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { listSecrets } from '../../ops/SecretsOps';\nimport { verboseMessage } from '../../utils/Console.js';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo esv secret list');\n\nprogram\n .description('List secrets.')\n .addOption(\n new Option('-l, --long', 'Long with all fields.').default(false, 'false')\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n verboseMessage('Listing secrets...');\n const outcome = await listSecrets(options.long);\n if (!outcome) process.exitCode = 1;\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,WAAW,QAAQ,sBAAsB;AAClD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGL,KAAK,CAACM,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,uBAAuB,CAAC;AAEzDG,OAAO,CACJC,WAAW,CAAC,eAAe,CAAC,CAC5BC,SAAS,CACR,IAAIR,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAACS,OAAO,CAAC,KAAK,EAAE,OAAO,CAC1E,CAAC,CACAC,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMZ,SAAS,CAAC,CAAC,EAAE;IACrBF,cAAc,CAAC,oBAAoB,CAAC;IACpC,MAAMgB,OAAO,GAAG,MAAMjB,WAAW,CAACc,OAAO,CAACI,IAAI,CAAC;IAC/C,IAAI,CAACD,OAAO,EAAEE,OAAO,CAACC,QAAQ,GAAG,CAAC;EACpC,CAAC,MAAM;IACLD,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHf,OAAO,CAACgB,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"esv-secret-list.js","names":["frodo","Option","listSecrets","verboseMessage","FrodoCommand","getTokens","login","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","outcome","long","usage","file","process","exitCode","parse"],"sources":["../../../src/cli/esv/esv-secret-list.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { listSecrets } from '../../ops/SecretsOps';\nimport { verboseMessage } from '../../utils/Console.js';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo esv secret list');\n\nprogram\n .description('List secrets.')\n .addOption(\n new Option('-l, --long', 'Long with all fields besides usage.').default(\n false,\n 'false'\n )\n )\n .addOption(\n new Option(\n '-u, --usage',\n 'Display usage field. If a file is provided with -f or --file, it will search for usage in the file. If a directory is provided with -D or --directory, it will search for usage in all .json files in the directory and sub-directories. If no file or directory is provided, it will perform a full export automatically to determine usage.'\n ).default(false, 'false')\n )\n .addOption(\n new Option(\n '-f, --file [file]',\n 'Optional export file to use to determine usage. Overrides -D, --directory. Only used if -u or --usage is provided as well.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n verboseMessage('Listing secrets...');\n const outcome = await listSecrets(\n options.long,\n options.usage,\n options.file\n );\n if (!outcome) process.exitCode = 1;\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,WAAW,QAAQ,sBAAsB;AAClD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGL,KAAK,CAACM,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,uBAAuB,CAAC;AAEzDG,OAAO,CACJC,WAAW,CAAC,eAAe,CAAC,CAC5BC,SAAS,CACR,IAAIR,MAAM,CAAC,YAAY,EAAE,qCAAqC,CAAC,CAACS,OAAO,CACrE,KAAK,EACL,OACF,CACF,CAAC,CACAD,SAAS,CACR,IAAIR,MAAM,CACR,aAAa,EACb,+UACF,CAAC,CAACS,OAAO,CAAC,KAAK,EAAE,OAAO,CAC1B,CAAC,CACAD,SAAS,CACR,IAAIR,MAAM,CACR,mBAAmB,EACnB,4HACF,CACF,CAAC,CACAU,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMZ,SAAS,CAAC,CAAC,EAAE;IACrBF,cAAc,CAAC,oBAAoB,CAAC;IACpC,MAAMgB,OAAO,GAAG,MAAMjB,WAAW,CAC/Bc,OAAO,CAACI,IAAI,EACZJ,OAAO,CAACK,KAAK,EACbL,OAAO,CAACM,IACV,CAAC;IACD,IAAI,CAACH,OAAO,EAAEI,OAAO,CAACC,QAAQ,GAAG,CAAC;EACpC,CAAC,MAAM;IACLD,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHjB,OAAO,CAACkB,KAAK,CAAC,CAAC"}
@@ -7,13 +7,13 @@ const {
7
7
  getTokens
8
8
  } = frodo.login;
9
9
  const program = new FrodoCommand('frodo esv variable list');
10
- program.description('List variables.').addOption(new Option('-l, --long', 'Long with all fields.').default(false, 'false')).action(
10
+ program.description('List variables.').addOption(new Option('-l, --long', 'Long with all fields besides usage.').default(false, 'false')).addOption(new Option('-u, --usage', 'Display usage field. If a file is provided with -f or --file, it will search for usage in the file. If a directory is provided with -D or --directory, it will search for usage in all .json files in the directory and sub-directories. If no file or directory is provided, it will perform a full export automatically to determine usage.').default(false, 'false')).addOption(new Option('-f, --file [file]', 'Optional export file to use to determine usage. Overrides -D, --directory. Only used if -u or --usage is provided as well.')).action(
11
11
  // implement command logic inside action handler
12
12
  async (host, realm, user, password, options, command) => {
13
13
  command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
14
14
  if (await getTokens()) {
15
15
  verboseMessage('Listing variables...');
16
- const outcome = await listVariables(options.long);
16
+ const outcome = await listVariables(options.long, options.usage, options.file);
17
17
  if (!outcome) process.exitCode = 1;
18
18
  } else {
19
19
  process.exitCode = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"esv-variable-list.js","names":["frodo","Option","listVariables","verboseMessage","FrodoCommand","getTokens","login","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","outcome","long","process","exitCode","parse"],"sources":["../../../src/cli/esv/esv-variable-list.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { listVariables } from '../../ops/VariablesOps';\nimport { verboseMessage } from '../../utils/Console.js';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo esv variable list');\n\nprogram\n .description('List variables.')\n .addOption(\n new Option('-l, --long', 'Long with all fields.').default(false, 'false')\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n verboseMessage('Listing variables...');\n const outcome = await listVariables(options.long);\n if (!outcome) process.exitCode = 1;\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,aAAa,QAAQ,wBAAwB;AACtD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGL,KAAK,CAACM,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,yBAAyB,CAAC;AAE3DG,OAAO,CACJC,WAAW,CAAC,iBAAiB,CAAC,CAC9BC,SAAS,CACR,IAAIR,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAACS,OAAO,CAAC,KAAK,EAAE,OAAO,CAC1E,CAAC,CACAC,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMZ,SAAS,CAAC,CAAC,EAAE;IACrBF,cAAc,CAAC,sBAAsB,CAAC;IACtC,MAAMgB,OAAO,GAAG,MAAMjB,aAAa,CAACc,OAAO,CAACI,IAAI,CAAC;IACjD,IAAI,CAACD,OAAO,EAAEE,OAAO,CAACC,QAAQ,GAAG,CAAC;EACpC,CAAC,MAAM;IACLD,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHf,OAAO,CAACgB,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"esv-variable-list.js","names":["frodo","Option","listVariables","verboseMessage","FrodoCommand","getTokens","login","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","outcome","long","usage","file","process","exitCode","parse"],"sources":["../../../src/cli/esv/esv-variable-list.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { listVariables } from '../../ops/VariablesOps';\nimport { verboseMessage } from '../../utils/Console.js';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo esv variable list');\n\nprogram\n .description('List variables.')\n .addOption(\n new Option('-l, --long', 'Long with all fields besides usage.').default(\n false,\n 'false'\n )\n )\n .addOption(\n new Option(\n '-u, --usage',\n 'Display usage field. If a file is provided with -f or --file, it will search for usage in the file. If a directory is provided with -D or --directory, it will search for usage in all .json files in the directory and sub-directories. If no file or directory is provided, it will perform a full export automatically to determine usage.'\n ).default(false, 'false')\n )\n .addOption(\n new Option(\n '-f, --file [file]',\n 'Optional export file to use to determine usage. Overrides -D, --directory. Only used if -u or --usage is provided as well.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n verboseMessage('Listing variables...');\n const outcome = await listVariables(\n options.long,\n options.usage,\n options.file\n );\n if (!outcome) process.exitCode = 1;\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,aAAa,QAAQ,wBAAwB;AACtD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGL,KAAK,CAACM,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,yBAAyB,CAAC;AAE3DG,OAAO,CACJC,WAAW,CAAC,iBAAiB,CAAC,CAC9BC,SAAS,CACR,IAAIR,MAAM,CAAC,YAAY,EAAE,qCAAqC,CAAC,CAACS,OAAO,CACrE,KAAK,EACL,OACF,CACF,CAAC,CACAD,SAAS,CACR,IAAIR,MAAM,CACR,aAAa,EACb,+UACF,CAAC,CAACS,OAAO,CAAC,KAAK,EAAE,OAAO,CAC1B,CAAC,CACAD,SAAS,CACR,IAAIR,MAAM,CACR,mBAAmB,EACnB,4HACF,CACF,CAAC,CACAU,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMZ,SAAS,CAAC,CAAC,EAAE;IACrBF,cAAc,CAAC,sBAAsB,CAAC;IACtC,MAAMgB,OAAO,GAAG,MAAMjB,aAAa,CACjCc,OAAO,CAACI,IAAI,EACZJ,OAAO,CAACK,KAAK,EACbL,OAAO,CAACM,IACV,CAAC;IACD,IAAI,CAACH,OAAO,EAAEI,OAAO,CAACC,QAAQ,GAAG,CAAC;EACpC,CAAC,MAAM;IACLD,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHjB,OAAO,CAACkB,KAAK,CAAC,CAAC"}
@@ -7,13 +7,13 @@ const {
7
7
  getTokens
8
8
  } = frodo.login;
9
9
  const program = new FrodoCommand('frodo script list');
10
- program.description('List scripts.').addOption(new Option('-l, --long', 'Long with all fields.').default(false, 'false')).action(
10
+ program.description('List scripts.').addOption(new Option('-l, --long', 'Long with all fields besides usage.').default(false, 'false')).addOption(new Option('-u, --usage', 'Display usage field. If a file is provided with -f or --file, it will search for usage in the file. If a directory is provided with -D or --directory, it will search for usage in all .json files in the directory and sub-directories. If no file or directory is provided, it will perform a full export automatically to determine usage.').default(false, 'false')).addOption(new Option('-f, --file [file]', 'Optional export file to use to determine usage. Overrides -D, --directory. Only used if -u or --usage is provided as well.')).action(
11
11
  // implement command logic inside action handler
12
12
  async (host, realm, user, password, options, command) => {
13
13
  command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
14
14
  if (await getTokens()) {
15
15
  verboseMessage(`Listing scripts in realm "${state.getRealm()}"...`);
16
- const outcome = await listScripts(options.long);
16
+ const outcome = await listScripts(options.long, options.usage, options.file);
17
17
  if (!outcome) process.exitCode = 1;
18
18
  } else {
19
19
  process.exitCode = 1;
@@ -1 +1 @@
1
- {"version":3,"file":"script-list.js","names":["frodo","state","Option","listScripts","verboseMessage","FrodoCommand","getTokens","login","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","getRealm","outcome","long","process","exitCode","parse"],"sources":["../../../src/cli/script/script-list.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { listScripts } from '../../ops/ScriptOps';\nimport { verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo script list');\n\nprogram\n .description('List scripts.')\n .addOption(\n new Option('-l, --long', 'Long with all fields.').default(false, 'false')\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n verboseMessage(`Listing scripts in realm \"${state.getRealm()}\"...`);\n const outcome = await listScripts(options.long);\n if (!outcome) process.exitCode = 1;\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,EAAEC,KAAK,QAAQ,uBAAuB;AACpD,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,WAAW,QAAQ,qBAAqB;AACjD,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGN,KAAK,CAACO,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,mBAAmB,CAAC;AAErDG,OAAO,CACJC,WAAW,CAAC,eAAe,CAAC,CAC5BC,SAAS,CACR,IAAIR,MAAM,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAACS,OAAO,CAAC,KAAK,EAAE,OAAO,CAC1E,CAAC,CACAC,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMZ,SAAS,CAAC,CAAC,EAAE;IACrBF,cAAc,CAAE,6BAA4BH,KAAK,CAACmB,QAAQ,CAAC,CAAE,MAAK,CAAC;IACnE,MAAMC,OAAO,GAAG,MAAMlB,WAAW,CAACc,OAAO,CAACK,IAAI,CAAC;IAC/C,IAAI,CAACD,OAAO,EAAEE,OAAO,CAACC,QAAQ,GAAG,CAAC;EACpC,CAAC,MAAM;IACLD,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHhB,OAAO,CAACiB,KAAK,CAAC,CAAC"}
1
+ {"version":3,"file":"script-list.js","names":["frodo","state","Option","listScripts","verboseMessage","FrodoCommand","getTokens","login","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","getRealm","outcome","long","usage","file","process","exitCode","parse"],"sources":["../../../src/cli/script/script-list.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { listScripts } from '../../ops/ScriptOps';\nimport { verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst { getTokens } = frodo.login;\n\nconst program = new FrodoCommand('frodo script list');\n\nprogram\n .description('List scripts.')\n .addOption(\n new Option('-l, --long', 'Long with all fields besides usage.').default(\n false,\n 'false'\n )\n )\n .addOption(\n new Option(\n '-u, --usage',\n 'Display usage field. If a file is provided with -f or --file, it will search for usage in the file. If a directory is provided with -D or --directory, it will search for usage in all .json files in the directory and sub-directories. If no file or directory is provided, it will perform a full export automatically to determine usage.'\n ).default(false, 'false')\n )\n .addOption(\n new Option(\n '-f, --file [file]',\n 'Optional export file to use to determine usage. Overrides -D, --directory. Only used if -u or --usage is provided as well.'\n )\n )\n .action(\n // implement command logic inside action handler\n async (host, realm, user, password, options, command) => {\n command.handleDefaultArgsAndOpts(\n host,\n realm,\n user,\n password,\n options,\n command\n );\n if (await getTokens()) {\n verboseMessage(`Listing scripts in realm \"${state.getRealm()}\"...`);\n const outcome = await listScripts(\n options.long,\n options.usage,\n options.file\n );\n if (!outcome) process.exitCode = 1;\n } else {\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"AAAA,SAASA,KAAK,EAAEC,KAAK,QAAQ,uBAAuB;AACpD,SAASC,MAAM,QAAQ,WAAW;AAElC,SAASC,WAAW,QAAQ,qBAAqB;AACjD,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,YAAY,QAAQ,iBAAiB;AAE9C,MAAM;EAAEC;AAAU,CAAC,GAAGN,KAAK,CAACO,KAAK;AAEjC,MAAMC,OAAO,GAAG,IAAIH,YAAY,CAAC,mBAAmB,CAAC;AAErDG,OAAO,CACJC,WAAW,CAAC,eAAe,CAAC,CAC5BC,SAAS,CACR,IAAIR,MAAM,CAAC,YAAY,EAAE,qCAAqC,CAAC,CAACS,OAAO,CACrE,KAAK,EACL,OACF,CACF,CAAC,CACAD,SAAS,CACR,IAAIR,MAAM,CACR,aAAa,EACb,+UACF,CAAC,CAACS,OAAO,CAAC,KAAK,EAAE,OAAO,CAC1B,CAAC,CACAD,SAAS,CACR,IAAIR,MAAM,CACR,mBAAmB,EACnB,4HACF,CACF,CAAC,CACAU,MAAM;AACL;AACA,OAAOC,IAAI,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,KAAK;EACvDA,OAAO,CAACC,wBAAwB,CAC9BN,IAAI,EACJC,KAAK,EACLC,IAAI,EACJC,QAAQ,EACRC,OAAO,EACPC,OACF,CAAC;EACD,IAAI,MAAMZ,SAAS,CAAC,CAAC,EAAE;IACrBF,cAAc,CAAE,6BAA4BH,KAAK,CAACmB,QAAQ,CAAC,CAAE,MAAK,CAAC;IACnE,MAAMC,OAAO,GAAG,MAAMlB,WAAW,CAC/Bc,OAAO,CAACK,IAAI,EACZL,OAAO,CAACM,KAAK,EACbN,OAAO,CAACO,IACV,CAAC;IACD,IAAI,CAACH,OAAO,EAAEI,OAAO,CAACC,QAAQ,GAAG,CAAC;EACpC,CAAC,MAAM;IACLD,OAAO,CAACC,QAAQ,GAAG,CAAC;EACtB;AACF;AACA;AACF,CAAC;;AAEHlB,OAAO,CAACmB,KAAK,CAAC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { frodo, state } from '@rockcarver/frodo-lib';
2
2
  import chokidar from 'chokidar';
3
3
  import fs from 'fs';
4
+ import { getFullExportConfig, isIdUsed } from '../utils/Config';
4
5
  import { createProgressIndicator, createTable, debugMessage, failSpinner, printMessage, showSpinner, spinSpinner, stopProgressIndicator, succeedSpinner, updateProgressIndicator } from '../utils/Console';
5
6
  import { getTypedFilename, isValidUrl, saveJsonToFile, saveTextToFile, titleCase } from '../utils/ExportImportUtils';
6
7
  import wordwrap from './utils/Wordwrap';
@@ -58,36 +59,64 @@ export function getTableRowMd(scriptObj) {
58
59
  /**
59
60
  * List scripts
60
61
  * @param {boolean} long detail list
62
+ * @param {boolean} usage display usage field
63
+ * @param {String | null} file Optional filename to determine usage
61
64
  * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise
62
65
  */
63
- export async function listScripts(long = false) {
64
- let outcome = true;
66
+ export async function listScripts(long = false, usage = false, file = null) {
67
+ let spinnerId;
68
+ let scripts = [];
65
69
  debugMessage(`Cli.ScriptOps.listScripts: start`);
66
70
  try {
67
- const scripts = await readScripts();
71
+ spinnerId = createProgressIndicator('indeterminate', 0, `Reading scripts...`);
72
+ scripts = await readScripts();
68
73
  scripts.sort((a, b) => a.name.localeCompare(b.name));
69
- if (long) {
70
- const table = createTable(['Name', 'UUID', 'Language', 'Context', 'Description']);
71
- const langMap = {
72
- JAVASCRIPT: 'JS',
73
- GROOVY: 'Groovy'
74
- };
75
- scripts.forEach(script => {
76
- table.push([wordwrap(script.name, 25, ' '), script._id, langMap[script.language], wordwrap(titleCase(script.context.split('_').join(' ')), 25), wordwrap(script.description, 30)]);
77
- });
78
- printMessage(table.toString(), 'data');
79
- } else {
80
- scripts.forEach(script => {
81
- printMessage(`${script.name}`, 'data');
82
- });
83
- }
74
+ stopProgressIndicator(spinnerId, `Successfully read ${scripts.length} scripts.`, 'success');
84
75
  } catch (error) {
85
- outcome = false;
86
- printMessage(`Error listing scripts: ${error.message}`, 'error');
76
+ var _error$response;
77
+ stopProgressIndicator(spinnerId, `Error reading scripts: ${((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data) || error.message}`, 'fail');
87
78
  debugMessage(error);
79
+ debugMessage(`Cli.ScriptOps.listScripts: end [false]`);
80
+ return false;
88
81
  }
89
- debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);
90
- return outcome;
82
+ if (!long && !usage) {
83
+ scripts.forEach(script => {
84
+ printMessage(`${script.name}`, 'data');
85
+ });
86
+ debugMessage(`Cli.ScriptOps.listScripts: end [true]`);
87
+ return true;
88
+ }
89
+ let fullExport = null;
90
+ const headers = long ? ['Name', 'UUID', 'Language', 'Context', 'Description'] : ['Name'];
91
+ if (usage) {
92
+ try {
93
+ fullExport = await getFullExportConfig(file);
94
+ } catch (error) {
95
+ var _error$response2;
96
+ printMessage(`Error getting full export: ${((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data) || error.message}`, 'error');
97
+ debugMessage(`Cli.ScriptOps.listScripts: end [false]`);
98
+ return false;
99
+ }
100
+ //Delete scripts from full export so they aren't mistakenly used for determining usage
101
+ delete fullExport.script;
102
+ headers.push('Used');
103
+ }
104
+ const table = createTable(headers);
105
+ const langMap = {
106
+ JAVASCRIPT: 'JS',
107
+ GROOVY: 'Groovy'
108
+ };
109
+ scripts.forEach(script => {
110
+ const values = long ? [wordwrap(script.name, 25, ' '), script._id, langMap[script.language], wordwrap(titleCase(script.context.split('_').join(' ')), 25), wordwrap(script.description, 30)] : [wordwrap(script.name, 25, ' ')];
111
+ if (usage) {
112
+ const isScriptUsed = isIdUsed(fullExport, script._id, false);
113
+ values.push(isScriptUsed.used ? `${'yes'['brightGreen']} (at ${isScriptUsed.location})` : 'no'['brightRed']);
114
+ }
115
+ table.push(values);
116
+ });
117
+ printMessage(table.toString(), 'data');
118
+ debugMessage(`Cli.ScriptOps.listScripts: end [true]`);
119
+ return true;
91
120
  }
92
121
 
93
122
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ScriptOps.js","names":["frodo","state","chokidar","fs","createProgressIndicator","createTable","debugMessage","failSpinner","printMessage","showSpinner","spinSpinner","stopProgressIndicator","succeedSpinner","updateProgressIndicator","getTypedFilename","isValidUrl","saveJsonToFile","saveTextToFile","titleCase","wordwrap","readScripts","exportScript","exportScriptByName","exportScripts","importScripts","deleteScript","deleteScriptByName","deleteScripts","script","isBase64Encoded","getFilePath","getWorkingDirectory","utils","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","outcome","scripts","sort","a","b","localeCompare","table","forEach","push","toString","error","message","exportScriptToFile","scriptId","file","fileName","filePath","scriptExport","exportScriptByNameToFile","exportScriptsToFile","getRealm","exportScriptsToFiles","extract","scriptList","barId","length","fileBarId","extractScriptToFile","directory","scriptSkeleton","getScriptSkeleton","fileExtension","scriptFileName","scriptFilePath","scriptText","Array","isArray","isScriptExtracted","importData","extracted","Object","keys","importScriptsFromFile","reUuid","readFile","err","data","JSON","parse","handleScriptFileImport","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","watcher","persistent","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","imported","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","readFileSync","startsWith","scriptExportRaw","getScriptId","scriptIds","Error","deleteScriptId","id","spinnerId","undefined","deleteScriptName","deleteAllScripts"],"sources":["../../src/ops/ScriptOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi';\nimport { type ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\n\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressIndicator,\n succeedSpinner,\n updateProgressIndicator,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n isValidUrl,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n readScripts,\n exportScript,\n exportScriptByName,\n exportScripts,\n importScripts,\n deleteScript,\n deleteScriptByName,\n deleteScripts,\n} = frodo.script;\n\nconst { isBase64Encoded, getFilePath, getWorkingDirectory } = frodo.utils;\n\n/**\n * Get a one-line description of the script object\n * @param {ScriptSkeleton} scriptObj script object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(scriptObj: ScriptSkeleton): string {\n const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Name | Language | Type | Id |\\n';\n markdown += '| ---- | -------- | ---- | ---|';\n return markdown;\n}\n\n/**\n * Get a one-line description of the script object in markdown\n * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe\n * @returns {string} markdown table row\n */\nexport function getTableRowMd(scriptObj: ScriptSkeleton): string {\n const langMap = { JAVASCRIPT: 'JavaSscript', GROOVY: 'Groovy' };\n const description = `| ${scriptObj.name} | ${\n langMap[scriptObj.language]\n } | ${titleCase(scriptObj.context.split('_').join(' '))} | \\`${\n scriptObj._id\n }\\` |`;\n return description;\n}\n\n/**\n * List scripts\n * @param {boolean} long detail list\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function listScripts(long = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n const scripts = await readScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n if (long) {\n const table = createTable([\n 'Name',\n 'UUID',\n 'Language',\n 'Context',\n 'Description',\n ]);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n table.push([\n wordwrap(script.name, 25, ' '),\n script._id,\n langMap[script.language],\n wordwrap(titleCase(script.context.split('_').join(' ')), 25),\n wordwrap(script.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n }\n } catch (error) {\n outcome = false;\n printMessage(`Error listing scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptToFile: start`);\n try {\n showSpinner(`Exporting script '${scriptId}'...`);\n let fileName = getTypedFilename(scriptId, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${scriptId}' to '${filePath}'...`);\n const scriptExport = await exportScript(scriptId);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${scriptId}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [false]`);\n return false;\n}\n\n/**\n * Export script by name to file\n * @param {string} name script name\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);\n try {\n showSpinner(`Exporting script '${name}'...`);\n let fileName = getTypedFilename(name, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${name}' to '${filePath}'...`);\n const scriptExport = await exportScriptByName(name);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${name}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: start`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Scripts`,\n 'script'\n );\n if (file) {\n fileName = file;\n }\n const scriptExport = await exportScripts();\n saveJsonToFile(scriptExport, getFilePath(fileName, true));\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);\n return true;\n } catch (error) {\n printMessage(`Error exporting scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @param extract Extracts the scripts from the exports into separate files if true\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFiles(extract = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const scriptList = await readScripts();\n const barId = createProgressIndicator(\n 'determinate',\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n const fileBarId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting script ${script.name}...`\n );\n updateProgressIndicator(barId, `Reading script ${script.name}`);\n const file = getFilePath(getTypedFilename(script.name, 'script'), true);\n try {\n const scriptExport = await exportScriptByName(script.name);\n if (extract) extractScriptToFile(scriptExport);\n saveJsonToFile(scriptExport, file);\n updateProgressIndicator(fileBarId, `Saving ${script.name} to ${file}.`);\n stopProgressIndicator(fileBarId, `${script.name} saved to ${file}.`);\n } catch (error) {\n outcome = false;\n updateProgressIndicator(barId, `Error exporting ${script.name}.`);\n stopProgressIndicator(\n fileBarId,\n `Error saving ${script.name} to ${file}.`\n );\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressIndicator(\n barId,\n `Exported ${scriptList.length} scripts to individual files.`\n );\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Extracts a script from a script export into a separate file.\n * @param scriptExport The script export\n * @param scriptId The script id (optional if there is only one script in the export)\n * @param directory The directory within the base directory to save the script file\n */\nexport function extractScriptToFile(\n scriptExport: ScriptExportInterface,\n scriptId?: string,\n directory?: string\n) {\n const scriptSkeleton = scriptId\n ? scriptExport.script[scriptId]\n : getScriptSkeleton(scriptExport);\n const fileExtension =\n scriptSkeleton.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n scriptSkeleton.name,\n 'script',\n fileExtension\n );\n const scriptFilePath = getFilePath(\n (directory ? `${directory}/` : '') + scriptFileName,\n true\n );\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n scriptSkeleton.script = `file://${scriptFilePath}`;\n saveTextToFile(scriptText, scriptFilePath);\n}\n\nfunction isScriptExtracted(importData: ScriptExportInterface): boolean {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: start`);\n let extracted = true;\n for (const scriptId of Object.keys(importData.script)) {\n const script = importData.script[scriptId].script;\n if (Array.isArray(script)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is string array`);\n extracted = false;\n break;\n }\n if (isValidUrl(script as string)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is extracted`);\n extracted = true;\n break;\n }\n if (isBase64Encoded) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is base64-encoded`);\n extracted = false;\n break;\n }\n break;\n }\n debugMessage(`Cli.ScriptOps.isScriptExtracted: end [extracted=${extracted}]`);\n return extracted;\n}\n\n/**\n * Import script(s) from file\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {string} file file name\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScriptsFromFile(\n name: string,\n file: string,\n reUuid = false\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n fs.readFile(filePath, 'utf8', async (err, data) => {\n try {\n if (err) throw err;\n const importData: ScriptExportInterface = JSON.parse(data);\n if (isScriptExtracted(importData)) {\n await handleScriptFileImport(filePath, reUuid, false);\n } else {\n await importScripts(name, importData, reUuid);\n }\n outcome = true;\n } catch (error) {\n printMessage(\n `Error exporting script '${name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n });\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param watch whether or not to watch for file changes\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n reUuid: boolean,\n validateScripts: boolean\n) {\n // If watch is true, it doesn't make sense to reUuid.\n reUuid = watch ? false : reUuid;\n\n /**\n * Run on file change detection, as well as on initial run.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async function onChange(path: string, _stats?: fs.Stats): Promise<void> {\n try {\n await handleScriptFileImport(path, reUuid, validateScripts);\n } catch (error) {\n printMessage(`${path}: ${error.message}`, 'error');\n }\n }\n\n // We watch json files and script files.\n const watcher = chokidar.watch(\n [\n `${getWorkingDirectory()}/**/*.script.json`,\n `${getWorkingDirectory()}/**/*.script.js`,\n `${getWorkingDirectory()}/**/*.script.groovy`,\n ],\n {\n persistent: watch,\n }\n );\n\n watcher\n .on('add', onChange)\n .on('change', onChange)\n .on('error', (error) => {\n printMessage(`Watcher error: ${error}`, 'error');\n watcher.close();\n })\n .on('ready', () => {\n if (watch) {\n printMessage('Watching for changes...');\n } else {\n watcher.close();\n printMessage('Done.');\n }\n });\n}\n\n/**\n * Handle a script file import.\n *\n * @param file Either a script file or an extract file\n * @param reUuid whether or not to generate a new uuid for each script on import\n */\nasync function handleScriptFileImport(\n file: string,\n reUuid: boolean,\n validateScripts: boolean\n) {\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: start`);\n const scriptFile = getScriptFile(file);\n const script = getScriptExportByScriptFile(scriptFile);\n\n const imported = await importScripts('', script, reUuid, validateScripts);\n if (imported) {\n printMessage(`Imported '${scriptFile}'`);\n }\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: end`);\n}\n\n/**\n * Get a script file from a file.\n *\n * @param file Either a script file or an extract file\n * @returns The script file\n */\nfunction getScriptFile(file: string) {\n if (file.endsWith('.script.json')) {\n return file;\n }\n return file.replace(/\\.script\\.(js|groovy)/, '.script.json');\n}\n\n/**\n * Get a script export from a script file.\n *\n * @param scriptFile The path to the script file\n * @returns The script export\n */\nfunction getScriptExportByScriptFile(\n scriptFile: string\n): ScriptExportInterface {\n const scriptExport = getScriptExport(scriptFile);\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const extractFile = getExtractFile(scriptSkeleton);\n if (!extractFile) {\n return scriptExport;\n }\n\n const scriptRaw = fs.readFileSync(extractFile, 'utf8');\n scriptSkeleton.script = scriptRaw.split('\\n');\n\n return scriptExport;\n}\n\n/**\n * Get an extract file from a script skeleton.\n *\n * @param scriptSkeleton The script skeleton\n * @returns The extract file or null if there is no extract file\n */\nfunction getExtractFile(scriptSkeleton: ScriptSkeleton): string | null {\n const extractFile = scriptSkeleton.script;\n if (Array.isArray(extractFile)) {\n return null;\n }\n if (\n extractFile.startsWith('file://') &&\n (extractFile.endsWith('.js') || extractFile.endsWith('.groovy'))\n ) {\n return extractFile.replace('file://', '');\n }\n return null;\n}\n\n/**\n * Get a script export from a file.\n *\n * @param file The path to a script export file\n * @returns The script export\n */\nfunction getScriptExport(file: string): ScriptExportInterface {\n const scriptExportRaw = fs.readFileSync(file, 'utf8');\n const scriptExport = JSON.parse(scriptExportRaw) as ScriptExportInterface;\n\n return scriptExport;\n}\n\n/**\n * Get the main script skeleton from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script Get the main script skeleton from a script export\n * @returns The main script skeleton\n */\nfunction getScriptSkeleton(script: ScriptExportInterface): ScriptSkeleton {\n const scriptId = getScriptId(script);\n return script.script[scriptId];\n}\n\n/**\n * Get the main script ID from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script The script export\n * @returns The main script ID\n */\nfunction getScriptId(script: ScriptExportInterface): string {\n const scriptIds = Object.keys(script.script);\n if (scriptIds.length !== 1) {\n throw new Error(`Expected 1 script, found ${scriptIds.length}`);\n }\n return scriptIds[0];\n}\n\n/**\n * Delete script by id\n * @param {String} id script id\n */\nexport async function deleteScriptId(id) {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${id}...`\n );\n try {\n await deleteScript(id);\n stopProgressIndicator(spinnerId, `Deleted ${id}.`, 'success');\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete script by name\n * @param {String} name script name\n */\nexport async function deleteScriptName(name) {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${name}...`\n );\n try {\n await deleteScriptByName(name);\n stopProgressIndicator(spinnerId, `Deleted ${name}.`, 'success');\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all non-default scripts\n */\nexport async function deleteAllScripts() {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all non-default scripts...`\n );\n try {\n await deleteScripts();\n stopProgressIndicator(\n spinnerId,\n `Deleted all non-default scripts.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScriptOps.js","names":["frodo","state","chokidar","fs","getFullExportConfig","isIdUsed","createProgressIndicator","createTable","debugMessage","failSpinner","printMessage","showSpinner","spinSpinner","stopProgressIndicator","succeedSpinner","updateProgressIndicator","getTypedFilename","isValidUrl","saveJsonToFile","saveTextToFile","titleCase","wordwrap","readScripts","exportScript","exportScriptByName","exportScripts","importScripts","deleteScript","deleteScriptByName","deleteScripts","script","isBase64Encoded","getFilePath","getWorkingDirectory","utils","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","usage","file","spinnerId","scripts","sort","a","b","localeCompare","length","error","_error$response","response","data","message","forEach","fullExport","headers","_error$response2","push","table","values","isScriptUsed","used","location","toString","exportScriptToFile","scriptId","fileName","filePath","scriptExport","exportScriptByNameToFile","exportScriptsToFile","getRealm","exportScriptsToFiles","extract","outcome","scriptList","barId","fileBarId","extractScriptToFile","directory","scriptSkeleton","getScriptSkeleton","fileExtension","scriptFileName","scriptFilePath","scriptText","Array","isArray","isScriptExtracted","importData","extracted","Object","keys","importScriptsFromFile","reUuid","readFile","err","JSON","parse","handleScriptFileImport","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","watcher","persistent","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","imported","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","readFileSync","startsWith","scriptExportRaw","getScriptId","scriptIds","Error","deleteScriptId","id","undefined","deleteScriptName","deleteAllScripts"],"sources":["../../src/ops/ScriptOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi';\nimport { type ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\n\nimport { getFullExportConfig, isIdUsed } from '../utils/Config';\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressIndicator,\n succeedSpinner,\n updateProgressIndicator,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n isValidUrl,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n readScripts,\n exportScript,\n exportScriptByName,\n exportScripts,\n importScripts,\n deleteScript,\n deleteScriptByName,\n deleteScripts,\n} = frodo.script;\n\nconst { isBase64Encoded, getFilePath, getWorkingDirectory } = frodo.utils;\n\n/**\n * Get a one-line description of the script object\n * @param {ScriptSkeleton} scriptObj script object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(scriptObj: ScriptSkeleton): string {\n const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Name | Language | Type | Id |\\n';\n markdown += '| ---- | -------- | ---- | ---|';\n return markdown;\n}\n\n/**\n * Get a one-line description of the script object in markdown\n * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe\n * @returns {string} markdown table row\n */\nexport function getTableRowMd(scriptObj: ScriptSkeleton): string {\n const langMap = { JAVASCRIPT: 'JavaSscript', GROOVY: 'Groovy' };\n const description = `| ${scriptObj.name} | ${\n langMap[scriptObj.language]\n } | ${titleCase(scriptObj.context.split('_').join(' '))} | \\`${\n scriptObj._id\n }\\` |`;\n return description;\n}\n\n/**\n * List scripts\n * @param {boolean} long detail list\n * @param {boolean} usage display usage field\n * @param {String | null} file Optional filename to determine usage\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function listScripts(\n long: boolean = false,\n usage: boolean = false,\n file: string | null = null\n): Promise<boolean> {\n let spinnerId: string;\n let scripts: ScriptSkeleton[] = [];\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading scripts...`\n );\n scripts = await readScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${scripts.length} scripts.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading scripts: ${error.response?.data || error.message}`,\n 'fail'\n );\n debugMessage(error);\n debugMessage(`Cli.ScriptOps.listScripts: end [false]`);\n return false;\n }\n if (!long && !usage) {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n debugMessage(`Cli.ScriptOps.listScripts: end [true]`);\n return true;\n }\n let fullExport = null;\n const headers = long\n ? ['Name', 'UUID', 'Language', 'Context', 'Description']\n : ['Name'];\n if (usage) {\n try {\n fullExport = await getFullExportConfig(file);\n } catch (error) {\n printMessage(\n `Error getting full export: ${error.response?.data || error.message}`,\n 'error'\n );\n debugMessage(`Cli.ScriptOps.listScripts: end [false]`);\n return false;\n }\n //Delete scripts from full export so they aren't mistakenly used for determining usage\n delete fullExport.script;\n headers.push('Used');\n }\n const table = createTable(headers);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n const values = long\n ? [\n wordwrap(script.name, 25, ' '),\n script._id,\n langMap[script.language],\n wordwrap(titleCase(script.context.split('_').join(' ')), 25),\n wordwrap(script.description, 30),\n ]\n : [wordwrap(script.name, 25, ' ')];\n if (usage) {\n const isScriptUsed = isIdUsed(fullExport, script._id, false);\n values.push(\n isScriptUsed.used\n ? `${'yes'['brightGreen']} (at ${isScriptUsed.location})`\n : 'no'['brightRed']\n );\n }\n table.push(values);\n });\n printMessage(table.toString(), 'data');\n debugMessage(`Cli.ScriptOps.listScripts: end [true]`);\n return true;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptToFile: start`);\n try {\n showSpinner(`Exporting script '${scriptId}'...`);\n let fileName = getTypedFilename(scriptId, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${scriptId}' to '${filePath}'...`);\n const scriptExport = await exportScript(scriptId);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${scriptId}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [false]`);\n return false;\n}\n\n/**\n * Export script by name to file\n * @param {string} name script name\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);\n try {\n showSpinner(`Exporting script '${name}'...`);\n let fileName = getTypedFilename(name, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${name}' to '${filePath}'...`);\n const scriptExport = await exportScriptByName(name);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${name}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: start`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Scripts`,\n 'script'\n );\n if (file) {\n fileName = file;\n }\n const scriptExport = await exportScripts();\n saveJsonToFile(scriptExport, getFilePath(fileName, true));\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);\n return true;\n } catch (error) {\n printMessage(`Error exporting scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @param extract Extracts the scripts from the exports into separate files if true\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFiles(extract = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const scriptList = await readScripts();\n const barId = createProgressIndicator(\n 'determinate',\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n const fileBarId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting script ${script.name}...`\n );\n updateProgressIndicator(barId, `Reading script ${script.name}`);\n const file = getFilePath(getTypedFilename(script.name, 'script'), true);\n try {\n const scriptExport = await exportScriptByName(script.name);\n if (extract) extractScriptToFile(scriptExport);\n saveJsonToFile(scriptExport, file);\n updateProgressIndicator(fileBarId, `Saving ${script.name} to ${file}.`);\n stopProgressIndicator(fileBarId, `${script.name} saved to ${file}.`);\n } catch (error) {\n outcome = false;\n updateProgressIndicator(barId, `Error exporting ${script.name}.`);\n stopProgressIndicator(\n fileBarId,\n `Error saving ${script.name} to ${file}.`\n );\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressIndicator(\n barId,\n `Exported ${scriptList.length} scripts to individual files.`\n );\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Extracts a script from a script export into a separate file.\n * @param scriptExport The script export\n * @param scriptId The script id (optional if there is only one script in the export)\n * @param directory The directory within the base directory to save the script file\n */\nexport function extractScriptToFile(\n scriptExport: ScriptExportInterface,\n scriptId?: string,\n directory?: string\n) {\n const scriptSkeleton = scriptId\n ? scriptExport.script[scriptId]\n : getScriptSkeleton(scriptExport);\n const fileExtension =\n scriptSkeleton.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n scriptSkeleton.name,\n 'script',\n fileExtension\n );\n const scriptFilePath = getFilePath(\n (directory ? `${directory}/` : '') + scriptFileName,\n true\n );\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n scriptSkeleton.script = `file://${scriptFilePath}`;\n saveTextToFile(scriptText, scriptFilePath);\n}\n\nfunction isScriptExtracted(importData: ScriptExportInterface): boolean {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: start`);\n let extracted = true;\n for (const scriptId of Object.keys(importData.script)) {\n const script = importData.script[scriptId].script;\n if (Array.isArray(script)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is string array`);\n extracted = false;\n break;\n }\n if (isValidUrl(script as string)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is extracted`);\n extracted = true;\n break;\n }\n if (isBase64Encoded) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is base64-encoded`);\n extracted = false;\n break;\n }\n break;\n }\n debugMessage(`Cli.ScriptOps.isScriptExtracted: end [extracted=${extracted}]`);\n return extracted;\n}\n\n/**\n * Import script(s) from file\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {string} file file name\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScriptsFromFile(\n name: string,\n file: string,\n reUuid = false\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n fs.readFile(filePath, 'utf8', async (err, data) => {\n try {\n if (err) throw err;\n const importData: ScriptExportInterface = JSON.parse(data);\n if (isScriptExtracted(importData)) {\n await handleScriptFileImport(filePath, reUuid, false);\n } else {\n await importScripts(name, importData, reUuid);\n }\n outcome = true;\n } catch (error) {\n printMessage(\n `Error exporting script '${name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n });\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param watch whether or not to watch for file changes\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n reUuid: boolean,\n validateScripts: boolean\n) {\n // If watch is true, it doesn't make sense to reUuid.\n reUuid = watch ? false : reUuid;\n\n /**\n * Run on file change detection, as well as on initial run.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async function onChange(path: string, _stats?: fs.Stats): Promise<void> {\n try {\n await handleScriptFileImport(path, reUuid, validateScripts);\n } catch (error) {\n printMessage(`${path}: ${error.message}`, 'error');\n }\n }\n\n // We watch json files and script files.\n const watcher = chokidar.watch(\n [\n `${getWorkingDirectory()}/**/*.script.json`,\n `${getWorkingDirectory()}/**/*.script.js`,\n `${getWorkingDirectory()}/**/*.script.groovy`,\n ],\n {\n persistent: watch,\n }\n );\n\n watcher\n .on('add', onChange)\n .on('change', onChange)\n .on('error', (error) => {\n printMessage(`Watcher error: ${error}`, 'error');\n watcher.close();\n })\n .on('ready', () => {\n if (watch) {\n printMessage('Watching for changes...');\n } else {\n watcher.close();\n printMessage('Done.');\n }\n });\n}\n\n/**\n * Handle a script file import.\n *\n * @param file Either a script file or an extract file\n * @param reUuid whether or not to generate a new uuid for each script on import\n */\nasync function handleScriptFileImport(\n file: string,\n reUuid: boolean,\n validateScripts: boolean\n) {\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: start`);\n const scriptFile = getScriptFile(file);\n const script = getScriptExportByScriptFile(scriptFile);\n\n const imported = await importScripts('', script, reUuid, validateScripts);\n if (imported) {\n printMessage(`Imported '${scriptFile}'`);\n }\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: end`);\n}\n\n/**\n * Get a script file from a file.\n *\n * @param file Either a script file or an extract file\n * @returns The script file\n */\nfunction getScriptFile(file: string) {\n if (file.endsWith('.script.json')) {\n return file;\n }\n return file.replace(/\\.script\\.(js|groovy)/, '.script.json');\n}\n\n/**\n * Get a script export from a script file.\n *\n * @param scriptFile The path to the script file\n * @returns The script export\n */\nfunction getScriptExportByScriptFile(\n scriptFile: string\n): ScriptExportInterface {\n const scriptExport = getScriptExport(scriptFile);\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const extractFile = getExtractFile(scriptSkeleton);\n if (!extractFile) {\n return scriptExport;\n }\n\n const scriptRaw = fs.readFileSync(extractFile, 'utf8');\n scriptSkeleton.script = scriptRaw.split('\\n');\n\n return scriptExport;\n}\n\n/**\n * Get an extract file from a script skeleton.\n *\n * @param scriptSkeleton The script skeleton\n * @returns The extract file or null if there is no extract file\n */\nfunction getExtractFile(scriptSkeleton: ScriptSkeleton): string | null {\n const extractFile = scriptSkeleton.script;\n if (Array.isArray(extractFile)) {\n return null;\n }\n if (\n extractFile.startsWith('file://') &&\n (extractFile.endsWith('.js') || extractFile.endsWith('.groovy'))\n ) {\n return extractFile.replace('file://', '');\n }\n return null;\n}\n\n/**\n * Get a script export from a file.\n *\n * @param file The path to a script export file\n * @returns The script export\n */\nfunction getScriptExport(file: string): ScriptExportInterface {\n const scriptExportRaw = fs.readFileSync(file, 'utf8');\n const scriptExport = JSON.parse(scriptExportRaw) as ScriptExportInterface;\n\n return scriptExport;\n}\n\n/**\n * Get the main script skeleton from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script Get the main script skeleton from a script export\n * @returns The main script skeleton\n */\nfunction getScriptSkeleton(script: ScriptExportInterface): ScriptSkeleton {\n const scriptId = getScriptId(script);\n return script.script[scriptId];\n}\n\n/**\n * Get the main script ID from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script The script export\n * @returns The main script ID\n */\nfunction getScriptId(script: ScriptExportInterface): string {\n const scriptIds = Object.keys(script.script);\n if (scriptIds.length !== 1) {\n throw new Error(`Expected 1 script, found ${scriptIds.length}`);\n }\n return scriptIds[0];\n}\n\n/**\n * Delete script by id\n * @param {String} id script id\n */\nexport async function deleteScriptId(id) {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${id}...`\n );\n try {\n await deleteScript(id);\n stopProgressIndicator(spinnerId, `Deleted ${id}.`, 'success');\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete script by name\n * @param {String} name script name\n */\nexport async function deleteScriptName(name) {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${name}...`\n );\n try {\n await deleteScriptByName(name);\n stopProgressIndicator(spinnerId, `Deleted ${name}.`, 'success');\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all non-default scripts\n */\nexport async function deleteAllScripts() {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all non-default scripts...`\n );\n try {\n await deleteScripts();\n stopProgressIndicator(\n spinnerId,\n `Deleted all non-default scripts.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { frodo, state } from '@rockcarver/frodo-lib';
2
+ import { getFullExportConfig, isIdUsed } from '../utils/Config';
2
3
  import { createKeyValueTable, createProgressIndicator, createTable, debugMessage, printMessage, stopProgressIndicator, updateProgressIndicator } from '../utils/Console';
3
4
  import { getTypedFilename, saveJsonToFile, saveToFile, titleCase } from '../utils/ExportImportUtils';
4
5
  import wordwrap from './utils/Wordwrap';
@@ -25,11 +26,12 @@ const {
25
26
 
26
27
  /**
27
28
  * List secrets
28
- * @param {boolean} long Long version, all the fields
29
+ * @param {boolean} long Long version, all the fields besides usage
30
+ * @param {boolean} usage Display usage field
31
+ * @param {String | null} file Optional filename to determine usage
29
32
  * @returns {Promise<boolean>} true if successful, false otherwise
30
33
  */
31
- export async function listSecrets(long) {
32
- let outcome = false;
34
+ export async function listSecrets(long = false, usage = false, file = null) {
33
35
  let spinnerId;
34
36
  let secrets = [];
35
37
  try {
@@ -40,39 +42,59 @@ export async function listSecrets(long) {
40
42
  } catch (error) {
41
43
  var _error$response;
42
44
  stopProgressIndicator(spinnerId, `Error reading secrets: ${((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data) || error.message}`, 'fail');
45
+ return false;
43
46
  }
44
- if (long) {
45
- const table = createTable(['Id'['brightCyan'], {
46
- hAlign: 'right',
47
- content: 'Active\nVersion'['brightCyan']
48
- }, {
49
- hAlign: 'right',
50
- content: 'Loaded\nVersion'['brightCyan']
51
- }, 'Status'['brightCyan'], 'Description'['brightCyan'], 'Modifier'['brightCyan'], 'Modified (UTC)'['brightCyan']]);
52
- for (const secret of secrets) {
53
- let lastChangedBy = secret.lastChangedBy;
47
+ if (!long && !usage) {
48
+ secrets.forEach(variable => {
49
+ printMessage(variable._id, 'data');
50
+ });
51
+ return true;
52
+ }
53
+ let fullExport = null;
54
+ const headers = long ? ['Id'['brightCyan'], {
55
+ hAlign: 'right',
56
+ content: 'Active\nVersion'['brightCyan']
57
+ }, {
58
+ hAlign: 'right',
59
+ content: 'Loaded\nVersion'['brightCyan']
60
+ }, 'Status'['brightCyan'], 'Description'['brightCyan'], 'Modifier'['brightCyan'], 'Modified (UTC)'['brightCyan']] : ['Id'['brightCyan']];
61
+ if (usage) {
62
+ try {
63
+ fullExport = await getFullExportConfig(file);
64
+ } catch (error) {
65
+ var _error$response2;
66
+ printMessage(`Error getting full export: ${((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data) || error.message}`, 'error');
67
+ return false;
68
+ }
69
+ //Delete secrets from full export so they aren't mistakenly used for determining usage
70
+ delete fullExport.secrets;
71
+ headers.push('Used'['brightCyan']);
72
+ }
73
+ const table = createTable(headers);
74
+ for (const secret of secrets) {
75
+ let lastChangedBy = secret.lastChangedBy;
76
+ if (long) {
54
77
  try {
55
78
  lastChangedBy = state.getUseBearerTokenForAmApis() ? secret.lastChangedBy : await resolveUserName('teammember', secret.lastChangedBy);
56
79
  } catch (error) {
57
80
  // ignore
58
81
  }
59
- table.push([secret._id, {
60
- hAlign: 'right',
61
- content: secret.activeVersion
62
- }, {
63
- hAlign: 'right',
64
- content: secret.loadedVersion
65
- }, secret.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], wordwrap(secret.description, 40), lastChangedBy, new Date(secret.lastChangeDate).toUTCString()]);
66
82
  }
67
- printMessage(table.toString(), 'data');
68
- outcome = true;
69
- } else {
70
- secrets.forEach(secret => {
71
- printMessage(secret._id, 'data');
72
- });
73
- outcome = true;
83
+ const values = long ? [secret._id, {
84
+ hAlign: 'right',
85
+ content: secret.activeVersion
86
+ }, {
87
+ hAlign: 'right',
88
+ content: secret.loadedVersion
89
+ }, secret.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], wordwrap(secret.description, 40), lastChangedBy, new Date(secret.lastChangeDate).toUTCString()] : [secret._id];
90
+ if (usage) {
91
+ const isEsvUsed = isIdUsed(fullExport, secret._id, true);
92
+ values.push(isEsvUsed.used ? `${'yes'['brightGreen']} (at ${isEsvUsed.location})` : 'no'['brightRed']);
93
+ }
94
+ table.push(values);
74
95
  }
75
- return outcome;
96
+ printMessage(table.toString(), 'data');
97
+ return true;
76
98
  }
77
99
 
78
100
  /**
@@ -147,8 +169,8 @@ export async function deleteSecrets() {
147
169
  secrets.sort((a, b) => a._id.localeCompare(b._id));
148
170
  stopProgressIndicator(spinnerId, `Successfully read ${secrets.length} secrets.`, 'success');
149
171
  } catch (error) {
150
- var _error$response2;
151
- stopProgressIndicator(spinnerId, `Error reading secrets: ${((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data) || error.message}`, 'fail');
172
+ var _error$response3;
173
+ stopProgressIndicator(spinnerId, `Error reading secrets: ${((_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.data) || error.message}`, 'fail');
152
174
  }
153
175
  const indicatorId = createProgressIndicator('determinate', secrets.length, `Deleting secrets...`);
154
176
  try {
@@ -182,8 +204,8 @@ export async function listSecretVersions(secretId) {
182
204
  versions = await readVersionsOfSecret(secretId);
183
205
  stopProgressIndicator(spinnerId, `Successfully read ${versions.length} secret versions.`, 'success');
184
206
  } catch (error) {
185
- var _error$response3;
186
- stopProgressIndicator(spinnerId, `Error reading secret versions: ${((_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.data) || error.message}`, 'fail');
207
+ var _error$response4;
208
+ stopProgressIndicator(spinnerId, `Error reading secret versions: ${((_error$response4 = error.response) === null || _error$response4 === void 0 ? void 0 : _error$response4.data) || error.message}`, 'fail');
187
209
  }
188
210
  const table = createTable([{
189
211
  hAlign: 'right',
@@ -219,8 +241,8 @@ export async function describeSecret(secretId) {
219
241
  secret = await readSecret(secretId);
220
242
  stopProgressIndicator(spinnerId, `Successfully read secret ${secretId}.`, 'success');
221
243
  } catch (error) {
222
- var _error$response4;
223
- stopProgressIndicator(spinnerId, `Error reading secret ${secretId}: ${((_error$response4 = error.response) === null || _error$response4 === void 0 ? void 0 : _error$response4.data) || error.message}`, 'fail');
244
+ var _error$response5;
245
+ stopProgressIndicator(spinnerId, `Error reading secret ${secretId}: ${((_error$response5 = error.response) === null || _error$response5 === void 0 ? void 0 : _error$response5.data) || error.message}`, 'fail');
224
246
  }
225
247
  const table = createKeyValueTable();
226
248
  table.push(['Name'['brightCyan'], secret._id]);
@@ -268,8 +290,8 @@ export async function exportSecretToFile(secretId, file) {
268
290
  stopProgressIndicator(spinnerId, `Exported ${secretId['brightCyan']} to ${filePath['brightCyan']}.`, 'success');
269
291
  outcome = true;
270
292
  } catch (error) {
271
- var _error$response5;
272
- stopProgressIndicator(spinnerId, `Error exporting secret: ${((_error$response5 = error.response) === null || _error$response5 === void 0 ? void 0 : _error$response5.data) || error.message}`, 'fail');
293
+ var _error$response6;
294
+ stopProgressIndicator(spinnerId, `Error exporting secret: ${((_error$response6 = error.response) === null || _error$response6 === void 0 ? void 0 : _error$response6.data) || error.message}`, 'fail');
273
295
  }
274
296
  debugMessage(`Cli.SecretsOps.exportSecretToFile: end [outcome=${outcome}, secretId=${secretId}, file=${file}]`);
275
297
  return outcome;
@@ -292,9 +314,9 @@ export async function exportSecretsToFile(file) {
292
314
  saveJsonToFile(secretsExport, getFilePath(fileName, true));
293
315
  outcome = true;
294
316
  } catch (error) {
295
- var _error$response6;
317
+ var _error$response7;
296
318
  printMessage(error.message, 'error');
297
- printMessage(`exportSecretsToFile: ${(_error$response6 = error.response) === null || _error$response6 === void 0 ? void 0 : _error$response6.status}`, 'error');
319
+ printMessage(`exportSecretsToFile: ${(_error$response7 = error.response) === null || _error$response7 === void 0 ? void 0 : _error$response7.status}`, 'error');
298
320
  }
299
321
  debugMessage(`Cli.SecretsOps.exportSecretsToFile: end [file=${file}]`);
300
322
  return outcome;
@@ -313,8 +335,8 @@ export async function exportSecretsToFiles() {
313
335
  secrets.sort((a, b) => a._id.localeCompare(b._id));
314
336
  stopProgressIndicator(spinnerId, `Successfully read ${secrets.length} secrets.`, 'success');
315
337
  } catch (error) {
316
- var _error$response7;
317
- stopProgressIndicator(spinnerId, `Error reading secrets: ${((_error$response7 = error.response) === null || _error$response7 === void 0 ? void 0 : _error$response7.data) || error.message}`, 'fail');
338
+ var _error$response8;
339
+ stopProgressIndicator(spinnerId, `Error reading secrets: ${((_error$response8 = error.response) === null || _error$response8 === void 0 ? void 0 : _error$response8.data) || error.message}`, 'fail');
318
340
  }
319
341
  const indicatorId = createProgressIndicator('determinate', secrets.length, 'Exporting secrets');
320
342
  for (const secret of secrets) {
@@ -1 +1 @@
1
- {"version":3,"file":"SecretsOps.js","names":["frodo","state","createKeyValueTable","createProgressIndicator","createTable","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","getTypedFilename","saveJsonToFile","saveToFile","titleCase","wordwrap","resolveUserName","idm","managed","readSecrets","createSecret","_createSecret","readVersionsOfSecret","readSecret","exportSecret","exportSecrets","enableVersionOfSecret","disableVersionOfSecret","createVersionOfSecret","_createVersionOfSecret","updateSecretDescription","deleteSecret","_deleteSecret","deleteVersionOfSecret","_deleteVersionOfSecret","cloud","secret","getFilePath","utils","listSecrets","long","outcome","spinnerId","secrets","sort","a","b","_id","localeCompare","length","error","_error$response","response","data","message","table","hAlign","content","lastChangedBy","getUseBearerTokenForAmApis","push","activeVersion","loadedVersion","loaded","description","Date","lastChangeDate","toUTCString","toString","forEach","id","value","encoding","useInPlaceholders","code","setSecretDescription","secretId","deleteSecrets","_error$response2","indicatorId","listSecretVersions","versions","_error$response3","statusMap","ENABLED","DISABLED","DESTROYED","version","status","createDate","toLocaleString","describeSecret","_error$response4","exportSecretToFile","file","fileName","filePath","fileData","_error$response5","exportSecretsToFile","getRealm","secretsExport","_error$response6","exportSecretsToFiles","_error$response7","activateVersionOfSecret","deactivateVersionOfSecret"],"sources":["../../src/ops/SecretsOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport {\n SecretEncodingType,\n SecretSkeleton,\n VersionOfSecretSkeleton,\n} from '@rockcarver/frodo-lib/types/api/cloud/SecretsApi';\n\nimport {\n createKeyValueTable,\n createProgressIndicator,\n createTable,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n saveJsonToFile,\n saveToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst { resolveUserName } = frodo.idm.managed;\nconst {\n readSecrets,\n createSecret: _createSecret,\n readVersionsOfSecret,\n readSecret,\n exportSecret,\n exportSecrets,\n enableVersionOfSecret,\n disableVersionOfSecret,\n createVersionOfSecret: _createVersionOfSecret,\n updateSecretDescription,\n deleteSecret: _deleteSecret,\n deleteVersionOfSecret: _deleteVersionOfSecret,\n} = frodo.cloud.secret;\n\nconst { getFilePath } = frodo.utils;\n\n/**\n * List secrets\n * @param {boolean} long Long version, all the fields\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listSecrets(long: boolean): Promise<boolean> {\n let outcome = false;\n let spinnerId: string;\n let secrets: SecretSkeleton[] = [];\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secrets...`\n );\n secrets = await readSecrets();\n secrets.sort((a, b) => a._id.localeCompare(b._id));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${secrets.length} secrets.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secrets: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n if (long) {\n const table = createTable([\n 'Id'['brightCyan'],\n { hAlign: 'right', content: 'Active\\nVersion'['brightCyan'] },\n { hAlign: 'right', content: 'Loaded\\nVersion'['brightCyan'] },\n 'Status'['brightCyan'],\n 'Description'['brightCyan'],\n 'Modifier'['brightCyan'],\n 'Modified (UTC)'['brightCyan'],\n ]);\n for (const secret of secrets) {\n let lastChangedBy = secret.lastChangedBy;\n try {\n lastChangedBy = state.getUseBearerTokenForAmApis()\n ? secret.lastChangedBy\n : await resolveUserName('teammember', secret.lastChangedBy);\n } catch (error) {\n // ignore\n }\n table.push([\n secret._id,\n { hAlign: 'right', content: secret.activeVersion },\n { hAlign: 'right', content: secret.loadedVersion },\n secret.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n wordwrap(secret.description, 40),\n lastChangedBy,\n new Date(secret.lastChangeDate).toUTCString(),\n ]);\n }\n printMessage(table.toString(), 'data');\n outcome = true;\n } else {\n secrets.forEach((secret) => {\n printMessage(secret._id, 'data');\n });\n outcome = true;\n }\n return outcome;\n}\n\n/**\n * Create secret\n * @param {string} id secret id\n * @param {string} value secret value\n * @param {string} description secret description\n * @param {SecretEncodingType} encoding secret encoding\n * @param {boolean} useInPlaceholders use secret in placeholders\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function createSecret(\n id: string,\n value: string,\n description: string,\n encoding: SecretEncodingType,\n useInPlaceholders: boolean\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Creating secret ${id}...`\n );\n try {\n await _createSecret(id, value, description, encoding, useInPlaceholders);\n stopProgressIndicator(spinnerId, `Created secret ${id}`, 'success');\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n error.response\n ? `Error: ${error.response.data.code} - ${error.response.data.message}`\n : error,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Set description of secret\n * @param {string} secretId secret id\n * @param {string} description secret description\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function setSecretDescription(\n secretId: string,\n description: string\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Setting description of secret ${secretId}...`\n );\n try {\n await updateSecretDescription(secretId, description);\n stopProgressIndicator(\n spinnerId,\n `Set description of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete a secret\n * @param {string} secretId secret id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteSecret(secretId: string): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Deleting secret ${secretId}...`\n );\n try {\n await _deleteSecret(secretId);\n stopProgressIndicator(spinnerId, `Deleted secret ${secretId}`, 'success');\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete all secrets\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteSecrets(): Promise<boolean> {\n let outcome = false;\n let secrets: SecretSkeleton[] = [];\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secrets...`\n );\n try {\n secrets = await readSecrets();\n secrets.sort((a, b) => a._id.localeCompare(b._id));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${secrets.length} secrets.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secrets: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n const indicatorId = createProgressIndicator(\n 'determinate',\n secrets.length,\n `Deleting secrets...`\n );\n try {\n for (const secret of secrets) {\n try {\n await _deleteSecret(secret._id);\n updateProgressIndicator(indicatorId, `Deleted secret ${secret._id}`);\n } catch (error) {\n printMessage(\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'error'\n );\n }\n }\n stopProgressIndicator(indicatorId, `Secrets deleted.`);\n outcome = true;\n } catch (error) {\n printMessage(\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'error'\n );\n }\n return outcome;\n}\n\n/**\n * List all the versions of the secret\n * @param {String} secretId secret id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listSecretVersions(secretId): Promise<boolean> {\n let outcome = false;\n let spinnerId: string;\n let versions: VersionOfSecretSkeleton[] = [];\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secret versions...`\n );\n versions = await readVersionsOfSecret(secretId);\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${versions.length} secret versions.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secret versions: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n const table = createTable([\n { hAlign: 'right', content: 'Version'['brightCyan'] },\n 'Status'['brightCyan'],\n 'Loaded'['brightCyan'],\n 'Created'['brightCyan'],\n ]);\n const statusMap = {\n ENABLED: 'active'['brightGreen'],\n DISABLED: 'inactive'['brightRed'],\n DESTROYED: 'deleted'['brightRed'],\n };\n for (const version of versions) {\n table.push([\n { hAlign: 'right', content: version.version },\n statusMap[version.status],\n version.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n new Date(version.createDate).toLocaleString(),\n ]);\n }\n printMessage(table.toString(), 'data');\n outcome = true;\n return outcome;\n}\n\n/**\n * Describe a secret\n * @param {string} secretId Secret id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function describeSecret(secretId: string): Promise<boolean> {\n let outcome = false;\n let spinnerId: string;\n let secret: SecretSkeleton = null;\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secret ${secretId}...`\n );\n secret = await readSecret(secretId);\n stopProgressIndicator(\n spinnerId,\n `Successfully read secret ${secretId}.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secret ${secretId}: ${\n error.response?.data || error.message\n }`,\n 'fail'\n );\n }\n const table = createKeyValueTable();\n table.push(['Name'['brightCyan'], secret._id]);\n table.push(['Active Version'['brightCyan'], secret.activeVersion]);\n table.push(['Loaded Version'['brightCyan'], secret.loadedVersion]);\n table.push([\n 'Status'['brightCyan'],\n secret.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n ]);\n table.push(['Description'['brightCyan'], wordwrap(secret.description, 60)]);\n table.push([\n 'Modified'['brightCyan'],\n new Date(secret.lastChangeDate).toLocaleString(),\n ]);\n let lastChangedBy = secret.lastChangedBy;\n try {\n lastChangedBy = state.getUseBearerTokenForAmApis()\n ? secret.lastChangedBy\n : await resolveUserName('teammember', secret.lastChangedBy);\n } catch (error) {\n // ignore\n }\n table.push(['Modifier'['brightCyan'], lastChangedBy]);\n table.push(['Modifier UUID'['brightCyan'], secret.lastChangedBy]);\n table.push(['Encoding'['brightCyan'], secret.encoding]);\n table.push(['Use In Placeholders'['brightCyan'], secret.useInPlaceholders]);\n printMessage(table.toString(), 'data');\n printMessage('\\nSecret Versions:', 'data');\n await listSecretVersions(secretId);\n outcome = true;\n return outcome;\n}\n\n/**\n * Export a single secret to file\n * @param {String} secretId Secret id\n * @param {String} file Optional filename\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportSecretToFile(\n secretId: string,\n file: string | null\n): Promise<boolean> {\n debugMessage(\n `Cli.SecretsOps.exportSecretToFile: start [secretId=${secretId}, file=${file}]`\n );\n let outcome = false;\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(secretId, 'secret');\n }\n const filePath = getFilePath(fileName, true);\n let spinnerId: string;\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Exporting secret ${secretId}`\n );\n const fileData = await exportSecret(secretId);\n saveJsonToFile(fileData, filePath);\n stopProgressIndicator(\n spinnerId,\n `Exported ${secretId['brightCyan']} to ${filePath['brightCyan']}.`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error exporting secret: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n debugMessage(\n `Cli.SecretsOps.exportSecretToFile: end [outcome=${outcome}, secretId=${secretId}, file=${file}]`\n );\n return outcome;\n}\n\n/**\n * Export all secrets to single file\n * @param {string} file Optional filename\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportSecretsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.SecretsOps.exportSecretsToFile: start [file=${file}]`);\n let outcome = false;\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Secrets`,\n 'secret'\n );\n }\n try {\n const secretsExport = await exportSecrets();\n saveJsonToFile(secretsExport, getFilePath(fileName, true));\n outcome = true;\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(`exportSecretsToFile: ${error.response?.status}`, 'error');\n }\n debugMessage(`Cli.SecretsOps.exportSecretsToFile: end [file=${file}]`);\n return outcome;\n}\n\n/**\n * Export all secrets to individual files\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportSecretsToFiles(): Promise<boolean> {\n let outcome = false;\n let secrets: SecretSkeleton[] = [];\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secrets...`\n );\n try {\n secrets = await readSecrets();\n secrets.sort((a, b) => a._id.localeCompare(b._id));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${secrets.length} secrets.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secrets: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n const indicatorId = createProgressIndicator(\n 'determinate',\n secrets.length,\n 'Exporting secrets'\n );\n for (const secret of secrets) {\n updateProgressIndicator(indicatorId, `Writing secret ${secret._id}`);\n const fileName = getTypedFilename(secret._id, 'secret');\n saveToFile('secret', secret, '_id', getFilePath(fileName, true));\n }\n stopProgressIndicator(indicatorId, `${secrets.length} secrets exported.`);\n outcome = true;\n return outcome;\n}\n\n/**\n * Create new version of secret\n * @param {string} secretId secret id\n * @param {string} value secret value\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function createVersionOfSecret(\n secretId: string,\n value: string\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Creating new version of secret ${secretId}...`\n );\n try {\n const version = await _createVersionOfSecret(secretId, value);\n stopProgressIndicator(\n spinnerId,\n `Created version ${version.version} of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Activate a version of a secret\n * @param {String} secretId secret id\n * @param {Number} version version of secret\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function activateVersionOfSecret(\n secretId,\n version\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Activating version ${version} of secret ${secretId}...`\n );\n try {\n await enableVersionOfSecret(secretId, version);\n stopProgressIndicator(\n spinnerId,\n `Activated version ${version} of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Deactivate a version of a secret\n * @param {String} secretId secret id\n * @param {Number} version version of secret\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deactivateVersionOfSecret(\n secretId,\n version\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Deactivating version ${version} of secret ${secretId}...`\n );\n try {\n await disableVersionOfSecret(secretId, version);\n stopProgressIndicator(\n spinnerId,\n `Deactivated version ${version} of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete version of secret\n * @param {String} secretId secret id\n * @param {Number} version version of secret\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteVersionOfSecret(\n secretId,\n version\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Deleting version ${version} of secret ${secretId}...`\n );\n try {\n await _deleteVersionOfSecret(secretId, version);\n stopProgressIndicator(\n spinnerId,\n `Deleted version ${version} of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SecretsOps.js","names":["frodo","state","getFullExportConfig","isIdUsed","createKeyValueTable","createProgressIndicator","createTable","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","getTypedFilename","saveJsonToFile","saveToFile","titleCase","wordwrap","resolveUserName","idm","managed","readSecrets","createSecret","_createSecret","readVersionsOfSecret","readSecret","exportSecret","exportSecrets","enableVersionOfSecret","disableVersionOfSecret","createVersionOfSecret","_createVersionOfSecret","updateSecretDescription","deleteSecret","_deleteSecret","deleteVersionOfSecret","_deleteVersionOfSecret","cloud","secret","getFilePath","utils","listSecrets","long","usage","file","spinnerId","secrets","sort","a","b","_id","localeCompare","length","error","_error$response","response","data","message","forEach","variable","fullExport","headers","hAlign","content","_error$response2","push","table","lastChangedBy","getUseBearerTokenForAmApis","values","activeVersion","loadedVersion","loaded","description","Date","lastChangeDate","toUTCString","isEsvUsed","used","location","toString","id","value","encoding","useInPlaceholders","outcome","code","setSecretDescription","secretId","deleteSecrets","_error$response3","indicatorId","listSecretVersions","versions","_error$response4","statusMap","ENABLED","DISABLED","DESTROYED","version","status","createDate","toLocaleString","describeSecret","_error$response5","exportSecretToFile","fileName","filePath","fileData","_error$response6","exportSecretsToFile","getRealm","secretsExport","_error$response7","exportSecretsToFiles","_error$response8","activateVersionOfSecret","deactivateVersionOfSecret"],"sources":["../../src/ops/SecretsOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport {\n SecretEncodingType,\n SecretSkeleton,\n VersionOfSecretSkeleton,\n} from '@rockcarver/frodo-lib/types/api/cloud/SecretsApi';\n\nimport { getFullExportConfig, isIdUsed } from '../utils/Config';\nimport {\n createKeyValueTable,\n createProgressIndicator,\n createTable,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n saveJsonToFile,\n saveToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst { resolveUserName } = frodo.idm.managed;\nconst {\n readSecrets,\n createSecret: _createSecret,\n readVersionsOfSecret,\n readSecret,\n exportSecret,\n exportSecrets,\n enableVersionOfSecret,\n disableVersionOfSecret,\n createVersionOfSecret: _createVersionOfSecret,\n updateSecretDescription,\n deleteSecret: _deleteSecret,\n deleteVersionOfSecret: _deleteVersionOfSecret,\n} = frodo.cloud.secret;\n\nconst { getFilePath } = frodo.utils;\n\n/**\n * List secrets\n * @param {boolean} long Long version, all the fields besides usage\n * @param {boolean} usage Display usage field\n * @param {String | null} file Optional filename to determine usage\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listSecrets(\n long: boolean = false,\n usage: boolean = false,\n file: string | null = null\n): Promise<boolean> {\n let spinnerId: string;\n let secrets: SecretSkeleton[] = [];\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secrets...`\n );\n secrets = await readSecrets();\n secrets.sort((a, b) => a._id.localeCompare(b._id));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${secrets.length} secrets.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secrets: ${error.response?.data || error.message}`,\n 'fail'\n );\n return false;\n }\n if (!long && !usage) {\n secrets.forEach((variable) => {\n printMessage(variable._id, 'data');\n });\n return true;\n }\n let fullExport = null;\n const headers = long\n ? [\n 'Id'['brightCyan'],\n { hAlign: 'right', content: 'Active\\nVersion'['brightCyan'] },\n { hAlign: 'right', content: 'Loaded\\nVersion'['brightCyan'] },\n 'Status'['brightCyan'],\n 'Description'['brightCyan'],\n 'Modifier'['brightCyan'],\n 'Modified (UTC)'['brightCyan'],\n ]\n : ['Id'['brightCyan']];\n if (usage) {\n try {\n fullExport = await getFullExportConfig(file);\n } catch (error) {\n printMessage(\n `Error getting full export: ${error.response?.data || error.message}`,\n 'error'\n );\n return false;\n }\n //Delete secrets from full export so they aren't mistakenly used for determining usage\n delete fullExport.secrets;\n headers.push('Used'['brightCyan']);\n }\n const table = createTable(headers);\n for (const secret of secrets) {\n let lastChangedBy = secret.lastChangedBy;\n if (long) {\n try {\n lastChangedBy = state.getUseBearerTokenForAmApis()\n ? secret.lastChangedBy\n : await resolveUserName('teammember', secret.lastChangedBy);\n } catch (error) {\n // ignore\n }\n }\n const values = long\n ? [\n secret._id,\n { hAlign: 'right', content: secret.activeVersion },\n { hAlign: 'right', content: secret.loadedVersion },\n secret.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n wordwrap(secret.description, 40),\n lastChangedBy,\n new Date(secret.lastChangeDate).toUTCString(),\n ]\n : [secret._id];\n if (usage) {\n const isEsvUsed = isIdUsed(fullExport, secret._id, true);\n values.push(\n isEsvUsed.used\n ? `${'yes'['brightGreen']} (at ${isEsvUsed.location})`\n : 'no'['brightRed']\n );\n }\n table.push(values);\n }\n printMessage(table.toString(), 'data');\n return true;\n}\n\n/**\n * Create secret\n * @param {string} id secret id\n * @param {string} value secret value\n * @param {string} description secret description\n * @param {SecretEncodingType} encoding secret encoding\n * @param {boolean} useInPlaceholders use secret in placeholders\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function createSecret(\n id: string,\n value: string,\n description: string,\n encoding: SecretEncodingType,\n useInPlaceholders: boolean\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Creating secret ${id}...`\n );\n try {\n await _createSecret(id, value, description, encoding, useInPlaceholders);\n stopProgressIndicator(spinnerId, `Created secret ${id}`, 'success');\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n error.response\n ? `Error: ${error.response.data.code} - ${error.response.data.message}`\n : error,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Set description of secret\n * @param {string} secretId secret id\n * @param {string} description secret description\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function setSecretDescription(\n secretId: string,\n description: string\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Setting description of secret ${secretId}...`\n );\n try {\n await updateSecretDescription(secretId, description);\n stopProgressIndicator(\n spinnerId,\n `Set description of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete a secret\n * @param {string} secretId secret id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteSecret(secretId: string): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Deleting secret ${secretId}...`\n );\n try {\n await _deleteSecret(secretId);\n stopProgressIndicator(spinnerId, `Deleted secret ${secretId}`, 'success');\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete all secrets\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteSecrets(): Promise<boolean> {\n let outcome = false;\n let secrets: SecretSkeleton[] = [];\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secrets...`\n );\n try {\n secrets = await readSecrets();\n secrets.sort((a, b) => a._id.localeCompare(b._id));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${secrets.length} secrets.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secrets: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n const indicatorId = createProgressIndicator(\n 'determinate',\n secrets.length,\n `Deleting secrets...`\n );\n try {\n for (const secret of secrets) {\n try {\n await _deleteSecret(secret._id);\n updateProgressIndicator(indicatorId, `Deleted secret ${secret._id}`);\n } catch (error) {\n printMessage(\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'error'\n );\n }\n }\n stopProgressIndicator(indicatorId, `Secrets deleted.`);\n outcome = true;\n } catch (error) {\n printMessage(\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'error'\n );\n }\n return outcome;\n}\n\n/**\n * List all the versions of the secret\n * @param {String} secretId secret id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listSecretVersions(secretId): Promise<boolean> {\n let outcome = false;\n let spinnerId: string;\n let versions: VersionOfSecretSkeleton[] = [];\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secret versions...`\n );\n versions = await readVersionsOfSecret(secretId);\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${versions.length} secret versions.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secret versions: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n const table = createTable([\n { hAlign: 'right', content: 'Version'['brightCyan'] },\n 'Status'['brightCyan'],\n 'Loaded'['brightCyan'],\n 'Created'['brightCyan'],\n ]);\n const statusMap = {\n ENABLED: 'active'['brightGreen'],\n DISABLED: 'inactive'['brightRed'],\n DESTROYED: 'deleted'['brightRed'],\n };\n for (const version of versions) {\n table.push([\n { hAlign: 'right', content: version.version },\n statusMap[version.status],\n version.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n new Date(version.createDate).toLocaleString(),\n ]);\n }\n printMessage(table.toString(), 'data');\n outcome = true;\n return outcome;\n}\n\n/**\n * Describe a secret\n * @param {string} secretId Secret id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function describeSecret(secretId: string): Promise<boolean> {\n let outcome = false;\n let spinnerId: string;\n let secret: SecretSkeleton = null;\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secret ${secretId}...`\n );\n secret = await readSecret(secretId);\n stopProgressIndicator(\n spinnerId,\n `Successfully read secret ${secretId}.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secret ${secretId}: ${\n error.response?.data || error.message\n }`,\n 'fail'\n );\n }\n const table = createKeyValueTable();\n table.push(['Name'['brightCyan'], secret._id]);\n table.push(['Active Version'['brightCyan'], secret.activeVersion]);\n table.push(['Loaded Version'['brightCyan'], secret.loadedVersion]);\n table.push([\n 'Status'['brightCyan'],\n secret.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n ]);\n table.push(['Description'['brightCyan'], wordwrap(secret.description, 60)]);\n table.push([\n 'Modified'['brightCyan'],\n new Date(secret.lastChangeDate).toLocaleString(),\n ]);\n let lastChangedBy = secret.lastChangedBy;\n try {\n lastChangedBy = state.getUseBearerTokenForAmApis()\n ? secret.lastChangedBy\n : await resolveUserName('teammember', secret.lastChangedBy);\n } catch (error) {\n // ignore\n }\n table.push(['Modifier'['brightCyan'], lastChangedBy]);\n table.push(['Modifier UUID'['brightCyan'], secret.lastChangedBy]);\n table.push(['Encoding'['brightCyan'], secret.encoding]);\n table.push(['Use In Placeholders'['brightCyan'], secret.useInPlaceholders]);\n printMessage(table.toString(), 'data');\n printMessage('\\nSecret Versions:', 'data');\n await listSecretVersions(secretId);\n outcome = true;\n return outcome;\n}\n\n/**\n * Export a single secret to file\n * @param {String} secretId Secret id\n * @param {String} file Optional filename\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportSecretToFile(\n secretId: string,\n file: string | null\n): Promise<boolean> {\n debugMessage(\n `Cli.SecretsOps.exportSecretToFile: start [secretId=${secretId}, file=${file}]`\n );\n let outcome = false;\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(secretId, 'secret');\n }\n const filePath = getFilePath(fileName, true);\n let spinnerId: string;\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Exporting secret ${secretId}`\n );\n const fileData = await exportSecret(secretId);\n saveJsonToFile(fileData, filePath);\n stopProgressIndicator(\n spinnerId,\n `Exported ${secretId['brightCyan']} to ${filePath['brightCyan']}.`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error exporting secret: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n debugMessage(\n `Cli.SecretsOps.exportSecretToFile: end [outcome=${outcome}, secretId=${secretId}, file=${file}]`\n );\n return outcome;\n}\n\n/**\n * Export all secrets to single file\n * @param {string} file Optional filename\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportSecretsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.SecretsOps.exportSecretsToFile: start [file=${file}]`);\n let outcome = false;\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Secrets`,\n 'secret'\n );\n }\n try {\n const secretsExport = await exportSecrets();\n saveJsonToFile(secretsExport, getFilePath(fileName, true));\n outcome = true;\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(`exportSecretsToFile: ${error.response?.status}`, 'error');\n }\n debugMessage(`Cli.SecretsOps.exportSecretsToFile: end [file=${file}]`);\n return outcome;\n}\n\n/**\n * Export all secrets to individual files\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportSecretsToFiles(): Promise<boolean> {\n let outcome = false;\n let secrets: SecretSkeleton[] = [];\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading secrets...`\n );\n try {\n secrets = await readSecrets();\n secrets.sort((a, b) => a._id.localeCompare(b._id));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${secrets.length} secrets.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading secrets: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n const indicatorId = createProgressIndicator(\n 'determinate',\n secrets.length,\n 'Exporting secrets'\n );\n for (const secret of secrets) {\n updateProgressIndicator(indicatorId, `Writing secret ${secret._id}`);\n const fileName = getTypedFilename(secret._id, 'secret');\n saveToFile('secret', secret, '_id', getFilePath(fileName, true));\n }\n stopProgressIndicator(indicatorId, `${secrets.length} secrets exported.`);\n outcome = true;\n return outcome;\n}\n\n/**\n * Create new version of secret\n * @param {string} secretId secret id\n * @param {string} value secret value\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function createVersionOfSecret(\n secretId: string,\n value: string\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Creating new version of secret ${secretId}...`\n );\n try {\n const version = await _createVersionOfSecret(secretId, value);\n stopProgressIndicator(\n spinnerId,\n `Created version ${version.version} of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Activate a version of a secret\n * @param {String} secretId secret id\n * @param {Number} version version of secret\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function activateVersionOfSecret(\n secretId,\n version\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Activating version ${version} of secret ${secretId}...`\n );\n try {\n await enableVersionOfSecret(secretId, version);\n stopProgressIndicator(\n spinnerId,\n `Activated version ${version} of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Deactivate a version of a secret\n * @param {String} secretId secret id\n * @param {Number} version version of secret\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deactivateVersionOfSecret(\n secretId,\n version\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Deactivating version ${version} of secret ${secretId}...`\n );\n try {\n await disableVersionOfSecret(secretId, version);\n stopProgressIndicator(\n spinnerId,\n `Deactivated version ${version} of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete version of secret\n * @param {String} secretId secret id\n * @param {Number} version version of secret\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteVersionOfSecret(\n secretId,\n version\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Deleting version ${version} of secret ${secretId}...`\n );\n try {\n await _deleteVersionOfSecret(secretId, version);\n stopProgressIndicator(\n spinnerId,\n `Deleted version ${version} of secret ${secretId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { frodo, state } from '@rockcarver/frodo-lib';
2
+ import { getFullExportConfig, isIdUsed } from '../utils/Config';
2
3
  import { createKeyValueTable, createProgressIndicator, createTable, debugMessage, printMessage, stopProgressIndicator, updateProgressIndicator } from '../utils/Console';
3
4
  import { getTypedFilename, saveJsonToFile, saveToFile, titleCase } from '../utils/ExportImportUtils';
4
5
  import wordwrap from './utils/Wordwrap';
@@ -21,11 +22,12 @@ const {
21
22
 
22
23
  /**
23
24
  * List variables
24
- * @param {boolean} long Long version, all the fields
25
+ * @param {boolean} long Long version, all the fields besides usage
26
+ * @param {boolean} usage Display usage field
27
+ * @param {String | null} file Optional filename to determine usage
25
28
  * @returns {Promise<boolean>} true if successful, false otherwise
26
29
  */
27
- export async function listVariables(long) {
28
- let outcome = false;
30
+ export async function listVariables(long = false, usage = false, file = null) {
29
31
  let spinnerId;
30
32
  let variables = [];
31
33
  try {
@@ -36,21 +38,39 @@ export async function listVariables(long) {
36
38
  } catch (error) {
37
39
  var _error$response;
38
40
  stopProgressIndicator(spinnerId, `Error reading variables: ${((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data) || error.message}`, 'fail');
41
+ return false;
39
42
  }
40
- if (long) {
41
- const table = createTable(['Id'['brightCyan'], 'Value'['brightCyan'], 'Status'['brightCyan'], 'Description'['brightCyan'], 'Modifier'['brightCyan'], 'Modified (UTC)'['brightCyan']]);
42
- for (const variable of variables) {
43
- table.push([variable._id, wordwrap(decodeBase64(variable.valueBase64), 40), variable.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], wordwrap(variable.description, 40), state.getUseBearerTokenForAmApis() ? variable.lastChangedBy : await resolvePerpetratorUuid(variable.lastChangedBy), new Date(variable.lastChangeDate).toUTCString()]);
44
- }
45
- printMessage(table.toString(), 'data');
46
- outcome = true;
47
- } else {
43
+ if (!long && !usage) {
48
44
  variables.forEach(variable => {
49
45
  printMessage(variable._id, 'data');
50
46
  });
51
- outcome = true;
47
+ return true;
52
48
  }
53
- return outcome;
49
+ let fullExport = null;
50
+ const headers = long ? ['Id'['brightCyan'], 'Value'['brightCyan'], 'Status'['brightCyan'], 'Description'['brightCyan'], 'Modifier'['brightCyan'], 'Modified (UTC)'['brightCyan']] : ['Id'['brightCyan']];
51
+ if (usage) {
52
+ try {
53
+ fullExport = await getFullExportConfig(file);
54
+ } catch (error) {
55
+ var _error$response2;
56
+ printMessage(`Error getting full export: ${((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data) || error.message}`, 'error');
57
+ return false;
58
+ }
59
+ //Delete variables from full export so they aren't mistakenly used for determining usage
60
+ delete fullExport.variables;
61
+ headers.push('Used'['brightCyan']);
62
+ }
63
+ const table = createTable(headers);
64
+ for (const variable of variables) {
65
+ const values = long ? [variable._id, wordwrap(decodeBase64(variable.valueBase64), 40), variable.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'], wordwrap(variable.description, 40), state.getUseBearerTokenForAmApis() ? variable.lastChangedBy : await resolvePerpetratorUuid(variable.lastChangedBy), new Date(variable.lastChangeDate).toUTCString()] : [variable._id];
66
+ if (usage) {
67
+ const isEsvUsed = isIdUsed(fullExport, variable._id, true);
68
+ values.push(isEsvUsed.used ? `${'yes'['brightGreen']} (at ${isEsvUsed.location})` : 'no'['brightRed']);
69
+ }
70
+ table.push(values);
71
+ }
72
+ printMessage(table.toString(), 'data');
73
+ return true;
54
74
  }
55
75
 
56
76
  /**
@@ -250,8 +270,8 @@ export async function exportVariablesToFile(file, noDecode) {
250
270
  stopProgressIndicator(spinnerId, `Exported variables to ${file}`, 'success');
251
271
  outcome = true;
252
272
  } catch (error) {
253
- var _error$response2;
254
- stopProgressIndicator(spinnerId, `Error exporting variables: ${((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) || error.message}`, 'fail');
273
+ var _error$response3;
274
+ stopProgressIndicator(spinnerId, `Error exporting variables: ${((_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.status) || error.message}`, 'fail');
255
275
  }
256
276
  debugMessage(`Cli.VariablesOps.exportVariablesToFile: end [outcome=${outcome}, file=${file}]`);
257
277
  return outcome;
@@ -1 +1 @@
1
- {"version":3,"file":"VariablesOps.js","names":["frodo","state","createKeyValueTable","createProgressIndicator","createTable","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","getTypedFilename","saveJsonToFile","saveToFile","titleCase","wordwrap","decodeBase64","getFilePath","utils","resolvePerpetratorUuid","idm","managed","readVariables","readVariable","exportVariable","exportVariables","deleteVariable","updateVariableDescription","updateVariable","_updateVariable","cloud","variable","listVariables","long","outcome","spinnerId","variables","sort","a","b","_id","localeCompare","length","error","_error$response","response","data","message","table","push","valueBase64","loaded","description","getUseBearerTokenForAmApis","lastChangedBy","Date","lastChangeDate","toUTCString","toString","forEach","createVariable","variableId","value","type","code","setVariableDescription","deleteVariableById","deleteVariables","indicatorId","describeVariable","json","expressionType","toLocaleString","modifierName","exportVariableToFile","file","noDecode","fileName","filePath","fileData","brightCyan","err","exportVariablesToFile","getRealm","variablesExport","_error$response2","status","exportVariablesToFiles","variableList"],"sources":["../../src/ops/VariablesOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport {\n VariableExpressionType,\n VariableSkeleton,\n} from '@rockcarver/frodo-lib/types/api/cloud/VariablesApi';\n\nimport {\n createKeyValueTable,\n createProgressIndicator,\n createTable,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n saveJsonToFile,\n saveToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst { decodeBase64, getFilePath } = frodo.utils;\nconst { resolvePerpetratorUuid } = frodo.idm.managed;\nconst {\n readVariables,\n readVariable,\n exportVariable,\n exportVariables,\n deleteVariable,\n updateVariableDescription,\n updateVariable: _updateVariable,\n} = frodo.cloud.variable;\n\n/**\n * List variables\n * @param {boolean} long Long version, all the fields\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listVariables(long: boolean): Promise<boolean> {\n let outcome = false;\n let spinnerId: string;\n let variables: VariableSkeleton[] = [];\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading variables...`\n );\n variables = await readVariables();\n variables.sort((a, b) => a._id.localeCompare(b._id));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${variables.length} variables.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading variables: ${error.response?.data || error.message}`,\n 'fail'\n );\n }\n if (long) {\n const table = createTable([\n 'Id'['brightCyan'],\n 'Value'['brightCyan'],\n 'Status'['brightCyan'],\n 'Description'['brightCyan'],\n 'Modifier'['brightCyan'],\n 'Modified (UTC)'['brightCyan'],\n ]);\n for (const variable of variables) {\n table.push([\n variable._id,\n wordwrap(decodeBase64(variable.valueBase64), 40),\n variable.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n wordwrap(variable.description, 40),\n state.getUseBearerTokenForAmApis()\n ? variable.lastChangedBy\n : await resolvePerpetratorUuid(variable.lastChangedBy),\n new Date(variable.lastChangeDate).toUTCString(),\n ]);\n }\n printMessage(table.toString(), 'data');\n outcome = true;\n } else {\n variables.forEach((variable) => {\n printMessage(variable._id, 'data');\n });\n outcome = true;\n }\n return outcome;\n}\n\n/**\n * Create variable\n * @param {string} variableId variable id\n * @param {string} value variable value\n * @param {string} description variable description\n * @param {VariableExpressionType} type variable type\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function createVariable(\n variableId: string,\n value: string,\n description: string,\n type: VariableExpressionType = 'string'\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Creating variable ${variableId}...`\n );\n try {\n await _updateVariable(variableId, value, description, type);\n stopProgressIndicator(\n spinnerId,\n `Created variable ${variableId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n error.response\n ? `Error: ${error.response.data.code} - ${error.response.data.message}`\n : error,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Update variable\n * @param {string} variableId variable id\n * @param {string} value variable value\n * @param {string} description variable description\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function updateVariable(variableId, value, description) {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Updating variable ${variableId}...`\n );\n try {\n await _updateVariable(variableId, value, description);\n stopProgressIndicator(\n spinnerId,\n `Updated variable ${variableId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Set description of variable\n * @param {string} variableId variable id\n * @param {string} description variable description\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function setVariableDescription(variableId, description) {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Setting description of variable ${variableId}...`\n );\n try {\n await updateVariableDescription(variableId, description);\n stopProgressIndicator(\n spinnerId,\n `Set description of variable ${variableId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete a variable\n * @param {string} variableId variable id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteVariableById(variableId) {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Deleting variable ${variableId}...`\n );\n try {\n await deleteVariable(variableId);\n stopProgressIndicator(\n spinnerId,\n `Deleted variable ${variableId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete all variables\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteVariables() {\n let outcome = false;\n let indicatorId: string;\n try {\n const variables = await readVariables();\n indicatorId = createProgressIndicator(\n 'determinate',\n variables.length,\n `Deleting variable...`\n );\n for (const variable of variables) {\n try {\n await deleteVariable(variable._id);\n updateProgressIndicator(\n indicatorId,\n `Deleted variable ${variable._id}`\n );\n } catch (error) {\n printMessage(\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'error'\n );\n }\n }\n outcome = true;\n stopProgressIndicator(indicatorId, `Variables deleted.`);\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`\n );\n printMessage(\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'error'\n );\n }\n return outcome;\n}\n\n/**\n * Describe a variable\n * @param {string} variableId variable id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function describeVariable(variableId, json = false) {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Describing variable ${variableId}...`\n );\n try {\n const variable = await readVariable(variableId);\n stopProgressIndicator(\n spinnerId,\n `Successfully retrieved variable ${variableId}`,\n 'success'\n );\n if (json) {\n printMessage(variable, 'data');\n } else {\n const table = createKeyValueTable();\n table.push(['Name'['brightCyan'], variable._id]);\n table.push([\n 'Value'['brightCyan'],\n wordwrap(decodeBase64(variable.valueBase64), 40),\n ]);\n table.push(['Type'['brightCyan'], variable.expressionType]);\n table.push([\n 'Status'['brightCyan'],\n variable.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n ]);\n table.push([\n 'Description'['brightCyan'],\n wordwrap(variable.description, 60),\n ]);\n table.push([\n 'Modified'['brightCyan'],\n new Date(variable.lastChangeDate).toLocaleString(),\n ]);\n let modifierName: string;\n try {\n modifierName = await resolvePerpetratorUuid(variable.lastChangedBy);\n } catch (error) {\n // ignore\n }\n if (modifierName && modifierName !== variable.lastChangedBy) {\n table.push(['Modifier'['brightCyan'], modifierName]);\n }\n table.push(['Modifier UUID'['brightCyan'], variable.lastChangedBy]);\n printMessage(table.toString(), 'data');\n }\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error describing variable ${variableId}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Export a single variable to file\n * @param {String} variableId Variable id\n * @param {String} file Optional filename\n * @param {boolean} noDecode Do not include decoded variable value in export\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportVariableToFile(\n variableId: string,\n file: string | null,\n noDecode: boolean\n) {\n debugMessage(\n `Cli.VariablesOps.exportVariableToFile: start [variableId=${variableId}, file=${file}]`\n );\n let outcome = false;\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(variableId, 'variable');\n }\n const filePath = getFilePath(fileName, true);\n let indicatorId: string;\n try {\n indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting variable ${variableId}`\n );\n const fileData = await exportVariable(variableId, noDecode);\n saveJsonToFile(fileData, filePath);\n updateProgressIndicator(indicatorId, `Exported variable ${variableId}`);\n stopProgressIndicator(\n indicatorId,\n // @ts-expect-error - brightCyan colors the string, even though it is not a property of string\n `Exported ${variableId.brightCyan} to ${filePath.brightCyan}.`\n );\n outcome = true;\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(err, 'error');\n }\n debugMessage(\n `Cli.VariablesOps.exportVariableToFile: end [variableId=${variableId}, file=${file}]`\n );\n return outcome;\n}\n\n/**\n * Export all variables to single file\n * @param {string} file Optional filename\n * @param {boolean} noDecode Do not include decoded variable value in export\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportVariablesToFile(\n file: string | null,\n noDecode: boolean\n) {\n debugMessage(`Cli.VariablesOps.exportVariablesToFile: start [file=${file}]`);\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Exporting variables...`\n );\n if (!file) {\n file = getTypedFilename(\n `all${titleCase(state.getRealm())}Variables`,\n 'variable'\n );\n }\n try {\n const variablesExport = await exportVariables(noDecode);\n saveJsonToFile(variablesExport, getFilePath(file, true));\n stopProgressIndicator(\n spinnerId,\n `Exported variables to ${file}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error exporting variables: ${error.response?.status || error.message}`,\n 'fail'\n );\n }\n debugMessage(\n `Cli.VariablesOps.exportVariablesToFile: end [outcome=${outcome}, file=${file}]`\n );\n return outcome;\n}\n\n/**\n * Export all variables to seperate files\n * @param {boolean} noDecode Do not include decoded variable value in export\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportVariablesToFiles(noDecode: boolean) {\n let outcome = false;\n let spinnerId: string;\n let indicatorId: string;\n let variableList: VariableSkeleton[] = [];\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Retrieving variables...`\n );\n variableList = await readVariables();\n stopProgressIndicator(\n spinnerId,\n `Successfully retrieved ${variableList.length} variables`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error retrieving variables: ${error.message}`,\n 'fail'\n );\n }\n try {\n const indicatorId = createProgressIndicator(\n 'determinate',\n variableList.length,\n 'Exporting variables'\n );\n for (const variable of variableList) {\n if (!noDecode) {\n variable.value = decodeBase64(variable.valueBase64);\n }\n updateProgressIndicator(indicatorId, `Writing variable ${variable._id}`);\n const fileName = getTypedFilename(variable._id, 'variable');\n saveToFile('variable', variable, '_id', getFilePath(fileName, true));\n }\n stopProgressIndicator(\n indicatorId,\n `${variableList.length} variables exported`\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error exporting variables: ${error.message}`\n );\n }\n return outcome;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VariablesOps.js","names":["frodo","state","getFullExportConfig","isIdUsed","createKeyValueTable","createProgressIndicator","createTable","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","getTypedFilename","saveJsonToFile","saveToFile","titleCase","wordwrap","decodeBase64","getFilePath","utils","resolvePerpetratorUuid","idm","managed","readVariables","readVariable","exportVariable","exportVariables","deleteVariable","updateVariableDescription","updateVariable","_updateVariable","cloud","variable","listVariables","long","usage","file","spinnerId","variables","sort","a","b","_id","localeCompare","length","error","_error$response","response","data","message","forEach","fullExport","headers","_error$response2","push","table","values","valueBase64","loaded","description","getUseBearerTokenForAmApis","lastChangedBy","Date","lastChangeDate","toUTCString","isEsvUsed","used","location","toString","createVariable","variableId","value","type","outcome","code","setVariableDescription","deleteVariableById","deleteVariables","indicatorId","describeVariable","json","expressionType","toLocaleString","modifierName","exportVariableToFile","noDecode","fileName","filePath","fileData","brightCyan","err","exportVariablesToFile","getRealm","variablesExport","_error$response3","status","exportVariablesToFiles","variableList"],"sources":["../../src/ops/VariablesOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport {\n VariableExpressionType,\n VariableSkeleton,\n} from '@rockcarver/frodo-lib/types/api/cloud/VariablesApi';\n\nimport { getFullExportConfig, isIdUsed } from '../utils/Config';\nimport {\n createKeyValueTable,\n createProgressIndicator,\n createTable,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n saveJsonToFile,\n saveToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst { decodeBase64, getFilePath } = frodo.utils;\nconst { resolvePerpetratorUuid } = frodo.idm.managed;\nconst {\n readVariables,\n readVariable,\n exportVariable,\n exportVariables,\n deleteVariable,\n updateVariableDescription,\n updateVariable: _updateVariable,\n} = frodo.cloud.variable;\n\n/**\n * List variables\n * @param {boolean} long Long version, all the fields besides usage\n * @param {boolean} usage Display usage field\n * @param {String | null} file Optional filename to determine usage\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listVariables(\n long: boolean = false,\n usage: boolean = false,\n file: string | null = null\n): Promise<boolean> {\n let spinnerId: string;\n let variables: VariableSkeleton[] = [];\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading variables...`\n );\n variables = await readVariables();\n variables.sort((a, b) => a._id.localeCompare(b._id));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${variables.length} variables.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error reading variables: ${error.response?.data || error.message}`,\n 'fail'\n );\n return false;\n }\n if (!long && !usage) {\n variables.forEach((variable) => {\n printMessage(variable._id, 'data');\n });\n return true;\n }\n let fullExport = null;\n const headers = long\n ? [\n 'Id'['brightCyan'],\n 'Value'['brightCyan'],\n 'Status'['brightCyan'],\n 'Description'['brightCyan'],\n 'Modifier'['brightCyan'],\n 'Modified (UTC)'['brightCyan'],\n ]\n : ['Id'['brightCyan']];\n if (usage) {\n try {\n fullExport = await getFullExportConfig(file);\n } catch (error) {\n printMessage(\n `Error getting full export: ${error.response?.data || error.message}`,\n 'error'\n );\n return false;\n }\n //Delete variables from full export so they aren't mistakenly used for determining usage\n delete fullExport.variables;\n headers.push('Used'['brightCyan']);\n }\n const table = createTable(headers);\n for (const variable of variables) {\n const values = long\n ? [\n variable._id,\n wordwrap(decodeBase64(variable.valueBase64), 40),\n variable.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n wordwrap(variable.description, 40),\n state.getUseBearerTokenForAmApis()\n ? variable.lastChangedBy\n : await resolvePerpetratorUuid(variable.lastChangedBy),\n new Date(variable.lastChangeDate).toUTCString(),\n ]\n : [variable._id];\n if (usage) {\n const isEsvUsed = isIdUsed(fullExport, variable._id, true);\n values.push(\n isEsvUsed.used\n ? `${'yes'['brightGreen']} (at ${isEsvUsed.location})`\n : 'no'['brightRed']\n );\n }\n table.push(values);\n }\n printMessage(table.toString(), 'data');\n return true;\n}\n\n/**\n * Create variable\n * @param {string} variableId variable id\n * @param {string} value variable value\n * @param {string} description variable description\n * @param {VariableExpressionType} type variable type\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function createVariable(\n variableId: string,\n value: string,\n description: string,\n type: VariableExpressionType = 'string'\n): Promise<boolean> {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Creating variable ${variableId}...`\n );\n try {\n await _updateVariable(variableId, value, description, type);\n stopProgressIndicator(\n spinnerId,\n `Created variable ${variableId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n error.response\n ? `Error: ${error.response.data.code} - ${error.response.data.message}`\n : error,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Update variable\n * @param {string} variableId variable id\n * @param {string} value variable value\n * @param {string} description variable description\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function updateVariable(variableId, value, description) {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Updating variable ${variableId}...`\n );\n try {\n await _updateVariable(variableId, value, description);\n stopProgressIndicator(\n spinnerId,\n `Updated variable ${variableId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Set description of variable\n * @param {string} variableId variable id\n * @param {string} description variable description\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function setVariableDescription(variableId, description) {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Setting description of variable ${variableId}...`\n );\n try {\n await updateVariableDescription(variableId, description);\n stopProgressIndicator(\n spinnerId,\n `Set description of variable ${variableId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete a variable\n * @param {string} variableId variable id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteVariableById(variableId) {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Deleting variable ${variableId}...`\n );\n try {\n await deleteVariable(variableId);\n stopProgressIndicator(\n spinnerId,\n `Deleted variable ${variableId}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Delete all variables\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteVariables() {\n let outcome = false;\n let indicatorId: string;\n try {\n const variables = await readVariables();\n indicatorId = createProgressIndicator(\n 'determinate',\n variables.length,\n `Deleting variable...`\n );\n for (const variable of variables) {\n try {\n await deleteVariable(variable._id);\n updateProgressIndicator(\n indicatorId,\n `Deleted variable ${variable._id}`\n );\n } catch (error) {\n printMessage(\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'error'\n );\n }\n }\n outcome = true;\n stopProgressIndicator(indicatorId, `Variables deleted.`);\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error: ${error.response.data.code} - ${error.response.data.message}`\n );\n printMessage(\n `Error: ${error.response.data.code} - ${error.response.data.message}`,\n 'error'\n );\n }\n return outcome;\n}\n\n/**\n * Describe a variable\n * @param {string} variableId variable id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function describeVariable(variableId, json = false) {\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Describing variable ${variableId}...`\n );\n try {\n const variable = await readVariable(variableId);\n stopProgressIndicator(\n spinnerId,\n `Successfully retrieved variable ${variableId}`,\n 'success'\n );\n if (json) {\n printMessage(variable, 'data');\n } else {\n const table = createKeyValueTable();\n table.push(['Name'['brightCyan'], variable._id]);\n table.push([\n 'Value'['brightCyan'],\n wordwrap(decodeBase64(variable.valueBase64), 40),\n ]);\n table.push(['Type'['brightCyan'], variable.expressionType]);\n table.push([\n 'Status'['brightCyan'],\n variable.loaded ? 'loaded'['brightGreen'] : 'unloaded'['brightRed'],\n ]);\n table.push([\n 'Description'['brightCyan'],\n wordwrap(variable.description, 60),\n ]);\n table.push([\n 'Modified'['brightCyan'],\n new Date(variable.lastChangeDate).toLocaleString(),\n ]);\n let modifierName: string;\n try {\n modifierName = await resolvePerpetratorUuid(variable.lastChangedBy);\n } catch (error) {\n // ignore\n }\n if (modifierName && modifierName !== variable.lastChangedBy) {\n table.push(['Modifier'['brightCyan'], modifierName]);\n }\n table.push(['Modifier UUID'['brightCyan'], variable.lastChangedBy]);\n printMessage(table.toString(), 'data');\n }\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error describing variable ${variableId}`,\n 'fail'\n );\n }\n return outcome;\n}\n\n/**\n * Export a single variable to file\n * @param {String} variableId Variable id\n * @param {String} file Optional filename\n * @param {boolean} noDecode Do not include decoded variable value in export\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportVariableToFile(\n variableId: string,\n file: string | null,\n noDecode: boolean\n) {\n debugMessage(\n `Cli.VariablesOps.exportVariableToFile: start [variableId=${variableId}, file=${file}]`\n );\n let outcome = false;\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(variableId, 'variable');\n }\n const filePath = getFilePath(fileName, true);\n let indicatorId: string;\n try {\n indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting variable ${variableId}`\n );\n const fileData = await exportVariable(variableId, noDecode);\n saveJsonToFile(fileData, filePath);\n updateProgressIndicator(indicatorId, `Exported variable ${variableId}`);\n stopProgressIndicator(\n indicatorId,\n // @ts-expect-error - brightCyan colors the string, even though it is not a property of string\n `Exported ${variableId.brightCyan} to ${filePath.brightCyan}.`\n );\n outcome = true;\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(err, 'error');\n }\n debugMessage(\n `Cli.VariablesOps.exportVariableToFile: end [variableId=${variableId}, file=${file}]`\n );\n return outcome;\n}\n\n/**\n * Export all variables to single file\n * @param {string} file Optional filename\n * @param {boolean} noDecode Do not include decoded variable value in export\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportVariablesToFile(\n file: string | null,\n noDecode: boolean\n) {\n debugMessage(`Cli.VariablesOps.exportVariablesToFile: start [file=${file}]`);\n let outcome = false;\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Exporting variables...`\n );\n if (!file) {\n file = getTypedFilename(\n `all${titleCase(state.getRealm())}Variables`,\n 'variable'\n );\n }\n try {\n const variablesExport = await exportVariables(noDecode);\n saveJsonToFile(variablesExport, getFilePath(file, true));\n stopProgressIndicator(\n spinnerId,\n `Exported variables to ${file}`,\n 'success'\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error exporting variables: ${error.response?.status || error.message}`,\n 'fail'\n );\n }\n debugMessage(\n `Cli.VariablesOps.exportVariablesToFile: end [outcome=${outcome}, file=${file}]`\n );\n return outcome;\n}\n\n/**\n * Export all variables to seperate files\n * @param {boolean} noDecode Do not include decoded variable value in export\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportVariablesToFiles(noDecode: boolean) {\n let outcome = false;\n let spinnerId: string;\n let indicatorId: string;\n let variableList: VariableSkeleton[] = [];\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Retrieving variables...`\n );\n variableList = await readVariables();\n stopProgressIndicator(\n spinnerId,\n `Successfully retrieved ${variableList.length} variables`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error retrieving variables: ${error.message}`,\n 'fail'\n );\n }\n try {\n const indicatorId = createProgressIndicator(\n 'determinate',\n variableList.length,\n 'Exporting variables'\n );\n for (const variable of variableList) {\n if (!noDecode) {\n variable.value = decodeBase64(variable.valueBase64);\n }\n updateProgressIndicator(indicatorId, `Writing variable ${variable._id}`);\n const fileName = getTypedFilename(variable._id, 'variable');\n saveToFile('variable', variable, '_id', getFilePath(fileName, true));\n }\n stopProgressIndicator(\n indicatorId,\n `${variableList.length} variables exported`\n );\n outcome = true;\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error exporting variables: ${error.message}`\n );\n }\n return outcome;\n}\n"],"mappings":"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"}
@@ -1,7 +1,15 @@
1
- import { frodo } from '@rockcarver/frodo-lib';
1
+ import { frodo, state } from '@rockcarver/frodo-lib';
2
2
  import fs from 'fs';
3
3
  import os from 'os';
4
+ import slugify from 'slugify';
4
5
  import { printMessage } from './Console';
6
+ import { readFiles } from './ExportImportUtils';
7
+ const {
8
+ getFilePath
9
+ } = frodo.utils;
10
+ const {
11
+ exportFullConfiguration
12
+ } = frodo.config;
5
13
  const {
6
14
  getDefaultNoiseFilter
7
15
  } = frodo.cloud.log;
@@ -40,4 +48,142 @@ export function getNoiseFilters(defaults) {
40
48
  }
41
49
  return noiseFilter;
42
50
  }
51
+
52
+ /**
53
+ * Gets the full export config from one of three locations:
54
+ * 1. The file passed into the function if one is provided.
55
+ * 2. The working directory if it exists (provided by the user)
56
+ * 3. The cloud tenant if the exports are not locally provided
57
+ * @param file The optional file path
58
+ * @returns The full export config
59
+ */
60
+ export async function getFullExportConfig(file = null) {
61
+ // Get export from file if it exists
62
+ if (file) {
63
+ return JSON.parse(fs.readFileSync(getFilePath(file), 'utf8'));
64
+ }
65
+ // If working directory doesn't exist, export from the cloud
66
+ const workingDirectory = state.getDirectory();
67
+ if (!workingDirectory) {
68
+ return await exportFullConfiguration({
69
+ useStringArrays: true,
70
+ noDecode: false
71
+ });
72
+ }
73
+ // Go through files in directory and reconstruct the full export
74
+ const fullExportConfig = {
75
+ meta: {},
76
+ agents: {},
77
+ application: {},
78
+ authentication: {},
79
+ config: {},
80
+ emailTemplate: {},
81
+ idp: {},
82
+ managedApplication: {},
83
+ policy: {},
84
+ policyset: {},
85
+ resourcetype: {},
86
+ saml: {
87
+ hosted: {},
88
+ remote: {},
89
+ metadata: {},
90
+ cot: {}
91
+ },
92
+ script: {},
93
+ secrets: {},
94
+ service: {},
95
+ theme: {},
96
+ trees: {},
97
+ variables: {}
98
+ };
99
+ const files = await readFiles(workingDirectory);
100
+ const jsonFiles = files.filter(f => f.path.endsWith('.json'));
101
+ const idmConfigFiles = jsonFiles.filter(f => f.path.startsWith('config/'));
102
+ const samlFiles = jsonFiles.filter(f => f.path.startsWith('saml/') || f.path.startsWith('cot/'));
103
+ const otherFiles = jsonFiles.filter(f => !f.path.startsWith('config/') && !f.path.startsWith('saml/') && !f.path.startsWith('cot/'));
104
+ const scriptFiles = files.filter(f => f.path.endsWith('.js') || f.path.endsWith('.groovy'));
105
+ // Handle json files
106
+ for (const f of otherFiles) {
107
+ for (const [id, value] of Object.entries(JSON.parse(f.content))) {
108
+ if (value == null || fullExportConfig[id] == null) {
109
+ continue;
110
+ }
111
+ Object.assign(fullExportConfig[id], value);
112
+ }
113
+ }
114
+ // Handle saml files
115
+ for (const f of samlFiles) {
116
+ let content = JSON.parse(f.content);
117
+ content = content.saml;
118
+ for (const [id, value] of Object.entries(content)) {
119
+ Object.assign(fullExportConfig.saml[id], value);
120
+ }
121
+ }
122
+ // Handle idm config files
123
+ for (const f of idmConfigFiles) {
124
+ const content = JSON.parse(f.content);
125
+ fullExportConfig.config[content._id] = content;
126
+ }
127
+ // Handle extracted scripts, adding them to their corresponding script objects in the export
128
+ if (scriptFiles.length > 0 && fullExportConfig.script != null) {
129
+ const scriptExports = Object.values(fullExportConfig.script);
130
+ for (const f of scriptFiles) {
131
+ const name = f.path.substring(f.path.lastIndexOf('/') + 1, f.path.indexOf('.', f.path.lastIndexOf('/')));
132
+ const scriptLines = f.content.split('\n');
133
+ const script = scriptExports.find(s => slugify(s.name.replace(/^http(s?):\/\//, ''), {
134
+ remove: /[^\w\s$*_+~.()'"!\-@]+/g
135
+ }) === name);
136
+ if (!script) {
137
+ throw Error(`Can't find the script corresponding to the file '${f.path}' in the export files`);
138
+ }
139
+ script.script = scriptLines;
140
+ }
141
+ }
142
+ return fullExportConfig;
143
+ }
144
+
145
+ /**
146
+ * Determines if a string id is being used anywhere within the given configuration object
147
+ * @param configuration The configuration object
148
+ * @param id The id being search for
149
+ * @param isEsv Whether the id corresponds to an ESV or not
150
+ */
151
+ export function isIdUsed(
152
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
153
+ configuration, id, isEsv) {
154
+ return isIdUsedRecurse(configuration, isEsv ?
155
+ // For ESV ids, they contain either letters, numbers, dashes, or underscores. The dashes get replaced with periods (escaped with a \ for the regex)
156
+ // since anywhere they are being used they will be used with periods, not dashes. Note that the (?:[^a-z0-9._]|$) expressions at the beginning and
157
+ // end are meant to ensure that the id found is not a substring of some other id (i.e. the id found must either be at the beginning or end of the
158
+ // string, or if in the middle of a string, is not preceded or followed by a character that would be part of another id).
159
+ new RegExp(`(?:[^a-z0-9._]|^)${id.replaceAll('-', '\\.')}(?:[^a-z0-9._]|$)`) :
160
+ // For normal ids, they contain only letters, numbers, or dashes.
161
+ new RegExp(`(?:[^a-z0-9-]|^)${id}(?:[^a-z0-9-]|$)`));
162
+ }
163
+
164
+ /**
165
+ * Recursive helper for isIdUsed that finds any strings contained in the configuration that pass the regex
166
+ * @param configuration The configuration (could be anything)
167
+ * @param regex The regex test
168
+ */
169
+ function isIdUsedRecurse(
170
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
171
+ configuration, regex) {
172
+ const type = typeof configuration;
173
+ if (type === 'object' && configuration !== null) {
174
+ for (const [id, value] of Object.entries(
175
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
176
+ configuration)) {
177
+ const isIdUsed = isIdUsedRecurse(value, regex);
178
+ if (isIdUsed.used) {
179
+ isIdUsed.location = id + (value.name ? `(name: '${value.name}')` : '') + (isIdUsed.location === '' ? '' : '.') + isIdUsed.location;
180
+ return isIdUsed;
181
+ }
182
+ }
183
+ }
184
+ return {
185
+ used: type === 'string' && regex.test(configuration),
186
+ location: ''
187
+ };
188
+ }
43
189
  //# sourceMappingURL=Config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Config.js","names":["frodo","fs","os","printMessage","getDefaultNoiseFilter","cloud","log","FRODO_CONFIG_PATH_KEY","FRODO_LOG_NOISEFILTER_FILENAME","getConfigPath","process","env","homedir","getCustomNoiseFilters","filename","noiseFilter","data","readFileSync","JSON","parse","e","message","getNoiseFilters","defaults","length","writeFileSync","stringify"],"sources":["../../src/utils/Config.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport fs from 'fs';\nimport os from 'os';\n\nimport { printMessage } from './Console';\n\nconst { getDefaultNoiseFilter } = frodo.cloud.log;\n\nexport const FRODO_CONFIG_PATH_KEY = 'FRODO_CONFIG_PATH';\nexport const FRODO_LOG_NOISEFILTER_FILENAME = 'LoggingNoiseFilter.json';\n\nexport function getConfigPath(): string {\n return process.env[FRODO_CONFIG_PATH_KEY] || `${os.homedir()}/.frodo`;\n}\n\nfunction getCustomNoiseFilters(): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n let noiseFilter = [];\n try {\n const data = fs.readFileSync(filename, 'utf8');\n noiseFilter = JSON.parse(data);\n } catch (e) {\n printMessage(`Error reading ${filename} (${e.message})`, 'error');\n }\n return noiseFilter;\n}\n\nexport function getNoiseFilters(defaults: boolean): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n if (defaults) {\n printMessage(`Using default logging noise filters.`, 'info');\n return getDefaultNoiseFilter();\n }\n let noiseFilter = getCustomNoiseFilters();\n if (noiseFilter.length == 0) {\n printMessage(`No custom noise filters defined. Using defaults.`, 'info');\n noiseFilter = getDefaultNoiseFilter();\n try {\n fs.writeFileSync(filename, JSON.stringify(noiseFilter, null, 2));\n printMessage(\n `The default filters were saved in ${filename}. You can change the filters as needed.`,\n 'info'\n );\n } catch (e) {\n printMessage(\n `Error creating noise filter configuration with default values.`,\n 'error'\n );\n }\n }\n return noiseFilter;\n}\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ,uBAAuB;AAC7C,OAAOC,EAAE,MAAM,IAAI;AACnB,OAAOC,EAAE,MAAM,IAAI;AAEnB,SAASC,YAAY,QAAQ,WAAW;AAExC,MAAM;EAAEC;AAAsB,CAAC,GAAGJ,KAAK,CAACK,KAAK,CAACC,GAAG;AAEjD,OAAO,MAAMC,qBAAqB,GAAG,mBAAmB;AACxD,OAAO,MAAMC,8BAA8B,GAAG,yBAAyB;AAEvE,OAAO,SAASC,aAAaA,CAAA,EAAW;EACtC,OAAOC,OAAO,CAACC,GAAG,CAACJ,qBAAqB,CAAC,IAAK,GAAEL,EAAE,CAACU,OAAO,CAAC,CAAE,SAAQ;AACvE;AAEA,SAASC,qBAAqBA,CAAA,EAAkB;EAC9C,MAAMC,QAAQ,GAAI,GAAEL,aAAa,CAAC,CAAE,IAAGD,8BAA+B,EAAC;EACvE,IAAIO,WAAW,GAAG,EAAE;EACpB,IAAI;IACF,MAAMC,IAAI,GAAGf,EAAE,CAACgB,YAAY,CAACH,QAAQ,EAAE,MAAM,CAAC;IAC9CC,WAAW,GAAGG,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC;EAChC,CAAC,CAAC,OAAOI,CAAC,EAAE;IACVjB,YAAY,CAAE,iBAAgBW,QAAS,KAAIM,CAAC,CAACC,OAAQ,GAAE,EAAE,OAAO,CAAC;EACnE;EACA,OAAON,WAAW;AACpB;AAEA,OAAO,SAASO,eAAeA,CAACC,QAAiB,EAAiB;EAChE,MAAMT,QAAQ,GAAI,GAAEL,aAAa,CAAC,CAAE,IAAGD,8BAA+B,EAAC;EACvE,IAAIe,QAAQ,EAAE;IACZpB,YAAY,CAAE,sCAAqC,EAAE,MAAM,CAAC;IAC5D,OAAOC,qBAAqB,CAAC,CAAC;EAChC;EACA,IAAIW,WAAW,GAAGF,qBAAqB,CAAC,CAAC;EACzC,IAAIE,WAAW,CAACS,MAAM,IAAI,CAAC,EAAE;IAC3BrB,YAAY,CAAE,kDAAiD,EAAE,MAAM,CAAC;IACxEY,WAAW,GAAGX,qBAAqB,CAAC,CAAC;IACrC,IAAI;MACFH,EAAE,CAACwB,aAAa,CAACX,QAAQ,EAAEI,IAAI,CAACQ,SAAS,CAACX,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;MAChEZ,YAAY,CACT,qCAAoCW,QAAS,yCAAwC,EACtF,MACF,CAAC;IACH,CAAC,CAAC,OAAOM,CAAC,EAAE;MACVjB,YAAY,CACT,gEAA+D,EAChE,OACF,CAAC;IACH;EACF;EACA,OAAOY,WAAW;AACpB"}
1
+ {"version":3,"file":"Config.js","names":["frodo","state","fs","os","slugify","printMessage","readFiles","getFilePath","utils","exportFullConfiguration","config","getDefaultNoiseFilter","cloud","log","FRODO_CONFIG_PATH_KEY","FRODO_LOG_NOISEFILTER_FILENAME","getConfigPath","process","env","homedir","getCustomNoiseFilters","filename","noiseFilter","data","readFileSync","JSON","parse","e","message","getNoiseFilters","defaults","length","writeFileSync","stringify","getFullExportConfig","file","workingDirectory","getDirectory","useStringArrays","noDecode","fullExportConfig","meta","agents","application","authentication","emailTemplate","idp","managedApplication","policy","policyset","resourcetype","saml","hosted","remote","metadata","cot","script","secrets","service","theme","trees","variables","files","jsonFiles","filter","f","path","endsWith","idmConfigFiles","startsWith","samlFiles","otherFiles","scriptFiles","id","value","Object","entries","content","assign","_id","scriptExports","values","name","substring","lastIndexOf","indexOf","scriptLines","split","find","s","replace","remove","Error","isIdUsed","configuration","isEsv","isIdUsedRecurse","RegExp","replaceAll","regex","type","used","location","test"],"sources":["../../src/utils/Config.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { FullExportInterface } from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport fs from 'fs';\nimport os from 'os';\nimport slugify from 'slugify';\n\nimport { printMessage } from './Console';\nimport { readFiles } from './ExportImportUtils';\n\nconst { getFilePath } = frodo.utils;\n\nconst { exportFullConfiguration } = frodo.config;\n\nconst { getDefaultNoiseFilter } = frodo.cloud.log;\n\nexport const FRODO_CONFIG_PATH_KEY = 'FRODO_CONFIG_PATH';\nexport const FRODO_LOG_NOISEFILTER_FILENAME = 'LoggingNoiseFilter.json';\n\nexport function getConfigPath(): string {\n return process.env[FRODO_CONFIG_PATH_KEY] || `${os.homedir()}/.frodo`;\n}\n\nfunction getCustomNoiseFilters(): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n let noiseFilter = [];\n try {\n const data = fs.readFileSync(filename, 'utf8');\n noiseFilter = JSON.parse(data);\n } catch (e) {\n printMessage(`Error reading ${filename} (${e.message})`, 'error');\n }\n return noiseFilter;\n}\n\nexport function getNoiseFilters(defaults: boolean): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n if (defaults) {\n printMessage(`Using default logging noise filters.`, 'info');\n return getDefaultNoiseFilter();\n }\n let noiseFilter = getCustomNoiseFilters();\n if (noiseFilter.length == 0) {\n printMessage(`No custom noise filters defined. Using defaults.`, 'info');\n noiseFilter = getDefaultNoiseFilter();\n try {\n fs.writeFileSync(filename, JSON.stringify(noiseFilter, null, 2));\n printMessage(\n `The default filters were saved in ${filename}. You can change the filters as needed.`,\n 'info'\n );\n } catch (e) {\n printMessage(\n `Error creating noise filter configuration with default values.`,\n 'error'\n );\n }\n }\n return noiseFilter;\n}\n\n/**\n * Gets the full export config from one of three locations:\n * 1. The file passed into the function if one is provided.\n * 2. The working directory if it exists (provided by the user)\n * 3. The cloud tenant if the exports are not locally provided\n * @param file The optional file path\n * @returns The full export config\n */\nexport async function getFullExportConfig(\n file: string | null = null\n): Promise<FullExportInterface> {\n // Get export from file if it exists\n if (file) {\n return JSON.parse(fs.readFileSync(getFilePath(file), 'utf8'));\n }\n // If working directory doesn't exist, export from the cloud\n const workingDirectory = state.getDirectory();\n if (!workingDirectory) {\n return await exportFullConfiguration({\n useStringArrays: true,\n noDecode: false,\n });\n }\n // Go through files in directory and reconstruct the full export\n const fullExportConfig = {\n meta: {},\n agents: {},\n application: {},\n authentication: {},\n config: {},\n emailTemplate: {},\n idp: {},\n managedApplication: {},\n policy: {},\n policyset: {},\n resourcetype: {},\n saml: {\n hosted: {},\n remote: {},\n metadata: {},\n cot: {},\n },\n script: {},\n secrets: {},\n service: {},\n theme: {},\n trees: {},\n variables: {},\n } as FullExportInterface;\n const files = await readFiles(workingDirectory);\n const jsonFiles = files.filter((f) => f.path.endsWith('.json'));\n const idmConfigFiles = jsonFiles.filter((f) => f.path.startsWith('config/'));\n const samlFiles = jsonFiles.filter(\n (f) => f.path.startsWith('saml/') || f.path.startsWith('cot/')\n );\n const otherFiles = jsonFiles.filter(\n (f) =>\n !f.path.startsWith('config/') &&\n !f.path.startsWith('saml/') &&\n !f.path.startsWith('cot/')\n );\n const scriptFiles = files.filter(\n (f) => f.path.endsWith('.js') || f.path.endsWith('.groovy')\n );\n // Handle json files\n for (const f of otherFiles) {\n for (const [id, value] of Object.entries(JSON.parse(f.content))) {\n if (value == null || fullExportConfig[id] == null) {\n continue;\n }\n Object.assign(fullExportConfig[id], value);\n }\n }\n // Handle saml files\n for (const f of samlFiles) {\n let content = JSON.parse(f.content);\n content = content.saml;\n for (const [id, value] of Object.entries(content)) {\n Object.assign(fullExportConfig.saml[id], value);\n }\n }\n // Handle idm config files\n for (const f of idmConfigFiles) {\n const content = JSON.parse(f.content);\n fullExportConfig.config[content._id] = content;\n }\n // Handle extracted scripts, adding them to their corresponding script objects in the export\n if (scriptFiles.length > 0 && fullExportConfig.script != null) {\n const scriptExports = Object.values(fullExportConfig.script);\n for (const f of scriptFiles) {\n const name = f.path.substring(\n f.path.lastIndexOf('/') + 1,\n f.path.indexOf('.', f.path.lastIndexOf('/'))\n );\n const scriptLines = f.content.split('\\n');\n const script = scriptExports.find(\n (s) =>\n slugify(s.name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n }) === name\n );\n if (!script) {\n throw Error(\n `Can't find the script corresponding to the file '${f.path}' in the export files`\n );\n }\n script.script = scriptLines;\n }\n }\n return fullExportConfig;\n}\n\n/**\n * Determines if a string id is being used anywhere within the given configuration object\n * @param configuration The configuration object\n * @param id The id being search for\n * @param isEsv Whether the id corresponds to an ESV or not\n */\nexport function isIdUsed(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n id: string,\n isEsv: boolean\n): {\n used: boolean;\n location: string;\n} {\n return isIdUsedRecurse(\n configuration,\n isEsv\n ? // For ESV ids, they contain either letters, numbers, dashes, or underscores. The dashes get replaced with periods (escaped with a \\ for the regex)\n // since anywhere they are being used they will be used with periods, not dashes. Note that the (?:[^a-z0-9._]|$) expressions at the beginning and\n // end are meant to ensure that the id found is not a substring of some other id (i.e. the id found must either be at the beginning or end of the\n // string, or if in the middle of a string, is not preceded or followed by a character that would be part of another id).\n new RegExp(\n `(?:[^a-z0-9._]|^)${id.replaceAll('-', '\\\\.')}(?:[^a-z0-9._]|$)`\n )\n : // For normal ids, they contain only letters, numbers, or dashes.\n new RegExp(`(?:[^a-z0-9-]|^)${id}(?:[^a-z0-9-]|$)`)\n );\n}\n\n/**\n * Recursive helper for isIdUsed that finds any strings contained in the configuration that pass the regex\n * @param configuration The configuration (could be anything)\n * @param regex The regex test\n */\nfunction isIdUsedRecurse(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n regex: RegExp\n): {\n used: boolean;\n location: string;\n} {\n const type = typeof configuration;\n if (type === 'object' && configuration !== null) {\n for (const [id, value] of Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration as Record<string, any>\n )) {\n const isIdUsed = isIdUsedRecurse(value, regex);\n if (isIdUsed.used) {\n isIdUsed.location =\n id +\n (value.name ? `(name: '${value.name}')` : '') +\n (isIdUsed.location === '' ? '' : '.') +\n isIdUsed.location;\n return isIdUsed;\n }\n }\n }\n return {\n used: type === 'string' && regex.test(configuration),\n location: '',\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rockcarver/frodo-cli",
3
- "version": "2.0.0-37",
3
+ "version": "2.0.0-38",
4
4
  "type": "module",
5
5
  "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.",
6
6
  "keywords": [