@rockcarver/frodo-cli 2.0.0-40 → 2.0.0-42

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 (44) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/esm/cli/admin/admin-execute-rfc7523-authz-grant-flow.js.map +1 -1
  3. package/esm/cli/admin/admin-generate-rfc7523-authz-grant-artefacts.js.map +1 -1
  4. package/esm/cli/app/app-delete.js.map +1 -1
  5. package/esm/cli/app/app-describe.js.map +1 -1
  6. package/esm/cli/app/app-export.js.map +1 -1
  7. package/esm/cli/app/app-import.js.map +1 -1
  8. package/esm/cli/app/app-list.js.map +1 -1
  9. package/esm/cli/app/app.js.map +1 -1
  10. package/esm/cli/config/config-export.js +5 -3
  11. package/esm/cli/config/config-export.js.map +1 -1
  12. package/esm/cli/config/config-import.js +37 -4
  13. package/esm/cli/config/config-import.js.map +1 -1
  14. package/esm/cli/config/config.js +1 -2
  15. package/esm/cli/config/config.js.map +1 -1
  16. package/esm/cli/idp/idp-import.js +13 -5
  17. package/esm/cli/idp/idp-import.js.map +1 -1
  18. package/esm/cli/journey/journey-export.js +7 -4
  19. package/esm/cli/journey/journey-export.js.map +1 -1
  20. package/esm/cli/saml/saml-import.js +13 -5
  21. package/esm/cli/saml/saml-import.js.map +1 -1
  22. package/esm/cli/service/service-import.js +22 -5
  23. package/esm/cli/service/service-import.js.map +1 -1
  24. package/esm/ops/ApplicationOps.js +1 -1
  25. package/esm/ops/ApplicationOps.js.map +1 -1
  26. package/esm/ops/ConfigOps.js +39 -5
  27. package/esm/ops/ConfigOps.js.map +1 -1
  28. package/esm/ops/EmailTemplateOps.js +12 -17
  29. package/esm/ops/EmailTemplateOps.js.map +1 -1
  30. package/esm/ops/IdmOps.js +41 -91
  31. package/esm/ops/IdmOps.js.map +1 -1
  32. package/esm/ops/IdpOps.js +20 -8
  33. package/esm/ops/IdpOps.js.map +1 -1
  34. package/esm/ops/JourneyOps.js +10 -6
  35. package/esm/ops/JourneyOps.js.map +1 -1
  36. package/esm/ops/Saml2Ops.js +20 -8
  37. package/esm/ops/Saml2Ops.js.map +1 -1
  38. package/esm/ops/ServiceOps.js +30 -14
  39. package/esm/ops/ServiceOps.js.map +1 -1
  40. package/esm/ops/ThemeOps.js +16 -23
  41. package/esm/ops/ThemeOps.js.map +1 -1
  42. package/esm/utils/Config.js +13 -3
  43. package/esm/utils/Config.js.map +1 -1
  44. package/package.json +2 -2
