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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/esm/cli/FrodoCommand.js +3 -1
  3. package/esm/cli/FrodoCommand.js.map +1 -1
  4. package/esm/cli/agent/agent-web.js +2 -2
  5. package/esm/cli/agent/agent-web.js.map +1 -1
  6. package/esm/cli/app/app-import.js +1 -1
  7. package/esm/cli/app/app-import.js.map +1 -1
  8. package/esm/cli/idm/idm-export.js +14 -8
  9. package/esm/cli/idm/idm-export.js.map +1 -1
  10. package/esm/cli/idm/idm-import.js +14 -8
  11. package/esm/cli/idm/idm-import.js.map +1 -1
  12. package/esm/cli/journey/journey-export.js +2 -3
  13. package/esm/cli/journey/journey-export.js.map +1 -1
  14. package/esm/cli/oauth/oauth-client-import.js +1 -1
  15. package/esm/cli/oauth/oauth-client-import.js.map +1 -1
  16. package/esm/cli/service/service-import.js +2 -3
  17. package/esm/cli/service/service-import.js.map +1 -1
  18. package/esm/ops/AdminFederationOps.js +29 -20
  19. package/esm/ops/AdminFederationOps.js.map +1 -1
  20. package/esm/ops/AgentOps.js +41 -34
  21. package/esm/ops/AgentOps.js.map +1 -1
  22. package/esm/ops/ApplicationOps.js +23 -17
  23. package/esm/ops/ApplicationOps.js.map +1 -1
  24. package/esm/ops/CirclesOfTrustOps.js +27 -20
  25. package/esm/ops/CirclesOfTrustOps.js.map +1 -1
  26. package/esm/ops/EmailTemplateOps.js +19 -14
  27. package/esm/ops/EmailTemplateOps.js.map +1 -1
  28. package/esm/ops/IdmOps.js +14 -22
  29. package/esm/ops/IdmOps.js.map +1 -1
  30. package/esm/ops/IdpOps.js +27 -19
  31. package/esm/ops/IdpOps.js.map +1 -1
  32. package/esm/ops/JourneyOps.js +18 -51
  33. package/esm/ops/JourneyOps.js.map +1 -1
  34. package/esm/ops/OAuth2ClientOps.js +23 -17
  35. package/esm/ops/OAuth2ClientOps.js.map +1 -1
  36. package/esm/ops/PolicyOps.js +27 -20
  37. package/esm/ops/PolicyOps.js.map +1 -1
  38. package/esm/ops/PolicySetOps.js +23 -17
  39. package/esm/ops/PolicySetOps.js.map +1 -1
  40. package/esm/ops/ResourceTypeOps.js +27 -20
  41. package/esm/ops/ResourceTypeOps.js.map +1 -1
  42. package/esm/ops/Saml2Ops.js +22 -14
  43. package/esm/ops/Saml2Ops.js.map +1 -1
  44. package/esm/ops/ScriptOps.js +22 -15
  45. package/esm/ops/ScriptOps.js.map +1 -1
  46. package/esm/ops/ServiceOps.js +21 -16
  47. package/esm/ops/ServiceOps.js.map +1 -1
  48. package/esm/ops/ThemeOps.js +21 -15
  49. package/esm/ops/ThemeOps.js.map +1 -1
  50. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"JourneyOps.js","names":["frodo","state","fs","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","stopProgressBar","succeedSpinner","updateProgressBar","CirclesOfTrust","EmailTemplate","Idp","Node","Saml2","Script","Theme","cloneDeep","wordwrap","getTypedFilename","saveJsonToFile","getRealmString","utils","readJourneys","exportJourney","createMultiTreeExportTemplate","resolveDependencies","importJourneys","importJourney","getTreeDescendents","getNodeRef","onlineTreeExportResolver","getJourneyClassification","_getJourneyClassification","authn","journey","listJourneys","long","analyze","journeys","journeyStub","table","_journeyStub$uiConfig","push","_id","enabled","uiConfig","categories","JSON","parse","join","toString","exportPromises","useStringArrays","deps","journeyExports","Promise","all","journeyExport","_journeyExport$tree$u","tree","error","response","data","_error$response","exportJourneyToFile","journeyId","file","options","verbose","getDebug","getDirectory","dir","replace","existsSync","mkdirSync","recursive","fileData","exportJourneysToFile","fileName","trees","length","exportData","meta","exportJourneysToFiles","undefined","importJourneyFromFile","readFile","err","journeyData","installedJourneys","map","x","unresolvedJourneys","resolvedJourneys","Object","keys","then","catch","importError","importFirstJourneyFromFile","treeId","hasOwnProperty","call","importJourneysFromFile","name","message","type","importJourneysFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","allJourneysData","readFileSync","_error$response2","it","getJourneyClassificationMd","getOneLineDescription","treeObj","description","getOneLineDescriptionMd","describeTreeDescendents","descendents","depth","values","indent","Array","fill","descendent","describeTreeDescendentsMd","markdown","describeJourney","resolveTreeExport","_journeyData$meta","_journeyData$tree$uiC","_journeyData$themes","allNodes","nodes","innerNodes","nodeTypeMap","nodeData","_type","getAmVersion","originAmVersion","setAmVersion","stack","entries","nodeType","count","String","getNodeClassification","nodeObj","themes","themeData","scripts","scriptData","emailTemplates","templateData","socialIdentityProviders","socialIdpData","saml2Entities","entityProviderData","circlesOfTrust","cotData","describeJourneyMd","_journeyData$meta2","_journeyData$tree$uiC2","_journeyData$themes2","getNodeClassificationMd","getTableHeaderMd","getTableRowMd"],"sources":["../../src/ops/JourneyOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type NodeSkeleton } from '@rockcarver/frodo-lib/types/api/NodeApi';\nimport { type TreeSkeleton } from '@rockcarver/frodo-lib/types/api/TreeApi';\nimport {\n type JourneyClassificationType,\n type MultiTreeExportInterface,\n type SingleTreeExportInterface,\n type TreeDependencyMapInterface,\n type TreeExportOptions,\n type TreeExportResolverInterface,\n type TreeImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/JourneyOps';\nimport fs from 'fs';\n\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport * as CirclesOfTrust from './CirclesOfTrustOps';\nimport * as EmailTemplate from './EmailTemplateOps';\nimport * as Idp from './IdpOps';\nimport * as Node from './NodeOps';\nimport * as Saml2 from './Saml2Ops';\nimport * as Script from './ScriptOps';\nimport * as Theme from './ThemeOps';\nimport { cloneDeep } from './utils/OpsUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst { getTypedFilename, saveJsonToFile, getRealmString } = frodo.utils;\nconst {\n readJourneys,\n exportJourney,\n createMultiTreeExportTemplate,\n resolveDependencies,\n importJourneys,\n importJourney,\n getTreeDescendents,\n getNodeRef,\n onlineTreeExportResolver,\n getJourneyClassification: _getJourneyClassification,\n} = frodo.authn.journey;\n\n/**\n * List all the journeys/trees\n * @param {boolean} long Long version, all the fields\n * @param {boolean} analyze Analyze journeys/trees for custom nodes (expensive)\n * @returns {Promise<TreeSkeleton[]>} a promise that resolves to an array journey objects\n */\nexport async function listJourneys(\n long = false,\n analyze = false\n): Promise<TreeSkeleton[]> {\n let journeys = [];\n try {\n journeys = await readJourneys();\n if (!long && !analyze) {\n for (const journeyStub of journeys) {\n printMessage(`${journeyStub['_id']}`, 'data');\n }\n } else {\n if (!analyze) {\n const table = createTable(['Name', 'Status', 'Tags']);\n for (const journeyStub of journeys) {\n table.push([\n `${journeyStub._id}`,\n journeyStub.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n journeyStub.uiConfig?.categories\n ? wordwrap(\n JSON.parse(journeyStub.uiConfig.categories).join(', '),\n 60\n )\n : '',\n ]);\n }\n printMessage(table.toString(), 'data');\n } else {\n showSpinner('Retrieving details of all journeys...');\n const exportPromises = [];\n try {\n for (const journeyStub of journeys) {\n exportPromises.push(\n exportJourney(journeyStub['_id'], {\n useStringArrays: false,\n deps: false,\n })\n );\n }\n const journeyExports = await Promise.all(exportPromises);\n succeedSpinner('Retrieved details of all journeys.');\n const table = createTable([\n 'Name',\n 'Status',\n 'Classification',\n 'Tags',\n ]);\n for (const journeyExport of journeyExports) {\n table.push([\n `${journeyExport.tree._id}`,\n journeyExport.tree.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n getJourneyClassification(journeyExport).join(', '),\n journeyExport.tree.uiConfig?.categories\n ? wordwrap(\n JSON.parse(journeyExport.tree.uiConfig.categories).join(\n ', '\n ),\n 60\n )\n : '',\n ]);\n }\n printMessage(table.toString(), 'data');\n } catch (error) {\n failSpinner('Error retrieving details of all journeys.');\n printMessage(error.response.data, 'error');\n }\n }\n }\n } catch (error) {\n printMessage(error.response?.data, 'error');\n }\n return journeys;\n}\n\n/**\n * Export journey by id/name to file\n * @param {string} journeyId journey id/name\n * @param {string} file optional export file name\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneyToFile(\n journeyId: string,\n file: string,\n options: TreeExportOptions\n): Promise<void> {\n debugMessage(`exportJourneyToFile: start`);\n const verbose = state.getDebug();\n if (!file) {\n file = getTypedFilename(journeyId, 'journey');\n }\n if (state.getDirectory()) {\n const dir = state.getDirectory().replace(/\\/$/, '');\n debugMessage(`exportJourneyToFile: directory='${dir}'`);\n file = `${dir}/${file}`;\n // create directory if it doesn't exist\n if (!fs.existsSync(dir)) {\n debugMessage(`exportJourneyToFile: creating directory '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n if (!verbose) showSpinner(`${journeyId}`);\n try {\n const fileData: SingleTreeExportInterface = await exportJourney(\n journeyId,\n options\n );\n if (verbose) showSpinner(`${journeyId}`);\n saveJsonToFile(fileData, file);\n succeedSpinner(\n `Exported ${journeyId['brightCyan']} to ${file['brightCyan']}.`\n );\n } catch (error) {\n if (verbose) showSpinner(`${journeyId}`);\n failSpinner(`Error exporting journey ${journeyId}: ${error}`);\n }\n}\n\n/**\n * Export all journeys to file\n * @param {string} file optional export file name\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneysToFile(\n file: string,\n options: TreeExportOptions = {\n deps: false,\n useStringArrays: false,\n }\n): Promise<void> {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Journeys`, 'journey');\n }\n if (state.getDirectory()) {\n const dir = state.getDirectory().replace(/\\/$/, '');\n debugMessage(`exportJourneysToFile: directory='${dir}'`);\n fileName = `${dir}/${fileName}`;\n // create directory if it doesn't exist\n if (!fs.existsSync(dir)) {\n debugMessage(`exportJourneysToFile: creating directory '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n }\n const trees = await readJourneys();\n const fileData: MultiTreeExportInterface = createMultiTreeExportTemplate();\n createProgressBar(trees.length, 'Exporting journeys...');\n for (const tree of trees) {\n updateProgressBar(`${tree._id}`);\n try {\n const exportData = await exportJourney(tree._id, options);\n delete exportData.meta;\n fileData.trees[tree._id] = exportData;\n } catch (error) {\n printMessage(`Error exporting journey ${tree._id}: ${error}`, 'error');\n }\n }\n saveJsonToFile(fileData, fileName);\n stopProgressBar(`Exported to ${fileName}`);\n}\n\n/**\n * Export all journeys to separate files\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneysToFiles(\n options: TreeExportOptions\n): Promise<void> {\n const dir = state.getDirectory()\n ? state.getDirectory().replace(/\\/$/, '')\n : undefined;\n debugMessage(`exportJourneysToFiles: directory='${dir}'`);\n // create directory if it doesn't exist\n if (dir && !fs.existsSync(dir)) {\n debugMessage(`exportJourneysToFiles: creating directory '${dir}'`);\n fs.mkdirSync(dir, { recursive: true });\n }\n const trees = await readJourneys();\n createProgressBar(trees.length, 'Exporting journeys...');\n for (const tree of trees) {\n updateProgressBar(`${tree._id}`);\n let fileName = getTypedFilename(`${tree._id}`, 'journey');\n if (dir) {\n fileName = `${dir}/${fileName}`;\n }\n try {\n const exportData: SingleTreeExportInterface = await exportJourney(\n tree._id,\n options\n );\n saveJsonToFile(exportData, fileName);\n } catch (error) {\n // do we need to report status here?\n }\n }\n stopProgressBar('Done');\n}\n\n/**\n * Import a journey from file\n * @param {string} journeyId journey id/name\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneyFromFile(\n journeyId: string,\n file: string,\n options: TreeImportOptions\n) {\n const verbose = state.getDebug();\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n let journeyData = JSON.parse(data);\n // check if this is a file with multiple trees and get journey by id\n if (journeyData.trees && journeyData.trees[journeyId]) {\n journeyData = journeyData.trees[journeyId];\n } else if (journeyData.trees) {\n journeyData = null;\n }\n\n // if a journeyId was specified, only import the matching journey\n if (journeyData && journeyId === journeyData.tree._id) {\n // attempt dependency resolution for single tree import\n const installedJourneys = (await readJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n showSpinner('Resolving dependencies');\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n succeedSpinner(`Resolved all dependencies.`);\n\n if (!verbose) showSpinner(`Importing ${journeyId}...`);\n importJourney(journeyData, options)\n .then(() => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n succeedSpinner(`Imported ${journeyId}.`);\n })\n .catch((importError) => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${importError}`);\n });\n } else {\n failSpinner(`Unresolved dependencies:`);\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n // end dependency resolution for single tree import\n } else {\n showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${journeyId} not found!`);\n }\n });\n}\n\n/**\n * Import first journey from file\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importFirstJourneyFromFile(\n file: string,\n options: TreeImportOptions\n) {\n const verbose = state.getDebug();\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n let journeyData = cloneDeep(JSON.parse(data));\n let journeyId = null;\n // single tree\n if (journeyData.tree) {\n journeyId = cloneDeep(journeyData.tree._id);\n }\n // multiple trees, so get the first tree\n else if (journeyData.trees) {\n for (const treeId in journeyData.trees) {\n if (Object.hasOwnProperty.call(journeyData.trees, treeId)) {\n journeyId = treeId;\n journeyData = journeyData.trees[treeId];\n break;\n }\n }\n }\n\n // if a journeyId was specified, only import the matching journey\n if (journeyData && journeyId) {\n // attempt dependency resolution for single tree import\n const installedJourneys = (await readJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n showSpinner('Resolving dependencies');\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n succeedSpinner(`Resolved all dependencies.`);\n\n if (!verbose) showSpinner(`Importing ${journeyId}...`);\n importJourney(journeyData, options)\n .then(() => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n succeedSpinner(`Imported ${journeyId}.`);\n })\n .catch((importError) => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${importError}`);\n });\n } else {\n failSpinner(`Unresolved dependencies:`);\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n } else {\n showSpinner(`Importing...`);\n failSpinner(`No journeys found!`);\n }\n // end dependency resolution for single tree import\n });\n}\n\n/**\n * Import all journeys from file\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneysFromFile(\n file: string,\n options: TreeImportOptions\n) {\n fs.readFile(file, 'utf8', (err, data) => {\n if (err) throw err;\n try {\n const fileData = JSON.parse(data);\n importJourneys(fileData.trees, options);\n } catch (error) {\n if (error.name === 'UnresolvedDependenciesError') {\n for (const journey of Object.keys(error.unresolvedJourneys)) {\n printMessage({\n message: ` - ${journey} requires ${error.unresolvedJourneys[journey]}`,\n type: 'info',\n state,\n });\n }\n } else {\n printMessage(`${error.message}`, 'error');\n }\n }\n });\n}\n\n/**\n * Import all journeys from separate files\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneysFromFiles(options: TreeImportOptions) {\n const names = fs.readdirSync('.');\n const jsonFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.journey.json')\n );\n const allJourneysData = { trees: {} };\n for (const file of jsonFiles) {\n const journeyData = JSON.parse(fs.readFileSync(file, 'utf8'));\n allJourneysData.trees[journeyData.tree._id] = journeyData;\n }\n try {\n await importJourneys(\n allJourneysData.trees as MultiTreeExportInterface,\n options\n );\n } catch (error) {\n printMessage(`${error.response?.data?.message || error.message}`, 'error');\n }\n}\n\n/**\n * Get journey classification\n * @param {SingleTreeExportInterface} journey journey export\n * @returns {string[]} Colored string array of classifications\n */\nexport function getJourneyClassification(\n journey: SingleTreeExportInterface\n): JourneyClassificationType[] {\n return _getJourneyClassification(journey).map((it) => {\n switch (it) {\n case 'standard':\n return it['brightGreen'];\n\n case 'cloud':\n return it['brightMagenta'];\n\n case 'custom':\n return it['brightRed'];\n\n case 'premium':\n return it['brightYellow'];\n }\n });\n}\n\n/**\n * Get journey classification in markdown\n * @param {SingleTreeExportInterface} journey journey export\n * @returns {string[]} Colored string array of classifications\n */\nexport function getJourneyClassificationMd(\n journey: SingleTreeExportInterface\n): string[] {\n return _getJourneyClassification(journey).map((it) => {\n switch (it) {\n case 'standard':\n return `:green_circle: \\`${it}\\``;\n\n case 'cloud':\n return `:purple_circle: \\`${it}\\``;\n\n case 'custom':\n return `:red_circle: \\`${it}\\``;\n\n case 'premium':\n return `:yellow_circle: \\`${it}\\``;\n }\n });\n}\n\n/**\n * Get a one-line description of the tree object\n * @param {TreeSkeleton} treeObj circle of trust object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(treeObj: TreeSkeleton): string {\n const description = `[${treeObj._id['brightCyan']}]`;\n return description;\n}\n\n/**\n * Get a one-line description of the tree object in markdown\n * @param {TreeSkeleton} treeObj circle of trust object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescriptionMd(treeObj: TreeSkeleton): string {\n const description = `${treeObj._id}`;\n return description;\n}\n\n/**\n * Helper function to render a nested list of dependent trees\n * @param {TreeDependencyMapInterface} descendents tree dependency map\n * @param {number} depth level of nesting\n */\nfunction describeTreeDescendents(\n descendents: TreeDependencyMapInterface,\n depth = 0\n) {\n if (depth || Object.values(descendents)[0].length) {\n // heading\n if (depth === 0) {\n printMessage(\n `\\nInner Tree Dependencies (${Object.values(descendents)[0].length}):`,\n 'data'\n );\n }\n const indent = Array(depth * 2)\n .fill(' ')\n .join('');\n const [tree] = Object.keys(descendents);\n printMessage(`${indent}- ${tree['brightCyan']}`, 'data');\n for (const descendent of descendents[tree]) {\n describeTreeDescendents(descendent, depth + 1);\n }\n }\n}\n\n/**\n * Helper function to render a nested list of dependent trees in markdown\n * @param {TreeDependencyMapInterface} descendents tree dependency map\n * @param {number} depth level of nesting\n */\nfunction describeTreeDescendentsMd(\n descendents: TreeDependencyMapInterface,\n depth = 0\n): string {\n let markdown = '';\n if (depth || Object.values(descendents)[0].length) {\n // heading\n if (depth === 0) {\n markdown += `## Inner Tree Dependencies (${\n Object.values(descendents)[0].length\n })\\n`;\n }\n const indent = Array(depth * 2)\n .fill(' ')\n .join('');\n const [tree] = Object.keys(descendents);\n markdown += `${indent}- ${tree}\\n`;\n for (const descendent of descendents[tree]) {\n markdown += describeTreeDescendentsMd(descendent, depth + 1);\n }\n return markdown;\n }\n return markdown;\n}\n\n/**\n * Describe a journey:\n * - Properties, tags, description, name, metadata\n * - Inner tree dependency tree\n * - Node type summary\n * - Nodes\n * - Themes\n * - Scripts\n * - Email templates\n * - Social identity providers\n * - SAML2 entity providers\n * - SAML2 circles of trust\n * @param {SingleTreeExportInterface} journeyData journey export object\n * @param {TreeExportResolverInterface} resolveTreeExport tree export resolver callback function\n */\nexport async function describeJourney(\n journeyData: SingleTreeExportInterface,\n resolveTreeExport: TreeExportResolverInterface = onlineTreeExportResolver\n): Promise<void> {\n const allNodes = {\n ...journeyData.nodes,\n ...journeyData.innerNodes,\n };\n const nodeTypeMap = {};\n\n for (const nodeData of Object.values(allNodes)) {\n if (nodeTypeMap[nodeData._type._id]) {\n nodeTypeMap[nodeData._type._id] += 1;\n } else {\n nodeTypeMap[nodeData._type._id] = 1;\n }\n }\n\n // initialize AM version from file\n if (!state.getAmVersion() && journeyData.meta?.originAmVersion) {\n state.setAmVersion(journeyData.meta.originAmVersion);\n }\n\n // Journey Name\n printMessage(`${getOneLineDescription(journeyData.tree)}`, 'data');\n printMessage(Array(`[${journeyData.tree._id}]`['length']).fill('=').join(''));\n\n // Description\n if (journeyData.tree.description) {\n printMessage(`\\n${journeyData.tree.description}`, 'data');\n }\n\n // Status\n printMessage(\n `\\nStatus\\n${\n journeyData.tree.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen']\n }`\n );\n\n // Classification\n if (state.getAmVersion()) {\n printMessage(\n `\\nClassification\\n${getJourneyClassification(journeyData).join(', ')}`,\n 'data'\n );\n }\n\n // Categories/Tags\n if (\n journeyData.tree.uiConfig?.categories &&\n journeyData.tree.uiConfig.categories != '[]'\n ) {\n printMessage('\\nCategories/Tags', 'data');\n printMessage(\n `${JSON.parse(journeyData.tree.uiConfig.categories).join(', ')}`,\n 'data'\n );\n }\n\n // Dependency Tree\n try {\n const descendents = await getTreeDescendents(\n journeyData,\n resolveTreeExport\n );\n describeTreeDescendents(descendents);\n } catch (error) {\n printMessage(`Error resolving inner tree dependencies:`, 'error');\n printMessage(error.stack, 'error');\n }\n\n // Node Types\n if (Object.entries(nodeTypeMap).length) {\n printMessage(\n `\\nNode Types (${Object.entries(nodeTypeMap).length}):`,\n 'data'\n );\n for (const [nodeType, count] of Object.entries(nodeTypeMap)) {\n printMessage(\n `- ${String(count)} [${\n nodeType['brightCyan']\n }] (${Node.getNodeClassification(nodeType).join(', ')})`,\n 'data'\n );\n }\n }\n\n // Nodes\n if (Object.entries(allNodes).length) {\n printMessage(`\\nNodes (${Object.entries(allNodes).length}):`, 'data');\n for (const nodeObj of Object.values<NodeSkeleton>(allNodes)) {\n printMessage(\n `- ${Node.getOneLineDescription(\n nodeObj,\n getNodeRef(nodeObj, journeyData)\n )}`,\n 'data'\n );\n }\n }\n\n // Themes\n if (journeyData.themes?.length) {\n printMessage(`\\nThemes (${journeyData.themes.length}):`, 'data');\n for (const themeData of journeyData.themes) {\n printMessage(`- ${Theme.getOneLineDescription(themeData)}`, 'data');\n }\n }\n\n // Scripts\n if (Object.entries(journeyData.scripts).length) {\n printMessage(\n `\\nScripts (${Object.entries(journeyData.scripts).length}):`,\n 'data'\n );\n for (const scriptData of Object.values(journeyData.scripts)) {\n printMessage(`- ${Script.getOneLineDescription(scriptData)}`, 'data');\n }\n }\n\n // Email Templates\n if (Object.entries(journeyData.emailTemplates).length) {\n printMessage(\n `\\nEmail Templates (${\n Object.entries(journeyData.emailTemplates).length\n }):`,\n 'data'\n );\n for (const templateData of Object.values(journeyData.emailTemplates)) {\n printMessage(\n `- ${EmailTemplate.getOneLineDescription(templateData)}`,\n 'data'\n );\n }\n }\n\n // Social Identity Providers\n if (Object.entries(journeyData.socialIdentityProviders).length) {\n printMessage(\n `\\nSocial Identity Providers (${\n Object.entries(journeyData.socialIdentityProviders).length\n }):`,\n 'data'\n );\n for (const socialIdpData of Object.values(\n journeyData.socialIdentityProviders\n )) {\n printMessage(`- ${Idp.getOneLineDescription(socialIdpData)}`, 'data');\n }\n }\n\n // SAML2 Entity Providers\n if (Object.entries(journeyData.saml2Entities).length) {\n printMessage(\n `\\nSAML2 Entity Providers (${\n Object.entries(journeyData.saml2Entities).length\n }):`,\n 'data'\n );\n for (const entityProviderData of Object.values(journeyData.saml2Entities)) {\n printMessage(\n `- ${Saml2.getOneLineDescription(entityProviderData)}`,\n 'data'\n );\n }\n }\n\n // SAML2 Circles Of Trust\n if (Object.entries(journeyData.circlesOfTrust).length) {\n printMessage(\n `\\nSAML2 Circles Of Trust (${\n Object.entries(journeyData.circlesOfTrust).length\n }):`,\n 'data'\n );\n for (const cotData of Object.values(journeyData.circlesOfTrust)) {\n printMessage(\n `- ${CirclesOfTrust.getOneLineDescription(cotData)}`,\n 'data'\n );\n }\n }\n}\n\n/**\n * Describe a journey in markdown:\n * - Properties, tags, description, name, metadata\n * - Inner tree dependency tree\n * - Node type summary\n * - Nodes\n * - Themes\n * - Scripts\n * - Email templates\n * - Social identity providers\n * - SAML2 entity providers\n * - SAML2 circles of trust\n * @param {SingleTreeExportInterface} journeyData journey export object\n * @param {TreeExportResolverInterface} resolveTreeExport tree export resolver callback function\n */\nexport async function describeJourneyMd(\n journeyData: SingleTreeExportInterface,\n resolveTreeExport: TreeExportResolverInterface = onlineTreeExportResolver\n) {\n const allNodes = {\n ...journeyData.nodes,\n ...journeyData.innerNodes,\n };\n const nodeTypeMap = {};\n\n for (const nodeData of Object.values(allNodes)) {\n if (nodeTypeMap[nodeData._type._id]) {\n nodeTypeMap[nodeData._type._id] += 1;\n } else {\n nodeTypeMap[nodeData._type._id] = 1;\n }\n }\n\n // initialize AM version from file\n if (!state.getAmVersion() && journeyData.meta?.originAmVersion) {\n state.setAmVersion(journeyData.meta.originAmVersion);\n }\n\n // Journey Name\n printMessage(\n `# ${getOneLineDescriptionMd(journeyData.tree)} - ${\n journeyData.tree.enabled === false\n ? ':o: `disabled`'\n : ':white_check_mark: `enabled`'\n }, ${getJourneyClassificationMd(journeyData).join(', ')}`,\n 'data'\n );\n\n // Categories/Tags\n if (\n journeyData.tree.uiConfig?.categories &&\n journeyData.tree.uiConfig.categories != '[]'\n ) {\n printMessage(\n `\\`${JSON.parse(journeyData.tree.uiConfig.categories).join('`, `')}\\``,\n 'data'\n );\n }\n\n // Description\n if (journeyData.tree.description) {\n printMessage(`\\n${journeyData.tree.description}`, 'data');\n }\n\n // Journey image\n printMessage(`\\n[![](./${journeyData.tree._id}.png)]()\\n`, 'data');\n\n // Dependency Tree\n const descendents = await getTreeDescendents(journeyData, resolveTreeExport);\n printMessage(describeTreeDescendentsMd(descendents), 'data');\n\n // Node Types\n if (Object.entries(nodeTypeMap).length) {\n printMessage(\n `## Node Types (${Object.entries(nodeTypeMap).length})`,\n 'data'\n );\n printMessage('| Count | Type | Classification |', 'data');\n printMessage('| -----:| ---- | -------------- |', 'data');\n for (const [nodeType, count] of Object.entries(nodeTypeMap)) {\n printMessage(\n `| ${String(count)} | ${nodeType} | ${Node.getNodeClassificationMd(\n nodeType\n ).join('<br>')} |`,\n 'data'\n );\n }\n }\n\n // Nodes\n if (Object.entries(allNodes).length) {\n printMessage(`## Nodes (${Object.entries(allNodes).length})`, 'data');\n printMessage(Node.getTableHeaderMd(), 'data');\n for (const nodeObj of Object.values<NodeSkeleton>(allNodes)) {\n printMessage(\n `${Node.getTableRowMd(nodeObj, getNodeRef(nodeObj, journeyData))}`,\n 'data'\n );\n }\n }\n\n // Themes\n if (journeyData.themes?.length) {\n printMessage(`## Themes (${journeyData.themes.length})`, 'data');\n printMessage(Theme.getTableHeaderMd(), 'data');\n for (const themeData of journeyData.themes) {\n printMessage(`${Theme.getTableRowMd(themeData)}`, 'data');\n }\n }\n\n // Scripts\n if (Object.entries(journeyData.scripts).length) {\n printMessage(\n `## Scripts (${Object.entries(journeyData.scripts).length})`,\n 'data'\n );\n printMessage(Script.getTableHeaderMd(), 'data');\n for (const scriptData of Object.values(journeyData.scripts)) {\n printMessage(`${Script.getTableRowMd(scriptData)}`, 'data');\n }\n }\n\n // Email Templates\n if (Object.entries(journeyData.emailTemplates).length) {\n printMessage(\n `## Email Templates (${\n Object.entries(journeyData.emailTemplates).length\n })`,\n 'data'\n );\n printMessage(EmailTemplate.getTableHeaderMd(), 'data');\n for (const templateData of Object.values(journeyData.emailTemplates)) {\n printMessage(`${EmailTemplate.getTableRowMd(templateData)}`, 'data');\n }\n }\n\n // Social Identity Providers\n if (Object.entries(journeyData.socialIdentityProviders).length) {\n printMessage(\n `## Social Identity Providers (${\n Object.entries(journeyData.socialIdentityProviders).length\n })`,\n 'data'\n );\n printMessage(Idp.getTableHeaderMd(), 'data');\n for (const socialIdpData of Object.values(\n journeyData.socialIdentityProviders\n )) {\n printMessage(`${Idp.getTableRowMd(socialIdpData)}`, 'data');\n }\n }\n\n // SAML2 Entity Providers\n if (Object.entries(journeyData.saml2Entities).length) {\n printMessage(\n `## SAML2 Entity Providers (${\n Object.entries(journeyData.saml2Entities).length\n })`,\n 'data'\n );\n printMessage(Saml2.getTableHeaderMd(), 'data');\n for (const entityProviderData of Object.values(journeyData.saml2Entities)) {\n printMessage(`${Saml2.getTableRowMd(entityProviderData)}`, 'data');\n }\n }\n\n // SAML2 Circles Of Trust\n if (Object.entries(journeyData.circlesOfTrust).length) {\n printMessage(\n `## SAML2 Circles Of Trust (${\n Object.entries(journeyData.circlesOfTrust).length\n })`,\n 'data'\n );\n printMessage(CirclesOfTrust.getTableHeaderMd(), 'data');\n for (const cotData of Object.values(journeyData.circlesOfTrust)) {\n printMessage(`${CirclesOfTrust.getTableRowMd(cotData)}`, 'data');\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"JourneyOps.js","names":["frodo","state","fs","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","stopProgressBar","succeedSpinner","updateProgressBar","CirclesOfTrust","EmailTemplate","Idp","Node","Saml2","Script","Theme","cloneDeep","wordwrap","getTypedFilename","saveJsonToFile","getRealmString","getFilePath","getWorkingDirectory","utils","readJourneys","exportJourney","createMultiTreeExportTemplate","resolveDependencies","importJourneys","importJourney","getTreeDescendents","getNodeRef","onlineTreeExportResolver","getJourneyClassification","_getJourneyClassification","authn","journey","listJourneys","long","analyze","journeys","journeyStub","table","_journeyStub$uiConfig","push","_id","enabled","uiConfig","categories","JSON","parse","join","toString","exportPromises","useStringArrays","deps","journeyExports","Promise","all","journeyExport","_journeyExport$tree$u","tree","error","response","data","_error$response","exportJourneyToFile","journeyId","file","options","verbose","getDebug","filePath","fileData","exportJourneysToFile","trees","length","exportData","meta","exportJourneysToFiles","fileName","importJourneyFromFile","readFile","err","journeyData","installedJourneys","map","x","unresolvedJourneys","resolvedJourneys","Object","keys","then","catch","importError","importFirstJourneyFromFile","treeId","hasOwnProperty","call","importJourneysFromFile","name","message","type","importJourneysFromFiles","names","readdirSync","jsonFiles","filter","toLowerCase","endsWith","allJourneysData","readFileSync","_error$response2","it","getJourneyClassificationMd","getOneLineDescription","treeObj","description","getOneLineDescriptionMd","describeTreeDescendents","descendents","depth","values","indent","Array","fill","descendent","describeTreeDescendentsMd","markdown","describeJourney","resolveTreeExport","_journeyData$meta","_journeyData$tree$uiC","_journeyData$themes","allNodes","nodes","innerNodes","nodeTypeMap","nodeData","_type","getAmVersion","originAmVersion","setAmVersion","stack","entries","nodeType","count","String","getNodeClassification","nodeObj","themes","themeData","scripts","scriptData","emailTemplates","templateData","socialIdentityProviders","socialIdpData","saml2Entities","entityProviderData","circlesOfTrust","cotData","describeJourneyMd","_journeyData$meta2","_journeyData$tree$uiC2","_journeyData$themes2","getNodeClassificationMd","getTableHeaderMd","getTableRowMd"],"sources":["../../src/ops/JourneyOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type NodeSkeleton } from '@rockcarver/frodo-lib/types/api/NodeApi';\nimport { type TreeSkeleton } from '@rockcarver/frodo-lib/types/api/TreeApi';\nimport {\n type JourneyClassificationType,\n type MultiTreeExportInterface,\n type SingleTreeExportInterface,\n type TreeDependencyMapInterface,\n type TreeExportOptions,\n type TreeExportResolverInterface,\n type TreeImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/JourneyOps';\nimport fs from 'fs';\n\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport * as CirclesOfTrust from './CirclesOfTrustOps';\nimport * as EmailTemplate from './EmailTemplateOps';\nimport * as Idp from './IdpOps';\nimport * as Node from './NodeOps';\nimport * as Saml2 from './Saml2Ops';\nimport * as Script from './ScriptOps';\nimport * as Theme from './ThemeOps';\nimport { cloneDeep } from './utils/OpsUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n getTypedFilename,\n saveJsonToFile,\n getRealmString,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n readJourneys,\n exportJourney,\n createMultiTreeExportTemplate,\n resolveDependencies,\n importJourneys,\n importJourney,\n getTreeDescendents,\n getNodeRef,\n onlineTreeExportResolver,\n getJourneyClassification: _getJourneyClassification,\n} = frodo.authn.journey;\n\n/**\n * List all the journeys/trees\n * @param {boolean} long Long version, all the fields\n * @param {boolean} analyze Analyze journeys/trees for custom nodes (expensive)\n * @returns {Promise<TreeSkeleton[]>} a promise that resolves to an array journey objects\n */\nexport async function listJourneys(\n long = false,\n analyze = false\n): Promise<TreeSkeleton[]> {\n let journeys = [];\n try {\n journeys = await readJourneys();\n if (!long && !analyze) {\n for (const journeyStub of journeys) {\n printMessage(`${journeyStub['_id']}`, 'data');\n }\n } else {\n if (!analyze) {\n const table = createTable(['Name', 'Status', 'Tags']);\n for (const journeyStub of journeys) {\n table.push([\n `${journeyStub._id}`,\n journeyStub.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n journeyStub.uiConfig?.categories\n ? wordwrap(\n JSON.parse(journeyStub.uiConfig.categories).join(', '),\n 60\n )\n : '',\n ]);\n }\n printMessage(table.toString(), 'data');\n } else {\n showSpinner('Retrieving details of all journeys...');\n const exportPromises = [];\n try {\n for (const journeyStub of journeys) {\n exportPromises.push(\n exportJourney(journeyStub['_id'], {\n useStringArrays: false,\n deps: false,\n })\n );\n }\n const journeyExports = await Promise.all(exportPromises);\n succeedSpinner('Retrieved details of all journeys.');\n const table = createTable([\n 'Name',\n 'Status',\n 'Classification',\n 'Tags',\n ]);\n for (const journeyExport of journeyExports) {\n table.push([\n `${journeyExport.tree._id}`,\n journeyExport.tree.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen'],\n getJourneyClassification(journeyExport).join(', '),\n journeyExport.tree.uiConfig?.categories\n ? wordwrap(\n JSON.parse(journeyExport.tree.uiConfig.categories).join(\n ', '\n ),\n 60\n )\n : '',\n ]);\n }\n printMessage(table.toString(), 'data');\n } catch (error) {\n failSpinner('Error retrieving details of all journeys.');\n printMessage(error.response.data, 'error');\n }\n }\n }\n } catch (error) {\n printMessage(error.response?.data, 'error');\n }\n return journeys;\n}\n\n/**\n * Export journey by id/name to file\n * @param {string} journeyId journey id/name\n * @param {string} file optional export file name\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneyToFile(\n journeyId: string,\n file: string,\n options: TreeExportOptions\n): Promise<void> {\n debugMessage(`exportJourneyToFile: start`);\n const verbose = state.getDebug();\n if (!file) {\n file = getTypedFilename(journeyId, 'journey');\n }\n const filePath = getFilePath(file, true);\n if (!verbose) showSpinner(`${journeyId}`);\n try {\n const fileData: SingleTreeExportInterface = await exportJourney(\n journeyId,\n options\n );\n if (verbose) showSpinner(`${journeyId}`);\n saveJsonToFile(fileData, filePath);\n succeedSpinner(\n `Exported ${journeyId['brightCyan']} to ${filePath['brightCyan']}.`\n );\n } catch (error) {\n if (verbose) showSpinner(`${journeyId}`);\n failSpinner(`Error exporting journey ${journeyId}: ${error}`);\n }\n}\n\n/**\n * Export all journeys to file\n * @param {string} file optional export file name\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneysToFile(\n file: string,\n options: TreeExportOptions = {\n deps: false,\n useStringArrays: false,\n }\n): Promise<void> {\n if (!file) {\n file = getTypedFilename(`all${getRealmString()}Journeys`, 'journey');\n }\n const filePath = getFilePath(file, true);\n const trees = await readJourneys();\n const fileData: MultiTreeExportInterface = createMultiTreeExportTemplate();\n createProgressBar(trees.length, 'Exporting journeys...');\n for (const tree of trees) {\n updateProgressBar(`${tree._id}`);\n try {\n const exportData = await exportJourney(tree._id, options);\n delete exportData.meta;\n fileData.trees[tree._id] = exportData;\n } catch (error) {\n printMessage(`Error exporting journey ${tree._id}: ${error}`, 'error');\n }\n }\n saveJsonToFile(fileData, filePath);\n stopProgressBar(`Exported to ${filePath}`);\n}\n\n/**\n * Export all journeys to separate files\n * @param {TreeExportOptions} options export options\n */\nexport async function exportJourneysToFiles(\n options: TreeExportOptions\n): Promise<void> {\n const trees = await readJourneys();\n createProgressBar(trees.length, 'Exporting journeys...');\n for (const tree of trees) {\n updateProgressBar(`${tree._id}`);\n const fileName = getTypedFilename(`${tree._id}`, 'journey');\n try {\n const exportData: SingleTreeExportInterface = await exportJourney(\n tree._id,\n options\n );\n saveJsonToFile(exportData, getFilePath(fileName, true));\n } catch (error) {\n // do we need to report status here?\n }\n }\n stopProgressBar('Done');\n}\n\n/**\n * Import a journey from file\n * @param {string} journeyId journey id/name\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneyFromFile(\n journeyId: string,\n file: string,\n options: TreeImportOptions\n) {\n const verbose = state.getDebug();\n fs.readFile(getFilePath(file), 'utf8', async (err, data) => {\n if (err) throw err;\n let journeyData = JSON.parse(data);\n // check if this is a file with multiple trees and get journey by id\n if (journeyData.trees && journeyData.trees[journeyId]) {\n journeyData = journeyData.trees[journeyId];\n } else if (journeyData.trees) {\n journeyData = null;\n }\n\n // if a journeyId was specified, only import the matching journey\n if (journeyData && journeyId === journeyData.tree._id) {\n // attempt dependency resolution for single tree import\n const installedJourneys = (await readJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n showSpinner('Resolving dependencies');\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n succeedSpinner(`Resolved all dependencies.`);\n\n if (!verbose) showSpinner(`Importing ${journeyId}...`);\n importJourney(journeyData, options)\n .then(() => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n succeedSpinner(`Imported ${journeyId}.`);\n })\n .catch((importError) => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${importError}`);\n });\n } else {\n failSpinner(`Unresolved dependencies:`);\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n // end dependency resolution for single tree import\n } else {\n showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${journeyId} not found!`);\n }\n });\n}\n\n/**\n * Import first journey from file\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importFirstJourneyFromFile(\n file: string,\n options: TreeImportOptions\n) {\n const verbose = state.getDebug();\n fs.readFile(getFilePath(file), 'utf8', async (err, data) => {\n if (err) throw err;\n let journeyData = cloneDeep(JSON.parse(data));\n let journeyId = null;\n // single tree\n if (journeyData.tree) {\n journeyId = cloneDeep(journeyData.tree._id);\n }\n // multiple trees, so get the first tree\n else if (journeyData.trees) {\n for (const treeId in journeyData.trees) {\n if (Object.hasOwnProperty.call(journeyData.trees, treeId)) {\n journeyId = treeId;\n journeyData = journeyData.trees[treeId];\n break;\n }\n }\n }\n\n // if a journeyId was specified, only import the matching journey\n if (journeyData && journeyId) {\n // attempt dependency resolution for single tree import\n const installedJourneys = (await readJourneys()).map((x) => x._id);\n const unresolvedJourneys = {};\n const resolvedJourneys = [];\n showSpinner('Resolving dependencies');\n await resolveDependencies(\n installedJourneys,\n { [journeyId]: journeyData },\n unresolvedJourneys,\n resolvedJourneys\n );\n if (Object.keys(unresolvedJourneys).length === 0) {\n succeedSpinner(`Resolved all dependencies.`);\n\n if (!verbose) showSpinner(`Importing ${journeyId}...`);\n importJourney(journeyData, options)\n .then(() => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n succeedSpinner(`Imported ${journeyId}.`);\n })\n .catch((importError) => {\n if (verbose) showSpinner(`Importing ${journeyId}...`);\n failSpinner(`${importError}`);\n });\n } else {\n failSpinner(`Unresolved dependencies:`);\n for (const journey of Object.keys(unresolvedJourneys)) {\n printMessage(\n ` ${journey} requires ${unresolvedJourneys[journey]}`,\n 'error'\n );\n }\n }\n } else {\n showSpinner(`Importing...`);\n failSpinner(`No journeys found!`);\n }\n // end dependency resolution for single tree import\n });\n}\n\n/**\n * Import all journeys from file\n * @param {string} file import file name\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneysFromFile(\n file: string,\n options: TreeImportOptions\n) {\n fs.readFile(getFilePath(file), 'utf8', (err, data) => {\n if (err) throw err;\n try {\n const fileData = JSON.parse(data);\n importJourneys(fileData.trees, options);\n } catch (error) {\n if (error.name === 'UnresolvedDependenciesError') {\n for (const journey of Object.keys(error.unresolvedJourneys)) {\n printMessage({\n message: ` - ${journey} requires ${error.unresolvedJourneys[journey]}`,\n type: 'info',\n state,\n });\n }\n } else {\n printMessage(`${error.message}`, 'error');\n }\n }\n });\n}\n\n/**\n * Import all journeys from separate files\n * @param {TreeImportOptions} options import options\n */\nexport async function importJourneysFromFiles(options: TreeImportOptions) {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.journey.json'))\n .map((name) => getFilePath(name));\n const allJourneysData = { trees: {} };\n for (const file of jsonFiles) {\n const journeyData = JSON.parse(fs.readFileSync(file, 'utf8'));\n allJourneysData.trees[journeyData.tree._id] = journeyData;\n }\n try {\n await importJourneys(\n allJourneysData.trees as MultiTreeExportInterface,\n options\n );\n } catch (error) {\n printMessage(`${error.response?.data?.message || error.message}`, 'error');\n }\n}\n\n/**\n * Get journey classification\n * @param {SingleTreeExportInterface} journey journey export\n * @returns {string[]} Colored string array of classifications\n */\nexport function getJourneyClassification(\n journey: SingleTreeExportInterface\n): JourneyClassificationType[] {\n return _getJourneyClassification(journey).map((it) => {\n switch (it) {\n case 'standard':\n return it['brightGreen'];\n\n case 'cloud':\n return it['brightMagenta'];\n\n case 'custom':\n return it['brightRed'];\n\n case 'premium':\n return it['brightYellow'];\n }\n });\n}\n\n/**\n * Get journey classification in markdown\n * @param {SingleTreeExportInterface} journey journey export\n * @returns {string[]} Colored string array of classifications\n */\nexport function getJourneyClassificationMd(\n journey: SingleTreeExportInterface\n): string[] {\n return _getJourneyClassification(journey).map((it) => {\n switch (it) {\n case 'standard':\n return `:green_circle: \\`${it}\\``;\n\n case 'cloud':\n return `:purple_circle: \\`${it}\\``;\n\n case 'custom':\n return `:red_circle: \\`${it}\\``;\n\n case 'premium':\n return `:yellow_circle: \\`${it}\\``;\n }\n });\n}\n\n/**\n * Get a one-line description of the tree object\n * @param {TreeSkeleton} treeObj circle of trust object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(treeObj: TreeSkeleton): string {\n const description = `[${treeObj._id['brightCyan']}]`;\n return description;\n}\n\n/**\n * Get a one-line description of the tree object in markdown\n * @param {TreeSkeleton} treeObj circle of trust object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescriptionMd(treeObj: TreeSkeleton): string {\n const description = `${treeObj._id}`;\n return description;\n}\n\n/**\n * Helper function to render a nested list of dependent trees\n * @param {TreeDependencyMapInterface} descendents tree dependency map\n * @param {number} depth level of nesting\n */\nfunction describeTreeDescendents(\n descendents: TreeDependencyMapInterface,\n depth = 0\n) {\n if (depth || Object.values(descendents)[0].length) {\n // heading\n if (depth === 0) {\n printMessage(\n `\\nInner Tree Dependencies (${Object.values(descendents)[0].length}):`,\n 'data'\n );\n }\n const indent = Array(depth * 2)\n .fill(' ')\n .join('');\n const [tree] = Object.keys(descendents);\n printMessage(`${indent}- ${tree['brightCyan']}`, 'data');\n for (const descendent of descendents[tree]) {\n describeTreeDescendents(descendent, depth + 1);\n }\n }\n}\n\n/**\n * Helper function to render a nested list of dependent trees in markdown\n * @param {TreeDependencyMapInterface} descendents tree dependency map\n * @param {number} depth level of nesting\n */\nfunction describeTreeDescendentsMd(\n descendents: TreeDependencyMapInterface,\n depth = 0\n): string {\n let markdown = '';\n if (depth || Object.values(descendents)[0].length) {\n // heading\n if (depth === 0) {\n markdown += `## Inner Tree Dependencies (${\n Object.values(descendents)[0].length\n })\\n`;\n }\n const indent = Array(depth * 2)\n .fill(' ')\n .join('');\n const [tree] = Object.keys(descendents);\n markdown += `${indent}- ${tree}\\n`;\n for (const descendent of descendents[tree]) {\n markdown += describeTreeDescendentsMd(descendent, depth + 1);\n }\n return markdown;\n }\n return markdown;\n}\n\n/**\n * Describe a journey:\n * - Properties, tags, description, name, metadata\n * - Inner tree dependency tree\n * - Node type summary\n * - Nodes\n * - Themes\n * - Scripts\n * - Email templates\n * - Social identity providers\n * - SAML2 entity providers\n * - SAML2 circles of trust\n * @param {SingleTreeExportInterface} journeyData journey export object\n * @param {TreeExportResolverInterface} resolveTreeExport tree export resolver callback function\n */\nexport async function describeJourney(\n journeyData: SingleTreeExportInterface,\n resolveTreeExport: TreeExportResolverInterface = onlineTreeExportResolver\n): Promise<void> {\n const allNodes = {\n ...journeyData.nodes,\n ...journeyData.innerNodes,\n };\n const nodeTypeMap = {};\n\n for (const nodeData of Object.values(allNodes)) {\n if (nodeTypeMap[nodeData._type._id]) {\n nodeTypeMap[nodeData._type._id] += 1;\n } else {\n nodeTypeMap[nodeData._type._id] = 1;\n }\n }\n\n // initialize AM version from file\n if (!state.getAmVersion() && journeyData.meta?.originAmVersion) {\n state.setAmVersion(journeyData.meta.originAmVersion);\n }\n\n // Journey Name\n printMessage(`${getOneLineDescription(journeyData.tree)}`, 'data');\n printMessage(Array(`[${journeyData.tree._id}]`['length']).fill('=').join(''));\n\n // Description\n if (journeyData.tree.description) {\n printMessage(`\\n${journeyData.tree.description}`, 'data');\n }\n\n // Status\n printMessage(\n `\\nStatus\\n${\n journeyData.tree.enabled === false\n ? 'disabled'['brightRed']\n : 'enabled'['brightGreen']\n }`\n );\n\n // Classification\n if (state.getAmVersion()) {\n printMessage(\n `\\nClassification\\n${getJourneyClassification(journeyData).join(', ')}`,\n 'data'\n );\n }\n\n // Categories/Tags\n if (\n journeyData.tree.uiConfig?.categories &&\n journeyData.tree.uiConfig.categories != '[]'\n ) {\n printMessage('\\nCategories/Tags', 'data');\n printMessage(\n `${JSON.parse(journeyData.tree.uiConfig.categories).join(', ')}`,\n 'data'\n );\n }\n\n // Dependency Tree\n try {\n const descendents = await getTreeDescendents(\n journeyData,\n resolveTreeExport\n );\n describeTreeDescendents(descendents);\n } catch (error) {\n printMessage(`Error resolving inner tree dependencies:`, 'error');\n printMessage(error.stack, 'error');\n }\n\n // Node Types\n if (Object.entries(nodeTypeMap).length) {\n printMessage(\n `\\nNode Types (${Object.entries(nodeTypeMap).length}):`,\n 'data'\n );\n for (const [nodeType, count] of Object.entries(nodeTypeMap)) {\n printMessage(\n `- ${String(count)} [${\n nodeType['brightCyan']\n }] (${Node.getNodeClassification(nodeType).join(', ')})`,\n 'data'\n );\n }\n }\n\n // Nodes\n if (Object.entries(allNodes).length) {\n printMessage(`\\nNodes (${Object.entries(allNodes).length}):`, 'data');\n for (const nodeObj of Object.values<NodeSkeleton>(allNodes)) {\n printMessage(\n `- ${Node.getOneLineDescription(\n nodeObj,\n getNodeRef(nodeObj, journeyData)\n )}`,\n 'data'\n );\n }\n }\n\n // Themes\n if (journeyData.themes?.length) {\n printMessage(`\\nThemes (${journeyData.themes.length}):`, 'data');\n for (const themeData of journeyData.themes) {\n printMessage(`- ${Theme.getOneLineDescription(themeData)}`, 'data');\n }\n }\n\n // Scripts\n if (Object.entries(journeyData.scripts).length) {\n printMessage(\n `\\nScripts (${Object.entries(journeyData.scripts).length}):`,\n 'data'\n );\n for (const scriptData of Object.values(journeyData.scripts)) {\n printMessage(`- ${Script.getOneLineDescription(scriptData)}`, 'data');\n }\n }\n\n // Email Templates\n if (Object.entries(journeyData.emailTemplates).length) {\n printMessage(\n `\\nEmail Templates (${\n Object.entries(journeyData.emailTemplates).length\n }):`,\n 'data'\n );\n for (const templateData of Object.values(journeyData.emailTemplates)) {\n printMessage(\n `- ${EmailTemplate.getOneLineDescription(templateData)}`,\n 'data'\n );\n }\n }\n\n // Social Identity Providers\n if (Object.entries(journeyData.socialIdentityProviders).length) {\n printMessage(\n `\\nSocial Identity Providers (${\n Object.entries(journeyData.socialIdentityProviders).length\n }):`,\n 'data'\n );\n for (const socialIdpData of Object.values(\n journeyData.socialIdentityProviders\n )) {\n printMessage(`- ${Idp.getOneLineDescription(socialIdpData)}`, 'data');\n }\n }\n\n // SAML2 Entity Providers\n if (Object.entries(journeyData.saml2Entities).length) {\n printMessage(\n `\\nSAML2 Entity Providers (${\n Object.entries(journeyData.saml2Entities).length\n }):`,\n 'data'\n );\n for (const entityProviderData of Object.values(journeyData.saml2Entities)) {\n printMessage(\n `- ${Saml2.getOneLineDescription(entityProviderData)}`,\n 'data'\n );\n }\n }\n\n // SAML2 Circles Of Trust\n if (Object.entries(journeyData.circlesOfTrust).length) {\n printMessage(\n `\\nSAML2 Circles Of Trust (${\n Object.entries(journeyData.circlesOfTrust).length\n }):`,\n 'data'\n );\n for (const cotData of Object.values(journeyData.circlesOfTrust)) {\n printMessage(\n `- ${CirclesOfTrust.getOneLineDescription(cotData)}`,\n 'data'\n );\n }\n }\n}\n\n/**\n * Describe a journey in markdown:\n * - Properties, tags, description, name, metadata\n * - Inner tree dependency tree\n * - Node type summary\n * - Nodes\n * - Themes\n * - Scripts\n * - Email templates\n * - Social identity providers\n * - SAML2 entity providers\n * - SAML2 circles of trust\n * @param {SingleTreeExportInterface} journeyData journey export object\n * @param {TreeExportResolverInterface} resolveTreeExport tree export resolver callback function\n */\nexport async function describeJourneyMd(\n journeyData: SingleTreeExportInterface,\n resolveTreeExport: TreeExportResolverInterface = onlineTreeExportResolver\n) {\n const allNodes = {\n ...journeyData.nodes,\n ...journeyData.innerNodes,\n };\n const nodeTypeMap = {};\n\n for (const nodeData of Object.values(allNodes)) {\n if (nodeTypeMap[nodeData._type._id]) {\n nodeTypeMap[nodeData._type._id] += 1;\n } else {\n nodeTypeMap[nodeData._type._id] = 1;\n }\n }\n\n // initialize AM version from file\n if (!state.getAmVersion() && journeyData.meta?.originAmVersion) {\n state.setAmVersion(journeyData.meta.originAmVersion);\n }\n\n // Journey Name\n printMessage(\n `# ${getOneLineDescriptionMd(journeyData.tree)} - ${\n journeyData.tree.enabled === false\n ? ':o: `disabled`'\n : ':white_check_mark: `enabled`'\n }, ${getJourneyClassificationMd(journeyData).join(', ')}`,\n 'data'\n );\n\n // Categories/Tags\n if (\n journeyData.tree.uiConfig?.categories &&\n journeyData.tree.uiConfig.categories != '[]'\n ) {\n printMessage(\n `\\`${JSON.parse(journeyData.tree.uiConfig.categories).join('`, `')}\\``,\n 'data'\n );\n }\n\n // Description\n if (journeyData.tree.description) {\n printMessage(`\\n${journeyData.tree.description}`, 'data');\n }\n\n // Journey image\n printMessage(`\\n[![](./${journeyData.tree._id}.png)]()\\n`, 'data');\n\n // Dependency Tree\n const descendents = await getTreeDescendents(journeyData, resolveTreeExport);\n printMessage(describeTreeDescendentsMd(descendents), 'data');\n\n // Node Types\n if (Object.entries(nodeTypeMap).length) {\n printMessage(\n `## Node Types (${Object.entries(nodeTypeMap).length})`,\n 'data'\n );\n printMessage('| Count | Type | Classification |', 'data');\n printMessage('| -----:| ---- | -------------- |', 'data');\n for (const [nodeType, count] of Object.entries(nodeTypeMap)) {\n printMessage(\n `| ${String(count)} | ${nodeType} | ${Node.getNodeClassificationMd(\n nodeType\n ).join('<br>')} |`,\n 'data'\n );\n }\n }\n\n // Nodes\n if (Object.entries(allNodes).length) {\n printMessage(`## Nodes (${Object.entries(allNodes).length})`, 'data');\n printMessage(Node.getTableHeaderMd(), 'data');\n for (const nodeObj of Object.values<NodeSkeleton>(allNodes)) {\n printMessage(\n `${Node.getTableRowMd(nodeObj, getNodeRef(nodeObj, journeyData))}`,\n 'data'\n );\n }\n }\n\n // Themes\n if (journeyData.themes?.length) {\n printMessage(`## Themes (${journeyData.themes.length})`, 'data');\n printMessage(Theme.getTableHeaderMd(), 'data');\n for (const themeData of journeyData.themes) {\n printMessage(`${Theme.getTableRowMd(themeData)}`, 'data');\n }\n }\n\n // Scripts\n if (Object.entries(journeyData.scripts).length) {\n printMessage(\n `## Scripts (${Object.entries(journeyData.scripts).length})`,\n 'data'\n );\n printMessage(Script.getTableHeaderMd(), 'data');\n for (const scriptData of Object.values(journeyData.scripts)) {\n printMessage(`${Script.getTableRowMd(scriptData)}`, 'data');\n }\n }\n\n // Email Templates\n if (Object.entries(journeyData.emailTemplates).length) {\n printMessage(\n `## Email Templates (${\n Object.entries(journeyData.emailTemplates).length\n })`,\n 'data'\n );\n printMessage(EmailTemplate.getTableHeaderMd(), 'data');\n for (const templateData of Object.values(journeyData.emailTemplates)) {\n printMessage(`${EmailTemplate.getTableRowMd(templateData)}`, 'data');\n }\n }\n\n // Social Identity Providers\n if (Object.entries(journeyData.socialIdentityProviders).length) {\n printMessage(\n `## Social Identity Providers (${\n Object.entries(journeyData.socialIdentityProviders).length\n })`,\n 'data'\n );\n printMessage(Idp.getTableHeaderMd(), 'data');\n for (const socialIdpData of Object.values(\n journeyData.socialIdentityProviders\n )) {\n printMessage(`${Idp.getTableRowMd(socialIdpData)}`, 'data');\n }\n }\n\n // SAML2 Entity Providers\n if (Object.entries(journeyData.saml2Entities).length) {\n printMessage(\n `## SAML2 Entity Providers (${\n Object.entries(journeyData.saml2Entities).length\n })`,\n 'data'\n );\n printMessage(Saml2.getTableHeaderMd(), 'data');\n for (const entityProviderData of Object.values(journeyData.saml2Entities)) {\n printMessage(`${Saml2.getTableRowMd(entityProviderData)}`, 'data');\n }\n }\n\n // SAML2 Circles Of Trust\n if (Object.entries(journeyData.circlesOfTrust).length) {\n printMessage(\n `## SAML2 Circles Of Trust (${\n Object.entries(journeyData.circlesOfTrust).length\n })`,\n 'data'\n );\n printMessage(CirclesOfTrust.getTableHeaderMd(), 'data');\n for (const cotData of Object.values(journeyData.circlesOfTrust)) {\n printMessage(`${CirclesOfTrust.getTableRowMd(cotData)}`, 'data');\n }\n }\n}\n"],"mappings":"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"}
@@ -4,7 +4,9 @@ import { createProgressBar, createTable, debugMessage, failSpinner, printMessage
4
4
  import { saveJsonToFile } from '../utils/ExportImportUtils';
5
5
  const {
6
6
  getTypedFilename,
7
- titleCase
7
+ titleCase,
8
+ getFilePath,
9
+ getWorkingDirectory
8
10
  } = frodo.utils;
9
11
  const {
10
12
  readOAuth2Clients,
@@ -76,9 +78,10 @@ export async function exportOAuth2ClientToFile(clientId, file, options = {
76
78
  if (file) {
77
79
  fileName = file;
78
80
  }
81
+ const filePath = getFilePath(fileName, true);
79
82
  const exportData = await exportOAuth2Client(clientId, options);
80
- saveJsonToFile(exportData, fileName);
81
- succeedSpinner(`Exported ${clientId} to ${fileName}.`);
83
+ saveJsonToFile(exportData, filePath);
84
+ succeedSpinner(`Exported ${clientId} to ${filePath}.`);
82
85
  outcome = true;
83
86
  } catch (error) {
84
87
  failSpinner(`Error exporting ${clientId}: ${error.message}`);
@@ -105,9 +108,10 @@ export async function exportOAuth2ClientsToFile(file, options = {
105
108
  if (file) {
106
109
  fileName = file;
107
110
  }
111
+ const filePath = getFilePath(fileName, true);
108
112
  const exportData = await exportOAuth2Clients(options);
109
- saveJsonToFile(exportData, fileName);
110
- succeedSpinner(`Exported all clients to ${fileName}.`);
113
+ saveJsonToFile(exportData, filePath);
114
+ succeedSpinner(`Exported all clients to ${filePath}.`);
111
115
  outcome = true;
112
116
  } catch (error) {
113
117
  failSpinner(`Error exporting all clients`);
@@ -135,7 +139,7 @@ export async function exportOAuth2ClientsToFiles(options = {
135
139
  const file = getTypedFilename(client._id, 'oauth2.app');
136
140
  try {
137
141
  const exportData = await exportOAuth2Client(client._id, options);
138
- saveJsonToFile(exportData, file);
142
+ saveJsonToFile(exportData, getFilePath(file, true));
139
143
  updateProgressBar(`Exported ${client._id}.`);
140
144
  } catch (error) {
141
145
  errors.push(error);
@@ -165,7 +169,7 @@ export async function importOAuth2ClientFromFile(clientId, file, options = {
165
169
  debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientFromFile: begin`);
166
170
  showSpinner(`Importing ${clientId}...`);
167
171
  try {
168
- const data = fs.readFileSync(file, 'utf8');
172
+ const data = fs.readFileSync(getFilePath(file), 'utf8');
169
173
  const fileData = JSON.parse(data);
170
174
  await importOAuth2Client(clientId, fileData, options);
171
175
  outcome = true;
@@ -189,15 +193,16 @@ export async function importFirstOAuth2ClientFromFile(file, options = {
189
193
  }) {
190
194
  let outcome = false;
191
195
  debugMessage(`cli.OAuth2ClientOps.importFirstOAuth2ClientFromFile: begin`);
192
- showSpinner(`Importing ${file}...`);
196
+ const filePath = getFilePath(file);
197
+ showSpinner(`Importing ${filePath}...`);
193
198
  try {
194
- const data = fs.readFileSync(file, 'utf8');
199
+ const data = fs.readFileSync(filePath, 'utf8');
195
200
  const fileData = JSON.parse(data);
196
201
  await importFirstOAuth2Client(fileData, options);
197
202
  outcome = true;
198
- succeedSpinner(`Imported ${file}.`);
203
+ succeedSpinner(`Imported ${filePath}.`);
199
204
  } catch (error) {
200
- failSpinner(`Error importing ${file}.`);
205
+ failSpinner(`Error importing ${filePath}.`);
201
206
  printMessage(error, 'error');
202
207
  }
203
208
  debugMessage(`cli.OAuth2ClientOps.importFirstOAuth2ClientFromFile: end`);
@@ -215,15 +220,16 @@ export async function importOAuth2ClientsFromFile(file, options = {
215
220
  }) {
216
221
  let outcome = false;
217
222
  debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFile: begin`);
218
- showSpinner(`Importing ${file}...`);
223
+ const filePath = getFilePath(file);
224
+ showSpinner(`Importing ${filePath}...`);
219
225
  try {
220
- const data = fs.readFileSync(file, 'utf8');
226
+ const data = fs.readFileSync(filePath, 'utf8');
221
227
  const clientData = JSON.parse(data);
222
228
  await importOAuth2Clients(clientData, options);
223
229
  outcome = true;
224
- succeedSpinner(`Imported ${file}.`);
230
+ succeedSpinner(`Imported ${filePath}.`);
225
231
  } catch (error) {
226
- failSpinner(`Error importing ${file}.`);
232
+ failSpinner(`Error importing ${filePath}.`);
227
233
  printMessage(error, 'error');
228
234
  }
229
235
  debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFile: end`);
@@ -241,8 +247,8 @@ export async function importOAuth2ClientsFromFiles(options = {
241
247
  const errors = [];
242
248
  try {
243
249
  debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFiles: begin`);
244
- const names = fs.readdirSync('.');
245
- const files = names.filter(name => name.toLowerCase().endsWith('.oauth2.app.json'));
250
+ const names = fs.readdirSync(getWorkingDirectory());
251
+ const files = names.filter(name => name.toLowerCase().endsWith('.oauth2.app.json')).map(name => getFilePath(name));
246
252
  createProgressBar(files.length, 'Importing clients...');
247
253
  let total = 0;
248
254
  for (const file of files) {
@@ -1 +1 @@
1
- {"version":3,"file":"OAuth2ClientOps.js","names":["frodo","state","fs","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","stopProgressBar","succeedSpinner","updateProgressBar","saveJsonToFile","getTypedFilename","titleCase","utils","readOAuth2Clients","exportOAuth2Client","exportOAuth2Clients","importOAuth2Client","importFirstOAuth2Client","importOAuth2Clients","oauth2oidc","client","listOAuth2Clients","long","clients","sort","a","b","_id","localeCompare","table","grantTypesMap","authorization_code","client_credentials","refresh_token","password","implicit","forEach","push","coreOAuth2ClientConfig","status","clientType","advancedOAuth2ClientConfig","grantTypes","map","type","join","scopes","redirectionUris","toString","error","exportOAuth2ClientToFile","clientId","file","options","useStringArrays","deps","outcome","fileName","exportData","message","exportOAuth2ClientsToFile","getRealmName","getRealm","exportOAuth2ClientsToFiles","errors","length","importOAuth2ClientFromFile","data","readFileSync","fileData","JSON","parse","importFirstOAuth2ClientFromFile","importOAuth2ClientsFromFile","clientData","importOAuth2ClientsFromFiles","names","readdirSync","files","filter","name","toLowerCase","endsWith","total","count","Object","keys","application"],"sources":["../../src/ops/OAuth2ClientOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { ReadableStrings } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport type {\n OAuth2ClientExportInterface,\n OAuth2ClientExportOptions,\n OAuth2ClientImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/OAuth2ClientOps';\nimport fs from 'fs';\n\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport { saveJsonToFile } from '../utils/ExportImportUtils';\n\nconst { getTypedFilename, titleCase } = frodo.utils;\nconst {\n readOAuth2Clients,\n exportOAuth2Client,\n exportOAuth2Clients,\n importOAuth2Client,\n importFirstOAuth2Client,\n importOAuth2Clients,\n} = frodo.oauth2oidc.client;\n\n/**\n * List OAuth2 clients\n */\nexport async function listOAuth2Clients(long = false) {\n try {\n const clients = await readOAuth2Clients();\n clients.sort((a, b) => a._id.localeCompare(b._id));\n if (long) {\n const table = createTable([\n 'Client Id',\n 'Status',\n 'Client Type',\n 'Grant Types',\n 'Scopes',\n 'Redirect URIs',\n // 'Description',\n ]);\n const grantTypesMap = {\n authorization_code: 'Authz Code',\n client_credentials: 'Client Creds',\n refresh_token: 'Refresh Token',\n password: 'ROPC',\n 'urn:ietf:params:oauth:grant-type:uma-ticket': 'UMA',\n implicit: 'Implicit',\n 'urn:ietf:params:oauth:grant-type:device_code': 'Device Code',\n 'urn:ietf:params:oauth:grant-type:saml2-bearer': 'SAML2 Bearer',\n 'urn:openid:params:grant-type:ciba': 'CIBA',\n 'urn:ietf:params:oauth:grant-type:token-exchange': 'Token Exchange',\n 'urn:ietf:params:oauth:grant-type:jwt-bearer': 'JWT Bearer',\n };\n clients.forEach((client) => {\n table.push([\n client._id,\n client.coreOAuth2ClientConfig.status === 'Active'\n ? 'Active'['brightGreen']\n : (client.coreOAuth2ClientConfig.status as string)['brightRed'],\n client.coreOAuth2ClientConfig.clientType,\n (client.advancedOAuth2ClientConfig.grantTypes as ReadableStrings)\n .map((type) => grantTypesMap[type])\n .join('\\n'),\n (client.coreOAuth2ClientConfig.scopes as ReadableStrings).join('\\n'),\n (client.coreOAuth2ClientConfig.redirectionUris as string[]).join(\n '\\n'\n ),\n // wordwrap(client.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n clients.forEach((client) => {\n printMessage(`${client._id}`, 'data');\n });\n }\n } catch (error) {\n printMessage(`Error listing oauth2 clients - ${error}`, 'error');\n }\n}\n\n/**\n * Export OAuth2 client to file\n * @param {string} clientId client id\n * @param {string} file file name\n * @param {OAuth2ClientExportOptions} options export options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportOAuth2ClientToFile(\n clientId: string,\n file: string,\n options: OAuth2ClientExportOptions = { useStringArrays: true, deps: true }\n) {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientToFile: begin`);\n showSpinner(`Exporting ${clientId}...`);\n try {\n let fileName = getTypedFilename(clientId, 'oauth2.app');\n if (file) {\n fileName = file;\n }\n const exportData = await exportOAuth2Client(clientId, options);\n saveJsonToFile(exportData, fileName);\n succeedSpinner(`Exported ${clientId} to ${fileName}.`);\n outcome = true;\n } catch (error) {\n failSpinner(`Error exporting ${clientId}: ${error.message}`);\n }\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientToFile: end`);\n return outcome;\n}\n\n/**\n * Export all OAuth2 clients to file\n * @param {string} file file name\n * @param {OAuth2ClientExportOptions} options export options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportOAuth2ClientsToFile(\n file: string,\n options: OAuth2ClientExportOptions = { useStringArrays: true, deps: true }\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientsToFile: begin`);\n showSpinner(`Exporting all clients...`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(frodo.utils.getRealmName(state.getRealm()))}Applications`,\n 'oauth2.app'\n );\n if (file) {\n fileName = file;\n }\n const exportData = await exportOAuth2Clients(options);\n saveJsonToFile(exportData, fileName);\n succeedSpinner(`Exported all clients to ${fileName}.`);\n outcome = true;\n } catch (error) {\n failSpinner(`Error exporting all clients`);\n printMessage(`${error.message}`, 'error');\n }\n debugMessage(\n `cli.OAuth2ClientOps.exportOAuth2ClientsToFile: end [${outcome}]`\n );\n return outcome;\n}\n\n/**\n * Export all OAuth2 clients to separate files\n * @param {OAuth2ClientExportOptions} options export options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportOAuth2ClientsToFiles(\n options: OAuth2ClientExportOptions = { useStringArrays: true, deps: true }\n) {\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientsToFiles: begin`);\n const errors = [];\n try {\n const clients = await readOAuth2Clients();\n createProgressBar(clients.length, 'Exporting clients...');\n for (const client of clients) {\n const file = getTypedFilename(client._id, 'oauth2.app');\n try {\n const exportData: OAuth2ClientExportInterface =\n await exportOAuth2Client(client._id, options);\n saveJsonToFile(exportData, file);\n updateProgressBar(`Exported ${client._id}.`);\n } catch (error) {\n errors.push(error);\n updateProgressBar(`Error exporting ${client._id}.`);\n }\n }\n stopProgressBar(`Export complete.`);\n } catch (error) {\n errors.push(error);\n stopProgressBar(`Error exporting client(s) to file(s)`);\n }\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientsToFiles: end`);\n return 0 === errors.length;\n}\n\n/**\n * Import first OAuth2 client from file\n * @param {string} clientId client id\n * @param {string} file file name\n * @param {OAuth2ClientImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importOAuth2ClientFromFile(\n clientId: string,\n file: string,\n options: OAuth2ClientImportOptions = { deps: true }\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientFromFile: begin`);\n showSpinner(`Importing ${clientId}...`);\n try {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n await importOAuth2Client(clientId, fileData, options);\n outcome = true;\n succeedSpinner(`Imported ${clientId}.`);\n } catch (error) {\n failSpinner(`Error importing ${clientId}.`);\n printMessage(error, 'error');\n }\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientFromFile: end`);\n return outcome;\n}\n\n/**\n * Import first OAuth2 client from file\n * @param {string} file file name\n * @param {OAuth2ClientImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importFirstOAuth2ClientFromFile(\n file: string,\n options: OAuth2ClientImportOptions = { deps: true }\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.importFirstOAuth2ClientFromFile: begin`);\n showSpinner(`Importing ${file}...`);\n try {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n await importFirstOAuth2Client(fileData, options);\n outcome = true;\n succeedSpinner(`Imported ${file}.`);\n } catch (error) {\n failSpinner(`Error importing ${file}.`);\n printMessage(error, 'error');\n }\n debugMessage(`cli.OAuth2ClientOps.importFirstOAuth2ClientFromFile: end`);\n return outcome;\n}\n\n/**\n * Import OAuth2 clients from file\n * @param {string} file file name\n * @param {OAuth2ClientImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importOAuth2ClientsFromFile(\n file: string,\n options: OAuth2ClientImportOptions = { deps: true }\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFile: begin`);\n showSpinner(`Importing ${file}...`);\n try {\n const data = fs.readFileSync(file, 'utf8');\n const clientData = JSON.parse(data);\n await importOAuth2Clients(clientData, options);\n outcome = true;\n succeedSpinner(`Imported ${file}.`);\n } catch (error) {\n failSpinner(`Error importing ${file}.`);\n printMessage(error, 'error');\n }\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFile: end`);\n return outcome;\n}\n\n/**\n * Import OAuth2 clients from files\n * @param {OAuth2ClientImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importOAuth2ClientsFromFiles(\n options: OAuth2ClientImportOptions = { deps: true }\n): Promise<boolean> {\n const errors = [];\n try {\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFiles: begin`);\n const names = fs.readdirSync('.');\n const files = names.filter((name) =>\n name.toLowerCase().endsWith('.oauth2.app.json')\n );\n createProgressBar(files.length, 'Importing clients...');\n let total = 0;\n for (const file of files) {\n try {\n const data = fs.readFileSync(file, 'utf8');\n const fileData: OAuth2ClientExportInterface = JSON.parse(data);\n const count = Object.keys(fileData.application).length;\n total += count;\n await importOAuth2Clients(fileData, options);\n updateProgressBar(`Imported ${count} client(s) from ${file}`);\n } catch (error) {\n errors.push(error);\n updateProgressBar(`Error importing client(s) from ${file}`);\n printMessage(error, 'error');\n }\n }\n stopProgressBar(\n `Finished importing ${total} client(s) from ${files.length} file(s).`\n );\n } catch (error) {\n errors.push(error);\n stopProgressBar(`Error importing client(s) from file(s).`);\n printMessage(error, 'error');\n }\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFiles: end`);\n return 0 === errors.length;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"OAuth2ClientOps.js","names":["frodo","state","fs","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","stopProgressBar","succeedSpinner","updateProgressBar","saveJsonToFile","getTypedFilename","titleCase","getFilePath","getWorkingDirectory","utils","readOAuth2Clients","exportOAuth2Client","exportOAuth2Clients","importOAuth2Client","importFirstOAuth2Client","importOAuth2Clients","oauth2oidc","client","listOAuth2Clients","long","clients","sort","a","b","_id","localeCompare","table","grantTypesMap","authorization_code","client_credentials","refresh_token","password","implicit","forEach","push","coreOAuth2ClientConfig","status","clientType","advancedOAuth2ClientConfig","grantTypes","map","type","join","scopes","redirectionUris","toString","error","exportOAuth2ClientToFile","clientId","file","options","useStringArrays","deps","outcome","fileName","filePath","exportData","message","exportOAuth2ClientsToFile","getRealmName","getRealm","exportOAuth2ClientsToFiles","errors","length","importOAuth2ClientFromFile","data","readFileSync","fileData","JSON","parse","importFirstOAuth2ClientFromFile","importOAuth2ClientsFromFile","clientData","importOAuth2ClientsFromFiles","names","readdirSync","files","filter","name","toLowerCase","endsWith","total","count","Object","keys","application"],"sources":["../../src/ops/OAuth2ClientOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { ReadableStrings } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport type {\n OAuth2ClientExportInterface,\n OAuth2ClientExportOptions,\n OAuth2ClientImportOptions,\n} from '@rockcarver/frodo-lib/types/ops/OAuth2ClientOps';\nimport fs from 'fs';\n\nimport {\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport { saveJsonToFile } from '../utils/ExportImportUtils';\n\nconst { getTypedFilename, titleCase, getFilePath, getWorkingDirectory } =\n frodo.utils;\nconst {\n readOAuth2Clients,\n exportOAuth2Client,\n exportOAuth2Clients,\n importOAuth2Client,\n importFirstOAuth2Client,\n importOAuth2Clients,\n} = frodo.oauth2oidc.client;\n\n/**\n * List OAuth2 clients\n */\nexport async function listOAuth2Clients(long = false) {\n try {\n const clients = await readOAuth2Clients();\n clients.sort((a, b) => a._id.localeCompare(b._id));\n if (long) {\n const table = createTable([\n 'Client Id',\n 'Status',\n 'Client Type',\n 'Grant Types',\n 'Scopes',\n 'Redirect URIs',\n // 'Description',\n ]);\n const grantTypesMap = {\n authorization_code: 'Authz Code',\n client_credentials: 'Client Creds',\n refresh_token: 'Refresh Token',\n password: 'ROPC',\n 'urn:ietf:params:oauth:grant-type:uma-ticket': 'UMA',\n implicit: 'Implicit',\n 'urn:ietf:params:oauth:grant-type:device_code': 'Device Code',\n 'urn:ietf:params:oauth:grant-type:saml2-bearer': 'SAML2 Bearer',\n 'urn:openid:params:grant-type:ciba': 'CIBA',\n 'urn:ietf:params:oauth:grant-type:token-exchange': 'Token Exchange',\n 'urn:ietf:params:oauth:grant-type:jwt-bearer': 'JWT Bearer',\n };\n clients.forEach((client) => {\n table.push([\n client._id,\n client.coreOAuth2ClientConfig.status === 'Active'\n ? 'Active'['brightGreen']\n : (client.coreOAuth2ClientConfig.status as string)['brightRed'],\n client.coreOAuth2ClientConfig.clientType,\n (client.advancedOAuth2ClientConfig.grantTypes as ReadableStrings)\n .map((type) => grantTypesMap[type])\n .join('\\n'),\n (client.coreOAuth2ClientConfig.scopes as ReadableStrings).join('\\n'),\n (client.coreOAuth2ClientConfig.redirectionUris as string[]).join(\n '\\n'\n ),\n // wordwrap(client.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n clients.forEach((client) => {\n printMessage(`${client._id}`, 'data');\n });\n }\n } catch (error) {\n printMessage(`Error listing oauth2 clients - ${error}`, 'error');\n }\n}\n\n/**\n * Export OAuth2 client to file\n * @param {string} clientId client id\n * @param {string} file file name\n * @param {OAuth2ClientExportOptions} options export options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportOAuth2ClientToFile(\n clientId: string,\n file: string,\n options: OAuth2ClientExportOptions = { useStringArrays: true, deps: true }\n) {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientToFile: begin`);\n showSpinner(`Exporting ${clientId}...`);\n try {\n let fileName = getTypedFilename(clientId, 'oauth2.app');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const exportData = await exportOAuth2Client(clientId, options);\n saveJsonToFile(exportData, filePath);\n succeedSpinner(`Exported ${clientId} to ${filePath}.`);\n outcome = true;\n } catch (error) {\n failSpinner(`Error exporting ${clientId}: ${error.message}`);\n }\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientToFile: end`);\n return outcome;\n}\n\n/**\n * Export all OAuth2 clients to file\n * @param {string} file file name\n * @param {OAuth2ClientExportOptions} options export options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportOAuth2ClientsToFile(\n file: string,\n options: OAuth2ClientExportOptions = { useStringArrays: true, deps: true }\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientsToFile: begin`);\n showSpinner(`Exporting all clients...`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(frodo.utils.getRealmName(state.getRealm()))}Applications`,\n 'oauth2.app'\n );\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n const exportData = await exportOAuth2Clients(options);\n saveJsonToFile(exportData, filePath);\n succeedSpinner(`Exported all clients to ${filePath}.`);\n outcome = true;\n } catch (error) {\n failSpinner(`Error exporting all clients`);\n printMessage(`${error.message}`, 'error');\n }\n debugMessage(\n `cli.OAuth2ClientOps.exportOAuth2ClientsToFile: end [${outcome}]`\n );\n return outcome;\n}\n\n/**\n * Export all OAuth2 clients to separate files\n * @param {OAuth2ClientExportOptions} options export options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function exportOAuth2ClientsToFiles(\n options: OAuth2ClientExportOptions = { useStringArrays: true, deps: true }\n) {\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientsToFiles: begin`);\n const errors = [];\n try {\n const clients = await readOAuth2Clients();\n createProgressBar(clients.length, 'Exporting clients...');\n for (const client of clients) {\n const file = getTypedFilename(client._id, 'oauth2.app');\n try {\n const exportData: OAuth2ClientExportInterface =\n await exportOAuth2Client(client._id, options);\n saveJsonToFile(exportData, getFilePath(file, true));\n updateProgressBar(`Exported ${client._id}.`);\n } catch (error) {\n errors.push(error);\n updateProgressBar(`Error exporting ${client._id}.`);\n }\n }\n stopProgressBar(`Export complete.`);\n } catch (error) {\n errors.push(error);\n stopProgressBar(`Error exporting client(s) to file(s)`);\n }\n debugMessage(`cli.OAuth2ClientOps.exportOAuth2ClientsToFiles: end`);\n return 0 === errors.length;\n}\n\n/**\n * Import first OAuth2 client from file\n * @param {string} clientId client id\n * @param {string} file file name\n * @param {OAuth2ClientImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importOAuth2ClientFromFile(\n clientId: string,\n file: string,\n options: OAuth2ClientImportOptions = { deps: true }\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientFromFile: begin`);\n showSpinner(`Importing ${clientId}...`);\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data);\n await importOAuth2Client(clientId, fileData, options);\n outcome = true;\n succeedSpinner(`Imported ${clientId}.`);\n } catch (error) {\n failSpinner(`Error importing ${clientId}.`);\n printMessage(error, 'error');\n }\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientFromFile: end`);\n return outcome;\n}\n\n/**\n * Import first OAuth2 client from file\n * @param {string} file file name\n * @param {OAuth2ClientImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importFirstOAuth2ClientFromFile(\n file: string,\n options: OAuth2ClientImportOptions = { deps: true }\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.importFirstOAuth2ClientFromFile: begin`);\n const filePath = getFilePath(file);\n showSpinner(`Importing ${filePath}...`);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const fileData = JSON.parse(data);\n await importFirstOAuth2Client(fileData, options);\n outcome = true;\n succeedSpinner(`Imported ${filePath}.`);\n } catch (error) {\n failSpinner(`Error importing ${filePath}.`);\n printMessage(error, 'error');\n }\n debugMessage(`cli.OAuth2ClientOps.importFirstOAuth2ClientFromFile: end`);\n return outcome;\n}\n\n/**\n * Import OAuth2 clients from file\n * @param {string} file file name\n * @param {OAuth2ClientImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importOAuth2ClientsFromFile(\n file: string,\n options: OAuth2ClientImportOptions = { deps: true }\n): Promise<boolean> {\n let outcome = false;\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFile: begin`);\n const filePath = getFilePath(file);\n showSpinner(`Importing ${filePath}...`);\n try {\n const data = fs.readFileSync(filePath, 'utf8');\n const clientData = JSON.parse(data);\n await importOAuth2Clients(clientData, options);\n outcome = true;\n succeedSpinner(`Imported ${filePath}.`);\n } catch (error) {\n failSpinner(`Error importing ${filePath}.`);\n printMessage(error, 'error');\n }\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFile: end`);\n return outcome;\n}\n\n/**\n * Import OAuth2 clients from files\n * @param {OAuth2ClientImportOptions} options import options\n * @returns {Promise<boolean>} true if successful, false otherwise\n */\nexport async function importOAuth2ClientsFromFiles(\n options: OAuth2ClientImportOptions = { deps: true }\n): Promise<boolean> {\n const errors = [];\n try {\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFiles: begin`);\n const names = fs.readdirSync(getWorkingDirectory());\n const files = names\n .filter((name) => name.toLowerCase().endsWith('.oauth2.app.json'))\n .map((name) => getFilePath(name));\n createProgressBar(files.length, 'Importing clients...');\n let total = 0;\n for (const file of files) {\n try {\n const data = fs.readFileSync(file, 'utf8');\n const fileData: OAuth2ClientExportInterface = JSON.parse(data);\n const count = Object.keys(fileData.application).length;\n total += count;\n await importOAuth2Clients(fileData, options);\n updateProgressBar(`Imported ${count} client(s) from ${file}`);\n } catch (error) {\n errors.push(error);\n updateProgressBar(`Error importing client(s) from ${file}`);\n printMessage(error, 'error');\n }\n }\n stopProgressBar(\n `Finished importing ${total} client(s) from ${files.length} file(s).`\n );\n } catch (error) {\n errors.push(error);\n stopProgressBar(`Error importing client(s) from file(s).`);\n printMessage(error, 'error');\n }\n debugMessage(`cli.OAuth2ClientOps.importOAuth2ClientsFromFiles: end`);\n return 0 === errors.length;\n}\n"],"mappings":"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"}
@@ -3,7 +3,9 @@ import fs from 'fs';
3
3
  import { createObjectTable, createProgressBar, createTable, debugMessage, failSpinner, printMessage, showSpinner, stopProgressBar, succeedSpinner, updateProgressBar } from '../utils/Console';
4
4
  import { getTypedFilename, saveJsonToFile, titleCase } from '../utils/ExportImportUtils';
5
5
  const {
6
- getRealmName
6
+ getRealmName,
7
+ getFilePath,
8
+ getWorkingDirectory
7
9
  } = frodo.utils;
8
10
  const {
9
11
  readPolicies,
@@ -244,9 +246,10 @@ export async function exportPolicyToFile(policyId, file, options = {
244
246
  if (file) {
245
247
  fileName = file;
246
248
  }
249
+ const filePath = getFilePath(fileName, true);
247
250
  const exportData = await exportPolicy(policyId, options);
248
- saveJsonToFile(exportData, fileName);
249
- succeedSpinner(`Exported ${policyId} to ${fileName}.`);
251
+ saveJsonToFile(exportData, filePath);
252
+ succeedSpinner(`Exported ${policyId} to ${filePath}.`);
250
253
  outcome = true;
251
254
  } catch (error) {
252
255
  failSpinner(`Error exporting ${policyId}: ${error.message}`);
@@ -274,9 +277,10 @@ export async function exportPoliciesToFile(file, options = {
274
277
  if (file) {
275
278
  fileName = file;
276
279
  }
280
+ const filePath = getFilePath(fileName, true);
277
281
  const exportData = await exportPolicies(options);
278
- saveJsonToFile(exportData, fileName);
279
- succeedSpinner(`Exported all policy sets to ${fileName}.`);
282
+ saveJsonToFile(exportData, filePath);
283
+ succeedSpinner(`Exported all policy sets to ${filePath}.`);
280
284
  outcome = true;
281
285
  } catch (error) {
282
286
  failSpinner(`Error exporting policy sets: ${error.message}`);
@@ -305,9 +309,10 @@ export async function exportPoliciesByPolicySetToFile(policySetId, file, options
305
309
  if (file) {
306
310
  fileName = file;
307
311
  }
312
+ const filePath = getFilePath(fileName, true);
308
313
  const exportData = await exportPoliciesByPolicySet(policySetId, options);
309
- saveJsonToFile(exportData, fileName);
310
- succeedSpinner(`Exported all policy sets to ${fileName}.`);
314
+ saveJsonToFile(exportData, filePath);
315
+ succeedSpinner(`Exported all policy sets to ${filePath}.`);
311
316
  outcome = true;
312
317
  } catch (error) {
313
318
  failSpinner(`Error exporting policy sets: ${error.message}`);
@@ -335,7 +340,7 @@ export async function exportPoliciesToFiles(options = {
335
340
  const file = getTypedFilename(policy._id, 'policy.authz');
336
341
  try {
337
342
  const exportData = await exportPolicy(policy._id, options);
338
- saveJsonToFile(exportData, file);
343
+ saveJsonToFile(exportData, getFilePath(file, true));
339
344
  updateProgressBar(`Exported ${policy._id}.`);
340
345
  } catch (error) {
341
346
  errors.push(error);
@@ -370,7 +375,7 @@ export async function exportPoliciesByPolicySetToFiles(policySetId, options = {
370
375
  const file = getTypedFilename(policy._id, 'policy.authz');
371
376
  try {
372
377
  const exportData = await exportPolicy(policy._id, options);
373
- saveJsonToFile(exportData, file);
378
+ saveJsonToFile(exportData, getFilePath(file, true));
374
379
  updateProgressBar(`Exported ${policy._id}.`);
375
380
  } catch (error) {
376
381
  errors.push(error);
@@ -401,7 +406,7 @@ export async function importPolicyFromFile(policyId, file, options = {
401
406
  debugMessage(`cli.PolicyOps.importPolicyFromFile: begin`);
402
407
  showSpinner(`Importing ${policyId}...`);
403
408
  try {
404
- const data = fs.readFileSync(file, 'utf8');
409
+ const data = fs.readFileSync(getFilePath(file), 'utf8');
405
410
  const fileData = JSON.parse(data);
406
411
  await importPolicy(policyId, fileData, options);
407
412
  outcome = true;
@@ -426,15 +431,16 @@ export async function importFirstPolicyFromFile(file, options = {
426
431
  }) {
427
432
  let outcome = false;
428
433
  debugMessage(`cli.PolicySetOps.importFirstPolicyFromFile: begin`);
429
- showSpinner(`Importing first policy from ${file}...`);
434
+ const filePath = getFilePath(file);
435
+ showSpinner(`Importing first policy from ${filePath}...`);
430
436
  try {
431
- const data = fs.readFileSync(file, 'utf8');
437
+ const data = fs.readFileSync(filePath, 'utf8');
432
438
  const fileData = JSON.parse(data);
433
439
  const policy = await importFirstPolicy(fileData, options);
434
440
  outcome = true;
435
- succeedSpinner(`Imported first policy with id '${policy._id}' from ${file}.`);
441
+ succeedSpinner(`Imported first policy with id '${policy._id}' from ${filePath}.`);
436
442
  } catch (error) {
437
- failSpinner(`Error importing first policy from ${file}.`);
443
+ failSpinner(`Error importing first policy from ${filePath}.`);
438
444
  printMessage(error, 'error');
439
445
  }
440
446
  debugMessage(`cli.PolicySetOps.importFirstPolicyFromFile: end`);
@@ -453,15 +459,16 @@ export async function importPoliciesFromFile(file, options = {
453
459
  }) {
454
460
  let outcome = false;
455
461
  debugMessage(`cli.PolicyOps.importPoliciesFromFile: begin`);
456
- showSpinner(`Importing ${file}...`);
462
+ const filePath = getFilePath(file);
463
+ showSpinner(`Importing ${filePath}...`);
457
464
  try {
458
- const data = fs.readFileSync(file, 'utf8');
465
+ const data = fs.readFileSync(filePath, 'utf8');
459
466
  const fileData = JSON.parse(data);
460
467
  await importPolicies(fileData, options);
461
468
  outcome = true;
462
- succeedSpinner(`Imported ${file}${options.policySetName ? ' into policy set ' + options.policySetName : '.'}`);
469
+ succeedSpinner(`Imported ${filePath}${options.policySetName ? ' into policy set ' + options.policySetName : '.'}`);
463
470
  } catch (error) {
464
- failSpinner(`Error importing ${file}${options.policySetName ? ' into policy set ' + options.policySetName : '.'}`);
471
+ failSpinner(`Error importing ${filePath}${options.policySetName ? ' into policy set ' + options.policySetName : '.'}`);
465
472
  printMessage(error, 'error');
466
473
  }
467
474
  debugMessage(`cli.PolicyOps.importPoliciesFromFile: end`);
@@ -480,8 +487,8 @@ export async function importPoliciesFromFiles(options = {
480
487
  const errors = [];
481
488
  try {
482
489
  debugMessage(`cli.PolicyOps.importPoliciesFromFiles: begin`);
483
- const names = fs.readdirSync('.');
484
- const files = names.filter(name => name.toLowerCase().endsWith('.policy.authz.json'));
490
+ const names = fs.readdirSync(getWorkingDirectory());
491
+ const files = names.filter(name => name.toLowerCase().endsWith('.policy.authz.json')).map(name => getFilePath(name));
485
492
  createProgressBar(files.length, 'Importing policies...');
486
493
  let total = 0;
487
494
  for (const file of files) {