@rockcarver/frodo-cli 2.0.0-32 → 2.0.0-33

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 (120) hide show
  1. package/CHANGELOG.md +5 -1
  2. package/esm/cli/FrodoCommand.js +8 -1
  3. package/esm/cli/FrodoCommand.js.map +1 -1
  4. package/esm/cli/admin/admin-export-full-cloud-config.js +44 -0
  5. package/esm/cli/admin/admin-export-full-cloud-config.js.map +1 -0
  6. package/esm/cli/admin/admin.js +1 -0
  7. package/esm/cli/admin/admin.js.map +1 -1
  8. package/esm/cli/authz/authz-policy-export.js +1 -1
  9. package/esm/cli/authz/authz-policy-export.js.map +1 -1
  10. package/esm/cli/authz/authz-policy-import.js +1 -1
  11. package/esm/cli/authz/authz-policy-import.js.map +1 -1
  12. package/esm/cli/authz/authz-policy-list.js +2 -2
  13. package/esm/cli/authz/authz-policy-list.js.map +1 -1
  14. package/esm/cli/authz/authz-set-delete.js +2 -2
  15. package/esm/cli/authz/authz-set-delete.js.map +1 -1
  16. package/esm/cli/authz/authz-set-export.js +1 -1
  17. package/esm/cli/authz/authz-set-export.js.map +1 -1
  18. package/esm/cli/authz/authz-set-import.js +1 -1
  19. package/esm/cli/authz/authz-set-import.js.map +1 -1
  20. package/esm/cli/authz/authz-set-list.js +1 -1
  21. package/esm/cli/authz/authz-set-list.js.map +1 -1
  22. package/esm/cli/authz/authz-type-delete.js +3 -3
  23. package/esm/cli/authz/authz-type-delete.js.map +1 -1
  24. package/esm/cli/authz/authz-type-export.js +2 -2
  25. package/esm/cli/authz/authz-type-export.js.map +1 -1
  26. package/esm/cli/authz/authz-type-import.js +2 -2
  27. package/esm/cli/authz/authz-type-import.js.map +1 -1
  28. package/esm/cli/authz/authz-type-list.js +1 -1
  29. package/esm/cli/authz/authz-type-list.js.map +1 -1
  30. package/esm/cli/email/email-template-export.js +3 -3
  31. package/esm/cli/email/email-template-export.js.map +1 -1
  32. package/esm/cli/email/email-template-import.js +4 -4
  33. package/esm/cli/email/email-template-import.js.map +1 -1
  34. package/esm/cli/email/email-template-list.js +1 -1
  35. package/esm/cli/email/email-template-list.js.map +1 -1
  36. package/esm/cli/idm/idm-count.js +1 -1
  37. package/esm/cli/idm/idm-count.js.map +1 -1
  38. package/esm/cli/idm/idm-export.js +3 -3
  39. package/esm/cli/idm/idm-export.js.map +1 -1
  40. package/esm/cli/idm/idm-list.js +2 -2
  41. package/esm/cli/idm/idm-list.js.map +1 -1
  42. package/esm/cli/idp/idp-export.js +3 -3
  43. package/esm/cli/idp/idp-export.js.map +1 -1
  44. package/esm/cli/idp/idp-import.js +4 -4
  45. package/esm/cli/idp/idp-import.js.map +1 -1
  46. package/esm/cli/idp/idp-list.js +1 -1
  47. package/esm/cli/idp/idp-list.js.map +1 -1
  48. package/esm/cli/journey/journey-delete.js +6 -2
  49. package/esm/cli/journey/journey-delete.js.map +1 -1
  50. package/esm/cli/journey/journey-disable.js +4 -10
  51. package/esm/cli/journey/journey-disable.js.map +1 -1
  52. package/esm/cli/journey/journey-enable.js +4 -10
  53. package/esm/cli/journey/journey-enable.js.map +1 -1
  54. package/esm/cli/journey/journey-import.js +4 -4
  55. package/esm/cli/journey/journey-import.js.map +1 -1
  56. package/esm/cli/journey/journey-list.js +1 -1
  57. package/esm/cli/journey/journey-list.js.map +1 -1
  58. package/esm/cli/saml/saml-cot-export.js +3 -3
  59. package/esm/cli/saml/saml-cot-export.js.map +1 -1
  60. package/esm/cli/saml/saml-cot-list.js +1 -1
  61. package/esm/cli/saml/saml-cot-list.js.map +1 -1
  62. package/esm/cli/saml/saml-describe.js +1 -1
  63. package/esm/cli/saml/saml-describe.js.map +1 -1
  64. package/esm/cli/saml/saml-import.js +4 -4
  65. package/esm/cli/saml/saml-import.js.map +1 -1
  66. package/esm/cli/saml/saml-list.js +1 -1
  67. package/esm/cli/saml/saml-list.js.map +1 -1
  68. package/esm/cli/saml/saml-metadata-export.js +1 -1
  69. package/esm/cli/saml/saml-metadata-export.js.map +1 -1
  70. package/esm/cli/script/script-export.js +2 -6
  71. package/esm/cli/script/script-export.js.map +1 -1
  72. package/esm/cli/theme/theme-delete.js +3 -3
  73. package/esm/cli/theme/theme-delete.js.map +1 -1
  74. package/esm/cli/theme/theme-export.js +4 -4
  75. package/esm/cli/theme/theme-export.js.map +1 -1
  76. package/esm/cli/theme/theme-import.js +4 -4
  77. package/esm/cli/theme/theme-import.js.map +1 -1
  78. package/esm/cli/theme/theme-list.js +1 -1
  79. package/esm/cli/theme/theme-list.js.map +1 -1
  80. package/esm/ops/AdminFederationOps.js +28 -26
  81. package/esm/ops/AdminFederationOps.js.map +1 -1
  82. package/esm/ops/AdminOps.js +112 -0
  83. package/esm/ops/AdminOps.js.map +1 -0
  84. package/esm/ops/AgentOps.js +59 -51
  85. package/esm/ops/AgentOps.js.map +1 -1
  86. package/esm/ops/ApplicationOps.js +19 -13
  87. package/esm/ops/ApplicationOps.js.map +1 -1
  88. package/esm/ops/CirclesOfTrustOps.js +28 -26
  89. package/esm/ops/CirclesOfTrustOps.js.map +1 -1
  90. package/esm/ops/EmailTemplateOps.js +78 -94
  91. package/esm/ops/EmailTemplateOps.js.map +1 -1
  92. package/esm/ops/IdmOps.js +8 -31
  93. package/esm/ops/IdmOps.js.map +1 -1
  94. package/esm/ops/IdpOps.js +49 -54
  95. package/esm/ops/IdpOps.js.map +1 -1
  96. package/esm/ops/JourneyOps.js +91 -70
  97. package/esm/ops/JourneyOps.js.map +1 -1
  98. package/esm/ops/OAuth2ClientOps.js +13 -11
  99. package/esm/ops/OAuth2ClientOps.js.map +1 -1
  100. package/esm/ops/PolicyOps.js +31 -26
  101. package/esm/ops/PolicyOps.js.map +1 -1
  102. package/esm/ops/PolicySetOps.js +42 -39
  103. package/esm/ops/PolicySetOps.js.map +1 -1
  104. package/esm/ops/ResourceTypeOps.js +19 -16
  105. package/esm/ops/ResourceTypeOps.js.map +1 -1
  106. package/esm/ops/Saml2Ops.js +49 -45
  107. package/esm/ops/Saml2Ops.js.map +1 -1
  108. package/esm/ops/ScriptOps.js +36 -55
  109. package/esm/ops/ScriptOps.js.map +1 -1
  110. package/esm/ops/SecretsOps.js +13 -11
  111. package/esm/ops/SecretsOps.js.map +1 -1
  112. package/esm/ops/ThemeOps.js +111 -130
  113. package/esm/ops/ThemeOps.js.map +1 -1
  114. package/esm/ops/VariablesOps.js +14 -12
  115. package/esm/ops/VariablesOps.js.map +1 -1
  116. package/esm/utils/Console.js +68 -30
  117. package/esm/utils/Console.js.map +1 -1
  118. package/esm/utils/ExportImportUtils.js +4 -12
  119. package/esm/utils/ExportImportUtils.js.map +1 -1
  120. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"Saml2Ops.js","names":["frodo","fs","createObjectTable","createProgressBar","createTable","debugMessage","failSpinner","printMessage","showSpinner","stopProgressBar","succeedSpinner","updateProgressBar","saveTextToFile","decodeBase64","getFilePath","getWorkingDirectory","utils","getTypedFilename","saveJsonToFile","getRealmString","validateImport","readSaml2ProviderStubs","readSaml2Provider","readSaml2ProviderStub","getSaml2ProviderMetadataUrl","getSaml2ProviderMetadata","exportSaml2Provider","exportSaml2Providers","importSaml2Provider","importSaml2Providers","saml2","entityProvider","roleMap","identityProvider","serviceProvider","attributeQueryProvider","xacmlPolicyEnforcementPoint","getOneLineDescription","saml2ProviderObj","roles","key","value","Object","entries","push","description","entityId","entityLocation","length","join","getTableHeaderMd","markdown","getTableRowMd","row","listSaml2Providers","long","providerList","sort","a","b","_id","localeCompare","provider","table","location","map","role","toString","describeSaml2Provider","stub","rawProviderData","_rev","metadataUrl","error","message","exportSaml2MetadataToFile","file","fileName","filePath","metaData","brightCyan","exportSaml2ProviderToFile","fileData","err","exportSaml2ProvidersToFile","exportData","_error$response","response","status","exportSaml2ProvidersToFiles","stubs","importSaml2ProviderFromFile","readFile","data","JSON","parse","importFirstSaml2ProviderFromFile","entityId64","keys","saml","remote","hosted","importSaml2ProvidersFromFile","meta","importSaml2ProvidersFromFiles","names","readdirSync","jsonFiles","filter","name","toLowerCase","endsWith","total","readFileSync","result"],"sources":["../../src/ops/Saml2Ops.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { type Saml2ProviderSkeleton } from '@rockcarver/frodo-lib/types/api/Saml2Api';\nimport { type Saml2ExportInterface } from '@rockcarver/frodo-lib/types/ops/Saml2Ops';\nimport fs from 'fs';\n\nimport {\n createObjectTable,\n createProgressBar,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n stopProgressBar,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport { saveTextToFile } from '../utils/ExportImportUtils';\n\nconst { decodeBase64, getFilePath, getWorkingDirectory } = frodo.utils;\nconst { getTypedFilename, saveJsonToFile, getRealmString, validateImport } =\n frodo.utils;\nconst {\n readSaml2ProviderStubs,\n readSaml2Provider,\n readSaml2ProviderStub,\n getSaml2ProviderMetadataUrl,\n getSaml2ProviderMetadata,\n exportSaml2Provider,\n exportSaml2Providers,\n importSaml2Provider,\n importSaml2Providers,\n} = frodo.saml2.entityProvider;\n\nconst roleMap = {\n identityProvider: 'IDP',\n serviceProvider: 'SP',\n attributeQueryProvider: 'AttrQuery',\n xacmlPolicyEnforcementPoint: 'XACML PEP',\n};\n\n/**\n * Get a one-line description of the saml2 provider object\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n saml2ProviderObj: Saml2ProviderSkeleton\n): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const description = `[${saml2ProviderObj.entityId['brightCyan']}]${\n ' (' + saml2ProviderObj.entityLocation\n }${roles.length ? ' ' + roles.join(', ') + ')' : ')'}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Entity Id | Location | Role(s) |\\n';\n markdown += '| --------- | -------- | ------- |';\n return markdown;\n}\n\n/**\n * Get a table-row of the saml2 provider in markdown\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a table-row of the saml2 provider in markdown\n */\nexport function getTableRowMd(saml2ProviderObj: Saml2ProviderSkeleton): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const row = `| ${saml2ProviderObj.entityId} | ${\n saml2ProviderObj.entityLocation\n } | ${roles.length ? roles.join(', ') : ''} |`;\n return row;\n}\n\n/**\n * List entity providers\n * @param {boolean} long Long list format with details\n */\nexport async function listSaml2Providers(long = false) {\n const providerList = await readSaml2ProviderStubs();\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const provider of providerList) {\n printMessage(`${provider.entityId}`, 'data');\n }\n } else {\n const table = createTable([\n 'Entity Id'['brightCyan'],\n 'Location'['brightCyan'],\n 'Role(s)'['brightCyan'],\n ]);\n for (const provider of providerList) {\n table.push([\n provider.entityId,\n provider.location,\n provider.roles.map((role) => roleMap[role]).join(', '),\n ]);\n }\n printMessage(table.toString(), 'data');\n }\n}\n\n/**\n * Describe an entity provider's configuration\n * @param {String} entityId Provider entity id\n */\nexport async function describeSaml2Provider(entityId) {\n try {\n const stub = await readSaml2ProviderStub(entityId);\n const { location } = stub;\n const roles = stub.roles.map((role: string) => roleMap[role]).join(', ');\n const rawProviderData = await readSaml2Provider(entityId);\n delete rawProviderData._id;\n delete rawProviderData._rev;\n rawProviderData.location = location;\n rawProviderData.roles = roles;\n rawProviderData.metadataUrl = getSaml2ProviderMetadataUrl(entityId);\n const table = createObjectTable(rawProviderData);\n printMessage(table.toString(), 'data');\n } catch (error) {\n printMessage(error.message, 'error');\n }\n}\n\n/**\n * Export provider metadata to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2MetadataToFile(entityId, file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'metadata', 'xml');\n }\n const filePath = getFilePath(fileName, true);\n createProgressBar(1, `Exporting metadata for: ${entityId}`);\n try {\n updateProgressBar(`Writing file ${filePath}`);\n const metaData = await getSaml2ProviderMetadata(entityId);\n saveTextToFile(metaData, filePath);\n updateProgressBar(`Exported provider ${entityId}`);\n stopProgressBar(\n // @ts-expect-error - brightCyan colors the string, even though it is not a property of string\n `Exported ${entityId.brightCyan} metadata to ${filePath.brightCyan}.`\n );\n } catch (error) {\n stopProgressBar(`${error}`);\n printMessage(error, 'error');\n }\n}\n\n/**\n * Export a single entity provider to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProviderToFile(entityId, file = null) {\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: start [entityId=${entityId}, file=${file}]`\n );\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'saml');\n }\n const filePath = getFilePath(fileName, true);\n try {\n createProgressBar(1, `Exporting provider ${entityId}`);\n const fileData = await exportSaml2Provider(entityId);\n saveJsonToFile(fileData, filePath);\n updateProgressBar(`Exported provider ${entityId}`);\n stopProgressBar(\n // @ts-expect-error - brightCyan colors the string, even though it is not a property of string\n `Exported ${entityId.brightCyan} to ${filePath.brightCyan}.`\n );\n } catch (err) {\n stopProgressBar(`${err}`);\n printMessage(err, 'error');\n }\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: end [entityId=${entityId}, file=${filePath}]`\n );\n}\n\n/**\n * Export all entity providers to one file\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProvidersToFile(file = null) {\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: start [file=${file}]`);\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Providers`, 'saml');\n }\n try {\n const exportData = await exportSaml2Providers();\n saveJsonToFile(exportData, getFilePath(fileName, true));\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: end [file=${file}]`);\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportSaml2ProvidersToFiles() {\n const stubs = await readSaml2ProviderStubs();\n if (stubs.length > 0) {\n createProgressBar(stubs.length, 'Exporting providers');\n for (const stub of stubs) {\n const fileName = getTypedFilename(stub.entityId, 'saml');\n const fileData = await exportSaml2Provider(stub.entityId);\n saveJsonToFile(fileData, getFilePath(fileName, true));\n updateProgressBar(`Exported provider ${stub.entityId}`);\n }\n stopProgressBar(`${stubs.length} providers exported.`);\n } else {\n printMessage('No entity providers found.', 'info');\n }\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} entityId Provider entity id\n * @param {String} file Import file name\n */\nexport async function importSaml2ProviderFromFile(\n entityId: string,\n file: string\n) {\n fs.readFile(getFilePath(file), 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n succeedSpinner(`Imported ${entityId}.`);\n } catch (error) {\n failSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n });\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} file Import file name\n */\nexport async function importFirstSaml2ProviderFromFile(file: string) {\n fs.readFile(getFilePath(file), 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data) as Saml2ExportInterface;\n // pick the first provider and run with it\n const entityId64 =\n Object.keys(fileData.saml.remote)[0] ||\n Object.keys(fileData.saml.hosted)[0];\n const entityId = decodeBase64(entityId64);\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n succeedSpinner(`Imported ${entityId}.`);\n } catch (error) {\n failSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n });\n}\n\n/**\n * Import all SAML entity providers from file\n * @param {String} file Import file name\n */\nexport async function importSaml2ProvidersFromFile(file: string) {\n fs.readFile(getFilePath(file), 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n await importSaml2Providers(fileData);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from all *.saml.json files in the current directory\n */\nexport async function importSaml2ProvidersFromFiles() {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.saml.json'))\n .map((name) => getFilePath(name));\n createProgressBar(jsonFiles.length, 'Importing providers...');\n let total = 0;\n for (const file of jsonFiles) {\n try {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n const result = await importSaml2Providers(fileData);\n total += result.length;\n updateProgressBar(\n `Imported ${result.length} provider(s) from ${file}.`\n );\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n } catch (error) {\n printMessage(\n `Error importing providers from ${file}: ${error.message}`,\n 'error'\n );\n }\n }\n stopProgressBar(\n `Imported ${total} provider(s) from ${jsonFiles.length} file(s).`\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Saml2Ops.js","names":["frodo","fs","createObjectTable","createProgressIndicator","createTable","debugMessage","printMessage","stopProgressIndicator","updateProgressIndicator","saveTextToFile","decodeBase64","getFilePath","getWorkingDirectory","utils","getTypedFilename","saveJsonToFile","getRealmString","validateImport","readSaml2ProviderStubs","readSaml2Provider","readSaml2ProviderStub","getSaml2ProviderMetadataUrl","getSaml2ProviderMetadata","exportSaml2Provider","exportSaml2Providers","importSaml2Provider","importSaml2Providers","saml2","entityProvider","roleMap","identityProvider","serviceProvider","attributeQueryProvider","xacmlPolicyEnforcementPoint","getOneLineDescription","saml2ProviderObj","roles","key","value","Object","entries","push","description","entityId","entityLocation","length","join","getTableHeaderMd","markdown","getTableRowMd","row","listSaml2Providers","long","providerList","sort","a","b","_id","localeCompare","provider","table","location","map","role","toString","describeSaml2Provider","stub","rawProviderData","_rev","metadataUrl","error","message","exportSaml2MetadataToFile","file","filePath","indicatorId","metaData","brightCyan","exportSaml2ProviderToFile","fileData","err","exportSaml2ProvidersToFile","exportData","_error$response","response","status","exportSaml2ProvidersToFiles","stubs","importSaml2ProviderFromFile","data","readFileSync","JSON","parse","importFirstSaml2ProviderFromFile","entityId64","keys","saml","remote","hosted","importSaml2ProvidersFromFile","meta","importSaml2ProvidersFromFiles","names","readdirSync","jsonFiles","filter","name","toLowerCase","endsWith","total","result"],"sources":["../../src/ops/Saml2Ops.ts"],"sourcesContent":["import { frodo } from '@rockcarver/frodo-lib';\nimport { type Saml2ProviderSkeleton } from '@rockcarver/frodo-lib/types/api/Saml2Api';\nimport { type Saml2ExportInterface } from '@rockcarver/frodo-lib/types/ops/Saml2Ops';\nimport fs from 'fs';\n\nimport {\n createObjectTable,\n createProgressIndicator,\n createTable,\n debugMessage,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport { saveTextToFile } from '../utils/ExportImportUtils';\n\nconst { decodeBase64, getFilePath, getWorkingDirectory } = frodo.utils;\nconst { getTypedFilename, saveJsonToFile, getRealmString, validateImport } =\n frodo.utils;\nconst {\n readSaml2ProviderStubs,\n readSaml2Provider,\n readSaml2ProviderStub,\n getSaml2ProviderMetadataUrl,\n getSaml2ProviderMetadata,\n exportSaml2Provider,\n exportSaml2Providers,\n importSaml2Provider,\n importSaml2Providers,\n} = frodo.saml2.entityProvider;\n\nconst roleMap = {\n identityProvider: 'IDP',\n serviceProvider: 'SP',\n attributeQueryProvider: 'AttrQuery',\n xacmlPolicyEnforcementPoint: 'XACML PEP',\n};\n\n/**\n * Get a one-line description of the saml2 provider object\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n saml2ProviderObj: Saml2ProviderSkeleton\n): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const description = `[${saml2ProviderObj.entityId['brightCyan']}]${\n ' (' + saml2ProviderObj.entityLocation\n }${roles.length ? ' ' + roles.join(', ') + ')' : ')'}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Entity Id | Location | Role(s) |\\n';\n markdown += '| --------- | -------- | ------- |';\n return markdown;\n}\n\n/**\n * Get a table-row of the saml2 provider in markdown\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a table-row of the saml2 provider in markdown\n */\nexport function getTableRowMd(saml2ProviderObj: Saml2ProviderSkeleton): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const row = `| ${saml2ProviderObj.entityId} | ${\n saml2ProviderObj.entityLocation\n } | ${roles.length ? roles.join(', ') : ''} |`;\n return row;\n}\n\n/**\n * List entity providers\n * @param {boolean} long Long list format with details\n */\nexport async function listSaml2Providers(long = false) {\n const providerList = await readSaml2ProviderStubs();\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const provider of providerList) {\n printMessage(`${provider.entityId}`, 'data');\n }\n } else {\n const table = createTable([\n 'Entity Id'['brightCyan'],\n 'Location'['brightCyan'],\n 'Role(s)'['brightCyan'],\n ]);\n for (const provider of providerList) {\n table.push([\n provider.entityId,\n provider.location,\n provider.roles.map((role) => roleMap[role]).join(', '),\n ]);\n }\n printMessage(table.toString(), 'data');\n }\n}\n\n/**\n * Describe an entity provider's configuration\n * @param {String} entityId Provider entity id\n */\nexport async function describeSaml2Provider(entityId) {\n try {\n const stub = await readSaml2ProviderStub(entityId);\n const { location } = stub;\n const roles = stub.roles.map((role: string) => roleMap[role]).join(', ');\n const rawProviderData = await readSaml2Provider(entityId);\n delete rawProviderData._id;\n delete rawProviderData._rev;\n rawProviderData.location = location;\n rawProviderData.roles = roles;\n rawProviderData.metadataUrl = getSaml2ProviderMetadataUrl(entityId);\n const table = createObjectTable(rawProviderData);\n printMessage(table.toString(), 'data');\n } catch (error) {\n printMessage(error.message, 'error');\n }\n}\n\n/**\n * Export provider metadata to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2MetadataToFile(entityId, file = null) {\n if (!file) {\n file = getTypedFilename(entityId, 'metadata', 'xml');\n }\n const filePath = getFilePath(file, true);\n const indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting metadata for: ${entityId}`\n );\n try {\n updateProgressIndicator(indicatorId, `Writing file ${filePath}`);\n const metaData = await getSaml2ProviderMetadata(entityId);\n saveTextToFile(metaData, filePath);\n updateProgressIndicator(indicatorId, `Exported provider ${entityId}`);\n stopProgressIndicator(\n indicatorId,\n // @ts-expect-error - brightCyan colors the string, even though it is not a property of string\n `Exported ${entityId.brightCyan} metadata to ${filePath.brightCyan}.`\n );\n } catch (error) {\n stopProgressIndicator(indicatorId, `${error}`);\n printMessage(error, 'error');\n }\n}\n\n/**\n * Export a single entity provider to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProviderToFile(entityId, file = null) {\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: start [entityId=${entityId}, file=${file}]`\n );\n if (!file) {\n file = getTypedFilename(entityId, 'saml');\n }\n const filePath = getFilePath(file, true);\n let indicatorId: string;\n try {\n indicatorId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting provider ${entityId}`\n );\n const fileData = await exportSaml2Provider(entityId);\n saveJsonToFile(fileData, filePath);\n updateProgressIndicator(indicatorId, `Exported provider ${entityId}`);\n stopProgressIndicator(\n indicatorId,\n // @ts-expect-error - brightCyan colors the string, even though it is not a property of string\n `Exported ${entityId.brightCyan} to ${filePath.brightCyan}.`\n );\n } catch (err) {\n stopProgressIndicator(indicatorId, `${err}`);\n printMessage(err, 'error');\n }\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: end [entityId=${entityId}, file=${filePath}]`\n );\n}\n\n/**\n * Export all entity providers to one file\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProvidersToFile(file = null) {\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: start [file=${file}]`);\n if (!file) {\n file = getTypedFilename(`all${getRealmString()}Providers`, 'saml');\n }\n try {\n const exportData = await exportSaml2Providers();\n saveJsonToFile(exportData, getFilePath(file, true));\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: end [file=${file}]`);\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportSaml2ProvidersToFiles() {\n const stubs = await readSaml2ProviderStubs();\n if (stubs.length > 0) {\n const indicatorId = createProgressIndicator(\n 'determinate',\n stubs.length,\n 'Exporting providers'\n );\n for (const stub of stubs) {\n const file = getFilePath(getTypedFilename(stub.entityId, 'saml'), true);\n const fileData = await exportSaml2Provider(stub.entityId);\n saveJsonToFile(fileData, file);\n updateProgressIndicator(\n indicatorId,\n `Exported provider ${stub.entityId}`\n );\n }\n stopProgressIndicator(indicatorId, `${stubs.length} providers exported.`);\n } else {\n printMessage('No entity providers found.', 'info');\n }\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} entityId Provider entity id\n * @param {String} file Import file name\n */\nexport async function importSaml2ProviderFromFile(\n entityId: string,\n file: string\n) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${entityId}...`\n );\n try {\n await importSaml2Provider(entityId, fileData);\n stopProgressIndicator(indicatorId, `Imported ${entityId}.`, 'success');\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing ${entityId}: ${error.message}`,\n 'fail'\n );\n }\n } catch (error) {\n printMessage(\n `Error importing saml2 provider ${entityId}: ${error}`,\n 'error'\n );\n }\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} file Import file name\n */\nexport async function importFirstSaml2ProviderFromFile(file: string) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data) as Saml2ExportInterface;\n // pick the first provider and run with it\n const entityId64 =\n Object.keys(fileData.saml.remote)[0] ||\n Object.keys(fileData.saml.hosted)[0];\n const entityId = decodeBase64(entityId64);\n const indicatorId = createProgressIndicator(\n 'indeterminate',\n 0,\n `Importing ${entityId}...`\n );\n try {\n await importSaml2Provider(entityId, fileData);\n stopProgressIndicator(indicatorId, `Imported ${entityId}.`, 'success');\n } catch (error) {\n stopProgressIndicator(\n indicatorId,\n `Error importing ${entityId}: ${error.message}`,\n 'fail'\n );\n }\n } catch (error) {\n printMessage(`Error importing first saml2 provider: ${error}`, 'error');\n }\n}\n\n/**\n * Import all SAML entity providers from file\n * @param {String} file Import file name\n */\nexport async function importSaml2ProvidersFromFile(file: string) {\n try {\n const data = fs.readFileSync(getFilePath(file), 'utf8');\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n await importSaml2Providers(fileData);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n } catch (error) {\n printMessage(`Error importing saml2 providers: ${error}`, 'error');\n }\n}\n\n/**\n * Import all SAML entity providers from all *.saml.json files in the current directory\n */\nexport async function importSaml2ProvidersFromFiles() {\n const names = fs.readdirSync(getWorkingDirectory());\n const jsonFiles = names\n .filter((name) => name.toLowerCase().endsWith('.saml.json'))\n .map((name) => getFilePath(name));\n const indicatorId = createProgressIndicator(\n 'determinate',\n jsonFiles.length,\n 'Importing providers...'\n );\n let total = 0;\n for (const file of jsonFiles) {\n try {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n const result = await importSaml2Providers(fileData);\n total += result.length;\n updateProgressIndicator(\n indicatorId,\n `Imported ${result.length} provider(s) from ${file}.`\n );\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n } catch (error) {\n printMessage(\n `Error importing providers from ${file}: ${error.message}`,\n 'error'\n );\n }\n }\n stopProgressIndicator(\n indicatorId,\n `Imported ${total} provider(s) from ${jsonFiles.length} file(s).`\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { frodo, state } from '@rockcarver/frodo-lib';
2
2
  import chokidar from 'chokidar';
3
3
  import fs from 'fs';
4
- import { createProgressBar, createProgressIndicator, createTable, debugMessage, failSpinner, printMessage, showSpinner, spinSpinner, stopProgressBar, stopProgressIndicator, succeedSpinner, updateProgressBar } from '../utils/Console';
5
- import { getTypedFilename, saveJsonToFile, saveTextToFile, titleCase } from '../utils/ExportImportUtils';
4
+ import { createProgressIndicator, createTable, debugMessage, failSpinner, printMessage, showSpinner, spinSpinner, stopProgressIndicator, succeedSpinner, updateProgressIndicator } from '../utils/Console';
5
+ import { getTypedFilename, isValidUrl, saveJsonToFile, saveTextToFile, titleCase } from '../utils/ExportImportUtils';
6
6
  import wordwrap from './utils/Wordwrap';
7
7
  const {
8
8
  readScripts,
@@ -174,70 +174,51 @@ export async function exportScriptsToFile(file) {
174
174
 
175
175
  /**
176
176
  * Export all scripts to individual files
177
+ * @param extract Extracts the scripts from the exports into separate files if true
177
178
  * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise
178
179
  */
179
- export async function exportScriptsToFiles() {
180
+ export async function exportScriptsToFiles(extract = false) {
180
181
  let outcome = true;
181
182
  debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);
182
183
  const scriptList = await readScripts();
183
- createProgressBar(scriptList.length, 'Exporting scripts to individual files...');
184
+ const barId = createProgressIndicator('determinate', scriptList.length, 'Exporting scripts to individual files...');
184
185
  for (const script of scriptList) {
186
+ const fileBarId = createProgressIndicator('determinate', 1, `Exporting script ${script.name}...`);
187
+ updateProgressIndicator(barId, `Reading script ${script.name}`);
188
+ const file = getFilePath(getTypedFilename(script.name, 'script'), true);
185
189
  try {
186
- updateProgressBar(`Reading script ${script.name}`);
187
- const fileName = getTypedFilename(script.name, 'script');
188
190
  const scriptExport = await exportScriptByName(script.name);
189
- saveJsonToFile(scriptExport, getFilePath(fileName, true));
191
+ if (extract) extractScriptToFile(scriptExport);
192
+ saveJsonToFile(scriptExport, file);
193
+ updateProgressIndicator(fileBarId, `Saving ${script.name} to ${file}.`);
194
+ stopProgressIndicator(fileBarId, `${script.name} saved to ${file}.`);
190
195
  } catch (error) {
191
196
  outcome = false;
197
+ updateProgressIndicator(barId, `Error exporting ${script.name}.`);
198
+ stopProgressIndicator(fileBarId, `Error saving ${script.name} to ${file}.`);
192
199
  printMessage(`Error exporting script '${script.name}': ${error.message}`, 'error');
193
200
  debugMessage(error);
194
201
  }
195
202
  }
196
- stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);
203
+ stopProgressIndicator(barId, `Exported ${scriptList.length} scripts to individual files.`);
197
204
  debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);
198
205
  return outcome;
199
206
  }
200
- export async function exportScriptsToFilesExtract() {
201
- let outcome = true;
202
- debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: start`);
203
- const scriptList = await readScripts();
204
- createProgressBar(scriptList.length, 'Exporting scripts to individual files...');
205
- for (const script of scriptList) {
206
- try {
207
- updateProgressBar(`Reading script ${script.name}`);
208
- const fileExtension = script.language === 'JAVASCRIPT' ? 'js' : 'groovy';
209
- const scriptFileName = getTypedFilename(script.name, 'script', fileExtension);
210
- const scriptFilePath = getFilePath(scriptFileName, true);
211
- const fileName = getTypedFilename(script.name, 'script');
212
- const filePath = getFilePath(fileName, true);
213
- const scriptExport = await exportScriptByName(script.name);
214
- const scriptSkeleton = getScriptSkeleton(scriptExport);
215
- const scriptText = Array.isArray(scriptSkeleton.script) ? scriptSkeleton.script.join('\n') : scriptSkeleton.script;
216
- scriptSkeleton.script = `file://${scriptFilePath}`;
217
- saveTextToFile(scriptText, scriptFilePath);
218
- saveJsonToFile(scriptExport, filePath);
219
- } catch (error) {
220
- outcome = false;
221
- printMessage(`Error exporting script '${script.name}': ${error.message}`, 'error');
222
- debugMessage(error);
223
- }
224
- }
225
- stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);
226
- debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: end [${outcome}]`);
227
- return outcome;
228
- }
229
207
 
230
208
  /**
231
- * Check if a string is a valid URL
232
- * @param {string} urlString input string to be evaluated
233
- * @returns {boolean} true if a valid URL, false otherwise
209
+ * Extracts a script from a script export into a separate file.
210
+ * @param scriptExport The script export
211
+ * @param scriptId The script id (optional if there is only one script in the export)
212
+ * @param directory The directory within the base directory to save the script file
234
213
  */
235
- function isValidUrl(urlString) {
236
- try {
237
- return Boolean(new URL(urlString));
238
- } catch (error) {
239
- return false;
240
- }
214
+ export function extractScriptToFile(scriptExport, scriptId, directory) {
215
+ const scriptSkeleton = scriptId ? scriptExport.script[scriptId] : getScriptSkeleton(scriptExport);
216
+ const fileExtension = scriptSkeleton.language === 'JAVASCRIPT' ? 'js' : 'groovy';
217
+ const scriptFileName = getTypedFilename(scriptSkeleton.name, 'script', fileExtension);
218
+ const scriptFilePath = getFilePath((directory ? `${directory}/` : '') + scriptFileName, true);
219
+ const scriptText = Array.isArray(scriptSkeleton.script) ? scriptSkeleton.script.join('\n') : scriptSkeleton.script;
220
+ scriptSkeleton.script = `file://${scriptFilePath}`;
221
+ saveTextToFile(scriptText, scriptFilePath);
241
222
  }
