@rockcarver/frodo-cli 2.0.0-54 → 2.0.0-56
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 +18 -1
- package/esm/cli/config/config-export.js +13 -8
- package/esm/cli/config/config-export.js.map +1 -1
- package/esm/cli/config/config-import.js +16 -10
- package/esm/cli/config/config-import.js.map +1 -1
- package/esm/cli/script/script-export.js +2 -2
- package/esm/cli/script/script-export.js.map +1 -1
- package/esm/ops/ConfigOps.js +37 -8
- package/esm/ops/ConfigOps.js.map +1 -1
- package/esm/ops/IdmOps.js +6 -1
- package/esm/ops/IdmOps.js.map +1 -1
- package/esm/ops/ScriptOps.js +5 -2
- package/esm/ops/ScriptOps.js.map +1 -1
- package/esm/ops/ServiceOps.js +12 -10
- package/esm/ops/ServiceOps.js.map +1 -1
- package/esm/utils/Config.js +2 -2
- package/esm/utils/Config.js.map +1 -1
- package/esm/utils/Console.js +8 -2
- package/esm/utils/Console.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,19 @@ 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-55] - 2024-04-09
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Update to frodo-lib 2.0.0-77
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Improved filtering out secrets from recordings
|
|
19
|
+
- rockcarver/frodo-lib#392: Implemented error handling pattern for methods with unusual amounts of REST calls like `frodo.config.exportFullConfiguration` and `frodo.config.importFullConfiguration` used in the `frodo config import` and `frodo config export` commands
|
|
20
|
+
|
|
21
|
+
## [2.0.0-54] - 2024-04-01
|
|
22
|
+
|
|
10
23
|
### Changed
|
|
11
24
|
|
|
12
25
|
- Update to frodo-lib 2.0.0-75
|
|
@@ -1530,7 +1543,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
1530
1543
|
- Fixed problem with adding connection profiles
|
|
1531
1544
|
- Miscellaneous bug fixes
|
|
1532
1545
|
|
|
1533
|
-
[Unreleased]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-
|
|
1546
|
+
[Unreleased]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-55...HEAD
|
|
1547
|
+
|
|
1548
|
+
[2.0.0-55]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-54...v2.0.0-55
|
|
1549
|
+
|
|
1550
|
+
[2.0.0-54]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-53...v2.0.0-54
|
|
1534
1551
|
|
|
1535
1552
|
[2.0.0-53]: https://github.com/rockcarver/frodo-cli/compare/v2.0.0-52...v2.0.0-53
|
|
1536
1553
|
|
|
@@ -12,28 +12,33 @@ async (host, realm, user, password, options, command) => {
|
|
|
12
12
|
// --all -a
|
|
13
13
|
if (options.all && (await getTokens())) {
|
|
14
14
|
verboseMessage('Exporting everything to a single file...');
|
|
15
|
-
await exportEverythingToFile(options.file, options.metadata, {
|
|
15
|
+
const outcome = await exportEverythingToFile(options.file, options.metadata, {
|
|
16
16
|
useStringArrays: options.useStringArrays,
|
|
17
17
|
noDecode: options.decode,
|
|
18
18
|
coords: options.coords,
|
|
19
19
|
includeDefault: options.default
|
|
20
20
|
});
|
|
21
|
-
|
|
22
|
-
}
|
|
21
|
+
if (!outcome) process.exitCode = 1;
|
|
22
|
+
}
|
|
23
|
+
// require --directory -D for all-separate function
|
|
24
|
+
else if (options.allSeparate && !state.getDirectory()) {
|
|
23
25
|
printMessage('-D or --directory required when using -A or --all-separate', 'error');
|
|
24
26
|
program.help();
|
|
25
27
|
process.exitCode = 1;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
}
|
|
29
|
+
// --all-separate -A
|
|
30
|
+
else if (options.allSeparate && (await getTokens())) {
|
|
28
31
|
verboseMessage('Exporting everything to separate files...');
|
|
29
|
-
await exportEverythingToFiles(options.extract, options.metadata, {
|
|
32
|
+
const outcome = await exportEverythingToFiles(options.extract, options.metadata, {
|
|
30
33
|
useStringArrays: options.useStringArrays,
|
|
31
34
|
noDecode: options.decode,
|
|
32
35
|
coords: options.coords,
|
|
33
36
|
includeDefault: options.default
|
|
34
37
|
});
|
|
35
|
-
|
|
36
|
-
}
|
|
38
|
+
if (!outcome) process.exitCode = 1;
|
|
39
|
+
}
|
|
40
|
+
// unrecognized combination of options or no options
|
|
41
|
+
else {
|
|
37
42
|
verboseMessage('Unrecognized combination of options or no options...');
|
|
38
43
|
program.help();
|
|
39
44
|
process.exitCode = 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-export.js","names":["state","Option","getTokens","exportEverythingToFile","exportEverythingToFiles","printMessage","verboseMessage","FrodoCommand","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","all","file","metadata","useStringArrays","noDecode","decode","coords","includeDefault","
|
|
1
|
+
{"version":3,"file":"config-export.js","names":["state","Option","getTokens","exportEverythingToFile","exportEverythingToFiles","printMessage","verboseMessage","FrodoCommand","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","all","outcome","file","metadata","useStringArrays","noDecode","decode","coords","includeDefault","process","exitCode","allSeparate","getDirectory","help","extract","parse"],"sources":["../../../src/cli/config/config-export.ts"],"sourcesContent":["import { state } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { getTokens } from '../../ops/AuthenticateOps';\nimport {\n exportEverythingToFile,\n exportEverythingToFiles,\n} from '../../ops/ConfigOps';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst program = new FrodoCommand('frodo config export');\n\nprogram\n .description(\n 'Export full cloud configuration for all ops that currently support export.'\n )\n .addOption(new Option('-f, --file <file>', 'Name of the export file.'))\n .addOption(new Option('-a, --all', 'Export everything to a single file.'))\n .addOption(\n new Option(\n '-A, --all-separate',\n 'Export everything to separate files in the -D directory. Ignored with -a.'\n )\n )\n .addOption(\n new Option(\n '--use-string-arrays',\n 'Where applicable, use string arrays to store multi-line text (e.g. scripts).'\n ).default(false, 'off')\n )\n .addOption(\n new Option(\n '--no-decode',\n 'Do not include decoded variable value in variable export'\n ).default(false, 'false')\n )\n .addOption(\n new Option(\n '-x, --extract',\n 'Extract scripts from the exported file, and save it to a separate file. Ignored with -a.'\n )\n )\n .addOption(\n new Option(\n '-N, --no-metadata',\n 'Does not include metadata in the export file.'\n )\n )\n .addOption(\n new Option(\n '--no-coords',\n 'Do not include the x and y coordinate positions of the journey/tree nodes.'\n )\n )\n .addOption(\n new Option(\n '-d, --default',\n 'Export all scripts including the default scripts.'\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 // --all -a\n if (options.all && (await getTokens())) {\n verboseMessage('Exporting everything to a single file...');\n const outcome = await exportEverythingToFile(\n options.file,\n options.metadata,\n {\n useStringArrays: options.useStringArrays,\n noDecode: options.decode,\n coords: options.coords,\n includeDefault: options.default,\n }\n );\n if (!outcome) process.exitCode = 1;\n }\n // require --directory -D for all-separate function\n else if (options.allSeparate && !state.getDirectory()) {\n printMessage(\n '-D or --directory required when using -A or --all-separate',\n 'error'\n );\n program.help();\n process.exitCode = 1;\n }\n // --all-separate -A\n else if (options.allSeparate && (await getTokens())) {\n verboseMessage('Exporting everything to separate files...');\n const outcome = await exportEverythingToFiles(\n options.extract,\n options.metadata,\n {\n useStringArrays: options.useStringArrays,\n noDecode: options.decode,\n coords: options.coords,\n includeDefault: options.default,\n }\n );\n if (!outcome) process.exitCode = 1;\n }\n // unrecognized combination of options or no options\n else {\n verboseMessage('Unrecognized combination of options or no options...');\n program.help();\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"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"}
|
|
@@ -14,10 +14,11 @@ async (host, realm, user, password, options, command) => {
|
|
|
14
14
|
printMessage('-f or --file required when using -a or --all', 'error');
|
|
15
15
|
program.help();
|
|
16
16
|
process.exitCode = 1;
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
}
|
|
18
|
+
// --all -a
|
|
19
|
+
else if (options.all && (await getTokens())) {
|
|
19
20
|
verboseMessage('Exporting everything from a single file...');
|
|
20
|
-
await importEverythingFromFile(options.file, {
|
|
21
|
+
const outcome = await importEverythingFromFile(options.file, {
|
|
21
22
|
reUuidJourneys: options.reUuidJourneys,
|
|
22
23
|
reUuidScripts: options.reUuidScripts,
|
|
23
24
|
cleanServices: options.clean,
|
|
@@ -25,15 +26,18 @@ async (host, realm, user, password, options, command) => {
|
|
|
25
26
|
realm: options.realm,
|
|
26
27
|
includeDefault: options.default
|
|
27
28
|
});
|
|
28
|
-
|
|
29
|
-
}
|
|
29
|
+
if (!outcome) process.exitCode = 1;
|
|
30
|
+
}
|
|
31
|
+
// require --directory -D for all-separate function
|
|
32
|
+
else if (options.allSeparate && !state.getDirectory()) {
|
|
30
33
|
printMessage('-D or --directory required when using -A or --all-separate', 'error');
|
|
31
34
|
program.help();
|
|
32
35
|
process.exitCode = 1;
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
}
|
|
37
|
+
// --all-separate -A
|
|
38
|
+
else if (options.allSeparate && (await getTokens())) {
|
|
35
39
|
verboseMessage('Importing everything from separate files...');
|
|
36
|
-
await importEverythingFromFiles({
|
|
40
|
+
const outcome = await importEverythingFromFiles({
|
|
37
41
|
reUuidJourneys: options.reUuidJourneys,
|
|
38
42
|
reUuidScripts: options.reUuidScripts,
|
|
39
43
|
cleanServices: options.clean,
|
|
@@ -41,8 +45,10 @@ async (host, realm, user, password, options, command) => {
|
|
|
41
45
|
realm: options.realm,
|
|
42
46
|
includeDefault: options.default
|
|
43
47
|
});
|
|
44
|
-
|
|
45
|
-
}
|
|
48
|
+
if (!outcome) process.exitCode = 1;
|
|
49
|
+
}
|
|
50
|
+
// unrecognized combination of options or no options
|
|
51
|
+
else {
|
|
46
52
|
verboseMessage('Unrecognized combination of options or no options...');
|
|
47
53
|
program.help();
|
|
48
54
|
process.exitCode = 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-import.js","names":["state","Option","getTokens","importEverythingFromFile","importEverythingFromFiles","printMessage","verboseMessage","FrodoCommand","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","all","file","help","process","exitCode","reUuidJourneys","reUuidScripts","cleanServices","clean","global","includeDefault","allSeparate","getDirectory","parse"],"sources":["../../../src/cli/config/config-import.ts"],"sourcesContent":["import { state } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { getTokens } from '../../ops/AuthenticateOps';\nimport {\n importEverythingFromFile,\n importEverythingFromFiles,\n} from '../../ops/ConfigOps';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst program = new FrodoCommand('frodo config import');\n\nprogram\n .description('Import full cloud configuration.')\n .addOption(new Option('-f, --file <file>', 'Name of the file to import.'))\n .addOption(\n new Option(\n '-a, --all',\n 'Import all configuration from the single file -f. Ignored with -i.'\n )\n )\n .addOption(\n new Option(\n '-A, --all-separate',\n 'Import all configuration from separate (.json) files in the (working) directory -D. Ignored with -i or -a.'\n )\n )\n .addOption(\n new Option('-C, --clean', 'Remove existing service(s) before importing.')\n )\n .addOption(\n new Option('-g, --global', 'Import service(s) as global service(s).')\n )\n .addOption(\n new Option(\n '-r, --current-realm',\n 'Import service(s) into the current realm.'\n )\n )\n .addOption(\n new Option(\n '--re-uuid-journeys',\n 'Generate new UUIDs for all journey nodes during import.'\n ).default(false, 'off')\n )\n .addOption(\n new Option(\n '--re-uuid-scripts',\n 'Create new UUIDs for the scripts upon import. Use this to duplicate scripts or create a new versions of the same scripts.'\n ).default(false, 'off')\n )\n .addOption(\n new Option(\n '-d, --default',\n 'Import all scripts including the default scripts.'\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 // Require --file -f for all function\n if (options.all && !options.file) {\n printMessage('-f or --file required when using -a or --all', 'error');\n program.help();\n process.exitCode = 1;\n
|
|
1
|
+
{"version":3,"file":"config-import.js","names":["state","Option","getTokens","importEverythingFromFile","importEverythingFromFiles","printMessage","verboseMessage","FrodoCommand","program","description","addOption","default","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","all","file","help","process","exitCode","outcome","reUuidJourneys","reUuidScripts","cleanServices","clean","global","includeDefault","allSeparate","getDirectory","parse"],"sources":["../../../src/cli/config/config-import.ts"],"sourcesContent":["import { state } from '@rockcarver/frodo-lib';\nimport { Option } from 'commander';\n\nimport { getTokens } from '../../ops/AuthenticateOps';\nimport {\n importEverythingFromFile,\n importEverythingFromFiles,\n} from '../../ops/ConfigOps';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst program = new FrodoCommand('frodo config import');\n\nprogram\n .description('Import full cloud configuration.')\n .addOption(new Option('-f, --file <file>', 'Name of the file to import.'))\n .addOption(\n new Option(\n '-a, --all',\n 'Import all configuration from the single file -f. Ignored with -i.'\n )\n )\n .addOption(\n new Option(\n '-A, --all-separate',\n 'Import all configuration from separate (.json) files in the (working) directory -D. Ignored with -i or -a.'\n )\n )\n .addOption(\n new Option('-C, --clean', 'Remove existing service(s) before importing.')\n )\n .addOption(\n new Option('-g, --global', 'Import service(s) as global service(s).')\n )\n .addOption(\n new Option(\n '-r, --current-realm',\n 'Import service(s) into the current realm.'\n )\n )\n .addOption(\n new Option(\n '--re-uuid-journeys',\n 'Generate new UUIDs for all journey nodes during import.'\n ).default(false, 'off')\n )\n .addOption(\n new Option(\n '--re-uuid-scripts',\n 'Create new UUIDs for the scripts upon import. Use this to duplicate scripts or create a new versions of the same scripts.'\n ).default(false, 'off')\n )\n .addOption(\n new Option(\n '-d, --default',\n 'Import all scripts including the default scripts.'\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 // Require --file -f for all function\n if (options.all && !options.file) {\n printMessage('-f or --file required when using -a or --all', 'error');\n program.help();\n process.exitCode = 1;\n }\n // --all -a\n else if (options.all && (await getTokens())) {\n verboseMessage('Exporting everything from a single file...');\n const outcome = await importEverythingFromFile(options.file, {\n reUuidJourneys: options.reUuidJourneys,\n reUuidScripts: options.reUuidScripts,\n cleanServices: options.clean,\n global: options.global,\n realm: options.realm,\n includeDefault: options.default,\n });\n if (!outcome) process.exitCode = 1;\n }\n // require --directory -D for all-separate function\n else if (options.allSeparate && !state.getDirectory()) {\n printMessage(\n '-D or --directory required when using -A or --all-separate',\n 'error'\n );\n program.help();\n process.exitCode = 1;\n }\n // --all-separate -A\n else if (options.allSeparate && (await getTokens())) {\n verboseMessage('Importing everything from separate files...');\n const outcome = await importEverythingFromFiles({\n reUuidJourneys: options.reUuidJourneys,\n reUuidScripts: options.reUuidScripts,\n cleanServices: options.clean,\n global: options.global,\n realm: options.realm,\n includeDefault: options.default,\n });\n if (!outcome) process.exitCode = 1;\n }\n // unrecognized combination of options or no options\n else {\n verboseMessage('Unrecognized combination of options or no options...');\n program.help();\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"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"}
|
|
@@ -13,14 +13,14 @@ program.description('Export scripts.').addOption(new Option('-n, --script-name <
|
|
|
13
13
|
// )
|
|
14
14
|
.addOption(new Option('-f, --file <file>', 'Name of the export file.')).addOption(new Option('-a, --all', 'Export all scripts to a single file. Ignored with -n.')).addOption(new Option('-A, --all-separate', 'Export all scripts to separate files (*.script.json) in the current directory. Ignored with -n or -a.')).addOption(new Option('-N, --no-metadata', 'Does not include metadata in the export file.'))
|
|
15
15
|
// deprecated option
|
|
16
|
-
.addOption(new Option('-s, --script <script>', 'DEPRECATED! Use -n/--script-name instead. Name of the script.')).addOption(new Option('-x, --extract', 'Extract the script from the exported file, and save it to a separate file. Ignored with -
|
|
16
|
+
.addOption(new Option('-s, --script <script>', 'DEPRECATED! Use -n/--script-name instead. Name of the script.')).addOption(new Option('-x, --extract', 'Extract the script from the exported file, and save it to a separate file. Ignored with -a.')).addOption(new Option('-d, --default', 'Export all scripts including the default scripts. Ignored with -n.')).action(
|
|
17
17
|
// implement command logic inside action handler
|
|
18
18
|
async (host, realm, user, password, options, command) => {
|
|
19
19
|
command.handleDefaultArgsAndOpts(host, realm, user, password, options, command);
|
|
20
20
|
// export by name
|
|
21
21
|
if ((options.scriptName || options.script) && (await getTokens())) {
|
|
22
22
|
verboseMessage('Exporting script...');
|
|
23
|
-
const outcome = await exportScriptByNameToFile(options.scriptName || options.script, options.file, options.metadata);
|
|
23
|
+
const outcome = await exportScriptByNameToFile(options.scriptName || options.script, options.file, options.metadata, options.extract);
|
|
24
24
|
if (!outcome) process.exitCode = 1;
|
|
25
25
|
}
|
|
26
26
|
// -a / --all
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"script-export.js","names":["Option","getTokens","exportScriptByNameToFile","exportScriptsToFile","exportScriptsToFiles","printMessage","verboseMessage","FrodoCommand","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","scriptName","script","outcome","file","metadata","process","exitCode","all","default","allSeparate","
|
|
1
|
+
{"version":3,"file":"script-export.js","names":["Option","getTokens","exportScriptByNameToFile","exportScriptsToFile","exportScriptsToFiles","printMessage","verboseMessage","FrodoCommand","program","description","addOption","action","host","realm","user","password","options","command","handleDefaultArgsAndOpts","scriptName","script","outcome","file","metadata","extract","process","exitCode","all","default","allSeparate","help","parse"],"sources":["../../../src/cli/script/script-export.ts"],"sourcesContent":["import { Option } from 'commander';\n\nimport { getTokens } from '../../ops/AuthenticateOps';\nimport {\n exportScriptByNameToFile,\n exportScriptsToFile,\n exportScriptsToFiles,\n} from '../../ops/ScriptOps';\nimport { printMessage, verboseMessage } from '../../utils/Console';\nimport { FrodoCommand } from '../FrodoCommand';\n\nconst program = new FrodoCommand('frodo script export');\n\nprogram\n .description('Export scripts.')\n .addOption(\n new Option(\n '-n, --script-name <name>',\n 'Name of the script. If specified, -a and -A are ignored.'\n )\n )\n // .addOption(\n // new Option(\n // '-i, --script-id <uuid>',\n // 'Uuid of the script. If specified, -a and -A are ignored.'\n // )\n // )\n .addOption(new Option('-f, --file <file>', 'Name of the export file.'))\n .addOption(\n new Option(\n '-a, --all',\n 'Export all scripts to a single file. Ignored with -n.'\n )\n )\n .addOption(\n new Option(\n '-A, --all-separate',\n 'Export all scripts to separate files (*.script.json) in the current directory. Ignored with -n or -a.'\n )\n )\n .addOption(\n new Option(\n '-N, --no-metadata',\n 'Does not include metadata in the export file.'\n )\n )\n // deprecated option\n .addOption(\n new Option(\n '-s, --script <script>',\n 'DEPRECATED! Use -n/--script-name instead. Name of the script.'\n )\n )\n .addOption(\n new Option(\n '-x, --extract',\n 'Extract the script from the exported file, and save it to a separate file. Ignored with -a.'\n )\n )\n .addOption(\n new Option(\n '-d, --default',\n 'Export all scripts including the default scripts. Ignored with -n.'\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 // export by name\n if ((options.scriptName || options.script) && (await getTokens())) {\n verboseMessage('Exporting script...');\n const outcome = await exportScriptByNameToFile(\n options.scriptName || options.script,\n options.file,\n options.metadata,\n options.extract\n );\n if (!outcome) process.exitCode = 1;\n }\n // -a / --all\n else if (options.all && (await getTokens())) {\n verboseMessage('Exporting all scripts to a single file...');\n const outcome = await exportScriptsToFile(\n options.file,\n options.metadata,\n options.default\n );\n if (!outcome) process.exitCode = 1;\n }\n // -A / --all-separate\n else if (options.allSeparate && (await getTokens())) {\n verboseMessage('Exporting all scripts to separate files...');\n // -x / --extract\n const outcome = await exportScriptsToFiles(\n options.extract,\n options.metadata,\n options.default\n );\n if (!outcome) process.exitCode = 1;\n }\n\n // unrecognized combination of options or no options\n else {\n printMessage(\n 'Unrecognized combination of options or no options...',\n 'error'\n );\n program.help();\n process.exitCode = 1;\n }\n }\n // end command logic inside action handler\n );\n\nprogram.parse();\n"],"mappings":"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"}
|
package/esm/ops/ConfigOps.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { frodo, state } from '@rockcarver/frodo-lib';
|
|
1
|
+
import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import fse from 'fs-extra';
|
|
4
4
|
import { getFullExportConfig, getFullExportConfigFromDirectory } from '../utils/Config';
|
|
5
|
-
import { printError, printMessage } from '../utils/Console';
|
|
5
|
+
import { cleanupProgressIndicators, printError, printMessage } from '../utils/Console';
|
|
6
6
|
import { extractScriptToFile } from './ScriptOps';
|
|
7
7
|
const {
|
|
8
8
|
getRealmName,
|
|
@@ -25,6 +25,7 @@ const {
|
|
|
25
25
|
* @param {String} file file name
|
|
26
26
|
* @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
|
|
27
27
|
* @param {FullExportOptions} options export options
|
|
28
|
+
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
28
29
|
*/
|
|
29
30
|
export async function exportEverythingToFile(file, includeMeta = true, options = {
|
|
30
31
|
useStringArrays: true,
|
|
@@ -33,15 +34,21 @@ export async function exportEverythingToFile(file, includeMeta = true, options =
|
|
|
33
34
|
includeDefault: false
|
|
34
35
|
}) {
|
|
35
36
|
try {
|
|
36
|
-
const
|
|
37
|
+
const collectErrors = [];
|
|
38
|
+
const exportData = await exportFullConfiguration(options, collectErrors);
|
|
37
39
|
let fileName = getTypedFilename(`${titleCase(getRealmName(state.getRealm()))}`, `everything`);
|
|
38
40
|
if (file) {
|
|
39
41
|
fileName = file;
|
|
40
42
|
}
|
|
41
43
|
saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);
|
|
44
|
+
if (collectErrors.length > 0) {
|
|
45
|
+
throw new FrodoError(`Errors occurred during full export`, collectErrors);
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
42
48
|
} catch (error) {
|
|
43
49
|
printError(error);
|
|
44
50
|
}
|
|
51
|
+
return false;
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
/**
|
|
@@ -49,6 +56,7 @@ export async function exportEverythingToFile(file, includeMeta = true, options =
|
|
|
49
56
|
* @param {boolean} extract Extracts the scripts from the exports into separate files if true
|
|
50
57
|
* @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
|
|
51
58
|
* @param {FullExportOptions} options export options
|
|
59
|
+
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
52
60
|
*/
|
|
53
61
|
export async function exportEverythingToFiles(extract = false, includeMeta = true, options = {
|
|
54
62
|
useStringArrays: true,
|
|
@@ -57,7 +65,8 @@ export async function exportEverythingToFiles(extract = false, includeMeta = tru
|
|
|
57
65
|
includeDefault: false
|
|
58
66
|
}) {
|
|
59
67
|
try {
|
|
60
|
-
const
|
|
68
|
+
const collectErrors = [];
|
|
69
|
+
const exportData = await exportFullConfiguration(options, collectErrors);
|
|
61
70
|
delete exportData.meta;
|
|
62
71
|
const baseDirectory = getWorkingDirectory(true);
|
|
63
72
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -123,7 +132,7 @@ export async function exportEverythingToFiles(extract = false, includeMeta = tru
|
|
|
123
132
|
});
|
|
124
133
|
}
|
|
125
134
|
} else {
|
|
126
|
-
const filename = getTypedFilename(value && value.name ? value.name : id, type);
|
|
135
|
+
const filename = getTypedFilename(value && value.name && type !== 'emailTemplate' ? value.name : id, type);
|
|
127
136
|
if (extract && type == 'script') {
|
|
128
137
|
extractScriptToFile(exportData, id, type);
|
|
129
138
|
}
|
|
@@ -137,15 +146,21 @@ export async function exportEverythingToFiles(extract = false, includeMeta = tru
|
|
|
137
146
|
}
|
|
138
147
|
}
|
|
139
148
|
});
|
|
149
|
+
if (collectErrors.length > 0) {
|
|
150
|
+
throw new FrodoError(`Errors occurred during full export`, collectErrors);
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
140
153
|
} catch (error) {
|
|
141
154
|
printError(error);
|
|
142
155
|
}
|
|
156
|
+
return false;
|
|
143
157
|
}
|
|
144
158
|
|
|
145
159
|
/**
|
|
146
160
|
* Import everything from a single file
|
|
147
|
-
* @param {
|
|
161
|
+
* @param {string} file The file path
|
|
148
162
|
* @param {FullImportOptions} options import options
|
|
163
|
+
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
149
164
|
*/
|
|
150
165
|
export async function importEverythingFromFile(file, options = {
|
|
151
166
|
reUuidJourneys: false,
|
|
@@ -157,14 +172,22 @@ export async function importEverythingFromFile(file, options = {
|
|
|
157
172
|
}) {
|
|
158
173
|
try {
|
|
159
174
|
const data = await getFullExportConfig(file);
|
|
160
|
-
|
|
175
|
+
const collectErrors = [];
|
|
176
|
+
await importFullConfiguration(data, options, collectErrors);
|
|
177
|
+
if (collectErrors.length > 0) {
|
|
178
|
+
throw new FrodoError(`Errors occurred during full config import`, collectErrors);
|
|
179
|
+
}
|
|
180
|
+
return true;
|
|
161
181
|
} catch (error) {
|
|
182
|
+
cleanupProgressIndicators();
|
|
162
183
|
printError(error);
|
|
163
184
|
}
|
|
185
|
+
return false;
|
|
164
186
|
}
|
|
165
187
|
|
|
166
188
|
/**
|
|
167
189
|
* Import everything from separate files
|
|
190
|
+
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
168
191
|
*/
|
|
169
192
|
export async function importEverythingFromFiles(options = {
|
|
170
193
|
reUuidJourneys: false,
|
|
@@ -176,9 +199,15 @@ export async function importEverythingFromFiles(options = {
|
|
|
176
199
|
}) {
|
|
177
200
|
try {
|
|
178
201
|
const data = await getFullExportConfigFromDirectory(state.getDirectory());
|
|
179
|
-
|
|
202
|
+
const collectErrors = [];
|
|
203
|
+
await importFullConfiguration(data, options, collectErrors);
|
|
204
|
+
if (collectErrors.length > 0) {
|
|
205
|
+
throw new FrodoError(`Errors occurred during full config import`, collectErrors);
|
|
206
|
+
}
|
|
207
|
+
return true;
|
|
180
208
|
} catch (error) {
|
|
181
209
|
printError(error);
|
|
182
210
|
}
|
|
211
|
+
return false;
|
|
183
212
|
}
|
|
184
213
|
//# sourceMappingURL=ConfigOps.js.map
|
package/esm/ops/ConfigOps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigOps.js","names":["frodo","state","fs","fse","getFullExportConfig","getFullExportConfigFromDirectory","printError","printMessage","extractScriptToFile","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","stringify","json","exportFullConfiguration","importFullConfiguration","config","exportEverythingToFile","file","includeMeta","options","useStringArrays","noDecode","coords","includeDefault","exportData","fileName","getRealm","error","exportEverythingToFiles","extract","meta","baseDirectory","Object","entries","forEach","type","obj","existsSync","mkdirSync","samlData","saml","cot","hosted","metadata","remote","id","value","concat","filename","entityId","samlType","authentication","includes","slice","lastIndexOf","recursive","outputFile","err","name","importEverythingFromFile","reUuidJourneys","reUuidScripts","cleanServices","global","realm","data","importEverythingFromFiles","getDirectory"],"sources":["../../src/ops/ConfigOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport {\n FullExportInterface,\n FullExportOptions,\n FullImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport { ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport fs from 'fs';\nimport fse from 'fs-extra';\n\nimport {\n getFullExportConfig,\n getFullExportConfigFromDirectory,\n} from '../utils/Config';\nimport { printError, printMessage } from '../utils/Console';\nimport { extractScriptToFile } from './ScriptOps';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst { stringify } = frodo.utils.json;\nconst { exportFullConfiguration, importFullConfiguration } = frodo.config;\n\n/**\n * Export everything to separate files\n * @param {String} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {FullExportOptions} options export options\n */\nexport async function exportEverythingToFile(\n file: string,\n includeMeta: boolean = true,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n coords: true,\n includeDefault: false,\n }\n): Promise<void> {\n try {\n const exportData = await exportFullConfiguration(options);\n let fileName = getTypedFilename(\n `${titleCase(getRealmName(state.getRealm()))}`,\n `everything`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n } catch (error) {\n printError(error);\n }\n}\n\n/**\n * Export everything to separate files\n * @param {boolean} extract Extracts the scripts from the exports into separate files if true\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {FullExportOptions} options export options\n */\nexport async function exportEverythingToFiles(\n extract: boolean = false,\n includeMeta: boolean = true,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n coords: true,\n includeDefault: false,\n }\n): Promise<void> {\n try {\n const exportData: FullExportInterface =\n await exportFullConfiguration(options);\n delete exportData.meta;\n const baseDirectory = getWorkingDirectory(true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(exportData).forEach(([type, obj]: [string, any]) => {\n if (obj) {\n if (!fs.existsSync(`${baseDirectory}/${type}`)) {\n fs.mkdirSync(`${baseDirectory}/${type}`);\n }\n if (type == 'saml') {\n const samlData = {\n saml: {\n cot: {},\n hosted: {},\n metadata: {},\n remote: {},\n },\n };\n if (obj.cot) {\n if (!fs.existsSync(`${baseDirectory}/cot`)) {\n fs.mkdirSync(`${baseDirectory}/cot`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj.cot).forEach(([id, value]: [string, any]) => {\n samlData.saml.cot = {\n [id]: value,\n };\n saveJsonToFile(\n samlData,\n `${baseDirectory}/cot/${getTypedFilename(id, 'cot.saml')}`,\n includeMeta\n );\n });\n samlData.saml.cot = {};\n }\n Object.entries(obj.hosted)\n .concat(Object.entries(obj.remote))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .forEach(([id, value]: [string, any]) => {\n const filename = getTypedFilename(\n value.entityId ? value.entityId : id,\n type\n );\n const samlType = obj.hosted[id] ? 'hosted' : 'remote';\n samlData.saml[samlType][id] = value;\n samlData.saml.metadata = {\n [id]: obj.metadata[id],\n };\n saveJsonToFile(\n samlData,\n `${baseDirectory}/${type}/${filename}`,\n includeMeta\n );\n samlData.saml[samlType] = {};\n });\n } else if (type == 'authentication') {\n const fileName = getTypedFilename(\n `${frodo.utils.getRealmName(state.getRealm())}Realm`,\n 'authentication.settings'\n );\n saveJsonToFile(\n {\n authentication: obj,\n },\n `${baseDirectory}/${type}/${fileName}`,\n includeMeta\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj).forEach(([id, value]: [string, any]) => {\n if (type == 'config') {\n if (value != null) {\n const filename = `${id}.json`;\n if (filename.includes('/')) {\n fs.mkdirSync(\n `${baseDirectory}/${type}/${filename.slice(\n 0,\n filename.lastIndexOf('/')\n )}`,\n {\n recursive: true,\n }\n );\n }\n fse.outputFile(\n `${baseDirectory}/${type}/${filename}`,\n stringify(value),\n (err) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${id} to file - ${err}`,\n 'error'\n );\n }\n }\n );\n }\n } else {\n const filename = getTypedFilename(\n value && value.name ? value.name : id,\n type\n );\n if (extract && type == 'script') {\n extractScriptToFile(\n exportData as ScriptExportInterface,\n id,\n type\n );\n }\n saveJsonToFile(\n {\n [type]: {\n [id]: value,\n },\n },\n `${baseDirectory}/${type}/${filename}`,\n includeMeta\n );\n }\n });\n }\n }\n });\n } catch (error) {\n printError(error);\n }\n}\n\n/**\n * Import everything from a single file\n * @param {String} file The file path\n * @param {FullImportOptions} options import options\n */\nexport async function importEverythingFromFile(\n file: string,\n options: FullImportOptions = {\n reUuidJourneys: false,\n reUuidScripts: false,\n cleanServices: false,\n global: false,\n realm: false,\n includeDefault: false,\n }\n) {\n try {\n const data = await getFullExportConfig(file);\n await importFullConfiguration(data, options);\n } catch (error) {\n printError(error);\n }\n}\n\n/**\n * Import everything from separate files\n */\nexport async function importEverythingFromFiles(\n options: FullImportOptions = {\n reUuidJourneys: false,\n reUuidScripts: false,\n cleanServices: false,\n global: false,\n realm: false,\n includeDefault: false,\n }\n) {\n try {\n const data = await getFullExportConfigFromDirectory(state.getDirectory());\n await importFullConfiguration(data, options);\n } catch (error) {\n printError(error);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConfigOps.js","names":["frodo","FrodoError","state","fs","fse","getFullExportConfig","getFullExportConfigFromDirectory","cleanupProgressIndicators","printError","printMessage","extractScriptToFile","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","stringify","json","exportFullConfiguration","importFullConfiguration","config","exportEverythingToFile","file","includeMeta","options","useStringArrays","noDecode","coords","includeDefault","collectErrors","exportData","fileName","getRealm","length","error","exportEverythingToFiles","extract","meta","baseDirectory","Object","entries","forEach","type","obj","existsSync","mkdirSync","samlData","saml","cot","hosted","metadata","remote","id","value","concat","filename","entityId","samlType","authentication","includes","slice","lastIndexOf","recursive","outputFile","err","name","importEverythingFromFile","reUuidJourneys","reUuidScripts","cleanServices","global","realm","data","importEverythingFromFiles","getDirectory"],"sources":["../../src/ops/ConfigOps.ts"],"sourcesContent":["import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';\nimport {\n FullExportInterface,\n FullExportOptions,\n FullImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport { ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport fs from 'fs';\nimport fse from 'fs-extra';\n\nimport {\n getFullExportConfig,\n getFullExportConfigFromDirectory,\n} from '../utils/Config';\nimport {\n cleanupProgressIndicators,\n printError,\n printMessage,\n} from '../utils/Console';\nimport { extractScriptToFile } from './ScriptOps';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst { stringify } = frodo.utils.json;\nconst { exportFullConfiguration, importFullConfiguration } = frodo.config;\n\n/**\n * Export everything to separate files\n * @param {String} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {FullExportOptions} options export options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportEverythingToFile(\n file: string,\n includeMeta: boolean = true,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n coords: true,\n includeDefault: false,\n }\n): Promise<boolean> {\n try {\n const collectErrors: Error[] = [];\n const exportData = await exportFullConfiguration(options, collectErrors);\n let fileName = getTypedFilename(\n `${titleCase(getRealmName(state.getRealm()))}`,\n `everything`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n if (collectErrors.length > 0) {\n throw new FrodoError(`Errors occurred during full export`, collectErrors);\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export everything to separate files\n * @param {boolean} extract Extracts the scripts from the exports into separate files if true\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {FullExportOptions} options export options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportEverythingToFiles(\n extract: boolean = false,\n includeMeta: boolean = true,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n coords: true,\n includeDefault: false,\n }\n): Promise<boolean> {\n try {\n const collectErrors: Error[] = [];\n const exportData: FullExportInterface = await exportFullConfiguration(\n options,\n collectErrors\n );\n delete exportData.meta;\n const baseDirectory = getWorkingDirectory(true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(exportData).forEach(([type, obj]: [string, any]) => {\n if (obj) {\n if (!fs.existsSync(`${baseDirectory}/${type}`)) {\n fs.mkdirSync(`${baseDirectory}/${type}`);\n }\n if (type == 'saml') {\n const samlData = {\n saml: {\n cot: {},\n hosted: {},\n metadata: {},\n remote: {},\n },\n };\n if (obj.cot) {\n if (!fs.existsSync(`${baseDirectory}/cot`)) {\n fs.mkdirSync(`${baseDirectory}/cot`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj.cot).forEach(([id, value]: [string, any]) => {\n samlData.saml.cot = {\n [id]: value,\n };\n saveJsonToFile(\n samlData,\n `${baseDirectory}/cot/${getTypedFilename(id, 'cot.saml')}`,\n includeMeta\n );\n });\n samlData.saml.cot = {};\n }\n Object.entries(obj.hosted)\n .concat(Object.entries(obj.remote))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .forEach(([id, value]: [string, any]) => {\n const filename = getTypedFilename(\n value.entityId ? value.entityId : id,\n type\n );\n const samlType = obj.hosted[id] ? 'hosted' : 'remote';\n samlData.saml[samlType][id] = value;\n samlData.saml.metadata = {\n [id]: obj.metadata[id],\n };\n saveJsonToFile(\n samlData,\n `${baseDirectory}/${type}/${filename}`,\n includeMeta\n );\n samlData.saml[samlType] = {};\n });\n } else if (type == 'authentication') {\n const fileName = getTypedFilename(\n `${frodo.utils.getRealmName(state.getRealm())}Realm`,\n 'authentication.settings'\n );\n saveJsonToFile(\n {\n authentication: obj,\n },\n `${baseDirectory}/${type}/${fileName}`,\n includeMeta\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj).forEach(([id, value]: [string, any]) => {\n if (type == 'config') {\n if (value != null) {\n const filename = `${id}.json`;\n if (filename.includes('/')) {\n fs.mkdirSync(\n `${baseDirectory}/${type}/${filename.slice(\n 0,\n filename.lastIndexOf('/')\n )}`,\n {\n recursive: true,\n }\n );\n }\n fse.outputFile(\n `${baseDirectory}/${type}/${filename}`,\n stringify(value),\n (err) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${id} to file - ${err}`,\n 'error'\n );\n }\n }\n );\n }\n } else {\n const filename = getTypedFilename(\n value && value.name && type !== 'emailTemplate'\n ? value.name\n : id,\n type\n );\n if (extract && type == 'script') {\n extractScriptToFile(\n exportData as ScriptExportInterface,\n id,\n type\n );\n }\n saveJsonToFile(\n {\n [type]: {\n [id]: value,\n },\n },\n `${baseDirectory}/${type}/${filename}`,\n includeMeta\n );\n }\n });\n }\n }\n });\n if (collectErrors.length > 0) {\n throw new FrodoError(`Errors occurred during full export`, collectErrors);\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import everything from a single file\n * @param {string} file The file path\n * @param {FullImportOptions} options import options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importEverythingFromFile(\n file: string,\n options: FullImportOptions = {\n reUuidJourneys: false,\n reUuidScripts: false,\n cleanServices: false,\n global: false,\n realm: false,\n includeDefault: false,\n }\n): Promise<boolean> {\n try {\n const data = await getFullExportConfig(file);\n const collectErrors: Error[] = [];\n await importFullConfiguration(data, options, collectErrors);\n if (collectErrors.length > 0) {\n throw new FrodoError(\n `Errors occurred during full config import`,\n collectErrors\n );\n }\n return true;\n } catch (error) {\n cleanupProgressIndicators();\n printError(error);\n }\n return false;\n}\n\n/**\n * Import everything from separate files\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importEverythingFromFiles(\n options: FullImportOptions = {\n reUuidJourneys: false,\n reUuidScripts: false,\n cleanServices: false,\n global: false,\n realm: false,\n includeDefault: false,\n }\n): Promise<boolean> {\n try {\n const data = await getFullExportConfigFromDirectory(state.getDirectory());\n const collectErrors: Error[] = [];\n await importFullConfiguration(data, options, collectErrors);\n if (collectErrors.length > 0) {\n throw new FrodoError(\n `Errors occurred during full config import`,\n collectErrors\n );\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n"],"mappings":"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"}
|
package/esm/ops/IdmOps.js
CHANGED
|
@@ -197,8 +197,11 @@ export async function importConfigEntityByIdFromFile(entityId, file, validate) {
|
|
|
197
197
|
* @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise
|
|
198
198
|
*/
|
|
199
199
|
export async function importConfigEntityFromFile(file, validate) {
|
|
200
|
+
const filePath = getFilePath(file);
|
|
201
|
+
let indicatorId;
|
|
200
202
|
try {
|
|
201
|
-
|
|
203
|
+
indicatorId = createProgressIndicator('indeterminate', 0, `Importing ${filePath}...`);
|
|
204
|
+
const fileData = fs.readFileSync(path.resolve(process.cwd(), filePath), 'utf8');
|
|
202
205
|
const entityData = JSON.parse(fileData);
|
|
203
206
|
const entityId = entityData._id;
|
|
204
207
|
const isValid = areScriptHooksValid(entityData);
|
|
@@ -207,8 +210,10 @@ export async function importConfigEntityFromFile(file, validate) {
|
|
|
207
210
|
return;
|
|
208
211
|
}
|
|
209
212
|
await updateConfigEntity(entityId, entityData);
|
|
213
|
+
stopProgressIndicator(indicatorId, `Imported ${entityId} from ${filePath}.`, 'success');
|
|
210
214
|
return true;
|
|
211
215
|
} catch (error) {
|
|
216
|
+
stopProgressIndicator(indicatorId, `Error importing ${filePath}.`, 'fail');
|
|
212
217
|
printError(error);
|
|
213
218
|
}
|
|
214
219
|
return false;
|
package/esm/ops/IdmOps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdmOps.js","names":["frodo","FrodoError","fs","fse","path","propertiesReader","replaceall","createProgressIndicator","printError","printMessage","stopProgressIndicator","stringify","utils","json","unSubstituteEnvParams","areScriptHooksValid","getFilePath","getTypedFilename","readFiles","getWorkingDirectory","readConfigEntities","readConfigEntity","exportConfigEntities","updateConfigEntity","importConfigEntities","idm","config","queryManagedObjects","managed","testConnectorServers","system","warnAboutOfflineConnectorServers","all","offline","filter","status","ok","map","name","length","join","error","listAllConfigEntities","configurations","configEntity","_id","exportConfigEntity","id","file","fileName","writeFile","err","exportAllRawConfigEntities","exportedConfigurations","value","Object","entries","outputFile","exportAllConfigEntities","entitiesFile","envFile","errors","entriesToExport","data","readFileSync","entriesData","JSON","parse","envParams","undefined","entityPromises","includes","push","results","Promise","item","configEntityString","each","key","outputFileSync","importConfigEntityByIdFromFile","entityId","validate","fileData","resolve","process","cwd","entityData","isValid","importConfigEntityFromFile","importAllRawConfigEntities","options","indicatorId","baseDirectory","files","jsonObjects","toLowerCase","endsWith","content","entity","importData","fromEntries","importAllConfigEntities","entriesToImport","envReader","countManagedObjects","type","result"],"sources":["../../src/ops/IdmOps.ts"],"sourcesContent":["import { frodo, FrodoError } from '@rockcarver/frodo-lib';\nimport { type ConfigEntityImportOptions } from '@rockcarver/frodo-lib/types/ops/IdmConfigOps';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport path from 'path';\nimport propertiesReader from 'properties-reader';\nimport replaceall from 'replaceall';\n\nimport {\n createProgressIndicator,\n printError,\n printMessage,\n stopProgressIndicator,\n} from '../utils/Console';\n\nconst { stringify } = frodo.utils.json;\n\nconst {\n unSubstituteEnvParams,\n areScriptHooksValid,\n getFilePath,\n getTypedFilename,\n readFiles,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readConfigEntities,\n readConfigEntity,\n exportConfigEntities,\n updateConfigEntity,\n importConfigEntities,\n} = frodo.idm.config;\nconst { queryManagedObjects } = frodo.idm.managed;\nconst { testConnectorServers } = frodo.idm.system;\n\n/**\n * Warn about and list offline remote connector servers\n * @return {Promise<boolean>} a promise that resolves to true if a warning was printed, false otherwise\n */\nexport async function warnAboutOfflineConnectorServers(): Promise<boolean> {\n try {\n const all = await testConnectorServers();\n const offline = all\n .filter((status) => !status.ok)\n .map((status) => status.name);\n if (offline.length > 0) {\n printMessage(\n `\\nThe following connector server(s) are offline and their connectors and configuration unavailable:\\n${offline.join(\n '\\n'\n )}`,\n 'warn'\n );\n return true;\n }\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * List all IDM configuration objects\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function listAllConfigEntities(): Promise<boolean> {\n try {\n const configurations = await readConfigEntities();\n for (const configEntity of configurations) {\n printMessage(`${configEntity._id}`, 'data');\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export an IDM configuration object.\n * @param {string} id the desired configuration object\n * @param {string} file optional export file\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportConfigEntity(\n id: string,\n file: string\n): Promise<boolean> {\n try {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`${id}`, 'idm');\n }\n const configEntity = await readConfigEntity(id);\n fs.writeFile(\n getFilePath(fileName, true),\n stringify(configEntity),\n (err) => {\n if (err) {\n printError(err, `Error exporting config entity ${id}`);\n }\n }\n );\n return true;\n } catch (error) {\n printError(error, `Error exporting config entity ${id}`);\n }\n return false;\n}\n\n/**\n * Export all IDM configuration objects into separate JSON files in a directory specified by <directory>\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportAllRawConfigEntities() {\n try {\n const exportedConfigurations = await exportConfigEntities();\n for (const [id, value] of Object.entries(exportedConfigurations.config)) {\n if (value != null) {\n fse.outputFile(\n getFilePath(`${id}.json`, true),\n stringify(value),\n (err) => {\n if (err) {\n printError(err, `Error exporting raw config entity ${id}`);\n }\n }\n );\n }\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all IDM configuration objects\n * @param {string} entitiesFile JSON file that specifies the config entities to export/import\n * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportAllConfigEntities(\n entitiesFile: string,\n envFile: string\n): Promise<boolean> {\n const errors: Error[] = [];\n try {\n let entriesToExport = [];\n // read list of entities to export\n const data = fs.readFileSync(entitiesFile, 'utf8');\n const entriesData = JSON.parse(data);\n entriesToExport = entriesData.idm;\n\n // read list of configs to parameterize for environment specific values\n const envParams = propertiesReader(envFile);\n\n const configurations = await readConfigEntities();\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Exporting config objects...'\n );\n const entityPromises = [];\n for (const configEntity of configurations) {\n if (entriesToExport.includes(configEntity._id)) {\n entityPromises.push(readConfigEntity(configEntity._id));\n }\n }\n const results = await Promise.all(entityPromises);\n for (const item of results) {\n if (item != null) {\n try {\n let configEntityString = stringify(item);\n envParams.each((key, value) => {\n configEntityString = replaceall(\n value,\n `\\${${key}}`,\n configEntityString\n );\n });\n fse.outputFileSync(\n getFilePath(`${item._id}.json`, true),\n configEntityString\n );\n } catch (error) {\n errors.push(\n new FrodoError(`Error saving config entity ${item._id}`, error)\n );\n }\n }\n }\n if (errors.length > 0) {\n throw new FrodoError(`Error saving config entities`, errors);\n }\n stopProgressIndicator(null, 'success');\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import an IDM configuration object by id from file.\n * @param {string} entityId the configuration object to import\n * @param {string} file optional file to import\n * @param {boolean} validate validate script hooks\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importConfigEntityByIdFromFile(\n entityId: string,\n file?: string,\n validate?: boolean\n): Promise<boolean> {\n try {\n if (!file) {\n file = getTypedFilename(entityId, 'idm');\n }\n\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n\n const entityData = JSON.parse(fileData);\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n await updateConfigEntity(entityId, entityData);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import IDM configuration object from file.\n * @param {string} file optional file to import\n * @param {boolean} validate validate script hooks\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importConfigEntityFromFile(\n file: string,\n validate?: boolean\n): Promise<boolean> {\n try {\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n const entityData = JSON.parse(fileData);\n const entityId = entityData._id;\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n await updateConfigEntity(entityId, entityData);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import all IDM configuration objects from separate JSON files in a directory specified by <directory>\n * @param {ConfigEntityImportOptions} options import options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importAllRawConfigEntities(\n options: ConfigEntityImportOptions = {\n validate: false,\n }\n) {\n let indicatorId: string;\n const baseDirectory = getWorkingDirectory();\n try {\n const files = await readFiles(baseDirectory);\n const jsonObjects = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ content }) => JSON.parse(content))\n .map((entity) => [entity._id, entity]);\n const importData = {\n config: Object.fromEntries(jsonObjects),\n };\n\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing config entities from ${baseDirectory}...`\n );\n\n await importConfigEntities(importData, options);\n stopProgressIndicator(\n indicatorId,\n `Imported ${jsonObjects.length} config entities`,\n 'success'\n );\n return true;\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing config entities from ${baseDirectory}.`,\n 'fail'\n );\n printError(error);\n }\n return false;\n}\n\n/**\n * Import all IDM configuration objects\n * @param {string} entitiesFile JSON file that specifies the config entities to export/import\n * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import\n * @param {ConfigEntityImportOptions} options import options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importAllConfigEntities(\n entitiesFile: string,\n envFile: string,\n options: ConfigEntityImportOptions = {\n validate: false,\n }\n): Promise<boolean> {\n let indicatorId: string;\n const baseDirectory = getWorkingDirectory();\n try {\n const entriesToImport = JSON.parse(\n fs.readFileSync(entitiesFile, 'utf8')\n ).idm;\n const envReader = propertiesReader(envFile);\n\n const files = await readFiles(baseDirectory);\n const jsonObjects = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ content }) =>\n JSON.parse(unSubstituteEnvParams(content, envReader))\n )\n .filter((entity) => entriesToImport.includes(entity._id))\n .map((entity) => [entity._id, entity]);\n\n const importData = {\n config: Object.fromEntries(jsonObjects),\n };\n\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing config entities from ${baseDirectory}...`\n );\n\n await importConfigEntities(importData, options);\n stopProgressIndicator(\n indicatorId,\n `Imported ${jsonObjects.length} config entities`,\n 'success'\n );\n return true;\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing config entities from ${baseDirectory}.`,\n 'fail'\n );\n printError(error);\n }\n return false;\n}\n\n/**\n * Count number of managed objects of a given type\n * @param {String} type managed object type, e.g. alpha_user\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function countManagedObjects(type: string): Promise<boolean> {\n try {\n const result = await queryManagedObjects(type);\n printMessage(`${type}: ${result.length}`, 'data');\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IdmOps.js","names":["frodo","FrodoError","fs","fse","path","propertiesReader","replaceall","createProgressIndicator","printError","printMessage","stopProgressIndicator","stringify","utils","json","unSubstituteEnvParams","areScriptHooksValid","getFilePath","getTypedFilename","readFiles","getWorkingDirectory","readConfigEntities","readConfigEntity","exportConfigEntities","updateConfigEntity","importConfigEntities","idm","config","queryManagedObjects","managed","testConnectorServers","system","warnAboutOfflineConnectorServers","all","offline","filter","status","ok","map","name","length","join","error","listAllConfigEntities","configurations","configEntity","_id","exportConfigEntity","id","file","fileName","writeFile","err","exportAllRawConfigEntities","exportedConfigurations","value","Object","entries","outputFile","exportAllConfigEntities","entitiesFile","envFile","errors","entriesToExport","data","readFileSync","entriesData","JSON","parse","envParams","undefined","entityPromises","includes","push","results","Promise","item","configEntityString","each","key","outputFileSync","importConfigEntityByIdFromFile","entityId","validate","fileData","resolve","process","cwd","entityData","isValid","importConfigEntityFromFile","filePath","indicatorId","importAllRawConfigEntities","options","baseDirectory","files","jsonObjects","toLowerCase","endsWith","content","entity","importData","fromEntries","importAllConfigEntities","entriesToImport","envReader","countManagedObjects","type","result"],"sources":["../../src/ops/IdmOps.ts"],"sourcesContent":["import { frodo, FrodoError } from '@rockcarver/frodo-lib';\nimport { type ConfigEntityImportOptions } from '@rockcarver/frodo-lib/types/ops/IdmConfigOps';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport path from 'path';\nimport propertiesReader from 'properties-reader';\nimport replaceall from 'replaceall';\n\nimport {\n createProgressIndicator,\n printError,\n printMessage,\n stopProgressIndicator,\n} from '../utils/Console';\n\nconst { stringify } = frodo.utils.json;\n\nconst {\n unSubstituteEnvParams,\n areScriptHooksValid,\n getFilePath,\n getTypedFilename,\n readFiles,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readConfigEntities,\n readConfigEntity,\n exportConfigEntities,\n updateConfigEntity,\n importConfigEntities,\n} = frodo.idm.config;\nconst { queryManagedObjects } = frodo.idm.managed;\nconst { testConnectorServers } = frodo.idm.system;\n\n/**\n * Warn about and list offline remote connector servers\n * @return {Promise<boolean>} a promise that resolves to true if a warning was printed, false otherwise\n */\nexport async function warnAboutOfflineConnectorServers(): Promise<boolean> {\n try {\n const all = await testConnectorServers();\n const offline = all\n .filter((status) => !status.ok)\n .map((status) => status.name);\n if (offline.length > 0) {\n printMessage(\n `\\nThe following connector server(s) are offline and their connectors and configuration unavailable:\\n${offline.join(\n '\\n'\n )}`,\n 'warn'\n );\n return true;\n }\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * List all IDM configuration objects\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function listAllConfigEntities(): Promise<boolean> {\n try {\n const configurations = await readConfigEntities();\n for (const configEntity of configurations) {\n printMessage(`${configEntity._id}`, 'data');\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export an IDM configuration object.\n * @param {string} id the desired configuration object\n * @param {string} file optional export file\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportConfigEntity(\n id: string,\n file: string\n): Promise<boolean> {\n try {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`${id}`, 'idm');\n }\n const configEntity = await readConfigEntity(id);\n fs.writeFile(\n getFilePath(fileName, true),\n stringify(configEntity),\n (err) => {\n if (err) {\n printError(err, `Error exporting config entity ${id}`);\n }\n }\n );\n return true;\n } catch (error) {\n printError(error, `Error exporting config entity ${id}`);\n }\n return false;\n}\n\n/**\n * Export all IDM configuration objects into separate JSON files in a directory specified by <directory>\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportAllRawConfigEntities() {\n try {\n const exportedConfigurations = await exportConfigEntities();\n for (const [id, value] of Object.entries(exportedConfigurations.config)) {\n if (value != null) {\n fse.outputFile(\n getFilePath(`${id}.json`, true),\n stringify(value),\n (err) => {\n if (err) {\n printError(err, `Error exporting raw config entity ${id}`);\n }\n }\n );\n }\n }\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all IDM configuration objects\n * @param {string} entitiesFile JSON file that specifies the config entities to export/import\n * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function exportAllConfigEntities(\n entitiesFile: string,\n envFile: string\n): Promise<boolean> {\n const errors: Error[] = [];\n try {\n let entriesToExport = [];\n // read list of entities to export\n const data = fs.readFileSync(entitiesFile, 'utf8');\n const entriesData = JSON.parse(data);\n entriesToExport = entriesData.idm;\n\n // read list of configs to parameterize for environment specific values\n const envParams = propertiesReader(envFile);\n\n const configurations = await readConfigEntities();\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Exporting config objects...'\n );\n const entityPromises = [];\n for (const configEntity of configurations) {\n if (entriesToExport.includes(configEntity._id)) {\n entityPromises.push(readConfigEntity(configEntity._id));\n }\n }\n const results = await Promise.all(entityPromises);\n for (const item of results) {\n if (item != null) {\n try {\n let configEntityString = stringify(item);\n envParams.each((key, value) => {\n configEntityString = replaceall(\n value,\n `\\${${key}}`,\n configEntityString\n );\n });\n fse.outputFileSync(\n getFilePath(`${item._id}.json`, true),\n configEntityString\n );\n } catch (error) {\n errors.push(\n new FrodoError(`Error saving config entity ${item._id}`, error)\n );\n }\n }\n }\n if (errors.length > 0) {\n throw new FrodoError(`Error saving config entities`, errors);\n }\n stopProgressIndicator(null, 'success');\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import an IDM configuration object by id from file.\n * @param {string} entityId the configuration object to import\n * @param {string} file optional file to import\n * @param {boolean} validate validate script hooks\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importConfigEntityByIdFromFile(\n entityId: string,\n file?: string,\n validate?: boolean\n): Promise<boolean> {\n try {\n if (!file) {\n file = getTypedFilename(entityId, 'idm');\n }\n\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n\n const entityData = JSON.parse(fileData);\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n await updateConfigEntity(entityId, entityData);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import IDM configuration object from file.\n * @param {string} file optional file to import\n * @param {boolean} validate validate script hooks\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importConfigEntityFromFile(\n file: string,\n validate?: boolean\n): Promise<boolean> {\n const filePath = getFilePath(file);\n let indicatorId: string;\n try {\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${filePath}...`\n );\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), filePath),\n 'utf8'\n );\n const entityData = JSON.parse(fileData);\n const entityId = entityData._id;\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n await updateConfigEntity(entityId, entityData);\n stopProgressIndicator(\n indicatorId,\n `Imported ${entityId} from ${filePath}.`,\n 'success'\n );\n return true;\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error importing ${filePath}.`, 'fail');\n printError(error);\n }\n return false;\n}\n\n/**\n * Import all IDM configuration objects from separate JSON files in a directory specified by <directory>\n * @param {ConfigEntityImportOptions} options import options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importAllRawConfigEntities(\n options: ConfigEntityImportOptions = {\n validate: false,\n }\n) {\n let indicatorId: string;\n const baseDirectory = getWorkingDirectory();\n try {\n const files = await readFiles(baseDirectory);\n const jsonObjects = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ content }) => JSON.parse(content))\n .map((entity) => [entity._id, entity]);\n const importData = {\n config: Object.fromEntries(jsonObjects),\n };\n\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing config entities from ${baseDirectory}...`\n );\n\n await importConfigEntities(importData, options);\n stopProgressIndicator(\n indicatorId,\n `Imported ${jsonObjects.length} config entities`,\n 'success'\n );\n return true;\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing config entities from ${baseDirectory}.`,\n 'fail'\n );\n printError(error);\n }\n return false;\n}\n\n/**\n * Import all IDM configuration objects\n * @param {string} entitiesFile JSON file that specifies the config entities to export/import\n * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import\n * @param {ConfigEntityImportOptions} options import options\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function importAllConfigEntities(\n entitiesFile: string,\n envFile: string,\n options: ConfigEntityImportOptions = {\n validate: false,\n }\n): Promise<boolean> {\n let indicatorId: string;\n const baseDirectory = getWorkingDirectory();\n try {\n const entriesToImport = JSON.parse(\n fs.readFileSync(entitiesFile, 'utf8')\n ).idm;\n const envReader = propertiesReader(envFile);\n\n const files = await readFiles(baseDirectory);\n const jsonObjects = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ content }) =>\n JSON.parse(unSubstituteEnvParams(content, envReader))\n )\n .filter((entity) => entriesToImport.includes(entity._id))\n .map((entity) => [entity._id, entity]);\n\n const importData = {\n config: Object.fromEntries(jsonObjects),\n };\n\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing config entities from ${baseDirectory}...`\n );\n\n await importConfigEntities(importData, options);\n stopProgressIndicator(\n indicatorId,\n `Imported ${jsonObjects.length} config entities`,\n 'success'\n );\n return true;\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing config entities from ${baseDirectory}.`,\n 'fail'\n );\n printError(error);\n }\n return false;\n}\n\n/**\n * Count number of managed objects of a given type\n * @param {String} type managed object type, e.g. alpha_user\n * @return {Promise<boolean>} a promise that resolves to true if successful, false otherwise\n */\nexport async function countManagedObjects(type: string): Promise<boolean> {\n try {\n const result = await queryManagedObjects(type);\n printMessage(`${type}: ${result.length}`, 'data');\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n"],"mappings":"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"}
|