@@ -96,9 +96,13 @@ export async function exportServicesToFiles(globalConfig = false, includeMeta =
96
96
  * Import a service from file
97
97
  * @param {string} serviceId service id/name
98
98
  * @param {string} file import file name
99
- * @param {boolean} clean remove existing service
99
+ * @param {ServiceImportOptions} options import options
100
100
  */
101
- export async function importServiceFromFile(serviceId, file, clean, globalConfig = false) {
101
+ export async function importServiceFromFile(serviceId, file, options = {
102
+ clean: false,
103
+ global: false,
104
+ realm: false
105
+ }) {
102
106
  const filePath = getFilePath(file);
103
107
  debugMessage(`cli.ServiceOps.importServiceFromFile: start [serviceId=${serviceId}, file=${filePath}]`);
104
108
  const verbose = state.getVerbose();
@@ -109,7 +113,7 @@ export async function importServiceFromFile(serviceId, file, clean, globalConfig
109
113
  if (!verbose) showSpinner(`Importing ${serviceId}...`);
110
114
  try {
111
115
  if (verbose) showSpinner(`Importing ${serviceId}...`);
112
- await importService(serviceId, importData, clean, globalConfig);
116
+ await importService(serviceId, importData, options);
113
117
  succeedSpinner(`Imported ${serviceId}.`);
114
118
  } catch (importError) {
115
119
  var _importError$response, _importError$response2;
@@ -129,9 +133,13 @@ export async function importServiceFromFile(serviceId, file, clean, globalConfig
129
133
  /**
130
134
  * Import first service from file
131
135
  * @param {string} file import file name
132
- * @param {boolean} clean remove existing service
136
+ * @param {ServiceImportOptions} options import options
133
137
  */
134
- export async function importFirstServiceFromFile(file, clean, globalConfig = false) {
138
+ export async function importFirstServiceFromFile(file, options = {
139
+ clean: false,
140
+ global: false,
141
+ realm: false
142
+ }) {
135
143
  const filePath = getFilePath(file);
136
144
  debugMessage(`cli.ServiceOps.importFirstServiceFromFile: start [file=${filePath}]`);
137
145
  const verbose = state.getVerbose();
@@ -143,7 +151,7 @@ export async function importFirstServiceFromFile(file, clean, globalConfig = fal
143
151
  if (!verbose) showSpinner(`Importing ${serviceId}...`);
144
152
  try {
145
153
  if (verbose) showSpinner(`Importing ${serviceId}...`);
146
- await importService(serviceId, importData, clean, globalConfig);
154
+ await importService(serviceId, importData, options);
147
155
  succeedSpinner(`Imported ${serviceId}.`);
148
156
  } catch (importError) {
149
157
  var _importError$response3, _importError$response4;
@@ -163,9 +171,13 @@ export async function importFirstServiceFromFile(file, clean, globalConfig = fal
163
171
  /**
164
172
  * Import services from file
165
173
  * @param {String} file file name
166
- * @param {boolean} clean remove existing service
174
+ * @param {ServiceImportOptions} options import options
167
175
  */
168
- export async function importServicesFromFile(file, clean, globalConfig = false) {
176
+ export async function importServicesFromFile(file, options = {
177
+ clean: false,
178
+ global: false,
179
+ realm: false
180
+ }) {
169
181
  const filePath = getFilePath(file);
170
182
  debugMessage(`cli.ServiceOps.importServiceFromFile: start [file=${filePath}]`);
171
183
  fs.readFile(filePath, 'utf8', async (err, data) => {
@@ -173,7 +185,7 @@ export async function importServicesFromFile(file, clean, globalConfig = false)
173
185
  debugMessage(`cli.ServiceOps.importServiceFromFile: importing ${filePath}`);
174
186
  const importData = JSON.parse(data);
175
187
  try {
176
- await importServices(importData, clean, globalConfig);
188
+ await importServices(importData, options);
177
189
  } catch (error) {
178
190
  printMessage(`${error.message}`, 'error');
179
191
  printMessage(error.response.status, 'error');
@@ -184,14 +196,18 @@ export async function importServicesFromFile(file, clean, globalConfig = false)
184
196
 
185
197
  /**
186
198
  * Import all services from separate files
187
- * @param {boolean} clean remove existing service
199
+ * @param {ServiceImportOptions} options import options
188
200
  */
189
- export async function importServicesFromFiles(clean, globalConfig = false) {
201
+ export async function importServicesFromFiles(options = {
202
+ clean: false,
203
+ global: false,
204
+ realm: false
205
+ }) {
190
206
  debugMessage(`cli.ServiceOps.importServicesFromFiles: start`);
191
207
  const names = fs.readdirSync(getWorkingDirectory());
192
- const agentFiles = names.filter(name => name.toLowerCase().endsWith('.service.json')).map(name => getFilePath(name));
193
- for (const file of agentFiles) {
194
- await importServicesFromFile(file, clean, globalConfig);
208
+ const serviceFiles = names.filter(name => name.toLowerCase().endsWith('.service.json'));
209
+ for (const file of serviceFiles) {
210
+ await importServicesFromFile(file, options);
195
211
  }
196
212
  debugMessage(`cli.ServiceOps.importServicesFromFiles: end`);
197
213
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceOps.js","names":["frodo","state","fs","createTable","debugMessage","failSpinner","printMessage","showSpinner","succeedSpinner","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","getListOfServices","exportServices","exportService","getFullServices","createServiceExportTemplate","importService","importServices","deleteFullService","deleteFullServices","service","listServices","long","globalConfig","services","sort","a","b","_id","localeCompare","table","push","name","toString","error","stack","exportServicesToFile","file","includeMeta","exportData","fileName","getRealm","exportServiceToFile","serviceId","exportServicesToFiles","_type","filePath","importServiceFromFile","clean","verbose","getVerbose","readFile","err","data","importData","JSON","parse","importError","_importError$response","_importError$response2","message","response","detail","importFirstServiceFromFile","Object","keys","length","_importError$response3","_importError$response4","importServicesFromFile","status","importServicesFromFiles","names","readdirSync","agentFiles","filter","toLowerCase","endsWith","map","deleteService","_error$response","deleteServices"],"sources":["../../src/ops/ServiceOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type ServiceExportInterface } from '@rockcarver/frodo-lib/types/ops/ServiceOps';\nimport fs from 'fs';\n\nimport {\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n succeedSpinner,\n} from '../utils/Console';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n getListOfServices,\n exportServices,\n exportService,\n getFullServices,\n createServiceExportTemplate,\n importService,\n importServices,\n deleteFullService,\n deleteFullServices,\n} = frodo.service;\n\n/**\n * List services\n */\nexport async function listServices(long = false, globalConfig = false) {\n try {\n const services = await getListOfServices(globalConfig);\n services.sort((a, b) => a._id.localeCompare(b._id));\n if (long) {\n const table = createTable(['Service Id', 'Service Name']);\n for (const service of services) {\n table.push([\n service._id,\n globalConfig ? service['_type'].name : service.name,\n ]);\n }\n printMessage(table.toString(), 'data');\n } else {\n for (const service of services) {\n printMessage(`${service._id}`, 'data');\n }\n }\n } catch (error) {\n printMessage(`Error listing agents - ${error}`, 'error');\n printMessage(error.stack, 'error');\n }\n}\n\n/**\n * Export all services to file\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportServicesToFile(\n file,\n globalConfig = false,\n includeMeta = true\n) {\n const exportData = await exportServices(globalConfig);\n let fileName = getTypedFilename(\n `all${\n globalConfig ? 'Global' : titleCase(getRealmName(state.getRealm()))\n }Services`,\n `service`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n}\n\n/**\n * Export service to file\n * @param {string} serviceId service id\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportServiceToFile(\n serviceId: string,\n file: string,\n globalConfig = false,\n includeMeta = true\n) {\n const exportData = await exportService(serviceId, globalConfig);\n let fileName = getTypedFilename(serviceId, `service`);\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n}\n\n/**\n * Export all services to separate files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportServicesToFiles(\n globalConfig = false,\n includeMeta = true\n) {\n debugMessage(`cli.ServiceOps.exportServicesToFiles: start`);\n const services = await getFullServices(globalConfig);\n for (const service of services) {\n const fileName = getTypedFilename(service._type._id, `service`);\n const filePath = getFilePath(fileName, true);\n const exportData = createServiceExportTemplate();\n exportData.service[service._type._id] = service;\n debugMessage(\n `cli.ServiceOps.exportServicesToFiles: exporting ${service._type._id} to ${filePath}`\n );\n saveJsonToFile(exportData, filePath, includeMeta);\n }\n debugMessage(`cli.ServiceOps.exportServicesToFiles: end.`);\n}\n\n/**\n * Import a service from file\n * @param {string} serviceId service id/name\n * @param {string} file import file name\n * @param {boolean} clean remove existing service\n */\nexport async function importServiceFromFile(\n serviceId: string,\n file: string,\n clean: boolean,\n globalConfig = false\n) {\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: start [serviceId=${serviceId}, file=${filePath}]`\n );\n const verbose = state.getVerbose();\n fs.readFile(filePath, 'utf8', async (err, data) => {\n if (err) throw err;\n const importData = JSON.parse(data);\n if (importData && importData.service[serviceId]) {\n if (!verbose) showSpinner(`Importing ${serviceId}...`);\n try {\n if (verbose) showSpinner(`Importing ${serviceId}...`);\n await importService(serviceId, importData, clean, globalConfig);\n succeedSpinner(`Imported ${serviceId}.`);\n } catch (importError) {\n const message = importError.response?.data?.message;\n const detail = importError.response?.data?.detail;\n if (verbose) showSpinner(`Importing ${serviceId}...`);\n failSpinner(`${detail ? message + ' - ' + detail : message}`);\n }\n } else {\n showSpinner(`Importing ${serviceId}...`);\n failSpinner(`${serviceId} not found!`);\n }\n });\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: end [serviceId=${serviceId}, file=${filePath}]`\n );\n}\n\n/**\n * Import first service from file\n * @param {string} file import file name\n * @param {boolean} clean remove existing service\n */\nexport async function importFirstServiceFromFile(\n file: string,\n clean: boolean,\n globalConfig = false\n) {\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importFirstServiceFromFile: start [file=${filePath}]`\n );\n const verbose = state.getVerbose();\n fs.readFile(filePath, 'utf8', async (err, data) => {\n if (err) throw err;\n const importData = JSON.parse(data);\n if (importData && Object.keys(importData.service).length) {\n const serviceId = Object.keys(importData.service)[0];\n if (!verbose) showSpinner(`Importing ${serviceId}...`);\n try {\n if (verbose) showSpinner(`Importing ${serviceId}...`);\n await importService(serviceId, importData, clean, globalConfig);\n succeedSpinner(`Imported ${serviceId}.`);\n } catch (importError) {\n const message = importError.response?.data?.message;\n const detail = importError.response?.data?.detail;\n if (verbose) showSpinner(`Importing ${serviceId}...`);\n failSpinner(`${detail ? message + ' - ' + detail : message}`);\n }\n } else {\n showSpinner(`Importing service...`);\n failSpinner(`No service found in ${filePath}!`);\n }\n debugMessage(\n `cli.ServiceOps.importFirstServiceFromFile: end [file=${filePath}]`\n );\n });\n}\n\n/**\n * Import services from file\n * @param {String} file file name\n * @param {boolean} clean remove existing service\n */\nexport async function importServicesFromFile(\n file: string,\n clean: boolean,\n globalConfig = false\n) {\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: start [file=${filePath}]`\n );\n fs.readFile(filePath, 'utf8', async (err, data) => {\n if (err) throw err;\n debugMessage(`cli.ServiceOps.importServiceFromFile: importing ${filePath}`);\n const importData = JSON.parse(data) as ServiceExportInterface;\n try {\n await importServices(importData, clean, globalConfig);\n } catch (error) {\n printMessage(`${error.message}`, 'error');\n printMessage(error.response.status, 'error');\n }\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: end [file=${filePath}]`\n );\n });\n}\n\n/**\n * Import all services from separate files\n * @param {boolean} clean remove existing service\n */\nexport async function importServicesFromFiles(\n clean: boolean,\n globalConfig = false\n) {\n debugMessage(`cli.ServiceOps.importServicesFromFiles: start`);\n const names = fs.readdirSync(getWorkingDirectory());\n const agentFiles = names\n .filter((name) => name.toLowerCase().endsWith('.service.json'))\n .map((name) => getFilePath(name));\n for (const file of agentFiles) {\n await importServicesFromFile(file, clean, globalConfig);\n }\n debugMessage(`cli.ServiceOps.importServicesFromFiles: end`);\n}\n\n/**\n * Delete a service by id/name\n * @param {string} serviceId Reference to the service to delete\n */\nexport async function deleteService(serviceId: string, globalConfig = false) {\n try {\n await deleteFullService(serviceId, globalConfig);\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(`Delete service '${serviceId}': ${message}`, 'error');\n }\n}\n\n/**\n * Delete all services\n */\nexport async function deleteServices(globalConfig = false) {\n await deleteFullServices(globalConfig);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ServiceOps.js","names":["frodo","state","fs","createTable","debugMessage","failSpinner","printMessage","showSpinner","succeedSpinner","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","getListOfServices","exportServices","exportService","getFullServices","createServiceExportTemplate","importService","importServices","deleteFullService","deleteFullServices","service","listServices","long","globalConfig","services","sort","a","b","_id","localeCompare","table","push","name","toString","error","stack","exportServicesToFile","file","includeMeta","exportData","fileName","getRealm","exportServiceToFile","serviceId","exportServicesToFiles","_type","filePath","importServiceFromFile","options","clean","global","realm","verbose","getVerbose","readFile","err","data","importData","JSON","parse","importError","_importError$response","_importError$response2","message","response","detail","importFirstServiceFromFile","Object","keys","length","_importError$response3","_importError$response4","importServicesFromFile","status","importServicesFromFiles","names","readdirSync","serviceFiles","filter","toLowerCase","endsWith","deleteService","_error$response","deleteServices"],"sources":["../../src/ops/ServiceOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport {\n type ServiceExportInterface,\n type ServiceImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ServiceOps';\nimport fs from 'fs';\n\nimport {\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n succeedSpinner,\n} from '../utils/Console';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n getListOfServices,\n exportServices,\n exportService,\n getFullServices,\n createServiceExportTemplate,\n importService,\n importServices,\n deleteFullService,\n deleteFullServices,\n} = frodo.service;\n\n/**\n * List services\n */\nexport async function listServices(long = false, globalConfig = false) {\n try {\n const services = await getListOfServices(globalConfig);\n services.sort((a, b) => a._id.localeCompare(b._id));\n if (long) {\n const table = createTable(['Service Id', 'Service Name']);\n for (const service of services) {\n table.push([\n service._id,\n globalConfig ? service['_type'].name : service.name,\n ]);\n }\n printMessage(table.toString(), 'data');\n } else {\n for (const service of services) {\n printMessage(`${service._id}`, 'data');\n }\n }\n } catch (error) {\n printMessage(`Error listing agents - ${error}`, 'error');\n printMessage(error.stack, 'error');\n }\n}\n\n/**\n * Export all services to file\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportServicesToFile(\n file,\n globalConfig = false,\n includeMeta = true\n) {\n const exportData = await exportServices(globalConfig);\n let fileName = getTypedFilename(\n `all${\n globalConfig ? 'Global' : titleCase(getRealmName(state.getRealm()))\n }Services`,\n `service`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n}\n\n/**\n * Export service to file\n * @param {string} serviceId service id\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportServiceToFile(\n serviceId: string,\n file: string,\n globalConfig = false,\n includeMeta = true\n) {\n const exportData = await exportService(serviceId, globalConfig);\n let fileName = getTypedFilename(serviceId, `service`);\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n}\n\n/**\n * Export all services to separate files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportServicesToFiles(\n globalConfig = false,\n includeMeta = true\n) {\n debugMessage(`cli.ServiceOps.exportServicesToFiles: start`);\n const services = await getFullServices(globalConfig);\n for (const service of services) {\n const fileName = getTypedFilename(service._type._id, `service`);\n const filePath = getFilePath(fileName, true);\n const exportData = createServiceExportTemplate();\n exportData.service[service._type._id] = service;\n debugMessage(\n `cli.ServiceOps.exportServicesToFiles: exporting ${service._type._id} to ${filePath}`\n );\n saveJsonToFile(exportData, filePath, includeMeta);\n }\n debugMessage(`cli.ServiceOps.exportServicesToFiles: end.`);\n}\n\n/**\n * Import a service from file\n * @param {string} serviceId service id/name\n * @param {string} file import file name\n * @param {ServiceImportOptions} options import options\n */\nexport async function importServiceFromFile(\n serviceId: string,\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n) {\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: start [serviceId=${serviceId}, file=${filePath}]`\n );\n const verbose = state.getVerbose();\n fs.readFile(filePath, 'utf8', async (err, data) => {\n if (err) throw err;\n const importData = JSON.parse(data);\n if (importData && importData.service[serviceId]) {\n if (!verbose) showSpinner(`Importing ${serviceId}...`);\n try {\n if (verbose) showSpinner(`Importing ${serviceId}...`);\n await importService(serviceId, importData, options);\n succeedSpinner(`Imported ${serviceId}.`);\n } catch (importError) {\n const message = importError.response?.data?.message;\n const detail = importError.response?.data?.detail;\n if (verbose) showSpinner(`Importing ${serviceId}...`);\n failSpinner(`${detail ? message + ' - ' + detail : message}`);\n }\n } else {\n showSpinner(`Importing ${serviceId}...`);\n failSpinner(`${serviceId} not found!`);\n }\n });\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: end [serviceId=${serviceId}, file=${filePath}]`\n );\n}\n\n/**\n * Import first service from file\n * @param {string} file import file name\n * @param {ServiceImportOptions} options import options\n */\nexport async function importFirstServiceFromFile(\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n) {\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importFirstServiceFromFile: start [file=${filePath}]`\n );\n const verbose = state.getVerbose();\n fs.readFile(filePath, 'utf8', async (err, data) => {\n if (err) throw err;\n const importData = JSON.parse(data);\n if (importData && Object.keys(importData.service).length) {\n const serviceId = Object.keys(importData.service)[0];\n if (!verbose) showSpinner(`Importing ${serviceId}...`);\n try {\n if (verbose) showSpinner(`Importing ${serviceId}...`);\n await importService(serviceId, importData, options);\n succeedSpinner(`Imported ${serviceId}.`);\n } catch (importError) {\n const message = importError.response?.data?.message;\n const detail = importError.response?.data?.detail;\n if (verbose) showSpinner(`Importing ${serviceId}...`);\n failSpinner(`${detail ? message + ' - ' + detail : message}`);\n }\n } else {\n showSpinner(`Importing service...`);\n failSpinner(`No service found in ${filePath}!`);\n }\n debugMessage(\n `cli.ServiceOps.importFirstServiceFromFile: end [file=${filePath}]`\n );\n });\n}\n\n/**\n * Import services from file\n * @param {String} file file name\n * @param {ServiceImportOptions} options import options\n */\nexport async function importServicesFromFile(\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n) {\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: start [file=${filePath}]`\n );\n fs.readFile(filePath, 'utf8', async (err, data) => {\n if (err) throw err;\n debugMessage(`cli.ServiceOps.importServiceFromFile: importing ${filePath}`);\n const importData = JSON.parse(data) as ServiceExportInterface;\n try {\n await importServices(importData, options);\n } catch (error) {\n printMessage(`${error.message}`, 'error');\n printMessage(error.response.status, 'error');\n }\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: end [file=${filePath}]`\n );\n });\n}\n\n/**\n * Import all services from separate files\n * @param {ServiceImportOptions} options import options\n */\nexport async function importServicesFromFiles(\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n) {\n debugMessage(`cli.ServiceOps.importServicesFromFiles: start`);\n const names = fs.readdirSync(getWorkingDirectory());\n const serviceFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.service.json')\n );\n for (const file of serviceFiles) {\n await importServicesFromFile(file, options);\n }\n debugMessage(`cli.ServiceOps.importServicesFromFiles: end`);\n}\n\n/**\n * Delete a service by id/name\n * @param {string} serviceId Reference to the service to delete\n */\nexport async function deleteService(serviceId: string, globalConfig = false) {\n try {\n await deleteFullService(serviceId, globalConfig);\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(`Delete service '${serviceId}': ${message}`, 'error');\n }\n}\n\n/**\n * Delete all services\n */\nexport async function deleteServices(globalConfig = false) {\n await deleteFullServices(globalConfig);\n}\n"],"mappings":"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"}
@@ -17,7 +17,7 @@ const {
17
17
  readTheme,
18
18
  updateThemeByName,
19
19
  updateTheme,
20
- updateThemes,
20
+ importThemes,
21
21
  exportThemes,
22
22
  deleteTheme,
23
23
  deleteThemeByName,
@@ -233,17 +233,9 @@ export async function importThemesFromFile(file) {
233
233
  try {
234
234
  const data = fs.readFileSync(filePath, 'utf8');
235
235
  const themeExport = JSON.parse(data);
236
- const indicatorId = createProgressIndicator('determinate', Object.keys(themeExport.theme).length, 'Importing themes...');
237
- for (const id of Object.keys(themeExport.theme)) {
238
- updateProgressIndicator(indicatorId, `Importing ${themeExport.theme[id].name}`);
239
- }
240
- const result = await updateThemes(themeExport.theme);
241
- if (result == null) {
242
- stopProgressIndicator(indicatorId, `Error importing ${Object.keys(themeExport.theme).length} themes!`);
243
- printMessage(`Error importing ${Object.keys(themeExport.theme).length} themes from ${filePath}`, 'error');
244
- } else {
245
- stopProgressIndicator(indicatorId, `Successfully imported ${Object.keys(themeExport.theme).length} themes.`);
246
- }
236
+ const indicatorId = createProgressIndicator('indeterminate', 0, `Importing themes from ${filePath}...`);
237
+ await importThemes(themeExport);
238
+ stopProgressIndicator(indicatorId, `Successfully imported ${Object.keys(themeExport.theme).length} themes.`);
247
239
  } catch (error) {
248
240
  printMessage(`Error importing themes: ${error}`, 'error');
249
241
  }
@@ -261,21 +253,22 @@ export async function importThemesFromFiles() {
261
253
  let total = 0;
262
254
  let files = 0;
263
255
  for (const file of jsonFiles) {
264
- const data = fs.readFileSync(file, 'utf8');
265
- fileData = JSON.parse(data);
266
- if (validateImport(fileData.meta)) {
267
- count = Object.keys(fileData.theme).length;
268
- // eslint-disable-next-line no-await-in-loop
269
- const result = await updateThemes(fileData.theme);
270
- if (result == null) {
271
- printMessage(`Error importing ${count} themes from ${file}`, 'error');
272
- } else {
256
+ try {
257
+ const data = fs.readFileSync(file, 'utf8');
258
+ fileData = JSON.parse(data);
259
+ if (validateImport(fileData.meta)) {
260
+ count = Object.keys(fileData.theme).length;
261
+ await importThemes(fileData);
273
262
  files += 1;
274
263
  total += count;
275
264
  updateProgressIndicator(indicatorId, `Imported ${count} theme(s) from ${file}`);
265
+ } else {
266
+ printMessage(`Validation of ${file} failed!`, 'error');
276
267
  }
277
- } else {
278
- printMessage(`Validation of ${file} failed!`, 'error');
268
+ } catch (error) {
269
+ var _error$response;
270
+ updateProgressIndicator(indicatorId, `Error importing theme(s) from ${file}`);
271
+ printMessage(((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data) || error, 'error');
279
272
  }
280
273
  }
281
274
  stopProgressIndicator(indicatorId, `Finished importing ${total} theme(s) from ${files} file(s).`);
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeOps.js","names":["frodo","fs","v4","uuidv4","createProgressIndicator","createTable","printMessage","stopProgressIndicator","updateProgressIndicator","getRealmString","validateImport","getTypedFilename","saveJsonToFile","saveToFile","getFilePath","getWorkingDirectory","utils","readThemes","readThemeByName","readTheme","updateThemeByName","updateTheme","updateThemes","exportThemes","deleteTheme","deleteThemeByName","deleteThemes","theme","getOneLineDescription","themeObj","description","_id","name","linkedTrees","join","getTableHeaderMd","markdown","getTableRowMd","row","listThemes","long","themeList","sort","a","b","localeCompare","forEach","isDefault","table","push","toString","exportThemeByName","file","includeMeta","fileName","filePath","indicatorId","themeData","error","message","exportThemeById","id","exportThemesToFile","exportData","exportThemesToFiles","themes","barId","length","fileBarId","importThemeByName","data","readFileSync","themeExport","JSON","parse","found","Object","keys","importThemeById","themeId","importThemesFromFile","result","importThemesFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","map","fileData","count","total","files","meta","importFirstThemeFromFile","then","deleteThemeCmd","undefined","deleteThemeByNameCmd","deleteAllThemes","deleteThemesCmd"],"sources":["../../src/ops/ThemeOps.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport {\n ThemeExportInterface,\n type ThemeSkeleton,\n} from '@rockcarver/frodo-lib/types/ops/ThemeOps';\nimport fs from 'fs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n createProgressIndicator,\n createTable,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\n\nconst {\n getRealmString,\n validateImport,\n getTypedFilename,\n saveJsonToFile,\n saveToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readThemes,\n readThemeByName,\n readTheme,\n updateThemeByName,\n updateTheme,\n updateThemes,\n exportThemes,\n deleteTheme,\n deleteThemeByName,\n deleteThemes,\n} = frodo.theme;\n\n/**\n * Get a one-line description of the theme\n * @param {ThemeSkeleton} themeObj theme object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(themeObj: ThemeSkeleton): string {\n const description = `[${themeObj._id['brightCyan']}] ${themeObj.name}${\n themeObj.linkedTrees\n ? ' (' + themeObj.linkedTrees.join(', ')['brightCyan'] + ')'\n : ''\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 += '| Name | Linked Journey(s) | Id |\\n';\n markdown += '| ---- | ----------------- | ---|';\n return markdown;\n}\n\n/**\n * Get a table-row of the theme in markdown\n * @param {ThemeSkeleton} themeObj theme object to describe\n * @returns {string} a table-row of the theme in markdown\n */\nexport function getTableRowMd(themeObj: ThemeSkeleton): string {\n const row = `| ${themeObj.name} | ${\n themeObj.linkedTrees ? themeObj.linkedTrees.join(', ') : ''\n } | \\`${themeObj._id}\\` |`;\n return row;\n}\n\n/**\n * List all the themes\n * @param {boolean} long Long version, more fields\n */\nexport async function listThemes(long = false) {\n const themeList = await readThemes();\n themeList.sort((a, b) => a.name.localeCompare(b.name));\n if (!long) {\n themeList.forEach((theme) => {\n printMessage(\n `${theme.isDefault ? theme.name['brightCyan'] : theme.name}`,\n 'data'\n );\n });\n } else {\n const table = createTable([\n 'Name'['brightCyan'],\n 'Id'['brightCyan'],\n 'Default'['brightCyan'],\n ]);\n themeList.forEach((theme) => {\n table.push([\n `${theme.name}`,\n `${theme._id}`,\n `${theme.isDefault ? 'Yes'['brightGreen'] : ''}`,\n ]);\n });\n printMessage(table.toString(), 'data');\n }\n}\n\n/**\n * Export theme by name to file\n * @param {String} name theme 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 exportThemeByName(name, file, includeMeta = true) {\n let fileName = getTypedFilename(name, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${name}`\n );\n try {\n const themeData = await readThemeByName(name);\n if (!themeData._id) themeData._id = uuidv4();\n updateProgressIndicator(indicatorId, `Writing file to ${filePath}`);\n saveToFile('theme', [themeData], '_id', filePath, includeMeta);\n stopProgressIndicator(indicatorId, `Successfully exported theme ${name}.`);\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error.message}`);\n printMessage(`${error.message}`, 'error');\n }\n}\n\n/**\n * Export theme by uuid to file\n * @param {String} id theme uuid\n * @param {String} file optional export file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportThemeById(id, file, includeMeta = true) {\n let fileName = getTypedFilename(id, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${id}`\n );\n try {\n const themeData = await readTheme(id);\n updateProgressIndicator(indicatorId, `Writing file to ${filePath}`);\n saveToFile('theme', [themeData], '_id', filePath, includeMeta);\n stopProgressIndicator(indicatorId, `Successfully exported theme ${id}.`);\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error.message}`);\n printMessage(`${error.message}`, 'error');\n }\n}\n\n/**\n * Export all themes to file\n * @param {String} file optional export file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportThemesToFile(file, includeMeta = true) {\n let fileName = getTypedFilename(`all${getRealmString()}Themes`, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const exportData = await exportThemes();\n saveJsonToFile(exportData, filePath, includeMeta);\n}\n\n/**\n * Export all themes to separate files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportThemesToFiles(includeMeta = true) {\n const themes = await readThemes();\n const barId = createProgressIndicator(\n 'determinate',\n themes.length,\n 'Exporting themes'\n );\n for (const theme of themes) {\n if (!theme._id) theme._id = uuidv4();\n const fileBarId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting theme ${theme.name}...`\n );\n updateProgressIndicator(barId, `Exporting theme ${theme.name}`);\n const file = getFilePath(getTypedFilename(theme.name, 'theme'), true);\n saveToFile('theme', theme, '_id', file, includeMeta);\n updateProgressIndicator(fileBarId, `${theme.name} saved to ${file}`);\n stopProgressIndicator(fileBarId, `${theme.name} saved to ${file}.`);\n }\n stopProgressIndicator(barId, `${themes.length} themes exported.`);\n}\n\n/**\n * Import theme by name from file\n * @param {String} name theme name\n * @param {String} file import file name\n */\nexport async function importThemeByName(name, file) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const themeExport: ThemeExportInterface = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n 'Importing theme...'\n );\n let found = false;\n for (const id of Object.keys(themeExport.theme)) {\n if (themeExport.theme[id].name === name) {\n found = true;\n updateProgressIndicator(\n indicatorId,\n `Importing ${themeExport.theme[id].name}`\n );\n try {\n await updateThemeByName(name, themeExport.theme[id]);\n stopProgressIndicator(\n indicatorId,\n `Successfully imported theme ${name}.`\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing theme ${themeExport.theme[id].name}: ${error.message}`\n );\n printMessage(\n `Error importing theme ${themeExport.theme[id].name}: ${error.message}`,\n 'error'\n );\n }\n break;\n }\n }\n if (!found) {\n stopProgressIndicator(indicatorId, `Theme ${name} not found!`);\n }\n } catch (error) {\n printMessage(`Error importing theme ${name}: ${error}`, 'error');\n }\n}\n\n/**\n * Import theme by uuid from file\n * @param {String} id theme uuid\n * @param {String} file import file name\n */\nexport async function importThemeById(id, file) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const themeExport: ThemeExportInterface = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n 'Importing theme...'\n );\n let found = false;\n for (const themeId of Object.keys(themeExport.theme)) {\n if (themeId === id) {\n found = true;\n updateProgressIndicator(\n indicatorId,\n `Importing ${themeExport.theme[themeId]._id}`\n );\n try {\n await updateTheme(themeId, themeExport.theme[themeId]);\n stopProgressIndicator(\n indicatorId,\n `Successfully imported theme ${id}.`\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing theme ${themeExport.theme[themeId]._id}: ${error.message}`\n );\n printMessage(\n `Error importing theme ${themeExport.theme[themeId]._id}: ${error.message}`,\n 'error'\n );\n }\n break;\n }\n }\n if (!found) {\n stopProgressIndicator(indicatorId, `Theme ${id} not found!`);\n }\n } catch (error) {\n printMessage(`Error importing theme ${id}: ${error}`, 'error');\n }\n}\n\n/**\n * Import all themes from single file\n * @param {String} file import file name\n */\nexport async function importThemesFromFile(file) {\n const filePath = getFilePath(file);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const themeExport: ThemeExportInterface = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n Object.keys(themeExport.theme).length,\n 'Importing themes...'\n );\n for (const id of Object.keys(themeExport.theme)) {\n updateProgressIndicator(\n indicatorId,\n `Importing ${themeExport.theme[id].name}`\n );\n }\n const result = await updateThemes(themeExport.theme);\n if (result == null) {\n stopProgressIndicator(\n indicatorId,\n `Error importing ${Object.keys(themeExport.theme).length} themes!`\n );\n printMessage(\n `Error importing ${\n Object.keys(themeExport.theme).length\n } themes from ${filePath}`,\n 'error'\n );\n } else {\n stopProgressIndicator(\n indicatorId,\n `Successfully imported ${Object.keys(themeExport.theme).length} themes.`\n );\n }\n } catch (error) {\n printMessage(`Error importing themes: ${error}`, 'error');\n }\n}\n\n/**\n * Import themes from separate files\n */\nexport async function importThemesFromFiles() {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.theme.json'))\n .map((name) => getFilePath(name));\n\n const indicatorId = createProgressIndicator(\n 'determinate',\n jsonFiles.length,\n 'Importing themes...'\n );\n let fileData = null;\n let count = 0;\n let total = 0;\n let files = 0;\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n count = Object.keys(fileData.theme).length;\n // eslint-disable-next-line no-await-in-loop\n const result = await updateThemes(fileData.theme);\n if (result == null) {\n printMessage(`Error importing ${count} themes from ${file}`, 'error');\n } else {\n files += 1;\n total += count;\n updateProgressIndicator(\n indicatorId,\n `Imported ${count} theme(s) from ${file}`\n );\n }\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressIndicator(\n indicatorId,\n `Finished importing ${total} theme(s) from ${files} file(s).`\n );\n}\n\n/**\n * Import first theme from file\n * @param {String} file import file name\n */\nexport async function importFirstThemeFromFile(file) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const themeExport = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n 'Importing theme...'\n );\n for (const id of Object.keys(themeExport.theme)) {\n updateProgressIndicator(\n indicatorId,\n `Importing ${themeExport.theme[id].name}`\n );\n updateTheme(id, themeExport.theme[id]).then((result) => {\n if (result == null) {\n stopProgressIndicator(\n indicatorId,\n `Error importing theme ${themeExport.theme[id].name}`\n );\n printMessage(\n `Error importing theme ${themeExport.theme[id].name}`,\n 'error'\n );\n } else {\n stopProgressIndicator(\n indicatorId,\n `Successfully imported theme ${themeExport.theme[id].name}`\n );\n }\n });\n break;\n }\n } catch (error) {\n printMessage(`Error importing themes: ${error}`, 'error');\n }\n}\n\n/**\n * Delete theme by id\n * @param {String} id theme id\n */\nexport async function deleteThemeCmd(id) {\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${id}...`\n );\n try {\n await deleteTheme(id);\n stopProgressIndicator(indicatorId, `Deleted ${id}.`, 'success');\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete theme by name\n * @param {String} name theme name\n */\nexport async function deleteThemeByNameCmd(name) {\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${name}...`\n );\n try {\n await deleteThemeByName(name);\n stopProgressIndicator(indicatorId, `Deleted ${name}.`, 'success');\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all themes\n */\nexport async function deleteAllThemes() {\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all realm themes...`\n );\n try {\n await deleteThemes();\n stopProgressIndicator(indicatorId, `Deleted all realm themes.`, 'success');\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all themes\n * @deprecated since version 0.14.0\n */\nexport async function deleteThemesCmd() {\n return deleteAllThemes();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ThemeOps.js","names":["frodo","fs","v4","uuidv4","createProgressIndicator","createTable","printMessage","stopProgressIndicator","updateProgressIndicator","getRealmString","validateImport","getTypedFilename","saveJsonToFile","saveToFile","getFilePath","getWorkingDirectory","utils","readThemes","readThemeByName","readTheme","updateThemeByName","updateTheme","importThemes","exportThemes","deleteTheme","deleteThemeByName","deleteThemes","theme","getOneLineDescription","themeObj","description","_id","name","linkedTrees","join","getTableHeaderMd","markdown","getTableRowMd","row","listThemes","long","themeList","sort","a","b","localeCompare","forEach","isDefault","table","push","toString","exportThemeByName","file","includeMeta","fileName","filePath","indicatorId","themeData","error","message","exportThemeById","id","exportThemesToFile","exportData","exportThemesToFiles","themes","barId","length","fileBarId","importThemeByName","data","readFileSync","themeExport","JSON","parse","found","Object","keys","importThemeById","themeId","importThemesFromFile","importThemesFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","map","fileData","count","total","files","meta","_error$response","response","importFirstThemeFromFile","then","result","deleteThemeCmd","undefined","deleteThemeByNameCmd","deleteAllThemes","deleteThemesCmd"],"sources":["../../src/ops/ThemeOps.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport {\n ThemeExportInterface,\n type ThemeSkeleton,\n} from '@rockcarver/frodo-lib/types/ops/ThemeOps';\nimport fs from 'fs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n createProgressIndicator,\n createTable,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\n\nconst {\n getRealmString,\n validateImport,\n getTypedFilename,\n saveJsonToFile,\n saveToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readThemes,\n readThemeByName,\n readTheme,\n updateThemeByName,\n updateTheme,\n importThemes,\n exportThemes,\n deleteTheme,\n deleteThemeByName,\n deleteThemes,\n} = frodo.theme;\n\n/**\n * Get a one-line description of the theme\n * @param {ThemeSkeleton} themeObj theme object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(themeObj: ThemeSkeleton): string {\n const description = `[${themeObj._id['brightCyan']}] ${themeObj.name}${\n themeObj.linkedTrees\n ? ' (' + themeObj.linkedTrees.join(', ')['brightCyan'] + ')'\n : ''\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 += '| Name | Linked Journey(s) | Id |\\n';\n markdown += '| ---- | ----------------- | ---|';\n return markdown;\n}\n\n/**\n * Get a table-row of the theme in markdown\n * @param {ThemeSkeleton} themeObj theme object to describe\n * @returns {string} a table-row of the theme in markdown\n */\nexport function getTableRowMd(themeObj: ThemeSkeleton): string {\n const row = `| ${themeObj.name} | ${\n themeObj.linkedTrees ? themeObj.linkedTrees.join(', ') : ''\n } | \\`${themeObj._id}\\` |`;\n return row;\n}\n\n/**\n * List all the themes\n * @param {boolean} long Long version, more fields\n */\nexport async function listThemes(long = false) {\n const themeList = await readThemes();\n themeList.sort((a, b) => a.name.localeCompare(b.name));\n if (!long) {\n themeList.forEach((theme) => {\n printMessage(\n `${theme.isDefault ? theme.name['brightCyan'] : theme.name}`,\n 'data'\n );\n });\n } else {\n const table = createTable([\n 'Name'['brightCyan'],\n 'Id'['brightCyan'],\n 'Default'['brightCyan'],\n ]);\n themeList.forEach((theme) => {\n table.push([\n `${theme.name}`,\n `${theme._id}`,\n `${theme.isDefault ? 'Yes'['brightGreen'] : ''}`,\n ]);\n });\n printMessage(table.toString(), 'data');\n }\n}\n\n/**\n * Export theme by name to file\n * @param {String} name theme 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 exportThemeByName(name, file, includeMeta = true) {\n let fileName = getTypedFilename(name, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${name}`\n );\n try {\n const themeData = await readThemeByName(name);\n if (!themeData._id) themeData._id = uuidv4();\n updateProgressIndicator(indicatorId, `Writing file to ${filePath}`);\n saveToFile('theme', [themeData], '_id', filePath, includeMeta);\n stopProgressIndicator(indicatorId, `Successfully exported theme ${name}.`);\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error.message}`);\n printMessage(`${error.message}`, 'error');\n }\n}\n\n/**\n * Export theme by uuid to file\n * @param {String} id theme uuid\n * @param {String} file optional export file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportThemeById(id, file, includeMeta = true) {\n let fileName = getTypedFilename(id, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting ${id}`\n );\n try {\n const themeData = await readTheme(id);\n updateProgressIndicator(indicatorId, `Writing file to ${filePath}`);\n saveToFile('theme', [themeData], '_id', filePath, includeMeta);\n stopProgressIndicator(indicatorId, `Successfully exported theme ${id}.`);\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error.message}`);\n printMessage(`${error.message}`, 'error');\n }\n}\n\n/**\n * Export all themes to file\n * @param {String} file optional export file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportThemesToFile(file, includeMeta = true) {\n let fileName = getTypedFilename(`all${getRealmString()}Themes`, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const exportData = await exportThemes();\n saveJsonToFile(exportData, filePath, includeMeta);\n}\n\n/**\n * Export all themes to separate files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n */\nexport async function exportThemesToFiles(includeMeta = true) {\n const themes = await readThemes();\n const barId = createProgressIndicator(\n 'determinate',\n themes.length,\n 'Exporting themes'\n );\n for (const theme of themes) {\n if (!theme._id) theme._id = uuidv4();\n const fileBarId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting theme ${theme.name}...`\n );\n updateProgressIndicator(barId, `Exporting theme ${theme.name}`);\n const file = getFilePath(getTypedFilename(theme.name, 'theme'), true);\n saveToFile('theme', theme, '_id', file, includeMeta);\n updateProgressIndicator(fileBarId, `${theme.name} saved to ${file}`);\n stopProgressIndicator(fileBarId, `${theme.name} saved to ${file}.`);\n }\n stopProgressIndicator(barId, `${themes.length} themes exported.`);\n}\n\n/**\n * Import theme by name from file\n * @param {String} name theme name\n * @param {String} file import file name\n */\nexport async function importThemeByName(name, file) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const themeExport: ThemeExportInterface = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n 'Importing theme...'\n );\n let found = false;\n for (const id of Object.keys(themeExport.theme)) {\n if (themeExport.theme[id].name === name) {\n found = true;\n updateProgressIndicator(\n indicatorId,\n `Importing ${themeExport.theme[id].name}`\n );\n try {\n await updateThemeByName(name, themeExport.theme[id]);\n stopProgressIndicator(\n indicatorId,\n `Successfully imported theme ${name}.`\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing theme ${themeExport.theme[id].name}: ${error.message}`\n );\n printMessage(\n `Error importing theme ${themeExport.theme[id].name}: ${error.message}`,\n 'error'\n );\n }\n break;\n }\n }\n if (!found) {\n stopProgressIndicator(indicatorId, `Theme ${name} not found!`);\n }\n } catch (error) {\n printMessage(`Error importing theme ${name}: ${error}`, 'error');\n }\n}\n\n/**\n * Import theme by uuid from file\n * @param {String} id theme uuid\n * @param {String} file import file name\n */\nexport async function importThemeById(id, file) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const themeExport: ThemeExportInterface = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n 'Importing theme...'\n );\n let found = false;\n for (const themeId of Object.keys(themeExport.theme)) {\n if (themeId === id) {\n found = true;\n updateProgressIndicator(\n indicatorId,\n `Importing ${themeExport.theme[themeId]._id}`\n );\n try {\n await updateTheme(themeId, themeExport.theme[themeId]);\n stopProgressIndicator(\n indicatorId,\n `Successfully imported theme ${id}.`\n );\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing theme ${themeExport.theme[themeId]._id}: ${error.message}`\n );\n printMessage(\n `Error importing theme ${themeExport.theme[themeId]._id}: ${error.message}`,\n 'error'\n );\n }\n break;\n }\n }\n if (!found) {\n stopProgressIndicator(indicatorId, `Theme ${id} not found!`);\n }\n } catch (error) {\n printMessage(`Error importing theme ${id}: ${error}`, 'error');\n }\n}\n\n/**\n * Import all themes from single file\n * @param {String} file import file name\n */\nexport async function importThemesFromFile(file) {\n const filePath = getFilePath(file);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const themeExport: ThemeExportInterface = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing themes from ${filePath}...`\n );\n await importThemes(themeExport);\n stopProgressIndicator(\n indicatorId,\n `Successfully imported ${Object.keys(themeExport.theme).length} themes.`\n );\n } catch (error) {\n printMessage(`Error importing themes: ${error}`, 'error');\n }\n}\n\n/**\n * Import themes from separate files\n */\nexport async function importThemesFromFiles() {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.theme.json'))\n .map((name) => getFilePath(name));\n\n const indicatorId = createProgressIndicator(\n 'determinate',\n jsonFiles.length,\n 'Importing themes...'\n );\n let fileData = null;\n let count = 0;\n let total = 0;\n let files = 0;\n for (const file of jsonFiles) {\n try {\n const data = fs.readFileSync(file, 'utf8');\n fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n count = Object.keys(fileData.theme).length;\n await importThemes(fileData);\n files += 1;\n total += count;\n updateProgressIndicator(\n indicatorId,\n `Imported ${count} theme(s) from ${file}`\n );\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n } catch (error) {\n updateProgressIndicator(\n indicatorId,\n `Error importing theme(s) from ${file}`\n );\n printMessage(error.response?.data || error, 'error');\n }\n }\n stopProgressIndicator(\n indicatorId,\n `Finished importing ${total} theme(s) from ${files} file(s).`\n );\n}\n\n/**\n * Import first theme from file\n * @param {String} file import file name\n */\nexport async function importFirstThemeFromFile(file) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const themeExport = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n 'Importing theme...'\n );\n for (const id of Object.keys(themeExport.theme)) {\n updateProgressIndicator(\n indicatorId,\n `Importing ${themeExport.theme[id].name}`\n );\n updateTheme(id, themeExport.theme[id]).then((result) => {\n if (result == null) {\n stopProgressIndicator(\n indicatorId,\n `Error importing theme ${themeExport.theme[id].name}`\n );\n printMessage(\n `Error importing theme ${themeExport.theme[id].name}`,\n 'error'\n );\n } else {\n stopProgressIndicator(\n indicatorId,\n `Successfully imported theme ${themeExport.theme[id].name}`\n );\n }\n });\n break;\n }\n } catch (error) {\n printMessage(`Error importing themes: ${error}`, 'error');\n }\n}\n\n/**\n * Delete theme by id\n * @param {String} id theme id\n */\nexport async function deleteThemeCmd(id) {\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${id}...`\n );\n try {\n await deleteTheme(id);\n stopProgressIndicator(indicatorId, `Deleted ${id}.`, 'success');\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete theme by name\n * @param {String} name theme name\n */\nexport async function deleteThemeByNameCmd(name) {\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${name}...`\n );\n try {\n await deleteThemeByName(name);\n stopProgressIndicator(indicatorId, `Deleted ${name}.`, 'success');\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all themes\n */\nexport async function deleteAllThemes() {\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all realm themes...`\n );\n try {\n await deleteThemes();\n stopProgressIndicator(indicatorId, `Deleted all realm themes.`, 'success');\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all themes\n * @deprecated since version 0.14.0\n */\nexport async function deleteThemesCmd() {\n return deleteAllThemes();\n}\n"],"mappings":"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"}
@@ -67,10 +67,20 @@ export async function getFullExportConfig(file = null) {
67
67
  if (!workingDirectory) {
68
68
  return await exportFullConfiguration({
69
69
  useStringArrays: true,
70
- noDecode: false
70
+ noDecode: false,
71
+ coords: true
71
72
  });
72
73
  }
73
- // Go through files in directory and reconstruct the full export
74
+ // Go through files in the working directory and reconstruct the full export
75
+ return getFullExportConfigFromDirectory(workingDirectory);
76
+ }
77
+
78
+ /**
79
+ * Reconstructs the full export config from files in the given directory
80
+ * @param directory The directory
81
+ * @return The full export config
82
+ */
83
+ export async function getFullExportConfigFromDirectory(directory) {
74
84
  const fullExportConfig = {
75
85
  meta: {},
76
86
  agents: {},
@@ -96,7 +106,7 @@ export async function getFullExportConfig(file = null) {
96
106
  trees: {},
97
107
  variables: {}
98
108
  };
99
- const files = await readFiles(workingDirectory);
109
+ const files = await readFiles(directory);
100
110
  const jsonFiles = files.filter(f => f.path.endsWith('.json'));
101
111
  const idmConfigFiles = jsonFiles.filter(f => f.path.startsWith('config/'));
102
112
  const samlFiles = jsonFiles.filter(f => f.path.startsWith('saml/') || f.path.startsWith('cot/'));
@@ -1 +1 @@
1
- {"version":3,"file":"Config.js","names":["frodo","state","fs","os","slugify","printMessage","getFilePath","readFiles","utils","exportFullConfiguration","config","getDefaultNoiseFilter","cloud","log","FRODO_CONFIG_PATH_KEY","FRODO_LOG_NOISEFILTER_FILENAME","getConfigPath","process","env","homedir","getCustomNoiseFilters","filename","noiseFilter","data","readFileSync","JSON","parse","e","message","getNoiseFilters","defaults","length","writeFileSync","stringify","getFullExportConfig","file","workingDirectory","getDirectory","useStringArrays","noDecode","fullExportConfig","meta","agents","application","authentication","emailTemplate","idp","managedApplication","policy","policyset","resourcetype","saml","hosted","remote","metadata","cot","script","secrets","service","theme","trees","variables","files","jsonFiles","filter","f","path","endsWith","idmConfigFiles","startsWith","samlFiles","otherFiles","scriptFiles","id","value","Object","entries","content","assign","_id","scriptExports","values","name","substring","lastIndexOf","indexOf","scriptLines","split","find","s","replace","remove","Error","isIdUsed","configuration","isEsv","isIdUsedRecurse","RegExp","replaceAll","regex","type","used","location","test"],"sources":["../../src/utils/Config.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { FullExportInterface } from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport fs from 'fs';\nimport os from 'os';\nimport slugify from 'slugify';\n\nimport { printMessage } from './Console';\n\nconst { getFilePath, readFiles } = frodo.utils;\n\nconst { exportFullConfiguration } = frodo.config;\n\nconst { getDefaultNoiseFilter } = frodo.cloud.log;\n\nexport const FRODO_CONFIG_PATH_KEY = 'FRODO_CONFIG_PATH';\nexport const FRODO_LOG_NOISEFILTER_FILENAME = 'LoggingNoiseFilter.json';\n\nexport function getConfigPath(): string {\n return process.env[FRODO_CONFIG_PATH_KEY] || `${os.homedir()}/.frodo`;\n}\n\nfunction getCustomNoiseFilters(): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n let noiseFilter = [];\n try {\n const data = fs.readFileSync(filename, 'utf8');\n noiseFilter = JSON.parse(data);\n } catch (e) {\n printMessage(`Error reading ${filename} (${e.message})`, 'error');\n }\n return noiseFilter;\n}\n\nexport function getNoiseFilters(defaults: boolean): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n if (defaults) {\n printMessage(`Using default logging noise filters.`, 'info');\n return getDefaultNoiseFilter();\n }\n let noiseFilter = getCustomNoiseFilters();\n if (noiseFilter.length == 0) {\n printMessage(`No custom noise filters defined. Using defaults.`, 'info');\n noiseFilter = getDefaultNoiseFilter();\n try {\n fs.writeFileSync(filename, JSON.stringify(noiseFilter, null, 2));\n printMessage(\n `The default filters were saved in ${filename}. You can change the filters as needed.`,\n 'info'\n );\n } catch (e) {\n printMessage(\n `Error creating noise filter configuration with default values.`,\n 'error'\n );\n }\n }\n return noiseFilter;\n}\n\n/**\n * Gets the full export config from one of three locations:\n * 1. The file passed into the function if one is provided.\n * 2. The working directory if it exists (provided by the user)\n * 3. The cloud tenant if the exports are not locally provided\n * @param file The optional file path\n * @returns The full export config\n */\nexport async function getFullExportConfig(\n file: string | null = null\n): Promise<FullExportInterface> {\n // Get export from file if it exists\n if (file) {\n return JSON.parse(fs.readFileSync(getFilePath(file), 'utf8'));\n }\n // If working directory doesn't exist, export from the cloud\n const workingDirectory = state.getDirectory();\n if (!workingDirectory) {\n return await exportFullConfiguration({\n useStringArrays: true,\n noDecode: false,\n });\n }\n // Go through files in directory and reconstruct the full export\n const fullExportConfig = {\n meta: {},\n agents: {},\n application: {},\n authentication: {},\n config: {},\n emailTemplate: {},\n idp: {},\n managedApplication: {},\n policy: {},\n policyset: {},\n resourcetype: {},\n saml: {\n hosted: {},\n remote: {},\n metadata: {},\n cot: {},\n },\n script: {},\n secrets: {},\n service: {},\n theme: {},\n trees: {},\n variables: {},\n } as FullExportInterface;\n const files = await readFiles(workingDirectory);\n const jsonFiles = files.filter((f) => f.path.endsWith('.json'));\n const idmConfigFiles = jsonFiles.filter((f) => f.path.startsWith('config/'));\n const samlFiles = jsonFiles.filter(\n (f) => f.path.startsWith('saml/') || f.path.startsWith('cot/')\n );\n const otherFiles = jsonFiles.filter(\n (f) =>\n !f.path.startsWith('config/') &&\n !f.path.startsWith('saml/') &&\n !f.path.startsWith('cot/')\n );\n const scriptFiles = files.filter(\n (f) => f.path.endsWith('.js') || f.path.endsWith('.groovy')\n );\n // Handle json files\n for (const f of otherFiles) {\n for (const [id, value] of Object.entries(JSON.parse(f.content))) {\n if (value == null || fullExportConfig[id] == null) {\n continue;\n }\n Object.assign(fullExportConfig[id], value);\n }\n }\n // Handle saml files\n for (const f of samlFiles) {\n let content = JSON.parse(f.content);\n content = content.saml;\n for (const [id, value] of Object.entries(content)) {\n Object.assign(fullExportConfig.saml[id], value);\n }\n }\n // Handle idm config files\n for (const f of idmConfigFiles) {\n const content = JSON.parse(f.content);\n fullExportConfig.config[content._id] = content;\n }\n // Handle extracted scripts, adding them to their corresponding script objects in the export\n if (scriptFiles.length > 0 && fullExportConfig.script != null) {\n const scriptExports = Object.values(fullExportConfig.script);\n for (const f of scriptFiles) {\n const name = f.path.substring(\n f.path.lastIndexOf('/') + 1,\n f.path.indexOf('.', f.path.lastIndexOf('/'))\n );\n const scriptLines = f.content.split('\\n');\n const script = scriptExports.find(\n (s) =>\n slugify(s.name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n }) === name\n );\n if (!script) {\n throw Error(\n `Can't find the script corresponding to the file '${f.path}' in the export files`\n );\n }\n script.script = scriptLines;\n }\n }\n return fullExportConfig;\n}\n\n/**\n * Determines if a string id is being used anywhere within the given configuration object\n * @param configuration The configuration object\n * @param id The id being search for\n * @param isEsv Whether the id corresponds to an ESV or not\n */\nexport function isIdUsed(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n id: string,\n isEsv: boolean\n): {\n used: boolean;\n location: string;\n} {\n return isIdUsedRecurse(\n configuration,\n isEsv\n ? // For ESV ids, they contain either letters, numbers, dashes, or underscores. The dashes get replaced with periods (escaped with a \\ for the regex)\n // since anywhere they are being used they will be used with periods, not dashes. Note that the (?:[^a-z0-9._]|$) expressions at the beginning and\n // end are meant to ensure that the id found is not a substring of some other id (i.e. the id found must either be at the beginning or end of the\n // string, or if in the middle of a string, is not preceded or followed by a character that would be part of another id).\n new RegExp(\n `(?:[^a-z0-9._]|^)${id.replaceAll('-', '\\\\.')}(?:[^a-z0-9._]|$)`\n )\n : // For normal ids, they contain only letters, numbers, or dashes.\n new RegExp(`(?:[^a-z0-9-]|^)${id}(?:[^a-z0-9-]|$)`)\n );\n}\n\n/**\n * Recursive helper for isIdUsed that finds any strings contained in the configuration that pass the regex\n * @param configuration The configuration (could be anything)\n * @param regex The regex test\n */\nfunction isIdUsedRecurse(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n regex: RegExp\n): {\n used: boolean;\n location: string;\n} {\n const type = typeof configuration;\n if (type === 'object' && configuration !== null) {\n for (const [id, value] of Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration as Record<string, any>\n )) {\n const isIdUsed = isIdUsedRecurse(value, regex);\n if (isIdUsed.used) {\n isIdUsed.location =\n id +\n (value.name ? `(name: '${value.name}')` : '') +\n (isIdUsed.location === '' ? '' : '.') +\n isIdUsed.location;\n return isIdUsed;\n }\n }\n }\n return {\n used: type === 'string' && regex.test(configuration),\n location: '',\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Config.js","names":["frodo","state","fs","os","slugify","printMessage","getFilePath","readFiles","utils","exportFullConfiguration","config","getDefaultNoiseFilter","cloud","log","FRODO_CONFIG_PATH_KEY","FRODO_LOG_NOISEFILTER_FILENAME","getConfigPath","process","env","homedir","getCustomNoiseFilters","filename","noiseFilter","data","readFileSync","JSON","parse","e","message","getNoiseFilters","defaults","length","writeFileSync","stringify","getFullExportConfig","file","workingDirectory","getDirectory","useStringArrays","noDecode","coords","getFullExportConfigFromDirectory","directory","fullExportConfig","meta","agents","application","authentication","emailTemplate","idp","managedApplication","policy","policyset","resourcetype","saml","hosted","remote","metadata","cot","script","secrets","service","theme","trees","variables","files","jsonFiles","filter","f","path","endsWith","idmConfigFiles","startsWith","samlFiles","otherFiles","scriptFiles","id","value","Object","entries","content","assign","_id","scriptExports","values","name","substring","lastIndexOf","indexOf","scriptLines","split","find","s","replace","remove","Error","isIdUsed","configuration","isEsv","isIdUsedRecurse","RegExp","replaceAll","regex","type","used","location","test"],"sources":["../../src/utils/Config.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { FullExportInterface } from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport fs from 'fs';\nimport os from 'os';\nimport slugify from 'slugify';\n\nimport { printMessage } from './Console';\n\nconst { getFilePath, readFiles } = frodo.utils;\n\nconst { exportFullConfiguration } = frodo.config;\n\nconst { getDefaultNoiseFilter } = frodo.cloud.log;\n\nexport const FRODO_CONFIG_PATH_KEY = 'FRODO_CONFIG_PATH';\nexport const FRODO_LOG_NOISEFILTER_FILENAME = 'LoggingNoiseFilter.json';\n\nexport function getConfigPath(): string {\n return process.env[FRODO_CONFIG_PATH_KEY] || `${os.homedir()}/.frodo`;\n}\n\nfunction getCustomNoiseFilters(): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n let noiseFilter = [];\n try {\n const data = fs.readFileSync(filename, 'utf8');\n noiseFilter = JSON.parse(data);\n } catch (e) {\n printMessage(`Error reading ${filename} (${e.message})`, 'error');\n }\n return noiseFilter;\n}\n\nexport function getNoiseFilters(defaults: boolean): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n if (defaults) {\n printMessage(`Using default logging noise filters.`, 'info');\n return getDefaultNoiseFilter();\n }\n let noiseFilter = getCustomNoiseFilters();\n if (noiseFilter.length == 0) {\n printMessage(`No custom noise filters defined. Using defaults.`, 'info');\n noiseFilter = getDefaultNoiseFilter();\n try {\n fs.writeFileSync(filename, JSON.stringify(noiseFilter, null, 2));\n printMessage(\n `The default filters were saved in ${filename}. You can change the filters as needed.`,\n 'info'\n );\n } catch (e) {\n printMessage(\n `Error creating noise filter configuration with default values.`,\n 'error'\n );\n }\n }\n return noiseFilter;\n}\n\n/**\n * Gets the full export config from one of three locations:\n * 1. The file passed into the function if one is provided.\n * 2. The working directory if it exists (provided by the user)\n * 3. The cloud tenant if the exports are not locally provided\n * @param file The optional file path\n * @returns The full export config\n */\nexport async function getFullExportConfig(\n file: string | null = null\n): Promise<FullExportInterface> {\n // Get export from file if it exists\n if (file) {\n return JSON.parse(fs.readFileSync(getFilePath(file), 'utf8'));\n }\n // If working directory doesn't exist, export from the cloud\n const workingDirectory = state.getDirectory();\n if (!workingDirectory) {\n return await exportFullConfiguration({\n useStringArrays: true,\n noDecode: false,\n coords: true,\n });\n }\n // Go through files in the working directory and reconstruct the full export\n return getFullExportConfigFromDirectory(workingDirectory);\n}\n\n/**\n * Reconstructs the full export config from files in the given directory\n * @param directory The directory\n * @return The full export config\n */\nexport async function getFullExportConfigFromDirectory(\n directory: string\n): Promise<FullExportInterface> {\n const fullExportConfig = {\n meta: {},\n agents: {},\n application: {},\n authentication: {},\n config: {},\n emailTemplate: {},\n idp: {},\n managedApplication: {},\n policy: {},\n policyset: {},\n resourcetype: {},\n saml: {\n hosted: {},\n remote: {},\n metadata: {},\n cot: {},\n },\n script: {},\n secrets: {},\n service: {},\n theme: {},\n trees: {},\n variables: {},\n } as FullExportInterface;\n const files = await readFiles(directory);\n const jsonFiles = files.filter((f) => f.path.endsWith('.json'));\n const idmConfigFiles = jsonFiles.filter((f) => f.path.startsWith('config/'));\n const samlFiles = jsonFiles.filter(\n (f) => f.path.startsWith('saml/') || f.path.startsWith('cot/')\n );\n const otherFiles = jsonFiles.filter(\n (f) =>\n !f.path.startsWith('config/') &&\n !f.path.startsWith('saml/') &&\n !f.path.startsWith('cot/')\n );\n const scriptFiles = files.filter(\n (f) => f.path.endsWith('.js') || f.path.endsWith('.groovy')\n );\n // Handle json files\n for (const f of otherFiles) {\n for (const [id, value] of Object.entries(JSON.parse(f.content))) {\n if (value == null || fullExportConfig[id] == null) {\n continue;\n }\n Object.assign(fullExportConfig[id], value);\n }\n }\n // Handle saml files\n for (const f of samlFiles) {\n let content = JSON.parse(f.content);\n content = content.saml;\n for (const [id, value] of Object.entries(content)) {\n Object.assign(fullExportConfig.saml[id], value);\n }\n }\n // Handle idm config files\n for (const f of idmConfigFiles) {\n const content = JSON.parse(f.content);\n fullExportConfig.config[content._id] = content;\n }\n // Handle extracted scripts, adding them to their corresponding script objects in the export\n if (scriptFiles.length > 0 && fullExportConfig.script != null) {\n const scriptExports = Object.values(fullExportConfig.script);\n for (const f of scriptFiles) {\n const name = f.path.substring(\n f.path.lastIndexOf('/') + 1,\n f.path.indexOf('.', f.path.lastIndexOf('/'))\n );\n const scriptLines = f.content.split('\\n');\n const script = scriptExports.find(\n (s) =>\n slugify(s.name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n }) === name\n );\n if (!script) {\n throw Error(\n `Can't find the script corresponding to the file '${f.path}' in the export files`\n );\n }\n script.script = scriptLines;\n }\n }\n return fullExportConfig;\n}\n\n/**\n * Determines if a string id is being used anywhere within the given configuration object\n * @param configuration The configuration object\n * @param id The id being search for\n * @param isEsv Whether the id corresponds to an ESV or not\n */\nexport function isIdUsed(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n id: string,\n isEsv: boolean\n): {\n used: boolean;\n location: string;\n} {\n return isIdUsedRecurse(\n configuration,\n isEsv\n ? // For ESV ids, they contain either letters, numbers, dashes, or underscores. The dashes get replaced with periods (escaped with a \\ for the regex)\n // since anywhere they are being used they will be used with periods, not dashes. Note that the (?:[^a-z0-9._]|$) expressions at the beginning and\n // end are meant to ensure that the id found is not a substring of some other id (i.e. the id found must either be at the beginning or end of the\n // string, or if in the middle of a string, is not preceded or followed by a character that would be part of another id).\n new RegExp(\n `(?:[^a-z0-9._]|^)${id.replaceAll('-', '\\\\.')}(?:[^a-z0-9._]|$)`\n )\n : // For normal ids, they contain only letters, numbers, or dashes.\n new RegExp(`(?:[^a-z0-9-]|^)${id}(?:[^a-z0-9-]|$)`)\n );\n}\n\n/**\n * Recursive helper for isIdUsed that finds any strings contained in the configuration that pass the regex\n * @param configuration The configuration (could be anything)\n * @param regex The regex test\n */\nfunction isIdUsedRecurse(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n regex: RegExp\n): {\n used: boolean;\n location: string;\n} {\n const type = typeof configuration;\n if (type === 'object' && configuration !== null) {\n for (const [id, value] of Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration as Record<string, any>\n )) {\n const isIdUsed = isIdUsedRecurse(value, regex);\n if (isIdUsed.used) {\n isIdUsed.location =\n id +\n (value.name ? `(name: '${value.name}')` : '') +\n (isIdUsed.location === '' ? '' : '.') +\n isIdUsed.location;\n return isIdUsed;\n }\n }\n }\n return {\n used: type === 'string' && regex.test(configuration),\n location: '',\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rockcarver/frodo-cli",
3
- "version": "2.0.0-40",
3
+ "version": "2.0.0-42",
4
4
  "type": "module",
5
5
  "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.",
6
6
  "keywords": [
@@ -116,7 +116,7 @@
116
116
  ]
117
117
  },
118
118
  "dependencies": {
119
- "@rockcarver/frodo-lib": "2.0.0-56",
119
+ "@rockcarver/frodo-lib": "2.0.0-58",
120
120
  "chokidar": "^3.5.3",
121
121
  "cli-progress": "^3.11.2",
122
122
  "cli-table3": "^0.6.3",