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

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 (98) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/esm/cli/_template/something-else-export.js +1 -1
  3. package/esm/cli/_template/something-else-export.js.map +1 -1
  4. package/esm/cli/_template/something-export.js +1 -1
  5. package/esm/cli/_template/something-export.js.map +1 -1
  6. package/esm/cli/_template/something-other-export.js +1 -1
  7. package/esm/cli/_template/something-other-export.js.map +1 -1
  8. package/esm/cli/admin/admin-federation-export.js +4 -4
  9. package/esm/cli/admin/admin-federation-export.js.map +1 -1
  10. package/esm/cli/agent/agent-export.js +4 -4
  11. package/esm/cli/agent/agent-export.js.map +1 -1
  12. package/esm/cli/agent/agent-gateway-export.js +4 -4
  13. package/esm/cli/agent/agent-gateway-export.js.map +1 -1
  14. package/esm/cli/agent/agent-java-export.js +4 -4
  15. package/esm/cli/agent/agent-java-export.js.map +1 -1
  16. package/esm/cli/agent/agent-web-export.js +4 -4
  17. package/esm/cli/agent/agent-web-export.js.map +1 -1
  18. package/esm/cli/app/app-export.js +4 -4
  19. package/esm/cli/app/app-export.js.map +1 -1
  20. package/esm/cli/authn/authn-export.js +2 -2
  21. package/esm/cli/authn/authn-export.js.map +1 -1
  22. package/esm/cli/authz/authz-policy-export.js +6 -6
  23. package/esm/cli/authz/authz-policy-export.js.map +1 -1
  24. package/esm/cli/authz/authz-set-export.js +4 -4
  25. package/esm/cli/authz/authz-set-export.js.map +1 -1
  26. package/esm/cli/authz/authz-type-export.js +5 -5
  27. package/esm/cli/authz/authz-type-export.js.map +1 -1
  28. package/esm/cli/config/config-export.js +3 -3
  29. package/esm/cli/config/config-export.js.map +1 -1
  30. package/esm/cli/email/email-template-export.js +4 -4
  31. package/esm/cli/email/email-template-export.js.map +1 -1
  32. package/esm/cli/esv/esv-secret-export.js +4 -4
  33. package/esm/cli/esv/esv-secret-export.js.map +1 -1
  34. package/esm/cli/esv/esv-variable-export.js +4 -4
  35. package/esm/cli/esv/esv-variable-export.js.map +1 -1
  36. package/esm/cli/idp/idp-export.js +4 -4
  37. package/esm/cli/idp/idp-export.js.map +1 -1
  38. package/esm/cli/journey/journey-describe.js +3 -1
  39. package/esm/cli/journey/journey-describe.js.map +1 -1
  40. package/esm/cli/journey/journey-export.js +4 -4
  41. package/esm/cli/journey/journey-export.js.map +1 -1
  42. package/esm/cli/oauth/oauth-client-export.js +4 -4
  43. package/esm/cli/oauth/oauth-client-export.js.map +1 -1
  44. package/esm/cli/saml/saml-cot-export.js +4 -4
  45. package/esm/cli/saml/saml-cot-export.js.map +1 -1
  46. package/esm/cli/saml/saml-export.js +4 -4
  47. package/esm/cli/saml/saml-export.js.map +1 -1
  48. package/esm/cli/script/script-export.js +4 -4
  49. package/esm/cli/script/script-export.js.map +1 -1
  50. package/esm/cli/service/service-export.js +4 -4
  51. package/esm/cli/service/service-export.js.map +1 -1
  52. package/esm/cli/theme/theme-export.js +5 -5
  53. package/esm/cli/theme/theme-export.js.map +1 -1
  54. package/esm/ops/AdminFederationOps.js +11 -7
  55. package/esm/ops/AdminFederationOps.js.map +1 -1
  56. package/esm/ops/AgentOps.js +39 -25
  57. package/esm/ops/AgentOps.js.map +1 -1
  58. package/esm/ops/ApplicationOps.js +11 -8
  59. package/esm/ops/ApplicationOps.js.map +1 -1
  60. package/esm/ops/AuthenticationSettingsOps.js +4 -3
  61. package/esm/ops/AuthenticationSettingsOps.js.map +1 -1
  62. package/esm/ops/CirclesOfTrustOps.js +12 -7
  63. package/esm/ops/CirclesOfTrustOps.js.map +1 -1
  64. package/esm/ops/ConfigOps.js +9 -7
  65. package/esm/ops/ConfigOps.js.map +1 -1
  66. package/esm/ops/EmailTemplateOps.js +11 -7
  67. package/esm/ops/EmailTemplateOps.js.map +1 -1
  68. package/esm/ops/IdmOps.js +3 -2
  69. package/esm/ops/IdmOps.js.map +1 -1
  70. package/esm/ops/IdpOps.js +14 -7
  71. package/esm/ops/IdpOps.js.map +1 -1
  72. package/esm/ops/JourneyOps.js +15 -6
  73. package/esm/ops/JourneyOps.js.map +1 -1
  74. package/esm/ops/OAuth2ClientOps.js +10 -7
  75. package/esm/ops/OAuth2ClientOps.js.map +1 -1
  76. package/esm/ops/PolicyOps.js +18 -11
  77. package/esm/ops/PolicyOps.js.map +1 -1
  78. package/esm/ops/PolicySetOps.js +12 -7
  79. package/esm/ops/PolicySetOps.js.map +1 -1
  80. package/esm/ops/ResourceTypeOps.js +15 -9
  81. package/esm/ops/ResourceTypeOps.js.map +1 -1
  82. package/esm/ops/Saml2Ops.js +10 -7
  83. package/esm/ops/Saml2Ops.js.map +1 -1
  84. package/esm/ops/ScriptOps.js +22 -14
  85. package/esm/ops/ScriptOps.js.map +1 -1
  86. package/esm/ops/SecretsOps.js +14 -8
  87. package/esm/ops/SecretsOps.js.map +1 -1
  88. package/esm/ops/ServiceOps.js +10 -9
  89. package/esm/ops/ServiceOps.js.map +1 -1
  90. package/esm/ops/ThemeOps.js +15 -9
  91. package/esm/ops/ThemeOps.js.map +1 -1
  92. package/esm/ops/VariablesOps.js +14 -8
  93. package/esm/ops/VariablesOps.js.map +1 -1
  94. package/esm/utils/Config.js +2 -2
  95. package/esm/utils/Config.js.map +1 -1
  96. package/package.json +2 -2
  97. package/esm/utils/ExportImportUtils.js +0 -48
  98. package/esm/utils/ExportImportUtils.js.map +0 -1
@@ -2,11 +2,12 @@ import { frodo } from '@rockcarver/frodo-lib';
2
2
  import fs from 'fs';
3
3
  import path from 'path';
4
4
  import { createProgressIndicator, createTable, debugMessage, printMessage, stopProgressIndicator, updateProgressIndicator } from '../utils/Console';
5
- import { getTypedFilename, saveJsonToFile } from '../utils/ExportImportUtils';
6
5
  import { cloneDeep } from './utils/OpsUtils';
7
6
  import wordwrap from './utils/Wordwrap';
8
7
  const {
9
8
  validateImport,
9
+ getTypedFilename,
10
+ saveJsonToFile,
10
11
  getFilePath,
11
12
  getWorkingDirectory
12
13
  } = frodo.utils;
