@rockcarver/frodo-cli 0.19.5-1 → 0.20.0

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,113 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.20.0] - 2023-01-13
11
+
12
+ ### Added
13
+
14
+ - Full support for Identity Cloud Service Accounts across all commands. Three options to leverage service accounts:
15
+
16
+ 1. Connection profiles for daily CLI usage:
17
+
18
+ For daily admin and development tasks, using the new `frodo conn save` command (see details under next bullet) is the easiest way to get going with service accounts. To migrate an existing connection profile to service accounts and automatically create a service account for your tenant admin, simply issue the following command:
19
+
20
+ % frodo conn save service-accounts
21
+ Connected to https://openam-service-accounts.forgeblocks.com/am [alpha] as user volker.scheuber@forgerock.com
22
+ Created and added service account Frodo-SA-1673586189578 with id 99c04bba-7213-463b-9a27-ceafa8a95734 to profile.
23
+ Saved connection profile https://openam-service-accounts.forgeblocks.com/am
24
+ %
25
+
26
+ Then validate your connection profile is using the new service account:
27
+
28
+ % frodo info service-accounts
29
+ Connected to https://openam-service-accounts.forgeblocks.com/am [alpha] as service account Frodo-SA-1673586189578 [99c04bba-7213-463b-9a27-ceafa8a95734]
30
+
31
+ Host URL │https://openam-service-accounts.forgeblocks.com/am
32
+ AM Version │7.3.0-2022-10-SNAPSHOT Build 9a1793c301ef579705e59b66ce57587f553e915f (2022-December-13 10:05)
33
+ Subject (Type) │Frodo-SA-1673586189578 [99c04bba-7213-463b-9a27-ceafa8a95734] (Service Account)
34
+ Deployment Type│cloud
35
+ Cookie Name │e8b2bd07d5440d3
36
+ Immutable │false
37
+ Locked │false
38
+ Region │us-west1
39
+ Tier │other
40
+
41
+ Bearer token:
42
+ eyJ0eXAiOiJKV1QiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiYWxnIjoiZGlyIn0..JD1iu64iGZZoGNwEr-iF2w.af-0-UDDOdusAETjw9YE3YnjOPr6TrdQrBLcl1lxf5RpNThfRhD08xvu1WtJbUZgvjbWdajECEFJfnEinnrUdpe9l0tHU6gAxDrRmu9hAjt0AB3PFSk9BE5SlwvaGoW5vrF4oH0IYtuv4899hFF8KGNYUtou143xmSrsLH37862YiAeiRKtjaQsVUrdbDPAFnKgGRxJIiXp-UE0ZCQQGSqm-Gj0AqVvo-Piib9THrEbbJCzdc00RPaCU2Ra1DH9PDid7ix-zfuind5IgEXxA8XwBM7kSEkiDLUWZ8EaFhn6YXwIHjXetacgYvvDaUav2Fq5baIitnG_LIrCm32XzcDkVnph4mVklBwfbQbWE6BGXEVLK-QLdDupaQw-bic-yVs2d7PBk2y70gbChHCQOm6-MepkYznP4wKoRR1gkqCdl51QIp-tsFB5K2plrKXiwsfHlHKfFKmsbdQUmH7xJFZQRhAtR_pKm-vHPOrPfBh0VbAdLRSkSeOZUABFH56X3gwXIpG_zuH42bQQkM9AlkB-lZrLf4jN0zFq-2ZN-zDgRR9h6qiiD3p9BDmFfaorUDTfFSrfaKas7OIp5ooW8Kqpv28RRtRtvfex0vT_kRbWl5R08MPWZDKZbx4IMyuun-2pYJ-F2-dvfA4A-jRvWIvC6jTUTu-RZZ0Yw1F2lgwFOVbmpMmG2uGHp5GceWePsZ34FVtJuaTd5D-uq_FoAb3HQ7FGEgUMJN_q82hCCX3URv_ocbFMjYwctdUqV_Ed-__A_9lbHHr8D2Uw_Qo0mwku7qwNBTS0-OcrwDvBOJohzRbpbfim-Sq2UzV9SBzzXNK7sMft1pNfu2-saOwPfy6SE0u42-HDqxE9t4MkklSroPY0oDUxO58ET8LXnewGhC9Tt0XTk6WA2rNLcNirhFqdmtKgfrSMQ_t22_DQEDwXpXqtHGmDoltJe7x_6Ofh0W5l7_A71MoHeFpVa_AHpHybnaF4fvUbD284wOV8i22SqrUKuHoJ3o6_g5JlhvMCvb4OZQ-ltxSf98aPsB9nCSthYg5-GkiR_r5mK1w9gZkBTXfYs0qC8-zYEQb4WNiI9.2JGMj9iW6YD-RE_dGkL7_w
43
+ %
44
+
45
+ Once you have verified that your service account works, go ahead and enable MFA for your tenant admin account!
46
+
47
+ 2. CLI parameters:
48
+
49
+ All commands support the following new options to use service accounts:
50
+
51
+ - `--sa-id <uuid>` Service account's uuid. If specified, must also include `--sa-jwk-file`.
52
+ - `--sa-jwk-file <file>` File containing the service account's java web key (jwk). Jwk must contain private key! If specified, must also include `--sa-id`.
53
+
54
+ This is a great way to leverage the nice UI to create and manage service accounts and then use one of the accounts with Frodo.
55
+
56
+ 3. Environment variables for CI/CD
57
+
58
+ For CI/CD pipelines, environment variables are preferable over command line parameters, because they are not visible in system logs:
59
+
60
+ - `FRODO_SA_ID`: Service account's uuid. If set, must also set `FRODO_SA_JWK`.
61
+ - `FRODO_SA_JWK`: Service account's java web key (jwk) as single-line string. Jwk must contain private key! If set, must also set `FRODO_SA_ID`.
62
+
63
+ - \#143: Support Identity Cloud Service Accounts in `frodo conn save|add` command
64
+
65
+ 1. The `frodo conn add` command is renamed to `frodo conn save` and `add` is added as an alias for backwards compatibility.
66
+ 2. The `frodo conn save` command supports the following new options to manage service accounts:
67
+ 1. `--sa-id <uuid>` Service account's uuid. If specified, must also include `--sa-jwk-file`. Ignored with `--no-sa`.
68
+ 2. `--sa-jwk-file <file>` File containing the service account's java web key (jwk). Jwk must contain private key! If specified, must also include `--sa-id`. Ignored with `--no-sa`.
69
+ 3. `--no-sa` Do not add service account.
70
+ 3. The existing `--no-validate` option also applies to service account operations, allowing to add service account configuration to a connection profile without validating it, typical use case is an offline situation.
71
+ 4. The `frodo conn save` command automatically creates a new service account and adds it to an existing ID Cloud profile without service account or to a new ID Cloud profile. It does not do that if the `--no-sa` option is supplied.
72
+ 1. If `--sa-id` and `--sa-jwk-file` are supplied, `frodo conn save` adds the existing service account specified by those two parameters to the profile instead of creating a new service account.
73
+ 2. The `frodo conn save` command checks if the ID Cloud tenant supports service accounts before performing any service account operations.
74
+ 5. The `frodo conn save` command validates service account configuration unless the `--no-validate` options is supplied.
75
+
76
+ - Add support for additional environment variables:
77
+
78
+ - `FRODO_SA_ID`: Service account's uuid. If set, must also set `FRODO_SA_JWK`.
79
+ - `FRODO_SA_JWK`: Service account's java web key (jwk) as single-line string. Jwk must contain private key! If set, must also set `FRODO_SA_ID`.
80
+ - `FRODO_AUTHENTICATION_SERVICE=journey`: Specify a login journey for frodo to use.
81
+ - `FRODO_MOCK=1`: Enable mocking. If enabled, frodo-lib replays recorded API responses instead of connecting to a platform instance.
82
+ - `FRODO_POLLY_LOG_LEVEL=info`: Frodo mock engine log level (`trace`, `debug`, `info`, `warn`, `error`, `silent`). This is helpful for troubleshooting the mock capability, only.
83
+
84
+ Environment variables added in 0.19.0:
85
+
86
+ - `FRODO_HOST`
87
+ - `FRODO_REALM`
88
+ - `FRODO_USERNAME`
89
+ - `FRODO_PASSWORD`
90
+ - `FRODO_SA_ID`
91
+ - `FRODO_SA_JWK`
92
+ - `FRODO_LOG_KEY`
93
+ - `FRODO_LOG_SECRET`
94
+ - `FRODO_DEBUG`
95
+
96
+ - Enhanced the `frodo info` command to give more details for Identity Cloud tenants.
97
+
98
+ - Warn if IDM connector servers are offline
99
+
100
+ - Add mock mode for library to allow unit testing of clients using the library, like frodo-cli. This initial release contains minimal mock data. Enable mock mode using `FRODO_MOCK=1`.
101
+
102
+ - Updated list of contributors in package.json
103
+
104
+ - Add linux arm64 binary builds
105
+
106
+ ### Changed
107
+
108
+ - Updated to frodo-lib 0.18.0
109
+ - More automated testing
110
+
111
+ ### Fixed
112
+
113
+ - \#161: Frodo now properly adds connection profiles with log credentials
114
+
115
+ ## [0.19.5-2] - 2023-01-13
116
+
10
117
  ## [0.19.5-1] - 2023-01-12
11
118
 
12
119
  ## [0.19.5-0] - 2023-01-12