242
223
  function isScriptExtracted(importData) {
243
224
  debugMessage(`Cli.ScriptOps.isScriptExtracted: start`);
@@ -442,12 +423,12 @@ function getScriptId(script) {
442
423
  * @param {String} id script id
443
424
  */
444
425
  export async function deleteScriptId(id) {
445
- createProgressIndicator('indeterminate', undefined, `Deleting ${id}...`);
426
+ const spinnerId = createProgressIndicator('indeterminate', undefined, `Deleting ${id}...`);
446
427
  try {
447
428
  await deleteScript(id);
448
- stopProgressIndicator(`Deleted ${id}.`, 'success');
429
+ stopProgressIndicator(spinnerId, `Deleted ${id}.`, 'success');
449
430
  } catch (error) {
450
- stopProgressIndicator(`Error: ${error.message}`, 'fail');
431
+ stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');
451
432
  }
452
433
  }
453
434
 
@@ -456,12 +437,12 @@ export async function deleteScriptId(id) {
456
437
  * @param {String} name script name
457
438
  */
458
439
  export async function deleteScriptName(name) {
459
- createProgressIndicator('indeterminate', undefined, `Deleting ${name}...`);
440
+ const spinnerId = createProgressIndicator('indeterminate', undefined, `Deleting ${name}...`);
460
441
  try {
461
442
  await deleteScriptByName(name);
462
- stopProgressIndicator(`Deleted ${name}.`, 'success');
443
+ stopProgressIndicator(spinnerId, `Deleted ${name}.`, 'success');
463
444
  } catch (error) {
464
- stopProgressIndicator(`Error: ${error.message}`, 'fail');
445
+ stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');
465
446
  }
466
447
  }
467
448
 
@@ -469,12 +450,12 @@ export async function deleteScriptName(name) {
469
450
  * Delete all non-default scripts
470
451
  */
471
452
  export async function deleteAllScripts() {
472
- createProgressIndicator('indeterminate', undefined, `Deleting all non-default scripts...`);
453
+ const spinnerId = createProgressIndicator('indeterminate', undefined, `Deleting all non-default scripts...`);
473
454
  try {
474
455
  await deleteScripts();
475
- stopProgressIndicator(`Deleted all non-default scripts.`, 'success');
456
+ stopProgressIndicator(spinnerId, `Deleted all non-default scripts.`, 'success');
476
457
  } catch (error) {
477
- stopProgressIndicator(`Error: ${error.message}`, 'fail');
458
+ stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');
478
459
  }
479
460
  }
480
461
  //# sourceMappingURL=ScriptOps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ScriptOps.js","names":["frodo","state","chokidar","fs","createProgressBar","createProgressIndicator","createTable","debugMessage","failSpinner","printMessage","showSpinner","spinSpinner","stopProgressBar","stopProgressIndicator","succeedSpinner","updateProgressBar","getTypedFilename","saveJsonToFile","saveTextToFile","titleCase","wordwrap","readScripts","exportScript","exportScriptByName","exportScripts","importScripts","deleteScript","deleteScriptByName","deleteScripts","script","isBase64Encoded","getFilePath","getWorkingDirectory","utils","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","outcome","scripts","sort","a","b","localeCompare","table","forEach","push","toString","error","message","exportScriptToFile","scriptId","file","fileName","filePath","scriptExport","exportScriptByNameToFile","exportScriptsToFile","getRealm","exportScriptsToFiles","scriptList","length","exportScriptsToFilesExtract","fileExtension","scriptFileName","scriptFilePath","scriptSkeleton","getScriptSkeleton","scriptText","Array","isArray","isValidUrl","urlString","Boolean","URL","isScriptExtracted","importData","extracted","Object","keys","importScriptsFromFile","reUuid","readFile","err","data","JSON","parse","handleScriptFileImport","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","watcher","persistent","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","imported","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","readFileSync","startsWith","scriptExportRaw","getScriptId","scriptIds","Error","deleteScriptId","id","undefined","deleteScriptName","deleteAllScripts"],"sources":["../../src/ops/ScriptOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi';\nimport { type ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\n\nimport {\n createProgressBar,\n createProgressIndicator,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressBar,\n stopProgressIndicator,\n succeedSpinner,\n updateProgressBar,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n readScripts,\n exportScript,\n exportScriptByName,\n exportScripts,\n importScripts,\n deleteScript,\n deleteScriptByName,\n deleteScripts,\n} = frodo.script;\n\nconst { isBase64Encoded, getFilePath, getWorkingDirectory } = frodo.utils;\n\n/**\n * Get a one-line description of the script object\n * @param {ScriptSkeleton} scriptObj script object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(scriptObj: ScriptSkeleton): string {\n const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Name | Language | Type | Id |\\n';\n markdown += '| ---- | -------- | ---- | ---|';\n return markdown;\n}\n\n/**\n * Get a one-line description of the script object in markdown\n * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe\n * @returns {string} markdown table row\n */\nexport function getTableRowMd(scriptObj: ScriptSkeleton): string {\n const langMap = { JAVASCRIPT: 'JavaSscript', GROOVY: 'Groovy' };\n const description = `| ${scriptObj.name} | ${\n langMap[scriptObj.language]\n } | ${titleCase(scriptObj.context.split('_').join(' '))} | \\`${\n scriptObj._id\n }\\` |`;\n return description;\n}\n\n/**\n * List scripts\n * @param {boolean} long detail list\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function listScripts(long = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n const scripts = await readScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n if (long) {\n const table = createTable([\n 'Name',\n 'UUID',\n 'Language',\n 'Context',\n 'Description',\n ]);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n table.push([\n wordwrap(script.name, 25, ' '),\n script._id,\n langMap[script.language],\n wordwrap(titleCase(script.context.split('_').join(' ')), 25),\n wordwrap(script.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n }\n } catch (error) {\n outcome = false;\n printMessage(`Error listing scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptToFile: start`);\n try {\n showSpinner(`Exporting script '${scriptId}'...`);\n let fileName = getTypedFilename(scriptId, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${scriptId}' to '${filePath}'...`);\n const scriptExport = await exportScript(scriptId);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${scriptId}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [false]`);\n return false;\n}\n\n/**\n * Export script by name to file\n * @param {string} name script name\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);\n try {\n showSpinner(`Exporting script '${name}'...`);\n let fileName = getTypedFilename(name, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${name}' to '${filePath}'...`);\n const scriptExport = await exportScriptByName(name);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${name}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: start`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Scripts`,\n 'script'\n );\n if (file) {\n fileName = file;\n }\n const scriptExport = await exportScripts();\n saveJsonToFile(scriptExport, getFilePath(fileName, true));\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);\n return true;\n } catch (error) {\n printMessage(`Error exporting scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFiles(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const scriptList = await readScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileName = getTypedFilename(script.name, 'script');\n const scriptExport = await exportScriptByName(script.name);\n saveJsonToFile(scriptExport, getFilePath(fileName, true));\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);\n return outcome;\n}\n\nexport async function exportScriptsToFilesExtract(): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: start`);\n const scriptList = await readScripts();\n createProgressBar(\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n try {\n updateProgressBar(`Reading script ${script.name}`);\n const fileExtension = script.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n script.name,\n 'script',\n fileExtension\n );\n const scriptFilePath = getFilePath(scriptFileName, true);\n const fileName = getTypedFilename(script.name, 'script');\n const filePath = getFilePath(fileName, true);\n\n const scriptExport = await exportScriptByName(script.name);\n\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n\n scriptSkeleton.script = `file://${scriptFilePath}`;\n\n saveTextToFile(scriptText, scriptFilePath);\n saveJsonToFile(scriptExport, filePath);\n } catch (error) {\n outcome = false;\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressBar(`Exported ${scriptList.length} scripts to individual files.`);\n debugMessage(`Cli.ScriptOps.exportScriptsToFilesExtract: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Check if a string is a valid URL\n * @param {string} urlString input string to be evaluated\n * @returns {boolean} true if a valid URL, false otherwise\n */\nfunction isValidUrl(urlString: string): boolean {\n try {\n return Boolean(new URL(urlString));\n } catch (error) {\n return false;\n }\n}\n\nfunction isScriptExtracted(importData: ScriptExportInterface): boolean {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: start`);\n let extracted = true;\n for (const scriptId of Object.keys(importData.script)) {\n const script = importData.script[scriptId].script;\n if (Array.isArray(script)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is string array`);\n extracted = false;\n break;\n }\n if (isValidUrl(script as string)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is extracted`);\n extracted = true;\n break;\n }\n if (isBase64Encoded) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is base64-encoded`);\n extracted = false;\n break;\n }\n break;\n }\n debugMessage(`Cli.ScriptOps.isScriptExtracted: end [extracted=${extracted}]`);\n return extracted;\n}\n\n/**\n * Import script(s) from file\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {string} file file name\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScriptsFromFile(\n name: string,\n file: string,\n reUuid = false\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n fs.readFile(filePath, 'utf8', async (err, data) => {\n try {\n if (err) throw err;\n const importData: ScriptExportInterface = JSON.parse(data);\n if (isScriptExtracted(importData)) {\n await handleScriptFileImport(filePath, reUuid, false);\n } else {\n await importScripts(name, importData, reUuid);\n }\n outcome = true;\n } catch (error) {\n printMessage(\n `Error exporting script '${name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n });\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param watch whether or not to watch for file changes\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n reUuid: boolean,\n validateScripts: boolean\n) {\n // If watch is true, it doesn't make sense to reUuid.\n reUuid = watch ? false : reUuid;\n\n /**\n * Run on file change detection, as well as on initial run.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async function onChange(path: string, _stats?: fs.Stats): Promise<void> {\n try {\n await handleScriptFileImport(path, reUuid, validateScripts);\n } catch (error) {\n printMessage(`${path}: ${error.message}`, 'error');\n }\n }\n\n // We watch json files and script files.\n const watcher = chokidar.watch(\n [\n `${getWorkingDirectory()}/**/*.script.json`,\n `${getWorkingDirectory()}/**/*.script.js`,\n `${getWorkingDirectory()}/**/*.script.groovy`,\n ],\n {\n persistent: watch,\n }\n );\n\n watcher\n .on('add', onChange)\n .on('change', onChange)\n .on('error', (error) => {\n printMessage(`Watcher error: ${error}`, 'error');\n watcher.close();\n })\n .on('ready', () => {\n if (watch) {\n printMessage('Watching for changes...');\n } else {\n watcher.close();\n printMessage('Done.');\n }\n });\n}\n\n/**\n * Handle a script file import.\n *\n * @param file Either a script file or an extract file\n * @param reUuid whether or not to generate a new uuid for each script on import\n */\nasync function handleScriptFileImport(\n file: string,\n reUuid: boolean,\n validateScripts: boolean\n) {\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: start`);\n const scriptFile = getScriptFile(file);\n const script = getScriptExportByScriptFile(scriptFile);\n\n const imported = await importScripts('', script, reUuid, validateScripts);\n if (imported) {\n printMessage(`Imported '${scriptFile}'`);\n }\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: end`);\n}\n\n/**\n * Get a script file from a file.\n *\n * @param file Either a script file or an extract file\n * @returns The script file\n */\nfunction getScriptFile(file: string) {\n if (file.endsWith('.script.json')) {\n return file;\n }\n return file.replace(/\\.script\\.(js|groovy)/, '.script.json');\n}\n\n/**\n * Get a script export from a script file.\n *\n * @param scriptFile The path to the script file\n * @returns The script export\n */\nfunction getScriptExportByScriptFile(\n scriptFile: string\n): ScriptExportInterface {\n const scriptExport = getScriptExport(scriptFile);\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const extractFile = getExtractFile(scriptSkeleton);\n if (!extractFile) {\n return scriptExport;\n }\n\n const scriptRaw = fs.readFileSync(extractFile, 'utf8');\n scriptSkeleton.script = scriptRaw.split('\\n');\n\n return scriptExport;\n}\n\n/**\n * Get an extract file from a script skeleton.\n *\n * @param scriptSkeleton The script skeleton\n * @returns The extract file or null if there is no extract file\n */\nfunction getExtractFile(scriptSkeleton: ScriptSkeleton): string | null {\n const extractFile = scriptSkeleton.script;\n if (Array.isArray(extractFile)) {\n return null;\n }\n if (\n extractFile.startsWith('file://') &&\n (extractFile.endsWith('.js') || extractFile.endsWith('.groovy'))\n ) {\n return extractFile.replace('file://', '');\n }\n return null;\n}\n\n/**\n * Get a script export from a file.\n *\n * @param file The path to a script export file\n * @returns The script export\n */\nfunction getScriptExport(file: string): ScriptExportInterface {\n const scriptExportRaw = fs.readFileSync(file, 'utf8');\n const scriptExport = JSON.parse(scriptExportRaw) as ScriptExportInterface;\n\n return scriptExport;\n}\n\n/**\n * Get the main script skeleton from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script Get the main script skeleton from a script export\n * @returns The main script skeleton\n */\nfunction getScriptSkeleton(script: ScriptExportInterface): ScriptSkeleton {\n const scriptId = getScriptId(script);\n return script.script[scriptId];\n}\n\n/**\n * Get the main script ID from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script The script export\n * @returns The main script ID\n */\nfunction getScriptId(script: ScriptExportInterface): string {\n const scriptIds = Object.keys(script.script);\n if (scriptIds.length !== 1) {\n throw new Error(`Expected 1 script, found ${scriptIds.length}`);\n }\n return scriptIds[0];\n}\n\n/**\n * Delete script by id\n * @param {String} id script id\n */\nexport async function deleteScriptId(id) {\n createProgressIndicator('indeterminate', undefined, `Deleting ${id}...`);\n try {\n await deleteScript(id);\n stopProgressIndicator(`Deleted ${id}.`, 'success');\n } catch (error) {\n stopProgressIndicator(`Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete script by name\n * @param {String} name script name\n */\nexport async function deleteScriptName(name) {\n createProgressIndicator('indeterminate', undefined, `Deleting ${name}...`);\n try {\n await deleteScriptByName(name);\n stopProgressIndicator(`Deleted ${name}.`, 'success');\n } catch (error) {\n stopProgressIndicator(`Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all non-default scripts\n */\nexport async function deleteAllScripts() {\n createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all non-default scripts...`\n );\n try {\n await deleteScripts();\n stopProgressIndicator(`Deleted all non-default scripts.`, 'success');\n } catch (error) {\n stopProgressIndicator(`Error: ${error.message}`, 'fail');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScriptOps.js","names":["frodo","state","chokidar","fs","createProgressIndicator","createTable","debugMessage","failSpinner","printMessage","showSpinner","spinSpinner","stopProgressIndicator","succeedSpinner","updateProgressIndicator","getTypedFilename","isValidUrl","saveJsonToFile","saveTextToFile","titleCase","wordwrap","readScripts","exportScript","exportScriptByName","exportScripts","importScripts","deleteScript","deleteScriptByName","deleteScripts","script","isBase64Encoded","getFilePath","getWorkingDirectory","utils","getOneLineDescription","scriptObj","description","_id","context","name","getTableHeaderMd","markdown","getTableRowMd","langMap","JAVASCRIPT","GROOVY","language","split","join","listScripts","long","outcome","scripts","sort","a","b","localeCompare","table","forEach","push","toString","error","message","exportScriptToFile","scriptId","file","fileName","filePath","scriptExport","exportScriptByNameToFile","exportScriptsToFile","getRealm","exportScriptsToFiles","extract","scriptList","barId","length","fileBarId","extractScriptToFile","directory","scriptSkeleton","getScriptSkeleton","fileExtension","scriptFileName","scriptFilePath","scriptText","Array","isArray","isScriptExtracted","importData","extracted","Object","keys","importScriptsFromFile","reUuid","readFile","err","data","JSON","parse","handleScriptFileImport","importScriptsFromFiles","watch","validateScripts","onChange","path","_stats","watcher","persistent","on","close","scriptFile","getScriptFile","getScriptExportByScriptFile","imported","endsWith","replace","getScriptExport","extractFile","getExtractFile","scriptRaw","readFileSync","startsWith","scriptExportRaw","getScriptId","scriptIds","Error","deleteScriptId","id","spinnerId","undefined","deleteScriptName","deleteAllScripts"],"sources":["../../src/ops/ScriptOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { type ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi';\nimport { type ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport chokidar from 'chokidar';\nimport fs from 'fs';\n\nimport {\n createProgressIndicator,\n createTable,\n debugMessage,\n failSpinner,\n printMessage,\n showSpinner,\n spinSpinner,\n stopProgressIndicator,\n succeedSpinner,\n updateProgressIndicator,\n} from '../utils/Console';\nimport {\n getTypedFilename,\n isValidUrl,\n saveJsonToFile,\n saveTextToFile,\n titleCase,\n} from '../utils/ExportImportUtils';\nimport wordwrap from './utils/Wordwrap';\n\nconst {\n readScripts,\n exportScript,\n exportScriptByName,\n exportScripts,\n importScripts,\n deleteScript,\n deleteScriptByName,\n deleteScripts,\n} = frodo.script;\n\nconst { isBase64Encoded, getFilePath, getWorkingDirectory } = frodo.utils;\n\n/**\n * Get a one-line description of the script object\n * @param {ScriptSkeleton} scriptObj script object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(scriptObj: ScriptSkeleton): string {\n const description = `[${scriptObj._id['brightCyan']}] ${scriptObj.context} - ${scriptObj.name}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Name | Language | Type | Id |\\n';\n markdown += '| ---- | -------- | ---- | ---|';\n return markdown;\n}\n\n/**\n * Get a one-line description of the script object in markdown\n * @param {TypesRaw.ScriptSkeleton} scriptObj script object to describe\n * @returns {string} markdown table row\n */\nexport function getTableRowMd(scriptObj: ScriptSkeleton): string {\n const langMap = { JAVASCRIPT: 'JavaSscript', GROOVY: 'Groovy' };\n const description = `| ${scriptObj.name} | ${\n langMap[scriptObj.language]\n } | ${titleCase(scriptObj.context.split('_').join(' '))} | \\`${\n scriptObj._id\n }\\` |`;\n return description;\n}\n\n/**\n * List scripts\n * @param {boolean} long detail list\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function listScripts(long = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.listScripts: start`);\n try {\n const scripts = await readScripts();\n scripts.sort((a, b) => a.name.localeCompare(b.name));\n if (long) {\n const table = createTable([\n 'Name',\n 'UUID',\n 'Language',\n 'Context',\n 'Description',\n ]);\n const langMap = { JAVASCRIPT: 'JS', GROOVY: 'Groovy' };\n scripts.forEach((script) => {\n table.push([\n wordwrap(script.name, 25, ' '),\n script._id,\n langMap[script.language],\n wordwrap(titleCase(script.context.split('_').join(' ')), 25),\n wordwrap(script.description, 30),\n ]);\n });\n printMessage(table.toString(), 'data');\n } else {\n scripts.forEach((script) => {\n printMessage(`${script.name}`, 'data');\n });\n }\n } catch (error) {\n outcome = false;\n printMessage(`Error listing scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Export script by id to file\n * @param {string} scriptId script uuid\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptToFile(\n scriptId: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptToFile: start`);\n try {\n showSpinner(`Exporting script '${scriptId}'...`);\n let fileName = getTypedFilename(scriptId, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${scriptId}' to '${filePath}'...`);\n const scriptExport = await exportScript(scriptId);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${scriptId}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${scriptId}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptToFile: end [false]`);\n return false;\n}\n\n/**\n * Export script by name to file\n * @param {string} name script name\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptByNameToFile(\n name: string,\n file: string\n): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: start`);\n try {\n showSpinner(`Exporting script '${name}'...`);\n let fileName = getTypedFilename(name, 'script');\n if (file) {\n fileName = file;\n }\n const filePath = getFilePath(fileName, true);\n spinSpinner(`Exporting script '${name}' to '${filePath}'...`);\n const scriptExport = await exportScriptByName(name);\n saveJsonToFile(scriptExport, filePath);\n succeedSpinner(`Exported script '${name}' to '${filePath}'.`);\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [true]`);\n return true;\n } catch (error) {\n failSpinner(`Error exporting script '${name}': ${error.message}`);\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptByNameToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to single file\n * @param {string} file file name\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFile(file: string): Promise<boolean> {\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: start`);\n try {\n let fileName = getTypedFilename(\n `all${titleCase(state.getRealm())}Scripts`,\n 'script'\n );\n if (file) {\n fileName = file;\n }\n const scriptExport = await exportScripts();\n saveJsonToFile(scriptExport, getFilePath(fileName, true));\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [true]`);\n return true;\n } catch (error) {\n printMessage(`Error exporting scripts: ${error.message}`, 'error');\n debugMessage(error);\n }\n debugMessage(`Cli.ScriptOps.exportScriptsToFile: end [false]`);\n return false;\n}\n\n/**\n * Export all scripts to individual files\n * @param extract Extracts the scripts from the exports into separate files if true\n * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise\n */\nexport async function exportScriptsToFiles(extract = false): Promise<boolean> {\n let outcome = true;\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: start`);\n const scriptList = await readScripts();\n const barId = createProgressIndicator(\n 'determinate',\n scriptList.length,\n 'Exporting scripts to individual files...'\n );\n for (const script of scriptList) {\n const fileBarId = createProgressIndicator(\n 'determinate',\n 1,\n `Exporting script ${script.name}...`\n );\n updateProgressIndicator(barId, `Reading script ${script.name}`);\n const file = getFilePath(getTypedFilename(script.name, 'script'), true);\n try {\n const scriptExport = await exportScriptByName(script.name);\n if (extract) extractScriptToFile(scriptExport);\n saveJsonToFile(scriptExport, file);\n updateProgressIndicator(fileBarId, `Saving ${script.name} to ${file}.`);\n stopProgressIndicator(fileBarId, `${script.name} saved to ${file}.`);\n } catch (error) {\n outcome = false;\n updateProgressIndicator(barId, `Error exporting ${script.name}.`);\n stopProgressIndicator(\n fileBarId,\n `Error saving ${script.name} to ${file}.`\n );\n printMessage(\n `Error exporting script '${script.name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n }\n stopProgressIndicator(\n barId,\n `Exported ${scriptList.length} scripts to individual files.`\n );\n debugMessage(`Cli.ScriptOps.exportScriptsToFiles: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Extracts a script from a script export into a separate file.\n * @param scriptExport The script export\n * @param scriptId The script id (optional if there is only one script in the export)\n * @param directory The directory within the base directory to save the script file\n */\nexport function extractScriptToFile(\n scriptExport: ScriptExportInterface,\n scriptId?: string,\n directory?: string\n) {\n const scriptSkeleton = scriptId\n ? scriptExport.script[scriptId]\n : getScriptSkeleton(scriptExport);\n const fileExtension =\n scriptSkeleton.language === 'JAVASCRIPT' ? 'js' : 'groovy';\n const scriptFileName = getTypedFilename(\n scriptSkeleton.name,\n 'script',\n fileExtension\n );\n const scriptFilePath = getFilePath(\n (directory ? `${directory}/` : '') + scriptFileName,\n true\n );\n const scriptText = Array.isArray(scriptSkeleton.script)\n ? scriptSkeleton.script.join('\\n')\n : scriptSkeleton.script;\n scriptSkeleton.script = `file://${scriptFilePath}`;\n saveTextToFile(scriptText, scriptFilePath);\n}\n\nfunction isScriptExtracted(importData: ScriptExportInterface): boolean {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: start`);\n let extracted = true;\n for (const scriptId of Object.keys(importData.script)) {\n const script = importData.script[scriptId].script;\n if (Array.isArray(script)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is string array`);\n extracted = false;\n break;\n }\n if (isValidUrl(script as string)) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is extracted`);\n extracted = true;\n break;\n }\n if (isBase64Encoded) {\n debugMessage(`Cli.ScriptOps.isScriptExtracted: script is base64-encoded`);\n extracted = false;\n break;\n }\n break;\n }\n debugMessage(`Cli.ScriptOps.isScriptExtracted: end [extracted=${extracted}]`);\n return extracted;\n}\n\n/**\n * Import script(s) from file\n * @param {string} name Optional name of script. If supplied, only the script of that name is imported\n * @param {string} file file name\n * @param {boolean} reUuid true to generate a new uuid for each script on import, false otherwise\n * @returns {Promise<boolean>} true if no errors occurred during import, false otherwise\n */\nexport async function importScriptsFromFile(\n name: string,\n file: string,\n reUuid = false\n): Promise<boolean> {\n let outcome = false;\n const filePath = getFilePath(file);\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: start`);\n fs.readFile(filePath, 'utf8', async (err, data) => {\n try {\n if (err) throw err;\n const importData: ScriptExportInterface = JSON.parse(data);\n if (isScriptExtracted(importData)) {\n await handleScriptFileImport(filePath, reUuid, false);\n } else {\n await importScripts(name, importData, reUuid);\n }\n outcome = true;\n } catch (error) {\n printMessage(\n `Error exporting script '${name}': ${error.message}`,\n 'error'\n );\n debugMessage(error);\n }\n });\n debugMessage(`Cli.ScriptOps.importScriptsFromFile: end [${outcome}]`);\n return outcome;\n}\n\n/**\n * Import extracted scripts.\n *\n * @param watch whether or not to watch for file changes\n */\nexport async function importScriptsFromFiles(\n watch: boolean,\n reUuid: boolean,\n validateScripts: boolean\n) {\n // If watch is true, it doesn't make sense to reUuid.\n reUuid = watch ? false : reUuid;\n\n /**\n * Run on file change detection, as well as on initial run.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async function onChange(path: string, _stats?: fs.Stats): Promise<void> {\n try {\n await handleScriptFileImport(path, reUuid, validateScripts);\n } catch (error) {\n printMessage(`${path}: ${error.message}`, 'error');\n }\n }\n\n // We watch json files and script files.\n const watcher = chokidar.watch(\n [\n `${getWorkingDirectory()}/**/*.script.json`,\n `${getWorkingDirectory()}/**/*.script.js`,\n `${getWorkingDirectory()}/**/*.script.groovy`,\n ],\n {\n persistent: watch,\n }\n );\n\n watcher\n .on('add', onChange)\n .on('change', onChange)\n .on('error', (error) => {\n printMessage(`Watcher error: ${error}`, 'error');\n watcher.close();\n })\n .on('ready', () => {\n if (watch) {\n printMessage('Watching for changes...');\n } else {\n watcher.close();\n printMessage('Done.');\n }\n });\n}\n\n/**\n * Handle a script file import.\n *\n * @param file Either a script file or an extract file\n * @param reUuid whether or not to generate a new uuid for each script on import\n */\nasync function handleScriptFileImport(\n file: string,\n reUuid: boolean,\n validateScripts: boolean\n) {\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: start`);\n const scriptFile = getScriptFile(file);\n const script = getScriptExportByScriptFile(scriptFile);\n\n const imported = await importScripts('', script, reUuid, validateScripts);\n if (imported) {\n printMessage(`Imported '${scriptFile}'`);\n }\n debugMessage(`Cli.ScriptOps.handleScriptFileImport: end`);\n}\n\n/**\n * Get a script file from a file.\n *\n * @param file Either a script file or an extract file\n * @returns The script file\n */\nfunction getScriptFile(file: string) {\n if (file.endsWith('.script.json')) {\n return file;\n }\n return file.replace(/\\.script\\.(js|groovy)/, '.script.json');\n}\n\n/**\n * Get a script export from a script file.\n *\n * @param scriptFile The path to the script file\n * @returns The script export\n */\nfunction getScriptExportByScriptFile(\n scriptFile: string\n): ScriptExportInterface {\n const scriptExport = getScriptExport(scriptFile);\n const scriptSkeleton = getScriptSkeleton(scriptExport);\n\n const extractFile = getExtractFile(scriptSkeleton);\n if (!extractFile) {\n return scriptExport;\n }\n\n const scriptRaw = fs.readFileSync(extractFile, 'utf8');\n scriptSkeleton.script = scriptRaw.split('\\n');\n\n return scriptExport;\n}\n\n/**\n * Get an extract file from a script skeleton.\n *\n * @param scriptSkeleton The script skeleton\n * @returns The extract file or null if there is no extract file\n */\nfunction getExtractFile(scriptSkeleton: ScriptSkeleton): string | null {\n const extractFile = scriptSkeleton.script;\n if (Array.isArray(extractFile)) {\n return null;\n }\n if (\n extractFile.startsWith('file://') &&\n (extractFile.endsWith('.js') || extractFile.endsWith('.groovy'))\n ) {\n return extractFile.replace('file://', '');\n }\n return null;\n}\n\n/**\n * Get a script export from a file.\n *\n * @param file The path to a script export file\n * @returns The script export\n */\nfunction getScriptExport(file: string): ScriptExportInterface {\n const scriptExportRaw = fs.readFileSync(file, 'utf8');\n const scriptExport = JSON.parse(scriptExportRaw) as ScriptExportInterface;\n\n return scriptExport;\n}\n\n/**\n * Get the main script skeleton from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script Get the main script skeleton from a script export\n * @returns The main script skeleton\n */\nfunction getScriptSkeleton(script: ScriptExportInterface): ScriptSkeleton {\n const scriptId = getScriptId(script);\n return script.script[scriptId];\n}\n\n/**\n * Get the main script ID from a script export. If there is more than one\n * script, an error is thrown.\n *\n * @param script The script export\n * @returns The main script ID\n */\nfunction getScriptId(script: ScriptExportInterface): string {\n const scriptIds = Object.keys(script.script);\n if (scriptIds.length !== 1) {\n throw new Error(`Expected 1 script, found ${scriptIds.length}`);\n }\n return scriptIds[0];\n}\n\n/**\n * Delete script by id\n * @param {String} id script id\n */\nexport async function deleteScriptId(id) {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${id}...`\n );\n try {\n await deleteScript(id);\n stopProgressIndicator(spinnerId, `Deleted ${id}.`, 'success');\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete script by name\n * @param {String} name script name\n */\nexport async function deleteScriptName(name) {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting ${name}...`\n );\n try {\n await deleteScriptByName(name);\n stopProgressIndicator(spinnerId, `Deleted ${name}.`, 'success');\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n\n/**\n * Delete all non-default scripts\n */\nexport async function deleteAllScripts() {\n const spinnerId = createProgressIndicator(\n 'indeterminate',\n undefined,\n `Deleting all non-default scripts...`\n );\n try {\n await deleteScripts();\n stopProgressIndicator(\n spinnerId,\n `Deleted all non-default scripts.`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(spinnerId, `Error: ${error.message}`, 'fail');\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { frodo, state } from '@rockcarver/frodo-lib';
2
- import { createKeyValueTable, createProgressBar, createTable, debugMessage, failSpinner, printMessage, showSpinner, stopProgressBar, succeedSpinner, updateProgressBar } from '../utils/Console';
2
+ import { createKeyValueTable, createProgressIndicator, createTable, debugMessage, failSpinner, printMessage, showSpinner, stopProgressIndicator, succeedSpinner, updateProgressIndicator } from '../utils/Console';
3
3
  import { getTypedFilename, saveJsonToFile, saveToFile, titleCase } from '../utils/ExportImportUtils';
4
4
  import wordwrap from './utils/Wordwrap';
5
5
  const {
@@ -112,18 +112,19 @@ export async function deleteSecret(secretId) {
112
112
  * Delete all secrets
113
113
  */
114
114
  export async function deleteSecrets() {
115
+ let indicatorId;
115
116
  try {
116
117
  const secrets = await readSecrets();
117
- createProgressBar(secrets.length, `Deleting secrets...`);
118
+ indicatorId = createProgressIndicator('determinate', secrets.length, `Deleting secrets...`);
118
119
  for (const secret of secrets) {
119
120
  try {
120
121
  await _deleteSecret(secret._id);
121
- updateProgressBar(`Deleted secret ${secret._id}`);
122
+ updateProgressIndicator(indicatorId, `Deleted secret ${secret._id}`);
122
123
  } catch (error) {
123
124
  printMessage(`Error: ${error.response.data.code} - ${error.response.data.message}`, 'error');
124
125
  }
125
126
  }
126
- stopProgressBar(`Secrets deleted.`);
127
+ stopProgressIndicator(indicatorId, `Secrets deleted.`);
127
128
  } catch (error) {
128
129
  printMessage(`Error: ${error.response.data.code} - ${error.response.data.message}`, 'error');
129
130
  }
@@ -194,16 +195,17 @@ export async function exportSecretToFile(secretId, file) {
194
195
  fileName = getTypedFilename(secretId, 'secret');
195
196
  }
196
197
  const filePath = getFilePath(fileName, true);
198
+ let indicatorId;
197
199
  try {
198
- createProgressBar(1, `Exporting secret ${secretId}`);
200
+ indicatorId = createProgressIndicator('determinate', 1, `Exporting secret ${secretId}`);
199
201
  const fileData = await exportSecret(secretId);
200
202
  saveJsonToFile(fileData, filePath);
201
- updateProgressBar(`Exported secret ${secretId}`);
202
- stopProgressBar(
203
+ updateProgressIndicator(indicatorId, `Exported secret ${secretId}`);
204
+ stopProgressIndicator(indicatorId,
203
205
  // @ts-expect-error - brightCyan colors the string, even though it is not a property of string
204
206
  `Exported ${secretId.brightCyan} to ${filePath.brightCyan}.`);
205
207
  } catch (err) {
206
- stopProgressBar(`${err}`);
208
+ stopProgressIndicator(indicatorId, `${err}`);
207
209
  printMessage(err, 'error');
208
210
  }
209
211
  debugMessage(`Cli.SecretsOps.exportSecretToFile: end [secretId=${secretId}, file=${file}]`);
@@ -235,13 +237,13 @@ export async function exportSecretsToFile(file) {
235
237
  */
236
238
  export async function exportSecretsToFiles() {
237
239
  const allSecretsData = await readSecrets();
238
- createProgressBar(allSecretsData.length, 'Exporting secrets');
240
+ const indicatorId = createProgressIndicator('determinate', allSecretsData.length, 'Exporting secrets');
239
241
  for (const secret of allSecretsData) {
240
- updateProgressBar(`Writing secret ${secret._id}`);
242
+ updateProgressIndicator(indicatorId, `Writing secret ${secret._id}`);
241
243
  const fileName = getTypedFilename(secret._id, 'secret');
242
244
  saveToFile('secret', secret, '_id', getFilePath(fileName, true));
243
245
  }
244
- stopProgressBar(`${allSecretsData.length} secrets exported.`);
246
+ stopProgressIndicator(indicatorId, `${allSecretsData.length} secrets exported.`);
245
247
  }
246
248
 
247
249
  /**