@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.
- package/CHANGELOG.md +18 -1
- package/esm/cli/config/config-export.js +13 -8
- package/esm/cli/config/config-export.js.map +1 -1
- package/esm/cli/config/config-import.js +16 -10
- package/esm/cli/config/config-import.js.map +1 -1
- package/esm/cli/script/script-export.js +2 -2
- package/esm/cli/script/script-export.js.map +1 -1
- package/esm/ops/ConfigOps.js +37 -8
- package/esm/ops/ConfigOps.js.map +1 -1
- package/esm/ops/IdmOps.js +6 -1
- package/esm/ops/IdmOps.js.map +1 -1
- package/esm/ops/ScriptOps.js +5 -2
- package/esm/ops/ScriptOps.js.map +1 -1
- package/esm/ops/ServiceOps.js +12 -10
- package/esm/ops/ServiceOps.js.map +1 -1
- package/esm/utils/Config.js +2 -2
- package/esm/utils/Config.js.map +1 -1
- package/esm/utils/Console.js +8 -2
- package/esm/utils/Console.js.map +1 -1
- package/package.json +2 -2
package/esm/ops/ScriptOps.js
CHANGED
|
@@ -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`);
|
package/esm/ops/ScriptOps.js.map
CHANGED
|
@@ -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":"AAAA,SAASA,KAAK,EAAEC,UAAU,EAAEC,KAAK,QAAQ,uBAAuB;AAMhE,OAAOC,QAAQ,MAAM,UAAU;AAC/B,OAAOC,EAAE,MAAM,IAAI;AAEnB,SAASC,mBAAmB,EAAEC,QAAQ,QAAQ,iBAAiB;AAC/D,SACEC,uBAAuB,EACvBC,WAAW,EACXC,YAAY,EACZC,WAAW,EACXC,UAAU,EACVC,YAAY,EACZC,WAAW,EACXC,WAAW,EACXC,qBAAqB,EACrBC,cAAc,EACdC,uBAAuB,QAClB,kBAAkB;AACzB,OAAOC,QAAQ,MAAM,kBAAkB;AAEvC,MAAM;EACJC,gBAAgB;EAChBC,UAAU;EACVC,cAAc;EACdC,cAAc;EACdC,SAAS;EACTC,eAAe;EACfC,WAAW;EACXC;AACF,CAAC,GAAG1B,KAAK,CAAC2B,KAAK;AACf,MAAM;EACJC,WAAW;EACXC,YAAY;EACZC,kBAAkB;EAClBC,aAAa;EACbC,aAAa;EACbC,YAAY;EACZC,kBAAkB;EAClBC;AACF,CAAC,GAAGnC,KAAK,CAACoC,MAAM;;AAEhB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CAACC,SAAyB,EAAU;EACvE,MAAMC,WAAW,GAAI,IAAGD,SAAS,CAACE,GAAG,CAAC,YAAY,CAAE,KAAIF,SAAS,CAACG,OAAQ,MAAKH,SAAS,CAACI,IAAK,EAAC;EAC/F,OAAOH,WAAW;AACpB;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASI,gBAAgBA,CAAA,EAAW;EACzC,IAAIC,QAAQ,GAAG,EAAE;EACjBA,QAAQ,IAAI,mCAAmC;EAC/CA,QAAQ,IAAI,iCAAiC;EAC7C,OAAOA,QAAQ;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAACP,SAAyB,EAAU;EAC/D,MAAMQ,OAAO,GAAG;IAAEC,UAAU,EAAE,aAAa;IAAEC,MAAM,EAAE;EAAS,CAAC;EAC/D,MAAMT,WAAW,GAAI,KAAID,SAAS,CAACI,IAAK,MACtCI,OAAO,CAACR,SAAS,CAACW,QAAQ,CAC3B,MAAK1B,SAAS,CAACe,SAAS,CAACG,OAAO,CAACS,KAAK,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,CAAE,QACtDb,SAAS,CAACE,GACX,MAAK;EACN,OAAOD,WAAW;AACpB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAea,WAAWA,CAC/BC,IAAa,GAAG,KAAK,EACrBC,KAAc,GAAG,KAAK,EACtBC,IAAmB,GAAG,IAAI,EACR;EAClB,IAAIC,SAAiB;EACrB,IAAIC,OAAyB,GAAG,EAAE;EAClChD,YAAY,CAAE,kCAAiC,CAAC;EAChD,IAAI;IACF+C,SAAS,GAAGjD,uBAAuB,CACjC,eAAe,EACf,CAAC,EACA,oBACH,CAAC;IACDkD,OAAO,GAAG,MAAM7B,WAAW,CAAC,CAAC;IAC7B6B,OAAO,CAACC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACjB,IAAI,CAACmB,aAAa,CAACD,CAAC,CAAClB,IAAI,CAAC,CAAC;IACpD3B,qBAAqB,CACnByC,SAAS,EACR,qBAAoBC,OAAO,CAACK,MAAO,WAAU,EAC9C,SACF,CAAC;EACH,CAAC,CAAC,OAAOC,KAAK,EAAE;IACdhD,qBAAqB,CAACyC,SAAS,EAAG,uBAAsB,EAAE,MAAM,CAAC;IACjE7C,UAAU,CAACoD,KAAK,CAAC;IACjB,OAAO,KAAK;EACd;EACA,IAAI,CAACV,IAAI,IAAI,CAACC,KAAK,EAAE;IACnBG,OAAO,CAACO,OAAO,CAAE5B,MAAM,IAAK;MAC1BxB,YAAY,CAAE,GAAEwB,MAAM,CAACM,IAAK,EAAC,EAAE,MAAM,CAAC;IACxC,CAAC,CAAC;IACFjC,YAAY,CAAE,gCAA+B,CAAC;IAC9C,OAAO,IAAI;EACb;EACA,IAAIwD,UAAU,GAAG,IAAI;EACrB,MAAMC,OAAO,GAAGb,IAAI,GAChB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,GACtD,CAAC,MAAM,CAAC;EACZ,IAAIC,KAAK,EAAE;IACT,IAAI;MACFW,UAAU,GAAG,MAAM5D,mBAAmB,CAACkD,IAAI,CAAC;IAC9C,CAAC,CAAC,OAAOQ,KAAK,EAAE;MACdpD,UAAU,CAACoD,KAAK,CAAC;MACjB,OAAO,KAAK;IACd;IACA;IACA,OAAOE,UAAU,CAAC7B,MAAM;IACxB8B,OAAO,CAACC,IAAI,CAAC,MAAM,CAAC;EACtB;EACA,MAAMC,KAAK,GAAG5D,WAAW,CAAC0D,OAAO,CAAC;EAClC,MAAMpB,OAAO,GAAG;IAAEC,UAAU,EAAE,IAAI;IAAEC,MAAM,EAAE;EAAS,CAAC;EACtDS,OAAO,CAACO,OAAO,CAAE5B,MAAM,IAAK;IAC1B,MAAMiC,MAAM,GAAGhB,IAAI,GACf,CACEnC,QAAQ,CAACkB,MAAM,CAACM,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAC/BN,MAAM,CAACI,GAAG,EACVM,OAAO,CAACV,MAAM,CAACa,QAAQ,CAAC,EACxB/B,QAAQ,CAACK,SAAS,CAACa,MAAM,CAACK,OAAO,CAACS,KAAK,CAAC,GAAG,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAC5DjC,QAAQ,CAACkB,MAAM,CAACG,WAAW,EAAE,EAAE,CAAC,CACjC,GACD,CAACrB,QAAQ,CAACkB,MAAM,CAACM,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACrC,IAAIY,KAAK,EAAE;MACT,MAAMgB,YAAY,GAAGhE,QAAQ,CAAC2D,UAAU,EAAE7B,MAAM,CAACI,GAAG,EAAE,KAAK,CAAC;MAC5D6B,MAAM,CAACF,IAAI,CACTG,YAAY,CAACC,IAAI,GACZ,GAAE,KAAK,CAAC,aAAa,CAAE,QAAOD,YAAY,CAACE,QAAS,GAAE,GACvD,IAAI,CAAC,WAAW,CACtB,CAAC;IACH;IACAJ,KAAK,CAACD,IAAI,CAACE,MAAM,CAAC;EACpB,CAAC,CAAC;EACFzD,YAAY,CAACwD,KAAK,CAACK,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;EACtChE,YAAY,CAAE,gCAA+B,CAAC;EAC9C,OAAO,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeiE,kBAAkBA,CACtCC,QAAgB,EAChBpB,IAAY,EACZqB,WAAoB,GAAG,IAAI,EACT;EAClBnE,YAAY,CAAE,yCAAwC,CAAC;EACvD,IAAI;IACFI,WAAW,CAAE,qBAAoB8D,QAAS,MAAK,CAAC;IAChD,IAAIE,QAAQ,GAAG1D,gBAAgB,CAACwD,QAAQ,EAAE,QAAQ,CAAC;IACnD,IAAIpB,IAAI,EAAE;MACRsB,QAAQ,GAAGtB,IAAI;IACjB;IACA,MAAMuB,QAAQ,GAAGrD,WAAW,CAACoD,QAAQ,EAAE,IAAI,CAAC;IAC5C/D,WAAW,CAAE,qBAAoB6D,QAAS,SAAQG,QAAS,MAAK,CAAC;IACjE,MAAMC,YAAY,GAAG,MAAMlD,YAAY,CAAC8C,QAAQ,CAAC;IACjDtD,cAAc,CAAC0D,YAAY,EAAED,QAAQ,EAAEF,WAAW,CAAC;IACnD5D,cAAc,CAAE,oBAAmB2D,QAAS,SAAQG,QAAS,IAAG,CAAC;IACjErE,YAAY,CAAE,uCAAsC,CAAC;IACrD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOsD,KAAK,EAAE;IACdrD,WAAW,CAAE,2BAA0BiE,QAAS,GAAE,CAAC;IACnDhE,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeiB,wBAAwBA,CAC5CtC,IAAY,EACZa,IAAY,EACZqB,WAAoB,GAAG,IAAI,EAC3BK,OAAgB,GAAG,KAAK,EACN;EAClBxE,YAAY,CAAE,+CAA8C,CAAC;EAC7D,IAAI;IACFI,WAAW,CAAE,qBAAoB6B,IAAK,MAAK,CAAC;IAC5C,IAAImC,QAAQ,GAAG1D,gBAAgB,CAACuB,IAAI,EAAE,QAAQ,CAAC;IAC/C,IAAIa,IAAI,EAAE;MACRsB,QAAQ,GAAGtB,IAAI;IACjB;IACA,MAAMuB,QAAQ,GAAGrD,WAAW,CAACoD,QAAQ,EAAE,IAAI,CAAC;IAC5C/D,WAAW,CAAE,qBAAoB4B,IAAK,SAAQoC,QAAS,MAAK,CAAC;IAC7D,MAAMC,YAAY,GAAG,MAAMjD,kBAAkB,CAACY,IAAI,CAAC;IACnD,IAAIuC,OAAO,EAAEC,mBAAmB,CAACH,YAAY,CAAC;IAC9C1D,cAAc,CAAC0D,YAAY,EAAED,QAAQ,EAAEF,WAAW,CAAC;IACnD5D,cAAc,CAAE,oBAAmB0B,IAAK,SAAQoC,QAAS,IAAG,CAAC;IAC7DrE,YAAY,CAAE,6CAA4C,CAAC;IAC3D,OAAO,IAAI;EACb,CAAC,CAAC,OAAOsD,KAAK,EAAE;IACdrD,WAAW,CAAE,2BAA0BgC,IAAK,MAAKqB,KAAK,CAACoB,OAAQ,EAAC,CAAC;IACjExE,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeqB,mBAAmBA,CACvC7B,IAAY,EACZqB,WAAoB,GAAG,IAAI,EAC3BS,cAAuB,GAAG,KAAK,EACb;EAClB5E,YAAY,CAAE,0CAAyC,CAAC;EACxD,IAAI;IACF,IAAIoE,QAAQ,GAAG1D,gBAAgB,CAC5B,MAAKI,SAAS,CAACrB,KAAK,CAACoF,QAAQ,CAAC,CAAC,CAAE,SAAQ,EAC1C,QACF,CAAC;IACD,IAAI/B,IAAI,EAAE;MACRsB,QAAQ,GAAGtB,IAAI;IACjB;IACA,MAAMwB,YAAY,GAAG,MAAMhD,aAAa,CAACsD,cAAc,CAAC;IACxDhE,cAAc,CAAC0D,YAAY,EAAEtD,WAAW,CAACoD,QAAQ,EAAE,IAAI,CAAC,EAAED,WAAW,CAAC;IACtEnE,YAAY,CAAE,wCAAuC,CAAC;IACtD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOsD,KAAK,EAAE;IACdpD,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAewB,oBAAoBA,CACxCN,OAAgB,GAAG,KAAK,EACxBL,WAAoB,GAAG,IAAI,EAC3BS,cAAuB,GAAG,KAAK,EACb;EAClB5E,YAAY,CAAE,2CAA0C,CAAC;EACzD,MAAM+E,MAAe,GAAG,EAAE;EAC1B,IAAIC,KAAa;EACjB,IAAI;IACF,IAAIC,UAAU,GAAG,MAAM9D,WAAW,CAAC,CAAC;IACpC,IAAI,CAACyD,cAAc,EACjBK,UAAU,GAAGA,UAAU,CAACC,MAAM,CAAEvD,MAAM,IAAK,CAACA,MAAM,CAACwD,OAAO,CAAC;IAC7DH,KAAK,GAAGlF,uBAAuB,CAC7B,aAAa,EACbmF,UAAU,CAAC5B,MAAM,EACjB,0CACF,CAAC;IACD,KAAK,MAAM1B,MAAM,IAAIsD,UAAU,EAAE;MAC/B,MAAMG,SAAS,GAAGtF,uBAAuB,CACvC,aAAa,EACb,CAAC,EACA,oBAAmB6B,MAAM,CAACM,IAAK,KAClC,CAAC;MACD,MAAMa,IAAI,GAAG9B,WAAW,CAACN,gBAAgB,CAACiB,MAAM,CAACM,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC;MACvE,IAAI;QACF,MAAMqC,YAAY,GAAG,MAAMjD,kBAAkB,CAACM,MAAM,CAACM,IAAI,CAAC;QAC1D,IAAIuC,OAAO,EAAEC,mBAAmB,CAACH,YAAY,CAAC;QAC9C1D,cAAc,CAAC0D,YAAY,EAAExB,IAAI,EAAEqB,WAAW,CAAC;QAC/C3D,uBAAuB,CAAC4E,SAAS,EAAG,UAASzD,MAAM,CAACM,IAAK,OAAMa,IAAK,GAAE,CAAC;QACvExC,qBAAqB,CAAC8E,SAAS,EAAG,GAAEzD,MAAM,CAACM,IAAK,aAAYa,IAAK,GAAE,CAAC;MACtE,CAAC,CAAC,OAAOQ,KAAK,EAAE;QACdhD,qBAAqB,CACnB8E,SAAS,EACR,mBAAkBzD,MAAM,CAACM,IAAK,EAAC,EAChC,MACF,CAAC;QACD8C,MAAM,CAACrB,IAAI,CAACJ,KAAK,CAAC;MACpB;MACA9C,uBAAuB,CAACwE,KAAK,EAAG,mBAAkBrD,MAAM,CAACM,IAAK,EAAC,CAAC;IAClE;IACA,IAAI8C,MAAM,CAAC1B,MAAM,GAAG,CAAC,EAAE;MACrB,MAAM,IAAI7D,UAAU,CAAE,yBAAwB,EAAEuF,MAAM,CAAC;IACzD;IACAzE,qBAAqB,CACnB0E,KAAK,EACJ,YAAWC,UAAU,CAAC5B,MAAO,+BAChC,CAAC;IACDrD,YAAY,CAAE,yCAAwC,CAAC;IACvD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOsD,KAAK,EAAE;IACdhD,qBAAqB,CAAC0E,KAAK,EAAG,yBAAwB,CAAC;IACvD9E,UAAU,CAACoD,KAAK,CAAC;EACnB;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASmB,mBAAmBA,CACjCH,YAAmC,EACnCJ,QAAiB,EACjBmB,SAAkB,EACT;EACT,IAAI;IACF,MAAMC,cAAc,GAAGpB,QAAQ,GAC3BI,YAAY,CAAC3C,MAAM,CAACuC,QAAQ,CAAC,GAC7BqB,iBAAiB,CAACjB,YAAY,CAAC;IACnC,MAAMkB,aAAa,GACjBF,cAAc,CAAC9C,QAAQ,KAAK,YAAY,GAAG,IAAI,GAAG,QAAQ;IAC5D,MAAMiD,cAAc,GAAG/E,gBAAgB,CACrC4E,cAAc,CAACrD,IAAI,EACnB,QAAQ,EACRuD,aACF,CAAC;IACD,MAAME,cAAc,GAAG1E,WAAW,CAChC,CAACqE,SAAS,GAAI,GAAEA,SAAU,GAAE,GAAG,EAAE,IAAII,cAAc,EACnD,IACF,CAAC;IACD,MAAME,UAAU,GAAGC,KAAK,CAACC,OAAO,CAACP,cAAc,CAAC3D,MAAM,CAAC,GACnD2D,cAAc,CAAC3D,MAAM,CAACe,IAAI,CAAC,IAAI,CAAC,GAChC4C,cAAc,CAAC3D,MAAM;IACzB2D,cAAc,CAAC3D,MAAM,GAAI,UAAS+D,cAAe,EAAC;IAClD7E,cAAc,CAAC8E,UAAU,EAAED,cAAc,CAAC;IAC1C,OAAO,IAAI;EACb,CAAC,CAAC,OAAOpC,KAAK,EAAE;IACdpD,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;AAEA,SAASwC,iBAAiBA,CAACC,UAAiC,EAAW;EACrE/F,YAAY,CAAE,wCAAuC,CAAC;EACtD,IAAIgG,SAAS,GAAG,IAAI;EACpB,KAAK,MAAM9B,QAAQ,IAAI+B,MAAM,CAACC,IAAI,CAACH,UAAU,CAACpE,MAAM,CAAC,EAAE;IACrD,MAAMA,MAAM,GAAGoE,UAAU,CAACpE,MAAM,CAACuC,QAAQ,CAAC,CAACvC,MAAM;IACjD,IAAIiE,KAAK,CAACC,OAAO,CAAClE,MAAM,CAAC,EAAE;MACzB3B,YAAY,CAAE,yDAAwD,CAAC;MACvEgG,SAAS,GAAG,KAAK;MACjB;IACF;IACA,IAAIrF,UAAU,CAACgB,MAAgB,CAAC,EAAE;MAChC3B,YAAY,CAAE,sDAAqD,CAAC;MACpEgG,SAAS,GAAG,IAAI;MAChB;IACF;IACA,IAAIjF,eAAe,EAAE;MACnBf,YAAY,CAAE,2DAA0D,CAAC;MACzEgG,SAAS,GAAG,KAAK;MACjB;IACF;IACA;EACF;EACAhG,YAAY,CAAE,mDAAkDgG,SAAU,GAAE,CAAC;EAC7E,OAAOA,SAAS;AAClB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeG,qBAAqBA,CACzClE,IAAY,EACZa,IAAY,EACZsD,OAA4B,GAAG;EAC7BC,MAAM,EAAE,KAAK;EACbzB,cAAc,EAAE;AAClB,CAAC,EACiB;EAClB,MAAMP,QAAQ,GAAGrD,WAAW,CAAC8B,IAAI,CAAC;EAClC9C,YAAY,CAAE,4CAA2C,CAAC;EAC1D,IAAI;IACF,MAAMsG,IAAI,GAAG3G,EAAE,CAAC4G,YAAY,CAAClC,QAAQ,EAAE,MAAM,CAAC;IAC9C,MAAM0B,UAAiC,GAAGS,IAAI,CAACC,KAAK,CAACH,IAAI,CAAC;IAC1D,IAAIR,iBAAiB,CAACC,UAAU,CAAC,EAAE;MACjC,MAAMW,sBAAsB,CAACrC,QAAQ,EAAE+B,OAAO,EAAE,KAAK,CAAC;IACxD,CAAC,MAAM;MACL,MAAM7E,aAAa,CAACU,IAAI,EAAE8D,UAAU,EAAEK,OAAO,CAAC;IAChD;IACApG,YAAY,CAAE,0CAAyC,CAAC;IACxD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOsD,KAAK,EAAE;IACdpD,UAAU,CAACoD,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeqD,sBAAsBA,CAC1CC,KAAc,EACdR,OAA4B,EAC5BS,eAAwB,EACT;EACf;EACAT,OAAO,CAACC,MAAM,GAAGO,KAAK,GAAG,KAAK,GAAGR,OAAO,CAACC,MAAM;;EAE/C;AACF;AACA;EACE;EACA,eAAeS,QAAQA,CAACC,IAAY,EAAEC,MAAiB,EAAiB;IACtE,IAAI;MACF,MAAMN,sBAAsB,CAACK,IAAI,EAAEX,OAAO,EAAES,eAAe,CAAC;IAC9D,CAAC,CAAC,OAAOvD,KAAK,EAAE;MACdpD,UAAU,CAACoD,KAAK,EAAG,GAAEyD,IAAK,EAAC,CAAC;IAC9B;EACF;;EAEA;EACA,MAAME,OAAO,GAAGvH,QAAQ,CAACkH,KAAK,CAC5B,CACG,GAAE3F,mBAAmB,CAAC,CAAE,mBAAkB,EAC1C,GAAEA,mBAAmB,CAAC,CAAE,iBAAgB,EACxC,GAAEA,mBAAmB,CAAC,CAAE,qBAAoB,CAC9C,EACD;IACEiG,UAAU,EAAEN,KAAK;IACjBO,aAAa,EAAEP;EACjB,CACF,CAAC;EAEDK,OAAO,CACJG,EAAE,CAAC,KAAK,EAAEN,QAAQ,CAAC,CACnBM,EAAE,CAAC,QAAQ,EAAEN,QAAQ,CAAC,CACtBM,EAAE,CAAC,OAAO,EAAG9D,KAAK,IAAK;IACtBpD,UAAU,CAACoD,KAAK,EAAG,eAAc,CAAC;IAClC2D,OAAO,CAACI,KAAK,CAAC,CAAC;EACjB,CAAC,CAAC,CACDD,EAAE,CAAC,OAAO,EAAE,MAAM;IACjB,IAAIR,KAAK,EAAE;MACTzG,YAAY,CAAC,yBAAyB,CAAC;IACzC,CAAC,MAAM;MACL8G,OAAO,CAACI,KAAK,CAAC,CAAC;MACflH,YAAY,CAAC,OAAO,CAAC;IACvB;EACF,CAAC,CAAC;AACN;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAeuG,sBAAsBA,CACnC5D,IAAY,EACZsD,OAA4B,EAC5BS,eAAwB,EACxB;EACA7G,YAAY,CAAE,6CAA4C,CAAC;EAC3D,MAAMsH,UAAU,GAAGC,aAAa,CAACzE,IAAI,CAAC;EACtC,MAAMnB,MAAM,GAAG6F,2BAA2B,CAACF,UAAU,CAAC;EAEtD,MAAMG,QAAQ,GAAG,MAAMlG,aAAa,CAAC,EAAE,EAAEI,MAAM,EAAEyE,OAAO,EAAES,eAAe,CAAC;EAC1E,IAAIY,QAAQ,EAAE;IACZtH,YAAY,CAAE,aAAYmH,UAAW,GAAE,CAAC;EAC1C;EACAtH,YAAY,CAAE,2CAA0C,CAAC;AAC3D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASuH,aAAaA,CAACzE,IAAY,EAAU;EAC3C,IAAIA,IAAI,CAAC4E,QAAQ,CAAC,cAAc,CAAC,EAAE;IACjC,OAAO5E,IAAI;EACb;EACA,OAAOA,IAAI,CAAC6E,OAAO,CAAC,uBAAuB,EAAE,cAAc,CAAC;AAC9D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASH,2BAA2BA,CAClCF,UAAkB,EACK;EACvB,MAAMhD,YAAY,GAAGsD,eAAe,CAACN,UAAU,CAAC;EAChD,MAAMhC,cAAc,GAAGC,iBAAiB,CAACjB,YAAY,CAAC;EAEtD,MAAMuD,WAAW,GAAGC,cAAc,CAACxC,cAAc,CAAC;EAClD,IAAI,CAACuC,WAAW,EAAE;IAChB,OAAOvD,YAAY;EACrB;EAEA,MAAMyD,SAAS,GAAGpI,EAAE,CAAC4G,YAAY,CAACsB,WAAW,EAAE,MAAM,CAAC;EACtDvC,cAAc,CAAC3D,MAAM,GAAGoG,SAAS,CAACtF,KAAK,CAAC,IAAI,CAAC;EAE7C,OAAO6B,YAAY;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASwD,cAAcA,CAACxC,cAA8B,EAAiB;EACrE,MAAMuC,WAAW,GAAGvC,cAAc,CAAC3D,MAAM;EACzC,IAAIiE,KAAK,CAACC,OAAO,CAACgC,WAAW,CAAC,EAAE;IAC9B,OAAO,IAAI;EACb;EACA,IACEA,WAAW,CAACG,UAAU,CAAC,SAAS,CAAC,KAChCH,WAAW,CAACH,QAAQ,CAAC,KAAK,CAAC,IAAIG,WAAW,CAACH,QAAQ,CAAC,SAAS,CAAC,CAAC,EAChE;IACA,OAAOG,WAAW,CAACF,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;EAC3C;EACA,OAAO,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,eAAeA,CAAC9E,IAAY,EAAyB;EAC5D,MAAMmF,eAAe,GAAGtI,EAAE,CAAC4G,YAAY,CAACzD,IAAI,EAAE,MAAM,CAAC;EACrD,MAAMwB,YAAY,GAAGkC,IAAI,CAACC,KAAK,CAACwB,eAAe,CAA0B;EAEzE,OAAO3D,YAAY;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASiB,iBAAiBA,CAAC5D,MAA6B,EAAkB;EACxE,MAAMuC,QAAQ,GAAGgE,WAAW,CAACvG,MAAM,CAAC;EACpC,OAAOA,MAAM,CAACA,MAAM,CAACuC,QAAQ,CAAC;AAChC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASgE,WAAWA,CAACvG,MAA6B,EAAU;EAC1D,MAAMwG,SAAS,GAAGlC,MAAM,CAACC,IAAI,CAACvE,MAAM,CAACA,MAAM,CAAC;EAC5C,IAAIwG,SAAS,CAAC9E,MAAM,KAAK,CAAC,EAAE;IAC1B,MAAM,IAAI+E,KAAK,CAAE,4BAA2BD,SAAS,CAAC9E,MAAO,EAAC,CAAC;EACjE;EACA,OAAO8E,SAAS,CAAC,CAAC,CAAC;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeE,cAAcA,CAACC,EAAU,EAAoB;EACjE,MAAMvF,SAAS,GAAGjD,uBAAuB,CACvC,eAAe,EACfyI,SAAS,EACR,YAAWD,EAAG,KACjB,CAAC;EACD,IAAI;IACF,MAAM9G,YAAY,CAAC8G,EAAE,CAAC;IACtBhI,qBAAqB,CAACyC,SAAS,EAAG,WAAUuF,EAAG,GAAE,EAAE,SAAS,CAAC;IAC7D,OAAO,IAAI;EACb,CAAC,CAAC,OAAOhF,KAAK,EAAE;IACdhD,qBAAqB,CAACyC,SAAS,EAAG,UAASO,KAAK,CAACoB,OAAQ,EAAC,EAAE,MAAM,CAAC;EACrE;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAe8D,gBAAgBA,CAACvG,IAAY,EAAoB;EACrE,MAAMc,SAAS,GAAGjD,uBAAuB,CACvC,eAAe,EACfyI,SAAS,EACR,YAAWtG,IAAK,KACnB,CAAC;EACD,IAAI;IACF,MAAMR,kBAAkB,CAACQ,IAAI,CAAC;IAC9B3B,qBAAqB,CAACyC,SAAS,EAAG,WAAUd,IAAK,GAAE,EAAE,SAAS,CAAC;IAC/D,OAAO,IAAI;EACb,CAAC,CAAC,OAAOqB,KAAK,EAAE;IACdhD,qBAAqB,CAACyC,SAAS,EAAG,UAASO,KAAK,CAACoB,OAAQ,EAAC,EAAE,MAAM,CAAC;EACrE;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAe+D,gBAAgBA,CAAA,EAAqB;EACzD,MAAM1F,SAAS,GAAGjD,uBAAuB,CACvC,eAAe,EACfyI,SAAS,EACR,qCACH,CAAC;EACD,IAAI;IACF,MAAM7G,aAAa,CAAC,CAAC;IACrBpB,qBAAqB,CACnByC,SAAS,EACR,kCAAiC,EAClC,SACF,CAAC;IACD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOO,KAAK,EAAE;IACdhD,qBAAqB,CAACyC,SAAS,EAAG,UAASO,KAAK,CAACoB,OAAQ,EAAC,EAAE,MAAM,CAAC;EACrE;EACA,OAAO,KAAK;AACd"}
|
package/esm/ops/ServiceOps.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { frodo, FrodoError, state } from '@rockcarver/frodo-lib';
|
|
2
2
|
import fs from 'fs';
|
|
3
|
-
import { createTable, debugMessage,
|
|
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
|
-
|
|
141
|
+
stopProgressIndicator(indicatorId, `Imported ${serviceId} from ${filePath}.`, 'success');
|
|
141
142
|
} else {
|
|
142
|
-
|
|
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
|
-
|
|
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
|
-
|
|
167
|
+
debugMessage(`cli.ServiceOps.importFirstServiceFromFile: start`);
|
|
166
168
|
const filePath = getFilePath(file);
|
|
167
|
-
|
|
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
|
-
|
|
175
|
+
stopProgressIndicator(indicatorId, `Imported ${serviceId} from ${filePath}.`, 'success');
|
|
174
176
|
} else {
|
|
175
|
-
|
|
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
|
-
|
|
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":"AAAA,SAASA,KAAK,EAAEC,UAAU,EAAEC,KAAK,QAAQ,uBAAuB;AAKhE,OAAOC,EAAE,MAAM,IAAI;AAEnB,SACEC,uBAAuB,EACvBC,WAAW,EACXC,YAAY,EACZC,UAAU,EACVC,YAAY,EACZC,qBAAqB,QAChB,kBAAkB;AAEzB,MAAM;EACJC,YAAY;EACZC,gBAAgB;EAChBC,SAAS;EACTC,cAAc;EACdC,WAAW;EACXC;AACF,CAAC,GAAGf,KAAK,CAACgB,KAAK;AACf,MAAM;EACJC,iBAAiB;EACjBC,cAAc;EACdC,aAAa;EACbC,eAAe;EACfC,2BAA2B;EAC3BC,aAAa;EACbC,cAAc;EACdC,iBAAiB;EACjBC;AACF,CAAC,GAAGzB,KAAK,CAAC0B,OAAO;;AAEjB;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,YAAYA,CAChCC,IAAa,GAAG,KAAK,EACrBC,YAAqB,GAAG,KAAK,EACX;EAClB,IAAI;IACF,MAAMC,QAAQ,GAAG,MAAMb,iBAAiB,CAACY,YAAY,CAAC;IACtDC,QAAQ,CAACC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,GAAG,CAACC,aAAa,CAACF,CAAC,CAACC,GAAG,CAAC,CAAC;IACnD,IAAIN,IAAI,EAAE;MACR,MAAMQ,KAAK,GAAG/B,WAAW,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;MACzD,KAAK,MAAMqB,OAAO,IAAII,QAAQ,EAAE;QAC9BM,KAAK,CAACC,IAAI,CAAC,CACTX,OAAO,CAACQ,GAAG,EACXL,YAAY,GAAGH,OAAO,CAAC,OAAO,CAAC,CAACY,IAAI,GAAGZ,OAAO,CAACY,IAAI,CACpD,CAAC;MACJ;MACA9B,YAAY,CAAC4B,KAAK,CAACG,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACxC,CAAC,MAAM;MACL,KAAK,MAAMb,OAAO,IAAII,QAAQ,EAAE;QAC9BtB,YAAY,CAAE,GAAEkB,OAAO,CAACQ,GAAI,EAAC,EAAE,MAAM,CAAC;MACxC;IACF;IACA,OAAO,IAAI;EACb,CAAC,CAAC,OAAOM,KAAK,EAAE;IACdjC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,oBAAoBA,CACxCC,IAAY,EACZb,YAAqB,GAAG,KAAK,EAC7Bc,WAAoB,GAAG,IAAI,EACT;EAClB,IAAI;IACF,MAAMC,UAAU,GAAG,MAAM1B,cAAc,CAACW,YAAY,CAAC;IACrD,IAAIgB,QAAQ,GAAGlC,gBAAgB,CAC5B,MACCkB,YAAY,GAAG,QAAQ,GAAGjB,SAAS,CAACF,YAAY,CAACR,KAAK,CAAC4C,QAAQ,CAAC,CAAC,CAAC,CACnE,UAAS,EACT,SACH,CAAC;IACD,IAAIJ,IAAI,EAAE;MACRG,QAAQ,GAAGH,IAAI;IACjB;IACA7B,cAAc,CAAC+B,UAAU,EAAE9B,WAAW,CAAC+B,QAAQ,EAAE,IAAI,CAAC,EAAEF,WAAW,CAAC;IACpE,OAAO,IAAI;EACb,CAAC,CAAC,OAAOH,KAAK,EAAE;IACdjC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeO,mBAAmBA,CACvCC,SAAiB,EACjBN,IAAY,EACZb,YAAqB,GAAG,KAAK,EAC7Bc,WAAoB,GAAG,IAAI,EACT;EAClB,IAAI;IACF,MAAMC,UAAU,GAAG,MAAMzB,aAAa,CAAC6B,SAAS,EAAEnB,YAAY,CAAC;IAC/D,IAAIgB,QAAQ,GAAGlC,gBAAgB,CAACqC,SAAS,EAAG,SAAQ,CAAC;IACrD,IAAIN,IAAI,EAAE;MACRG,QAAQ,GAAGH,IAAI;IACjB;IACA7B,cAAc,CAAC+B,UAAU,EAAE9B,WAAW,CAAC+B,QAAQ,EAAE,IAAI,CAAC,EAAEF,WAAW,CAAC;IACpE,OAAO,IAAI;EACb,CAAC,CAAC,OAAOH,KAAK,EAAE;IACdjC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeS,qBAAqBA,CACzCpB,YAAqB,GAAG,KAAK,EAC7Bc,WAAoB,GAAG,IAAI,EACT;EAClB,IAAI;IACFrC,YAAY,CAAE,6CAA4C,CAAC;IAC3D,MAAMwB,QAAQ,GAAG,MAAMV,eAAe,CAACS,YAAY,CAAC;IACpD,KAAK,MAAMH,OAAO,IAAII,QAAQ,EAAE;MAC9B,MAAMe,QAAQ,GAAGlC,gBAAgB,CAACe,OAAO,CAACwB,KAAK,CAAChB,GAAG,EAAG,SAAQ,CAAC;MAC/D,MAAMiB,QAAQ,GAAGrC,WAAW,CAAC+B,QAAQ,EAAE,IAAI,CAAC;MAC5C,MAAMD,UAAU,GAAGvB,2BAA2B,CAAC,CAAC;MAChDuB,UAAU,CAAClB,OAAO,CAACA,OAAO,CAACwB,KAAK,CAAChB,GAAG,CAAC,GAAGR,OAAO;MAC/CpB,YAAY,CACT,mDAAkDoB,OAAO,CAACwB,KAAK,CAAChB,GAAI,OAAMiB,QAAS,EACtF,CAAC;MACDtC,cAAc,CAAC+B,UAAU,EAAEO,QAAQ,EAAER,WAAW,CAAC;IACnD;IACArC,YAAY,CAAE,4CAA2C,CAAC;IAC1D,OAAO,IAAI;EACb,CAAC,CAAC,OAAOkC,KAAK,EAAE;IACdjC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeY,qBAAqBA,CACzCJ,SAAiB,EACjBN,IAAY,EACZW,OAA6B,GAAG;EAC9BC,KAAK,EAAE,KAAK;EACZC,MAAM,EAAE,KAAK;EACbC,KAAK,EAAE;AACT,CAAC,EACiB;EAClB,IAAIC,WAAmB;EACvB,IAAI;IACFnD,YAAY,CAAE,6CAA4C,CAAC;IAC3D,MAAM6C,QAAQ,GAAGrC,WAAW,CAAC4B,IAAI,CAAC;IAClCe,WAAW,GAAGrD,uBAAuB,CACnC,eAAe,EACf,CAAC,EACA,aAAY4C,SAAU,SAAQG,QAAS,KAC1C,CAAC;IACD,MAAMO,IAAI,GAAGvD,EAAE,CAACwD,YAAY,CAACR,QAAQ,EAAE,MAAM,CAAC;IAC9C,MAAMS,UAAU,GAAGC,IAAI,CAACC,KAAK,CAACJ,IAAI,CAAC;IACnC,IAAIE,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAElC,OAAO,CAACsB,SAAS,CAAC,EAAE;MAClC,MAAM1B,aAAa,CAAC0B,SAAS,EAAEY,UAAU,EAAEP,OAAO,CAAC;MACnD5C,qBAAqB,CACnBgD,WAAW,EACV,YAAWT,SAAU,SAAQG,QAAS,GAAE,EACzC,SACF,CAAC;IACH,CAAC,MAAM;MACL1C,qBAAqB,CAACgD,WAAW,EAAG,GAAET,SAAU,YAAW,EAAE,MAAM,CAAC;IACtE;IACA1C,YAAY,CAAE,2CAA0C,CAAC;IACzD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOkC,KAAK,EAAE;IACd/B,qBAAqB,CAACgD,WAAW,EAAG,mBAAkBT,SAAU,GAAE,EAAE,MAAM,CAAC;IAC3EzC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeuB,0BAA0BA,CAC9CrB,IAAY,EACZW,OAA6B,GAAG;EAC9BC,KAAK,EAAE,KAAK;EACZC,MAAM,EAAE,KAAK;EACbC,KAAK,EAAE;AACT,CAAC,EACiB;EAClB,IAAIC,WAAmB;EACvB,IAAI;IACFnD,YAAY,CAAE,kDAAiD,CAAC;IAChE,MAAM6C,QAAQ,GAAGrC,WAAW,CAAC4B,IAAI,CAAC;IAClCe,WAAW,GAAGrD,uBAAuB,CACnC,eAAe,EACf,CAAC,EACA,aAAY+C,QAAS,KACxB,CAAC;IACD,MAAMO,IAAI,GAAGvD,EAAE,CAACwD,YAAY,CAACR,QAAQ,EAAE,MAAM,CAAC;IAC9C,MAAMS,UAAU,GAAGC,IAAI,CAACC,KAAK,CAACJ,IAAI,CAAC;IACnC,IAAIE,UAAU,IAAII,MAAM,CAACC,IAAI,CAACL,UAAU,CAAClC,OAAO,CAAC,CAACwC,MAAM,EAAE;MACxD,MAAMlB,SAAS,GAAGgB,MAAM,CAACC,IAAI,CAACL,UAAU,CAAClC,OAAO,CAAC,CAAC,CAAC,CAAC;MACpD,MAAMJ,aAAa,CAAC0B,SAAS,EAAEY,UAAU,EAAEP,OAAO,CAAC;MACnD5C,qBAAqB,CACnBgD,WAAW,EACV,YAAWT,SAAU,SAAQG,QAAS,GAAE,EACzC,SACF,CAAC;IACH,CAAC,MAAM;MACL1C,qBAAqB,CACnBgD,WAAW,EACV,iCAAgC,EACjC,MACF,CAAC;IACH;IACAnD,YAAY,CAAE,gDAA+C,CAAC;IAC9D,OAAO,IAAI;EACb,CAAC,CAAC,OAAOkC,KAAK,EAAE;IACd/B,qBAAqB,CAACgD,WAAW,EAAG,+BAA8B,EAAE,MAAM,CAAC;IAC3ElD,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAe2B,sBAAsBA,CAC1CzB,IAAY,EACZW,OAA6B,GAAG;EAC9BC,KAAK,EAAE,KAAK;EACZC,MAAM,EAAE,KAAK;EACbC,KAAK,EAAE;AACT,CAAC,EACiB;EAClB,IAAI;IACF,MAAML,QAAQ,GAAGrC,WAAW,CAAC4B,IAAI,CAAC;IAClCpC,YAAY,CACT,qDAAoD6C,QAAS,GAChE,CAAC;IACD,MAAMO,IAAI,GAAGvD,EAAE,CAACwD,YAAY,CAACR,QAAQ,EAAE,MAAM,CAAC;IAC9C7C,YAAY,CAAE,mDAAkD6C,QAAS,EAAC,CAAC;IAC3E,MAAMS,UAAU,GAAGC,IAAI,CAACC,KAAK,CAACJ,IAAI,CAA2B;IAC7D,MAAMnC,cAAc,CAACqC,UAAU,EAAEP,OAAO,CAAC;IACzC/C,YAAY,CACT,mDAAkD6C,QAAS,GAC9D,CAAC;IACD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOX,KAAK,EAAE;IACdjC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAe4B,uBAAuBA,CAC3Cf,OAA6B,GAAG;EAC9BC,KAAK,EAAE,KAAK;EACZC,MAAM,EAAE,KAAK;EACbC,KAAK,EAAE;AACT,CAAC,EACiB;EAClB,IAAI;IACFlD,YAAY,CAAE,+CAA8C,CAAC;IAC7D,MAAM+D,MAAe,GAAG,EAAE;IAC1B,MAAMC,KAAK,GAAGnE,EAAE,CAACoE,WAAW,CAACxD,mBAAmB,CAAC,CAAC,CAAC;IACnD,MAAMyD,YAAY,GAAGF,KAAK,CAACG,MAAM,CAAEnC,IAAI,IACrCA,IAAI,CAACoC,WAAW,CAAC,CAAC,CAACC,QAAQ,CAAC,eAAe,CAC7C,CAAC;IACD,KAAK,MAAMjC,IAAI,IAAI8B,YAAY,EAAE;MAC/B,IAAI;QACF,MAAML,sBAAsB,CAACzB,IAAI,EAAEW,OAAO,CAAC;MAC7C,CAAC,CAAC,OAAOb,KAAK,EAAE;QACd6B,MAAM,CAAChC,IAAI,CAACG,KAAK,CAAC;MACpB;IACF;IACA,IAAI6B,MAAM,CAACH,MAAM,GAAG,CAAC,EAAE;MACrB,MAAM,IAAIjE,UAAU,CAAE,qCAAoC,EAAEoE,MAAM,CAAC;IACrE;IACA/D,YAAY,CAAE,6CAA4C,CAAC;IAC3D,OAAO,IAAI;EACb,CAAC,CAAC,OAAOkC,KAAK,EAAE;IACdjC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeoC,aAAaA,CACjC5B,SAAiB,EACjBnB,YAAY,GAAG,KAAK,EACF;EAClB,IAAI;IACF,MAAML,iBAAiB,CAACwB,SAAS,EAAEnB,YAAY,CAAC;IAChD,OAAO,IAAI;EACb,CAAC,CAAC,OAAOW,KAAK,EAAE;IACdjC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA,OAAO,eAAeqC,cAAcA,CAAChD,YAAY,GAAG,KAAK,EAAoB;EAC3E,IAAI;IACF,MAAMJ,kBAAkB,CAACI,YAAY,CAAC;IACtC,OAAO,IAAI;EACb,CAAC,CAAC,OAAOW,KAAK,EAAE;IACdjC,UAAU,CAACiC,KAAK,CAAC;EACnB;EACA,OAAO,KAAK;AACd"}
|
package/esm/utils/Config.js
CHANGED
|
@@ -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
|
|
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
|
}
|
package/esm/utils/Config.js.map
CHANGED
|
@@ -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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"}
|
package/esm/utils/Console.js
CHANGED
|
@@ -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) {
|