@rockcarver/frodo-cli 2.0.0-21 → 2.0.0-23

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 (50) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/esm/cli/FrodoCommand.js +3 -1
  3. package/esm/cli/FrodoCommand.js.map +1 -1
  4. package/esm/cli/agent/agent-web.js +2 -2
  5. package/esm/cli/agent/agent-web.js.map +1 -1
  6. package/esm/cli/app/app-import.js +1 -1
  7. package/esm/cli/app/app-import.js.map +1 -1
  8. package/esm/cli/idm/idm-export.js +14 -8
  9. package/esm/cli/idm/idm-export.js.map +1 -1
  10. package/esm/cli/idm/idm-import.js +14 -8
  11. package/esm/cli/idm/idm-import.js.map +1 -1
  12. package/esm/cli/journey/journey-export.js +2 -3
  13. package/esm/cli/journey/journey-export.js.map +1 -1
  14. package/esm/cli/oauth/oauth-client-import.js +1 -1
  15. package/esm/cli/oauth/oauth-client-import.js.map +1 -1
  16. package/esm/cli/service/service-import.js +2 -3
  17. package/esm/cli/service/service-import.js.map +1 -1
  18. package/esm/ops/AdminFederationOps.js +29 -20
  19. package/esm/ops/AdminFederationOps.js.map +1 -1
  20. package/esm/ops/AgentOps.js +41 -34
  21. package/esm/ops/AgentOps.js.map +1 -1
  22. package/esm/ops/ApplicationOps.js +23 -17
  23. package/esm/ops/ApplicationOps.js.map +1 -1
  24. package/esm/ops/CirclesOfTrustOps.js +27 -20
  25. package/esm/ops/CirclesOfTrustOps.js.map +1 -1
  26. package/esm/ops/EmailTemplateOps.js +19 -14
  27. package/esm/ops/EmailTemplateOps.js.map +1 -1
  28. package/esm/ops/IdmOps.js +14 -22
  29. package/esm/ops/IdmOps.js.map +1 -1
  30. package/esm/ops/IdpOps.js +27 -19
  31. package/esm/ops/IdpOps.js.map +1 -1
  32. package/esm/ops/JourneyOps.js +18 -51
  33. package/esm/ops/JourneyOps.js.map +1 -1
  34. package/esm/ops/OAuth2ClientOps.js +23 -17
  35. package/esm/ops/OAuth2ClientOps.js.map +1 -1
  36. package/esm/ops/PolicyOps.js +27 -20
  37. package/esm/ops/PolicyOps.js.map +1 -1
  38. package/esm/ops/PolicySetOps.js +23 -17
  39. package/esm/ops/PolicySetOps.js.map +1 -1
  40. package/esm/ops/ResourceTypeOps.js +27 -20
  41. package/esm/ops/ResourceTypeOps.js.map +1 -1
  42. package/esm/ops/Saml2Ops.js +22 -14
  43. package/esm/ops/Saml2Ops.js.map +1 -1
  44. package/esm/ops/ScriptOps.js +22 -15
  45. package/esm/ops/ScriptOps.js.map +1 -1
  46. package/esm/ops/ServiceOps.js +21 -16
  47. package/esm/ops/ServiceOps.js.map +1 -1
  48. package/esm/ops/ThemeOps.js +21 -15
  49. package/esm/ops/ThemeOps.js.map +1 -1
  50. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ScriptOps.js","names":["frodo","state","chokidar","fs","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","spinSpinner","stopProgressBar","succeedSpinner","updateProgressBar","getTypedFilename","saveJsonToFile","saveTextToFile","titleCase","wordwrap","readScripts","exportScript","exportScriptByName","exportScripts","importScripts","script","isBase64Encoded","utils","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","outcome","scripts","sort","a","b","localeCompare","table","forEach","push","toString","error","message","exportScriptToFile","scriptId","file","fileName","scriptExport","exportScriptByNameToFile","exportScriptsToFile","getRealm","exportScriptsToFiles","scriptList","length","exportScriptsToFilesExtract","fileExtension","scriptFileName","scriptSkeleton","getScriptSkeleton","scriptText","Array","isArray","isValidUrl","urlString","Boolean","URL","isScriptExtracted","importData","extracted","Object","keys","importScriptsFromFile","reUuid","readFile","err","data","JSON","parse","handleScriptFileImport","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","watcher","persistent","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","imported","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","readFileSync","startsWith","scriptExportRaw","getScriptId","scriptIds","Error"],"sources":["../../src/ops/ScriptOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi';\nimport { type ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\n\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n readScripts,\n exportScript,\n exportScriptByName,\n exportScripts,\n importScripts,\n} = frodo.script;\n\nconst { isBase64Encoded } = frodo.utils;\n\n/**\n * Get a one-line description of the script object\n * @param {ScriptSkeleton} scriptObj script object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(scriptObj: ScriptSkeleton): string {\n const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`;\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 | Language | Type | Id |\\n';\n markdown += '| ---- | -------- | ---- | ---|';\n return markdown;\n}\n\n/**\n * Get a one-line description of the script object in markdown\n * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe\n * @returns {string} markdown table row\n */\nexport function getTableRowMd(scriptObj: ScriptSkeleton): string {\n const langMap = { JAVASCRIPT: 'JavaSscript', GROOVY: 'Groovy' };\n const description = `| ${scriptObj.name} | ${\n langMap[scriptObj.language]\n } | ${titleCase(scriptObj.context.split('_').join(' '))} | \\`${\n scriptObj._id\n }\\` |`;\n return description;\n}\n\n/**\n * List scripts\n * @param {boolean} long detail list\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function listScripts(long = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n const scripts = await readScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n if (long) {\n const table = createTable([\n 'Name',\n 'UUID',\n 'Language',\n 'Context',\n 'Description',\n ]);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n table.push([\n wordwrap(script.name, 25, ' '),\n script._id,\n langMap[script.language],\n wordwrap(titleCase(script.context.split('_').join(' ')), 25),\n wordwrap(script.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n }\n } catch (error) {\n outcome = false;\n printMessage(`Error listing scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptToFile: start`);\n try {\n showSpinner(`Exporting script '${scriptId}'...`);\n let fileName = getTypedFilename(scriptId, 'script');\n if (file) {\n fileName = file;\n }\n spinSpinner(`Exporting script '${scriptId}' to '${fileName}'...`);\n const scriptExport = await exportScript(scriptId);\n saveJsonToFile(scriptExport, fileName);\n succeedSpinner(`Exported script '${scriptId}' to '${fileName}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [false]`);\n return false;\n}\n\n/**\n * Export script by name to file\n * @param {string} name script name\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);\n try {\n showSpinner(`Exporting script '${name}'...`);\n let fileName = getTypedFilename(name, 'script');\n if (file) {\n fileName = file;\n }\n spinSpinner(`Exporting script '${name}' to '${fileName}'...`);\n const scriptExport = await exportScriptByName(name);\n saveJsonToFile(scriptExport, fileName);\n succeedSpinner(`Exported script '${name}' to '${fileName}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: start`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Scripts`,\n 'script'\n );\n if (file) {\n fileName = file;\n }\n const scriptExport = await exportScripts();\n saveJsonToFile(scriptExport, fileName);\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);\n return true;\n } catch (error) {\n printMessage(`Error exporting scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFiles(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const scriptList = await readScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileName = getTypedFilename(script.name, 'script');\n const scriptExport = await exportScriptByName(script.name);\n saveJsonToFile(scriptExport, fileName);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);\n return outcome;\n}\n\nexport async function exportScriptsToFilesExtract(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: start`);\n const scriptList = await readScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileExtension = script.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n script.name,\n 'script',\n fileExtension\n );\n const fileName = getTypedFilename(script.name, 'script');\n\n const scriptExport = await exportScriptByName(script.name);\n\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n\n scriptSkeleton.script = `file://${scriptFileName}`;\n\n saveTextToFile(scriptText, scriptFileName);\n saveJsonToFile(scriptExport, fileName);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\nfunction isValidUrl(urlString: string): boolean {\n try {\n return Boolean(new URL(urlString));\n } catch (error) {\n return false;\n }\n}\n\nfunction isScriptExtracted(importData: ScriptExportInterface): boolean {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: start`);\n let extracted = true;\n for (const scriptId of Object.keys(importData.script)) {\n const script = importData.script[scriptId].script;\n if (Array.isArray(script)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is string array`);\n extracted = false;\n break;\n }\n if (isValidUrl(script as string)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is extracted`);\n extracted = true;\n break;\n }\n if (isBase64Encoded) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is base64-encoded`);\n extracted = false;\n break;\n }\n break;\n }\n debugMessage(`Cli.ScriptOps.isScriptExtracted: end [extracted=${extracted}]`);\n return extracted;\n}\n\n/**\n * Import script(s) from file\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {string} file file name\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScriptsFromFile(\n name: string,\n file: string,\n reUuid = false\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n fs.readFile(file, 'utf8', async (err, data) => {\n try {\n if (err) throw err;\n const importData: ScriptExportInterface = JSON.parse(data);\n if (isScriptExtracted(importData)) {\n await handleScriptFileImport(file, reUuid, false);\n } else {\n await importScripts(name, importData, reUuid);\n }\n outcome = true;\n } catch (error) {\n printMessage(\n `Error exporting script '${name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n });\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param watch whether or not to watch for file changes\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n reUuid: boolean,\n validateScripts: boolean\n) {\n // If watch is true, it doesn't make sense to reUuid.\n reUuid = watch ? false : reUuid;\n\n /**\n * Run on file change detection, as well as on initial run.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async function onChange(path: string, _stats?: fs.Stats): Promise<void> {\n try {\n await handleScriptFileImport(path, reUuid, validateScripts);\n } catch (error) {\n printMessage(`${path}: ${error.message}`, 'error');\n }\n }\n\n // We watch json files and script files.\n const watcher = chokidar.watch(\n [`./**/*.script.json`, `./**/*.script.js`, `./**/*.script.groovy`],\n {\n persistent: watch,\n }\n );\n\n watcher\n .on('add', onChange)\n .on('change', onChange)\n .on('error', (error) => {\n printMessage(`Watcher error: ${error}`, 'error');\n watcher.close();\n })\n .on('ready', () => {\n if (watch) {\n printMessage('Watching for changes...');\n } else {\n watcher.close();\n printMessage('Done.');\n }\n });\n}\n\n/**\n * Handle a script file import.\n *\n * @param file Either a script file or an extract file\n * @param reUuid whether or not to generate a new uuid for each script on import\n */\nasync function handleScriptFileImport(\n file: string,\n reUuid: boolean,\n validateScripts: boolean\n) {\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: start`);\n const scriptFile = getScriptFile(file);\n const script = getScriptExportByScriptFile(scriptFile);\n\n const imported = await importScripts('', script, reUuid, validateScripts);\n if (imported) {\n printMessage(`Imported '${scriptFile}'`);\n }\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: end`);\n}\n\n/**\n * Get a script file from a file.\n *\n * @param file Either a script file or an extract file\n * @returns The script file\n */\nfunction getScriptFile(file: string) {\n if (file.endsWith('.script.json')) {\n return file;\n }\n return file.replace(/\\.script\\.(js|groovy)/, '.script.json');\n}\n\n/**\n * Get a script export from a script file.\n *\n * @param scriptFile The path to the script file\n * @returns The script export\n */\nfunction getScriptExportByScriptFile(\n scriptFile: string\n): ScriptExportInterface {\n const scriptExport = getScriptExport(scriptFile);\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const extractFile = getExtractFile(scriptSkeleton);\n if (!extractFile) {\n return scriptExport;\n }\n\n const scriptRaw = fs.readFileSync(extractFile, 'utf8');\n scriptSkeleton.script = scriptRaw.split('\\n');\n\n return scriptExport;\n}\n\n/**\n * Get an extract file from a script skeleton.\n *\n * @param scriptSkeleton The script skeleton\n * @returns The extract file or null if there is no extract file\n */\nfunction getExtractFile(scriptSkeleton: ScriptSkeleton): string | null {\n const extractFile = scriptSkeleton.script;\n if (Array.isArray(extractFile)) {\n return null;\n }\n if (\n extractFile.startsWith('file://') &&\n (extractFile.endsWith('.js') || extractFile.endsWith('.groovy'))\n ) {\n return extractFile.replace('file://', '');\n }\n return null;\n}\n\n/**\n * Get a script export from a file.\n *\n * @param file The path to a script export file\n * @returns The script export\n */\nfunction getScriptExport(file: string): ScriptExportInterface {\n const scriptExportRaw = fs.readFileSync(file, 'utf8');\n const scriptExport = JSON.parse(scriptExportRaw) as ScriptExportInterface;\n\n return scriptExport;\n}\n\n/**\n * Get the main script skeleton from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script Get the main script skeleton from a script export\n * @returns The main script skeleton\n */\nfunction getScriptSkeleton(script: ScriptExportInterface): ScriptSkeleton {\n const scriptId = getScriptId(script);\n return script.script[scriptId];\n}\n\n/**\n * Get the main script ID from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script The script export\n * @returns The main script ID\n */\nfunction getScriptId(script: ScriptExportInterface): string {\n const scriptIds = Object.keys(script.script);\n if (scriptIds.length !== 1) {\n throw new Error(`Expected 1 script, found ${scriptIds.length}`);\n }\n return scriptIds[0];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScriptOps.js","names":["frodo","state","chokidar","fs","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","spinSpinner","stopProgressBar","succeedSpinner","updateProgressBar","getTypedFilename","saveJsonToFile","saveTextToFile","titleCase","wordwrap","readScripts","exportScript","exportScriptByName","exportScripts","importScripts","script","isBase64Encoded","getFilePath","getWorkingDirectory","utils","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","outcome","scripts","sort","a","b","localeCompare","table","forEach","push","toString","error","message","exportScriptToFile","scriptId","file","fileName","filePath","scriptExport","exportScriptByNameToFile","exportScriptsToFile","getRealm","exportScriptsToFiles","scriptList","length","exportScriptsToFilesExtract","fileExtension","scriptFileName","scriptFilePath","scriptSkeleton","getScriptSkeleton","scriptText","Array","isArray","isValidUrl","urlString","Boolean","URL","isScriptExtracted","importData","extracted","Object","keys","importScriptsFromFile","reUuid","readFile","err","data","JSON","parse","handleScriptFileImport","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","watcher","persistent","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","imported","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","readFileSync","startsWith","scriptExportRaw","getScriptId","scriptIds","Error"],"sources":["../../src/ops/ScriptOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi';\nimport { type ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\n\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n readScripts,\n exportScript,\n exportScriptByName,\n exportScripts,\n importScripts,\n} = frodo.script;\n\nconst { isBase64Encoded, getFilePath, getWorkingDirectory } = frodo.utils;\n\n/**\n * Get a one-line description of the script object\n * @param {ScriptSkeleton} scriptObj script object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(scriptObj: ScriptSkeleton): string {\n const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`;\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 | Language | Type | Id |\\n';\n markdown += '| ---- | -------- | ---- | ---|';\n return markdown;\n}\n\n/**\n * Get a one-line description of the script object in markdown\n * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe\n * @returns {string} markdown table row\n */\nexport function getTableRowMd(scriptObj: ScriptSkeleton): string {\n const langMap = { JAVASCRIPT: 'JavaSscript', GROOVY: 'Groovy' };\n const description = `| ${scriptObj.name} | ${\n langMap[scriptObj.language]\n } | ${titleCase(scriptObj.context.split('_').join(' '))} | \\`${\n scriptObj._id\n }\\` |`;\n return description;\n}\n\n/**\n * List scripts\n * @param {boolean} long detail list\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function listScripts(long = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n const scripts = await readScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n if (long) {\n const table = createTable([\n 'Name',\n 'UUID',\n 'Language',\n 'Context',\n 'Description',\n ]);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n table.push([\n wordwrap(script.name, 25, ' '),\n script._id,\n langMap[script.language],\n wordwrap(titleCase(script.context.split('_').join(' ')), 25),\n wordwrap(script.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n }\n } catch (error) {\n outcome = false;\n printMessage(`Error listing scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptToFile: start`);\n try {\n showSpinner(`Exporting script '${scriptId}'...`);\n let fileName = getTypedFilename(scriptId, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${scriptId}' to '${filePath}'...`);\n const scriptExport = await exportScript(scriptId);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${scriptId}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [false]`);\n return false;\n}\n\n/**\n * Export script by name to file\n * @param {string} name script name\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);\n try {\n showSpinner(`Exporting script '${name}'...`);\n let fileName = getTypedFilename(name, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${name}' to '${filePath}'...`);\n const scriptExport = await exportScriptByName(name);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${name}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: start`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Scripts`,\n 'script'\n );\n if (file) {\n fileName = file;\n }\n const scriptExport = await exportScripts();\n saveJsonToFile(scriptExport, getFilePath(fileName, true));\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);\n return true;\n } catch (error) {\n printMessage(`Error exporting scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFiles(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const scriptList = await readScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileName = getTypedFilename(script.name, 'script');\n const scriptExport = await exportScriptByName(script.name);\n saveJsonToFile(scriptExport, getFilePath(fileName, true));\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);\n return outcome;\n}\n\nexport async function exportScriptsToFilesExtract(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: start`);\n const scriptList = await readScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileExtension = script.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n script.name,\n 'script',\n fileExtension\n );\n const scriptFilePath = getFilePath(scriptFileName, true);\n const fileName = getTypedFilename(script.name, 'script');\n const filePath = getFilePath(fileName, true);\n\n const scriptExport = await exportScriptByName(script.name);\n\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n\n scriptSkeleton.script = `file://${scriptFilePath}`;\n\n saveTextToFile(scriptText, scriptFilePath);\n saveJsonToFile(scriptExport, filePath);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\nfunction isValidUrl(urlString: string): boolean {\n try {\n return Boolean(new URL(urlString));\n } catch (error) {\n return false;\n }\n}\n\nfunction isScriptExtracted(importData: ScriptExportInterface): boolean {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: start`);\n let extracted = true;\n for (const scriptId of Object.keys(importData.script)) {\n const script = importData.script[scriptId].script;\n if (Array.isArray(script)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is string array`);\n extracted = false;\n break;\n }\n if (isValidUrl(script as string)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is extracted`);\n extracted = true;\n break;\n }\n if (isBase64Encoded) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is base64-encoded`);\n extracted = false;\n break;\n }\n break;\n }\n debugMessage(`Cli.ScriptOps.isScriptExtracted: end [extracted=${extracted}]`);\n return extracted;\n}\n\n/**\n * Import script(s) from file\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {string} file file name\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScriptsFromFile(\n name: string,\n file: string,\n reUuid = false\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n fs.readFile(filePath, 'utf8', async (err, data) => {\n try {\n if (err) throw err;\n const importData: ScriptExportInterface = JSON.parse(data);\n if (isScriptExtracted(importData)) {\n await handleScriptFileImport(filePath, reUuid, false);\n } else {\n await importScripts(name, importData, reUuid);\n }\n outcome = true;\n } catch (error) {\n printMessage(\n `Error exporting script '${name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n });\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param watch whether or not to watch for file changes\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n reUuid: boolean,\n validateScripts: boolean\n) {\n // If watch is true, it doesn't make sense to reUuid.\n reUuid = watch ? false : reUuid;\n\n /**\n * Run on file change detection, as well as on initial run.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async function onChange(path: string, _stats?: fs.Stats): Promise<void> {\n try {\n await handleScriptFileImport(path, reUuid, validateScripts);\n } catch (error) {\n printMessage(`${path}: ${error.message}`, 'error');\n }\n }\n\n // We watch json files and script files.\n const watcher = chokidar.watch(\n [\n `${getWorkingDirectory()}/**/*.script.json`,\n `${getWorkingDirectory()}/**/*.script.js`,\n `${getWorkingDirectory()}/**/*.script.groovy`,\n ],\n {\n persistent: watch,\n }\n );\n\n watcher\n .on('add', onChange)\n .on('change', onChange)\n .on('error', (error) => {\n printMessage(`Watcher error: ${error}`, 'error');\n watcher.close();\n })\n .on('ready', () => {\n if (watch) {\n printMessage('Watching for changes...');\n } else {\n watcher.close();\n printMessage('Done.');\n }\n });\n}\n\n/**\n * Handle a script file import.\n *\n * @param file Either a script file or an extract file\n * @param reUuid whether or not to generate a new uuid for each script on import\n */\nasync function handleScriptFileImport(\n file: string,\n reUuid: boolean,\n validateScripts: boolean\n) {\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: start`);\n const scriptFile = getScriptFile(file);\n const script = getScriptExportByScriptFile(scriptFile);\n\n const imported = await importScripts('', script, reUuid, validateScripts);\n if (imported) {\n printMessage(`Imported '${scriptFile}'`);\n }\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: end`);\n}\n\n/**\n * Get a script file from a file.\n *\n * @param file Either a script file or an extract file\n * @returns The script file\n */\nfunction getScriptFile(file: string) {\n if (file.endsWith('.script.json')) {\n return file;\n }\n return file.replace(/\\.script\\.(js|groovy)/, '.script.json');\n}\n\n/**\n * Get a script export from a script file.\n *\n * @param scriptFile The path to the script file\n * @returns The script export\n */\nfunction getScriptExportByScriptFile(\n scriptFile: string\n): ScriptExportInterface {\n const scriptExport = getScriptExport(scriptFile);\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const extractFile = getExtractFile(scriptSkeleton);\n if (!extractFile) {\n return scriptExport;\n }\n\n const scriptRaw = fs.readFileSync(extractFile, 'utf8');\n scriptSkeleton.script = scriptRaw.split('\\n');\n\n return scriptExport;\n}\n\n/**\n * Get an extract file from a script skeleton.\n *\n * @param scriptSkeleton The script skeleton\n * @returns The extract file or null if there is no extract file\n */\nfunction getExtractFile(scriptSkeleton: ScriptSkeleton): string | null {\n const extractFile = scriptSkeleton.script;\n if (Array.isArray(extractFile)) {\n return null;\n }\n if (\n extractFile.startsWith('file://') &&\n (extractFile.endsWith('.js') || extractFile.endsWith('.groovy'))\n ) {\n return extractFile.replace('file://', '');\n }\n return null;\n}\n\n/**\n * Get a script export from a file.\n *\n * @param file The path to a script export file\n * @returns The script export\n */\nfunction getScriptExport(file: string): ScriptExportInterface {\n const scriptExportRaw = fs.readFileSync(file, 'utf8');\n const scriptExport = JSON.parse(scriptExportRaw) as ScriptExportInterface;\n\n return scriptExport;\n}\n\n/**\n * Get the main script skeleton from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script Get the main script skeleton from a script export\n * @returns The main script skeleton\n */\nfunction getScriptSkeleton(script: ScriptExportInterface): ScriptSkeleton {\n const scriptId = getScriptId(script);\n return script.script[scriptId];\n}\n\n/**\n * Get the main script ID from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script The script export\n * @returns The main script ID\n */\nfunction getScriptId(script: ScriptExportInterface): string {\n const scriptIds = Object.keys(script.script);\n if (scriptIds.length !== 1) {\n throw new Error(`Expected 1 script, found ${scriptIds.length}`);\n }\n return scriptIds[0];\n}\n"],"mappings":"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"}
@@ -8,6 +8,7 @@ const {
8
8
  getTypedFilename,
9
9
  titleCase,
10
10
  saveJsonToFile,
11
+ getFilePath,
11
12
  getWorkingDirectory
12
13
  } = frodo.utils;
13
14
  const {
@@ -56,7 +57,7 @@ export async function exportServicesToFile(file, globalConfig = false) {
56
57
  if (file) {
57
58
  fileName = file;
58
59
  }
59
- saveJsonToFile(exportData, fileName);
60
+ saveJsonToFile(exportData, getFilePath(fileName, true));
60
61
  }
61
62
 
62
63
  /**
@@ -70,7 +71,7 @@ export async function exportServiceToFile(serviceId, file, globalConfig = false)
70
71
  if (file) {
71
72
  fileName = file;
72
73
  }
73
- saveJsonToFile(exportData, fileName);
74
+ saveJsonToFile(exportData, getFilePath(fileName, true));
74
75
  }
75
76
 
76
77
  /**
@@ -81,10 +82,11 @@ export async function exportServicesToFiles(globalConfig = false) {
81
82
  const services = await getFullServices(globalConfig);
82
83
  for (const service of services) {
83
84
  const fileName = getTypedFilename(service._type._id, `service`);
85
+ const filePath = getFilePath(fileName, true);
84
86
  const exportData = createServiceExportTemplate();
85
87
  exportData.service[service._type._id] = service;
86
- debugMessage(`cli.ServiceOps.exportServicesToFiles: exporting ${service._type._id} to ${fileName}`);
87
- saveJsonToFile(exportData, fileName);
88
+ debugMessage(`cli.ServiceOps.exportServicesToFiles: exporting ${service._type._id} to ${filePath}`);
89
+ saveJsonToFile(exportData, filePath);
88
90
  }
89
91
  debugMessage(`cli.ServiceOps.exportServicesToFiles: end.`);
90
92
  }
@@ -96,9 +98,10 @@ export async function exportServicesToFiles(globalConfig = false) {
96
98
  * @param {boolean} clean remove existing service
97
99
  */
98
100
  export async function importServiceFromFile(serviceId, file, clean, globalConfig = false) {
99
- debugMessage(`cli.ServiceOps.importServiceFromFile: start [serviceId=${serviceId}, file=${file}]`);
101
+ const filePath = getFilePath(file);
102
+ debugMessage(`cli.ServiceOps.importServiceFromFile: start [serviceId=${serviceId}, file=${filePath}]`);
100
103
  const verbose = state.getVerbose();
101
- fs.readFile(file, 'utf8', async (err, data) => {
104
+ fs.readFile(filePath, 'utf8', async (err, data) => {
102
105
  if (err) throw err;
103
106
  const importData = JSON.parse(data);
104
107
  if (importData && importData.service[serviceId]) {
@@ -119,7 +122,7 @@ export async function importServiceFromFile(serviceId, file, clean, globalConfig
119
122
  failSpinner(`${serviceId} not found!`);
120
123
  }
121
124
  });
122
- debugMessage(`cli.ServiceOps.importServiceFromFile: end [serviceId=${serviceId}, file=${file}]`);
125
+ debugMessage(`cli.ServiceOps.importServiceFromFile: end [serviceId=${serviceId}, file=${filePath}]`);
123
126
  }
124
127
 
125
128
  /**
@@ -128,9 +131,10 @@ export async function importServiceFromFile(serviceId, file, clean, globalConfig
128
131
  * @param {boolean} clean remove existing service
129
132
  */
130
133
  export async function importFirstServiceFromFile(file, clean, globalConfig = false) {
131
- debugMessage(`cli.ServiceOps.importFirstServiceFromFile: start [file=${file}]`);
134
+ const filePath = getFilePath(file);
135
+ debugMessage(`cli.ServiceOps.importFirstServiceFromFile: start [file=${filePath}]`);
132
136
  const verbose = state.getVerbose();
133
- fs.readFile(file, 'utf8', async (err, data) => {
137
+ fs.readFile(filePath, 'utf8', async (err, data) => {
134
138
  if (err) throw err;
135
139
  const importData = JSON.parse(data);
136
140
  if (importData && Object.keys(importData.service).length) {
@@ -149,9 +153,9 @@ export async function importFirstServiceFromFile(file, clean, globalConfig = fal
149
153
  }
150
154
  } else {
151
155
  showSpinner(`Importing service...`);
152
- failSpinner(`No service found in ${file}!`);
156
+ failSpinner(`No service found in ${filePath}!`);
153
157
  }
154
- debugMessage(`cli.ServiceOps.importFirstServiceFromFile: end [file=${file}]`);
158
+ debugMessage(`cli.ServiceOps.importFirstServiceFromFile: end [file=${filePath}]`);
155
159
  });
156
160
  }
157
161
 
@@ -161,10 +165,11 @@ export async function importFirstServiceFromFile(file, clean, globalConfig = fal
161
165
  * @param {boolean} clean remove existing service
162
166
  */
163
167
  export async function importServicesFromFile(file, clean, globalConfig = false) {
164
- debugMessage(`cli.ServiceOps.importServiceFromFile: start [file=${file}]`);
165
- fs.readFile(file, 'utf8', async (err, data) => {
168
+ const filePath = getFilePath(file);
169
+ debugMessage(`cli.ServiceOps.importServiceFromFile: start [file=${filePath}]`);
170
+ fs.readFile(filePath, 'utf8', async (err, data) => {
166
171
  if (err) throw err;
167
- debugMessage(`cli.ServiceOps.importServiceFromFile: importing ${file}`);
172
+ debugMessage(`cli.ServiceOps.importServiceFromFile: importing ${filePath}`);
168
173
  const importData = JSON.parse(data);
169
174
  try {
170
175
  await importServices(importData, clean, globalConfig);
@@ -172,7 +177,7 @@ export async function importServicesFromFile(file, clean, globalConfig = false)
172
177
  printMessage(`${error.message}`, 'error');
173
178
  printMessage(error.response.status, 'error');
174
179
  }
175
- debugMessage(`cli.ServiceOps.importServiceFromFile: end [file=${file}]`);
180
+ debugMessage(`cli.ServiceOps.importServiceFromFile: end [file=${filePath}]`);
176
181
  });
177
182
  }
178
183
 
@@ -183,7 +188,7 @@ export async function importServicesFromFile(file, clean, globalConfig = false)
183
188
  export async function importServicesFromFiles(clean, globalConfig = false) {
184
189
  debugMessage(`cli.ServiceOps.importServicesFromFiles: start`);
185
190
  const names = fs.readdirSync(getWorkingDirectory());
186
- const agentFiles = names.filter(name => name.toLowerCase().endsWith('.service.json'));
191
+ const agentFiles = names.filter(name => name.toLowerCase().endsWith('.service.json')).map(name => getFilePath(name));
187
192
  for (const file of agentFiles) {
188
193
  await importServicesFromFile(file, clean, globalConfig);
189
194
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceOps.js","names":["frodo","state","fs","createTable","debugMessage","failSpinner","printMessage","showSpinner","succeedSpinner","getRealmName","utils","getTypedFilename","titleCase","saveJsonToFile","getWorkingDirectory","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","exportData","fileName","getRealm","exportServiceToFile","serviceId","exportServicesToFiles","_type","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","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 { getRealmName } = frodo.utils;\nconst { getTypedFilename, titleCase, saveJsonToFile, 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 */\nexport async function exportServicesToFile(file, globalConfig = false) {\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, fileName);\n}\n\n/**\n * Export service to file\n * @param {string} serviceId service id\n * @param {string} file file name\n */\nexport async function exportServiceToFile(\n serviceId: string,\n file: string,\n globalConfig = false\n) {\n const exportData = await exportService(serviceId, globalConfig);\n let fileName = getTypedFilename(serviceId, `service`);\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, fileName);\n}\n\n/**\n * Export all services to separate files\n */\nexport async function exportServicesToFiles(globalConfig = false) {\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 exportData = createServiceExportTemplate();\n exportData.service[service._type._id] = service;\n debugMessage(\n `cli.ServiceOps.exportServicesToFiles: exporting ${service._type._id} to ${fileName}`\n );\n saveJsonToFile(exportData, fileName);\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 debugMessage(\n `cli.ServiceOps.importServiceFromFile: start [serviceId=${serviceId}, file=${file}]`\n );\n const verbose = state.getVerbose();\n fs.readFile(file, '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=${file}]`\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 debugMessage(\n `cli.ServiceOps.importFirstServiceFromFile: start [file=${file}]`\n );\n const verbose = state.getVerbose();\n fs.readFile(file, '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 ${file}!`);\n }\n debugMessage(\n `cli.ServiceOps.importFirstServiceFromFile: end [file=${file}]`\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 debugMessage(`cli.ServiceOps.importServiceFromFile: start [file=${file}]`);\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n debugMessage(`cli.ServiceOps.importServiceFromFile: importing ${file}`);\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(`cli.ServiceOps.importServiceFromFile: end [file=${file}]`);\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.filter((name) =>\n name.toLowerCase().endsWith('.service.json')\n );\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","utils","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","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","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 { getRealmName } = frodo.utils;\nconst {\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 */\nexport async function exportServicesToFile(file, globalConfig = false) {\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));\n}\n\n/**\n * Export service to file\n * @param {string} serviceId service id\n * @param {string} file file name\n */\nexport async function exportServiceToFile(\n serviceId: string,\n file: string,\n globalConfig = false\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));\n}\n\n/**\n * Export all services to separate files\n */\nexport async function exportServicesToFiles(globalConfig = false) {\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);\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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"}
@@ -5,7 +5,9 @@ import { createProgressIndicator, createTable, printMessage, stopProgressIndicat
5
5
  import { getTypedFilename, saveToFile } from '../utils/ExportImportUtils';
6
6
  const {
7
7
  getRealmString,
8
- validateImport
8
+ validateImport,
9
+ getFilePath,
10
+ getWorkingDirectory
9
11
  } = frodo.utils;
10
12
  const {
11
13
  readThemes,
@@ -80,12 +82,13 @@ export async function exportThemeByName(name, file) {
80
82
  if (file) {
81
83
  fileName = file;
82
84
  }
85
+ const filePath = getFilePath(fileName, true);
83
86
  createProgressIndicator('determinate', 1, `Exporting ${name}`);
84
87
  try {
85
88
  const themeData = await readThemeByName(name);
86
89
  if (!themeData._id) themeData._id = uuidv4();
87
- updateProgressIndicator(`Writing file ${fileName}`);
88
- saveToFile('theme', [themeData], '_id', fileName);
90
+ updateProgressIndicator(`Writing file to ${filePath}`);
91
+ saveToFile('theme', [themeData], '_id', filePath);
89
92
  stopProgressIndicator(`Successfully exported theme ${name}.`);
90
93
  } catch (error) {
91
94
  stopProgressIndicator(`${error.message}`);
@@ -103,11 +106,12 @@ export async function exportThemeById(id, file) {
103
106
  if (file) {
104
107
  fileName = file;
105
108
  }
109
+ const filePath = getFilePath(fileName, true);
106
110
  createProgressIndicator('determinate', 1, `Exporting ${id}`);
107
111
  try {
108
112
  const themeData = await readTheme(id);
109
- updateProgressIndicator(`Writing file ${fileName}`);
110
- saveToFile('theme', [themeData], '_id', fileName);
113
+ updateProgressIndicator(`Writing file to ${filePath}`);
114
+ saveToFile('theme', [themeData], '_id', filePath);
111
115
  stopProgressIndicator(`Successfully exported theme ${id}.`);
112
116
  } catch (error) {
113
117
  stopProgressIndicator(`${error.message}`);
@@ -124,14 +128,15 @@ export async function exportThemesToFile(file) {
124
128
  if (file) {
125
129
  fileName = file;
126
130
  }
131
+ const filePath = getFilePath(fileName, true);
127
132
  const allThemesData = await readThemes();
128
133
  createProgressIndicator('determinate', allThemesData.length, 'Exporting themes');
129
134
  for (const themeData of allThemesData) {
130
135
  if (!themeData._id) themeData._id = uuidv4();
131
136
  updateProgressIndicator(`Exporting theme ${themeData.name}`);
132
137
  }
133
- saveToFile('theme', allThemesData, '_id', fileName);
134
- stopProgressIndicator(`${allThemesData.length} themes exported to ${fileName}.`);
138
+ saveToFile('theme', allThemesData, '_id', filePath);
139
+ stopProgressIndicator(`${allThemesData.length} themes exported to ${filePath}.`);
135
140
  }
136
141
 
137
142
  /**
@@ -144,7 +149,7 @@ export async function exportThemesToFiles() {
144
149
  if (!themeData._id) themeData._id = uuidv4();
145
150
  updateProgressIndicator(`Writing theme ${themeData.name}`);
146
151
  const fileName = getTypedFilename(themeData.name, 'theme');
147
- saveToFile('theme', themeData, '_id', fileName);
152
+ saveToFile('theme', themeData, '_id', getFilePath(fileName, true));
148
153
  }
149
154
  stopProgressIndicator(`${allThemesData.length} themes exported.`);
150
155
  }
@@ -155,7 +160,7 @@ export async function exportThemesToFiles() {
155
160
  * @param {String} file import file name
156
161
  */
157
162
  export async function importThemeByName(name, file) {
158
- fs.readFile(file, 'utf8', async (err, data) => {
163
+ fs.readFile(getFilePath(file), 'utf8', async (err, data) => {
159
164
  if (err) throw err;
160
165
  const themeData = JSON.parse(data);
161
166
  if (validateImport(themeData.meta)) {
@@ -192,7 +197,7 @@ export async function importThemeByName(name, file) {
192
197
  * @param {String} file import file name
193
198
  */
194
199
  export async function importThemeById(id, file) {
195
- fs.readFile(file, 'utf8', async (err, data) => {
200
+ fs.readFile(getFilePath(file), 'utf8', async (err, data) => {
196
201
  if (err) throw err;
197
202
  const themeData = JSON.parse(data);
198
203
  if (validateImport(themeData.meta)) {
@@ -228,7 +233,8 @@ export async function importThemeById(id, file) {
228
233
  * @param {String} file import file name
229
234
  */
230
235
  export async function importThemesFromFile(file) {
231
- fs.readFile(file, 'utf8', (err, data) => {
236
+ const filePath = getFilePath(file);
237
+ fs.readFile(filePath, 'utf8', (err, data) => {
232
238
  if (err) throw err;
233
239
  const fileData = JSON.parse(data);
234
240
  if (validateImport(fileData.meta)) {
@@ -241,7 +247,7 @@ export async function importThemesFromFile(file) {
241
247
  updateThemes(fileData.theme).then(result => {
242
248
  if (result == null) {
243
249
  stopProgressIndicator(`Error importing ${Object.keys(fileData.theme).length} themes!`);
244
- printMessage(`Error importing ${Object.keys(fileData.theme).length} themes from ${file}`, 'error');
250
+ printMessage(`Error importing ${Object.keys(fileData.theme).length} themes from ${filePath}`, 'error');
245
251
  } else {
246
252
  stopProgressIndicator(`Successfully imported ${Object.keys(fileData.theme).length} themes.`);
247
253
  }
@@ -256,8 +262,8 @@ export async function importThemesFromFile(file) {
256
262
  * Import themes from separate files
257
263
  */
258
264
  export async function importThemesFromFiles() {
259
- const names = fs.readdirSync('.');
260
- const jsonFiles = names.filter(name => name.toLowerCase().endsWith('.theme.json'));
265
+ const names = fs.readdirSync(getWorkingDirectory());
266
+ const jsonFiles = names.filter(name => name.toLowerCase().endsWith('.theme.json')).map(name => getFilePath(name));
261
267
  createProgressIndicator('determinate', jsonFiles.length, 'Importing themes...');
262
268
  let fileData = null;
263
269
  let count = 0;
@@ -289,7 +295,7 @@ export async function importThemesFromFiles() {
289
295
  * @param {String} file import file name
290
296
  */
291
297
  export async function importFirstThemeFromFile(file) {
292
- fs.readFile(file, 'utf8', (err, data) => {
298
+ fs.readFile(getFilePath(file), 'utf8', (err, data) => {
293
299
  if (err) throw err;
294
300
  const themeData = JSON.parse(data);
295
301
  if (validateImport(themeData.meta)) {
@@ -1 +1 @@
1
- {"version":3,"file":"ThemeOps.js","names":["frodo","fs","v4","uuidv4","createProgressIndicator","createTable","printMessage","stopProgressIndicator","updateProgressIndicator","getTypedFilename","saveToFile","getRealmString","validateImport","utils","readThemes","readThemeByName","readTheme","updateThemeByName","updateTheme","updateThemes","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","fileName","themeData","error","message","exportThemeById","id","exportThemesToFile","allThemesData","length","exportThemesToFiles","importThemeByName","readFile","err","data","JSON","parse","meta","found","hasOwnProperty","call","importThemeById","themeId","importThemesFromFile","fileData","Object","keys","then","result","importThemesFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","count","total","files","readFileSync","importFirstThemeFromFile","deleteThemeCmd","undefined","deleteThemeByNameCmd","deleteAllThemes","deleteThemesCmd"],"sources":["../../src/ops/ThemeOps.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { type ThemeSkeleton } 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';\nimport { getTypedFilename, saveToFile } from '../utils/ExportImportUtils';\n\nconst { getRealmString, validateImport } = frodo.utils;\nconst {\n readThemes,\n readThemeByName,\n readTheme,\n updateThemeByName,\n updateTheme,\n updateThemes,\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 */\nexport async function exportThemeByName(name, file) {\n let fileName = getTypedFilename(name, 'theme');\n if (file) {\n fileName = file;\n }\n createProgressIndicator('determinate', 1, `Exporting ${name}`);\n try {\n const themeData = await readThemeByName(name);\n if (!themeData._id) themeData._id = uuidv4();\n updateProgressIndicator(`Writing file ${fileName}`);\n saveToFile('theme', [themeData], '_id', fileName);\n stopProgressIndicator(`Successfully exported theme ${name}.`);\n } catch (error) {\n stopProgressIndicator(`${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 */\nexport async function exportThemeById(id, file) {\n let fileName = getTypedFilename(id, 'theme');\n if (file) {\n fileName = file;\n }\n createProgressIndicator('determinate', 1, `Exporting ${id}`);\n try {\n const themeData = await readTheme(id);\n updateProgressIndicator(`Writing file ${fileName}`);\n saveToFile('theme', [themeData], '_id', fileName);\n stopProgressIndicator(`Successfully exported theme ${id}.`);\n } catch (error) {\n stopProgressIndicator(`${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 */\nexport async function exportThemesToFile(file) {\n let fileName = getTypedFilename(`all${getRealmString()}Themes`, 'theme');\n if (file) {\n fileName = file;\n }\n const allThemesData = await readThemes();\n createProgressIndicator(\n 'determinate',\n allThemesData.length,\n 'Exporting themes'\n );\n for (const themeData of allThemesData) {\n if (!themeData._id) themeData._id = uuidv4();\n updateProgressIndicator(`Exporting theme ${themeData.name}`);\n }\n saveToFile('theme', allThemesData, '_id', fileName);\n stopProgressIndicator(\n `${allThemesData.length} themes exported to ${fileName}.`\n );\n}\n\n/**\n * Export all themes to separate files\n */\nexport async function exportThemesToFiles() {\n const allThemesData = await readThemes();\n createProgressIndicator(\n 'determinate',\n allThemesData.length,\n 'Exporting themes'\n );\n for (const themeData of allThemesData) {\n if (!themeData._id) themeData._id = uuidv4();\n updateProgressIndicator(`Writing theme ${themeData.name}`);\n const fileName = getTypedFilename(themeData.name, 'theme');\n saveToFile('theme', themeData, '_id', fileName);\n }\n stopProgressIndicator(`${allThemesData.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 fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const themeData = JSON.parse(data);\n if (validateImport(themeData.meta)) {\n createProgressIndicator('determinate', 1, 'Importing theme...');\n let found = false;\n for (const id in themeData.theme) {\n if ({}.hasOwnProperty.call(themeData.theme, id)) {\n if (themeData.theme[id].name === name) {\n found = true;\n updateProgressIndicator(`Importing ${themeData.theme[id].name}`);\n try {\n await updateThemeByName(name, themeData.theme[id]);\n stopProgressIndicator(`Successfully imported theme ${name}.`);\n } catch (error) {\n stopProgressIndicator(\n `Error importing theme ${themeData.theme[id].name}: ${error.message}`\n );\n printMessage(\n `Error importing theme ${themeData.theme[id].name}: ${error.message}`,\n 'error'\n );\n }\n break;\n }\n }\n }\n if (!found) {\n stopProgressIndicator(`Theme ${name} not found!`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\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 fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const themeData = JSON.parse(data);\n if (validateImport(themeData.meta)) {\n createProgressIndicator('determinate', 1, 'Importing theme...');\n let found = false;\n for (const themeId in themeData.theme) {\n if ({}.hasOwnProperty.call(themeData.theme, themeId)) {\n if (themeId === id) {\n found = true;\n updateProgressIndicator(\n `Importing ${themeData.theme[themeId]._id}`\n );\n try {\n await updateTheme(themeId, themeData.theme[themeId]);\n stopProgressIndicator(`Successfully imported theme ${id}.`);\n } catch (error) {\n stopProgressIndicator(\n `Error importing theme ${themeData.theme[themeId]._id}: ${error.message}`\n );\n printMessage(\n `Error importing theme ${themeData.theme[themeId]._id}: ${error.message}`,\n 'error'\n );\n }\n break;\n }\n }\n }\n if (!found) {\n stopProgressIndicator(`Theme ${id} not found!`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\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 fs.readFile(file, 'utf8', (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n createProgressIndicator(\n 'determinate',\n Object.keys(fileData.theme).length,\n 'Importing themes...'\n );\n for (const id in fileData.theme) {\n if ({}.hasOwnProperty.call(fileData.theme, id)) {\n updateProgressIndicator(`Importing ${fileData.theme[id].name}`);\n }\n }\n updateThemes(fileData.theme).then((result) => {\n if (result == null) {\n stopProgressIndicator(\n `Error importing ${Object.keys(fileData.theme).length} themes!`\n );\n printMessage(\n `Error importing ${\n Object.keys(fileData.theme).length\n } themes from ${file}`,\n 'error'\n );\n } else {\n stopProgressIndicator(\n `Successfully imported ${\n Object.keys(fileData.theme).length\n } themes.`\n );\n }\n });\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import themes from separate files\n */\nexport async function importThemesFromFiles() {\n const names = fs.readdirSync('.');\n const jsonFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.theme.json')\n );\n\n 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(`Imported ${count} theme(s) from ${file}`);\n }\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressIndicator(\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 fs.readFile(file, 'utf8', (err, data) => {\n if (err) throw err;\n const themeData = JSON.parse(data);\n if (validateImport(themeData.meta)) {\n createProgressIndicator('determinate', 1, 'Importing theme...');\n for (const id in themeData.theme) {\n if ({}.hasOwnProperty.call(themeData.theme, id)) {\n updateProgressIndicator(`Importing ${themeData.theme[id].name}`);\n updateTheme(id, themeData.theme[id]).then((result) => {\n if (result == null) {\n stopProgressIndicator(\n `Error importing theme ${themeData.theme[id].name}`\n );\n printMessage(\n `Error importing theme ${themeData.theme[id].name}`,\n 'error'\n );\n } else {\n stopProgressIndicator(\n `Successfully imported theme ${themeData.theme[id].name}`\n );\n }\n });\n break;\n }\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Delete theme by id\n * @param {String} id theme id\n */\nexport async function deleteThemeCmd(id) {\n createProgressIndicator('indeterminate', undefined, `Deleting ${id}...`);\n try {\n await deleteTheme(id);\n stopProgressIndicator(`Deleted ${id}.`, 'success');\n } catch (error) {\n stopProgressIndicator(`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 createProgressIndicator('indeterminate', undefined, `Deleting ${name}...`);\n try {\n await deleteThemeByName(name);\n stopProgressIndicator(`Deleted ${name}.`, 'success');\n } catch (error) {\n stopProgressIndicator(`Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all themes\n */\nexport async function deleteAllThemes() {\n createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all realm themes...`\n );\n try {\n await deleteThemes();\n stopProgressIndicator(`Deleted all realm themes.`, 'success');\n } catch (error) {\n stopProgressIndicator(`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","getTypedFilename","saveToFile","getRealmString","validateImport","getFilePath","getWorkingDirectory","utils","readThemes","readThemeByName","readTheme","updateThemeByName","updateTheme","updateThemes","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","fileName","filePath","themeData","error","message","exportThemeById","id","exportThemesToFile","allThemesData","length","exportThemesToFiles","importThemeByName","readFile","err","data","JSON","parse","meta","found","hasOwnProperty","call","importThemeById","themeId","importThemesFromFile","fileData","Object","keys","then","result","importThemesFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","map","count","total","files","readFileSync","importFirstThemeFromFile","deleteThemeCmd","undefined","deleteThemeByNameCmd","deleteAllThemes","deleteThemesCmd"],"sources":["../../src/ops/ThemeOps.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { type ThemeSkeleton } 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';\nimport { getTypedFilename, saveToFile } from '../utils/ExportImportUtils';\n\nconst { getRealmString, validateImport, getFilePath, getWorkingDirectory } =\n frodo.utils;\nconst {\n readThemes,\n readThemeByName,\n readTheme,\n updateThemeByName,\n updateTheme,\n updateThemes,\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 */\nexport async function exportThemeByName(name, file) {\n let fileName = getTypedFilename(name, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n createProgressIndicator('determinate', 1, `Exporting ${name}`);\n try {\n const themeData = await readThemeByName(name);\n if (!themeData._id) themeData._id = uuidv4();\n updateProgressIndicator(`Writing file to ${filePath}`);\n saveToFile('theme', [themeData], '_id', filePath);\n stopProgressIndicator(`Successfully exported theme ${name}.`);\n } catch (error) {\n stopProgressIndicator(`${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 */\nexport async function exportThemeById(id, file) {\n let fileName = getTypedFilename(id, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n createProgressIndicator('determinate', 1, `Exporting ${id}`);\n try {\n const themeData = await readTheme(id);\n updateProgressIndicator(`Writing file to ${filePath}`);\n saveToFile('theme', [themeData], '_id', filePath);\n stopProgressIndicator(`Successfully exported theme ${id}.`);\n } catch (error) {\n stopProgressIndicator(`${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 */\nexport async function exportThemesToFile(file) {\n let fileName = getTypedFilename(`all${getRealmString()}Themes`, 'theme');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const allThemesData = await readThemes();\n createProgressIndicator(\n 'determinate',\n allThemesData.length,\n 'Exporting themes'\n );\n for (const themeData of allThemesData) {\n if (!themeData._id) themeData._id = uuidv4();\n updateProgressIndicator(`Exporting theme ${themeData.name}`);\n }\n saveToFile('theme', allThemesData, '_id', filePath);\n stopProgressIndicator(\n `${allThemesData.length} themes exported to ${filePath}.`\n );\n}\n\n/**\n * Export all themes to separate files\n */\nexport async function exportThemesToFiles() {\n const allThemesData = await readThemes();\n createProgressIndicator(\n 'determinate',\n allThemesData.length,\n 'Exporting themes'\n );\n for (const themeData of allThemesData) {\n if (!themeData._id) themeData._id = uuidv4();\n updateProgressIndicator(`Writing theme ${themeData.name}`);\n const fileName = getTypedFilename(themeData.name, 'theme');\n saveToFile('theme', themeData, '_id', getFilePath(fileName, true));\n }\n stopProgressIndicator(`${allThemesData.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 fs.readFile(getFilePath(file), 'utf8', async (err, data) => {\n if (err) throw err;\n const themeData = JSON.parse(data);\n if (validateImport(themeData.meta)) {\n createProgressIndicator('determinate', 1, 'Importing theme...');\n let found = false;\n for (const id in themeData.theme) {\n if ({}.hasOwnProperty.call(themeData.theme, id)) {\n if (themeData.theme[id].name === name) {\n found = true;\n updateProgressIndicator(`Importing ${themeData.theme[id].name}`);\n try {\n await updateThemeByName(name, themeData.theme[id]);\n stopProgressIndicator(`Successfully imported theme ${name}.`);\n } catch (error) {\n stopProgressIndicator(\n `Error importing theme ${themeData.theme[id].name}: ${error.message}`\n );\n printMessage(\n `Error importing theme ${themeData.theme[id].name}: ${error.message}`,\n 'error'\n );\n }\n break;\n }\n }\n }\n if (!found) {\n stopProgressIndicator(`Theme ${name} not found!`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\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 fs.readFile(getFilePath(file), 'utf8', async (err, data) => {\n if (err) throw err;\n const themeData = JSON.parse(data);\n if (validateImport(themeData.meta)) {\n createProgressIndicator('determinate', 1, 'Importing theme...');\n let found = false;\n for (const themeId in themeData.theme) {\n if ({}.hasOwnProperty.call(themeData.theme, themeId)) {\n if (themeId === id) {\n found = true;\n updateProgressIndicator(\n `Importing ${themeData.theme[themeId]._id}`\n );\n try {\n await updateTheme(themeId, themeData.theme[themeId]);\n stopProgressIndicator(`Successfully imported theme ${id}.`);\n } catch (error) {\n stopProgressIndicator(\n `Error importing theme ${themeData.theme[themeId]._id}: ${error.message}`\n );\n printMessage(\n `Error importing theme ${themeData.theme[themeId]._id}: ${error.message}`,\n 'error'\n );\n }\n break;\n }\n }\n }\n if (!found) {\n stopProgressIndicator(`Theme ${id} not found!`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\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 fs.readFile(filePath, 'utf8', (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n createProgressIndicator(\n 'determinate',\n Object.keys(fileData.theme).length,\n 'Importing themes...'\n );\n for (const id in fileData.theme) {\n if ({}.hasOwnProperty.call(fileData.theme, id)) {\n updateProgressIndicator(`Importing ${fileData.theme[id].name}`);\n }\n }\n updateThemes(fileData.theme).then((result) => {\n if (result == null) {\n stopProgressIndicator(\n `Error importing ${Object.keys(fileData.theme).length} themes!`\n );\n printMessage(\n `Error importing ${\n Object.keys(fileData.theme).length\n } themes from ${filePath}`,\n 'error'\n );\n } else {\n stopProgressIndicator(\n `Successfully imported ${\n Object.keys(fileData.theme).length\n } themes.`\n );\n }\n });\n } else {\n printMessage('Import validation failed...', 'error');\n }\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 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(`Imported ${count} theme(s) from ${file}`);\n }\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressIndicator(\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 fs.readFile(getFilePath(file), 'utf8', (err, data) => {\n if (err) throw err;\n const themeData = JSON.parse(data);\n if (validateImport(themeData.meta)) {\n createProgressIndicator('determinate', 1, 'Importing theme...');\n for (const id in themeData.theme) {\n if ({}.hasOwnProperty.call(themeData.theme, id)) {\n updateProgressIndicator(`Importing ${themeData.theme[id].name}`);\n updateTheme(id, themeData.theme[id]).then((result) => {\n if (result == null) {\n stopProgressIndicator(\n `Error importing theme ${themeData.theme[id].name}`\n );\n printMessage(\n `Error importing theme ${themeData.theme[id].name}`,\n 'error'\n );\n } else {\n stopProgressIndicator(\n `Successfully imported theme ${themeData.theme[id].name}`\n );\n }\n });\n break;\n }\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Delete theme by id\n * @param {String} id theme id\n */\nexport async function deleteThemeCmd(id) {\n createProgressIndicator('indeterminate', undefined, `Deleting ${id}...`);\n try {\n await deleteTheme(id);\n stopProgressIndicator(`Deleted ${id}.`, 'success');\n } catch (error) {\n stopProgressIndicator(`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 createProgressIndicator('indeterminate', undefined, `Deleting ${name}...`);\n try {\n await deleteThemeByName(name);\n stopProgressIndicator(`Deleted ${name}.`, 'success');\n } catch (error) {\n stopProgressIndicator(`Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all themes\n */\nexport async function deleteAllThemes() {\n createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all realm themes...`\n );\n try {\n await deleteThemes();\n stopProgressIndicator(`Deleted all realm themes.`, 'success');\n } catch (error) {\n stopProgressIndicator(`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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"}