@rockcarver/frodo-cli 2.0.0-32 → 2.0.0-34
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 +9 -1
- package/esm/cli/FrodoCommand.js +8 -1
- package/esm/cli/FrodoCommand.js.map +1 -1
- package/esm/cli/admin/admin-execute-rfc7523-authz-grant-flow.js +41 -0
- package/esm/cli/admin/admin-execute-rfc7523-authz-grant-flow.js.map +1 -0
- package/esm/cli/admin/admin-export-full-cloud-config.js +44 -0
- package/esm/cli/admin/admin-export-full-cloud-config.js.map +1 -0
- package/esm/cli/admin/admin-generate-rfc7523-authz-grant-artifacts.js +43 -0
- package/esm/cli/admin/admin-generate-rfc7523-authz-grant-artifacts.js.map +1 -0
- package/esm/cli/admin/admin.js +3 -0
- package/esm/cli/admin/admin.js.map +1 -1
- package/esm/cli/authz/authz-policy-export.js +1 -1
- package/esm/cli/authz/authz-policy-export.js.map +1 -1
- package/esm/cli/authz/authz-policy-import.js +1 -1
- package/esm/cli/authz/authz-policy-import.js.map +1 -1
- package/esm/cli/authz/authz-policy-list.js +2 -2
- package/esm/cli/authz/authz-policy-list.js.map +1 -1
- package/esm/cli/authz/authz-set-delete.js +2 -2
- package/esm/cli/authz/authz-set-delete.js.map +1 -1
- package/esm/cli/authz/authz-set-export.js +1 -1
- package/esm/cli/authz/authz-set-export.js.map +1 -1
- package/esm/cli/authz/authz-set-import.js +1 -1
- package/esm/cli/authz/authz-set-import.js.map +1 -1
- package/esm/cli/authz/authz-set-list.js +1 -1
- package/esm/cli/authz/authz-set-list.js.map +1 -1
- package/esm/cli/authz/authz-type-delete.js +3 -3
- package/esm/cli/authz/authz-type-delete.js.map +1 -1
- package/esm/cli/authz/authz-type-export.js +2 -2
- package/esm/cli/authz/authz-type-export.js.map +1 -1
- package/esm/cli/authz/authz-type-import.js +2 -2
- package/esm/cli/authz/authz-type-import.js.map +1 -1
- package/esm/cli/authz/authz-type-list.js +1 -1
- package/esm/cli/authz/authz-type-list.js.map +1 -1
- package/esm/cli/email/email-template-export.js +3 -3
- package/esm/cli/email/email-template-export.js.map +1 -1
- package/esm/cli/email/email-template-import.js +4 -4
- package/esm/cli/email/email-template-import.js.map +1 -1
- package/esm/cli/email/email-template-list.js +1 -1
- package/esm/cli/email/email-template-list.js.map +1 -1
- package/esm/cli/esv/esv-secret-create.js +2 -1
- package/esm/cli/esv/esv-secret-create.js.map +1 -1
- package/esm/cli/esv/esv-secret-delete.js +4 -3
- package/esm/cli/esv/esv-secret-delete.js.map +1 -1
- package/esm/cli/esv/esv-secret-describe.js +2 -1
- package/esm/cli/esv/esv-secret-describe.js.map +1 -1
- package/esm/cli/esv/esv-secret-export.js +6 -4
- package/esm/cli/esv/esv-secret-export.js.map +1 -1
- package/esm/cli/esv/esv-secret-list.js +2 -1
- package/esm/cli/esv/esv-secret-list.js.map +1 -1
- package/esm/cli/esv/esv-secret-set.js +2 -1
- package/esm/cli/esv/esv-secret-set.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-activate.js +2 -2
- package/esm/cli/esv/esv-secret-version-activate.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-create.js +2 -1
- package/esm/cli/esv/esv-secret-version-create.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-deactivate.js +2 -2
- package/esm/cli/esv/esv-secret-version-deactivate.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-delete.js +4 -3
- package/esm/cli/esv/esv-secret-version-delete.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-list.js +2 -1
- package/esm/cli/esv/esv-secret-version-list.js.map +1 -1
- package/esm/cli/esv/esv-variable-create.js +2 -1
- package/esm/cli/esv/esv-variable-create.js.map +1 -1
- package/esm/cli/esv/esv-variable-delete.js +4 -2
- package/esm/cli/esv/esv-variable-delete.js.map +1 -1
- package/esm/cli/esv/esv-variable-describe.js +2 -1
- package/esm/cli/esv/esv-variable-describe.js.map +1 -1
- package/esm/cli/esv/esv-variable-export.js +6 -3
- package/esm/cli/esv/esv-variable-export.js.map +1 -1
- package/esm/cli/esv/esv-variable-list.js +2 -1
- package/esm/cli/esv/esv-variable-list.js.map +1 -1
- package/esm/cli/esv/esv-variable-set.js +4 -2
- package/esm/cli/esv/esv-variable-set.js.map +1 -1
- package/esm/cli/idm/idm-count.js +1 -1
- package/esm/cli/idm/idm-count.js.map +1 -1
- package/esm/cli/idm/idm-export.js +3 -3
- package/esm/cli/idm/idm-export.js.map +1 -1
- package/esm/cli/idm/idm-list.js +2 -2
- package/esm/cli/idm/idm-list.js.map +1 -1
- package/esm/cli/idp/idp-export.js +3 -3
- package/esm/cli/idp/idp-export.js.map +1 -1
- package/esm/cli/idp/idp-import.js +4 -4
- package/esm/cli/idp/idp-import.js.map +1 -1
- package/esm/cli/idp/idp-list.js +1 -1
- package/esm/cli/idp/idp-list.js.map +1 -1
- package/esm/cli/journey/journey-delete.js +6 -2
- package/esm/cli/journey/journey-delete.js.map +1 -1
- package/esm/cli/journey/journey-disable.js +4 -10
- package/esm/cli/journey/journey-disable.js.map +1 -1
- package/esm/cli/journey/journey-enable.js +4 -10
- package/esm/cli/journey/journey-enable.js.map +1 -1
- package/esm/cli/journey/journey-import.js +4 -4
- package/esm/cli/journey/journey-import.js.map +1 -1
- package/esm/cli/journey/journey-list.js +1 -1
- package/esm/cli/journey/journey-list.js.map +1 -1
- package/esm/cli/saml/saml-cot-export.js +3 -3
- package/esm/cli/saml/saml-cot-export.js.map +1 -1
- package/esm/cli/saml/saml-cot-list.js +1 -1
- package/esm/cli/saml/saml-cot-list.js.map +1 -1
- package/esm/cli/saml/saml-describe.js +1 -1
- package/esm/cli/saml/saml-describe.js.map +1 -1
- package/esm/cli/saml/saml-import.js +4 -4
- package/esm/cli/saml/saml-import.js.map +1 -1
- package/esm/cli/saml/saml-list.js +1 -1
- package/esm/cli/saml/saml-list.js.map +1 -1
- package/esm/cli/saml/saml-metadata-export.js +1 -1
- package/esm/cli/saml/saml-metadata-export.js.map +1 -1
- package/esm/cli/script/script-export.js +2 -6
- package/esm/cli/script/script-export.js.map +1 -1
- package/esm/cli/theme/theme-delete.js +3 -3
- package/esm/cli/theme/theme-delete.js.map +1 -1
- package/esm/cli/theme/theme-export.js +4 -4
- package/esm/cli/theme/theme-export.js.map +1 -1
- package/esm/cli/theme/theme-import.js +4 -4
- package/esm/cli/theme/theme-import.js.map +1 -1
- package/esm/cli/theme/theme-list.js +1 -1
- package/esm/cli/theme/theme-list.js.map +1 -1
- package/esm/ops/AdminFederationOps.js +28 -26
- package/esm/ops/AdminFederationOps.js.map +1 -1
- package/esm/ops/AdminOps.js +241 -0
- package/esm/ops/AdminOps.js.map +1 -0
- package/esm/ops/AgentOps.js +59 -51
- package/esm/ops/AgentOps.js.map +1 -1
- package/esm/ops/ApplicationOps.js +19 -13
- package/esm/ops/ApplicationOps.js.map +1 -1
- package/esm/ops/CirclesOfTrustOps.js +28 -26
- package/esm/ops/CirclesOfTrustOps.js.map +1 -1
- package/esm/ops/EmailTemplateOps.js +78 -94
- package/esm/ops/EmailTemplateOps.js.map +1 -1
- package/esm/ops/IdmOps.js +8 -31
- package/esm/ops/IdmOps.js.map +1 -1
- package/esm/ops/IdpOps.js +49 -54
- package/esm/ops/IdpOps.js.map +1 -1
- package/esm/ops/JourneyOps.js +91 -70
- package/esm/ops/JourneyOps.js.map +1 -1
- package/esm/ops/OAuth2ClientOps.js +13 -11
- package/esm/ops/OAuth2ClientOps.js.map +1 -1
- package/esm/ops/PolicyOps.js +31 -26
- package/esm/ops/PolicyOps.js.map +1 -1
- package/esm/ops/PolicySetOps.js +42 -39
- package/esm/ops/PolicySetOps.js.map +1 -1
- package/esm/ops/ResourceTypeOps.js +19 -16
- package/esm/ops/ResourceTypeOps.js.map +1 -1
- package/esm/ops/Saml2Ops.js +49 -45
- package/esm/ops/Saml2Ops.js.map +1 -1
- package/esm/ops/ScriptOps.js +36 -55
- package/esm/ops/ScriptOps.js.map +1 -1
- package/esm/ops/SecretsOps.js +159 -60
- package/esm/ops/SecretsOps.js.map +1 -1
- package/esm/ops/ThemeOps.js +111 -130
- package/esm/ops/ThemeOps.js.map +1 -1
- package/esm/ops/VariablesOps.js +126 -56
- package/esm/ops/VariablesOps.js.map +1 -1
- package/esm/utils/Console.js +69 -30
- package/esm/utils/Console.js.map +1 -1
- package/esm/utils/ExportImportUtils.js +4 -12
- package/esm/utils/ExportImportUtils.js.map +1 -1
- package/package.json +10 -2
package/esm/ops/JourneyOps.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { frodo, state } from '@rockcarver/frodo-lib';
|
|
2
2
|
import fs from 'fs';
|
|
3
|
-
import {
|
|
3
|
+
import { createProgressIndicator, createTable, debugMessage, printMessage, stopProgressIndicator, updateProgressIndicator } from '../utils/Console';
|
|
4
4
|
import * as CirclesOfTrust from './CirclesOfTrustOps';
|
|
5
5
|
import * as EmailTemplate from './EmailTemplateOps';
|
|
6
6
|
import * as Idp from './IdpOps';
|
|
@@ -20,14 +20,16 @@ const {
|
|
|
20
20
|
const {
|
|
21
21
|
readJourneys,
|
|
22
22
|
exportJourney,
|
|
23
|
-
|
|
23
|
+
exportJourneys,
|
|
24
24
|
resolveDependencies,
|
|
25
25
|
importJourneys,
|
|
26
26
|
importJourney,
|
|
27
27
|
getTreeDescendents,
|
|
28
28
|
getNodeRef,
|
|
29
29
|
onlineTreeExportResolver,
|
|
30
|
-
getJourneyClassification: _getJourneyClassification
|
|
30
|
+
getJourneyClassification: _getJourneyClassification,
|
|
31
|
+
disableJourney: _disableJourney,
|
|
32
|
+
enableJourney: _enableJourney
|
|
31
33
|
} = frodo.authn.journey;
|
|
32
34
|
|
|
33
35
|
/**
|
|
@@ -53,7 +55,7 @@ export async function listJourneys(long = false, analyze = false) {
|
|
|
53
55
|
}
|
|
54
56
|
printMessage(table.toString(), 'data');
|
|
55
57
|
} else {
|
|
56
|
-
|
|
58
|
+
const spinnerId = createProgressIndicator('indeterminate', 0, `Retrieving details of all journeys...`);
|
|
57
59
|
const exportPromises = [];
|
|
58
60
|
try {
|
|
59
61
|
for (const journeyStub of journeys) {
|
|
@@ -63,7 +65,7 @@ export async function listJourneys(long = false, analyze = false) {
|
|
|
63
65
|
}));
|
|
64
66
|
}
|
|
65
67
|
const journeyExports = await Promise.all(exportPromises);
|
|
66
|
-
|
|
68
|
+
stopProgressIndicator(spinnerId, 'Retrieved details of all journeys.', 'success');
|
|
67
69
|
const table = createTable(['Name', 'Status', 'Classification', 'Tags']);
|
|
68
70
|
for (const journeyExport of journeyExports) {
|
|
69
71
|
var _journeyExport$tree$u;
|
|
@@ -71,7 +73,7 @@ export async function listJourneys(long = false, analyze = false) {
|
|
|
71
73
|
}
|
|
72
74
|
printMessage(table.toString(), 'data');
|
|
73
75
|
} catch (error) {
|
|
74
|
-
|
|
76
|
+
stopProgressIndicator(spinnerId, 'Error retrieving details of all journeys.', 'fail');
|
|
75
77
|
printMessage(error.response.data, 'error');
|
|
76
78
|
}
|
|
77
79
|
}
|
|
@@ -96,15 +98,16 @@ export async function exportJourneyToFile(journeyId, file, options) {
|
|
|
96
98
|
file = getTypedFilename(journeyId, 'journey');
|
|
97
99
|
}
|
|
98
100
|
const filePath = getFilePath(file, true);
|
|
99
|
-
|
|
101
|
+
let spinnerId;
|
|
102
|
+
if (!verbose) spinnerId = createProgressIndicator('indeterminate', 0, `${journeyId}`);
|
|
100
103
|
try {
|
|
101
104
|
const fileData = await exportJourney(journeyId, options);
|
|
102
|
-
if (verbose)
|
|
105
|
+
if (verbose) spinnerId = createProgressIndicator('indeterminate', 0, `${journeyId}`);
|
|
103
106
|
saveJsonToFile(fileData, filePath);
|
|
104
|
-
|
|
107
|
+
stopProgressIndicator(spinnerId, `Exported ${journeyId['brightCyan']} to ${filePath['brightCyan']}.`, 'success');
|
|
105
108
|
} catch (error) {
|
|
106
|
-
if (verbose)
|
|
107
|
-
|
|
109
|
+
if (verbose) spinnerId = createProgressIndicator('indeterminate', 0, `${journeyId}`);
|
|
110
|
+
stopProgressIndicator(spinnerId, `Error exporting journey ${journeyId}: ${error}`, 'fail');
|
|
108
111
|
}
|
|
109
112
|
}
|
|
110
113
|
|
|
@@ -121,21 +124,8 @@ export async function exportJourneysToFile(file, options = {
|
|
|
121
124
|
file = getTypedFilename(`all${getRealmString()}Journeys`, 'journey');
|
|
122
125
|
}
|
|
123
126
|
const filePath = getFilePath(file, true);
|
|
124
|
-
const
|
|
125
|
-
const fileData = createMultiTreeExportTemplate();
|
|
126
|
-
createProgressBar(trees.length, 'Exporting journeys...');
|
|
127
|
-
for (const tree of trees) {
|
|
128
|
-
updateProgressBar(`${tree._id}`);
|
|
129
|
-
try {
|
|
130
|
-
const exportData = await exportJourney(tree._id, options);
|
|
131
|
-
delete exportData.meta;
|
|
132
|
-
fileData.trees[tree._id] = exportData;
|
|
133
|
-
} catch (error) {
|
|
134
|
-
printMessage(`Error exporting journey ${tree._id}: ${error}`, 'error');
|
|
135
|
-
}
|
|
136
|
-
}
|
|
127
|
+
const fileData = await exportJourneys(options);
|
|
137
128
|
saveJsonToFile(fileData, filePath);
|
|
138
|
-
stopProgressBar(`Exported to ${filePath}`);
|
|
139
129
|
}
|
|
140
130
|
|
|
141
131
|
/**
|
|
@@ -143,19 +133,20 @@ export async function exportJourneysToFile(file, options = {
|
|
|
143
133
|
* @param {TreeExportOptions} options export options
|
|
144
134
|
*/
|
|
145
135
|
export async function exportJourneysToFiles(options) {
|
|
146
|
-
const
|
|
147
|
-
|
|
148
|
-
for (const
|
|
149
|
-
|
|
150
|
-
const
|
|
136
|
+
const journeysExport = await exportJourneys(options);
|
|
137
|
+
const trees = Object.entries(journeysExport.trees);
|
|
138
|
+
for (const [treeId, treeValue] of trees) {
|
|
139
|
+
const indicatorId = createProgressIndicator('determinate', 1, `Saving ${treeId}...`);
|
|
140
|
+
const file = getFilePath(getTypedFilename(`${treeId}`, 'journey'), true);
|
|
141
|
+
treeValue['meta'] = journeysExport.meta;
|
|
151
142
|
try {
|
|
152
|
-
|
|
153
|
-
saveJsonToFile(
|
|
143
|
+
updateProgressIndicator(indicatorId, `Saving ${treeId} to ${file}`);
|
|
144
|
+
saveJsonToFile(treeValue, file);
|
|
145
|
+
stopProgressIndicator(indicatorId, `${treeId} saved to ${file}`);
|
|
154
146
|
} catch (error) {
|
|
155
|
-
|
|
147
|
+
stopProgressIndicator(indicatorId, `Error saving ${treeId} to ${file}`);
|
|
156
148
|
}
|
|
157
149
|
}
|
|
158
|
-
stopProgressBar('Done');
|
|
159
150
|
}
|
|
160
151
|
|
|
161
152
|
/**
|
|
@@ -166,8 +157,8 @@ export async function exportJourneysToFiles(options) {
|
|
|
166
157
|
*/
|
|
167
158
|
export async function importJourneyFromFile(journeyId, file, options) {
|
|
168
159
|
const verbose = state.getVerbose();
|
|
169
|
-
|
|
170
|
-
|
|
160
|
+
try {
|
|
161
|
+
const data = fs.readFileSync(getFilePath(file), 'utf8');
|
|
171
162
|
let journeyData = JSON.parse(data);
|
|
172
163
|
// check if this is a file with multiple trees and get journey by id
|
|
173
164
|
if (journeyData.trees && journeyData.trees[journeyId]) {
|
|
@@ -182,32 +173,36 @@ export async function importJourneyFromFile(journeyId, file, options) {
|
|
|
182
173
|
const installedJourneys = (await readJourneys()).map(x => x._id);
|
|
183
174
|
const unresolvedJourneys = {};
|
|
184
175
|
const resolvedJourneys = [];
|
|
185
|
-
|
|
176
|
+
const indicatorId1 = createProgressIndicator('indeterminate', 0, 'Resolving dependencies');
|
|
186
177
|
await resolveDependencies(installedJourneys, {
|
|
187
178
|
[journeyId]: journeyData
|
|
188
179
|
}, unresolvedJourneys, resolvedJourneys);
|
|
189
180
|
if (Object.keys(unresolvedJourneys).length === 0) {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
181
|
+
stopProgressIndicator(indicatorId1, `Resolved all dependencies.`, 'success');
|
|
182
|
+
let indicatorId2;
|
|
183
|
+
if (!verbose) indicatorId2 = createProgressIndicator('indeterminate', 0, `Importing ${journeyId}...`);
|
|
184
|
+
try {
|
|
185
|
+
await importJourney(journeyData, options);
|
|
186
|
+
if (verbose) indicatorId2 = createProgressIndicator('indeterminate', 0, `Importing ${journeyId}...`);
|
|
187
|
+
stopProgressIndicator(indicatorId2, `Imported ${journeyId}.`, 'success');
|
|
188
|
+
} catch (importError) {
|
|
189
|
+
if (verbose) indicatorId2 = createProgressIndicator('indeterminate', 0, `Importing ${journeyId}...`);
|
|
190
|
+
stopProgressIndicator(indicatorId2, `${importError}`, 'fail');
|
|
191
|
+
}
|
|
199
192
|
} else {
|
|
200
|
-
|
|
193
|
+
stopProgressIndicator(indicatorId1, `Unresolved dependencies:`, 'fail');
|
|
201
194
|
for (const journey of Object.keys(unresolvedJourneys)) {
|
|
202
195
|
printMessage(` ${journey} requires ${unresolvedJourneys[journey]}`, 'error');
|
|
203
196
|
}
|
|
204
197
|
}
|
|
205
198
|
// end dependency resolution for single tree import
|
|
206
199
|
} else {
|
|
207
|
-
|
|
208
|
-
|
|
200
|
+
const indicatorId3 = createProgressIndicator('indeterminate', 0, `Importing ${journeyId}...`);
|
|
201
|
+
stopProgressIndicator(indicatorId3, `${journeyId} not found!`, 'fail');
|
|
209
202
|
}
|
|
210
|
-
})
|
|
203
|
+
} catch (error) {
|
|
204
|
+
printMessage(`Error importing journey ${journeyId}: ${error}`, 'error');
|
|
205
|
+
}
|
|
211
206
|
}
|
|
212
207
|
|
|
213
208
|
/**
|
|
@@ -217,8 +212,8 @@ export async function importJourneyFromFile(journeyId, file, options) {
|
|
|
217
212
|
*/
|
|
218
213
|
export async function importFirstJourneyFromFile(file, options) {
|
|
219
214
|
const verbose = state.getVerbose();
|
|
220
|
-
|
|
221
|
-
|
|
215
|
+
try {
|
|
216
|
+
const data = fs.readFileSync(getFilePath(file), 'utf8');
|
|
222
217
|
let journeyData = cloneDeep(JSON.parse(data));
|
|
223
218
|
let journeyId = null;
|
|
224
219
|
// single tree
|
|
@@ -242,32 +237,36 @@ export async function importFirstJourneyFromFile(file, options) {
|
|
|
242
237
|
const installedJourneys = (await readJourneys()).map(x => x._id);
|
|
243
238
|
const unresolvedJourneys = {};
|
|
244
239
|
const resolvedJourneys = [];
|
|
245
|
-
|
|
240
|
+
const depSpinnerId = createProgressIndicator('indeterminate', 0, 'Resolving dependencies');
|
|
246
241
|
await resolveDependencies(installedJourneys, {
|
|
247
242
|
[journeyId]: journeyData
|
|
248
243
|
}, unresolvedJourneys, resolvedJourneys);
|
|
249
244
|
if (Object.keys(unresolvedJourneys).length === 0) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
245
|
+
stopProgressIndicator(depSpinnerId, `Resolved all dependencies.`, 'success');
|
|
246
|
+
let importSpinnerId;
|
|
247
|
+
if (!verbose) importSpinnerId = createProgressIndicator('indeterminate', 0, `Importing ${journeyId}...`);
|
|
248
|
+
try {
|
|
249
|
+
await importJourney(journeyData, options);
|
|
250
|
+
if (verbose) importSpinnerId = createProgressIndicator('indeterminate', 0, `Importing ${journeyId}...`);
|
|
251
|
+
stopProgressIndicator(importSpinnerId, `Imported ${journeyId}.`, 'success');
|
|
252
|
+
} catch (importError) {
|
|
253
|
+
if (verbose) importSpinnerId = createProgressIndicator('indeterminate', 0, `Importing ${journeyId}...`);
|
|
254
|
+
stopProgressIndicator(importSpinnerId, `${importError}`, 'fail');
|
|
255
|
+
}
|
|
259
256
|
} else {
|
|
260
|
-
|
|
257
|
+
stopProgressIndicator(depSpinnerId, `Unresolved dependencies:`, 'fail');
|
|
261
258
|
for (const journey of Object.keys(unresolvedJourneys)) {
|
|
262
259
|
printMessage(` ${journey} requires ${unresolvedJourneys[journey]}`, 'error');
|
|
263
260
|
}
|
|
264
261
|
}
|
|
265
262
|
} else {
|
|
266
|
-
|
|
267
|
-
|
|
263
|
+
const importSpinnerId = createProgressIndicator('indeterminate', 0, `Importing...`);
|
|
264
|
+
stopProgressIndicator(importSpinnerId, `No journeys found!`, 'fail');
|
|
268
265
|
}
|
|
269
266
|
// end dependency resolution for single tree import
|
|
270
|
-
})
|
|
267
|
+
} catch (error) {
|
|
268
|
+
printMessage(`Error importing first journey: ${error}`, 'error');
|
|
269
|
+
}
|
|
271
270
|
}
|
|
272
271
|
|
|
273
272
|
/**
|
|
@@ -276,11 +275,11 @@ export async function importFirstJourneyFromFile(file, options) {
|
|
|
276
275
|
* @param {TreeImportOptions} options import options
|
|
277
276
|
*/
|
|
278
277
|
export async function importJourneysFromFile(file, options) {
|
|
279
|
-
|
|
280
|
-
|
|
278
|
+
try {
|
|
279
|
+
const data = fs.readFileSync(getFilePath(file), 'utf8');
|
|
281
280
|
try {
|
|
282
281
|
const fileData = JSON.parse(data);
|
|
283
|
-
importJourneys(fileData.trees, options);
|
|
282
|
+
await importJourneys(fileData.trees, options);
|
|
284
283
|
} catch (error) {
|
|
285
284
|
if (error.name === 'UnresolvedDependenciesError') {
|
|
286
285
|
for (const journey of Object.keys(error.unresolvedJourneys)) {
|
|
@@ -294,7 +293,9 @@ export async function importJourneysFromFile(file, options) {
|
|
|
294
293
|
printMessage(`${error.message}`, 'error');
|
|
295
294
|
}
|
|
296
295
|
}
|
|
297
|
-
})
|
|
296
|
+
} catch (error) {
|
|
297
|
+
printMessage(`Error importing journeys: ${error}`, 'error');
|
|
298
|
+
}
|
|
298
299
|
}
|
|
299
300
|
|
|
300
301
|
/**
|
|
@@ -682,4 +683,24 @@ export async function describeJourneyMd(journeyData, resolveTreeExport = onlineT
|
|
|
682
683
|
}
|
|
683
684
|
}
|
|
684
685
|
}
|
|
686
|
+
export async function enableJourney(journeyId) {
|
|
687
|
+
const indicatorId = createProgressIndicator('indeterminate', 0, `Enabling journey ${journeyId}...`);
|
|
688
|
+
if (_enableJourney(journeyId)) {
|
|
689
|
+
stopProgressIndicator(indicatorId, `Enabled journey ${journeyId}.`, 'success');
|
|
690
|
+
return true;
|
|
691
|
+
} else {
|
|
692
|
+
stopProgressIndicator(indicatorId, `Error enabling journey ${journeyId}`, 'fail');
|
|
693
|
+
return false;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
export async function disableJourney(journeyId) {
|
|
697
|
+
const indicatorId = createProgressIndicator('indeterminate', 0, `Disabling journey ${journeyId}...`);
|
|
698
|
+
if (_disableJourney(journeyId)) {
|
|
699
|
+
stopProgressIndicator(indicatorId, `Disabled journey ${journeyId}.`, 'success');
|
|
700
|
+
return true;
|
|
701
|
+
} else {
|
|
702
|
+
stopProgressIndicator(indicatorId, `Error disabling journey ${journeyId}`, 'fail');
|
|
703
|
+
return false;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
685
706
|
//# sourceMappingURL=JourneyOps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JourneyOps.js","names":["frodo","state","fs","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","stopProgressBar","succeedSpinner","updateProgressBar","CirclesOfTrust","EmailTemplate","Idp","Node","Saml2","Script","Theme","cloneDeep","wordwrap","getTypedFilename","saveJsonToFile","getRealmString","getFilePath","getWorkingDirectory","utils","readJourneys","exportJourney","createMultiTreeExportTemplate","resolveDependencies","importJourneys","importJourney","getTreeDescendents","getNodeRef","onlineTreeExportResolver","getJourneyClassification","_getJourneyClassification","authn","journey","listJourneys","long","analyze","journeys","journeyStub","table","_journeyStub$uiConfig","push","_id","enabled","uiConfig","categories","JSON","parse","join","toString","exportPromises","useStringArrays","deps","journeyExports","Promise","all","journeyExport","_journeyExport$tree$u","tree","error","response","data","_error$response","exportJourneyToFile","journeyId","file","options","verbose","getVerbose","filePath","fileData","exportJourneysToFile","trees","length","exportData","meta","exportJourneysToFiles","fileName","importJourneyFromFile","readFile","err","journeyData","installedJourneys","map","x","unresolvedJourneys","resolvedJourneys","Object","keys","then","catch","importError","importFirstJourneyFromFile","treeId","hasOwnProperty","call","importJourneysFromFile","name","message","type","importJourneysFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","allJourneysData","readFileSync","_error$response2","it","getJourneyClassificationMd","getOneLineDescription","treeObj","description","getOneLineDescriptionMd","describeTreeDescendents","descendents","depth","values","indent","Array","fill","descendent","describeTreeDescendentsMd","markdown","describeJourney","resolveTreeExport","_journeyData$meta","_journeyData$tree$uiC","_journeyData$themes","allNodes","nodes","innerNodes","nodeTypeMap","nodeData","_type","getAmVersion","originAmVersion","setAmVersion","stack","entries","nodeType","count","String","getNodeClassification","nodeObj","themes","themeData","scripts","scriptData","emailTemplates","templateData","socialIdentityProviders","socialIdpData","saml2Entities","entityProviderData","circlesOfTrust","cotData","describeJourneyMd","_journeyData$meta2","_journeyData$tree$uiC2","_journeyData$themes2","getNodeClassificationMd","getTableHeaderMd","getTableRowMd"],"sources":["../../src/ops/JourneyOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type NodeSkeleton } from '@rockcarver/frodo-lib/types/api/NodeApi';\nimport { type TreeSkeleton } from '@rockcarver/frodo-lib/types/api/TreeApi';\nimport {\n type JourneyClassificationType,\n type MultiTreeExportInterface,\n type SingleTreeExportInterface,\n type TreeDependencyMapInterface,\n type TreeExportOptions,\n type TreeExportResolverInterface,\n type TreeImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/JourneyOps';\nimport fs from 'fs';\n\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\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 { cloneDeep } from './utils/OpsUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n getTypedFilename,\n saveJsonToFile,\n getRealmString,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readJourneys,\n exportJourney,\n createMultiTreeExportTemplate,\n resolveDependencies,\n importJourneys,\n importJourney,\n getTreeDescendents,\n getNodeRef,\n onlineTreeExportResolver,\n getJourneyClassification: _getJourneyClassification,\n} = frodo.authn.journey;\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 readJourneys();\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.getVerbose();\n if (!file) {\n file = getTypedFilename(journeyId, 'journey');\n }\n const filePath = getFilePath(file, true);\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, filePath);\n succeedSpinner(\n `Exported ${journeyId['brightCyan']} to ${filePath['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 if (!file) {\n file = getTypedFilename(`all${getRealmString()}Journeys`, 'journey');\n }\n const filePath = getFilePath(file, true);\n const trees = await readJourneys();\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, filePath);\n stopProgressBar(`Exported to ${filePath}`);\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 readJourneys();\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, getFilePath(fileName, true));\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.getVerbose();\n fs.readFile(getFilePath(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 readJourneys()).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.getVerbose();\n fs.readFile(getFilePath(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 readJourneys()).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(getFilePath(file), 'utf8', (err, data) => {\n if (err) throw err;\n try {\n const fileData = JSON.parse(data);\n importJourneys(fileData.trees, options);\n } catch (error) {\n if (error.name === 'UnresolvedDependenciesError') {\n for (const journey of Object.keys(error.unresolvedJourneys)) {\n printMessage({\n message: ` - ${journey} requires ${error.unresolvedJourneys[journey]}`,\n type: 'info',\n state,\n });\n }\n } else {\n printMessage(`${error.message}`, 'error');\n }\n }\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(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.journey.json'))\n .map((name) => getFilePath(name));\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 try {\n await importJourneys(\n allJourneysData.trees as MultiTreeExportInterface,\n options\n );\n } catch (error) {\n printMessage(`${error.response?.data?.message || error.message}`, 'error');\n }\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): JourneyClassificationType[] {\n return _getJourneyClassification(journey).map((it) => {\n switch (it) {\n case 'standard':\n return it['brightGreen'];\n\n case 'cloud':\n return it['brightMagenta'];\n\n case 'custom':\n return it['brightRed'];\n\n case 'premium':\n return it['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 _getJourneyClassification(journey).map((it) => {\n switch (it) {\n case 'standard':\n return `:green_circle: \\`${it}\\``;\n\n case 'cloud':\n return `:purple_circle: \\`${it}\\``;\n\n case 'custom':\n return `:red_circle: \\`${it}\\``;\n\n case 'premium':\n return `:yellow_circle: \\`${it}\\``;\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 (!state.getAmVersion() && journeyData.meta?.originAmVersion) {\n state.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.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 try {\n const descendents = await getTreeDescendents(\n journeyData,\n resolveTreeExport\n );\n describeTreeDescendents(descendents);\n } catch (error) {\n printMessage(`Error resolving inner tree dependencies:`, 'error');\n printMessage(error.stack, 'error');\n }\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 (!state.getAmVersion() && journeyData.meta?.originAmVersion) {\n state.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[]()\\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":["frodo","state","fs","createProgressIndicator","createTable","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","CirclesOfTrust","EmailTemplate","Idp","Node","Saml2","Script","Theme","cloneDeep","wordwrap","getTypedFilename","saveJsonToFile","getRealmString","getFilePath","getWorkingDirectory","utils","readJourneys","exportJourney","exportJourneys","resolveDependencies","importJourneys","importJourney","getTreeDescendents","getNodeRef","onlineTreeExportResolver","getJourneyClassification","_getJourneyClassification","disableJourney","_disableJourney","enableJourney","_enableJourney","authn","journey","listJourneys","long","analyze","journeys","journeyStub","table","_journeyStub$uiConfig","push","_id","enabled","uiConfig","categories","JSON","parse","join","toString","spinnerId","exportPromises","useStringArrays","deps","journeyExports","Promise","all","journeyExport","_journeyExport$tree$u","tree","error","response","data","_error$response","exportJourneyToFile","journeyId","file","options","verbose","getVerbose","filePath","fileData","exportJourneysToFile","exportJourneysToFiles","journeysExport","trees","Object","entries","treeId","treeValue","indicatorId","meta","importJourneyFromFile","readFileSync","journeyData","installedJourneys","map","x","unresolvedJourneys","resolvedJourneys","indicatorId1","keys","length","indicatorId2","importError","indicatorId3","importFirstJourneyFromFile","hasOwnProperty","call","depSpinnerId","importSpinnerId","importJourneysFromFile","name","message","type","importJourneysFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","allJourneysData","_error$response2","it","getJourneyClassificationMd","getOneLineDescription","treeObj","description","getOneLineDescriptionMd","describeTreeDescendents","descendents","depth","values","indent","Array","fill","descendent","describeTreeDescendentsMd","markdown","describeJourney","resolveTreeExport","_journeyData$meta","_journeyData$tree$uiC","_journeyData$themes","allNodes","nodes","innerNodes","nodeTypeMap","nodeData","_type","getAmVersion","originAmVersion","setAmVersion","stack","nodeType","count","String","getNodeClassification","nodeObj","themes","themeData","scripts","scriptData","emailTemplates","templateData","socialIdentityProviders","socialIdpData","saml2Entities","entityProviderData","circlesOfTrust","cotData","describeJourneyMd","_journeyData$meta2","_journeyData$tree$uiC2","_journeyData$themes2","getNodeClassificationMd","getTableHeaderMd","getTableRowMd"],"sources":["../../src/ops/JourneyOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type NodeSkeleton } from '@rockcarver/frodo-lib/types/api/NodeApi';\nimport { type TreeSkeleton } from '@rockcarver/frodo-lib/types/api/TreeApi';\nimport {\n type JourneyClassificationType,\n type MultiTreeExportInterface,\n type SingleTreeExportInterface,\n type TreeDependencyMapInterface,\n type TreeExportOptions,\n type TreeExportResolverInterface,\n type TreeImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/JourneyOps';\nimport fs from 'fs';\n\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\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 { cloneDeep } from './utils/OpsUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n getTypedFilename,\n saveJsonToFile,\n getRealmString,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readJourneys,\n exportJourney,\n exportJourneys,\n resolveDependencies,\n importJourneys,\n importJourney,\n getTreeDescendents,\n getNodeRef,\n onlineTreeExportResolver,\n getJourneyClassification: _getJourneyClassification,\n disableJourney: _disableJourney,\n enableJourney: _enableJourney,\n} = frodo.authn.journey;\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 readJourneys();\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 const spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Retrieving details of all journeys...`\n );\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 stopProgressIndicator(\n spinnerId,\n 'Retrieved details of all journeys.',\n 'success'\n );\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 stopProgressIndicator(\n spinnerId,\n 'Error retrieving details of all journeys.',\n 'fail'\n );\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.getVerbose();\n if (!file) {\n file = getTypedFilename(journeyId, 'journey');\n }\n const filePath = getFilePath(file, true);\n let spinnerId: string;\n if (!verbose)\n spinnerId = createProgressIndicator('indeterminate', 0, `${journeyId}`);\n try {\n const fileData: SingleTreeExportInterface = await exportJourney(\n journeyId,\n options\n );\n if (verbose)\n spinnerId = createProgressIndicator('indeterminate', 0, `${journeyId}`);\n saveJsonToFile(fileData, filePath);\n stopProgressIndicator(\n spinnerId,\n `Exported ${journeyId['brightCyan']} to ${filePath['brightCyan']}.`,\n 'success'\n );\n } catch (error) {\n if (verbose)\n spinnerId = createProgressIndicator('indeterminate', 0, `${journeyId}`);\n stopProgressIndicator(\n spinnerId,\n `Error exporting journey ${journeyId}: ${error}`,\n 'fail'\n );\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 if (!file) {\n file = getTypedFilename(`all${getRealmString()}Journeys`, 'journey');\n }\n const filePath = getFilePath(file, true);\n const fileData: MultiTreeExportInterface = await exportJourneys(options);\n saveJsonToFile(fileData, filePath);\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 journeysExport = await exportJourneys(options);\n const trees = Object.entries(journeysExport.trees);\n for (const [treeId, treeValue] of trees) {\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Saving ${treeId}...`\n );\n const file = getFilePath(getTypedFilename(`${treeId}`, 'journey'), true);\n treeValue['meta'] = journeysExport.meta;\n try {\n updateProgressIndicator(indicatorId, `Saving ${treeId} to ${file}`);\n saveJsonToFile(treeValue, file);\n stopProgressIndicator(indicatorId, `${treeId} saved to ${file}`);\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error saving ${treeId} to ${file}`);\n }\n }\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.getVerbose();\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\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 readJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n const indicatorId1 = createProgressIndicator(\n 'indeterminate',\n 0,\n 'Resolving dependencies'\n );\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n stopProgressIndicator(\n indicatorId1,\n `Resolved all dependencies.`,\n 'success'\n );\n\n let indicatorId2: string;\n if (!verbose)\n indicatorId2 = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${journeyId}...`\n );\n try {\n await importJourney(journeyData, options);\n if (verbose)\n indicatorId2 = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${journeyId}...`\n );\n stopProgressIndicator(\n indicatorId2,\n `Imported ${journeyId}.`,\n 'success'\n );\n } catch (importError) {\n if (verbose)\n indicatorId2 = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${journeyId}...`\n );\n stopProgressIndicator(indicatorId2, `${importError}`, 'fail');\n }\n } else {\n stopProgressIndicator(indicatorId1, `Unresolved dependencies:`, 'fail');\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 const indicatorId3 = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${journeyId}...`\n );\n stopProgressIndicator(indicatorId3, `${journeyId} not found!`, 'fail');\n }\n } catch (error) {\n printMessage(`Error importing journey ${journeyId}: ${error}`, 'error');\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.getVerbose();\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\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 readJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n const depSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'Resolving dependencies'\n );\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n stopProgressIndicator(\n depSpinnerId,\n `Resolved all dependencies.`,\n 'success'\n );\n\n let importSpinnerId: string;\n if (!verbose)\n importSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${journeyId}...`\n );\n try {\n await importJourney(journeyData, options);\n if (verbose)\n importSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${journeyId}...`\n );\n stopProgressIndicator(\n importSpinnerId,\n `Imported ${journeyId}.`,\n 'success'\n );\n } catch (importError) {\n if (verbose)\n importSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${journeyId}...`\n );\n stopProgressIndicator(importSpinnerId, `${importError}`, 'fail');\n }\n } else {\n stopProgressIndicator(depSpinnerId, `Unresolved dependencies:`, 'fail');\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n } else {\n const importSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing...`\n );\n stopProgressIndicator(importSpinnerId, `No journeys found!`, 'fail');\n }\n // end dependency resolution for single tree import\n } catch (error) {\n printMessage(`Error importing first journey: ${error}`, 'error');\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 try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n try {\n const fileData = JSON.parse(data);\n await importJourneys(fileData.trees, options);\n } catch (error) {\n if (error.name === 'UnresolvedDependenciesError') {\n for (const journey of Object.keys(error.unresolvedJourneys)) {\n printMessage({\n message: ` - ${journey} requires ${error.unresolvedJourneys[journey]}`,\n type: 'info',\n state,\n });\n }\n } else {\n printMessage(`${error.message}`, 'error');\n }\n }\n } catch (error) {\n printMessage(`Error importing journeys: ${error}`, 'error');\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(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.journey.json'))\n .map((name) => getFilePath(name));\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 try {\n await importJourneys(\n allJourneysData.trees as MultiTreeExportInterface,\n options\n );\n } catch (error) {\n printMessage(`${error.response?.data?.message || error.message}`, 'error');\n }\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): JourneyClassificationType[] {\n return _getJourneyClassification(journey).map((it) => {\n switch (it) {\n case 'standard':\n return it['brightGreen'];\n\n case 'cloud':\n return it['brightMagenta'];\n\n case 'custom':\n return it['brightRed'];\n\n case 'premium':\n return it['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 _getJourneyClassification(journey).map((it) => {\n switch (it) {\n case 'standard':\n return `:green_circle: \\`${it}\\``;\n\n case 'cloud':\n return `:purple_circle: \\`${it}\\``;\n\n case 'custom':\n return `:red_circle: \\`${it}\\``;\n\n case 'premium':\n return `:yellow_circle: \\`${it}\\``;\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 (!state.getAmVersion() && journeyData.meta?.originAmVersion) {\n state.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.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 try {\n const descendents = await getTreeDescendents(\n journeyData,\n resolveTreeExport\n );\n describeTreeDescendents(descendents);\n } catch (error) {\n printMessage(`Error resolving inner tree dependencies:`, 'error');\n printMessage(error.stack, 'error');\n }\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 (!state.getAmVersion() && journeyData.meta?.originAmVersion) {\n state.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[]()\\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\nexport async function enableJourney(journeyId: string): Promise<boolean> {\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Enabling journey ${journeyId}...`\n );\n if (_enableJourney(journeyId)) {\n stopProgressIndicator(\n indicatorId,\n `Enabled journey ${journeyId}.`,\n 'success'\n );\n return true;\n } else {\n stopProgressIndicator(\n indicatorId,\n `Error enabling journey ${journeyId}`,\n 'fail'\n );\n return false;\n }\n}\n\nexport async function disableJourney(journeyId: string): Promise<boolean> {\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Disabling journey ${journeyId}...`\n );\n if (_disableJourney(journeyId)) {\n stopProgressIndicator(\n indicatorId,\n `Disabled journey ${journeyId}.`,\n 'success'\n );\n return true;\n } else {\n stopProgressIndicator(\n indicatorId,\n `Error disabling journey ${journeyId}`,\n 'fail'\n );\n return false;\n }\n}\n"],"mappings":"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"}
|