@@ -57,37 +164,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
57
164
  2. The `frodo conn save` command checks if the ID Cloud tenant supports service accounts before performing any service account operations.
58
165
  5. The `frodo conn save` command validates service account configuration unless the `--no-validate` options is supplied.
59
166
  - \#101: Added new `frodo service` set of commands to manage AM realm services (`baseurl`, `DataStoreService`, `oauth-oidc`, `policyconfiguration`, `selfServiceTrees`, `SocialIdentityProviders`, `validation`, etc.) and global services (e.g. `CorsService`, `dashboard`, etc.).
60
- frodo service
61
- delete Delete AM services.
62
- export Export AM services.
63
- import Import AM services.
64
- list List AM services.
167
+ frodo service
168
+ delete Delete AM services.
169
+ export Export AM services.
170
+ import Import AM services.
171
+ list List AM services.
65
172
  - Added new `frodo idm import` command.
66
173
  - \#98: Add support for Agents / Gateways
67
- frodo agent Manage agents.
68
- delete Delete agents of any type.
69
- describe Describe agents of any type.
70
- export Export agents of any type.
71
- import Import agents of any type.
72
- list List agents of any type.
73
- gateway Manage gateway agents.
74
- delete Delete gateway agents.
75
- describe Describe gateway agents.
76
- export Export gateway agents.
77
- import Import gateway agents.
78
- list List gateway agents.
79
- java Manage java agents.
80
- delete Delete java agents.
81
- describe Describe java agents.
82
- export Export java agents.
83
- import Import java agents.
84
- list List java agents.
85
- web Manage web agents.
86
- delete Delete web agents.
87
- describe Describe web agents.
88
- export Export web agents.
89
- import Import web agents.
90
- list List web agents.
174
+ frodo agent Manage agents.
175
+ delete Delete agents of any type.
176
+ describe Describe agents of any type.
177
+ export Export agents of any type.
178
+ import Import agents of any type.
179
+ list List agents of any type.
180
+ gateway Manage gateway agents.
181
+ delete Delete gateway agents.
182
+ describe Describe gateway agents.
183
+ export Export gateway agents.
184
+ import Import gateway agents.
185
+ list List gateway agents.
186
+ java Manage java agents.
187
+ delete Delete java agents.
188
+ describe Describe java agents.
189
+ export Export java agents.
190
+ import Import java agents.
191
+ list List java agents.
192
+ web Manage web agents.
193
+ delete Delete web agents.
194
+ describe Describe web agents.
195
+ export Export web agents.
196
+ import Import web agents.
197
+ list List web agents.
91
198
  - Added `--raw` option to `frodo saml import` and `frodo saml export` commands. The new option uses the classic (pre 7.0.0) SAML REST APIs. This allows Frodo to export and import SAML entity providers from pre 7 platform instances.
92
199
  - New default options `--verbose`, `--debug`, and `--curlirize` for all commands
93
200
 
@@ -186,7 +293,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
186
293
 
187
294
  ### Fixed
188
295
 
189
- - \#88: `frodo idm export` now properly regognizes `-N`/`--name` option
296
+ - \#88: `frodo idm export` now properly regognizes `-N`/`--name` option
190
297
 
191
298
  ## [0.16.2-1] - 2022-10-11
192
299
 
@@ -325,9 +432,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
325
432
 
326
433
  - Frodo now allows two new parameters when adding a connection profile:
327
434
 
328
- \--authentication-service [service] Name of the authentication service/tree to use.
435
+ \--authentication-service [service] Name of the authentication service/tree to use.
329
436
 
330
- \--authentication-header-overrides [headers] Map of headers: {"host":"am.example.com:8081"}.
437
+ \--authentication-header-overrides [headers] Map of headers: {"host":"am.example.com:8081"}.
331
438
 
332
439
  These parameters are currently only supported in the `frodo conn add` command and the configuration elements will be automatically applied to commands issued using that connection profile.
333
440
 
@@ -337,13 +444,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
337
444
  Saving creds in /Users/vscheuber/.frodo/.frodorc...
338
445
  Updating connection profile https://platform.example.com:9443/am
339
446
  Advanced setting: Authentication Service: ldapService
340
- Advanced setting: Authentication Header Overrides:
447
+ Advanced setting: Authentication Header Overrides:
341
448
  { host: 'am.example.com:8081' }
342
449
  %
343
450
 
344
451
  After the connection profile is created with the additional parameters, the environment can be accessed as usual. In this case it requires the `-k` parameter for every command, as the environment uses a self-signed certificate.
345
452
 
346
- % frodo journey list platform alpha -k
453
+ % frodo journey list platform alpha -k
347
454
  ForgeOps deployment detected.
348
455
  Connected to ForgeRock Access Management 7.2.0 Build 64ef7ebc01ed3df1a1264d7b0400351bc101361f (2022-June-27 08:15)
349
456
  Listing journeys in realm "alpha"...
@@ -620,9 +727,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
620
727
 
621
728
  - Changed `idm` sub-commands to align with other commands:
622
729
  - The sub-commands `export`, `exportAll`, and `exportAllRaw` have been collapsed into one: `export`
623
- - `idm export -A` (`--all-separate`) is now the way to export all idm configuration.
730
+ - `idm export -A` (`--all-separate`) is now the way to export all idm configuration.
624
731
  - Options `-e` and `-E` select old `exportAll` functionality with variable replacement and filtering
625
- - Omitting options `-e` and `-E`, selects the old `exportAllRaw` functionality without variable replacement and without filtering
732
+ - Omitting options `-e` and `-E`, selects the old `exportAllRaw` functionality without variable replacement and without filtering
626
733
  - Renamed sample resource files for `idm export` command:
627
734
  - `<frodo home>/resources/sampleEntitiesFile.json`
628
735
  - `<frodo home>/resources/sampleEnvFile.env`
@@ -847,7 +954,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
847
954
  - Fixed problem with adding connection profiles
848
955
  - Miscellaneous bug fixes
849
956
 
850
- [Unreleased]: https://github.com/rockcarver/frodo-cli/compare/v0.19.5-1...HEAD
957
+ [Unreleased]: https://github.com/rockcarver/frodo-cli/compare/v0.20.0...HEAD
958
+
959
+ [0.20.0]: https://github.com/rockcarver/frodo-cli/compare/v0.19.5-2...v0.20.0
960
+
961
+ [0.19.5-2]: https://github.com/rockcarver/frodo-cli/compare/v0.19.5-1...v0.19.5-2
851
962
 
852
963
  [0.19.5-1]: https://github.com/rockcarver/frodo-cli/compare/v0.19.5-0...v0.19.5-1
853
964
 
@@ -1,5 +1,4 @@
1
1
  import fs from 'fs';
2
- import _ from 'lodash';
3
2
  import { printMessage, createProgressBar, updateProgressBar, stopProgressBar, showSpinner, succeedSpinner, failSpinner, createTable, debugMessage } from '../utils/Console';
4
3
  import { ExportImportUtils, Journey, Types, state } from '@rockcarver/frodo-lib';
5
4
  import * as CirclesOfTrust from './CirclesOfTrustOps';
@@ -10,6 +9,7 @@ import * as Saml2 from './Saml2Ops';
10
9
  import * as Script from './ScriptOps';
11
10
  import * as Theme from './ThemeOps';
12
11
  import wordwrap from './utils/Wordwrap';
