@rockcarver/frodo-cli 0.10.4 → 0.11.1-2

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.
Files changed (247) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +3 -3
  3. package/package.json +17 -15
  4. package/src/app.js +7 -6
  5. package/src/cli/_template/cmd-delete.js +9 -8
  6. package/src/cli/_template/cmd-describe.js +9 -8
  7. package/src/cli/_template/cmd-export.js +9 -8
  8. package/src/cli/_template/cmd-import.js +9 -8
  9. package/src/cli/_template/cmd-list.js +9 -8
  10. package/src/cli/_template/cmd-sub1-delete.js +9 -8
  11. package/src/cli/_template/cmd-sub1-describe.js +9 -8
  12. package/src/cli/_template/cmd-sub1-export.js +9 -8
  13. package/src/cli/_template/cmd-sub1-import.js +9 -8
  14. package/src/cli/_template/cmd-sub1-list.js +9 -8
  15. package/src/cli/_template/cmd-sub2-delete.js +9 -8
  16. package/src/cli/_template/cmd-sub2-describe.js +9 -8
  17. package/src/cli/_template/cmd-sub2-export.js +9 -8
  18. package/src/cli/_template/cmd-sub2-import.js +9 -8
  19. package/src/cli/_template/cmd-sub2-list.js +9 -8
  20. package/src/cli/admin/admin-add-autoid-static-user-mapping.js +12 -12
  21. package/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.js +15 -18
  22. package/src/cli/admin/admin-get-access-token.js +12 -12
  23. package/src/cli/admin/admin-grant-oauth2-client-admin-privileges.js +13 -13
  24. package/src/cli/admin/admin-hide-generic-extension-attributes.js +13 -13
  25. package/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.js +13 -13
  26. package/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.js +14 -13
  27. package/src/cli/admin/admin-list-static-user-mappings.js +12 -12
  28. package/src/cli/admin/admin-remove-static-user-mapping.js +12 -12
  29. package/src/cli/admin/admin-repair-org-model.js +13 -13
  30. package/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.js +13 -13
  31. package/src/cli/admin/admin-show-generic-extension-attributes.js +13 -13
  32. package/src/cli/app/app-delete.js +9 -8
  33. package/src/cli/app/app-describe.js +9 -8
  34. package/src/cli/app/app-export.js +15 -15
  35. package/src/cli/app/app-import.js +11 -11
  36. package/src/cli/app/app-list.js +11 -12
  37. package/src/cli/conn/conn-add.js +11 -11
  38. package/src/cli/conn/conn-delete.js +3 -1
  39. package/src/cli/conn/conn-describe.js +3 -1
  40. package/src/cli/conn/conn-list.js +3 -4
  41. package/src/cli/email/email-template-export.js +16 -16
  42. package/src/cli/email/email-template-import.js +16 -16
  43. package/src/cli/email/email-template-list.js +11 -11
  44. package/src/cli/esv/esv-apply.js +12 -12
  45. package/src/cli/esv/esv-secret-create.js +11 -11
  46. package/src/cli/esv/esv-secret-delete.js +13 -13
  47. package/src/cli/esv/esv-secret-describe.js +11 -11
  48. package/src/cli/esv/esv-secret-export.js +9 -8
  49. package/src/cli/esv/esv-secret-import.js +9 -8
  50. package/src/cli/esv/esv-secret-list.js +11 -11
  51. package/src/cli/esv/esv-secret-set.js +11 -11
  52. package/src/cli/esv/esv-secret-version-activate.js +12 -12
  53. package/src/cli/esv/esv-secret-version-create.js +11 -11
  54. package/src/cli/esv/esv-secret-version-deactivate.js +12 -12
  55. package/src/cli/esv/esv-secret-version-delete.js +13 -13
  56. package/src/cli/esv/esv-secret-version-list.js +11 -11
  57. package/src/cli/esv/esv-variable-create.js +11 -11
  58. package/src/cli/esv/esv-variable-delete.js +13 -16
  59. package/src/cli/esv/esv-variable-describe.js +11 -11
  60. package/src/cli/esv/esv-variable-export.js +9 -8
  61. package/src/cli/esv/esv-variable-import.js +9 -8
  62. package/src/cli/esv/esv-variable-list.js +11 -11
  63. package/src/cli/esv/esv-variable-set.js +13 -16
  64. package/src/cli/idm/idm-count.js +11 -11
  65. package/src/cli/idm/idm-export.js +16 -16
  66. package/src/cli/idm/idm-list.js +11 -11
  67. package/src/cli/idp/idp-export.js +15 -19
  68. package/src/cli/idp/idp-import.js +18 -18
  69. package/src/cli/idp/idp-list.js +12 -12
  70. package/src/cli/info/info.js +23 -19
  71. package/src/cli/journey/journey-delete.js +14 -14
  72. package/src/cli/journey/journey-describe.js +26 -35
  73. package/src/cli/journey/journey-export.js +18 -21
  74. package/src/cli/journey/journey-import.js +17 -17
  75. package/src/cli/journey/journey-list.js +12 -12
  76. package/src/cli/journey/journey-prune.js +12 -12
  77. package/src/cli/logging/logs-list.js +33 -28
  78. package/src/cli/logging/logs-tail.js +26 -22
  79. package/src/cli/realm/realm-add-custom-domain.js +13 -13
  80. package/src/cli/realm/realm-describe.js +14 -14
  81. package/src/cli/realm/realm-list.js +11 -11
  82. package/src/cli/realm/realm-remove-custom-domain.js +16 -13
  83. package/src/cli/saml/saml-cot-export.js +16 -16
  84. package/src/cli/saml/saml-cot-import.js +18 -18
  85. package/src/cli/saml/saml-cot-list.js +12 -12
  86. package/src/cli/saml/saml-describe.js +12 -12
  87. package/src/cli/saml/saml-export.js +16 -19
  88. package/src/cli/saml/saml-import.js +19 -18
  89. package/src/cli/saml/saml-list.js +12 -12
  90. package/src/cli/saml/saml-metadata-export.js +15 -19
  91. package/src/cli/script/script-delete.js +9 -8
  92. package/src/cli/script/script-describe.js +9 -8
  93. package/src/cli/script/script-export.js +18 -20
  94. package/src/cli/script/script-import.js +13 -12
  95. package/src/cli/script/script-list.js +12 -12
  96. package/src/cli/theme/theme-delete.js +17 -21
  97. package/src/cli/theme/theme-export.js +19 -18
  98. package/src/cli/theme/theme-import.js +21 -20
  99. package/src/cli/theme/theme-list.js +12 -12
  100. package/.eslintrc +0 -29
  101. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -30
  102. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  103. package/.github/README.md +0 -273
  104. package/.github/workflows/pipeline.yml +0 -487
  105. package/.prettierrc +0 -6
  106. package/CODE_OF_CONDUCT.md +0 -128
  107. package/docs/BINARIES.md +0 -22
  108. package/docs/CONTRIBUTE.md +0 -96
  109. package/docs/PIPELINE.md +0 -169
  110. package/docs/images/macos_warn1.png +0 -0
  111. package/docs/images/macos_warn2.png +0 -0
  112. package/docs/images/macos_warn3.png +0 -0
  113. package/docs/images/npm_versioning_guidelines.png +0 -0
  114. package/docs/images/release_pipeline.png +0 -0
  115. package/gulpfile.js +0 -49
  116. package/jsconfig.json +0 -6
  117. package/resources/sampleEntitiesFile.json +0 -8
  118. package/resources/sampleEnvFile.env +0 -2
  119. package/src/api/AuthenticateApi.js +0 -33
  120. package/src/api/BaseApi.js +0 -242
  121. package/src/api/CirclesOfTrustApi.js +0 -87
  122. package/src/api/EmailTemplateApi.js +0 -37
  123. package/src/api/IdmConfigApi.js +0 -88
  124. package/src/api/LogApi.js +0 -45
  125. package/src/api/ManagedObjectApi.js +0 -62
  126. package/src/api/OAuth2ClientApi.js +0 -69
  127. package/src/api/OAuth2OIDCApi.js +0 -73
  128. package/src/api/OAuth2ProviderApi.js +0 -32
  129. package/src/api/RealmApi.js +0 -99
  130. package/src/api/Saml2Api.js +0 -176
  131. package/src/api/ScriptApi.js +0 -84
  132. package/src/api/SecretsApi.js +0 -151
  133. package/src/api/ServerInfoApi.js +0 -41
  134. package/src/api/SocialIdentityProvidersApi.js +0 -114
  135. package/src/api/StartupApi.js +0 -45
  136. package/src/api/ThemeApi.js +0 -181
  137. package/src/api/TreeApi.js +0 -207
  138. package/src/api/VariablesApi.js +0 -104
  139. package/src/api/utils/ApiUtils.js +0 -77
  140. package/src/api/utils/Base64.js +0 -62
  141. package/src/cli/journey/journey-delete.e2e.test.js +0 -380
  142. package/src/cli/journey/journey-list.e2e.test.js +0 -141
  143. package/src/cli/theme/theme-delete.e2e.test.js +0 -178
  144. package/src/cli/theme/theme-list.e2e.test.js +0 -119
  145. package/src/ops/AdminOps.js +0 -901
  146. package/src/ops/AuthenticateOps.js +0 -342
  147. package/src/ops/CirclesOfTrustOps.js +0 -350
  148. package/src/ops/ConnectionProfileOps.js +0 -254
  149. package/src/ops/EmailTemplateOps.js +0 -326
  150. package/src/ops/IdmOps.js +0 -227
  151. package/src/ops/IdpOps.js +0 -342
  152. package/src/ops/JourneyOps.js +0 -2026
  153. package/src/ops/LogOps.js +0 -357
  154. package/src/ops/ManagedObjectOps.js +0 -34
  155. package/src/ops/OAuth2ClientOps.js +0 -151
  156. package/src/ops/OrganizationOps.js +0 -85
  157. package/src/ops/RealmOps.js +0 -139
  158. package/src/ops/SamlOps.js +0 -541
  159. package/src/ops/ScriptOps.js +0 -211
  160. package/src/ops/SecretsOps.js +0 -288
  161. package/src/ops/StartupOps.js +0 -114
  162. package/src/ops/ThemeOps.js +0 -379
  163. package/src/ops/VariablesOps.js +0 -185
  164. package/src/ops/templates/OAuth2ClientTemplate.json +0 -270
  165. package/src/ops/templates/OrgModelUserAttributesTemplate.json +0 -149
  166. package/src/ops/templates/cloud/GenericExtensionAttributesTemplate.json +0 -392
  167. package/src/ops/templates/cloud/managed.json +0 -4119
  168. package/src/ops/utils/Console.js +0 -434
  169. package/src/ops/utils/DataProtection.js +0 -92
  170. package/src/ops/utils/ExportImportUtils.js +0 -146
  171. package/src/ops/utils/OpsUtils.js +0 -76
  172. package/src/ops/utils/Wordwrap.js +0 -11
  173. package/src/storage/SessionStorage.js +0 -45
  174. package/test/client_cli/en/connections.test.js +0 -62
  175. package/test/client_cli/en/connections_add.test.js +0 -34
  176. package/test/client_cli/en/connections_delete.test.js +0 -34
  177. package/test/client_cli/en/connections_list.test.js +0 -34
  178. package/test/client_cli/en/email_templates.test.js +0 -77
  179. package/test/client_cli/en/email_templates_export.test.js +0 -196
  180. package/test/client_cli/en/email_templates_import.test.js +0 -145
  181. package/test/client_cli/en/email_templates_list.test.js +0 -130
  182. package/test/client_cli/en/idm.test.js +0 -111
  183. package/test/client_cli/en/idm_count.test.js +0 -121
  184. package/test/client_cli/en/idm_export.test.js +0 -136
  185. package/test/client_cli/en/idm_exportAll.test.js +0 -156
  186. package/test/client_cli/en/idm_exportAllRaw.test.js +0 -120
  187. package/test/client_cli/en/idm_import.test_.js +0 -103
  188. package/test/client_cli/en/idm_importAll.test_.js +0 -103
  189. package/test/client_cli/en/idm_list.test.js +0 -103
  190. package/test/client_cli/en/info.test.js +0 -125
  191. package/test/client_cli/en/journey.test.js +0 -127
  192. package/test/client_cli/en/journey_describe.test.js +0 -196
  193. package/test/client_cli/en/journey_export.test.js +0 -213
  194. package/test/client_cli/en/journey_import.test.js +0 -195
  195. package/test/client_cli/en/journey_importAll.test.js +0 -180
  196. package/test/client_cli/en/journey_list.test.js +0 -162
  197. package/test/client_cli/en/journey_prune.test.js +0 -148
  198. package/test/client_cli/en/logs.test.js +0 -79
  199. package/test/client_cli/en/logs_list.test.js +0 -83
  200. package/test/client_cli/en/logs_tail.test.js +0 -118
  201. package/test/client_cli/en/root.test.js +0 -91
  202. package/test/client_cli/en/script.test.js +0 -77
  203. package/test/client_cli/en/script_export.test.js +0 -213
  204. package/test/client_cli/en/script_import.test.js +0 -163
  205. package/test/client_cli/en/script_list.test.js +0 -148
  206. package/test/client_cli/utils/utils.js +0 -32
  207. package/test/e2e/journey/baseline/ForgottenUsername.journey.json +0 -216
  208. package/test/e2e/journey/baseline/Login.journey.json +0 -205
  209. package/test/e2e/journey/baseline/PasswordGrant.journey.json +0 -139
  210. package/test/e2e/journey/baseline/ProgressiveProfile.journey.json +0 -198
  211. package/test/e2e/journey/baseline/Registration.journey.json +0 -249
  212. package/test/e2e/journey/baseline/ResetPassword.journey.json +0 -268
  213. package/test/e2e/journey/baseline/UpdatePassword.journey.json +0 -323
  214. package/test/e2e/journey/baseline/allAlphaJourneys.journeys.json +0 -1520
  215. package/test/e2e/journey/delete/ForgottenUsername.journey.json +0 -216
  216. package/test/e2e/journey/delete/Login.journey.json +0 -205
  217. package/test/e2e/journey/delete/PasswordGrant.journey.json +0 -139
  218. package/test/e2e/journey/delete/ProgressiveProfile.journey.json +0 -198
  219. package/test/e2e/journey/delete/Registration.journey.json +0 -249
  220. package/test/e2e/journey/delete/ResetPassword.journey.json +0 -268
  221. package/test/e2e/journey/delete/UpdatePassword.journey.json +0 -323
  222. package/test/e2e/journey/delete/deleteMe.journey.json +0 -230
  223. package/test/e2e/journey/list/Disabled.journey.json +0 -43
  224. package/test/e2e/journey/list/ForgottenUsername.journey.json +0 -216
  225. package/test/e2e/journey/list/Login.journey.json +0 -205
  226. package/test/e2e/journey/list/PasswordGrant.journey.json +0 -139
  227. package/test/e2e/journey/list/ProgressiveProfile.journey.json +0 -198
  228. package/test/e2e/journey/list/Registration.journey.json +0 -249
  229. package/test/e2e/journey/list/ResetPassword.journey.json +0 -268
  230. package/test/e2e/journey/list/UpdatePassword.journey.json +0 -323
  231. package/test/e2e/setup.js +0 -98
  232. package/test/e2e/theme/baseline/Contrast.theme.json +0 -95
  233. package/test/e2e/theme/baseline/Highlander.theme.json +0 -95
  234. package/test/e2e/theme/baseline/Robroy.theme.json +0 -95
  235. package/test/e2e/theme/baseline/Starter-Theme.theme.json +0 -94
  236. package/test/e2e/theme/baseline/Zardoz.theme.json +0 -95
  237. package/test/e2e/theme/import/Contrast.theme.json +0 -95
  238. package/test/e2e/theme/import/Highlander.theme.json +0 -95
  239. package/test/e2e/theme/import/Robroy.theme.json +0 -95
  240. package/test/e2e/theme/import/Starter-Theme.theme.json +0 -94
  241. package/test/e2e/theme/import/Zardoz.default.theme.json +0 -95
  242. package/test/fs_tmp/.gitkeep +0 -2
  243. package/test/global/setup.js +0 -65
  244. package/test/lib_api/unit_tests/ApiUtils.test.js +0 -186
  245. package/test/lib_api/unit_tests/Base64URL.test.js +0 -22
  246. package/test/lib_api/unit_tests/DataProtection.test.js +0 -25
  247. package/test/lib_api/unit_tests/ExportImportUtils.test.js +0 -121
