@rockcarver/frodo-cli 2.0.0-54 → 2.0.0-56

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.
@@ -153,9 +153,10 @@ export async function exportScriptToFile(scriptId, file, includeMeta = true) {
153
153
  * @param {string} name script name
154
154
  * @param {string} file file name
155
155
  * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true
156
+ * @param {boolean} extract Extracts the scripts from the exports into separate files if true
156
157
  * @returns {Promise<boolean>} true if successful, false otherwise
157
158
  */
158
- export async function exportScriptByNameToFile(name, file, includeMeta = true) {
159
+ export async function exportScriptByNameToFile(name, file, includeMeta = true, extract = false) {
159
160
  debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);
160
161
  try {
161
162
  showSpinner(`Exporting script '${name}'...`);
@@ -166,6 +167,7 @@ export async function exportScriptByNameToFile(name, file, includeMeta = true) {
166
167
  const filePath = getFilePath(fileName, true);
167
168
  spinSpinner(`Exporting script '${name}' to '${filePath}'...`);
168
169
  const scriptExport = await exportScriptByName(name);
170
+ if (extract) extractScriptToFile(scriptExport);
169
171
  saveJsonToFile(scriptExport, filePath, includeMeta);
170
172
  succeedSpinner(`Exported script '${name}' to '${filePath}'.`);
171
173
  debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end`);
@@ -345,7 +347,8 @@ export async function importScriptsFromFiles(watch, options, validateScripts) {
345
347
 
346
348
  // We watch json files and script files.
347
349
  const watcher = chokidar.watch([`${getWorkingDirectory()}/**/*.script.json`, `${getWorkingDirectory()}/**/*.script.js`, `${getWorkingDirectory()}/**/*.script.groovy`], {
348
- persistent: watch
350
+ persistent: watch,
351
+ ignoreInitial: watch
349
352
  });
350
353
  watcher.on('add', onChange).on('change', onChange).on('error', error => {
351
354
  printError(error, `Watcher error`);
@@ -1 +1 @@
1
- {"version":3,"file":"ScriptOps.js","names":["frodo","FrodoError","state","chokidar","fs","getFullExportConfig","isIdUsed","createProgressIndicator","createTable","debugMessage","failSpinner","printError","printMessage","showSpinner","spinSpinner","stopProgressIndicator","succeedSpinner","updateProgressIndicator","wordwrap","getTypedFilename","isValidUrl","saveJsonToFile","saveTextToFile","titleCase","isBase64Encoded","getFilePath","getWorkingDirectory","utils","readScripts","exportScript","exportScriptByName","exportScripts","importScripts","deleteScript","deleteScriptByName","deleteScripts","script","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","usage","file","spinnerId","scripts","sort","a","b","localeCompare","length","error","forEach","fullExport","headers","push","table","values","isScriptUsed","used","location","toString","exportScriptToFile","scriptId","includeMeta","fileName","filePath","scriptExport","exportScriptByNameToFile","message","exportScriptsToFile","includeDefault","getRealm","exportScriptsToFiles","extract","errors","barId","scriptList","filter","default","fileBarId","extractScriptToFile","directory","scriptSkeleton","getScriptSkeleton","fileExtension","scriptFileName","scriptFilePath","scriptText","Array","isArray","isScriptExtracted","importData","extracted","Object","keys","importScriptsFromFile","options","reUuid","data","readFileSync","JSON","parse","handleScriptFileImport","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","watcher","persistent","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","imported","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","startsWith","scriptExportRaw","getScriptId","scriptIds","Error","deleteScriptId","id","undefined","deleteScriptName","deleteAllScripts"],"sources":["../../src/ops/ScriptOps.ts"],"sourcesContent":["import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';\nimport { type ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi';\nimport {\n type ScriptExportInterface,\n type ScriptImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\n\nimport { getFullExportConfig, isIdUsed } from '../utils/Config';\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n failSpinner,\n printError,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressIndicator,\n succeedSpinner,\n updateProgressIndicator,\n} from '../utils/Console';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n getTypedFilename,\n isValidUrl,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n isBase64Encoded,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readScripts,\n exportScript,\n exportScriptByName,\n exportScripts,\n importScripts,\n deleteScript,\n deleteScriptByName,\n deleteScripts,\n} = frodo.script;\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 * @param {boolean} usage display usage field\n * @param {String | null} file Optional filename to determine usage\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listScripts(\n long: boolean = false,\n usage: boolean = false,\n file: string | null = null\n): Promise<boolean> {\n let spinnerId: string;\n let scripts: ScriptSkeleton[] = [];\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading scripts...`\n );\n scripts = await readScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${scripts.length} scripts.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error reading scripts`, 'fail');\n printError(error);\n return false;\n }\n if (!long && !usage) {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n debugMessage(`Cli.ScriptOps.listScripts: end`);\n return true;\n }\n let fullExport = null;\n const headers = long\n ? ['Name', 'UUID', 'Language', 'Context', 'Description']\n : ['Name'];\n if (usage) {\n try {\n fullExport = await getFullExportConfig(file);\n } catch (error) {\n printError(error);\n return false;\n }\n //Delete scripts from full export so they aren't mistakenly used for determining usage\n delete fullExport.script;\n headers.push('Used');\n }\n const table = createTable(headers);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n const values = long\n ? [\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 : [wordwrap(script.name, 25, ' ')];\n if (usage) {\n const isScriptUsed = isIdUsed(fullExport, script._id, false);\n values.push(\n isScriptUsed.used\n ? `${'yes'['brightGreen']} (at ${isScriptUsed.location})`\n : 'no'['brightRed']\n );\n }\n table.push(values);\n });\n printMessage(table.toString(), 'data');\n debugMessage(`Cli.ScriptOps.listScripts: end`);\n return true;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string,\n includeMeta: boolean = true\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, includeMeta);\n succeedSpinner(`Exported script '${scriptId}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}'`);\n printError(error);\n }\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 * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string,\n includeMeta: boolean = true\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, includeMeta);\n succeedSpinner(`Exported script '${name}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {boolean} includeDefault true to include default scripts in export, false otherwise. Default: false\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportScriptsToFile(\n file: string,\n includeMeta: boolean = true,\n includeDefault: boolean = false\n): 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(includeDefault);\n saveJsonToFile(scriptExport, getFilePath(fileName, true), includeMeta);\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end`);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @param {boolean} extract Extracts the scripts from the exports into separate files if true\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {boolean} includeDefault true to include default scripts in export, false otherwise. Default: false\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportScriptsToFiles(\n extract: boolean = false,\n includeMeta: boolean = true,\n includeDefault: boolean = false\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const errors: Error[] = [];\n let barId: string;\n try {\n let scriptList = await readScripts();\n if (!includeDefault)\n scriptList = scriptList.filter((script) => !script.default);\n barId = createProgressIndicator(\n 'determinate',\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n const fileBarId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting script ${script.name}...`\n );\n const file = getFilePath(getTypedFilename(script.name, 'script'), true);\n try {\n const scriptExport = await exportScriptByName(script.name);\n if (extract) extractScriptToFile(scriptExport);\n saveJsonToFile(scriptExport, file, includeMeta);\n updateProgressIndicator(fileBarId, `Saving ${script.name} to ${file}.`);\n stopProgressIndicator(fileBarId, `${script.name} saved to ${file}.`);\n } catch (error) {\n stopProgressIndicator(\n fileBarId,\n `Error exporting ${script.name}`,\n 'fail'\n );\n errors.push(error);\n }\n updateProgressIndicator(barId, `Exported script ${script.name}`);\n }\n if (errors.length > 0) {\n throw new FrodoError(`Error exporting scripts`, errors);\n }\n stopProgressIndicator(\n barId,\n `Exported ${scriptList.length} scripts to individual files.`\n );\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end`);\n return true;\n } catch (error) {\n stopProgressIndicator(barId, `Error exporting scripts`);\n printError(error);\n }\n}\n\n/**\n * Extracts a script from a script export into a separate file.\n * @param {ScriptExportInterface} scriptExport The script export\n * @param {string} scriptId The script id (optional if there is only one script in the export)\n * @param {string} directory The directory within the base directory to save the script file\n * @returns {boolean} true if successful, false otherwise\n */\nexport function extractScriptToFile(\n scriptExport: ScriptExportInterface,\n scriptId?: string,\n directory?: string\n): boolean {\n try {\n const scriptSkeleton = scriptId\n ? scriptExport.script[scriptId]\n : getScriptSkeleton(scriptExport);\n const fileExtension =\n scriptSkeleton.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n scriptSkeleton.name,\n 'script',\n fileExtension\n );\n const scriptFilePath = getFilePath(\n (directory ? `${directory}/` : '') + scriptFileName,\n true\n );\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n scriptSkeleton.script = `file://${scriptFilePath}`;\n saveTextToFile(scriptText, scriptFilePath);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\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 {ScriptImportOptions} options Script import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importScriptsFromFile(\n name: string,\n file: string,\n options: ScriptImportOptions = {\n reUuid: false,\n includeDefault: false,\n }\n): Promise<boolean> {\n const filePath = getFilePath(file);\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const importData: ScriptExportInterface = JSON.parse(data);\n if (isScriptExtracted(importData)) {\n await handleScriptFileImport(filePath, options, false);\n } else {\n await importScripts(name, importData, options);\n }\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end`);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param {boolean} watch whether or not to watch for file changes\n * @param {ScriptImportOptions} options Script import options\n * @param {boolean} validateScripts If true, validates Javascript scripts to ensure no errors exist in them. Default: false\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n options: ScriptImportOptions,\n validateScripts: boolean\n): Promise<void> {\n // If watch is true, it doesn't make sense to reUuid.\n options.reUuid = watch ? false : options.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, options, validateScripts);\n } catch (error) {\n printError(error, `${path}`);\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 printError(error, `Watcher 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 {string} file Either a script file or an extract file\n * @param {ScriptImportOptions} options Script import options\n * @param {boolean} validateScripts If true, validates Javascript scripts to ensure no errors exist in them. Default: false\n */\nasync function handleScriptFileImport(\n file: string,\n options: ScriptImportOptions,\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, options, 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): 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\n/**\n * Delete script by id\n * @param {String} id script id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteScriptId(id: string): Promise<boolean> {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${id}...`\n );\n try {\n await deleteScript(id);\n stopProgressIndicator(spinnerId, `Deleted ${id}.`, 'success');\n return true;\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n return false;\n}\n\n/**\n * Delete script by name\n * @param {String} name script name\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteScriptName(name: string): Promise<boolean> {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${name}...`\n );\n try {\n await deleteScriptByName(name);\n stopProgressIndicator(spinnerId, `Deleted ${name}.`, 'success');\n return true;\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n return false;\n}\n\n/**\n * Delete all non-default scripts\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteAllScripts(): Promise<boolean> {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all non-default scripts...`\n );\n try {\n await deleteScripts();\n stopProgressIndicator(\n spinnerId,\n `Deleted all non-default scripts.`,\n 'success'\n );\n return true;\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n return false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScriptOps.js","names":["frodo","FrodoError","state","chokidar","fs","getFullExportConfig","isIdUsed","createProgressIndicator","createTable","debugMessage","failSpinner","printError","printMessage","showSpinner","spinSpinner","stopProgressIndicator","succeedSpinner","updateProgressIndicator","wordwrap","getTypedFilename","isValidUrl","saveJsonToFile","saveTextToFile","titleCase","isBase64Encoded","getFilePath","getWorkingDirectory","utils","readScripts","exportScript","exportScriptByName","exportScripts","importScripts","deleteScript","deleteScriptByName","deleteScripts","script","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","usage","file","spinnerId","scripts","sort","a","b","localeCompare","length","error","forEach","fullExport","headers","push","table","values","isScriptUsed","used","location","toString","exportScriptToFile","scriptId","includeMeta","fileName","filePath","scriptExport","exportScriptByNameToFile","extract","extractScriptToFile","message","exportScriptsToFile","includeDefault","getRealm","exportScriptsToFiles","errors","barId","scriptList","filter","default","fileBarId","directory","scriptSkeleton","getScriptSkeleton","fileExtension","scriptFileName","scriptFilePath","scriptText","Array","isArray","isScriptExtracted","importData","extracted","Object","keys","importScriptsFromFile","options","reUuid","data","readFileSync","JSON","parse","handleScriptFileImport","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","watcher","persistent","ignoreInitial","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","imported","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","startsWith","scriptExportRaw","getScriptId","scriptIds","Error","deleteScriptId","id","undefined","deleteScriptName","deleteAllScripts"],"sources":["../../src/ops/ScriptOps.ts"],"sourcesContent":["import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';\nimport { type ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi';\nimport {\n type ScriptExportInterface,\n type ScriptImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\n\nimport { getFullExportConfig, isIdUsed } from '../utils/Config';\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n failSpinner,\n printError,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressIndicator,\n succeedSpinner,\n updateProgressIndicator,\n} from '../utils/Console';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n getTypedFilename,\n isValidUrl,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n isBase64Encoded,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readScripts,\n exportScript,\n exportScriptByName,\n exportScripts,\n importScripts,\n deleteScript,\n deleteScriptByName,\n deleteScripts,\n} = frodo.script;\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 * @param {boolean} usage display usage field\n * @param {String | null} file Optional filename to determine usage\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listScripts(\n long: boolean = false,\n usage: boolean = false,\n file: string | null = null\n): Promise<boolean> {\n let spinnerId: string;\n let scripts: ScriptSkeleton[] = [];\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Reading scripts...`\n );\n scripts = await readScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n stopProgressIndicator(\n spinnerId,\n `Successfully read ${scripts.length} scripts.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error reading scripts`, 'fail');\n printError(error);\n return false;\n }\n if (!long && !usage) {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n debugMessage(`Cli.ScriptOps.listScripts: end`);\n return true;\n }\n let fullExport = null;\n const headers = long\n ? ['Name', 'UUID', 'Language', 'Context', 'Description']\n : ['Name'];\n if (usage) {\n try {\n fullExport = await getFullExportConfig(file);\n } catch (error) {\n printError(error);\n return false;\n }\n //Delete scripts from full export so they aren't mistakenly used for determining usage\n delete fullExport.script;\n headers.push('Used');\n }\n const table = createTable(headers);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n const values = long\n ? [\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 : [wordwrap(script.name, 25, ' ')];\n if (usage) {\n const isScriptUsed = isIdUsed(fullExport, script._id, false);\n values.push(\n isScriptUsed.used\n ? `${'yes'['brightGreen']} (at ${isScriptUsed.location})`\n : 'no'['brightRed']\n );\n }\n table.push(values);\n });\n printMessage(table.toString(), 'data');\n debugMessage(`Cli.ScriptOps.listScripts: end`);\n return true;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string,\n includeMeta: boolean = true\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, includeMeta);\n succeedSpinner(`Exported script '${scriptId}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}'`);\n printError(error);\n }\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 * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {boolean} extract Extracts the scripts from the exports into separate files if true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string,\n includeMeta: boolean = true,\n extract: boolean = false\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 if (extract) extractScriptToFile(scriptExport);\n saveJsonToFile(scriptExport, filePath, includeMeta);\n succeedSpinner(`Exported script '${name}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {boolean} includeDefault true to include default scripts in export, false otherwise. Default: false\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportScriptsToFile(\n file: string,\n includeMeta: boolean = true,\n includeDefault: boolean = false\n): 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(includeDefault);\n saveJsonToFile(scriptExport, getFilePath(fileName, true), includeMeta);\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end`);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @param {boolean} extract Extracts the scripts from the exports into separate files if true\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @param {boolean} includeDefault true to include default scripts in export, false otherwise. Default: false\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportScriptsToFiles(\n extract: boolean = false,\n includeMeta: boolean = true,\n includeDefault: boolean = false\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const errors: Error[] = [];\n let barId: string;\n try {\n let scriptList = await readScripts();\n if (!includeDefault)\n scriptList = scriptList.filter((script) => !script.default);\n barId = createProgressIndicator(\n 'determinate',\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n const fileBarId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting script ${script.name}...`\n );\n const file = getFilePath(getTypedFilename(script.name, 'script'), true);\n try {\n const scriptExport = await exportScriptByName(script.name);\n if (extract) extractScriptToFile(scriptExport);\n saveJsonToFile(scriptExport, file, includeMeta);\n updateProgressIndicator(fileBarId, `Saving ${script.name} to ${file}.`);\n stopProgressIndicator(fileBarId, `${script.name} saved to ${file}.`);\n } catch (error) {\n stopProgressIndicator(\n fileBarId,\n `Error exporting ${script.name}`,\n 'fail'\n );\n errors.push(error);\n }\n updateProgressIndicator(barId, `Exported script ${script.name}`);\n }\n if (errors.length > 0) {\n throw new FrodoError(`Error exporting scripts`, errors);\n }\n stopProgressIndicator(\n barId,\n `Exported ${scriptList.length} scripts to individual files.`\n );\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end`);\n return true;\n } catch (error) {\n stopProgressIndicator(barId, `Error exporting scripts`);\n printError(error);\n }\n}\n\n/**\n * Extracts a script from a script export into a separate file.\n * @param {ScriptExportInterface} scriptExport The script export\n * @param {string} scriptId The script id (optional if there is only one script in the export)\n * @param {string} directory The directory within the base directory to save the script file\n * @returns {boolean} true if successful, false otherwise\n */\nexport function extractScriptToFile(\n scriptExport: ScriptExportInterface,\n scriptId?: string,\n directory?: string\n): boolean {\n try {\n const scriptSkeleton = scriptId\n ? scriptExport.script[scriptId]\n : getScriptSkeleton(scriptExport);\n const fileExtension =\n scriptSkeleton.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n scriptSkeleton.name,\n 'script',\n fileExtension\n );\n const scriptFilePath = getFilePath(\n (directory ? `${directory}/` : '') + scriptFileName,\n true\n );\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n scriptSkeleton.script = `file://${scriptFilePath}`;\n saveTextToFile(scriptText, scriptFilePath);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\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 {ScriptImportOptions} options Script import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importScriptsFromFile(\n name: string,\n file: string,\n options: ScriptImportOptions = {\n reUuid: false,\n includeDefault: false,\n }\n): Promise<boolean> {\n const filePath = getFilePath(file);\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const importData: ScriptExportInterface = JSON.parse(data);\n if (isScriptExtracted(importData)) {\n await handleScriptFileImport(filePath, options, false);\n } else {\n await importScripts(name, importData, options);\n }\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end`);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param {boolean} watch whether or not to watch for file changes\n * @param {ScriptImportOptions} options Script import options\n * @param {boolean} validateScripts If true, validates Javascript scripts to ensure no errors exist in them. Default: false\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n options: ScriptImportOptions,\n validateScripts: boolean\n): Promise<void> {\n // If watch is true, it doesn't make sense to reUuid.\n options.reUuid = watch ? false : options.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, options, validateScripts);\n } catch (error) {\n printError(error, `${path}`);\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 ignoreInitial: watch,\n }\n );\n\n watcher\n .on('add', onChange)\n .on('change', onChange)\n .on('error', (error) => {\n printError(error, `Watcher 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 {string} file Either a script file or an extract file\n * @param {ScriptImportOptions} options Script import options\n * @param {boolean} validateScripts If true, validates Javascript scripts to ensure no errors exist in them. Default: false\n */\nasync function handleScriptFileImport(\n file: string,\n options: ScriptImportOptions,\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, options, 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): 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\n/**\n * Delete script by id\n * @param {String} id script id\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteScriptId(id: string): Promise<boolean> {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${id}...`\n );\n try {\n await deleteScript(id);\n stopProgressIndicator(spinnerId, `Deleted ${id}.`, 'success');\n return true;\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n return false;\n}\n\n/**\n * Delete script by name\n * @param {String} name script name\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteScriptName(name: string): Promise<boolean> {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${name}...`\n );\n try {\n await deleteScriptByName(name);\n stopProgressIndicator(spinnerId, `Deleted ${name}.`, 'success');\n return true;\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n return false;\n}\n\n/**\n * Delete all non-default scripts\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteAllScripts(): Promise<boolean> {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all non-default scripts...`\n );\n try {\n await deleteScripts();\n stopProgressIndicator(\n spinnerId,\n `Deleted all non-default scripts.`,\n 'success'\n );\n return true;\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n return false;\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';
2
2
  import fs from 'fs';
3
- import { createTable, debugMessage, failSpinner, printError, printMessage, showSpinner, succeedSpinner } from '../utils/Console';
3
+ import { createProgressIndicator, createTable, debugMessage, printError, printMessage, stopProgressIndicator } from '../utils/Console';
4
4
  const {
5
5
  getRealmName,
6
6
  getTypedFilename,
@@ -129,22 +129,23 @@ export async function importServiceFromFile(serviceId, file, options = {
129
129
  global: false,
130
130
  realm: false
131
131
  }) {
132
+ let indicatorId;
132
133
  try {
133
134
  debugMessage(`cli.ServiceOps.importServiceFromFile: start`);
134
- showSpinner(`Importing service ${serviceId}...`);
135
135
  const filePath = getFilePath(file);
136
+ indicatorId = createProgressIndicator('indeterminate', 0, `Importing ${serviceId} from ${filePath}...`);
136
137
  const data = fs.readFileSync(filePath, 'utf8');
137
138
  const importData = JSON.parse(data);
138
139
  if (importData !== null && importData !== void 0 && importData.service[serviceId]) {
139
140
  await importService(serviceId, importData, options);
140
- succeedSpinner(`Imported ${serviceId}.`);
141
+ stopProgressIndicator(indicatorId, `Imported ${serviceId} from ${filePath}.`, 'success');
141
142
  } else {
142
- failSpinner(`${serviceId} not found!`);
143
+ stopProgressIndicator(indicatorId, `${serviceId} not found`, 'fail');
143
144
  }
144
145
  debugMessage(`cli.ServiceOps.importServiceFromFile: end`);
145
146
  return true;
146
147
  } catch (error) {
147
- failSpinner(`Error importing service ${serviceId}`);
148
+ stopProgressIndicator(indicatorId, `Error importing ${serviceId}.`, 'fail');
148
149
  printError(error);
149
150
  }
150
151
  return false;
@@ -161,23 +162,24 @@ export async function importFirstServiceFromFile(file, options = {
161
162
  global: false,
162
163
  realm: false
163
164
  }) {
165
+ let indicatorId;
164
166
  try {
165
- showSpinner(`Importing first service...`);
167
+ debugMessage(`cli.ServiceOps.importFirstServiceFromFile: start`);
166
168
  const filePath = getFilePath(file);
167
- debugMessage(`cli.ServiceOps.importFirstServiceFromFile: start [file=${filePath}]`);
169
+ indicatorId = createProgressIndicator('indeterminate', 0, `Importing ${filePath}...`);
168
170
  const data = fs.readFileSync(filePath, 'utf8');
169
171
  const importData = JSON.parse(data);
170
172
  if (importData && Object.keys(importData.service).length) {
171
173
  const serviceId = Object.keys(importData.service)[0];
172
174
  await importService(serviceId, importData, options);
173
- succeedSpinner(`Imported first service ${serviceId}.`);
175
+ stopProgressIndicator(indicatorId, `Imported ${serviceId} from ${filePath}.`, 'success');
174
176
  } else {
175
- failSpinner(`No services found in ${filePath}!`);
177
+ stopProgressIndicator(indicatorId, `No service found in import data`, 'fail');
176
178
  }
177
179
  debugMessage(`cli.ServiceOps.importFirstServiceFromFile: end`);
178
180
  return true;
179
181
  } catch (error) {
180
- failSpinner(`Error importing first service`);
182
+ stopProgressIndicator(indicatorId, `Error importing first service`, 'fail');
181
183
  printError(error);
182
184
  }
183
185
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceOps.js","names":["frodo","FrodoError","state","fs","createTable","debugMessage","failSpinner","printError","printMessage","showSpinner","succeedSpinner","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","getListOfServices","exportServices","exportService","getFullServices","createServiceExportTemplate","importService","importServices","deleteFullService","deleteFullServices","service","listServices","long","globalConfig","services","sort","a","b","_id","localeCompare","table","push","name","toString","error","exportServicesToFile","file","includeMeta","exportData","fileName","getRealm","exportServiceToFile","serviceId","exportServicesToFiles","_type","filePath","importServiceFromFile","options","clean","global","realm","data","readFileSync","importData","JSON","parse","importFirstServiceFromFile","Object","keys","length","importServicesFromFile","importServicesFromFiles","errors","names","readdirSync","serviceFiles","filter","toLowerCase","endsWith","deleteService","deleteServices"],"sources":["../../src/ops/ServiceOps.ts"],"sourcesContent":["import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';\nimport {\n type ServiceExportInterface,\n type ServiceImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ServiceOps';\nimport fs from 'fs';\n\nimport {\n createTable,\n debugMessage,\n failSpinner,\n printError,\n printMessage,\n showSpinner,\n succeedSpinner,\n} from '../utils/Console';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n getListOfServices,\n exportServices,\n exportService,\n getFullServices,\n createServiceExportTemplate,\n importService,\n importServices,\n deleteFullService,\n deleteFullServices,\n} = frodo.service;\n\n/**\n * List services\n * @param {boolean} [long=false] detailed list\n * @param {boolean} [globalConfig=false] global services\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listServices(\n long: boolean = false,\n globalConfig: boolean = false\n): Promise<boolean> {\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 return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all services to file\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportServicesToFile(\n file: string,\n globalConfig: boolean = false,\n includeMeta: boolean = true\n): Promise<boolean> {\n try {\n const exportData = await exportServices(globalConfig);\n let fileName = getTypedFilename(\n `all${\n globalConfig ? 'Global' : titleCase(getRealmName(state.getRealm()))\n }Services`,\n `service`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export service to file\n * @param {string} serviceId service id\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportServiceToFile(\n serviceId: string,\n file: string,\n globalConfig: boolean = false,\n includeMeta: boolean = true\n): Promise<boolean> {\n try {\n const exportData = await exportService(serviceId, globalConfig);\n let fileName = getTypedFilename(serviceId, `service`);\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all services to separate files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportServicesToFiles(\n globalConfig: boolean = false,\n includeMeta: boolean = true\n): Promise<boolean> {\n try {\n debugMessage(`cli.ServiceOps.exportServicesToFiles: start`);\n const services = await getFullServices(globalConfig);\n for (const service of services) {\n const fileName = getTypedFilename(service._type._id, `service`);\n const filePath = getFilePath(fileName, true);\n const exportData = createServiceExportTemplate();\n exportData.service[service._type._id] = service;\n debugMessage(\n `cli.ServiceOps.exportServicesToFiles: exporting ${service._type._id} to ${filePath}`\n );\n saveJsonToFile(exportData, filePath, includeMeta);\n }\n debugMessage(`cli.ServiceOps.exportServicesToFiles: end.`);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import a service from file\n * @param {string} serviceId service id/name\n * @param {string} file import file name\n * @param {ServiceImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importServiceFromFile(\n serviceId: string,\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n): Promise<boolean> {\n try {\n debugMessage(`cli.ServiceOps.importServiceFromFile: start`);\n showSpinner(`Importing service ${serviceId}...`);\n const filePath = getFilePath(file);\n const data = fs.readFileSync(filePath, 'utf8');\n const importData = JSON.parse(data);\n if (importData?.service[serviceId]) {\n await importService(serviceId, importData, options);\n succeedSpinner(`Imported ${serviceId}.`);\n } else {\n failSpinner(`${serviceId} not found!`);\n }\n debugMessage(`cli.ServiceOps.importServiceFromFile: end`);\n return true;\n } catch (error) {\n failSpinner(`Error importing service ${serviceId}`);\n printError(error);\n }\n return false;\n}\n\n/**\n * Import first service from file\n * @param {string} file import file name\n * @param {ServiceImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importFirstServiceFromFile(\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n): Promise<boolean> {\n try {\n showSpinner(`Importing first service...`);\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importFirstServiceFromFile: start [file=${filePath}]`\n );\n const data = fs.readFileSync(filePath, 'utf8');\n const importData = JSON.parse(data);\n if (importData && Object.keys(importData.service).length) {\n const serviceId = Object.keys(importData.service)[0];\n await importService(serviceId, importData, options);\n succeedSpinner(`Imported first service ${serviceId}.`);\n } else {\n failSpinner(`No services found in ${filePath}!`);\n }\n debugMessage(`cli.ServiceOps.importFirstServiceFromFile: end`);\n return true;\n } catch (error) {\n failSpinner(`Error importing first service`);\n printError(error);\n }\n return false;\n}\n\n/**\n * Import services from file\n * @param {String} file file name\n * @param {ServiceImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importServicesFromFile(\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n): Promise<boolean> {\n try {\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: start [file=${filePath}]`\n );\n const data = fs.readFileSync(filePath, 'utf8');\n debugMessage(`cli.ServiceOps.importServiceFromFile: importing ${filePath}`);\n const importData = JSON.parse(data) as ServiceExportInterface;\n await importServices(importData, options);\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: end [file=${filePath}]`\n );\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import all services from separate files\n * @param {ServiceImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importServicesFromFiles(\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n): Promise<boolean> {\n try {\n debugMessage(`cli.ServiceOps.importServicesFromFiles: start`);\n const errors: Error[] = [];\n const names = fs.readdirSync(getWorkingDirectory());\n const serviceFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.service.json')\n );\n for (const file of serviceFiles) {\n try {\n await importServicesFromFile(file, options);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new FrodoError(`Error importing services from files`, errors);\n }\n debugMessage(`cli.ServiceOps.importServicesFromFiles: end`);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Delete a service by id/name\n * @param {string} serviceId Reference to the service to delete\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteService(\n serviceId: string,\n globalConfig = false\n): Promise<boolean> {\n try {\n await deleteFullService(serviceId, globalConfig);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Delete all services\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteServices(globalConfig = false): Promise<boolean> {\n try {\n await deleteFullServices(globalConfig);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ServiceOps.js","names":["frodo","FrodoError","state","fs","createProgressIndicator","createTable","debugMessage","printError","printMessage","stopProgressIndicator","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","getListOfServices","exportServices","exportService","getFullServices","createServiceExportTemplate","importService","importServices","deleteFullService","deleteFullServices","service","listServices","long","globalConfig","services","sort","a","b","_id","localeCompare","table","push","name","toString","error","exportServicesToFile","file","includeMeta","exportData","fileName","getRealm","exportServiceToFile","serviceId","exportServicesToFiles","_type","filePath","importServiceFromFile","options","clean","global","realm","indicatorId","data","readFileSync","importData","JSON","parse","importFirstServiceFromFile","Object","keys","length","importServicesFromFile","importServicesFromFiles","errors","names","readdirSync","serviceFiles","filter","toLowerCase","endsWith","deleteService","deleteServices"],"sources":["../../src/ops/ServiceOps.ts"],"sourcesContent":["import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';\nimport {\n type ServiceExportInterface,\n type ServiceImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ServiceOps';\nimport fs from 'fs';\n\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n printError,\n printMessage,\n stopProgressIndicator,\n} from '../utils/Console';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n getListOfServices,\n exportServices,\n exportService,\n getFullServices,\n createServiceExportTemplate,\n importService,\n importServices,\n deleteFullService,\n deleteFullServices,\n} = frodo.service;\n\n/**\n * List services\n * @param {boolean} [long=false] detailed list\n * @param {boolean} [globalConfig=false] global services\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function listServices(\n long: boolean = false,\n globalConfig: boolean = false\n): Promise<boolean> {\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 return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all services to file\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportServicesToFile(\n file: string,\n globalConfig: boolean = false,\n includeMeta: boolean = true\n): Promise<boolean> {\n try {\n const exportData = await exportServices(globalConfig);\n let fileName = getTypedFilename(\n `all${\n globalConfig ? 'Global' : titleCase(getRealmName(state.getRealm()))\n }Services`,\n `service`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export service to file\n * @param {string} serviceId service id\n * @param {string} file file name\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportServiceToFile(\n serviceId: string,\n file: string,\n globalConfig: boolean = false,\n includeMeta: boolean = true\n): Promise<boolean> {\n try {\n const exportData = await exportService(serviceId, globalConfig);\n let fileName = getTypedFilename(serviceId, `service`);\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true), includeMeta);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Export all services to separate files\n * @param {boolean} includeMeta true to include metadata, false otherwise. Default: true\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportServicesToFiles(\n globalConfig: boolean = false,\n includeMeta: boolean = true\n): Promise<boolean> {\n try {\n debugMessage(`cli.ServiceOps.exportServicesToFiles: start`);\n const services = await getFullServices(globalConfig);\n for (const service of services) {\n const fileName = getTypedFilename(service._type._id, `service`);\n const filePath = getFilePath(fileName, true);\n const exportData = createServiceExportTemplate();\n exportData.service[service._type._id] = service;\n debugMessage(\n `cli.ServiceOps.exportServicesToFiles: exporting ${service._type._id} to ${filePath}`\n );\n saveJsonToFile(exportData, filePath, includeMeta);\n }\n debugMessage(`cli.ServiceOps.exportServicesToFiles: end.`);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import a service from file\n * @param {string} serviceId service id/name\n * @param {string} file import file name\n * @param {ServiceImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importServiceFromFile(\n serviceId: string,\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n): Promise<boolean> {\n let indicatorId: string;\n try {\n debugMessage(`cli.ServiceOps.importServiceFromFile: start`);\n const filePath = getFilePath(file);\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${serviceId} from ${filePath}...`\n );\n const data = fs.readFileSync(filePath, 'utf8');\n const importData = JSON.parse(data);\n if (importData?.service[serviceId]) {\n await importService(serviceId, importData, options);\n stopProgressIndicator(\n indicatorId,\n `Imported ${serviceId} from ${filePath}.`,\n 'success'\n );\n } else {\n stopProgressIndicator(indicatorId, `${serviceId} not found`, 'fail');\n }\n debugMessage(`cli.ServiceOps.importServiceFromFile: end`);\n return true;\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error importing ${serviceId}.`, 'fail');\n printError(error);\n }\n return false;\n}\n\n/**\n * Import first service from file\n * @param {string} file import file name\n * @param {ServiceImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importFirstServiceFromFile(\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n): Promise<boolean> {\n let indicatorId: string;\n try {\n debugMessage(`cli.ServiceOps.importFirstServiceFromFile: start`);\n const filePath = getFilePath(file);\n indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${filePath}...`\n );\n const data = fs.readFileSync(filePath, 'utf8');\n const importData = JSON.parse(data);\n if (importData && Object.keys(importData.service).length) {\n const serviceId = Object.keys(importData.service)[0];\n await importService(serviceId, importData, options);\n stopProgressIndicator(\n indicatorId,\n `Imported ${serviceId} from ${filePath}.`,\n 'success'\n );\n } else {\n stopProgressIndicator(\n indicatorId,\n `No service found in import data`,\n 'fail'\n );\n }\n debugMessage(`cli.ServiceOps.importFirstServiceFromFile: end`);\n return true;\n } catch (error) {\n stopProgressIndicator(indicatorId, `Error importing first service`, 'fail');\n printError(error);\n }\n return false;\n}\n\n/**\n * Import services from file\n * @param {String} file file name\n * @param {ServiceImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importServicesFromFile(\n file: string,\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n): Promise<boolean> {\n try {\n const filePath = getFilePath(file);\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: start [file=${filePath}]`\n );\n const data = fs.readFileSync(filePath, 'utf8');\n debugMessage(`cli.ServiceOps.importServiceFromFile: importing ${filePath}`);\n const importData = JSON.parse(data) as ServiceExportInterface;\n await importServices(importData, options);\n debugMessage(\n `cli.ServiceOps.importServiceFromFile: end [file=${filePath}]`\n );\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Import all services from separate files\n * @param {ServiceImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importServicesFromFiles(\n options: ServiceImportOptions = {\n clean: false,\n global: false,\n realm: false,\n }\n): Promise<boolean> {\n try {\n debugMessage(`cli.ServiceOps.importServicesFromFiles: start`);\n const errors: Error[] = [];\n const names = fs.readdirSync(getWorkingDirectory());\n const serviceFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.service.json')\n );\n for (const file of serviceFiles) {\n try {\n await importServicesFromFile(file, options);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length > 0) {\n throw new FrodoError(`Error importing services from files`, errors);\n }\n debugMessage(`cli.ServiceOps.importServicesFromFiles: end`);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Delete a service by id/name\n * @param {string} serviceId Reference to the service to delete\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteService(\n serviceId: string,\n globalConfig = false\n): Promise<boolean> {\n try {\n await deleteFullService(serviceId, globalConfig);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n\n/**\n * Delete all services\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function deleteServices(globalConfig = false): Promise<boolean> {\n try {\n await deleteFullServices(globalConfig);\n return true;\n } catch (error) {\n printError(error);\n }\n return false;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { frodo, state } from '@rockcarver/frodo-lib';
1
+ import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';
2
2
  import fs from 'fs';
3
3
  import os from 'os';
4
4
  import slugify from 'slugify';
@@ -145,7 +145,7 @@ export async function getFullExportConfigFromDirectory(directory) {
145
145
  remove: /[^\w\s$*_+~.()'"!\-@]+/g
146
146
  }) === name);
147
147
  if (!script) {
148
- throw Error(`Can't find the script corresponding to the file '${f.path}' in the export files`);
148
+ throw new FrodoError(`Can't find the script corresponding to the file '${f.path}' in the export files`);
149
149
  }
150
150
  script.script = scriptLines;
151
151
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Config.js","names":["frodo","state","fs","os","slugify","printMessage","getFilePath","readFiles","utils","exportFullConfiguration","config","getDefaultNoiseFilter","cloud","log","FRODO_CONFIG_PATH_KEY","FRODO_LOG_NOISEFILTER_FILENAME","getConfigPath","process","env","homedir","getCustomNoiseFilters","filename","noiseFilter","data","readFileSync","JSON","parse","e","message","getNoiseFilters","defaults","length","writeFileSync","stringify","getFullExportConfig","file","workingDirectory","getDirectory","useStringArrays","noDecode","coords","includeDefault","getFullExportConfigFromDirectory","directory","fullExportConfig","meta","agents","application","authentication","emailTemplate","idp","managedApplication","policy","policyset","resourcetype","saml","hosted","remote","metadata","cot","script","secrets","service","theme","trees","variables","files","jsonFiles","filter","f","path","endsWith","idmConfigFiles","startsWith","samlFiles","otherFiles","scriptFiles","id","value","Object","entries","content","assign","_id","scriptExports","values","name","substring","lastIndexOf","indexOf","scriptLines","split","find","s","replace","remove","Error","isIdUsed","configuration","isEsv","isIdUsedRecurse","RegExp","replaceAll","regex","type","used","location","test"],"sources":["../../src/utils/Config.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { FullExportInterface } from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport fs from 'fs';\nimport os from 'os';\nimport slugify from 'slugify';\n\nimport { printMessage } from './Console';\n\nconst { getFilePath, readFiles } = frodo.utils;\n\nconst { exportFullConfiguration } = frodo.config;\n\nconst { getDefaultNoiseFilter } = frodo.cloud.log;\n\nexport const FRODO_CONFIG_PATH_KEY = 'FRODO_CONFIG_PATH';\nexport const FRODO_LOG_NOISEFILTER_FILENAME = 'LoggingNoiseFilter.json';\n\nexport function getConfigPath(): string {\n return process.env[FRODO_CONFIG_PATH_KEY] || `${os.homedir()}/.frodo`;\n}\n\nfunction getCustomNoiseFilters(): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n let noiseFilter = [];\n try {\n const data = fs.readFileSync(filename, 'utf8');\n noiseFilter = JSON.parse(data);\n } catch (e) {\n printMessage(`Error reading ${filename} (${e.message})`, 'error');\n }\n return noiseFilter;\n}\n\nexport function getNoiseFilters(defaults: boolean): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n if (defaults) {\n printMessage(`Using default logging noise filters.`, 'info');\n return getDefaultNoiseFilter();\n }\n let noiseFilter = getCustomNoiseFilters();\n if (noiseFilter.length == 0) {\n printMessage(`No custom noise filters defined. Using defaults.`, 'info');\n noiseFilter = getDefaultNoiseFilter();\n try {\n fs.writeFileSync(filename, JSON.stringify(noiseFilter, null, 2));\n printMessage(\n `The default filters were saved in ${filename}. You can change the filters as needed.`,\n 'info'\n );\n } catch (e) {\n printMessage(\n `Error creating noise filter configuration with default values.`,\n 'error'\n );\n }\n }\n return noiseFilter;\n}\n\n/**\n * Gets the full export config from one of three locations:\n * 1. The file passed into the function if one is provided.\n * 2. The working directory if it exists (provided by the user)\n * 3. The cloud tenant if the exports are not locally provided\n * @param file The optional file path\n * @returns The full export config\n */\nexport async function getFullExportConfig(\n file: string | null = null\n): Promise<FullExportInterface> {\n // Get export from file if it exists\n if (file) {\n return JSON.parse(fs.readFileSync(getFilePath(file), 'utf8'));\n }\n // If working directory doesn't exist, export from the cloud\n const workingDirectory = state.getDirectory();\n if (!workingDirectory) {\n return await exportFullConfiguration({\n useStringArrays: true,\n noDecode: false,\n coords: true,\n includeDefault: true,\n });\n }\n // Go through files in the working directory and reconstruct the full export\n return getFullExportConfigFromDirectory(workingDirectory);\n}\n\n/**\n * Reconstructs the full export config from files in the given directory\n * @param directory The directory\n * @return The full export config\n */\nexport async function getFullExportConfigFromDirectory(\n directory: string\n): Promise<FullExportInterface> {\n const fullExportConfig = {\n meta: {},\n agents: {},\n application: {},\n authentication: {},\n config: {},\n emailTemplate: {},\n idp: {},\n managedApplication: {},\n policy: {},\n policyset: {},\n resourcetype: {},\n saml: {\n hosted: {},\n remote: {},\n metadata: {},\n cot: {},\n },\n script: {},\n secrets: {},\n service: {},\n theme: {},\n trees: {},\n variables: {},\n } as FullExportInterface;\n const files = await readFiles(directory);\n const jsonFiles = files.filter((f) => f.path.endsWith('.json'));\n const idmConfigFiles = jsonFiles.filter((f) => f.path.startsWith('config/'));\n const samlFiles = jsonFiles.filter(\n (f) => f.path.startsWith('saml/') || f.path.startsWith('cot/')\n );\n const otherFiles = jsonFiles.filter(\n (f) =>\n !f.path.startsWith('config/') &&\n !f.path.startsWith('saml/') &&\n !f.path.startsWith('cot/')\n );\n const scriptFiles = files.filter(\n (f) => f.path.endsWith('.js') || f.path.endsWith('.groovy')\n );\n // Handle json files\n for (const f of otherFiles) {\n for (const [id, value] of Object.entries(JSON.parse(f.content))) {\n if (value == null || fullExportConfig[id] == null) {\n continue;\n }\n Object.assign(fullExportConfig[id], value);\n }\n }\n // Handle saml files\n for (const f of samlFiles) {\n let content = JSON.parse(f.content);\n content = content.saml;\n for (const [id, value] of Object.entries(content)) {\n Object.assign(fullExportConfig.saml[id], value);\n }\n }\n // Handle idm config files\n for (const f of idmConfigFiles) {\n const content = JSON.parse(f.content);\n fullExportConfig.config[content._id] = content;\n }\n // Handle extracted scripts, adding them to their corresponding script objects in the export\n if (scriptFiles.length > 0 && fullExportConfig.script != null) {\n const scriptExports = Object.values(fullExportConfig.script);\n for (const f of scriptFiles) {\n const name = f.path.substring(\n f.path.lastIndexOf('/') + 1,\n f.path.indexOf('.', f.path.lastIndexOf('/'))\n );\n const scriptLines = f.content.split('\\n');\n const script = scriptExports.find(\n (s) =>\n slugify(s.name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n }) === name\n );\n if (!script) {\n throw Error(\n `Can't find the script corresponding to the file '${f.path}' in the export files`\n );\n }\n script.script = scriptLines;\n }\n }\n return fullExportConfig;\n}\n\n/**\n * Determines if a string id is being used anywhere within the given configuration object\n * @param configuration The configuration object\n * @param id The id being search for\n * @param isEsv Whether the id corresponds to an ESV or not\n */\nexport function isIdUsed(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n id: string,\n isEsv: boolean\n): {\n used: boolean;\n location: string;\n} {\n return isIdUsedRecurse(\n configuration,\n isEsv\n ? // For ESV ids, they contain either letters, numbers, dashes, or underscores. The dashes get replaced with periods (escaped with a \\ for the regex)\n // since anywhere they are being used they will be used with periods, not dashes. Note that the (?:[^a-z0-9._]|$) expressions at the beginning and\n // end are meant to ensure that the id found is not a substring of some other id (i.e. the id found must either be at the beginning or end of the\n // string, or if in the middle of a string, is not preceded or followed by a character that would be part of another id).\n new RegExp(\n `(?:[^a-z0-9._]|^)${id.replaceAll('-', '\\\\.')}(?:[^a-z0-9._]|$)`\n )\n : // For normal ids, they contain only letters, numbers, or dashes.\n new RegExp(`(?:[^a-z0-9-]|^)${id}(?:[^a-z0-9-]|$)`)\n );\n}\n\n/**\n * Recursive helper for isIdUsed that finds any strings contained in the configuration that pass the regex\n * @param configuration The configuration (could be anything)\n * @param regex The regex test\n */\nfunction isIdUsedRecurse(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n regex: RegExp\n): {\n used: boolean;\n location: string;\n} {\n const type = typeof configuration;\n if (type === 'object' && configuration !== null) {\n for (const [id, value] of Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration as Record<string, any>\n )) {\n const isIdUsed = isIdUsedRecurse(value, regex);\n if (isIdUsed.used) {\n isIdUsed.location =\n id +\n (value.name ? `(name: '${value.name}')` : '') +\n (isIdUsed.location === '' ? '' : '.') +\n isIdUsed.location;\n return isIdUsed;\n }\n }\n }\n return {\n used: type === 'string' && regex.test(configuration),\n location: '',\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Config.js","names":["frodo","FrodoError","state","fs","os","slugify","printMessage","getFilePath","readFiles","utils","exportFullConfiguration","config","getDefaultNoiseFilter","cloud","log","FRODO_CONFIG_PATH_KEY","FRODO_LOG_NOISEFILTER_FILENAME","getConfigPath","process","env","homedir","getCustomNoiseFilters","filename","noiseFilter","data","readFileSync","JSON","parse","e","message","getNoiseFilters","defaults","length","writeFileSync","stringify","getFullExportConfig","file","workingDirectory","getDirectory","useStringArrays","noDecode","coords","includeDefault","getFullExportConfigFromDirectory","directory","fullExportConfig","meta","agents","application","authentication","emailTemplate","idp","managedApplication","policy","policyset","resourcetype","saml","hosted","remote","metadata","cot","script","secrets","service","theme","trees","variables","files","jsonFiles","filter","f","path","endsWith","idmConfigFiles","startsWith","samlFiles","otherFiles","scriptFiles","id","value","Object","entries","content","assign","_id","scriptExports","values","name","substring","lastIndexOf","indexOf","scriptLines","split","find","s","replace","remove","isIdUsed","configuration","isEsv","isIdUsedRecurse","RegExp","replaceAll","regex","type","used","location","test"],"sources":["../../src/utils/Config.ts"],"sourcesContent":["import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';\nimport { FullExportInterface } from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport fs from 'fs';\nimport os from 'os';\nimport slugify from 'slugify';\n\nimport { printMessage } from './Console';\n\nconst { getFilePath, readFiles } = frodo.utils;\n\nconst { exportFullConfiguration } = frodo.config;\n\nconst { getDefaultNoiseFilter } = frodo.cloud.log;\n\nexport const FRODO_CONFIG_PATH_KEY = 'FRODO_CONFIG_PATH';\nexport const FRODO_LOG_NOISEFILTER_FILENAME = 'LoggingNoiseFilter.json';\n\nexport function getConfigPath(): string {\n return process.env[FRODO_CONFIG_PATH_KEY] || `${os.homedir()}/.frodo`;\n}\n\nfunction getCustomNoiseFilters(): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n let noiseFilter = [];\n try {\n const data = fs.readFileSync(filename, 'utf8');\n noiseFilter = JSON.parse(data);\n } catch (e) {\n printMessage(`Error reading ${filename} (${e.message})`, 'error');\n }\n return noiseFilter;\n}\n\nexport function getNoiseFilters(defaults: boolean): Array<string> {\n const filename = `${getConfigPath()}/${FRODO_LOG_NOISEFILTER_FILENAME}`;\n if (defaults) {\n printMessage(`Using default logging noise filters.`, 'info');\n return getDefaultNoiseFilter();\n }\n let noiseFilter = getCustomNoiseFilters();\n if (noiseFilter.length == 0) {\n printMessage(`No custom noise filters defined. Using defaults.`, 'info');\n noiseFilter = getDefaultNoiseFilter();\n try {\n fs.writeFileSync(filename, JSON.stringify(noiseFilter, null, 2));\n printMessage(\n `The default filters were saved in ${filename}. You can change the filters as needed.`,\n 'info'\n );\n } catch (e) {\n printMessage(\n `Error creating noise filter configuration with default values.`,\n 'error'\n );\n }\n }\n return noiseFilter;\n}\n\n/**\n * Gets the full export config from one of three locations:\n * 1. The file passed into the function if one is provided.\n * 2. The working directory if it exists (provided by the user)\n * 3. The cloud tenant if the exports are not locally provided\n * @param file The optional file path\n * @returns The full export config\n */\nexport async function getFullExportConfig(\n file: string | null = null\n): Promise<FullExportInterface> {\n // Get export from file if it exists\n if (file) {\n return JSON.parse(fs.readFileSync(getFilePath(file), 'utf8'));\n }\n // If working directory doesn't exist, export from the cloud\n const workingDirectory = state.getDirectory();\n if (!workingDirectory) {\n return await exportFullConfiguration({\n useStringArrays: true,\n noDecode: false,\n coords: true,\n includeDefault: true,\n });\n }\n // Go through files in the working directory and reconstruct the full export\n return getFullExportConfigFromDirectory(workingDirectory);\n}\n\n/**\n * Reconstructs the full export config from files in the given directory\n * @param directory The directory\n * @return The full export config\n */\nexport async function getFullExportConfigFromDirectory(\n directory: string\n): Promise<FullExportInterface> {\n const fullExportConfig = {\n meta: {},\n agents: {},\n application: {},\n authentication: {},\n config: {},\n emailTemplate: {},\n idp: {},\n managedApplication: {},\n policy: {},\n policyset: {},\n resourcetype: {},\n saml: {\n hosted: {},\n remote: {},\n metadata: {},\n cot: {},\n },\n script: {},\n secrets: {},\n service: {},\n theme: {},\n trees: {},\n variables: {},\n } as FullExportInterface;\n const files = await readFiles(directory);\n const jsonFiles = files.filter((f) => f.path.endsWith('.json'));\n const idmConfigFiles = jsonFiles.filter((f) => f.path.startsWith('config/'));\n const samlFiles = jsonFiles.filter(\n (f) => f.path.startsWith('saml/') || f.path.startsWith('cot/')\n );\n const otherFiles = jsonFiles.filter(\n (f) =>\n !f.path.startsWith('config/') &&\n !f.path.startsWith('saml/') &&\n !f.path.startsWith('cot/')\n );\n const scriptFiles = files.filter(\n (f) => f.path.endsWith('.js') || f.path.endsWith('.groovy')\n );\n // Handle json files\n for (const f of otherFiles) {\n for (const [id, value] of Object.entries(JSON.parse(f.content))) {\n if (value == null || fullExportConfig[id] == null) {\n continue;\n }\n Object.assign(fullExportConfig[id], value);\n }\n }\n // Handle saml files\n for (const f of samlFiles) {\n let content = JSON.parse(f.content);\n content = content.saml;\n for (const [id, value] of Object.entries(content)) {\n Object.assign(fullExportConfig.saml[id], value);\n }\n }\n // Handle idm config files\n for (const f of idmConfigFiles) {\n const content = JSON.parse(f.content);\n fullExportConfig.config[content._id] = content;\n }\n // Handle extracted scripts, adding them to their corresponding script objects in the export\n if (scriptFiles.length > 0 && fullExportConfig.script != null) {\n const scriptExports = Object.values(fullExportConfig.script);\n for (const f of scriptFiles) {\n const name = f.path.substring(\n f.path.lastIndexOf('/') + 1,\n f.path.indexOf('.', f.path.lastIndexOf('/'))\n );\n const scriptLines = f.content.split('\\n');\n const script = scriptExports.find(\n (s) =>\n slugify(s.name.replace(/^http(s?):\\/\\//, ''), {\n remove: /[^\\w\\s$*_+~.()'\"!\\-@]+/g,\n }) === name\n );\n if (!script) {\n throw new FrodoError(\n `Can't find the script corresponding to the file '${f.path}' in the export files`\n );\n }\n script.script = scriptLines;\n }\n }\n return fullExportConfig;\n}\n\n/**\n * Determines if a string id is being used anywhere within the given configuration object\n * @param configuration The configuration object\n * @param id The id being search for\n * @param isEsv Whether the id corresponds to an ESV or not\n */\nexport function isIdUsed(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n id: string,\n isEsv: boolean\n): {\n used: boolean;\n location: string;\n} {\n return isIdUsedRecurse(\n configuration,\n isEsv\n ? // For ESV ids, they contain either letters, numbers, dashes, or underscores. The dashes get replaced with periods (escaped with a \\ for the regex)\n // since anywhere they are being used they will be used with periods, not dashes. Note that the (?:[^a-z0-9._]|$) expressions at the beginning and\n // end are meant to ensure that the id found is not a substring of some other id (i.e. the id found must either be at the beginning or end of the\n // string, or if in the middle of a string, is not preceded or followed by a character that would be part of another id).\n new RegExp(\n `(?:[^a-z0-9._]|^)${id.replaceAll('-', '\\\\.')}(?:[^a-z0-9._]|$)`\n )\n : // For normal ids, they contain only letters, numbers, or dashes.\n new RegExp(`(?:[^a-z0-9-]|^)${id}(?:[^a-z0-9-]|$)`)\n );\n}\n\n/**\n * Recursive helper for isIdUsed that finds any strings contained in the configuration that pass the regex\n * @param configuration The configuration (could be anything)\n * @param regex The regex test\n */\nfunction isIdUsedRecurse(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration: any,\n regex: RegExp\n): {\n used: boolean;\n location: string;\n} {\n const type = typeof configuration;\n if (type === 'object' && configuration !== null) {\n for (const [id, value] of Object.entries(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n configuration as Record<string, any>\n )) {\n const isIdUsed = isIdUsedRecurse(value, regex);\n if (isIdUsed.used) {\n isIdUsed.location =\n id +\n (value.name ? `(name: '${value.name}')` : '') +\n (isIdUsed.location === '' ? '' : '.') +\n isIdUsed.location;\n return isIdUsed;\n }\n }\n }\n return {\n used: type === 'string' && regex.test(configuration),\n location: '',\n };\n}\n"],"mappings":"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"}
@@ -245,7 +245,10 @@ function createProgressBar(total, message = null, options = {
245
245
  clearOnComplete: false,
246
246
  hideCursor: true,
247
247
  format: '[{bar}] {percentage}% | {value}/{total} | {data}',
248
- noTTYOutput: true
248
+ noTTYOutput: true,
249
+ forceRedraw: true,
250
+ gracefulExit: true,
251
+ stopOnComplete: true
249
252
  }) {
250
253
  debugMessage(`cli.Console.createProgressBar: start`);
251
254
  let opt = options;
@@ -254,7 +257,10 @@ function createProgressBar(total, message = null, options = {
254
257
  clearOnComplete: false,
255
258
  hideCursor: true,
256
259
  format: '[{bar}] {percentage}% | {value}/{total}',
257
- noTTYOutput: true
260
+ noTTYOutput: true,
261
+ forceRedraw: true,
262
+ gracefulExit: true,
263
+ stopOnComplete: true
258
264
  };
259
265
  }
260
266
  if (!multiBarContainer) {