12
+ import { cloneDeep } from './utils/OpsUtils';
13
13
  const {
14
14
  getJourneys,
15
15
  importAllJourneys,
@@ -227,11 +227,11 @@ export async function importFirstJourneyFromFile(file, options) {
227
227
  const verbose = state.default.session.getDebug();
228
228
  fs.readFile(file, 'utf8', async (err, data) => {
229
229
  if (err) throw err;
230
- let journeyData = _.cloneDeep(JSON.parse(data));
230
+ let journeyData = cloneDeep(JSON.parse(data));
231
231
  let journeyId = null;
232
232
  // single tree
233
233
  if (journeyData.tree) {
234
- journeyId = _.cloneDeep(journeyData.tree._id);
234
+ journeyId = cloneDeep(journeyData.tree._id);
235
235
  }
236
236
  // multiple trees, so get the first tree
237
237
  else if (journeyData.trees) {
@@ -1 +1 @@
1
- {"version":3,"file":"JourneyOps.js","names":["fs","_","printMessage","createProgressBar","updateProgressBar","stopProgressBar","showSpinner","succeedSpinner","failSpinner","createTable","debugMessage","ExportImportUtils","Journey","Types","state","CirclesOfTrust","EmailTemplate","Idp","Node","Saml2","Script","Theme","wordwrap","getJourneys","importAllJourneys","importJourney","resolveDependencies","createMultiTreeExportTemplate","exportJourney","onlineTreeExportResolver","getTreeDescendents","getNodeRef","getTypedFilename","saveJsonToFile","getRealmString","listJourneys","long","analyze","journeys","journeyStub","table","push","_id","enabled","uiConfig","categories","JSON","parse","join","toString","exportPromises","useStringArrays","deps","journeyExports","Promise","all","journeyExport","tree","getJourneyClassification","error","response","data","exportJourneyToFile","journeyId","file","options","verbose","default","session","getDebug","getDirectory","dir","replace","existsSync","mkdirSync","recursive","fileData","exportJourneysToFile","fileName","trees","length","exportData","meta","exportJourneysToFiles","importJourneyFromFile","readFile","err","journeyData","installedJourneys","map","x","unresolvedJourneys","resolvedJourneys","Object","keys","then","catch","importError","journey","importFirstJourneyFromFile","cloneDeep","treeId","hasOwnProperty","call","importJourneysFromFile","importJourneysFromFiles","names","readdirSync","jsonFiles","filter","name","toLowerCase","endsWith","allJourneysData","readFileSync","it","JourneyClassification","STANDARD","CLOUD","CUSTOM","PREMIUM","getJourneyClassificationMd","getOneLineDescription","treeObj","description","getOneLineDescriptionMd","describeTreeDescendents","descendents","depth","values","indent","Array","fill","descendent","describeTreeDescendentsMd","markdown","describeJourney","resolveTreeExport","allNodes","nodes","innerNodes","nodeTypeMap","nodeData","_type","getAmVersion","originAmVersion","setAmVersion","entries","nodeType","count","String","getNodeClassification","nodeObj","themes","themeData","scripts","scriptData","emailTemplates","templateData","socialIdentityProviders","socialIdpData","saml2Entities","entityProviderData","circlesOfTrust","cotData","describeJourneyMd","getNodeClassificationMd","getTableHeaderMd","getTableRowMd"],"sources":["ops/JourneyOps.ts"],"sourcesContent":["import fs from 'fs';\nimport _ from 'lodash';\nimport {\n NodeSkeleton,\n TreeSkeleton,\n} from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport {\n MultiTreeExportInterface,\n SingleTreeExportInterface,\n TreeDependencyMapInterface,\n TreeExportOptions,\n TreeExportResolverInterface,\n TreeImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/OpsTypes';\nimport {\n printMessage,\n createProgressBar,\n updateProgressBar,\n stopProgressBar,\n showSpinner,\n succeedSpinner,\n failSpinner,\n createTable,\n debugMessage,\n} from '../utils/Console';\nimport {\n ExportImportUtils,\n Journey,\n Types,\n state,\n} from '@rockcarver/frodo-lib';\nimport * as CirclesOfTrust from './CirclesOfTrustOps';\nimport * as EmailTemplate from './EmailTemplateOps';\nimport * as Idp from './IdpOps';\nimport * as Node from './NodeOps';\nimport * as Saml2 from './Saml2Ops';\nimport * as Script from './ScriptOps';\nimport * as Theme from './ThemeOps';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n getJourneys,\n importAllJourneys,\n importJourney,\n resolveDependencies,\n createMultiTreeExportTemplate,\n exportJourney,\n onlineTreeExportResolver,\n getTreeDescendents,\n getNodeRef,\n} = Journey;\nconst { getTypedFilename, saveJsonToFile, getRealmString } = ExportImportUtils;\n\n/**\n * List all the journeys/trees\n * @param {boolean} long Long version, all the fields\n * @param {boolean} analyze Analyze journeys/trees for custom nodes (expensive)\n * @returns {Promise<TreeSkeleton[]>} a promise that resolves to an array journey objects\n */\nexport async function listJourneys(\n long = false,\n analyze = false\n): Promise<TreeSkeleton[]> {\n let journeys = [];\n try {\n journeys = await getJourneys();\n if (!long && !analyze) {\n for (const journeyStub of journeys) {\n printMessage(`${journeyStub['_id']}`, 'data');\n }\n } else {\n if (!analyze) {\n const table = createTable(['Name', 'Status', 'Tags']);\n for (const journeyStub of journeys) {\n table.push([\n `${journeyStub._id}`,\n journeyStub.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n journeyStub.uiConfig?.categories\n ? wordwrap(\n JSON.parse(journeyStub.uiConfig.categories).join(', '),\n 60\n )\n : '',\n ]);\n }\n printMessage(table.toString(), 'data');\n } else {\n showSpinner('Retrieving details of all journeys...');\n const exportPromises = [];\n try {\n for (const journeyStub of journeys) {\n exportPromises.push(\n exportJourney(journeyStub['_id'], {\n useStringArrays: false,\n deps: false,\n })\n );\n }\n const journeyExports = await Promise.all(exportPromises);\n succeedSpinner('Retrieved details of all journeys.');\n const table = createTable([\n 'Name',\n 'Status',\n 'Classification',\n 'Tags',\n ]);\n for (const journeyExport of journeyExports) {\n table.push([\n `${journeyExport.tree._id}`,\n journeyExport.tree.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n getJourneyClassification(journeyExport).join(', '),\n journeyExport.tree.uiConfig?.categories\n ? wordwrap(\n JSON.parse(journeyExport.tree.uiConfig.categories).join(\n ', '\n ),\n 60\n )\n : '',\n ]);\n }\n printMessage(table.toString(), 'data');\n } catch (error) {\n failSpinner('Error retrieving details of all journeys.');\n printMessage(error.response.data, 'error');\n }\n }\n }\n } catch (error) {\n printMessage(error.response?.data, 'error');\n }\n return journeys;\n}\n\n/**\n * Export journey by id/name to file\n * @param {string} journeyId journey id/name\n * @param {string} file optional export file name\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneyToFile(\n journeyId: string,\n file: string,\n options: TreeExportOptions\n): Promise<void> {\n debugMessage(`exportJourneyToFile: start`);\n const verbose = state.default.session.getDebug();\n if (!file) {\n file = getTypedFilename(journeyId, 'journey');\n }\n if (state.default.session.getDirectory()) {\n const dir = state.default.session.getDirectory().replace(/\\/$/, '');\n debugMessage(`exportJourneyToFile: directory='${dir}'`);\n file = `${dir}/${file}`;\n // create directory if it doesn't exist\n if (!fs.existsSync(dir)) {\n debugMessage(`exportJourneyToFile: creating directory '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n if (!verbose) showSpinner(`${journeyId}`);\n try {\n const fileData: SingleTreeExportInterface = await exportJourney(\n journeyId,\n options\n );\n if (verbose) showSpinner(`${journeyId}`);\n saveJsonToFile(fileData, file);\n succeedSpinner(\n `Exported ${journeyId['brightCyan']} to ${file['brightCyan']}.`\n );\n } catch (error) {\n if (verbose) showSpinner(`${journeyId}`);\n failSpinner(`Error exporting journey ${journeyId}: ${error}`);\n }\n}\n\n/**\n * Export all journeys to file\n * @param {string} file optional export file name\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneysToFile(\n file: string,\n options: TreeExportOptions = {\n deps: false,\n useStringArrays: false,\n }\n): Promise<void> {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Journeys`, 'journeys');\n }\n const trees = await getJourneys();\n const fileData: MultiTreeExportInterface = createMultiTreeExportTemplate();\n createProgressBar(trees.length, 'Exporting journeys...');\n for (const tree of trees) {\n updateProgressBar(`${tree._id}`);\n try {\n const exportData = await exportJourney(tree._id, options);\n delete exportData.meta;\n fileData.trees[tree._id] = exportData;\n } catch (error) {\n printMessage(`Error exporting journey ${tree._id}: ${error}`, 'error');\n }\n }\n saveJsonToFile(fileData, fileName);\n stopProgressBar(`Exported to ${fileName}`);\n}\n\n/**\n * Export all journeys to separate files\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneysToFiles(\n options: TreeExportOptions\n): Promise<void> {\n const trees = await getJourneys();\n createProgressBar(trees.length, 'Exporting journeys...');\n for (const tree of trees) {\n updateProgressBar(`${tree._id}`);\n const fileName = getTypedFilename(`${tree._id}`, 'journey');\n try {\n const exportData: SingleTreeExportInterface = await exportJourney(\n tree._id,\n options\n );\n saveJsonToFile(exportData, fileName);\n } catch (error) {\n // do we need to report status here?\n }\n }\n stopProgressBar('Done');\n}\n\n/**\n * Import a journey from file\n * @param {string} journeyId journey id/name\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneyFromFile(\n journeyId: string,\n file: string,\n options: TreeImportOptions\n) {\n const verbose = state.default.session.getDebug();\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n let journeyData = JSON.parse(data);\n // check if this is a file with multiple trees and get journey by id\n if (journeyData.trees && journeyData.trees[journeyId]) {\n journeyData = journeyData.trees[journeyId];\n } else if (journeyData.trees) {\n journeyData = null;\n }\n\n // if a journeyId was specified, only import the matching journey\n if (journeyData && journeyId === journeyData.tree._id) {\n // attempt dependency resolution for single tree import\n const installedJourneys = (await getJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n showSpinner('Resolving dependencies');\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n succeedSpinner(`Resolved all dependencies.`);\n\n if (!verbose) showSpinner(`Importing ${journeyId}...`);\n importJourney(journeyData, options)\n .then(() => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n succeedSpinner(`Imported ${journeyId}.`);\n })\n .catch((importError) => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${importError}`);\n });\n } else {\n failSpinner(`Unresolved dependencies:`);\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n // end dependency resolution for single tree import\n } else {\n showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${journeyId} not found!`);\n }\n });\n}\n\n/**\n * Import first journey from file\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importFirstJourneyFromFile(\n file: string,\n options: TreeImportOptions\n) {\n const verbose = state.default.session.getDebug();\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n let journeyData = _.cloneDeep(JSON.parse(data));\n let journeyId = null;\n // single tree\n if (journeyData.tree) {\n journeyId = _.cloneDeep(journeyData.tree._id);\n }\n // multiple trees, so get the first tree\n else if (journeyData.trees) {\n for (const treeId in journeyData.trees) {\n if (Object.hasOwnProperty.call(journeyData.trees, treeId)) {\n journeyId = treeId;\n journeyData = journeyData.trees[treeId];\n break;\n }\n }\n }\n\n // if a journeyId was specified, only import the matching journey\n if (journeyData && journeyId) {\n // attempt dependency resolution for single tree import\n const installedJourneys = (await getJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n showSpinner('Resolving dependencies');\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n succeedSpinner(`Resolved all dependencies.`);\n\n if (!verbose) showSpinner(`Importing ${journeyId}...`);\n importJourney(journeyData, options)\n .then(() => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n succeedSpinner(`Imported ${journeyId}.`);\n })\n .catch((importError) => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${importError}`);\n });\n } else {\n failSpinner(`Unresolved dependencies:`);\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n } else {\n showSpinner(`Importing...`);\n failSpinner(`No journeys found!`);\n }\n // end dependency resolution for single tree import\n });\n}\n\n/**\n * Import all journeys from file\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneysFromFile(\n file: string,\n options: TreeImportOptions\n) {\n fs.readFile(file, 'utf8', (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n importAllJourneys(fileData.trees, options);\n });\n}\n\n/**\n * Import all journeys from separate files\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneysFromFiles(options: TreeImportOptions) {\n const names = fs.readdirSync('.');\n const jsonFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.journey.json')\n );\n const allJourneysData = { trees: {} };\n for (const file of jsonFiles) {\n const journeyData = JSON.parse(fs.readFileSync(file, 'utf8'));\n allJourneysData.trees[journeyData.tree._id] = journeyData;\n }\n importAllJourneys(allJourneysData.trees as MultiTreeExportInterface, options);\n}\n\n/**\n * Get journey classification\n * @param {SingleTreeExportInterface} journey journey export\n * @returns {string[]} Colored string array of classifications\n */\nexport function getJourneyClassification(\n journey: SingleTreeExportInterface\n): string[] {\n return Journey.getJourneyClassification(journey).map((it) => {\n switch (it) {\n case Types.JourneyClassification.STANDARD:\n return it.toString()['brightGreen'];\n\n case Types.JourneyClassification.CLOUD:\n return it.toString()['brightMagenta'];\n\n case Types.JourneyClassification.CUSTOM:\n return it.toString()['brightRed'];\n\n case Types.JourneyClassification.PREMIUM:\n return it.toString()['brightYellow'];\n }\n });\n}\n\n/**\n * Get journey classification in markdown\n * @param {SingleTreeExportInterface} journey journey export\n * @returns {string[]} Colored string array of classifications\n */\nexport function getJourneyClassificationMd(\n journey: SingleTreeExportInterface\n): string[] {\n return Journey.getJourneyClassification(journey).map((it) => {\n switch (it) {\n case Types.JourneyClassification.STANDARD:\n return `:green_circle: \\`${it.toString()}\\``;\n\n case Types.JourneyClassification.CLOUD:\n return `:purple_circle: \\`${it.toString()}\\``;\n\n case Types.JourneyClassification.CUSTOM:\n return `:red_circle: \\`${it.toString()}\\``;\n\n case Types.JourneyClassification.PREMIUM:\n return `:yellow_circle: \\`${it.toString()}\\``;\n }\n });\n}\n\n/**\n * Get a one-line description of the tree object\n * @param {TreeSkeleton} treeObj circle of trust object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(treeObj: TreeSkeleton): string {\n const description = `[${treeObj._id['brightCyan']}]`;\n return description;\n}\n\n/**\n * Get a one-line description of the tree object in markdown\n * @param {TreeSkeleton} treeObj circle of trust object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescriptionMd(treeObj: TreeSkeleton): string {\n const description = `${treeObj._id}`;\n return description;\n}\n\n/**\n * Helper function to render a nested list of dependent trees\n * @param {TreeDependencyMapInterface} descendents tree dependency map\n * @param {number} depth level of nesting\n */\nfunction describeTreeDescendents(\n descendents: TreeDependencyMapInterface,\n depth = 0\n) {\n if (depth || Object.values(descendents)[0].length) {\n // heading\n if (depth === 0) {\n printMessage(\n `\\nInner Tree Dependencies (${Object.values(descendents)[0].length}):`,\n 'data'\n );\n }\n const indent = Array(depth * 2)\n .fill(' ')\n .join('');\n const [tree] = Object.keys(descendents);\n printMessage(`${indent}- ${tree['brightCyan']}`, 'data');\n for (const descendent of descendents[tree]) {\n describeTreeDescendents(descendent, depth + 1);\n }\n }\n}\n\n/**\n * Helper function to render a nested list of dependent trees in markdown\n * @param {TreeDependencyMapInterface} descendents tree dependency map\n * @param {number} depth level of nesting\n */\nfunction describeTreeDescendentsMd(\n descendents: TreeDependencyMapInterface,\n depth = 0\n): string {\n let markdown = '';\n if (depth || Object.values(descendents)[0].length) {\n // heading\n if (depth === 0) {\n markdown += `## Inner Tree Dependencies (${\n Object.values(descendents)[0].length\n })\\n`;\n }\n const indent = Array(depth * 2)\n .fill(' ')\n .join('');\n const [tree] = Object.keys(descendents);\n markdown += `${indent}- ${tree}\\n`;\n for (const descendent of descendents[tree]) {\n markdown += describeTreeDescendentsMd(descendent, depth + 1);\n }\n return markdown;\n }\n return markdown;\n}\n\n/**\n * Describe a journey:\n * - Properties, tags, description, name, metadata\n * - Inner tree dependency tree\n * - Node type summary\n * - Nodes\n * - Themes\n * - Scripts\n * - Email templates\n * - Social identity providers\n * - SAML2 entity providers\n * - SAML2 circles of trust\n * @param {SingleTreeExportInterface} journeyData journey export object\n * @param {TreeExportResolverInterface} resolveTreeExport tree export resolver callback function\n */\nexport async function describeJourney(\n journeyData: SingleTreeExportInterface,\n resolveTreeExport: TreeExportResolverInterface = onlineTreeExportResolver\n): Promise<void> {\n const allNodes = {\n ...journeyData.nodes,\n ...journeyData.innerNodes,\n };\n const nodeTypeMap = {};\n\n for (const nodeData of Object.values(allNodes)) {\n if (nodeTypeMap[nodeData._type._id]) {\n nodeTypeMap[nodeData._type._id] += 1;\n } else {\n nodeTypeMap[nodeData._type._id] = 1;\n }\n }\n\n // initialize AM version from file\n if (\n !state.default.session.getAmVersion() &&\n journeyData.meta?.originAmVersion\n ) {\n state.default.session.setAmVersion(journeyData.meta.originAmVersion);\n }\n\n // Journey Name\n printMessage(`${getOneLineDescription(journeyData.tree)}`, 'data');\n printMessage(Array(`[${journeyData.tree._id}]`['length']).fill('=').join(''));\n\n // Description\n if (journeyData.tree.description) {\n printMessage(`\\n${journeyData.tree.description}`, 'data');\n }\n\n // Status\n printMessage(\n `\\nStatus\\n${\n journeyData.tree.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen']\n }`\n );\n\n // Classification\n if (state.default.session.getAmVersion()) {\n printMessage(\n `\\nClassification\\n${getJourneyClassification(journeyData).join(', ')}`,\n 'data'\n );\n }\n\n // Categories/Tags\n if (\n journeyData.tree.uiConfig?.categories &&\n journeyData.tree.uiConfig.categories != '[]'\n ) {\n printMessage('\\nCategories/Tags', 'data');\n printMessage(\n `${JSON.parse(journeyData.tree.uiConfig.categories).join(', ')}`,\n 'data'\n );\n }\n\n // Dependency Tree\n const descendents = await getTreeDescendents(journeyData, resolveTreeExport);\n describeTreeDescendents(descendents);\n\n // Node Types\n if (Object.entries(nodeTypeMap).length) {\n printMessage(\n `\\nNode Types (${Object.entries(nodeTypeMap).length}):`,\n 'data'\n );\n for (const [nodeType, count] of Object.entries(nodeTypeMap)) {\n printMessage(\n `- ${String(count)} [${\n nodeType['brightCyan']\n }] (${Node.getNodeClassification(nodeType).join(', ')})`,\n 'data'\n );\n }\n }\n\n // Nodes\n if (Object.entries(allNodes).length) {\n printMessage(`\\nNodes (${Object.entries(allNodes).length}):`, 'data');\n for (const nodeObj of Object.values<NodeSkeleton>(allNodes)) {\n printMessage(\n `- ${Node.getOneLineDescription(\n nodeObj,\n getNodeRef(nodeObj, journeyData)\n )}`,\n 'data'\n );\n }\n }\n\n // Themes\n if (journeyData.themes?.length) {\n printMessage(`\\nThemes (${journeyData.themes.length}):`, 'data');\n for (const themeData of journeyData.themes) {\n printMessage(`- ${Theme.getOneLineDescription(themeData)}`, 'data');\n }\n }\n\n // Scripts\n if (Object.entries(journeyData.scripts).length) {\n printMessage(\n `\\nScripts (${Object.entries(journeyData.scripts).length}):`,\n 'data'\n );\n for (const scriptData of Object.values(journeyData.scripts)) {\n printMessage(`- ${Script.getOneLineDescription(scriptData)}`, 'data');\n }\n }\n\n // Email Templates\n if (Object.entries(journeyData.emailTemplates).length) {\n printMessage(\n `\\nEmail Templates (${\n Object.entries(journeyData.emailTemplates).length\n }):`,\n 'data'\n );\n for (const templateData of Object.values(journeyData.emailTemplates)) {\n printMessage(\n `- ${EmailTemplate.getOneLineDescription(templateData)}`,\n 'data'\n );\n }\n }\n\n // Social Identity Providers\n if (Object.entries(journeyData.socialIdentityProviders).length) {\n printMessage(\n `\\nSocial Identity Providers (${\n Object.entries(journeyData.socialIdentityProviders).length\n }):`,\n 'data'\n );\n for (const socialIdpData of Object.values(\n journeyData.socialIdentityProviders\n )) {\n printMessage(`- ${Idp.getOneLineDescription(socialIdpData)}`, 'data');\n }\n }\n\n // SAML2 Entity Providers\n if (Object.entries(journeyData.saml2Entities).length) {\n printMessage(\n `\\nSAML2 Entity Providers (${\n Object.entries(journeyData.saml2Entities).length\n }):`,\n 'data'\n );\n for (const entityProviderData of Object.values(journeyData.saml2Entities)) {\n printMessage(\n `- ${Saml2.getOneLineDescription(entityProviderData)}`,\n 'data'\n );\n }\n }\n\n // SAML2 Circles Of Trust\n if (Object.entries(journeyData.circlesOfTrust).length) {\n printMessage(\n `\\nSAML2 Circles Of Trust (${\n Object.entries(journeyData.circlesOfTrust).length\n }):`,\n 'data'\n );\n for (const cotData of Object.values(journeyData.circlesOfTrust)) {\n printMessage(\n `- ${CirclesOfTrust.getOneLineDescription(cotData)}`,\n 'data'\n );\n }\n }\n}\n\n/**\n * Describe a journey in markdown:\n * - Properties, tags, description, name, metadata\n * - Inner tree dependency tree\n * - Node type summary\n * - Nodes\n * - Themes\n * - Scripts\n * - Email templates\n * - Social identity providers\n * - SAML2 entity providers\n * - SAML2 circles of trust\n * @param {SingleTreeExportInterface} journeyData journey export object\n * @param {TreeExportResolverInterface} resolveTreeExport tree export resolver callback function\n */\nexport async function describeJourneyMd(\n journeyData: SingleTreeExportInterface,\n resolveTreeExport: TreeExportResolverInterface = onlineTreeExportResolver\n) {\n const allNodes = {\n ...journeyData.nodes,\n ...journeyData.innerNodes,\n };\n const nodeTypeMap = {};\n\n for (const nodeData of Object.values(allNodes)) {\n if (nodeTypeMap[nodeData._type._id]) {\n nodeTypeMap[nodeData._type._id] += 1;\n } else {\n nodeTypeMap[nodeData._type._id] = 1;\n }\n }\n\n // initialize AM version from file\n if (\n !state.default.session.getAmVersion() &&\n journeyData.meta?.originAmVersion\n ) {\n state.default.session.setAmVersion(journeyData.meta.originAmVersion);\n }\n\n // Journey Name\n printMessage(\n `# ${getOneLineDescriptionMd(journeyData.tree)} - ${\n journeyData.tree.enabled === false\n ? ':o: `disabled`'\n : ':white_check_mark: `enabled`'\n }, ${getJourneyClassificationMd(journeyData).join(', ')}`,\n 'data'\n );\n\n // Categories/Tags\n if (\n journeyData.tree.uiConfig?.categories &&\n journeyData.tree.uiConfig.categories != '[]'\n ) {\n printMessage(\n `\\`${JSON.parse(journeyData.tree.uiConfig.categories).join('`, `')}\\``,\n 'data'\n );\n }\n\n // Description\n if (journeyData.tree.description) {\n printMessage(`\\n${journeyData.tree.description}`, 'data');\n }\n\n // Journey image\n printMessage(`\\n[![](./${journeyData.tree._id}.png)]()\\n`, 'data');\n\n // Dependency Tree\n const descendents = await getTreeDescendents(journeyData, resolveTreeExport);\n printMessage(describeTreeDescendentsMd(descendents), 'data');\n\n // Node Types\n if (Object.entries(nodeTypeMap).length) {\n printMessage(\n `## Node Types (${Object.entries(nodeTypeMap).length})`,\n 'data'\n );\n printMessage('| Count | Type | Classification |', 'data');\n printMessage('| -----:| ---- | -------------- |', 'data');\n for (const [nodeType, count] of Object.entries(nodeTypeMap)) {\n printMessage(\n `| ${String(count)} | ${nodeType} | ${Node.getNodeClassificationMd(\n nodeType\n ).join('<br>')} |`,\n 'data'\n );\n }\n }\n\n // Nodes\n if (Object.entries(allNodes).length) {\n printMessage(`## Nodes (${Object.entries(allNodes).length})`, 'data');\n printMessage(Node.getTableHeaderMd(), 'data');\n for (const nodeObj of Object.values<NodeSkeleton>(allNodes)) {\n printMessage(\n `${Node.getTableRowMd(nodeObj, getNodeRef(nodeObj, journeyData))}`,\n 'data'\n );\n }\n }\n\n // Themes\n if (journeyData.themes?.length) {\n printMessage(`## Themes (${journeyData.themes.length})`, 'data');\n printMessage(Theme.getTableHeaderMd(), 'data');\n for (const themeData of journeyData.themes) {\n printMessage(`${Theme.getTableRowMd(themeData)}`, 'data');\n }\n }\n\n // Scripts\n if (Object.entries(journeyData.scripts).length) {\n printMessage(\n `## Scripts (${Object.entries(journeyData.scripts).length})`,\n 'data'\n );\n printMessage(Script.getTableHeaderMd(), 'data');\n for (const scriptData of Object.values(journeyData.scripts)) {\n printMessage(`${Script.getTableRowMd(scriptData)}`, 'data');\n }\n }\n\n // Email Templates\n if (Object.entries(journeyData.emailTemplates).length) {\n printMessage(\n `## Email Templates (${\n Object.entries(journeyData.emailTemplates).length\n })`,\n 'data'\n );\n printMessage(EmailTemplate.getTableHeaderMd(), 'data');\n for (const templateData of Object.values(journeyData.emailTemplates)) {\n printMessage(`${EmailTemplate.getTableRowMd(templateData)}`, 'data');\n }\n }\n\n // Social Identity Providers\n if (Object.entries(journeyData.socialIdentityProviders).length) {\n printMessage(\n `## Social Identity Providers (${\n Object.entries(journeyData.socialIdentityProviders).length\n })`,\n 'data'\n );\n printMessage(Idp.getTableHeaderMd(), 'data');\n for (const socialIdpData of Object.values(\n journeyData.socialIdentityProviders\n )) {\n printMessage(`${Idp.getTableRowMd(socialIdpData)}`, 'data');\n }\n }\n\n // SAML2 Entity Providers\n if (Object.entries(journeyData.saml2Entities).length) {\n printMessage(\n `## SAML2 Entity Providers (${\n Object.entries(journeyData.saml2Entities).length\n })`,\n 'data'\n );\n printMessage(Saml2.getTableHeaderMd(), 'data');\n for (const entityProviderData of Object.values(journeyData.saml2Entities)) {\n printMessage(`${Saml2.getTableRowMd(entityProviderData)}`, 'data');\n }\n }\n\n // SAML2 Circles Of Trust\n if (Object.entries(journeyData.circlesOfTrust).length) {\n printMessage(\n `## SAML2 Circles Of Trust (${\n Object.entries(journeyData.circlesOfTrust).length\n })`,\n 'data'\n );\n printMessage(CirclesOfTrust.getTableHeaderMd(), 'data');\n for (const cotData of Object.values(journeyData.circlesOfTrust)) {\n printMessage(`${CirclesOfTrust.getTableRowMd(cotData)}`, 'data');\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"JourneyOps.js","names":["fs","printMessage","createProgressBar","updateProgressBar","stopProgressBar","showSpinner","succeedSpinner","failSpinner","createTable","debugMessage","ExportImportUtils","Journey","Types","state","CirclesOfTrust","EmailTemplate","Idp","Node","Saml2","Script","Theme","wordwrap","cloneDeep","getJourneys","importAllJourneys","importJourney","resolveDependencies","createMultiTreeExportTemplate","exportJourney","onlineTreeExportResolver","getTreeDescendents","getNodeRef","getTypedFilename","saveJsonToFile","getRealmString","listJourneys","long","analyze","journeys","journeyStub","table","push","_id","enabled","uiConfig","categories","JSON","parse","join","toString","exportPromises","useStringArrays","deps","journeyExports","Promise","all","journeyExport","tree","getJourneyClassification","error","response","data","exportJourneyToFile","journeyId","file","options","verbose","default","session","getDebug","getDirectory","dir","replace","existsSync","mkdirSync","recursive","fileData","exportJourneysToFile","fileName","trees","length","exportData","meta","exportJourneysToFiles","importJourneyFromFile","readFile","err","journeyData","installedJourneys","map","x","unresolvedJourneys","resolvedJourneys","Object","keys","then","catch","importError","journey","importFirstJourneyFromFile","treeId","hasOwnProperty","call","importJourneysFromFile","importJourneysFromFiles","names","readdirSync","jsonFiles","filter","name","toLowerCase","endsWith","allJourneysData","readFileSync","it","JourneyClassification","STANDARD","CLOUD","CUSTOM","PREMIUM","getJourneyClassificationMd","getOneLineDescription","treeObj","description","getOneLineDescriptionMd","describeTreeDescendents","descendents","depth","values","indent","Array","fill","descendent","describeTreeDescendentsMd","markdown","describeJourney","resolveTreeExport","allNodes","nodes","innerNodes","nodeTypeMap","nodeData","_type","getAmVersion","originAmVersion","setAmVersion","entries","nodeType","count","String","getNodeClassification","nodeObj","themes","themeData","scripts","scriptData","emailTemplates","templateData","socialIdentityProviders","socialIdpData","saml2Entities","entityProviderData","circlesOfTrust","cotData","describeJourneyMd","getNodeClassificationMd","getTableHeaderMd","getTableRowMd"],"sources":["ops/JourneyOps.ts"],"sourcesContent":["import fs from 'fs';\nimport {\n NodeSkeleton,\n TreeSkeleton,\n} from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport {\n MultiTreeExportInterface,\n SingleTreeExportInterface,\n TreeDependencyMapInterface,\n TreeExportOptions,\n TreeExportResolverInterface,\n TreeImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/OpsTypes';\nimport {\n printMessage,\n createProgressBar,\n updateProgressBar,\n stopProgressBar,\n showSpinner,\n succeedSpinner,\n failSpinner,\n createTable,\n debugMessage,\n} from '../utils/Console';\nimport {\n ExportImportUtils,\n Journey,\n Types,\n state,\n} from '@rockcarver/frodo-lib';\nimport * as CirclesOfTrust from './CirclesOfTrustOps';\nimport * as EmailTemplate from './EmailTemplateOps';\nimport * as Idp from './IdpOps';\nimport * as Node from './NodeOps';\nimport * as Saml2 from './Saml2Ops';\nimport * as Script from './ScriptOps';\nimport * as Theme from './ThemeOps';\nimport wordwrap from './utils/Wordwrap';\nimport { cloneDeep } from './utils/OpsUtils';\n\nconst {\n getJourneys,\n importAllJourneys,\n importJourney,\n resolveDependencies,\n createMultiTreeExportTemplate,\n exportJourney,\n onlineTreeExportResolver,\n getTreeDescendents,\n getNodeRef,\n} = Journey;\nconst { getTypedFilename, saveJsonToFile, getRealmString } = ExportImportUtils;\n\n/**\n * List all the journeys/trees\n * @param {boolean} long Long version, all the fields\n * @param {boolean} analyze Analyze journeys/trees for custom nodes (expensive)\n * @returns {Promise<TreeSkeleton[]>} a promise that resolves to an array journey objects\n */\nexport async function listJourneys(\n long = false,\n analyze = false\n): Promise<TreeSkeleton[]> {\n let journeys = [];\n try {\n journeys = await getJourneys();\n if (!long && !analyze) {\n for (const journeyStub of journeys) {\n printMessage(`${journeyStub['_id']}`, 'data');\n }\n } else {\n if (!analyze) {\n const table = createTable(['Name', 'Status', 'Tags']);\n for (const journeyStub of journeys) {\n table.push([\n `${journeyStub._id}`,\n journeyStub.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n journeyStub.uiConfig?.categories\n ? wordwrap(\n JSON.parse(journeyStub.uiConfig.categories).join(', '),\n 60\n )\n : '',\n ]);\n }\n printMessage(table.toString(), 'data');\n } else {\n showSpinner('Retrieving details of all journeys...');\n const exportPromises = [];\n try {\n for (const journeyStub of journeys) {\n exportPromises.push(\n exportJourney(journeyStub['_id'], {\n useStringArrays: false,\n deps: false,\n })\n );\n }\n const journeyExports = await Promise.all(exportPromises);\n succeedSpinner('Retrieved details of all journeys.');\n const table = createTable([\n 'Name',\n 'Status',\n 'Classification',\n 'Tags',\n ]);\n for (const journeyExport of journeyExports) {\n table.push([\n `${journeyExport.tree._id}`,\n journeyExport.tree.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n getJourneyClassification(journeyExport).join(', '),\n journeyExport.tree.uiConfig?.categories\n ? wordwrap(\n JSON.parse(journeyExport.tree.uiConfig.categories).join(\n ', '\n ),\n 60\n )\n : '',\n ]);\n }\n printMessage(table.toString(), 'data');\n } catch (error) {\n failSpinner('Error retrieving details of all journeys.');\n printMessage(error.response.data, 'error');\n }\n }\n }\n } catch (error) {\n printMessage(error.response?.data, 'error');\n }\n return journeys;\n}\n\n/**\n * Export journey by id/name to file\n * @param {string} journeyId journey id/name\n * @param {string} file optional export file name\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneyToFile(\n journeyId: string,\n file: string,\n options: TreeExportOptions\n): Promise<void> {\n debugMessage(`exportJourneyToFile: start`);\n const verbose = state.default.session.getDebug();\n if (!file) {\n file = getTypedFilename(journeyId, 'journey');\n }\n if (state.default.session.getDirectory()) {\n const dir = state.default.session.getDirectory().replace(/\\/$/, '');\n debugMessage(`exportJourneyToFile: directory='${dir}'`);\n file = `${dir}/${file}`;\n // create directory if it doesn't exist\n if (!fs.existsSync(dir)) {\n debugMessage(`exportJourneyToFile: creating directory '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n if (!verbose) showSpinner(`${journeyId}`);\n try {\n const fileData: SingleTreeExportInterface = await exportJourney(\n journeyId,\n options\n );\n if (verbose) showSpinner(`${journeyId}`);\n saveJsonToFile(fileData, file);\n succeedSpinner(\n `Exported ${journeyId['brightCyan']} to ${file['brightCyan']}.`\n );\n } catch (error) {\n if (verbose) showSpinner(`${journeyId}`);\n failSpinner(`Error exporting journey ${journeyId}: ${error}`);\n }\n}\n\n/**\n * Export all journeys to file\n * @param {string} file optional export file name\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneysToFile(\n file: string,\n options: TreeExportOptions = {\n deps: false,\n useStringArrays: false,\n }\n): Promise<void> {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Journeys`, 'journeys');\n }\n const trees = await getJourneys();\n const fileData: MultiTreeExportInterface = createMultiTreeExportTemplate();\n createProgressBar(trees.length, 'Exporting journeys...');\n for (const tree of trees) {\n updateProgressBar(`${tree._id}`);\n try {\n const exportData = await exportJourney(tree._id, options);\n delete exportData.meta;\n fileData.trees[tree._id] = exportData;\n } catch (error) {\n printMessage(`Error exporting journey ${tree._id}: ${error}`, 'error');\n }\n }\n saveJsonToFile(fileData, fileName);\n stopProgressBar(`Exported to ${fileName}`);\n}\n\n/**\n * Export all journeys to separate files\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneysToFiles(\n options: TreeExportOptions\n): Promise<void> {\n const trees = await getJourneys();\n createProgressBar(trees.length, 'Exporting journeys...');\n for (const tree of trees) {\n updateProgressBar(`${tree._id}`);\n const fileName = getTypedFilename(`${tree._id}`, 'journey');\n try {\n const exportData: SingleTreeExportInterface = await exportJourney(\n tree._id,\n options\n );\n saveJsonToFile(exportData, fileName);\n } catch (error) {\n // do we need to report status here?\n }\n }\n stopProgressBar('Done');\n}\n\n/**\n * Import a journey from file\n * @param {string} journeyId journey id/name\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneyFromFile(\n journeyId: string,\n file: string,\n options: TreeImportOptions\n) {\n const verbose = state.default.session.getDebug();\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n let journeyData = JSON.parse(data);\n // check if this is a file with multiple trees and get journey by id\n if (journeyData.trees && journeyData.trees[journeyId]) {\n journeyData = journeyData.trees[journeyId];\n } else if (journeyData.trees) {\n journeyData = null;\n }\n\n // if a journeyId was specified, only import the matching journey\n if (journeyData && journeyId === journeyData.tree._id) {\n // attempt dependency resolution for single tree import\n const installedJourneys = (await getJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n showSpinner('Resolving dependencies');\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n succeedSpinner(`Resolved all dependencies.`);\n\n if (!verbose) showSpinner(`Importing ${journeyId}...`);\n importJourney(journeyData, options)\n .then(() => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n succeedSpinner(`Imported ${journeyId}.`);\n })\n .catch((importError) => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${importError}`);\n });\n } else {\n failSpinner(`Unresolved dependencies:`);\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n // end dependency resolution for single tree import\n } else {\n showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${journeyId} not found!`);\n }\n });\n}\n\n/**\n * Import first journey from file\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importFirstJourneyFromFile(\n file: string,\n options: TreeImportOptions\n) {\n const verbose = state.default.session.getDebug();\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n let journeyData = cloneDeep(JSON.parse(data));\n let journeyId = null;\n // single tree\n if (journeyData.tree) {\n journeyId = cloneDeep(journeyData.tree._id);\n }\n // multiple trees, so get the first tree\n else if (journeyData.trees) {\n for (const treeId in journeyData.trees) {\n if (Object.hasOwnProperty.call(journeyData.trees, treeId)) {\n journeyId = treeId;\n journeyData = journeyData.trees[treeId];\n break;\n }\n }\n }\n\n // if a journeyId was specified, only import the matching journey\n if (journeyData && journeyId) {\n // attempt dependency resolution for single tree import\n const installedJourneys = (await getJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n showSpinner('Resolving dependencies');\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n succeedSpinner(`Resolved all dependencies.`);\n\n if (!verbose) showSpinner(`Importing ${journeyId}...`);\n importJourney(journeyData, options)\n .then(() => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n succeedSpinner(`Imported ${journeyId}.`);\n })\n .catch((importError) => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${importError}`);\n });\n } else {\n failSpinner(`Unresolved dependencies:`);\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n } else {\n showSpinner(`Importing...`);\n failSpinner(`No journeys found!`);\n }\n // end dependency resolution for single tree import\n });\n}\n\n/**\n * Import all journeys from file\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneysFromFile(\n file: string,\n options: TreeImportOptions\n) {\n fs.readFile(file, 'utf8', (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n importAllJourneys(fileData.trees, options);\n });\n}\n\n/**\n * Import all journeys from separate files\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneysFromFiles(options: TreeImportOptions) {\n const names = fs.readdirSync('.');\n const jsonFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.journey.json')\n );\n const allJourneysData = { trees: {} };\n for (const file of jsonFiles) {\n const journeyData = JSON.parse(fs.readFileSync(file, 'utf8'));\n allJourneysData.trees[journeyData.tree._id] = journeyData;\n }\n importAllJourneys(allJourneysData.trees as MultiTreeExportInterface, options);\n}\n\n/**\n * Get journey classification\n * @param {SingleTreeExportInterface} journey journey export\n * @returns {string[]} Colored string array of classifications\n */\nexport function getJourneyClassification(\n journey: SingleTreeExportInterface\n): string[] {\n return Journey.getJourneyClassification(journey).map((it) => {\n switch (it) {\n case Types.JourneyClassification.STANDARD:\n return it.toString()['brightGreen'];\n\n case Types.JourneyClassification.CLOUD:\n return it.toString()['brightMagenta'];\n\n case Types.JourneyClassification.CUSTOM:\n return it.toString()['brightRed'];\n\n case Types.JourneyClassification.PREMIUM:\n return it.toString()['brightYellow'];\n }\n });\n}\n\n/**\n * Get journey classification in markdown\n * @param {SingleTreeExportInterface} journey journey export\n * @returns {string[]} Colored string array of classifications\n */\nexport function getJourneyClassificationMd(\n journey: SingleTreeExportInterface\n): string[] {\n return Journey.getJourneyClassification(journey).map((it) => {\n switch (it) {\n case Types.JourneyClassification.STANDARD:\n return `:green_circle: \\`${it.toString()}\\``;\n\n case Types.JourneyClassification.CLOUD:\n return `:purple_circle: \\`${it.toString()}\\``;\n\n case Types.JourneyClassification.CUSTOM:\n return `:red_circle: \\`${it.toString()}\\``;\n\n case Types.JourneyClassification.PREMIUM:\n return `:yellow_circle: \\`${it.toString()}\\``;\n }\n });\n}\n\n/**\n * Get a one-line description of the tree object\n * @param {TreeSkeleton} treeObj circle of trust object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(treeObj: TreeSkeleton): string {\n const description = `[${treeObj._id['brightCyan']}]`;\n return description;\n}\n\n/**\n * Get a one-line description of the tree object in markdown\n * @param {TreeSkeleton} treeObj circle of trust object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescriptionMd(treeObj: TreeSkeleton): string {\n const description = `${treeObj._id}`;\n return description;\n}\n\n/**\n * Helper function to render a nested list of dependent trees\n * @param {TreeDependencyMapInterface} descendents tree dependency map\n * @param {number} depth level of nesting\n */\nfunction describeTreeDescendents(\n descendents: TreeDependencyMapInterface,\n depth = 0\n) {\n if (depth || Object.values(descendents)[0].length) {\n // heading\n if (depth === 0) {\n printMessage(\n `\\nInner Tree Dependencies (${Object.values(descendents)[0].length}):`,\n 'data'\n );\n }\n const indent = Array(depth * 2)\n .fill(' ')\n .join('');\n const [tree] = Object.keys(descendents);\n printMessage(`${indent}- ${tree['brightCyan']}`, 'data');\n for (const descendent of descendents[tree]) {\n describeTreeDescendents(descendent, depth + 1);\n }\n }\n}\n\n/**\n * Helper function to render a nested list of dependent trees in markdown\n * @param {TreeDependencyMapInterface} descendents tree dependency map\n * @param {number} depth level of nesting\n */\nfunction describeTreeDescendentsMd(\n descendents: TreeDependencyMapInterface,\n depth = 0\n): string {\n let markdown = '';\n if (depth || Object.values(descendents)[0].length) {\n // heading\n if (depth === 0) {\n markdown += `## Inner Tree Dependencies (${\n Object.values(descendents)[0].length\n })\\n`;\n }\n const indent = Array(depth * 2)\n .fill(' ')\n .join('');\n const [tree] = Object.keys(descendents);\n markdown += `${indent}- ${tree}\\n`;\n for (const descendent of descendents[tree]) {\n markdown += describeTreeDescendentsMd(descendent, depth + 1);\n }\n return markdown;\n }\n return markdown;\n}\n\n/**\n * Describe a journey:\n * - Properties, tags, description, name, metadata\n * - Inner tree dependency tree\n * - Node type summary\n * - Nodes\n * - Themes\n * - Scripts\n * - Email templates\n * - Social identity providers\n * - SAML2 entity providers\n * - SAML2 circles of trust\n * @param {SingleTreeExportInterface} journeyData journey export object\n * @param {TreeExportResolverInterface} resolveTreeExport tree export resolver callback function\n */\nexport async function describeJourney(\n journeyData: SingleTreeExportInterface,\n resolveTreeExport: TreeExportResolverInterface = onlineTreeExportResolver\n): Promise<void> {\n const allNodes = {\n ...journeyData.nodes,\n ...journeyData.innerNodes,\n };\n const nodeTypeMap = {};\n\n for (const nodeData of Object.values(allNodes)) {\n if (nodeTypeMap[nodeData._type._id]) {\n nodeTypeMap[nodeData._type._id] += 1;\n } else {\n nodeTypeMap[nodeData._type._id] = 1;\n }\n }\n\n // initialize AM version from file\n if (\n !state.default.session.getAmVersion() &&\n journeyData.meta?.originAmVersion\n ) {\n state.default.session.setAmVersion(journeyData.meta.originAmVersion);\n }\n\n // Journey Name\n printMessage(`${getOneLineDescription(journeyData.tree)}`, 'data');\n printMessage(Array(`[${journeyData.tree._id}]`['length']).fill('=').join(''));\n\n // Description\n if (journeyData.tree.description) {\n printMessage(`\\n${journeyData.tree.description}`, 'data');\n }\n\n // Status\n printMessage(\n `\\nStatus\\n${\n journeyData.tree.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen']\n }`\n );\n\n // Classification\n if (state.default.session.getAmVersion()) {\n printMessage(\n `\\nClassification\\n${getJourneyClassification(journeyData).join(', ')}`,\n 'data'\n );\n }\n\n // Categories/Tags\n if (\n journeyData.tree.uiConfig?.categories &&\n journeyData.tree.uiConfig.categories != '[]'\n ) {\n printMessage('\\nCategories/Tags', 'data');\n printMessage(\n `${JSON.parse(journeyData.tree.uiConfig.categories).join(', ')}`,\n 'data'\n );\n }\n\n // Dependency Tree\n const descendents = await getTreeDescendents(journeyData, resolveTreeExport);\n describeTreeDescendents(descendents);\n\n // Node Types\n if (Object.entries(nodeTypeMap).length) {\n printMessage(\n `\\nNode Types (${Object.entries(nodeTypeMap).length}):`,\n 'data'\n );\n for (const [nodeType, count] of Object.entries(nodeTypeMap)) {\n printMessage(\n `- ${String(count)} [${\n nodeType['brightCyan']\n }] (${Node.getNodeClassification(nodeType).join(', ')})`,\n 'data'\n );\n }\n }\n\n // Nodes\n if (Object.entries(allNodes).length) {\n printMessage(`\\nNodes (${Object.entries(allNodes).length}):`, 'data');\n for (const nodeObj of Object.values<NodeSkeleton>(allNodes)) {\n printMessage(\n `- ${Node.getOneLineDescription(\n nodeObj,\n getNodeRef(nodeObj, journeyData)\n )}`,\n 'data'\n );\n }\n }\n\n // Themes\n if (journeyData.themes?.length) {\n printMessage(`\\nThemes (${journeyData.themes.length}):`, 'data');\n for (const themeData of journeyData.themes) {\n printMessage(`- ${Theme.getOneLineDescription(themeData)}`, 'data');\n }\n }\n\n // Scripts\n if (Object.entries(journeyData.scripts).length) {\n printMessage(\n `\\nScripts (${Object.entries(journeyData.scripts).length}):`,\n 'data'\n );\n for (const scriptData of Object.values(journeyData.scripts)) {\n printMessage(`- ${Script.getOneLineDescription(scriptData)}`, 'data');\n }\n }\n\n // Email Templates\n if (Object.entries(journeyData.emailTemplates).length) {\n printMessage(\n `\\nEmail Templates (${\n Object.entries(journeyData.emailTemplates).length\n }):`,\n 'data'\n );\n for (const templateData of Object.values(journeyData.emailTemplates)) {\n printMessage(\n `- ${EmailTemplate.getOneLineDescription(templateData)}`,\n 'data'\n );\n }\n }\n\n // Social Identity Providers\n if (Object.entries(journeyData.socialIdentityProviders).length) {\n printMessage(\n `\\nSocial Identity Providers (${\n Object.entries(journeyData.socialIdentityProviders).length\n }):`,\n 'data'\n );\n for (const socialIdpData of Object.values(\n journeyData.socialIdentityProviders\n )) {\n printMessage(`- ${Idp.getOneLineDescription(socialIdpData)}`, 'data');\n }\n }\n\n // SAML2 Entity Providers\n if (Object.entries(journeyData.saml2Entities).length) {\n printMessage(\n `\\nSAML2 Entity Providers (${\n Object.entries(journeyData.saml2Entities).length\n }):`,\n 'data'\n );\n for (const entityProviderData of Object.values(journeyData.saml2Entities)) {\n printMessage(\n `- ${Saml2.getOneLineDescription(entityProviderData)}`,\n 'data'\n );\n }\n }\n\n // SAML2 Circles Of Trust\n if (Object.entries(journeyData.circlesOfTrust).length) {\n printMessage(\n `\\nSAML2 Circles Of Trust (${\n Object.entries(journeyData.circlesOfTrust).length\n }):`,\n 'data'\n );\n for (const cotData of Object.values(journeyData.circlesOfTrust)) {\n printMessage(\n `- ${CirclesOfTrust.getOneLineDescription(cotData)}`,\n 'data'\n );\n }\n }\n}\n\n/**\n * Describe a journey in markdown:\n * - Properties, tags, description, name, metadata\n * - Inner tree dependency tree\n * - Node type summary\n * - Nodes\n * - Themes\n * - Scripts\n * - Email templates\n * - Social identity providers\n * - SAML2 entity providers\n * - SAML2 circles of trust\n * @param {SingleTreeExportInterface} journeyData journey export object\n * @param {TreeExportResolverInterface} resolveTreeExport tree export resolver callback function\n */\nexport async function describeJourneyMd(\n journeyData: SingleTreeExportInterface,\n resolveTreeExport: TreeExportResolverInterface = onlineTreeExportResolver\n) {\n const allNodes = {\n ...journeyData.nodes,\n ...journeyData.innerNodes,\n };\n const nodeTypeMap = {};\n\n for (const nodeData of Object.values(allNodes)) {\n if (nodeTypeMap[nodeData._type._id]) {\n nodeTypeMap[nodeData._type._id] += 1;\n } else {\n nodeTypeMap[nodeData._type._id] = 1;\n }\n }\n\n // initialize AM version from file\n if (\n !state.default.session.getAmVersion() &&\n journeyData.meta?.originAmVersion\n ) {\n state.default.session.setAmVersion(journeyData.meta.originAmVersion);\n }\n\n // Journey Name\n printMessage(\n `# ${getOneLineDescriptionMd(journeyData.tree)} - ${\n journeyData.tree.enabled === false\n ? ':o: `disabled`'\n : ':white_check_mark: `enabled`'\n }, ${getJourneyClassificationMd(journeyData).join(', ')}`,\n 'data'\n );\n\n // Categories/Tags\n if (\n journeyData.tree.uiConfig?.categories &&\n journeyData.tree.uiConfig.categories != '[]'\n ) {\n printMessage(\n `\\`${JSON.parse(journeyData.tree.uiConfig.categories).join('`, `')}\\``,\n 'data'\n );\n }\n\n // Description\n if (journeyData.tree.description) {\n printMessage(`\\n${journeyData.tree.description}`, 'data');\n }\n\n // Journey image\n printMessage(`\\n[![](./${journeyData.tree._id}.png)]()\\n`, 'data');\n\n // Dependency Tree\n const descendents = await getTreeDescendents(journeyData, resolveTreeExport);\n printMessage(describeTreeDescendentsMd(descendents), 'data');\n\n // Node Types\n if (Object.entries(nodeTypeMap).length) {\n printMessage(\n `## Node Types (${Object.entries(nodeTypeMap).length})`,\n 'data'\n );\n printMessage('| Count | Type | Classification |', 'data');\n printMessage('| -----:| ---- | -------------- |', 'data');\n for (const [nodeType, count] of Object.entries(nodeTypeMap)) {\n printMessage(\n `| ${String(count)} | ${nodeType} | ${Node.getNodeClassificationMd(\n nodeType\n ).join('<br>')} |`,\n 'data'\n );\n }\n }\n\n // Nodes\n if (Object.entries(allNodes).length) {\n printMessage(`## Nodes (${Object.entries(allNodes).length})`, 'data');\n printMessage(Node.getTableHeaderMd(), 'data');\n for (const nodeObj of Object.values<NodeSkeleton>(allNodes)) {\n printMessage(\n `${Node.getTableRowMd(nodeObj, getNodeRef(nodeObj, journeyData))}`,\n 'data'\n );\n }\n }\n\n // Themes\n if (journeyData.themes?.length) {\n printMessage(`## Themes (${journeyData.themes.length})`, 'data');\n printMessage(Theme.getTableHeaderMd(), 'data');\n for (const themeData of journeyData.themes) {\n printMessage(`${Theme.getTableRowMd(themeData)}`, 'data');\n }\n }\n\n // Scripts\n if (Object.entries(journeyData.scripts).length) {\n printMessage(\n `## Scripts (${Object.entries(journeyData.scripts).length})`,\n 'data'\n );\n printMessage(Script.getTableHeaderMd(), 'data');\n for (const scriptData of Object.values(journeyData.scripts)) {\n printMessage(`${Script.getTableRowMd(scriptData)}`, 'data');\n }\n }\n\n // Email Templates\n if (Object.entries(journeyData.emailTemplates).length) {\n printMessage(\n `## Email Templates (${\n Object.entries(journeyData.emailTemplates).length\n })`,\n 'data'\n );\n printMessage(EmailTemplate.getTableHeaderMd(), 'data');\n for (const templateData of Object.values(journeyData.emailTemplates)) {\n printMessage(`${EmailTemplate.getTableRowMd(templateData)}`, 'data');\n }\n }\n\n // Social Identity Providers\n if (Object.entries(journeyData.socialIdentityProviders).length) {\n printMessage(\n `## Social Identity Providers (${\n Object.entries(journeyData.socialIdentityProviders).length\n })`,\n 'data'\n );\n printMessage(Idp.getTableHeaderMd(), 'data');\n for (const socialIdpData of Object.values(\n journeyData.socialIdentityProviders\n )) {\n printMessage(`${Idp.getTableRowMd(socialIdpData)}`, 'data');\n }\n }\n\n // SAML2 Entity Providers\n if (Object.entries(journeyData.saml2Entities).length) {\n printMessage(\n `## SAML2 Entity Providers (${\n Object.entries(journeyData.saml2Entities).length\n })`,\n 'data'\n );\n printMessage(Saml2.getTableHeaderMd(), 'data');\n for (const entityProviderData of Object.values(journeyData.saml2Entities)) {\n printMessage(`${Saml2.getTableRowMd(entityProviderData)}`, 'data');\n }\n }\n\n // SAML2 Circles Of Trust\n if (Object.entries(journeyData.circlesOfTrust).length) {\n printMessage(\n `## SAML2 Circles Of Trust (${\n Object.entries(journeyData.circlesOfTrust).length\n })`,\n 'data'\n );\n printMessage(CirclesOfTrust.getTableHeaderMd(), 'data');\n for (const cotData of Object.values(journeyData.circlesOfTrust)) {\n printMessage(`${CirclesOfTrust.getTableRowMd(cotData)}`, 'data');\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Deep clone object
3
+ * @param {any} obj object to deep clone
4
+ * @returns {any} new object cloned from obj
5
+ */
6
+ export function cloneDeep(obj) {
7
+ return JSON.parse(JSON.stringify(obj));
8
+ }
9
+ //# sourceMappingURL=OpsUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpsUtils.js","names":["cloneDeep","obj","JSON","parse","stringify"],"sources":["ops/utils/OpsUtils.ts"],"sourcesContent":["/**\n * Deep clone object\n * @param {any} obj object to deep clone\n * @returns {any} new object cloned from obj\n */\nexport function cloneDeep(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,SAAS,CAACC,GAAG,EAAE;EAC7B,OAAOC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,SAAS,CAACH,GAAG,CAAC,CAAC;AACxC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rockcarver/frodo-cli",
3
- "version": "0.19.5-1",
3
+ "version": "0.20.0",
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": [
@@ -93,7 +93,8 @@
93
93
  ],
94
94
  "assets": [
95
95
  "node_modules/@rockcarver/frodo-lib/cjs/ops/templates/*.json",
96
- "node_modules/@rockcarver/frodo-lib/cjs/ops/templates/**/*.json"
96
+ "node_modules/@rockcarver/frodo-lib/cjs/ops/templates/**/*.json",
97
+ "node_modules/@rockcarver/frodo-lib/mocks/**/*.har"
97
98
  ],
98
99
  "scripts": [
99
100
  "src/cli/**/*.js",
@@ -103,13 +104,12 @@
103
104
  ]
104
105
  },
105
106
  "dependencies": {
106
- "@rockcarver/frodo-lib": "0.17.8-3",
107
+ "@rockcarver/frodo-lib": "0.18.0",
107
108
  "cli-progress": "^3.11.2",
108
109
  "cli-table3": "^0.6.3",
109
110
  "colors": "^1.4.0",
110
111
  "commander": "^9.4.1",
111
112
  "compare-versions": "^5.0.1",
112
- "lodash": "^4.17.21",
113
113
  "nanospinner": "^1.1.0",
114
114
  "properties-reader": "^2.2.0",
115
115
  "replaceall": "^0.1.6",