@@ -1,254 +0,0 @@
1
- import fs from 'fs';
2
- import os from 'os';
3
- import storage from '../storage/SessionStorage.js';
4
- import DataProtection from './utils/DataProtection.js';
5
- import {
6
- createObjectTable,
7
- createTable,
8
- printMessage,
9
- } from './utils/Console.js';
10
-
11
- const dataProtection = new DataProtection();
12
-
13
- const fileOptions = {
14
- options: 'utf8',
15
- indentation: 4,
16
- };
17
-
18
- const getConnectionProfilesFolder = () => `${os.homedir()}/.frodo`;
19
-
20
- /**
21
- * Get connection profiles file name
22
- * @returns {String} connection profiles file name
23
- */
24
- export function getConnectionProfilesFileName() {
25
- return `${os.homedir()}/.frodo/.frodorc`;
26
- }
27
-
28
- /**
29
- * Find connection profile
30
- * @param {Object} connectionProfiles connection profile object
31
- * @param {String} host tenant host url or unique substring
32
- * @returns {Object} connection profile object or null
33
- */
34
- function findConnectionProfile(connectionProfiles, host) {
35
- for (const tenant in connectionProfiles) {
36
- if (tenant.includes(host)) {
37
- const profile = connectionProfiles[tenant];
38
- profile.tenant = tenant;
39
- return profile;
40
- }
41
- }
42
- return null;
43
- }
44
-
45
- /**
46
- * List connection profiles
47
- * @param {boolean} long Long list format with details
48
- */
49
- export function listConnectionProfiles(long = false) {
50
- const filename = getConnectionProfilesFileName();
51
- try {
52
- const data = fs.readFileSync(filename, 'utf8');
53
- const connectionsData = JSON.parse(data);
54
- if (long) {
55
- const table = createTable(['Host', 'Username', 'Log API Key']);
56
- Object.keys(connectionsData).forEach((c) => {
57
- table.push([
58
- c,
59
- connectionsData[c].username,
60
- connectionsData[c].logApiKey,
61
- ]);
62
- });
63
- printMessage(table.toString(), 'data');
64
- } else {
65
- Object.keys(connectionsData).forEach((c) => {
66
- printMessage(`${c}`, 'data');
67
- });
68
- }
69
- printMessage(
70
- 'Any unique substring of a saved host can be used as the value for host parameter in all commands',
71
- 'info'
72
- );
73
- } catch (e) {
74
- printMessage(`No connections found in ${filename} (${e.message})`, 'error');
75
- }
76
- }
77
-
78
- /**
79
- * Initialize connection profiles
80
- */
81
- export function initConnectionProfiles() {
82
- // create connections.json file if it doesn't exist
83
- const folderName = getConnectionProfilesFolder();
84
- const filename = getConnectionProfilesFileName();
85
- if (!fs.existsSync(folderName)) {
86
- fs.mkdirSync(folderName, { recursive: true });
87
- if (!fs.existsSync(filename)) {
88
- fs.writeFileSync(
89
- filename,
90
- JSON.stringify({}, null, fileOptions.indentation)
91
- );
92
- }
93
- }
94
- // encrypt the password from clear text to aes-256-GCM
95
- else {
96
- const data = fs.readFileSync(filename, fileOptions.options);
97
- const connectionsData = JSON.parse(data);
98
- let convert = false;
99
- Object.keys(connectionsData).forEach(async (conn) => {
100
- if (connectionsData[conn].password) {
101
- convert = true;
102
- connectionsData[conn].encodedPassword = await dataProtection.encrypt(
103
- connectionsData[conn].password
104
- ); // Buffer.from(connectionsData[conn].password).toString('base64');
105
- delete connectionsData[conn].password;
106
- }
107
- });
108
- if (convert) {
109
- fs.writeFileSync(
110
- filename,
111
- JSON.stringify(connectionsData, null, fileOptions.indentation)
112
- );
113
- }
114
- }
115
- }
116
-
117
- /**
118
- * Get connection profile by host
119
- * @param {String} host host tenant host url or unique substring
120
- * @returns {Object} connection profile or null
121
- */
122
- export async function getConnectionProfileByHost(host) {
123
- try {
124
- const filename = getConnectionProfilesFileName();
125
- const connectionsData = JSON.parse(
126
- fs.readFileSync(filename, fileOptions.options)
127
- );
128
- const profile = findConnectionProfile(connectionsData, host);
129
- if (!profile) {
130
- printMessage(
131
- `Profile for ${host} not found. Please specify credentials on command line`,
132
- 'error'
133
- );
134
- return null;
135
- }
136
- return {
137
- tenant: profile.tenant,
138
- username: profile.username ? profile.username : null,
139
- password: profile.encodedPassword
140
- ? await dataProtection.decrypt(profile.encodedPassword)
141
- : null,
142
- key: profile.logApiKey ? profile.logApiKey : null,
143
- secret: profile.logApiSecret ? profile.logApiSecret : null,
144
- };
145
- } catch (e) {
146
- printMessage(
147
- `Can not read saved connection info, please specify credentials on command line: ${e}`,
148
- 'error'
149
- );
150
- return null;
151
- }
152
- }
153
-
154
- /**
155
- * Get connection profile
156
- * @returns {Object} connection profile or null
157
- */
158
- export async function getConnectionProfile() {
159
- return getConnectionProfileByHost(storage.session.getTenant());
160
- }
161
-
162
- /**
163
- * Save connection profile
164
- */
165
- export async function saveConnectionProfile() {
166
- const filename = getConnectionProfilesFileName();
167
- printMessage(`Saving creds in ${filename}...`);
168
- let connectionsData = {};
169
- let existingData = {};
170
- try {
171
- fs.statSync(filename);
172
- const data = fs.readFileSync(filename, 'utf8');
173
- connectionsData = JSON.parse(data);
174
- if (connectionsData[storage.session.getTenant()]) {
175
- existingData = connectionsData[storage.session.getTenant()];
176
- printMessage(
177
- `Updating existing connection profile ${storage.session.getTenant()}`
178
- );
179
- } else
180
- printMessage(`Adding connection profile ${storage.session.getTenant()}`);
181
- } catch (e) {
182
- printMessage(
183
- `Creating connection profile file ${filename} with ${storage.session.getTenant()}`
184
- );
185
- }
186
- if (storage.session.getUsername())
187
- existingData.username = storage.session.getUsername();
188
- if (storage.session.getPassword())
189
- existingData.encodedPassword = await dataProtection.encrypt(
190
- storage.session.getPassword()
191
- ); // Buffer.from(storage.session.getPassword()).toString('base64');
192
- if (storage.session.getLogApiKey())
193
- existingData.logApiKey = storage.session.getLogApiKey();
194
- if (storage.session.getLogApiSecret())
195
- existingData.logApiSecret = storage.session.getLogApiSecret();
196
- connectionsData[storage.session.getTenant()] = existingData;
197
-
198
- fs.writeFileSync(filename, JSON.stringify(connectionsData, null, 2));
199
- }
200
-
201
- /**
202
- * Delete connection profile
203
- * @param {String} host host tenant host url or unique substring
204
- */
205
- export function deleteConnectionProfile(host) {
206
- const filename = getConnectionProfilesFileName();
207
- let connectionsData = {};
208
- fs.stat(filename, (err) => {
209
- if (err == null) {
210
- const data = fs.readFileSync(filename, 'utf8');
211
- connectionsData = JSON.parse(data);
212
- const profile = findConnectionProfile(connectionsData, host);
213
- if (profile) {
214
- printMessage(`Deleting connection profile ${profile.tenant}`);
215
- delete connectionsData[profile.tenant];
216
- fs.writeFileSync(filename, JSON.stringify(connectionsData, null, 2));
217
- } else {
218
- printMessage(`No connection profile ${host} found`);
219
- }
220
- } else if (err.code === 'ENOENT') {
221
- printMessage(`Connection profile file ${filename} not found`);
222
- } else {
223
- printMessage(
224
- `Error in deleting connection profile: ${err.code}`,
225
- 'error'
226
- );
227
- }
228
- });
229
- }
230
-
231
- export async function describeConnectionProfile(host, showSecrets) {
232
- const profile = await getConnectionProfileByHost(host);
233
- if (profile) {
234
- if (!showSecrets) {
235
- delete profile.password;
236
- delete profile.secret;
237
- }
238
- if (!profile.key) {
239
- delete profile.key;
240
- delete profile.secret;
241
- }
242
- const keyMap = {
243
- tenant: 'Host',
244
- username: 'Username',
245
- password: 'Password',
246
- key: 'Log API Key',
247
- secret: 'Log API Secret',
248
- };
249
- const table = createObjectTable(profile, keyMap);
250
- printMessage(table.toString(), 'data');
251
- } else {
252
- printMessage(`No connection profile ${host} found`);
253
- }
254
- }
@@ -1,326 +0,0 @@
1
- import fs from 'fs';
2
- import {
3
- EMAIL_TEMPLATE_TYPE,
4
- getEmailTemplate,
5
- getEmailTemplates,
6
- putEmailTemplate,
7
- } from '../api/EmailTemplateApi.js';
8
- import {
9
- createProgressBar,
10
- createTable,
11
- printMessage,
12
- stopProgressBar,
13
- updateProgressBar,
14
- } from './utils/Console.js';
15
- import {
16
- getTypedFilename,
17
- saveJsonToFile,
18
- validateImport,
19
- } from './utils/ExportImportUtils.js';
20
- import wordwrap from './utils/Wordwrap.js';
21
-
22
- /**
23
- * Maintain the file type centrally
24
- */
25
- const EMAIL_TEMPLATE_FILE_TYPE = 'template.email';
26
-
27
- // use a function vs a template variable to avoid problems in loops
28
- function getFileDataTemplate() {
29
- return {
30
- meta: {},
31
- emailTemplate: {},
32
- };
33
- }
34
-
35
- /**
36
- * List email templates
37
- * @param {boolean} long Long list format with details
38
- */
39
- export async function listEmailTemplates(long = false) {
40
- let emailTemplates = [];
41
- try {
42
- emailTemplates = (await getEmailTemplates()).data.result;
43
- } catch (error) {
44
- printMessage(`${error.message}`, 'error');
45
- printMessage(error.response.data, 'error');
46
- }
47
- emailTemplates.sort((a, b) => a._id.localeCompare(b._id));
48
- if (!long) {
49
- for (const [, emailTemplate] of emailTemplates.entries()) {
50
- printMessage(
51
- `${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,
52
- 'data'
53
- );
54
- }
55
- } else {
56
- const table = createTable([
57
- 'Id'.brightCyan,
58
- 'Name'.brightCyan,
59
- 'Status'.brightCyan,
60
- 'Locale(s)'.brightCyan,
61
- 'From'.brightCyan,
62
- 'Subject'.brightCyan,
63
- ]);
64
- emailTemplates.forEach((emailTemplate) => {
65
- table.push([
66
- // Id
67
- `${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,
68
- // Name
69
- `${emailTemplate.displayName ? emailTemplate.displayName : ''}`,
70
- // Status
71
- emailTemplate.enabled === false
72
- ? 'disabled'.brightRed
73
- : 'enabled'.brightGreen,
74
- // Locale(s)
75
- `${emailTemplate.defaultLocale}${
76
- Object.keys(emailTemplate.subject).length > 1
77
- ? ` (${Object.keys(emailTemplate.subject)
78
- .filter((locale) => locale !== emailTemplate.defaultLocale)
79
- .join(',')})`
80
- : ''
81
- }`,
82
- // From
83
- `${emailTemplate.from ? emailTemplate.from : ''}`,
84
- // Subject
85
- wordwrap(emailTemplate.subject[emailTemplate.defaultLocale], 40),
86
- ]);
87
- });
88
- printMessage(table.toString(), 'data');
89
- }
90
- }
91
-
92
- /**
93
- * Export a single email template to file
94
- * @param {String} templateId email template id
95
- * @param {String} file optional filename
96
- */
97
- export async function exportEmailTemplateToFile(templateId, file) {
98
- let fileName = file;
99
- if (!fileName) {
100
- fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);
101
- }
102
- createProgressBar(1, `Exporting ${templateId}`);
103
- getEmailTemplate(templateId)
104
- .then(async (response) => {
105
- const templateData = response.data;
106
- updateProgressBar(`Writing file ${fileName}`);
107
- const fileData = getFileDataTemplate();
108
- fileData.emailTemplate[templateId] = templateData;
109
- saveJsonToFile(fileData, fileName);
110
- stopProgressBar(
111
- `Exported ${templateId.brightCyan} to ${fileName.brightCyan}.`
112
- );
113
- })
114
- .catch((err) => {
115
- stopProgressBar(`${err}`);
116
- printMessage(err, 'error');
117
- });
118
- }
119
-
120
- /**
121
- * Export all email templates to file
122
- * @param {String} file optional filename
123
- */
124
- export async function exportEmailTemplatesToFile(file) {
125
- let fileName = file;
126
- if (!fileName) {
127
- fileName = getTypedFilename(`allEmailTemplates`, EMAIL_TEMPLATE_FILE_TYPE);
128
- }
129
- const fileData = getFileDataTemplate();
130
- getEmailTemplates()
131
- .then((response) => {
132
- const templates = response.data.result;
133
- createProgressBar(response.data.resultCount, 'Exporting email templates');
134
- for (const template of templates) {
135
- const templateId = template._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '');
136
- updateProgressBar(`Exporting ${templateId}`);
137
- fileData.emailTemplate[templateId] = template;
138
- }
139
- saveJsonToFile(fileData, fileName);
140
- stopProgressBar(
141
- `${response.data.resultCount} templates exported to ${fileName}.`
142
- );
143
- })
144
- .catch((err) => {
145
- stopProgressBar(`${err}`);
146
- printMessage(err, 'error');
147
- });
148
- }
149
-
150
- /**
151
- * Export all email templates to separate files
152
- */
153
- export async function exportEmailTemplatesToFiles() {
154
- getEmailTemplates()
155
- .then((response) => {
156
- const templates = response.data.result;
157
- createProgressBar(response.data.resultCount, 'Exporting email templates');
158
- for (const template of templates) {
159
- const templateId = template._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '');
160
- const fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);
161
- const fileData = getFileDataTemplate();
162
- updateProgressBar(`Exporting ${templateId}`);
163
- fileData.emailTemplate[templateId] = template;
164
- saveJsonToFile(fileData, fileName);
165
- }
166
- stopProgressBar(`${response.data.resultCount} templates exported.`);
167
- })
168
- .catch((err) => {
169
- stopProgressBar(`${err}`);
170
- printMessage(err, 'error');
171
- });
172
- }
173
-
174
- /**
175
- * Import email template by id from file
176
- * @param {String} templateId email template id
177
- * @param {String} file optional filename
178
- */
179
- export async function importEmailTemplateFromFile(templateId, file) {
180
- // eslint-disable-next-line no-param-reassign
181
- templateId = templateId.replaceAll(`${EMAIL_TEMPLATE_TYPE}/`, '');
182
- fs.readFile(file, 'utf8', (err, data) => {
183
- if (err) throw err;
184
- const fileData = JSON.parse(data);
185
- if (validateImport(fileData.meta)) {
186
- createProgressBar(1, `Importing ${templateId}`);
187
- if (fileData.emailTemplate[templateId]) {
188
- putEmailTemplate(templateId, fileData.emailTemplate[templateId])
189
- .then(() => {
190
- updateProgressBar(`Importing ${templateId}`);
191
- stopProgressBar(`Imported ${templateId}`);
192
- })
193
- .catch((putEmailTemplateError) => {
194
- stopProgressBar(`${putEmailTemplateError}`);
195
- printMessage(putEmailTemplateError, 'error');
196
- });
197
- } else {
198
- stopProgressBar(
199
- `Email template ${templateId.brightCyan} not found in ${file.brightCyan}!`
200
- );
201
- printMessage(
202
- `Email template ${templateId.brightCyan} not found in ${file.brightCyan}!`,
203
- 'error'
204
- );
205
- }
206
- } else {
207
- printMessage('Import validation failed...', 'error');
208
- }
209
- });
210
- }
211
-
212
- /**
213
- * Import all email templates from file
214
- * @param {String} file optional filename
215
- */
216
- export async function importEmailTemplatesFromFile(file) {
217
- fs.readFile(file, 'utf8', async (err, data) => {
218
- if (err) throw err;
219
- const fileData = JSON.parse(data);
220
- if (validateImport(fileData.meta)) {
221
- createProgressBar(
222
- Object.keys(fileData.emailTemplate).length,
223
- `Importing email templates`
224
- );
225
- for (const id in fileData.emailTemplate) {
226
- if ({}.hasOwnProperty.call(fileData.emailTemplate, id)) {
227
- const templateId = id.replaceAll(`${EMAIL_TEMPLATE_TYPE}/`, '');
228
- try {
229
- // eslint-disable-next-line no-await-in-loop
230
- await putEmailTemplate(
231
- templateId,
232
- fileData.emailTemplate[templateId]
233
- );
234
- updateProgressBar(`Imported ${templateId}`);
235
- } catch (putEmailTemplateError) {
236
- printMessage(`\nError importing ${templateId}`, 'error');
237
- printMessage(putEmailTemplateError.response.data, 'error');
238
- }
239
- }
240
- }
241
- stopProgressBar(`Done.`);
242
- } else {
243
- printMessage('Import validation failed...', 'error');
244
- }
245
- });
246
- }
247
-
248
- /**
249
- * Import all email templates from separate files
250
- */
251
- export async function importEmailTemplatesFromFiles() {
252
- const names = fs.readdirSync('.');
253
- const jsonFiles = names.filter((name) =>
254
- name.toLowerCase().endsWith(`${EMAIL_TEMPLATE_FILE_TYPE}.json`)
255
- );
256
- createProgressBar(jsonFiles.length, 'Importing email templates...');
257
- let total = 0;
258
- let totalErrors = 0;
259
- for (const file of jsonFiles) {
260
- const data = fs.readFileSync(file, 'utf8');
261
- const fileData = JSON.parse(data);
262
- if (validateImport(fileData.meta)) {
263
- total += Object.keys(fileData.emailTemplate).length;
264
- let errors = 0;
265
- for (const id in fileData.emailTemplate) {
266
- if ({}.hasOwnProperty.call(fileData.emailTemplate, id)) {
267
- const templateId = id.replaceAll(`${EMAIL_TEMPLATE_TYPE}/`, '');
268
- try {
269
- // eslint-disable-next-line no-await-in-loop
270
- await putEmailTemplate(
271
- templateId,
272
- fileData.emailTemplate[templateId]
273
- );
274
- } catch (putEmailTemplateError) {
275
- errors += 1;
276
- printMessage(`\nError importing ${templateId}`, 'error');
277
- printMessage(putEmailTemplateError.response.data, 'error');
278
- }
279
- }
280
- }
281
- totalErrors += errors;
282
- updateProgressBar(`Imported ${file}`);
283
- } else {
284
- printMessage(`Validation of ${file} failed!`, 'error');
285
- }
286
- }
287
- stopProgressBar(
288
- `Imported ${total - totalErrors} of ${total} email template(s) from ${
289
- jsonFiles.length
290
- } file(s).`
291
- );
292
- }
293
-
294
- /**
295
- * Import first email template from file
296
- * @param {String} file optional filename
297
- */
298
- export async function importFirstEmailTemplateFromFile(file) {
299
- fs.readFile(file, 'utf8', (err, data) => {
300
- if (err) throw err;
301
- const fileData = JSON.parse(data);
302
- if (validateImport(fileData.meta)) {
303
- createProgressBar(1, `Importing first email template`);
304
- for (const id in fileData.emailTemplate) {
305
- if ({}.hasOwnProperty.call(fileData.emailTemplate, id)) {
306
- putEmailTemplate(
307
- id.replaceAll('emailTemplate/', ''),
308
- fileData.emailTemplate[id]
309
- )
310
- .then(() => {
311
- updateProgressBar(`Imported ${id}`);
312
- stopProgressBar(`Imported ${id}`);
313
- })
314
- .catch((putEmailTemplateError) => {
315
- stopProgressBar(`Error importing email template ${id}`);
316
- printMessage(`\nError importing email template ${id}`, 'error');
317
- printMessage(putEmailTemplateError.response.data, 'error');
318
- });
319
- break;
320
- }
321
- }
322
- } else {
323
- printMessage('Import validation failed...', 'error');
324
- }
325
- });
326
- }