@@ -104,8 +105,9 @@ export async function listEmailTemplates(long = false) {
104
105
  * Export single email template to a file
105
106
  * @param {string} templateId email template id to export
106
107
  * @param {string} file filename where to export the template data
108
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
107
109
  */
108
- export async function exportEmailTemplateToFile(templateId, file) {
110
+ export async function exportEmailTemplateToFile(templateId, file, includeMeta = true) {
109
111
  let fileName = file;
110
112
  if (!fileName) {
111
113
  fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);
@@ -117,7 +119,7 @@ export async function exportEmailTemplateToFile(templateId, file) {
117
119
  updateProgressIndicator(indicatorId, `Writing file ${filePath}`);
118
120
  const fileData = getFileDataTemplate();
119
121
  fileData.emailTemplate[templateId] = templateData;
120
- saveJsonToFile(fileData, filePath);
122
+ saveJsonToFile(fileData, filePath, includeMeta);
121
123
  stopProgressIndicator(indicatorId, `Exported ${templateId['brightCyan']} to ${filePath['brightCyan']}.`);
122
124
  } catch (err) {
123
125
  stopProgressIndicator(indicatorId, `${err}`);
@@ -128,8 +130,9 @@ export async function exportEmailTemplateToFile(templateId, file) {
128
130
  /**
129
131
  * Export all email templates to file
130
132
  * @param {String} file optional filename
133
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
131
134
  */
132
- export async function exportEmailTemplatesToFile(file) {
135
+ export async function exportEmailTemplatesToFile(file, includeMeta = true) {
133
136
  let fileName = file;
134
137
  if (!fileName) {
135
138
  fileName = getTypedFilename(`allEmailTemplates`, EMAIL_TEMPLATE_FILE_TYPE);
@@ -137,7 +140,7 @@ export async function exportEmailTemplatesToFile(file) {
137
140
  const filePath = getFilePath(fileName, true);
138
141
  try {
139
142
  const exportData = await exportEmailTemplates();
140
- saveJsonToFile(exportData, filePath);
143
+ saveJsonToFile(exportData, filePath, includeMeta);
141
144
  } catch (err) {
142
145
  printMessage(err, 'error');
143
146
  }
@@ -145,8 +148,9 @@ export async function exportEmailTemplatesToFile(file) {
145
148
 
146
149
  /**
147
150
  * Export all email templates to separate files
151
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
148
152
  */
149
- export async function exportEmailTemplatesToFiles() {
153
+ export async function exportEmailTemplatesToFiles(includeMeta = true) {
150
154
  let indicatorId;
151
155
  try {
152
156
  const exportData = Object.entries((await exportEmailTemplates()).emailTemplate);
@@ -156,7 +160,7 @@ export async function exportEmailTemplatesToFiles() {
156
160
  const fileData = getFileDataTemplate();
157
161
  updateProgressIndicator(indicatorId, `Exporting ${templateId}`);
158
162
  fileData.emailTemplate[templateId] = template;
159
- saveJsonToFile(fileData, getFilePath(fileName, true));
163
+ saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);
160
164
  }
161
165
  stopProgressIndicator(indicatorId, `${exportData.length} templates written.`);
162
166
  } catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"EmailTemplateOps.js","names":["frodo","fs","path","createProgressIndicator","createTable","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","getTypedFilename","saveJsonToFile","cloneDeep","wordwrap","validateImport","getFilePath","getWorkingDirectory","utils","EMAIL_TEMPLATE_TYPE","readEmailTemplates","readEmailTemplate","exportEmailTemplates","updateEmailTemplate","email","template","EMAIL_TEMPLATE_FILE_TYPE","regexEmailTemplateType","RegExp","getFileDataTemplate","meta","emailTemplate","getOneLineDescription","templateObj","description","_id","split","displayName","defaultLocale","subject","Object","values","getTableHeaderMd","markdown","getTableRowMd","templateId","replace","locales","keys","length","filter","locale","join","row","name","listEmailTemplates","long","emailTemplates","error","message","sort","a","b","localeCompare","entries","table","push","enabled","from","toString","exportEmailTemplateToFile","file","fileName","filePath","indicatorId","templateData","fileData","err","exportEmailTemplatesToFile","exportData","exportEmailTemplatesToFiles","importEmailTemplateFromFile","raw","replaceAll","data","readFileSync","JSON","parse","getTemplateIdFromFileName","emailTemplateData","s2sConvert","updateEmailTemplateError","importEmailTemplatesFromFile","id","response","basename","Error","html","convertedData","importEmailTemplatesFromFiles","names","readdirSync","jsonFiles","startsWith","endsWith","toLowerCase","map","total","totalErrors","errors","_updateEmailTemplateE","hasOwnProperty","call","importFirstEmailTemplateFromFile","_error$response","_updateEmailTemplateE2"],"sources":["../../src/ops/EmailTemplateOps.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { EmailTemplateSkeleton } from '@rockcarver/frodo-lib/types/ops/EmailTemplateOps';\nimport fs from 'fs';\nimport path from 'path';\n\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport { getTypedFilename, saveJsonToFile } from '../utils/ExportImportUtils';\nimport { cloneDeep } from './utils/OpsUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst { validateImport, getFilePath, getWorkingDirectory } = frodo.utils;\nconst {\n EMAIL_TEMPLATE_TYPE,\n readEmailTemplates,\n readEmailTemplate,\n exportEmailTemplates,\n updateEmailTemplate,\n} = frodo.email.template;\n\nconst EMAIL_TEMPLATE_FILE_TYPE = 'template.email';\n\nconst regexEmailTemplateType = new RegExp(`${EMAIL_TEMPLATE_TYPE}/`, 'g');\n\n// use a function vs a template variable to avoid problems in loops\nfunction getFileDataTemplate() {\n return {\n meta: {},\n emailTemplate: {},\n };\n}\n\n/**\n * Get a one-line description of the email template\n * @param {EmailTemplateSkeleton} templateObj email template object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n templateObj: EmailTemplateSkeleton\n): string {\n const description = `[${templateObj._id.split('/')[1]['brightCyan']}] ${\n templateObj.displayName ? templateObj.displayName : ''\n } - ${\n templateObj.defaultLocale\n ? templateObj.subject[templateObj.defaultLocale]\n : Object.values(templateObj.subject)[0]\n }`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Display Name | Locale(s) | Subject | Id |\\n';\n markdown += '| ------------ | --------- | ------- | ---|';\n return markdown;\n}\n\n/**\n * Get a table-row of the email template in markdown\n * @param {EmailTemplateSkeleton} templateObj email template object to describe\n * @returns {string} a table-row of the email template in markdown\n */\nexport function getTableRowMd(templateObj: EmailTemplateSkeleton): string {\n const templateId = templateObj._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '');\n const locales = `${templateObj.defaultLocale}${\n Object.keys(templateObj.subject).length > 1\n ? ` (${Object.keys(templateObj.subject)\n .filter((locale) => locale !== templateObj.defaultLocale)\n .join(',')})`\n : ''\n }`;\n const row = `| ${\n templateObj.name ? templateObj.name : templateId\n } | ${locales} | ${\n templateObj.subject[templateObj.defaultLocale]\n } | \\`${templateId}\\` |`;\n return row;\n}\n\n/**\n * List email templates\n * @param {boolean} long Long list format with details\n * @return {Promise<unknown[]>} a promise that resolves to an array of email template objects\n */\nexport async function listEmailTemplates(long = false): Promise<unknown[]> {\n let emailTemplates = [];\n try {\n emailTemplates = await readEmailTemplates();\n } catch (error) {\n printMessage(`Error retrieving email templates: ${error.message}`, 'error');\n }\n emailTemplates.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const [, emailTemplate] of emailTemplates.entries()) {\n printMessage(\n `${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,\n 'data'\n );\n }\n } else {\n const table = createTable([\n 'Id'['brightCyan'],\n 'Name'['brightCyan'],\n 'Status'['brightCyan'],\n 'Locale(s)'['brightCyan'],\n 'From'['brightCyan'],\n 'Subject'['brightCyan'],\n ]);\n for (const emailTemplate of emailTemplates) {\n table.push([\n // Id\n `${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,\n // Name\n `${emailTemplate.displayName ? emailTemplate.displayName : ''}`,\n // Status\n emailTemplate.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n // Locale(s)\n `${emailTemplate.defaultLocale}${\n Object.keys(emailTemplate.subject).length > 1\n ? ` (${Object.keys(emailTemplate.subject)\n .filter((locale) => locale !== emailTemplate.defaultLocale)\n .join(',')})`\n : ''\n }`,\n // From\n `${emailTemplate.from ? emailTemplate.from : ''}`,\n // Subject\n wordwrap(emailTemplate.subject[emailTemplate.defaultLocale], 40),\n ]);\n }\n printMessage(table.toString(), 'data');\n }\n return emailTemplates;\n}\n\n/**\n * Export single email template to a file\n * @param {string} templateId email template id to export\n * @param {string} file filename where to export the template data\n */\nexport async function exportEmailTemplateToFile(\n templateId: string,\n file: string\n) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);\n }\n const filePath = getFilePath(fileName, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${templateId}`\n );\n try {\n const templateData = await readEmailTemplate(templateId);\n updateProgressIndicator(indicatorId, `Writing file ${filePath}`);\n const fileData = getFileDataTemplate();\n fileData.emailTemplate[templateId] = templateData;\n saveJsonToFile(fileData, filePath);\n stopProgressIndicator(\n indicatorId,\n `Exported ${templateId['brightCyan']} to ${filePath['brightCyan']}.`\n );\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(err, 'error');\n }\n}\n\n/**\n * Export all email templates to file\n * @param {String} file optional filename\n */\nexport async function exportEmailTemplatesToFile(file) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`allEmailTemplates`, EMAIL_TEMPLATE_FILE_TYPE);\n }\n const filePath = getFilePath(fileName, true);\n try {\n const exportData = await exportEmailTemplates();\n saveJsonToFile(exportData, filePath);\n } catch (err) {\n printMessage(err, 'error');\n }\n}\n\n/**\n * Export all email templates to separate files\n */\nexport async function exportEmailTemplatesToFiles() {\n let indicatorId: string;\n try {\n const exportData = Object.entries(\n (await exportEmailTemplates()).emailTemplate\n );\n indicatorId = createProgressIndicator(\n 'determinate',\n exportData.length,\n 'Writing email templates'\n );\n for (const [templateId, template] of exportData) {\n const fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);\n const fileData = getFileDataTemplate();\n updateProgressIndicator(indicatorId, `Exporting ${templateId}`);\n fileData.emailTemplate[templateId] = template;\n saveJsonToFile(fileData, getFilePath(fileName, true));\n }\n stopProgressIndicator(\n indicatorId,\n `${exportData.length} templates written.`\n );\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(err, 'error');\n }\n}\n\n/**\n * Import email template by id from file\n * @param {string} templateId email template id\n * @param {string} file optional filename\n * @param {boolean} raw import raw data file lacking frodo export envelop\n */\nexport async function importEmailTemplateFromFile(\n templateId: string,\n file: string,\n raw = false\n) {\n templateId = templateId.replaceAll(`${EMAIL_TEMPLATE_TYPE}/`, '');\n const filePath = getFilePath(file);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Importing ${templateId}`\n );\n if (\n (fileData.emailTemplate && fileData.emailTemplate[templateId]) ||\n (raw && getTemplateIdFromFileName(file) === templateId)\n ) {\n try {\n const emailTemplateData = raw\n ? s2sConvert(fileData)\n : fileData.emailTemplate[templateId];\n await updateEmailTemplate(templateId, emailTemplateData);\n updateProgressIndicator(indicatorId, `Importing ${templateId}`);\n stopProgressIndicator(indicatorId, `Imported ${templateId}`);\n } catch (updateEmailTemplateError) {\n stopProgressIndicator(indicatorId, `${updateEmailTemplateError}`);\n printMessage(updateEmailTemplateError, 'error');\n }\n } else {\n stopProgressIndicator(\n indicatorId,\n `Email template ${templateId} not found in ${filePath}!`\n );\n printMessage(\n `Email template ${templateId} not found in ${filePath}!`,\n 'error'\n );\n }\n } catch (error) {\n printMessage(\n `Error importing email template ${templateId}: ${error}`,\n 'error'\n );\n }\n}\n\n/**\n * Import all email templates from file\n * @param {string} file optional filename\n */\nexport async function importEmailTemplatesFromFile(file: string) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n Object.keys(fileData.emailTemplate).length,\n `Importing email templates`\n );\n for (const id of Object.keys(fileData.emailTemplate)) {\n const templateId = id.replace(regexEmailTemplateType, '');\n try {\n await updateEmailTemplate(\n templateId,\n fileData.emailTemplate[templateId]\n );\n updateProgressIndicator(indicatorId, `Imported ${templateId}`);\n } catch (updateEmailTemplateError) {\n printMessage(`\\nError importing ${templateId}`, 'error');\n printMessage(updateEmailTemplateError.response.data, 'error');\n }\n }\n stopProgressIndicator(indicatorId, `Done.`);\n } catch (error) {\n printMessage(`Error importing email templates: ${error}`, 'error');\n }\n}\n\n/**\n * Helper function to get email template id from file name\n * @param {string} file file name\n * @returns {string} email template id/name\n */\nfunction getTemplateIdFromFileName(file: string) {\n debugMessage(`cli.EmailTemplateOps.getTemplateIdFromFileName: file=${file}`);\n const basename = path.basename(file);\n const keys = basename.split('-');\n if (keys[0] !== EMAIL_TEMPLATE_TYPE || keys.length <= 1)\n throw new Error(`Filename does not indicate a raw email template: ${file}`);\n const templateId = keys[1].split('.')[0];\n debugMessage(\n `cli.EmailTemplateOps.getTemplateIdFromFileName: templateId=${templateId}`\n );\n return templateId;\n}\n\n/**\n * Convert template for s2s purposes (software-to-saas migration)\n * @param {EmailTemplateSkeleton} templateData template object\n * @returns {EmailTemplateSkeleton} converted template object\n */\nfunction s2sConvert(\n templateData: EmailTemplateSkeleton\n): EmailTemplateSkeleton {\n if (templateData.message && !templateData.html) {\n const convertedData = cloneDeep(templateData);\n convertedData.html = cloneDeep(templateData.message);\n debugMessage(`cli.EmailTemplateOps.s2sConvert: templateData:`);\n debugMessage(templateData);\n debugMessage(`cli.EmailTemplateOps.s2sConvert: convertedData:`);\n debugMessage(convertedData);\n return convertedData;\n }\n return templateData;\n}\n\n/**\n * Import all email templates from separate files\n * @param {boolean} raw import raw data file lacking frodo export envelop\n */\nexport async function importEmailTemplatesFromFiles(raw = false) {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) =>\n raw\n ? name.startsWith(`${EMAIL_TEMPLATE_TYPE}-`) && name.endsWith(`.json`)\n : name.toLowerCase().endsWith(`${EMAIL_TEMPLATE_FILE_TYPE}.json`)\n )\n .map((name) => getFilePath(name));\n const indicatorId = createProgressIndicator(\n 'determinate',\n jsonFiles.length,\n 'Importing email templates...'\n );\n let total = 0;\n let totalErrors = 0;\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (\n (raw && file.startsWith('emailTemplate-')) ||\n validateImport(fileData.meta)\n ) {\n let errors = 0;\n if (raw) {\n total++;\n const templateId = getTemplateIdFromFileName(file);\n try {\n const templateData = s2sConvert(fileData);\n await updateEmailTemplate(templateId, templateData);\n } catch (updateEmailTemplateError) {\n errors += 1;\n printMessage(`\\nError importing ${templateId}`, 'error');\n printMessage(updateEmailTemplateError, 'error');\n printMessage(updateEmailTemplateError.response?.data, 'error');\n }\n } else {\n total += Object.keys(fileData.emailTemplate).length;\n for (const id in fileData.emailTemplate) {\n if ({}.hasOwnProperty.call(fileData.emailTemplate, id)) {\n const templateId = id.replace(regexEmailTemplateType, '');\n try {\n await updateEmailTemplate(\n templateId,\n fileData.emailTemplate[templateId]\n );\n } catch (updateEmailTemplateError) {\n errors += 1;\n printMessage(`\\nError importing ${templateId}`, 'error');\n printMessage(updateEmailTemplateError.response.data, 'error');\n }\n }\n }\n }\n totalErrors += errors;\n updateProgressIndicator(indicatorId, `Imported ${file}`);\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressIndicator(\n indicatorId,\n `Imported ${total - totalErrors} of ${total} email template(s) from ${\n jsonFiles.length\n } file(s).`\n );\n}\n\n/**\n * Import first email template from file\n * @param {String} file optional filename\n */\nexport async function importFirstEmailTemplateFromFile(\n file: string,\n raw = false\n) {\n let indicatorId: string;\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data);\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing first email template`\n );\n if (raw) {\n try {\n const templateId = getTemplateIdFromFileName(file);\n const templateData = s2sConvert(fileData);\n await updateEmailTemplate(templateId, templateData);\n stopProgressIndicator(indicatorId, `Imported ${templateId}`, 'success');\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing email template: ${error}`,\n 'fail'\n );\n printMessage(error.response?.data, 'error');\n }\n } else {\n for (const id of Object.keys(fileData.emailTemplate)) {\n try {\n await updateEmailTemplate(\n id.replace(regexEmailTemplateType, ''),\n fileData.emailTemplate[id]\n );\n stopProgressIndicator(indicatorId, `Imported ${id}`, 'success');\n } catch (updateEmailTemplateError) {\n stopProgressIndicator(indicatorId, `Error importing ${id}`, 'fail');\n printMessage(updateEmailTemplateError.response?.data, 'error');\n }\n break;\n }\n }\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing first email template`,\n 'fail'\n );\n printMessage(`Error importing first email template: ${error}`, 'error');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EmailTemplateOps.js","names":["frodo","fs","path","createProgressIndicator","createTable","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","cloneDeep","wordwrap","validateImport","getTypedFilename","saveJsonToFile","getFilePath","getWorkingDirectory","utils","EMAIL_TEMPLATE_TYPE","readEmailTemplates","readEmailTemplate","exportEmailTemplates","updateEmailTemplate","email","template","EMAIL_TEMPLATE_FILE_TYPE","regexEmailTemplateType","RegExp","getFileDataTemplate","meta","emailTemplate","getOneLineDescription","templateObj","description","_id","split","displayName","defaultLocale","subject","Object","values","getTableHeaderMd","markdown","getTableRowMd","templateId","replace","locales","keys","length","filter","locale","join","row","name","listEmailTemplates","long","emailTemplates","error","message","sort","a","b","localeCompare","entries","table","push","enabled","from","toString","exportEmailTemplateToFile","file","includeMeta","fileName","filePath","indicatorId","templateData","fileData","err","exportEmailTemplatesToFile","exportData","exportEmailTemplatesToFiles","importEmailTemplateFromFile","raw","replaceAll","data","readFileSync","JSON","parse","getTemplateIdFromFileName","emailTemplateData","s2sConvert","updateEmailTemplateError","importEmailTemplatesFromFile","id","response","basename","Error","html","convertedData","importEmailTemplatesFromFiles","names","readdirSync","jsonFiles","startsWith","endsWith","toLowerCase","map","total","totalErrors","errors","_updateEmailTemplateE","hasOwnProperty","call","importFirstEmailTemplateFromFile","_error$response","_updateEmailTemplateE2"],"sources":["../../src/ops/EmailTemplateOps.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { EmailTemplateSkeleton } from '@rockcarver/frodo-lib/types/ops/EmailTemplateOps';\nimport fs from 'fs';\nimport path from 'path';\n\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport { cloneDeep } from './utils/OpsUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n validateImport,\n getTypedFilename,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n EMAIL_TEMPLATE_TYPE,\n readEmailTemplates,\n readEmailTemplate,\n exportEmailTemplates,\n updateEmailTemplate,\n} = frodo.email.template;\n\nconst EMAIL_TEMPLATE_FILE_TYPE = 'template.email';\n\nconst regexEmailTemplateType = new RegExp(`${EMAIL_TEMPLATE_TYPE}/`, 'g');\n\n// use a function vs a template variable to avoid problems in loops\nfunction getFileDataTemplate() {\n return {\n meta: {},\n emailTemplate: {},\n };\n}\n\n/**\n * Get a one-line description of the email template\n * @param {EmailTemplateSkeleton} templateObj email template object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n templateObj: EmailTemplateSkeleton\n): string {\n const description = `[${templateObj._id.split('/')[1]['brightCyan']}] ${\n templateObj.displayName ? templateObj.displayName : ''\n } - ${\n templateObj.defaultLocale\n ? templateObj.subject[templateObj.defaultLocale]\n : Object.values(templateObj.subject)[0]\n }`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Display Name | Locale(s) | Subject | Id |\\n';\n markdown += '| ------------ | --------- | ------- | ---|';\n return markdown;\n}\n\n/**\n * Get a table-row of the email template in markdown\n * @param {EmailTemplateSkeleton} templateObj email template object to describe\n * @returns {string} a table-row of the email template in markdown\n */\nexport function getTableRowMd(templateObj: EmailTemplateSkeleton): string {\n const templateId = templateObj._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '');\n const locales = `${templateObj.defaultLocale}${\n Object.keys(templateObj.subject).length > 1\n ? ` (${Object.keys(templateObj.subject)\n .filter((locale) => locale !== templateObj.defaultLocale)\n .join(',')})`\n : ''\n }`;\n const row = `| ${\n templateObj.name ? templateObj.name : templateId\n } | ${locales} | ${\n templateObj.subject[templateObj.defaultLocale]\n } | \\`${templateId}\\` |`;\n return row;\n}\n\n/**\n * List email templates\n * @param {boolean} long Long list format with details\n * @return {Promise<unknown[]>} a promise that resolves to an array of email template objects\n */\nexport async function listEmailTemplates(long = false): Promise<unknown[]> {\n let emailTemplates = [];\n try {\n emailTemplates = await readEmailTemplates();\n } catch (error) {\n printMessage(`Error retrieving email templates: ${error.message}`, 'error');\n }\n emailTemplates.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const [, emailTemplate] of emailTemplates.entries()) {\n printMessage(\n `${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,\n 'data'\n );\n }\n } else {\n const table = createTable([\n 'Id'['brightCyan'],\n 'Name'['brightCyan'],\n 'Status'['brightCyan'],\n 'Locale(s)'['brightCyan'],\n 'From'['brightCyan'],\n 'Subject'['brightCyan'],\n ]);\n for (const emailTemplate of emailTemplates) {\n table.push([\n // Id\n `${emailTemplate._id.replace(`${EMAIL_TEMPLATE_TYPE}/`, '')}`,\n // Name\n `${emailTemplate.displayName ? emailTemplate.displayName : ''}`,\n // Status\n emailTemplate.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n // Locale(s)\n `${emailTemplate.defaultLocale}${\n Object.keys(emailTemplate.subject).length > 1\n ? ` (${Object.keys(emailTemplate.subject)\n .filter((locale) => locale !== emailTemplate.defaultLocale)\n .join(',')})`\n : ''\n }`,\n // From\n `${emailTemplate.from ? emailTemplate.from : ''}`,\n // Subject\n wordwrap(emailTemplate.subject[emailTemplate.defaultLocale], 40),\n ]);\n }\n printMessage(table.toString(), 'data');\n }\n return emailTemplates;\n}\n\n/**\n * Export single email template to a file\n * @param {string} templateId email template id to export\n * @param {string} file filename where to export the template data\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportEmailTemplateToFile(\n templateId: string,\n file: string,\n includeMeta = true\n) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);\n }\n const filePath = getFilePath(fileName, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${templateId}`\n );\n try {\n const templateData = await readEmailTemplate(templateId);\n updateProgressIndicator(indicatorId, `Writing file ${filePath}`);\n const fileData = getFileDataTemplate();\n fileData.emailTemplate[templateId] = templateData;\n saveJsonToFile(fileData, filePath, includeMeta);\n stopProgressIndicator(\n indicatorId,\n `Exported ${templateId['brightCyan']} to ${filePath['brightCyan']}.`\n );\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(err, 'error');\n }\n}\n\n/**\n * Export all email templates to file\n * @param {String} file optional filename\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportEmailTemplatesToFile(file, includeMeta = true) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`allEmailTemplates`, EMAIL_TEMPLATE_FILE_TYPE);\n }\n const filePath = getFilePath(fileName, true);\n try {\n const exportData = await exportEmailTemplates();\n saveJsonToFile(exportData, filePath, includeMeta);\n } catch (err) {\n printMessage(err, 'error');\n }\n}\n\n/**\n * Export all email templates to separate files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportEmailTemplatesToFiles(includeMeta = true) {\n let indicatorId;\n try {\n const exportData = Object.entries(\n (await exportEmailTemplates()).emailTemplate\n );\n indicatorId = createProgressIndicator(\n 'determinate',\n exportData.length,\n 'Writing email templates'\n );\n for (const [templateId, template] of exportData) {\n const fileName = getTypedFilename(templateId, EMAIL_TEMPLATE_FILE_TYPE);\n const fileData = getFileDataTemplate();\n updateProgressIndicator(indicatorId, `Exporting ${templateId}`);\n fileData.emailTemplate[templateId] = template;\n saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);\n }\n stopProgressIndicator(\n indicatorId,\n `${exportData.length} templates written.`\n );\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(err, 'error');\n }\n}\n\n/**\n * Import email template by id from file\n * @param {string} templateId email template id\n * @param {string} file optional filename\n * @param {boolean} raw import raw data file lacking frodo export envelop\n */\nexport async function importEmailTemplateFromFile(\n templateId: string,\n file: string,\n raw = false\n) {\n templateId = templateId.replaceAll(`${EMAIL_TEMPLATE_TYPE}/`, '');\n const filePath = getFilePath(file);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Importing ${templateId}`\n );\n if (\n (fileData.emailTemplate && fileData.emailTemplate[templateId]) ||\n (raw && getTemplateIdFromFileName(file) === templateId)\n ) {\n try {\n const emailTemplateData = raw\n ? s2sConvert(fileData)\n : fileData.emailTemplate[templateId];\n await updateEmailTemplate(templateId, emailTemplateData);\n updateProgressIndicator(indicatorId, `Importing ${templateId}`);\n stopProgressIndicator(indicatorId, `Imported ${templateId}`);\n } catch (updateEmailTemplateError) {\n stopProgressIndicator(indicatorId, `${updateEmailTemplateError}`);\n printMessage(updateEmailTemplateError, 'error');\n }\n } else {\n stopProgressIndicator(\n indicatorId,\n `Email template ${templateId} not found in ${filePath}!`\n );\n printMessage(\n `Email template ${templateId} not found in ${filePath}!`,\n 'error'\n );\n }\n } catch (error) {\n printMessage(\n `Error importing email template ${templateId}: ${error}`,\n 'error'\n );\n }\n}\n\n/**\n * Import all email templates from file\n * @param {string} file optional filename\n */\nexport async function importEmailTemplatesFromFile(file: string) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n Object.keys(fileData.emailTemplate).length,\n `Importing email templates`\n );\n for (const id of Object.keys(fileData.emailTemplate)) {\n const templateId = id.replace(regexEmailTemplateType, '');\n try {\n await updateEmailTemplate(\n templateId,\n fileData.emailTemplate[templateId]\n );\n updateProgressIndicator(indicatorId, `Imported ${templateId}`);\n } catch (updateEmailTemplateError) {\n printMessage(`\\nError importing ${templateId}`, 'error');\n printMessage(updateEmailTemplateError.response.data, 'error');\n }\n }\n stopProgressIndicator(indicatorId, `Done.`);\n } catch (error) {\n printMessage(`Error importing email templates: ${error}`, 'error');\n }\n}\n\n/**\n * Helper function to get email template id from file name\n * @param {string} file file name\n * @returns {string} email template id/name\n */\nfunction getTemplateIdFromFileName(file: string) {\n debugMessage(`cli.EmailTemplateOps.getTemplateIdFromFileName: file=${file}`);\n const basename = path.basename(file);\n const keys = basename.split('-');\n if (keys[0] !== EMAIL_TEMPLATE_TYPE || keys.length <= 1)\n throw new Error(`Filename does not indicate a raw email template: ${file}`);\n const templateId = keys[1].split('.')[0];\n debugMessage(\n `cli.EmailTemplateOps.getTemplateIdFromFileName: templateId=${templateId}`\n );\n return templateId;\n}\n\n/**\n * Convert template for s2s purposes (software-to-saas migration)\n * @param {EmailTemplateSkeleton} templateData template object\n * @returns {EmailTemplateSkeleton} converted template object\n */\nfunction s2sConvert(\n templateData: EmailTemplateSkeleton\n): EmailTemplateSkeleton {\n if (templateData.message && !templateData.html) {\n const convertedData = cloneDeep(templateData);\n convertedData.html = cloneDeep(templateData.message);\n debugMessage(`cli.EmailTemplateOps.s2sConvert: templateData:`);\n debugMessage(templateData);\n debugMessage(`cli.EmailTemplateOps.s2sConvert: convertedData:`);\n debugMessage(convertedData);\n return convertedData;\n }\n return templateData;\n}\n\n/**\n * Import all email templates from separate files\n * @param {boolean} raw import raw data file lacking frodo export envelop\n */\nexport async function importEmailTemplatesFromFiles(raw = false) {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) =>\n raw\n ? name.startsWith(`${EMAIL_TEMPLATE_TYPE}-`) && name.endsWith(`.json`)\n : name.toLowerCase().endsWith(`${EMAIL_TEMPLATE_FILE_TYPE}.json`)\n )\n .map((name) => getFilePath(name));\n const indicatorId = createProgressIndicator(\n 'determinate',\n jsonFiles.length,\n 'Importing email templates...'\n );\n let total = 0;\n let totalErrors = 0;\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (\n (raw && file.startsWith('emailTemplate-')) ||\n validateImport(fileData.meta)\n ) {\n let errors = 0;\n if (raw) {\n total++;\n const templateId = getTemplateIdFromFileName(file);\n try {\n const templateData = s2sConvert(fileData);\n await updateEmailTemplate(templateId, templateData);\n } catch (updateEmailTemplateError) {\n errors += 1;\n printMessage(`\\nError importing ${templateId}`, 'error');\n printMessage(updateEmailTemplateError, 'error');\n printMessage(updateEmailTemplateError.response?.data, 'error');\n }\n } else {\n total += Object.keys(fileData.emailTemplate).length;\n for (const id in fileData.emailTemplate) {\n if ({}.hasOwnProperty.call(fileData.emailTemplate, id)) {\n const templateId = id.replace(regexEmailTemplateType, '');\n try {\n await updateEmailTemplate(\n templateId,\n fileData.emailTemplate[templateId]\n );\n } catch (updateEmailTemplateError) {\n errors += 1;\n printMessage(`\\nError importing ${templateId}`, 'error');\n printMessage(updateEmailTemplateError.response.data, 'error');\n }\n }\n }\n }\n totalErrors += errors;\n updateProgressIndicator(indicatorId, `Imported ${file}`);\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressIndicator(\n indicatorId,\n `Imported ${total - totalErrors} of ${total} email template(s) from ${\n jsonFiles.length\n } file(s).`\n );\n}\n\n/**\n * Import first email template from file\n * @param {String} file optional filename\n */\nexport async function importFirstEmailTemplateFromFile(\n file: string,\n raw = false\n) {\n let indicatorId: string;\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data);\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing first email template`\n );\n if (raw) {\n try {\n const templateId = getTemplateIdFromFileName(file);\n const templateData = s2sConvert(fileData);\n await updateEmailTemplate(templateId, templateData);\n stopProgressIndicator(indicatorId, `Imported ${templateId}`, 'success');\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing email template: ${error}`,\n 'fail'\n );\n printMessage(error.response?.data, 'error');\n }\n } else {\n for (const id of Object.keys(fileData.emailTemplate)) {\n try {\n await updateEmailTemplate(\n id.replace(regexEmailTemplateType, ''),\n fileData.emailTemplate[id]\n );\n stopProgressIndicator(indicatorId, `Imported ${id}`, 'success');\n } catch (updateEmailTemplateError) {\n stopProgressIndicator(indicatorId, `Error importing ${id}`, 'fail');\n printMessage(updateEmailTemplateError.response?.data, 'error');\n }\n break;\n }\n }\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing first email template`,\n 'fail'\n );\n printMessage(`Error importing first email template: ${error}`, 'error');\n }\n}\n"],"mappings":"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"}
package/esm/ops/IdmOps.js CHANGED
@@ -5,14 +5,15 @@ import path from 'path';
5
5
  import propertiesReader from 'properties-reader';
6
6
  import replaceall from 'replaceall';
7
7
  import { createProgressIndicator, printMessage, stopProgressIndicator } from '../utils/Console';
8
- import { getTypedFilename, readFiles } from '../utils/ExportImportUtils';
9
8
  const {
10
9
  stringify
11
10
  } = frodo.utils.json;
12
11
  const {
13
12
  unSubstituteEnvParams,
14
13
  areScriptHooksValid,
15
- getFilePath
14
+ getFilePath,
15
+ getTypedFilename,
16
+ readFiles
16
17
  } = frodo.utils;
17
18
  const {
18
19
  testConnectorServers,
@@ -1 +1 @@
1
- {"version":3,"file":"IdmOps.js","names":["frodo","state","fs","fse","path","propertiesReader","replaceall","createProgressIndicator","printMessage","stopProgressIndicator","getTypedFilename","readFiles","stringify","utils","json","unSubstituteEnvParams","areScriptHooksValid","getFilePath","testConnectorServers","readConfigEntities","readConfigEntity","exportConfigEntities","updateConfigEntity","idm","config","queryManagedObjects","managed","warnAboutOfflineConnectorServers","all","offline","filter","status","ok","map","name","length","join","error","message","listAllConfigEntities","configurations","configEntity","_id","readConfigEntitiesError","exportConfigEntity","id","file","fileName","writeFile","err","exportAllRawConfigEntities","exportedConfigurations","value","Object","entries","outputFile","exportAllConfigEntities","entitiesFile","envFile","entriesToExport","readFile","data","entriesData","JSON","parse","envParams","undefined","entityPromises","includes","push","results","Promise","item","configEntityString","each","key","importConfigEntityByIdFromFile","entityId","validate","fileData","readFileSync","resolve","process","cwd","entityData","isValid","updateConfigEntityError","importConfigEntityFromFile","importAllRawConfigEntities","baseDirectory","getDirectory","existsSync","files","jsonFiles","toLowerCase","endsWith","content","substring","everyScriptValid","jsObject","isScriptValid","allSettled","errors","result","reason","importAllConfigEntities","entriesToImport","envReader","unsubstituted","countManagedObjects","type","response"],"sources":["../../src/ops/IdmOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport path from 'path';\nimport propertiesReader from 'properties-reader';\nimport replaceall from 'replaceall';\n\nimport {\n createProgressIndicator,\n printMessage,\n stopProgressIndicator,\n} from '../utils/Console';\nimport { getTypedFilename, readFiles } from '../utils/ExportImportUtils';\n\nconst { stringify } = frodo.utils.json;\nconst { unSubstituteEnvParams, areScriptHooksValid, getFilePath } = frodo.utils;\nconst {\n testConnectorServers,\n readConfigEntities,\n readConfigEntity,\n exportConfigEntities,\n updateConfigEntity,\n} = frodo.idm.config;\nconst { queryManagedObjects } = frodo.idm.managed;\n\n/**\n * Warn about and list offline remote connector servers\n */\nexport async function warnAboutOfflineConnectorServers() {\n try {\n const all = await testConnectorServers();\n const offline = all\n .filter((status) => !status.ok)\n .map((status) => status.name);\n if (offline.length) {\n printMessage(\n `\\nThe following connector server(s) are offline and their connectors and configuration unavailable:\\n${offline.join(\n '\\n'\n )}`,\n 'warn'\n );\n }\n } catch (error) {\n printMessage(error, 'error');\n printMessage(\n `Error getting offline connector servers: ${error.message}`,\n 'error'\n );\n }\n}\n\n/**\n * List all IDM configuration objects\n */\nexport async function listAllConfigEntities() {\n try {\n const configurations = await readConfigEntities();\n for (const configEntity of configurations) {\n printMessage(`${configEntity._id}`, 'data');\n }\n } catch (readConfigEntitiesError) {\n printMessage(readConfigEntitiesError, 'error');\n printMessage(\n `Error getting config entities: ${readConfigEntitiesError}`,\n 'error'\n );\n }\n}\n\n/**\n * Export an IDM configuration object.\n * @param {String} id the desired configuration object\n * @param {String} file optional export file\n */\nexport async function exportConfigEntity(id, file) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`${id}`, 'idm');\n }\n const configEntity = await readConfigEntity(id);\n fs.writeFile(getFilePath(fileName, true), stringify(configEntity), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${id} export to file`, 'error');\n }\n return '';\n });\n}\n\n/**\n * Export all IDM configuration objects into separate JSON files in a directory specified by <directory>\n */\nexport async function exportAllRawConfigEntities() {\n const exportedConfigurations = await exportConfigEntities();\n for (const [id, value] of Object.entries(exportedConfigurations.config)) {\n if (value != null) {\n fse.outputFile(\n getFilePath(`${id}.json`, true),\n stringify(value),\n (err) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${id} to file - ${err}`,\n 'error'\n );\n }\n }\n );\n }\n }\n}\n\n/**\n * Export all IDM configuration objects\n * @param {String} entitiesFile JSON file that specifies the config entities to export/import\n * @param {String} envFile File that defines environment specific variables for replacement during configuration export/import\n */\nexport async function exportAllConfigEntities(entitiesFile, envFile) {\n let entriesToExport = [];\n // read list of entities to export\n fs.readFile(entitiesFile, 'utf8', async (err, data) => {\n if (err) throw err;\n const entriesData = JSON.parse(data);\n entriesToExport = entriesData.idm;\n // console.log(`entriesToExport ${entriesToExport}`);\n\n // read list of configs to parameterize for environment specific values\n const envParams = propertiesReader(envFile);\n\n try {\n const configurations = await readConfigEntities();\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Exporting config objects...'\n );\n const entityPromises = [];\n for (const configEntity of configurations) {\n if (entriesToExport.includes(configEntity._id)) {\n entityPromises.push(readConfigEntity(configEntity._id));\n }\n }\n const results = await Promise.all(entityPromises);\n for (const item of results) {\n if (item != null) {\n let configEntityString = stringify(item);\n envParams.each((key, value) => {\n configEntityString = replaceall(\n value,\n `\\${${key}}`,\n configEntityString\n );\n });\n fse.outputFile(\n getFilePath(`${item._id}.json`, true),\n configEntityString,\n (error) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${item._id} to file - ${error}`,\n 'error'\n );\n }\n }\n );\n }\n }\n stopProgressIndicator(null, 'success');\n } catch (readConfigEntitiesError) {\n printMessage(readConfigEntitiesError, 'error');\n printMessage(\n `Error getting config entities: ${readConfigEntitiesError}`,\n 'error'\n );\n }\n });\n}\n\n/**\n * Import an IDM configuration object by id from file.\n * @param entityId the configuration object to import\n * @param file optional file to import\n * @param validate validate script hooks\n */\nexport async function importConfigEntityByIdFromFile(\n entityId: string,\n file?: string,\n validate?: boolean\n) {\n if (!file) {\n file = getTypedFilename(entityId, 'idm');\n }\n\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n\n const entityData = JSON.parse(fileData);\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n try {\n await updateConfigEntity(entityId, entityData);\n } catch (updateConfigEntityError) {\n printMessage(updateConfigEntityError, 'error');\n printMessage(`Error: ${updateConfigEntityError}`, 'error');\n }\n}\n\n/**\n * Import IDM configuration object from file.\n * @param file optional file to import\n * @param validate validate script hooks\n */\nexport async function importConfigEntityFromFile(\n file: string,\n validate?: boolean\n) {\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n const entityData = JSON.parse(fileData);\n const entityId = entityData._id;\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n try {\n await updateConfigEntity(entityId, entityData);\n } catch (updateConfigEntityError) {\n printMessage(updateConfigEntityError, 'error');\n printMessage(`Error: ${updateConfigEntityError}`, 'error');\n }\n}\n\n/**\n * Import all IDM configuration objects from separate JSON files in a directory specified by <directory>\n * @param validate validate script hooks\n */\nexport async function importAllRawConfigEntities(validate?: boolean) {\n const baseDirectory = state.getDirectory();\n if (!fs.existsSync(baseDirectory)) {\n return;\n }\n const files = await readFiles(baseDirectory);\n const jsonFiles = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ path, content }) => ({\n // Remove .json extension\n entityId: path.substring(0, path.length - 5),\n content,\n path,\n }));\n\n let everyScriptValid = true;\n for (const file of jsonFiles) {\n const jsObject = JSON.parse(file.content);\n const isScriptValid = areScriptHooksValid(jsObject);\n if (!isScriptValid) {\n printMessage(`Invalid script hook in ${file.path}`, 'error');\n everyScriptValid = false;\n }\n }\n\n if (validate && !everyScriptValid) {\n return;\n }\n\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Importing config objects...'\n );\n\n const entityPromises = jsonFiles.map((file) => {\n return updateConfigEntity(file.entityId, JSON.parse(file.content));\n });\n\n const results = await Promise.allSettled(entityPromises);\n const errors = results.filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected'\n );\n\n if (errors.length > 0) {\n printMessage(`Failed to import ${errors.length} config objects:`, 'error');\n for (const error of errors) {\n printMessage(`- ${error.reason}`, 'error');\n }\n stopProgressIndicator(\n `Failed to import ${errors.length} config objects`,\n 'error'\n );\n return;\n }\n\n stopProgressIndicator(`Imported ${results.length} config objects`, 'success');\n}\n\n/**\n * Import all IDM configuration objects\n * @param entitiesFile JSON file that specifies the config entities to export/import\n * @param envFile File that defines environment specific variables for replacement during configuration export/import\n * @param validate validate script hooks\n */\nexport async function importAllConfigEntities(\n entitiesFile: string,\n envFile: string,\n validate?: boolean\n) {\n const baseDirectory = state.getDirectory();\n if (!fs.existsSync(baseDirectory)) {\n return;\n }\n const entriesToImport = JSON.parse(fs.readFileSync(entitiesFile, 'utf8')).idm;\n\n const envReader = propertiesReader(envFile);\n\n const files = await readFiles(baseDirectory);\n const jsonFiles = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ content, path }) => ({\n // Remove .json extension\n entityId: path.substring(0, path.length - 5),\n content,\n path,\n }));\n\n let everyScriptValid = true;\n for (const file of jsonFiles) {\n const jsObject = JSON.parse(file.content);\n const isScriptValid = areScriptHooksValid(jsObject);\n if (!isScriptValid) {\n printMessage(`Invalid script hook in ${file.path}`, 'error');\n everyScriptValid = false;\n }\n }\n\n if (validate && !everyScriptValid) {\n return;\n }\n\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Importing config objects...'\n );\n\n const entityPromises = jsonFiles\n .filter(({ entityId }) => {\n return entriesToImport.includes(entityId);\n })\n .map(({ entityId, content }) => {\n const unsubstituted = unSubstituteEnvParams(content, envReader);\n return updateConfigEntity(entityId, JSON.parse(unsubstituted));\n });\n\n const results = await Promise.allSettled(entityPromises);\n const errors = results.filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected'\n );\n\n if (errors.length > 0) {\n printMessage(`Failed to import ${errors.length} config objects:`, 'error');\n for (const error of errors) {\n printMessage(`- ${error.reason}`, 'error');\n }\n stopProgressIndicator(\n `Failed to import ${errors.length} config objects`,\n 'error'\n );\n return;\n }\n\n stopProgressIndicator(`Imported ${results.length} config objects`, 'success');\n}\n\n/**\n * Count number of managed objects of a given type\n * @param {String} type managed object type, e.g. alpha_user\n */\nexport async function countManagedObjects(type: string) {\n try {\n const result = await queryManagedObjects(type);\n printMessage(`${type}: ${result.length}`, 'data');\n } catch (error) {\n printMessage(error.response.data, 'error');\n printMessage(`Error querying managed objects by type: ${error}`, 'error');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"IdmOps.js","names":["frodo","state","fs","fse","path","propertiesReader","replaceall","createProgressIndicator","printMessage","stopProgressIndicator","stringify","utils","json","unSubstituteEnvParams","areScriptHooksValid","getFilePath","getTypedFilename","readFiles","testConnectorServers","readConfigEntities","readConfigEntity","exportConfigEntities","updateConfigEntity","idm","config","queryManagedObjects","managed","warnAboutOfflineConnectorServers","all","offline","filter","status","ok","map","name","length","join","error","message","listAllConfigEntities","configurations","configEntity","_id","readConfigEntitiesError","exportConfigEntity","id","file","fileName","writeFile","err","exportAllRawConfigEntities","exportedConfigurations","value","Object","entries","outputFile","exportAllConfigEntities","entitiesFile","envFile","entriesToExport","readFile","data","entriesData","JSON","parse","envParams","undefined","entityPromises","includes","push","results","Promise","item","configEntityString","each","key","importConfigEntityByIdFromFile","entityId","validate","fileData","readFileSync","resolve","process","cwd","entityData","isValid","updateConfigEntityError","importConfigEntityFromFile","importAllRawConfigEntities","baseDirectory","getDirectory","existsSync","files","jsonFiles","toLowerCase","endsWith","content","substring","everyScriptValid","jsObject","isScriptValid","allSettled","errors","result","reason","importAllConfigEntities","entriesToImport","envReader","unsubstituted","countManagedObjects","type","response"],"sources":["../../src/ops/IdmOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport path from 'path';\nimport propertiesReader from 'properties-reader';\nimport replaceall from 'replaceall';\n\nimport {\n createProgressIndicator,\n printMessage,\n stopProgressIndicator,\n} from '../utils/Console';\n\nconst { stringify } = frodo.utils.json;\n\nconst {\n unSubstituteEnvParams,\n areScriptHooksValid,\n getFilePath,\n getTypedFilename,\n readFiles,\n} = frodo.utils;\nconst {\n testConnectorServers,\n readConfigEntities,\n readConfigEntity,\n exportConfigEntities,\n updateConfigEntity,\n} = frodo.idm.config;\nconst { queryManagedObjects } = frodo.idm.managed;\n\n/**\n * Warn about and list offline remote connector servers\n */\nexport async function warnAboutOfflineConnectorServers() {\n try {\n const all = await testConnectorServers();\n const offline = all\n .filter((status) => !status.ok)\n .map((status) => status.name);\n if (offline.length) {\n printMessage(\n `\\nThe following connector server(s) are offline and their connectors and configuration unavailable:\\n${offline.join(\n '\\n'\n )}`,\n 'warn'\n );\n }\n } catch (error) {\n printMessage(error, 'error');\n printMessage(\n `Error getting offline connector servers: ${error.message}`,\n 'error'\n );\n }\n}\n\n/**\n * List all IDM configuration objects\n */\nexport async function listAllConfigEntities() {\n try {\n const configurations = await readConfigEntities();\n for (const configEntity of configurations) {\n printMessage(`${configEntity._id}`, 'data');\n }\n } catch (readConfigEntitiesError) {\n printMessage(readConfigEntitiesError, 'error');\n printMessage(\n `Error getting config entities: ${readConfigEntitiesError}`,\n 'error'\n );\n }\n}\n\n/**\n * Export an IDM configuration object.\n * @param {String} id the desired configuration object\n * @param {String} file optional export file\n */\nexport async function exportConfigEntity(id, file) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`${id}`, 'idm');\n }\n const configEntity = await readConfigEntity(id);\n fs.writeFile(getFilePath(fileName, true), stringify(configEntity), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${id} export to file`, 'error');\n }\n return '';\n });\n}\n\n/**\n * Export all IDM configuration objects into separate JSON files in a directory specified by <directory>\n */\nexport async function exportAllRawConfigEntities() {\n const exportedConfigurations = await exportConfigEntities();\n for (const [id, value] of Object.entries(exportedConfigurations.config)) {\n if (value != null) {\n fse.outputFile(\n getFilePath(`${id}.json`, true),\n stringify(value),\n (err) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${id} to file - ${err}`,\n 'error'\n );\n }\n }\n );\n }\n }\n}\n\n/**\n * Export all IDM configuration objects\n * @param {String} entitiesFile JSON file that specifies the config entities to export/import\n * @param {String} envFile File that defines environment specific variables for replacement during configuration export/import\n */\nexport async function exportAllConfigEntities(entitiesFile, envFile) {\n let entriesToExport = [];\n // read list of entities to export\n fs.readFile(entitiesFile, 'utf8', async (err, data) => {\n if (err) throw err;\n const entriesData = JSON.parse(data);\n entriesToExport = entriesData.idm;\n // console.log(`entriesToExport ${entriesToExport}`);\n\n // read list of configs to parameterize for environment specific values\n const envParams = propertiesReader(envFile);\n\n try {\n const configurations = await readConfigEntities();\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Exporting config objects...'\n );\n const entityPromises = [];\n for (const configEntity of configurations) {\n if (entriesToExport.includes(configEntity._id)) {\n entityPromises.push(readConfigEntity(configEntity._id));\n }\n }\n const results = await Promise.all(entityPromises);\n for (const item of results) {\n if (item != null) {\n let configEntityString = stringify(item);\n envParams.each((key, value) => {\n configEntityString = replaceall(\n value,\n `\\${${key}}`,\n configEntityString\n );\n });\n fse.outputFile(\n getFilePath(`${item._id}.json`, true),\n configEntityString,\n (error) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${item._id} to file - ${error}`,\n 'error'\n );\n }\n }\n );\n }\n }\n stopProgressIndicator(null, 'success');\n } catch (readConfigEntitiesError) {\n printMessage(readConfigEntitiesError, 'error');\n printMessage(\n `Error getting config entities: ${readConfigEntitiesError}`,\n 'error'\n );\n }\n });\n}\n\n/**\n * Import an IDM configuration object by id from file.\n * @param entityId the configuration object to import\n * @param file optional file to import\n * @param validate validate script hooks\n */\nexport async function importConfigEntityByIdFromFile(\n entityId: string,\n file?: string,\n validate?: boolean\n) {\n if (!file) {\n file = getTypedFilename(entityId, 'idm');\n }\n\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n\n const entityData = JSON.parse(fileData);\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n try {\n await updateConfigEntity(entityId, entityData);\n } catch (updateConfigEntityError) {\n printMessage(updateConfigEntityError, 'error');\n printMessage(`Error: ${updateConfigEntityError}`, 'error');\n }\n}\n\n/**\n * Import IDM configuration object from file.\n * @param file optional file to import\n * @param validate validate script hooks\n */\nexport async function importConfigEntityFromFile(\n file: string,\n validate?: boolean\n) {\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n const entityData = JSON.parse(fileData);\n const entityId = entityData._id;\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n try {\n await updateConfigEntity(entityId, entityData);\n } catch (updateConfigEntityError) {\n printMessage(updateConfigEntityError, 'error');\n printMessage(`Error: ${updateConfigEntityError}`, 'error');\n }\n}\n\n/**\n * Import all IDM configuration objects from separate JSON files in a directory specified by <directory>\n * @param validate validate script hooks\n */\nexport async function importAllRawConfigEntities(validate?: boolean) {\n const baseDirectory = state.getDirectory();\n if (!fs.existsSync(baseDirectory)) {\n return;\n }\n const files = await readFiles(baseDirectory);\n const jsonFiles = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ path, content }) => ({\n // Remove .json extension\n entityId: path.substring(0, path.length - 5),\n content,\n path,\n }));\n\n let everyScriptValid = true;\n for (const file of jsonFiles) {\n const jsObject = JSON.parse(file.content);\n const isScriptValid = areScriptHooksValid(jsObject);\n if (!isScriptValid) {\n printMessage(`Invalid script hook in ${file.path}`, 'error');\n everyScriptValid = false;\n }\n }\n\n if (validate && !everyScriptValid) {\n return;\n }\n\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Importing config objects...'\n );\n\n const entityPromises = jsonFiles.map((file) => {\n return updateConfigEntity(file.entityId, JSON.parse(file.content));\n });\n\n const results = await Promise.allSettled(entityPromises);\n const errors = results.filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected'\n );\n\n if (errors.length > 0) {\n printMessage(`Failed to import ${errors.length} config objects:`, 'error');\n for (const error of errors) {\n printMessage(`- ${error.reason}`, 'error');\n }\n stopProgressIndicator(\n `Failed to import ${errors.length} config objects`,\n 'error'\n );\n return;\n }\n\n stopProgressIndicator(`Imported ${results.length} config objects`, 'success');\n}\n\n/**\n * Import all IDM configuration objects\n * @param entitiesFile JSON file that specifies the config entities to export/import\n * @param envFile File that defines environment specific variables for replacement during configuration export/import\n * @param validate validate script hooks\n */\nexport async function importAllConfigEntities(\n entitiesFile: string,\n envFile: string,\n validate?: boolean\n) {\n const baseDirectory = state.getDirectory();\n if (!fs.existsSync(baseDirectory)) {\n return;\n }\n const entriesToImport = JSON.parse(fs.readFileSync(entitiesFile, 'utf8')).idm;\n\n const envReader = propertiesReader(envFile);\n\n const files = await readFiles(baseDirectory);\n const jsonFiles = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ content, path }) => ({\n // Remove .json extension\n entityId: path.substring(0, path.length - 5),\n content,\n path,\n }));\n\n let everyScriptValid = true;\n for (const file of jsonFiles) {\n const jsObject = JSON.parse(file.content);\n const isScriptValid = areScriptHooksValid(jsObject);\n if (!isScriptValid) {\n printMessage(`Invalid script hook in ${file.path}`, 'error');\n everyScriptValid = false;\n }\n }\n\n if (validate && !everyScriptValid) {\n return;\n }\n\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Importing config objects...'\n );\n\n const entityPromises = jsonFiles\n .filter(({ entityId }) => {\n return entriesToImport.includes(entityId);\n })\n .map(({ entityId, content }) => {\n const unsubstituted = unSubstituteEnvParams(content, envReader);\n return updateConfigEntity(entityId, JSON.parse(unsubstituted));\n });\n\n const results = await Promise.allSettled(entityPromises);\n const errors = results.filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected'\n );\n\n if (errors.length > 0) {\n printMessage(`Failed to import ${errors.length} config objects:`, 'error');\n for (const error of errors) {\n printMessage(`- ${error.reason}`, 'error');\n }\n stopProgressIndicator(\n `Failed to import ${errors.length} config objects`,\n 'error'\n );\n return;\n }\n\n stopProgressIndicator(`Imported ${results.length} config objects`, 'success');\n}\n\n/**\n * Count number of managed objects of a given type\n * @param {String} type managed object type, e.g. alpha_user\n */\nexport async function countManagedObjects(type: string) {\n try {\n const result = await queryManagedObjects(type);\n printMessage(`${type}: ${result.length}`, 'data');\n } catch (error) {\n printMessage(error.response.data, 'error');\n printMessage(`Error querying managed objects by type: ${error}`, 'error');\n }\n}\n"],"mappings":"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"}
package/esm/ops/IdpOps.js CHANGED
@@ -1,7 +1,11 @@
1
1
  import { frodo } from '@rockcarver/frodo-lib';
2
2
  import fs from 'fs';
3
3
  import { createProgressIndicator, debugMessage, printMessage, stopProgressIndicator, updateProgressIndicator } from '../utils/Console';
4
- import { getRealmString, getTypedFilename, saveJsonToFile } from '../utils/ExportImportUtils';
4
+ const {
5
+ getRealmString,
6
+ getTypedFilename,
7
+ saveJsonToFile
8
+ } = frodo.utils;
5
9
  const {
6
10
  readSocialIdentityProviders,
7
11
  exportSocialIdentityProvider,
@@ -66,8 +70,9 @@ export async function listSocialProviders() {
66
70
  * Export provider by id
67
71
  * @param {string} providerId provider id/name
68
72
  * @param {string} file optional export file name
73
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
69
74
  */
70
- export async function exportSocialIdentityProviderToFile(providerId, file = '') {
75
+ export async function exportSocialIdentityProviderToFile(providerId, file = '', includeMeta = true) {
71
76
  debugMessage(`cli.IdpOps.exportSocialIdentityProviderToFile: start`);
72
77
  let fileName = file;
73
78
  if (!fileName) {
@@ -78,7 +83,7 @@ export async function exportSocialIdentityProviderToFile(providerId, file = '')
78
83
  try {
79
84
  updateProgressIndicator(indicatorId, `Writing file ${filePath}`);
80
85
  const fileData = await exportSocialIdentityProvider(providerId);
81
- saveJsonToFile(fileData, filePath);
86
+ saveJsonToFile(fileData, filePath, includeMeta);
82
87
  stopProgressIndicator(indicatorId, `Exported ${providerId['brightCyan']} to ${filePath['brightCyan']}.`);
83
88
  } catch (err) {
84
89
  stopProgressIndicator(indicatorId, `${err}`);
@@ -90,20 +95,22 @@ export async function exportSocialIdentityProviderToFile(providerId, file = '')
90
95
  /**
91
96
  * Export all providers
92
97
  * @param {string} file optional export file name
98
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
93
99
  */
94
- export async function exportSocialIdentityProvidersToFile(file = '') {
100
+ export async function exportSocialIdentityProvidersToFile(file = '', includeMeta = true) {
95
101
  let fileName = file;
96
102
  if (!fileName) {
97
103
  fileName = getTypedFilename(`all${getRealmString()}Providers`, 'idp');
98
104
  }
99
105
  const fileData = await exportSocialIdentityProviders();
100
- saveJsonToFile(fileData, getFilePath(fileName, true));
106
+ saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);
101
107
  }
102
108
 
103
109
  /**
104
110
  * Export all providers to individual files
111
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
105
112
  */
106
- export async function exportSocialIdentityProvidersToFiles() {
113
+ export async function exportSocialIdentityProvidersToFiles(includeMeta = true) {
107
114
  debugMessage(`cli.IdpOps.exportSocialIdentityProvidersToFiles: start`);
108
115
  let indicatorId;
109
116
  try {
@@ -113,7 +120,7 @@ export async function exportSocialIdentityProvidersToFiles() {
113
120
  try {
114
121
  const fileName = getTypedFilename(idpData._id, 'idp');
115
122
  const fileData = await exportSocialIdentityProvider(idpData._id);
116
- saveJsonToFile(fileData, getFilePath(fileName, true));
123
+ saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);
117
124
  updateProgressIndicator(indicatorId, `Exported provider ${idpData._id}`);
118
125
  } catch (error) {
119
126
  printMessage(`Error exporting ${idpData._id}: ${error}`, 'error');
@@ -1 +1 @@
1
- {"version":3,"file":"IdpOps.js","names":["frodo","fs","createProgressIndicator","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","getRealmString","getTypedFilename","saveJsonToFile","readSocialIdentityProviders","exportSocialIdentityProvider","exportSocialIdentityProviders","importFirstSocialIdentityProvider","importSocialIdentityProvider","importSocialIdentityProviders","oauth2oidc","external","getFilePath","getWorkingDirectory","utils","getOneLineDescription","socialIdpObj","description","_id","_type","getTableHeaderMd","markdown","getTableRowMd","row","enabled","name","listSocialProviders","providers","sort","a","b","localeCompare","forEach","socialIdentityProvider","err","message","exportSocialIdentityProviderToFile","providerId","file","fileName","filePath","indicatorId","fileData","exportSocialIdentityProvidersToFile","exportSocialIdentityProvidersToFiles","allIdpsData","length","idpData","error","importSocialIdentityProviderFromFile","outcome","data","readFileSync","JSON","parse","_error$response","response","importFirstSocialIdentityProviderFromFile","_error$response2","importSocialIdentityProvidersFromFile","_error$response3","importSocialIdentityProvidersFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","map","total","count","Object","keys","idp"],"sources":["../../src/ops/IdpOps.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { SocialIdpSkeleton } from '@rockcarver/frodo-lib/types/api/SocialIdentityProvidersApi';\nimport fs from 'fs';\n\nimport {\n createProgressIndicator,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport {\n getRealmString,\n getTypedFilename,\n saveJsonToFile,\n} from '../utils/ExportImportUtils';\n\nconst {\n readSocialIdentityProviders,\n exportSocialIdentityProvider,\n exportSocialIdentityProviders,\n importFirstSocialIdentityProvider,\n importSocialIdentityProvider,\n importSocialIdentityProviders,\n} = frodo.oauth2oidc.external;\n\nconst { getFilePath, getWorkingDirectory } = frodo.utils;\n\n/**\n * Get a one-line description of the social idp object\n * @param {SocialIdpSkeleton} socialIdpObj social idp object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(socialIdpObj: SocialIdpSkeleton): string {\n const description = `[${socialIdpObj._id['brightCyan']}] ${socialIdpObj._type._id}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Name/Id | Status | Type |\\n';\n markdown += '| ------- | ------ | ---- |';\n return markdown;\n}\n\n/**\n * Get a table-row of the social idp in markdown\n * @param {SocialIdpSkeleton} socialIdpObj social idp object to describe\n * @returns {string} a table-row of the social idp in markdown\n */\nexport function getTableRowMd(socialIdpObj: SocialIdpSkeleton): string {\n const row = `| ${socialIdpObj._id} | ${\n socialIdpObj.enabled === false\n ? ':o: `disabled`'\n : ':white_check_mark: `enabled`'\n } | ${socialIdpObj._type.name} |`;\n return row;\n}\n\n/**\n * List providers\n */\nexport async function listSocialProviders() {\n try {\n const providers = await readSocialIdentityProviders();\n providers.sort((a, b) => a._id.localeCompare(b._id));\n providers.forEach((socialIdentityProvider) => {\n printMessage(`${socialIdentityProvider._id}`, 'data');\n });\n } catch (err) {\n printMessage(`listSocialProviders ERROR: ${err.message}`, 'error');\n printMessage(err, 'error');\n }\n}\n\n/**\n * Export provider by id\n * @param {string} providerId provider id/name\n * @param {string} file optional export file name\n */\nexport async function exportSocialIdentityProviderToFile(\n providerId: string,\n file = ''\n) {\n debugMessage(`cli.IdpOps.exportSocialIdentityProviderToFile: start`);\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(providerId, 'idp');\n }\n const filePath = getFilePath(fileName, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${providerId}`\n );\n try {\n updateProgressIndicator(indicatorId, `Writing file ${filePath}`);\n const fileData = await exportSocialIdentityProvider(providerId);\n saveJsonToFile(fileData, filePath);\n stopProgressIndicator(\n indicatorId,\n `Exported ${providerId['brightCyan']} to ${filePath['brightCyan']}.`\n );\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(`${err}`, 'error');\n }\n debugMessage(`cli.IdpOps.exportSocialIdentityProviderToFile: end`);\n}\n\n/**\n * Export all providers\n * @param {string} file optional export file name\n */\nexport async function exportSocialIdentityProvidersToFile(file = '') {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Providers`, 'idp');\n }\n const fileData = await exportSocialIdentityProviders();\n saveJsonToFile(fileData, getFilePath(fileName, true));\n}\n\n/**\n * Export all providers to individual files\n */\nexport async function exportSocialIdentityProvidersToFiles() {\n debugMessage(`cli.IdpOps.exportSocialIdentityProvidersToFiles: start`);\n let indicatorId: string;\n try {\n const allIdpsData = await readSocialIdentityProviders();\n indicatorId = createProgressIndicator(\n 'determinate',\n allIdpsData.length,\n 'Exporting providers'\n );\n for (const idpData of allIdpsData) {\n try {\n const fileName = getTypedFilename(idpData._id, 'idp');\n const fileData = await exportSocialIdentityProvider(idpData._id);\n saveJsonToFile(fileData, getFilePath(fileName, true));\n updateProgressIndicator(\n indicatorId,\n `Exported provider ${idpData._id}`\n );\n } catch (error) {\n printMessage(`Error exporting ${idpData._id}: ${error}`, 'error');\n }\n }\n stopProgressIndicator(\n indicatorId,\n `${allIdpsData.length} providers exported.`\n );\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error}`);\n printMessage(`${error}`, 'error');\n }\n debugMessage(`cli.IdpOps.exportSocialIdentityProvidersToFiles: end`);\n}\n\n/**\n * Import provider by id/name\n * @param {string} providerId provider id/name\n * @param {string} file import file name\n * @returns {Promise<boolean>} true if provider was imported successfully, false otherwise\n */\nexport async function importSocialIdentityProviderFromFile(\n providerId: string,\n file: string\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing provider ${providerId} from ${filePath}...`\n );\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n await importSocialIdentityProvider(providerId, fileData);\n outcome = true;\n stopProgressIndicator(\n indicatorId,\n `Successfully imported provider ${providerId} from ${filePath}.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing provider ${providerId} from ${filePath}.`,\n 'fail'\n );\n printMessage(error.response?.data || error, 'error');\n }\n return outcome;\n}\n\n/**\n * Import first provider from file\n * @param {String} file import file name\n * @returns {Promise<boolean>} true if first provider was imported successfully, false otherwise\n */\nexport async function importFirstSocialIdentityProviderFromFile(\n file: string\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing first provider from ${filePath}...`\n );\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n await importFirstSocialIdentityProvider(fileData);\n outcome = true;\n stopProgressIndicator(\n indicatorId,\n `Successfully imported first provider from ${filePath}.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing first provider from ${filePath}.`,\n 'fail'\n );\n printMessage(error.response?.data || error, 'error');\n }\n return outcome;\n}\n\n/**\n * Import all providers from file\n * @param {string} file import file name\n * @returns {Promise<boolean>} true if all providers were imported successfully, false otherwise\n */\nexport async function importSocialIdentityProvidersFromFile(\n file: string\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing providers from ${filePath}...`\n );\n const data = fs.readFileSync(filePath, 'utf8');\n try {\n const fileData = JSON.parse(data);\n await importSocialIdentityProviders(fileData);\n outcome = true;\n stopProgressIndicator(\n indicatorId,\n `Successfully imported providers from ${filePath}.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing providers from ${filePath}.`,\n 'fail'\n );\n printMessage(error.response?.data || error, 'error');\n }\n return outcome;\n}\n\n/**\n * Import providers from *.idp.json files in current working directory\n */\nexport async function importSocialIdentityProvidersFromFiles() {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.idp.json'))\n .map((name) => getFilePath(name));\n\n const indicatorId = createProgressIndicator(\n 'determinate',\n jsonFiles.length,\n 'Importing providers...'\n );\n let total = 0;\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n const count = Object.keys(fileData.idp).length;\n total += count;\n await importSocialIdentityProviders(fileData);\n updateProgressIndicator(\n indicatorId,\n `Imported ${count} provider(s) from ${file}`\n );\n }\n stopProgressIndicator(\n indicatorId,\n `Finished importing ${total} provider(s) from ${jsonFiles.length} file(s).`\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"IdpOps.js","names":["frodo","fs","createProgressIndicator","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","getRealmString","getTypedFilename","saveJsonToFile","utils","readSocialIdentityProviders","exportSocialIdentityProvider","exportSocialIdentityProviders","importFirstSocialIdentityProvider","importSocialIdentityProvider","importSocialIdentityProviders","oauth2oidc","external","getFilePath","getWorkingDirectory","getOneLineDescription","socialIdpObj","description","_id","_type","getTableHeaderMd","markdown","getTableRowMd","row","enabled","name","listSocialProviders","providers","sort","a","b","localeCompare","forEach","socialIdentityProvider","err","message","exportSocialIdentityProviderToFile","providerId","file","includeMeta","fileName","filePath","indicatorId","fileData","exportSocialIdentityProvidersToFile","exportSocialIdentityProvidersToFiles","allIdpsData","length","idpData","error","importSocialIdentityProviderFromFile","outcome","data","readFileSync","JSON","parse","_error$response","response","importFirstSocialIdentityProviderFromFile","_error$response2","importSocialIdentityProvidersFromFile","_error$response3","importSocialIdentityProvidersFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","map","total","count","Object","keys","idp"],"sources":["../../src/ops/IdpOps.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { SocialIdpSkeleton } from '@rockcarver/frodo-lib/types/api/SocialIdentityProvidersApi';\nimport fs from 'fs';\n\nimport {\n createProgressIndicator,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\n\nconst { getRealmString, getTypedFilename, saveJsonToFile } = frodo.utils;\nconst {\n readSocialIdentityProviders,\n exportSocialIdentityProvider,\n exportSocialIdentityProviders,\n importFirstSocialIdentityProvider,\n importSocialIdentityProvider,\n importSocialIdentityProviders,\n} = frodo.oauth2oidc.external;\n\nconst { getFilePath, getWorkingDirectory } = frodo.utils;\n\n/**\n * Get a one-line description of the social idp object\n * @param {SocialIdpSkeleton} socialIdpObj social idp object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(socialIdpObj: SocialIdpSkeleton): string {\n const description = `[${socialIdpObj._id['brightCyan']}] ${socialIdpObj._type._id}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Name/Id | Status | Type |\\n';\n markdown += '| ------- | ------ | ---- |';\n return markdown;\n}\n\n/**\n * Get a table-row of the social idp in markdown\n * @param {SocialIdpSkeleton} socialIdpObj social idp object to describe\n * @returns {string} a table-row of the social idp in markdown\n */\nexport function getTableRowMd(socialIdpObj: SocialIdpSkeleton): string {\n const row = `| ${socialIdpObj._id} | ${\n socialIdpObj.enabled === false\n ? ':o: `disabled`'\n : ':white_check_mark: `enabled`'\n } | ${socialIdpObj._type.name} |`;\n return row;\n}\n\n/**\n * List providers\n */\nexport async function listSocialProviders() {\n try {\n const providers = await readSocialIdentityProviders();\n providers.sort((a, b) => a._id.localeCompare(b._id));\n providers.forEach((socialIdentityProvider) => {\n printMessage(`${socialIdentityProvider._id}`, 'data');\n });\n } catch (err) {\n printMessage(`listSocialProviders ERROR: ${err.message}`, 'error');\n printMessage(err, 'error');\n }\n}\n\n/**\n * Export provider by id\n * @param {string} providerId provider id/name\n * @param {string} file optional export file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportSocialIdentityProviderToFile(\n providerId: string,\n file = '',\n includeMeta = true\n) {\n debugMessage(`cli.IdpOps.exportSocialIdentityProviderToFile: start`);\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(providerId, 'idp');\n }\n const filePath = getFilePath(fileName, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${providerId}`\n );\n try {\n updateProgressIndicator(indicatorId, `Writing file ${filePath}`);\n const fileData = await exportSocialIdentityProvider(providerId);\n saveJsonToFile(fileData, filePath, includeMeta);\n stopProgressIndicator(\n indicatorId,\n `Exported ${providerId['brightCyan']} to ${filePath['brightCyan']}.`\n );\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(`${err}`, 'error');\n }\n debugMessage(`cli.IdpOps.exportSocialIdentityProviderToFile: end`);\n}\n\n/**\n * Export all providers\n * @param {string} file optional export file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportSocialIdentityProvidersToFile(\n file = '',\n includeMeta = true\n) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Providers`, 'idp');\n }\n const fileData = await exportSocialIdentityProviders();\n saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);\n}\n\n/**\n * Export all providers to individual files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportSocialIdentityProvidersToFiles(includeMeta = true) {\n debugMessage(`cli.IdpOps.exportSocialIdentityProvidersToFiles: start`);\n let indicatorId: string;\n try {\n const allIdpsData = await readSocialIdentityProviders();\n indicatorId = createProgressIndicator(\n 'determinate',\n allIdpsData.length,\n 'Exporting providers'\n );\n for (const idpData of allIdpsData) {\n try {\n const fileName = getTypedFilename(idpData._id, 'idp');\n const fileData = await exportSocialIdentityProvider(idpData._id);\n saveJsonToFile(fileData, getFilePath(fileName, true), includeMeta);\n updateProgressIndicator(\n indicatorId,\n `Exported provider ${idpData._id}`\n );\n } catch (error) {\n printMessage(`Error exporting ${idpData._id}: ${error}`, 'error');\n }\n }\n stopProgressIndicator(\n indicatorId,\n `${allIdpsData.length} providers exported.`\n );\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error}`);\n printMessage(`${error}`, 'error');\n }\n debugMessage(`cli.IdpOps.exportSocialIdentityProvidersToFiles: end`);\n}\n\n/**\n * Import provider by id/name\n * @param {string} providerId provider id/name\n * @param {string} file import file name\n * @returns {Promise<boolean>} true if provider was imported successfully, false otherwise\n */\nexport async function importSocialIdentityProviderFromFile(\n providerId: string,\n file: string\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing provider ${providerId} from ${filePath}...`\n );\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n await importSocialIdentityProvider(providerId, fileData);\n outcome = true;\n stopProgressIndicator(\n indicatorId,\n `Successfully imported provider ${providerId} from ${filePath}.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing provider ${providerId} from ${filePath}.`,\n 'fail'\n );\n printMessage(error.response?.data || error, 'error');\n }\n return outcome;\n}\n\n/**\n * Import first provider from file\n * @param {String} file import file name\n * @returns {Promise<boolean>} true if first provider was imported successfully, false otherwise\n */\nexport async function importFirstSocialIdentityProviderFromFile(\n file: string\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing first provider from ${filePath}...`\n );\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n await importFirstSocialIdentityProvider(fileData);\n outcome = true;\n stopProgressIndicator(\n indicatorId,\n `Successfully imported first provider from ${filePath}.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing first provider from ${filePath}.`,\n 'fail'\n );\n printMessage(error.response?.data || error, 'error');\n }\n return outcome;\n}\n\n/**\n * Import all providers from file\n * @param {string} file import file name\n * @returns {Promise<boolean>} true if all providers were imported successfully, false otherwise\n */\nexport async function importSocialIdentityProvidersFromFile(\n file: string\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing providers from ${filePath}...`\n );\n const data = fs.readFileSync(filePath, 'utf8');\n try {\n const fileData = JSON.parse(data);\n await importSocialIdentityProviders(fileData);\n outcome = true;\n stopProgressIndicator(\n indicatorId,\n `Successfully imported providers from ${filePath}.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing providers from ${filePath}.`,\n 'fail'\n );\n printMessage(error.response?.data || error, 'error');\n }\n return outcome;\n}\n\n/**\n * Import providers from *.idp.json files in current working directory\n */\nexport async function importSocialIdentityProvidersFromFiles() {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.idp.json'))\n .map((name) => getFilePath(name));\n\n const indicatorId = createProgressIndicator(\n 'determinate',\n jsonFiles.length,\n 'Importing providers...'\n );\n let total = 0;\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n const count = Object.keys(fileData.idp).length;\n total += count;\n await importSocialIdentityProviders(fileData);\n updateProgressIndicator(\n indicatorId,\n `Imported ${count} provider(s) from ${file}`\n );\n }\n stopProgressIndicator(\n indicatorId,\n `Finished importing ${total} provider(s) from ${jsonFiles.length} file(s).`\n );\n}\n"],"mappings":"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"}
@@ -89,9 +89,13 @@ export async function listJourneys(long = false, analyze = false) {
89
89
  * Export journey by id/name to file
90
90
  * @param {string} journeyId journey id/name
91
91
  * @param {string} file optional export file name
92
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
92
93
  * @param {TreeExportOptions} options export options
93
94
  */
94
- export async function exportJourneyToFile(journeyId, file, options) {
95
+ export async function exportJourneyToFile(journeyId, file, includeMeta = true, options = {
96
+ deps: false,
97
+ useStringArrays: false
98
+ }) {
95
99
  debugMessage(`exportJourneyToFile: start`);
96
100
  const verbose = state.getVerbose();
97
101
  if (!file) {
@@ -103,7 +107,7 @@ export async function exportJourneyToFile(journeyId, file, options) {
103
107
  try {
104
108
  const fileData = await exportJourney(journeyId, options);
105
109
  if (verbose) spinnerId = createProgressIndicator('indeterminate', 0, `${journeyId}`);
106
- saveJsonToFile(fileData, filePath);
110
+ saveJsonToFile(fileData, filePath, includeMeta);
107
111
  stopProgressIndicator(spinnerId, `Exported ${journeyId['brightCyan']} to ${filePath['brightCyan']}.`, 'success');
108
112
  } catch (error) {
109
113
  if (verbose) spinnerId = createProgressIndicator('indeterminate', 0, `${journeyId}`);
@@ -114,9 +118,10 @@ export async function exportJourneyToFile(journeyId, file, options) {
114
118
  /**
115
119
  * Export all journeys to file
116
120
  * @param {string} file optional export file name
121
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
117
122
  * @param {TreeExportOptions} options export options
118
123
  */
119
- export async function exportJourneysToFile(file, options = {
124
+ export async function exportJourneysToFile(file, includeMeta = true, options = {
120
125
  deps: false,
121
126
  useStringArrays: false
122
127
  }) {
@@ -125,14 +130,18 @@ export async function exportJourneysToFile(file, options = {
125
130
  }
126
131
  const filePath = getFilePath(file, true);
127
132
  const fileData = await exportJourneys(options);
128
- saveJsonToFile(fileData, filePath);
133
+ saveJsonToFile(fileData, filePath, includeMeta);
129
134
  }
130
135
 
131
136
  /**
132
137
  * Export all journeys to separate files
138
+ * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
133
139
  * @param {TreeExportOptions} options export options
134
140
  */
135
- export async function exportJourneysToFiles(options) {
141
+ export async function exportJourneysToFiles(includeMeta = true, options = {
142
+ deps: false,
143
+ useStringArrays: false
144
+ }) {
136
145
  const journeysExport = await exportJourneys(options);
137
146
  const trees = Object.entries(journeysExport.trees);
138
147
  for (const [treeId, treeValue] of trees) {
@@ -141,7 +150,7 @@ export async function exportJourneysToFiles(options) {
141
150
  treeValue['meta'] = journeysExport.meta;
142
151
  try {
143
152
  updateProgressIndicator(indicatorId, `Saving ${treeId} to ${file}`);
144
- saveJsonToFile(treeValue, file);
153
+ saveJsonToFile(treeValue, file, includeMeta);
145
154
  stopProgressIndicator(indicatorId, `${treeId} saved to ${file}`);
146
155
  } catch (error) {
147
156
  stopProgressIndicator(indicatorId, `Error saving ${treeId} to ${file}`);