@rockcarver/frodo-cli 2.0.0-36 → 2.0.0-38

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 (39) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/esm/app.js +2 -0
  3. package/esm/app.js.map +1 -1
  4. package/esm/cli/admin/admin.js +0 -1
  5. package/esm/cli/admin/admin.js.map +1 -1
  6. package/esm/cli/config/config-delete.js +22 -0
  7. package/esm/cli/config/config-delete.js.map +1 -0
  8. package/esm/cli/config/config-describe.js +22 -0
  9. package/esm/cli/config/config-describe.js.map +1 -0
  10. package/esm/cli/{admin/admin-export-full-cloud-config.js → config/config-export.js} +3 -3
  11. package/esm/cli/config/config-export.js.map +1 -0
  12. package/esm/cli/config/config-import.js +22 -0
  13. package/esm/cli/config/config-import.js.map +1 -0
  14. package/esm/cli/config/config-list.js +22 -0
  15. package/esm/cli/config/config-list.js.map +1 -0
  16. package/esm/cli/config/config.js +20 -0
  17. package/esm/cli/config/config.js.map +1 -0
  18. package/esm/cli/esv/esv-secret-list.js +2 -2
  19. package/esm/cli/esv/esv-secret-list.js.map +1 -1
  20. package/esm/cli/esv/esv-variable-list.js +2 -2
  21. package/esm/cli/esv/esv-variable-list.js.map +1 -1
  22. package/esm/cli/script/script-list.js +2 -2
  23. package/esm/cli/script/script-list.js.map +1 -1
  24. package/esm/ops/AdminOps.js +1 -103
  25. package/esm/ops/AdminOps.js.map +1 -1
  26. package/esm/ops/ConfigOps.js +128 -0
  27. package/esm/ops/ConfigOps.js.map +1 -0
  28. package/esm/ops/IdmOps.js +6 -3
  29. package/esm/ops/IdmOps.js.map +1 -1
  30. package/esm/ops/ScriptOps.js +51 -22
  31. package/esm/ops/ScriptOps.js.map +1 -1
  32. package/esm/ops/SecretsOps.js +62 -40
  33. package/esm/ops/SecretsOps.js.map +1 -1
  34. package/esm/ops/VariablesOps.js +35 -15
  35. package/esm/ops/VariablesOps.js.map +1 -1
  36. package/esm/utils/Config.js +147 -1
  37. package/esm/utils/Config.js.map +1 -1
  38. package/package.json +2 -2
  39. package/esm/cli/admin/admin-export-full-cloud-config.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AdminOps.js","names":["frodo","state","fs","cleanupProgressIndicators","createKeyValueTable","createProgressIndicator","printMessage","stopProgressIndicator","updateProgressIndicator","extractScriptToFile","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","exportFullConfiguration","generateRfc7523AuthZGrantArtefacts","_generateRfc7523AuthZGrantArtefacts","executeRfc7523AuthZGrantFlow","_executeRfc7523AuthZGrantFlow","admin","stringify","json","readOAuth2TrustedJwtIssuer","oauth2oidc","issuer","getJwkFilePath","clientId","getJwksFilePath","iss","jwk","sub","scope","options","artefacts","barId","save","jwkFile","jwksFile","jwkBarId","jwksBarId","jwks","_artefacts$issuer$all","_artefacts$issuer$all2","getRealm","client","push","coreOAuth2ClientConfig","scopes","value","join","clientType","advancedOAuth2ClientConfig","grantTypes","isConsentImplied","tokenEndpointAuthMethod","signEncOAuth2ClientConfig","publicKeyLocation","toString","_id","allowedSubjects","length","error","tokenResponse","spinnerId","issSpinnerId","message","jwkSpinnerId","JSON","parse","readFileSync","subSpinnerId","_error$response","response","data","access_token","id_token","exportEverythingToFile","file","useStringArrays","noDecode","exportData","fileName","exportEverythingToFiles","extract","meta","baseDirectory","Object","entries","forEach","type","obj","existsSync","mkdirSync","samlData","saml","cot","hosted","metadata","remote","id","concat","filename","entityId","samlType","authentication","name","includes","slice","lastIndexOf","recursive"],"sources":["../../src/ops/AdminOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { Writable } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport { OAuth2ClientSkeleton } from '@rockcarver/frodo-lib/types/api/OAuth2ClientApi';\nimport { AccessTokenResponseType } from '@rockcarver/frodo-lib/types/api/OAuth2OIDCApi';\nimport { OAuth2TrustedJwtIssuerSkeleton } from '@rockcarver/frodo-lib/types/api/OAuth2TrustedJwtIssuerApi';\nimport {\n FullExportInterface,\n FullExportOptions,\n} from '@rockcarver/frodo-lib/types/ops/AdminOps';\nimport { JwkRsa, JwksInterface } from '@rockcarver/frodo-lib/types/ops/JoseOps';\nimport { ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport fs from 'fs';\n\nimport {\n cleanupProgressIndicators,\n createKeyValueTable,\n createProgressIndicator,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\nimport { extractScriptToFile } from './ScriptOps';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst {\n exportFullConfiguration,\n generateRfc7523AuthZGrantArtefacts: _generateRfc7523AuthZGrantArtefacts,\n executeRfc7523AuthZGrantFlow: _executeRfc7523AuthZGrantFlow,\n} = frodo.admin;\nconst { stringify } = frodo.utils.json;\nconst { readOAuth2TrustedJwtIssuer } = frodo.oauth2oidc.issuer;\n\nfunction getJwkFilePath(clientId: string): string {\n return getFilePath(getTypedFilename(clientId + '_private', 'jwk'), true);\n}\n\nfunction getJwksFilePath(clientId: string): string {\n return getFilePath(getTypedFilename(clientId + '_public', 'jwks'), true);\n}\n\nexport async function generateRfc7523AuthZGrantArtefacts(\n clientId: string,\n iss: string,\n jwk?: JwkRsa,\n sub?: string,\n scope?: string[],\n options?: { save: boolean },\n json?: boolean\n): Promise<boolean> {\n let artefacts: {\n jwk: JwkRsa;\n jwks: JwksInterface;\n client: OAuth2ClientSkeleton;\n issuer: OAuth2TrustedJwtIssuerSkeleton;\n };\n try {\n const barId = createProgressIndicator(\n 'determinate',\n options.save ? 3 : 1,\n 'Generating artefacts...'\n );\n artefacts = await _generateRfc7523AuthZGrantArtefacts(\n clientId,\n iss,\n jwk,\n sub,\n scope,\n options\n );\n updateProgressIndicator(barId, 'Successfully generated artefacts.');\n let jwkFile: string;\n let jwksFile: string;\n if (options.save) {\n const jwkBarId = createProgressIndicator(\n 'determinate',\n 1,\n 'Saving JWK (private key)...'\n );\n jwkFile = getJwkFilePath(clientId);\n saveJsonToFile(artefacts.jwk, jwkFile, false);\n updateProgressIndicator(jwkBarId, `Saved JWK to ${jwkFile}.`);\n updateProgressIndicator(barId, 'Successfully saved JWK (private key).');\n stopProgressIndicator(jwkBarId);\n const jwksBarId = createProgressIndicator(\n 'determinate',\n 1,\n 'Saving JWKS (public key)...'\n );\n jwksFile = getJwksFilePath(clientId);\n saveJsonToFile(artefacts.jwks, jwksFile, false);\n updateProgressIndicator(jwksBarId, `Saved JWKS to ${jwksFile}.`);\n stopProgressIndicator(jwksBarId);\n updateProgressIndicator(barId, 'Successfully saved JWKS (public key).');\n }\n stopProgressIndicator(\n barId,\n `Successfully generated ${\n options.save ? 'and saved artefacts' : 'artefacts'\n }.`\n );\n cleanupProgressIndicators();\n\n if (json) {\n printMessage(artefacts, 'data');\n } else {\n printMessage(\n options.save\n ? `\\nCreated oauth2 client in the ${state.getRealm()} realm:`\n : `\\nIn AM, create an OAuth2 client in the ${state.getRealm()} realm with the following information:`\n );\n const client = createKeyValueTable();\n client.push(['Client ID'['brightCyan'], clientId]);\n client.push(['Client Name'['brightCyan'], clientId]);\n client.push([\n 'Scopes'['brightCyan'],\n (\n artefacts.client.coreOAuth2ClientConfig.scopes as Writable<string[]>\n ).value.join(', '),\n ]);\n client.push([\n 'Client Type'['brightCyan'],\n (artefacts.client.coreOAuth2ClientConfig.clientType as Writable<string>)\n .value,\n ]);\n client.push([\n 'Grant Types'['brightCyan'],\n (\n artefacts.client.advancedOAuth2ClientConfig.grantTypes as Writable<\n string[]\n >\n ).value.join(', '),\n ]);\n client.push([\n 'Implied Consent'['brightCyan'],\n (\n artefacts.client.advancedOAuth2ClientConfig\n .isConsentImplied as Writable<boolean>\n ).value,\n ]);\n client.push([\n 'Token Endpoint Authentication '['brightCyan'],\n (\n artefacts.client.advancedOAuth2ClientConfig\n .tokenEndpointAuthMethod as Writable<string>\n ).value,\n ]);\n client.push([\n 'Public Key Selector'['brightCyan'],\n (\n artefacts.client.signEncOAuth2ClientConfig\n .publicKeyLocation as Writable<string>\n ).value,\n ]);\n client.push([\n 'JWKS (Public Key)'['brightCyan'],\n options.save ? `${jwksFile}` : 'See below',\n ]);\n printMessage(`\\n${client.toString()}`);\n\n printMessage(\n options.save\n ? `\\nCreated oauth2 trusted issuer in the ${state.getRealm()} realm:`\n : `\\nIn AM, create a trusted issuer in the ${state.getRealm()} realm with the following information:`\n );\n const issuer = createKeyValueTable();\n issuer.push(['Name'['brightCyan'], artefacts.issuer._id]);\n issuer.push([\n 'JWT Issuer'['brightCyan'],\n (artefacts.issuer.issuer as Writable<string>).value,\n ]);\n issuer.push([\n 'Allowed Subjects '['brightCyan'],\n (artefacts.issuer.allowedSubjects as Writable<string[]>)?.value.length\n ? (\n artefacts.issuer.allowedSubjects as Writable<string[]>\n )?.value.join(', ')\n : `Any ${state.getRealm()} realm user`,\n ]);\n issuer.push([\n 'JWKS (Public Key)'['brightCyan'],\n options.save ? `${jwksFile}` : 'See below',\n ]);\n printMessage(`\\n${issuer.toString()}`);\n if (!options.save) {\n printMessage('\\nJWK (Private Key)'['brightCyan']);\n printMessage(stringify(artefacts.jwk));\n printMessage('\\nJWKS (Public Key)'['brightCyan']);\n printMessage(stringify(artefacts.jwks));\n }\n }\n return true;\n } catch (error) {\n printMessage(error, 'error');\n return false;\n }\n}\n\nexport async function executeRfc7523AuthZGrantFlow(\n clientId: string,\n iss?: string,\n jwk?: JwkRsa,\n sub?: string,\n scope?: string[],\n json?: boolean\n): Promise<boolean> {\n let tokenResponse: AccessTokenResponseType;\n let spinnerId: string;\n try {\n let issuer: OAuth2TrustedJwtIssuerSkeleton;\n // make sure we have an issuer\n if (!iss) {\n let issSpinnerId: string;\n try {\n issSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'No issuer provided, attempting to find suitable issuer...'\n );\n if (!issuer)\n issuer = await readOAuth2TrustedJwtIssuer(clientId + '-issuer');\n iss = (issuer.issuer as Writable<string>).value;\n stopProgressIndicator(\n issSpinnerId,\n `Found suitable issuer: ${clientId + '-issuer'} - ${iss}`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n issSpinnerId,\n `No issuer provided and no suitable issuer could be found: ${error.message}`,\n 'fail'\n );\n }\n }\n // make sure we have a JWK\n if (!jwk) {\n let jwkSpinnerId: string;\n try {\n jwkSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'No JWK provided, attempting to locate a suitable JWK...'\n );\n jwk = JSON.parse(fs.readFileSync(getJwkFilePath(clientId), 'utf8'));\n stopProgressIndicator(\n jwkSpinnerId,\n `Loaded private key JWK from: ${getJwkFilePath(clientId)}`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n jwkSpinnerId,\n `No JWK provided and no suitable JWK could be loaded from file: ${error.message}`,\n 'fail'\n );\n }\n }\n // make sure we have a subject\n if (!sub) {\n let subSpinnerId: string;\n try {\n subSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'Executing rfc7523 authz grant flow...'\n );\n if (!issuer)\n issuer = await frodo.oauth2oidc.issuer.readOAuth2TrustedJwtIssuer(\n clientId + '-issuer'\n );\n if (\n (issuer.allowedSubjects as Writable<string[]>).value &&\n (issuer.allowedSubjects as Writable<string[]>).value.length\n )\n sub = (issuer.allowedSubjects as Writable<string[]>).value[0];\n } catch (error) {\n stopProgressIndicator(\n subSpinnerId,\n `No subject provided and no suitable subject could be extracted from the trusted issuer configuration: ${error.message}`,\n 'fail'\n );\n }\n if (sub) {\n stopProgressIndicator(\n subSpinnerId,\n `Using first subject from issuer's allowed subjects: ${sub}`,\n 'success'\n );\n } else {\n stopProgressIndicator(\n subSpinnerId,\n `No subject provided and no suitable subject could be extracted from the trusted issuer's list of allowed subjects.`,\n 'success'\n );\n }\n }\n // we got everything we need, let's get that token\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'Executing rfc7523 authz grant flow...'\n );\n tokenResponse = await _executeRfc7523AuthZGrantFlow(\n clientId,\n iss,\n jwk,\n sub,\n scope\n );\n stopProgressIndicator(\n spinnerId,\n 'Successfully executed rfc7523 authz grant flow.',\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error executing rfc7523 authz grant flow: ${stringify(\n error.response?.data || error.message\n )}`,\n 'fail'\n );\n return false;\n }\n cleanupProgressIndicators();\n\n if (json) {\n printMessage(tokenResponse, 'data');\n } else {\n printMessage('\\nAccess Token'['brightCyan']);\n printMessage(tokenResponse.access_token);\n if (tokenResponse.id_token) {\n printMessage('\\nIdentity Token'['brightCyan']);\n printMessage(tokenResponse.id_token);\n }\n }\n return true;\n}\n\n/**\n * Export everything to separate files\n * @param file file name\n * @param {FullExportOptions} options export options\n */\nexport async function exportEverythingToFile(\n file,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n }\n): Promise<void> {\n const exportData = await exportFullConfiguration(options);\n let fileName = getTypedFilename(\n `${titleCase(getRealmName(state.getRealm()))}`,\n `everything`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true));\n}\n\n/**\n * Export everything to separate files\n * @param extract Extracts the scripts from the exports into separate files if true\n * @param {FullExportOptions} options export options\n */\nexport async function exportEverythingToFiles(\n extract = false,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n }\n): Promise<void> {\n const exportData: FullExportInterface =\n await exportFullConfiguration(options);\n delete exportData.meta;\n const baseDirectory = getWorkingDirectory(true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(exportData).forEach(([type, obj]: [string, any]) => {\n if (obj) {\n if (!fs.existsSync(`${baseDirectory}/${type}`)) {\n fs.mkdirSync(`${baseDirectory}/${type}`);\n }\n if (type == 'saml') {\n const samlData = {\n saml: {\n cot: {},\n hosted: {},\n metadata: {},\n remote: {},\n },\n };\n if (obj.cot) {\n if (!fs.existsSync(`${baseDirectory}/cot`)) {\n fs.mkdirSync(`${baseDirectory}/cot`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj.cot).forEach(([id, value]: [string, any]) => {\n samlData.saml.cot = {\n [id]: value,\n };\n saveJsonToFile(\n samlData,\n `${baseDirectory}/cot/${getTypedFilename(id, 'cot.saml')}`\n );\n });\n samlData.saml.cot = {};\n }\n Object.entries(obj.hosted)\n .concat(Object.entries(obj.remote))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .forEach(([id, value]: [string, any]) => {\n const filename = getTypedFilename(\n value.entityId ? value.entityId : id,\n type\n );\n const samlType = obj.hosted[id] ? 'hosted' : 'remote';\n samlData.saml[samlType][id] = value;\n samlData.saml.metadata = {\n [id]: obj.metadata[id],\n };\n saveJsonToFile(samlData, `${baseDirectory}/${type}/${filename}`);\n samlData.saml[samlType] = {};\n });\n } else if (type == 'authentication') {\n const fileName = getTypedFilename(\n `${frodo.utils.getRealmName(state.getRealm())}Realm`,\n 'authentication.settings'\n );\n saveJsonToFile(\n {\n authentication: obj,\n },\n `${baseDirectory}/${type}/${fileName}`\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj).forEach(([id, value]: [string, any]) => {\n const filename =\n type == 'config'\n ? `${id}.json`\n : getTypedFilename(value.name ? value.name : id, type);\n if (type == 'config' && filename.includes('/')) {\n fs.mkdirSync(\n `${baseDirectory}/${type}/${filename.slice(\n 0,\n filename.lastIndexOf('/')\n )}`,\n {\n recursive: true,\n }\n );\n }\n if (extract && type == 'script') {\n extractScriptToFile(exportData as ScriptExportInterface, id, type);\n }\n saveJsonToFile(\n {\n [type]: {\n [id]: value,\n },\n },\n `${baseDirectory}/${type}/${filename}`\n );\n });\n }\n }\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AdminOps.js","names":["frodo","state","fs","cleanupProgressIndicators","createKeyValueTable","createProgressIndicator","printMessage","stopProgressIndicator","updateProgressIndicator","getTypedFilename","saveJsonToFile","getFilePath","utils","generateRfc7523AuthZGrantArtefacts","_generateRfc7523AuthZGrantArtefacts","executeRfc7523AuthZGrantFlow","_executeRfc7523AuthZGrantFlow","admin","stringify","json","readOAuth2TrustedJwtIssuer","oauth2oidc","issuer","getJwkFilePath","clientId","getJwksFilePath","iss","jwk","sub","scope","options","artefacts","barId","save","jwkFile","jwksFile","jwkBarId","jwksBarId","jwks","_artefacts$issuer$all","_artefacts$issuer$all2","getRealm","client","push","coreOAuth2ClientConfig","scopes","value","join","clientType","advancedOAuth2ClientConfig","grantTypes","isConsentImplied","tokenEndpointAuthMethod","signEncOAuth2ClientConfig","publicKeyLocation","toString","_id","allowedSubjects","length","error","tokenResponse","spinnerId","issSpinnerId","message","jwkSpinnerId","JSON","parse","readFileSync","subSpinnerId","_error$response","response","data","access_token","id_token"],"sources":["../../src/ops/AdminOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport { Writable } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport { OAuth2ClientSkeleton } from '@rockcarver/frodo-lib/types/api/OAuth2ClientApi';\nimport { AccessTokenResponseType } from '@rockcarver/frodo-lib/types/api/OAuth2OIDCApi';\nimport { OAuth2TrustedJwtIssuerSkeleton } from '@rockcarver/frodo-lib/types/api/OAuth2TrustedJwtIssuerApi';\nimport { JwkRsa, JwksInterface } from '@rockcarver/frodo-lib/types/ops/JoseOps';\nimport fs from 'fs';\n\nimport {\n cleanupProgressIndicators,\n createKeyValueTable,\n createProgressIndicator,\n printMessage,\n stopProgressIndicator,\n updateProgressIndicator,\n} from '../utils/Console';\n\nconst { getTypedFilename, saveJsonToFile, getFilePath } = frodo.utils;\nconst {\n generateRfc7523AuthZGrantArtefacts: _generateRfc7523AuthZGrantArtefacts,\n executeRfc7523AuthZGrantFlow: _executeRfc7523AuthZGrantFlow,\n} = frodo.admin;\nconst { stringify } = frodo.utils.json;\nconst { readOAuth2TrustedJwtIssuer } = frodo.oauth2oidc.issuer;\n\nfunction getJwkFilePath(clientId: string): string {\n return getFilePath(getTypedFilename(clientId + '_private', 'jwk'), true);\n}\n\nfunction getJwksFilePath(clientId: string): string {\n return getFilePath(getTypedFilename(clientId + '_public', 'jwks'), true);\n}\n\nexport async function generateRfc7523AuthZGrantArtefacts(\n clientId: string,\n iss: string,\n jwk?: JwkRsa,\n sub?: string,\n scope?: string[],\n options?: { save: boolean },\n json?: boolean\n): Promise<boolean> {\n let artefacts: {\n jwk: JwkRsa;\n jwks: JwksInterface;\n client: OAuth2ClientSkeleton;\n issuer: OAuth2TrustedJwtIssuerSkeleton;\n };\n try {\n const barId = createProgressIndicator(\n 'determinate',\n options.save ? 3 : 1,\n 'Generating artefacts...'\n );\n artefacts = await _generateRfc7523AuthZGrantArtefacts(\n clientId,\n iss,\n jwk,\n sub,\n scope,\n options\n );\n updateProgressIndicator(barId, 'Successfully generated artefacts.');\n let jwkFile: string;\n let jwksFile: string;\n if (options.save) {\n const jwkBarId = createProgressIndicator(\n 'determinate',\n 1,\n 'Saving JWK (private key)...'\n );\n jwkFile = getJwkFilePath(clientId);\n saveJsonToFile(artefacts.jwk, jwkFile, false);\n updateProgressIndicator(jwkBarId, `Saved JWK to ${jwkFile}.`);\n updateProgressIndicator(barId, 'Successfully saved JWK (private key).');\n stopProgressIndicator(jwkBarId);\n const jwksBarId = createProgressIndicator(\n 'determinate',\n 1,\n 'Saving JWKS (public key)...'\n );\n jwksFile = getJwksFilePath(clientId);\n saveJsonToFile(artefacts.jwks, jwksFile, false);\n updateProgressIndicator(jwksBarId, `Saved JWKS to ${jwksFile}.`);\n stopProgressIndicator(jwksBarId);\n updateProgressIndicator(barId, 'Successfully saved JWKS (public key).');\n }\n stopProgressIndicator(\n barId,\n `Successfully generated ${\n options.save ? 'and saved artefacts' : 'artefacts'\n }.`\n );\n cleanupProgressIndicators();\n\n if (json) {\n printMessage(artefacts, 'data');\n } else {\n printMessage(\n options.save\n ? `\\nCreated oauth2 client in the ${state.getRealm()} realm:`\n : `\\nIn AM, create an OAuth2 client in the ${state.getRealm()} realm with the following information:`\n );\n const client = createKeyValueTable();\n client.push(['Client ID'['brightCyan'], clientId]);\n client.push(['Client Name'['brightCyan'], clientId]);\n client.push([\n 'Scopes'['brightCyan'],\n (\n artefacts.client.coreOAuth2ClientConfig.scopes as Writable<string[]>\n ).value.join(', '),\n ]);\n client.push([\n 'Client Type'['brightCyan'],\n (artefacts.client.coreOAuth2ClientConfig.clientType as Writable<string>)\n .value,\n ]);\n client.push([\n 'Grant Types'['brightCyan'],\n (\n artefacts.client.advancedOAuth2ClientConfig.grantTypes as Writable<\n string[]\n >\n ).value.join(', '),\n ]);\n client.push([\n 'Implied Consent'['brightCyan'],\n (\n artefacts.client.advancedOAuth2ClientConfig\n .isConsentImplied as Writable<boolean>\n ).value,\n ]);\n client.push([\n 'Token Endpoint Authentication '['brightCyan'],\n (\n artefacts.client.advancedOAuth2ClientConfig\n .tokenEndpointAuthMethod as Writable<string>\n ).value,\n ]);\n client.push([\n 'Public Key Selector'['brightCyan'],\n (\n artefacts.client.signEncOAuth2ClientConfig\n .publicKeyLocation as Writable<string>\n ).value,\n ]);\n client.push([\n 'JWKS (Public Key)'['brightCyan'],\n options.save ? `${jwksFile}` : 'See below',\n ]);\n printMessage(`\\n${client.toString()}`);\n\n printMessage(\n options.save\n ? `\\nCreated oauth2 trusted issuer in the ${state.getRealm()} realm:`\n : `\\nIn AM, create a trusted issuer in the ${state.getRealm()} realm with the following information:`\n );\n const issuer = createKeyValueTable();\n issuer.push(['Name'['brightCyan'], artefacts.issuer._id]);\n issuer.push([\n 'JWT Issuer'['brightCyan'],\n (artefacts.issuer.issuer as Writable<string>).value,\n ]);\n issuer.push([\n 'Allowed Subjects '['brightCyan'],\n (artefacts.issuer.allowedSubjects as Writable<string[]>)?.value.length\n ? (\n artefacts.issuer.allowedSubjects as Writable<string[]>\n )?.value.join(', ')\n : `Any ${state.getRealm()} realm user`,\n ]);\n issuer.push([\n 'JWKS (Public Key)'['brightCyan'],\n options.save ? `${jwksFile}` : 'See below',\n ]);\n printMessage(`\\n${issuer.toString()}`);\n if (!options.save) {\n printMessage('\\nJWK (Private Key)'['brightCyan']);\n printMessage(stringify(artefacts.jwk));\n printMessage('\\nJWKS (Public Key)'['brightCyan']);\n printMessage(stringify(artefacts.jwks));\n }\n }\n return true;\n } catch (error) {\n printMessage(error, 'error');\n return false;\n }\n}\n\nexport async function executeRfc7523AuthZGrantFlow(\n clientId: string,\n iss?: string,\n jwk?: JwkRsa,\n sub?: string,\n scope?: string[],\n json?: boolean\n): Promise<boolean> {\n let tokenResponse: AccessTokenResponseType;\n let spinnerId: string;\n try {\n let issuer: OAuth2TrustedJwtIssuerSkeleton;\n // make sure we have an issuer\n if (!iss) {\n let issSpinnerId: string;\n try {\n issSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'No issuer provided, attempting to find suitable issuer...'\n );\n if (!issuer)\n issuer = await readOAuth2TrustedJwtIssuer(clientId + '-issuer');\n iss = (issuer.issuer as Writable<string>).value;\n stopProgressIndicator(\n issSpinnerId,\n `Found suitable issuer: ${clientId + '-issuer'} - ${iss}`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n issSpinnerId,\n `No issuer provided and no suitable issuer could be found: ${error.message}`,\n 'fail'\n );\n }\n }\n // make sure we have a JWK\n if (!jwk) {\n let jwkSpinnerId: string;\n try {\n jwkSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'No JWK provided, attempting to locate a suitable JWK...'\n );\n jwk = JSON.parse(fs.readFileSync(getJwkFilePath(clientId), 'utf8'));\n stopProgressIndicator(\n jwkSpinnerId,\n `Loaded private key JWK from: ${getJwkFilePath(clientId)}`,\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n jwkSpinnerId,\n `No JWK provided and no suitable JWK could be loaded from file: ${error.message}`,\n 'fail'\n );\n }\n }\n // make sure we have a subject\n if (!sub) {\n let subSpinnerId: string;\n try {\n subSpinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'Executing rfc7523 authz grant flow...'\n );\n if (!issuer)\n issuer = await frodo.oauth2oidc.issuer.readOAuth2TrustedJwtIssuer(\n clientId + '-issuer'\n );\n if (\n (issuer.allowedSubjects as Writable<string[]>).value &&\n (issuer.allowedSubjects as Writable<string[]>).value.length\n )\n sub = (issuer.allowedSubjects as Writable<string[]>).value[0];\n } catch (error) {\n stopProgressIndicator(\n subSpinnerId,\n `No subject provided and no suitable subject could be extracted from the trusted issuer configuration: ${error.message}`,\n 'fail'\n );\n }\n if (sub) {\n stopProgressIndicator(\n subSpinnerId,\n `Using first subject from issuer's allowed subjects: ${sub}`,\n 'success'\n );\n } else {\n stopProgressIndicator(\n subSpinnerId,\n `No subject provided and no suitable subject could be extracted from the trusted issuer's list of allowed subjects.`,\n 'success'\n );\n }\n }\n // we got everything we need, let's get that token\n spinnerId = createProgressIndicator(\n 'indeterminate',\n 0,\n 'Executing rfc7523 authz grant flow...'\n );\n tokenResponse = await _executeRfc7523AuthZGrantFlow(\n clientId,\n iss,\n jwk,\n sub,\n scope\n );\n stopProgressIndicator(\n spinnerId,\n 'Successfully executed rfc7523 authz grant flow.',\n 'success'\n );\n } catch (error) {\n stopProgressIndicator(\n spinnerId,\n `Error executing rfc7523 authz grant flow: ${stringify(\n error.response?.data || error.message\n )}`,\n 'fail'\n );\n return false;\n }\n cleanupProgressIndicators();\n\n if (json) {\n printMessage(tokenResponse, 'data');\n } else {\n printMessage('\\nAccess Token'['brightCyan']);\n printMessage(tokenResponse.access_token);\n if (tokenResponse.id_token) {\n printMessage('\\nIdentity Token'['brightCyan']);\n printMessage(tokenResponse.id_token);\n }\n }\n return true;\n}\n"],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import { frodo, state } from '@rockcarver/frodo-lib';
2
+ import fs from 'fs';
3
+ import fse from 'fs-extra';
4
+ import { printMessage } from '../utils/Console';
5
+ import { extractScriptToFile } from './ScriptOps';
6
+ const {
7
+ getRealmName,
8
+ getTypedFilename,
9
+ titleCase,
10
+ saveJsonToFile,
11
+ getFilePath,
12
+ getWorkingDirectory
13
+ } = frodo.utils;
14
+ const {
15
+ exportFullConfiguration
16
+ } = frodo.config;
17
+ const {
18
+ stringify
19
+ } = frodo.utils.json;
20
+
21
+ /**
22
+ * Export everything to separate files
23
+ * @param file file name
24
+ * @param {FullExportOptions} options export options
25
+ */
26
+ export async function exportEverythingToFile(file, options = {
27
+ useStringArrays: true,
28
+ noDecode: false
29
+ }) {
30
+ const exportData = await exportFullConfiguration(options);
31
+ let fileName = getTypedFilename(`${titleCase(getRealmName(state.getRealm()))}`, `everything`);
32
+ if (file) {
33
+ fileName = file;
34
+ }
35
+ saveJsonToFile(exportData, getFilePath(fileName, true));
36
+ }
37
+
38
+ /**
39
+ * Export everything to separate files
40
+ * @param extract Extracts the scripts from the exports into separate files if true
41
+ * @param {FullExportOptions} options export options
42
+ */
43
+ export async function exportEverythingToFiles(extract = false, options = {
44
+ useStringArrays: true,
45
+ noDecode: false
46
+ }) {
47
+ const exportData = await exportFullConfiguration(options);
48
+ delete exportData.meta;
49
+ const baseDirectory = getWorkingDirectory(true);
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ Object.entries(exportData).forEach(([type, obj]) => {
52
+ if (obj) {
53
+ if (!fs.existsSync(`${baseDirectory}/${type}`)) {
54
+ fs.mkdirSync(`${baseDirectory}/${type}`);
55
+ }
56
+ if (type == 'saml') {
57
+ const samlData = {
58
+ saml: {
59
+ cot: {},
60
+ hosted: {},
61
+ metadata: {},
62
+ remote: {}
63
+ }
64
+ };
65
+ if (obj.cot) {
66
+ if (!fs.existsSync(`${baseDirectory}/cot`)) {
67
+ fs.mkdirSync(`${baseDirectory}/cot`);
68
+ }
69
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
+ Object.entries(obj.cot).forEach(([id, value]) => {
71
+ samlData.saml.cot = {
72
+ [id]: value
73
+ };
74
+ saveJsonToFile(samlData, `${baseDirectory}/cot/${getTypedFilename(id, 'cot.saml')}`);
75
+ });
76
+ samlData.saml.cot = {};
77
+ }
78
+ Object.entries(obj.hosted).concat(Object.entries(obj.remote))
79
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
+ .forEach(([id, value]) => {
81
+ const filename = getTypedFilename(value.entityId ? value.entityId : id, type);
82
+ const samlType = obj.hosted[id] ? 'hosted' : 'remote';
83
+ samlData.saml[samlType][id] = value;
84
+ samlData.saml.metadata = {
85
+ [id]: obj.metadata[id]
86
+ };
87
+ saveJsonToFile(samlData, `${baseDirectory}/${type}/${filename}`);
88
+ samlData.saml[samlType] = {};
89
+ });
90
+ } else if (type == 'authentication') {
91
+ const fileName = getTypedFilename(`${frodo.utils.getRealmName(state.getRealm())}Realm`, 'authentication.settings');
92
+ saveJsonToFile({
93
+ authentication: obj
94
+ }, `${baseDirectory}/${type}/${fileName}`);
95
+ } else {
96
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
+ Object.entries(obj).forEach(([id, value]) => {
98
+ if (type == 'config') {
99
+ if (value != null) {
100
+ const filename = `${id}.json`;
101
+ if (filename.includes('/')) {
102
+ fs.mkdirSync(`${baseDirectory}/${type}/${filename.slice(0, filename.lastIndexOf('/'))}`, {
103
+ recursive: true
104
+ });
105
+ }
106
+ fse.outputFile(`${baseDirectory}/${type}/${filename}`, stringify(value), err => {
107
+ if (err) {
108
+ return printMessage(`ERROR - can't save config ${id} to file - ${err}`, 'error');
109
+ }
110
+ });
111
+ }
112
+ } else {
113
+ const filename = getTypedFilename(value && value.name ? value.name : id, type);
114
+ if (extract && type == 'script') {
115
+ extractScriptToFile(exportData, id, type);
116
+ }
117
+ saveJsonToFile({
118
+ [type]: {
119
+ [id]: value
120
+ }
121
+ }, `${baseDirectory}/${type}/${filename}`);
122
+ }
123
+ });
124
+ }
125
+ }
126
+ });
127
+ }
128
+ //# sourceMappingURL=ConfigOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigOps.js","names":["frodo","state","fs","fse","printMessage","extractScriptToFile","getRealmName","getTypedFilename","titleCase","saveJsonToFile","getFilePath","getWorkingDirectory","utils","exportFullConfiguration","config","stringify","json","exportEverythingToFile","file","options","useStringArrays","noDecode","exportData","fileName","getRealm","exportEverythingToFiles","extract","meta","baseDirectory","Object","entries","forEach","type","obj","existsSync","mkdirSync","samlData","saml","cot","hosted","metadata","remote","id","value","concat","filename","entityId","samlType","authentication","includes","slice","lastIndexOf","recursive","outputFile","err","name"],"sources":["../../src/ops/ConfigOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport {\n FullExportInterface,\n FullExportOptions,\n} from '@rockcarver/frodo-lib/types/ops/ConfigOps';\nimport { ScriptExportInterface } from '@rockcarver/frodo-lib/types/ops/ScriptOps';\nimport fs from 'fs';\nimport fse from 'fs-extra';\n\nimport { printMessage } from '../utils/Console';\nimport { extractScriptToFile } from './ScriptOps';\n\nconst {\n getRealmName,\n getTypedFilename,\n titleCase,\n saveJsonToFile,\n getFilePath,\n getWorkingDirectory,\n} = frodo.utils;\nconst { exportFullConfiguration } = frodo.config;\nconst { stringify } = frodo.utils.json;\n\n/**\n * Export everything to separate files\n * @param file file name\n * @param {FullExportOptions} options export options\n */\nexport async function exportEverythingToFile(\n file,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n }\n): Promise<void> {\n const exportData = await exportFullConfiguration(options);\n let fileName = getTypedFilename(\n `${titleCase(getRealmName(state.getRealm()))}`,\n `everything`\n );\n if (file) {\n fileName = file;\n }\n saveJsonToFile(exportData, getFilePath(fileName, true));\n}\n\n/**\n * Export everything to separate files\n * @param extract Extracts the scripts from the exports into separate files if true\n * @param {FullExportOptions} options export options\n */\nexport async function exportEverythingToFiles(\n extract = false,\n options: FullExportOptions = {\n useStringArrays: true,\n noDecode: false,\n }\n): Promise<void> {\n const exportData: FullExportInterface =\n await exportFullConfiguration(options);\n delete exportData.meta;\n const baseDirectory = getWorkingDirectory(true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(exportData).forEach(([type, obj]: [string, any]) => {\n if (obj) {\n if (!fs.existsSync(`${baseDirectory}/${type}`)) {\n fs.mkdirSync(`${baseDirectory}/${type}`);\n }\n if (type == 'saml') {\n const samlData = {\n saml: {\n cot: {},\n hosted: {},\n metadata: {},\n remote: {},\n },\n };\n if (obj.cot) {\n if (!fs.existsSync(`${baseDirectory}/cot`)) {\n fs.mkdirSync(`${baseDirectory}/cot`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj.cot).forEach(([id, value]: [string, any]) => {\n samlData.saml.cot = {\n [id]: value,\n };\n saveJsonToFile(\n samlData,\n `${baseDirectory}/cot/${getTypedFilename(id, 'cot.saml')}`\n );\n });\n samlData.saml.cot = {};\n }\n Object.entries(obj.hosted)\n .concat(Object.entries(obj.remote))\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n .forEach(([id, value]: [string, any]) => {\n const filename = getTypedFilename(\n value.entityId ? value.entityId : id,\n type\n );\n const samlType = obj.hosted[id] ? 'hosted' : 'remote';\n samlData.saml[samlType][id] = value;\n samlData.saml.metadata = {\n [id]: obj.metadata[id],\n };\n saveJsonToFile(samlData, `${baseDirectory}/${type}/${filename}`);\n samlData.saml[samlType] = {};\n });\n } else if (type == 'authentication') {\n const fileName = getTypedFilename(\n `${frodo.utils.getRealmName(state.getRealm())}Realm`,\n 'authentication.settings'\n );\n saveJsonToFile(\n {\n authentication: obj,\n },\n `${baseDirectory}/${type}/${fileName}`\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Object.entries(obj).forEach(([id, value]: [string, any]) => {\n if (type == 'config') {\n if (value != null) {\n const filename = `${id}.json`;\n if (filename.includes('/')) {\n fs.mkdirSync(\n `${baseDirectory}/${type}/${filename.slice(\n 0,\n filename.lastIndexOf('/')\n )}`,\n {\n recursive: true,\n }\n );\n }\n fse.outputFile(\n `${baseDirectory}/${type}/${filename}`,\n stringify(value),\n (err) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${id} to file - ${err}`,\n 'error'\n );\n }\n }\n );\n }\n } else {\n const filename = getTypedFilename(\n value && value.name ? value.name : id,\n type\n );\n if (extract && type == 'script') {\n extractScriptToFile(\n exportData as ScriptExportInterface,\n id,\n type\n );\n }\n saveJsonToFile(\n {\n [type]: {\n [id]: value,\n },\n },\n `${baseDirectory}/${type}/${filename}`\n );\n }\n });\n }\n }\n });\n}\n"],"mappings":"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"}
package/esm/ops/IdmOps.js CHANGED
@@ -6,6 +6,9 @@ import propertiesReader from 'properties-reader';
6
6
  import replaceall from 'replaceall';
7
7
  import { createProgressIndicator, printMessage, stopProgressIndicator } from '../utils/Console';
8
8
  import { getTypedFilename, readFiles } from '../utils/ExportImportUtils';
9
+ const {
10
+ stringify
11
+ } = frodo.utils.json;
9
12
  const {
10
13
  unSubstituteEnvParams,
11
14
  areScriptHooksValid,
@@ -64,7 +67,7 @@ export async function exportConfigEntity(id, file) {
64
67
  fileName = getTypedFilename(`${id}`, 'idm');
65
68
  }
66
69
  const configEntity = await readConfigEntity(id);
67
- fs.writeFile(getFilePath(fileName, true), JSON.stringify(configEntity, null, 2), err => {
70
+ fs.writeFile(getFilePath(fileName, true), stringify(configEntity), err => {
68
71
  if (err) {
69
72
  return printMessage(`ERROR - can't save ${id} export to file`, 'error');
70
73
  }
@@ -79,7 +82,7 @@ export async function exportAllRawConfigEntities() {
79
82
  const exportedConfigurations = await exportConfigEntities();
80
83
  for (const [id, value] of Object.entries(exportedConfigurations.config)) {
81
84
  if (value != null) {
82
- fse.outputFile(getFilePath(`${id}.json`, true), JSON.stringify(value, null, 2), err => {
85
+ fse.outputFile(getFilePath(`${id}.json`, true), stringify(value), err => {
83
86
  if (err) {
84
87
  return printMessage(`ERROR - can't save config ${id} to file - ${err}`, 'error');
85
88
  }
@@ -116,7 +119,7 @@ export async function exportAllConfigEntities(entitiesFile, envFile) {
116
119
  const results = await Promise.all(entityPromises);
117
120
  for (const item of results) {
118
121
  if (item != null) {
119
- let configEntityString = JSON.stringify(item, null, 2);
122
+ let configEntityString = stringify(item);
120
123
  envParams.each((key, value) => {
121
124
  configEntityString = replaceall(value, `\${${key}}`, configEntityString);
122
125
  });
@@ -1 +1 @@
1
- {"version":3,"file":"IdmOps.js","names":["frodo","state","fs","fse","path","propertiesReader","replaceall","createProgressIndicator","printMessage","stopProgressIndicator","getTypedFilename","readFiles","unSubstituteEnvParams","areScriptHooksValid","getFilePath","utils","testConnectorServers","readConfigEntities","readConfigEntity","exportConfigEntities","updateConfigEntity","idm","config","queryManagedObjects","managed","warnAboutOfflineConnectorServers","all","offline","filter","status","ok","map","name","length","join","error","message","listAllConfigEntities","configurations","configEntity","_id","readConfigEntitiesError","exportConfigEntity","id","file","fileName","writeFile","JSON","stringify","err","exportAllRawConfigEntities","exportedConfigurations","value","Object","entries","outputFile","exportAllConfigEntities","entitiesFile","envFile","entriesToExport","readFile","data","entriesData","parse","envParams","undefined","entityPromises","includes","push","results","Promise","item","configEntityString","each","key","importConfigEntityByIdFromFile","entityId","validate","fileData","readFileSync","resolve","process","cwd","entityData","isValid","updateConfigEntityError","importConfigEntityFromFile","importAllRawConfigEntities","baseDirectory","getDirectory","existsSync","files","jsonFiles","toLowerCase","endsWith","content","substring","everyScriptValid","jsObject","isScriptValid","allSettled","errors","result","reason","importAllConfigEntities","entriesToImport","envReader","unsubstituted","countManagedObjects","type","response"],"sources":["../../src/ops/IdmOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport path from 'path';\nimport propertiesReader from 'properties-reader';\nimport replaceall from 'replaceall';\n\nimport {\n createProgressIndicator,\n printMessage,\n stopProgressIndicator,\n} from '../utils/Console';\nimport { getTypedFilename, readFiles } from '../utils/ExportImportUtils';\n\nconst { unSubstituteEnvParams, areScriptHooksValid, getFilePath } = frodo.utils;\nconst {\n testConnectorServers,\n readConfigEntities,\n readConfigEntity,\n exportConfigEntities,\n updateConfigEntity,\n} = frodo.idm.config;\nconst { queryManagedObjects } = frodo.idm.managed;\n\n/**\n * Warn about and list offline remote connector servers\n */\nexport async function warnAboutOfflineConnectorServers() {\n try {\n const all = await testConnectorServers();\n const offline = all\n .filter((status) => !status.ok)\n .map((status) => status.name);\n if (offline.length) {\n printMessage(\n `\\nThe following connector server(s) are offline and their connectors and configuration unavailable:\\n${offline.join(\n '\\n'\n )}`,\n 'warn'\n );\n }\n } catch (error) {\n printMessage(error, 'error');\n printMessage(\n `Error getting offline connector servers: ${error.message}`,\n 'error'\n );\n }\n}\n\n/**\n * List all IDM configuration objects\n */\nexport async function listAllConfigEntities() {\n try {\n const configurations = await readConfigEntities();\n for (const configEntity of configurations) {\n printMessage(`${configEntity._id}`, 'data');\n }\n } catch (readConfigEntitiesError) {\n printMessage(readConfigEntitiesError, 'error');\n printMessage(\n `Error getting config entities: ${readConfigEntitiesError}`,\n 'error'\n );\n }\n}\n\n/**\n * Export an IDM configuration object.\n * @param {String} id the desired configuration object\n * @param {String} file optional export file\n */\nexport async function exportConfigEntity(id, file) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`${id}`, 'idm');\n }\n const configEntity = await readConfigEntity(id);\n fs.writeFile(\n getFilePath(fileName, true),\n JSON.stringify(configEntity, null, 2),\n (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${id} export to file`, 'error');\n }\n return '';\n }\n );\n}\n\n/**\n * Export all IDM configuration objects into separate JSON files in a directory specified by <directory>\n */\nexport async function exportAllRawConfigEntities() {\n const exportedConfigurations = await exportConfigEntities();\n for (const [id, value] of Object.entries(exportedConfigurations.config)) {\n if (value != null) {\n fse.outputFile(\n getFilePath(`${id}.json`, true),\n JSON.stringify(value, null, 2),\n (err) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${id} to file - ${err}`,\n 'error'\n );\n }\n }\n );\n }\n }\n}\n\n/**\n * Export all IDM configuration objects\n * @param {String} entitiesFile JSON file that specifies the config entities to export/import\n * @param {String} envFile File that defines environment specific variables for replacement during configuration export/import\n */\nexport async function exportAllConfigEntities(entitiesFile, envFile) {\n let entriesToExport = [];\n // read list of entities to export\n fs.readFile(entitiesFile, 'utf8', async (err, data) => {\n if (err) throw err;\n const entriesData = JSON.parse(data);\n entriesToExport = entriesData.idm;\n // console.log(`entriesToExport ${entriesToExport}`);\n\n // read list of configs to parameterize for environment specific values\n const envParams = propertiesReader(envFile);\n\n try {\n const configurations = await readConfigEntities();\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Exporting config objects...'\n );\n const entityPromises = [];\n for (const configEntity of configurations) {\n if (entriesToExport.includes(configEntity._id)) {\n entityPromises.push(readConfigEntity(configEntity._id));\n }\n }\n const results = await Promise.all(entityPromises);\n for (const item of results) {\n if (item != null) {\n let configEntityString = JSON.stringify(item, null, 2);\n envParams.each((key, value) => {\n configEntityString = replaceall(\n value,\n `\\${${key}}`,\n configEntityString\n );\n });\n fse.outputFile(\n getFilePath(`${item._id}.json`, true),\n configEntityString,\n (error) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${item._id} to file - ${error}`,\n 'error'\n );\n }\n }\n );\n }\n }\n stopProgressIndicator(null, 'success');\n } catch (readConfigEntitiesError) {\n printMessage(readConfigEntitiesError, 'error');\n printMessage(\n `Error getting config entities: ${readConfigEntitiesError}`,\n 'error'\n );\n }\n });\n}\n\n/**\n * Import an IDM configuration object by id from file.\n * @param entityId the configuration object to import\n * @param file optional file to import\n * @param validate validate script hooks\n */\nexport async function importConfigEntityByIdFromFile(\n entityId: string,\n file?: string,\n validate?: boolean\n) {\n if (!file) {\n file = getTypedFilename(entityId, 'idm');\n }\n\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n\n const entityData = JSON.parse(fileData);\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n try {\n await updateConfigEntity(entityId, entityData);\n } catch (updateConfigEntityError) {\n printMessage(updateConfigEntityError, 'error');\n printMessage(`Error: ${updateConfigEntityError}`, 'error');\n }\n}\n\n/**\n * Import IDM configuration object from file.\n * @param file optional file to import\n * @param validate validate script hooks\n */\nexport async function importConfigEntityFromFile(\n file: string,\n validate?: boolean\n) {\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n const entityData = JSON.parse(fileData);\n const entityId = entityData._id;\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n try {\n await updateConfigEntity(entityId, entityData);\n } catch (updateConfigEntityError) {\n printMessage(updateConfigEntityError, 'error');\n printMessage(`Error: ${updateConfigEntityError}`, 'error');\n }\n}\n\n/**\n * Import all IDM configuration objects from separate JSON files in a directory specified by <directory>\n * @param validate validate script hooks\n */\nexport async function importAllRawConfigEntities(validate?: boolean) {\n const baseDirectory = state.getDirectory();\n if (!fs.existsSync(baseDirectory)) {\n return;\n }\n const files = await readFiles(baseDirectory);\n const jsonFiles = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ path, content }) => ({\n // Remove .json extension\n entityId: path.substring(0, path.length - 5),\n content,\n path,\n }));\n\n let everyScriptValid = true;\n for (const file of jsonFiles) {\n const jsObject = JSON.parse(file.content);\n const isScriptValid = areScriptHooksValid(jsObject);\n if (!isScriptValid) {\n printMessage(`Invalid script hook in ${file.path}`, 'error');\n everyScriptValid = false;\n }\n }\n\n if (validate && !everyScriptValid) {\n return;\n }\n\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Importing config objects...'\n );\n\n const entityPromises = jsonFiles.map((file) => {\n return updateConfigEntity(file.entityId, JSON.parse(file.content));\n });\n\n const results = await Promise.allSettled(entityPromises);\n const errors = results.filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected'\n );\n\n if (errors.length > 0) {\n printMessage(`Failed to import ${errors.length} config objects:`, 'error');\n for (const error of errors) {\n printMessage(`- ${error.reason}`, 'error');\n }\n stopProgressIndicator(\n `Failed to import ${errors.length} config objects`,\n 'error'\n );\n return;\n }\n\n stopProgressIndicator(`Imported ${results.length} config objects`, 'success');\n}\n\n/**\n * Import all IDM configuration objects\n * @param entitiesFile JSON file that specifies the config entities to export/import\n * @param envFile File that defines environment specific variables for replacement during configuration export/import\n * @param validate validate script hooks\n */\nexport async function importAllConfigEntities(\n entitiesFile: string,\n envFile: string,\n validate?: boolean\n) {\n const baseDirectory = state.getDirectory();\n if (!fs.existsSync(baseDirectory)) {\n return;\n }\n const entriesToImport = JSON.parse(fs.readFileSync(entitiesFile, 'utf8')).idm;\n\n const envReader = propertiesReader(envFile);\n\n const files = await readFiles(baseDirectory);\n const jsonFiles = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ content, path }) => ({\n // Remove .json extension\n entityId: path.substring(0, path.length - 5),\n content,\n path,\n }));\n\n let everyScriptValid = true;\n for (const file of jsonFiles) {\n const jsObject = JSON.parse(file.content);\n const isScriptValid = areScriptHooksValid(jsObject);\n if (!isScriptValid) {\n printMessage(`Invalid script hook in ${file.path}`, 'error');\n everyScriptValid = false;\n }\n }\n\n if (validate && !everyScriptValid) {\n return;\n }\n\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Importing config objects...'\n );\n\n const entityPromises = jsonFiles\n .filter(({ entityId }) => {\n return entriesToImport.includes(entityId);\n })\n .map(({ entityId, content }) => {\n const unsubstituted = unSubstituteEnvParams(content, envReader);\n return updateConfigEntity(entityId, JSON.parse(unsubstituted));\n });\n\n const results = await Promise.allSettled(entityPromises);\n const errors = results.filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected'\n );\n\n if (errors.length > 0) {\n printMessage(`Failed to import ${errors.length} config objects:`, 'error');\n for (const error of errors) {\n printMessage(`- ${error.reason}`, 'error');\n }\n stopProgressIndicator(\n `Failed to import ${errors.length} config objects`,\n 'error'\n );\n return;\n }\n\n stopProgressIndicator(`Imported ${results.length} config objects`, 'success');\n}\n\n/**\n * Count number of managed objects of a given type\n * @param {String} type managed object type, e.g. alpha_user\n */\nexport async function countManagedObjects(type: string) {\n try {\n const result = await queryManagedObjects(type);\n printMessage(`${type}: ${result.length}`, 'data');\n } catch (error) {\n printMessage(error.response.data, 'error');\n printMessage(`Error querying managed objects by type: ${error}`, 'error');\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"IdmOps.js","names":["frodo","state","fs","fse","path","propertiesReader","replaceall","createProgressIndicator","printMessage","stopProgressIndicator","getTypedFilename","readFiles","stringify","utils","json","unSubstituteEnvParams","areScriptHooksValid","getFilePath","testConnectorServers","readConfigEntities","readConfigEntity","exportConfigEntities","updateConfigEntity","idm","config","queryManagedObjects","managed","warnAboutOfflineConnectorServers","all","offline","filter","status","ok","map","name","length","join","error","message","listAllConfigEntities","configurations","configEntity","_id","readConfigEntitiesError","exportConfigEntity","id","file","fileName","writeFile","err","exportAllRawConfigEntities","exportedConfigurations","value","Object","entries","outputFile","exportAllConfigEntities","entitiesFile","envFile","entriesToExport","readFile","data","entriesData","JSON","parse","envParams","undefined","entityPromises","includes","push","results","Promise","item","configEntityString","each","key","importConfigEntityByIdFromFile","entityId","validate","fileData","readFileSync","resolve","process","cwd","entityData","isValid","updateConfigEntityError","importConfigEntityFromFile","importAllRawConfigEntities","baseDirectory","getDirectory","existsSync","files","jsonFiles","toLowerCase","endsWith","content","substring","everyScriptValid","jsObject","isScriptValid","allSettled","errors","result","reason","importAllConfigEntities","entriesToImport","envReader","unsubstituted","countManagedObjects","type","response"],"sources":["../../src/ops/IdmOps.ts"],"sourcesContent":["import { frodo, state } from '@rockcarver/frodo-lib';\nimport fs from 'fs';\nimport fse from 'fs-extra';\nimport path from 'path';\nimport propertiesReader from 'properties-reader';\nimport replaceall from 'replaceall';\n\nimport {\n createProgressIndicator,\n printMessage,\n stopProgressIndicator,\n} from '../utils/Console';\nimport { getTypedFilename, readFiles } from '../utils/ExportImportUtils';\n\nconst { stringify } = frodo.utils.json;\nconst { unSubstituteEnvParams, areScriptHooksValid, getFilePath } = frodo.utils;\nconst {\n testConnectorServers,\n readConfigEntities,\n readConfigEntity,\n exportConfigEntities,\n updateConfigEntity,\n} = frodo.idm.config;\nconst { queryManagedObjects } = frodo.idm.managed;\n\n/**\n * Warn about and list offline remote connector servers\n */\nexport async function warnAboutOfflineConnectorServers() {\n try {\n const all = await testConnectorServers();\n const offline = all\n .filter((status) => !status.ok)\n .map((status) => status.name);\n if (offline.length) {\n printMessage(\n `\\nThe following connector server(s) are offline and their connectors and configuration unavailable:\\n${offline.join(\n '\\n'\n )}`,\n 'warn'\n );\n }\n } catch (error) {\n printMessage(error, 'error');\n printMessage(\n `Error getting offline connector servers: ${error.message}`,\n 'error'\n );\n }\n}\n\n/**\n * List all IDM configuration objects\n */\nexport async function listAllConfigEntities() {\n try {\n const configurations = await readConfigEntities();\n for (const configEntity of configurations) {\n printMessage(`${configEntity._id}`, 'data');\n }\n } catch (readConfigEntitiesError) {\n printMessage(readConfigEntitiesError, 'error');\n printMessage(\n `Error getting config entities: ${readConfigEntitiesError}`,\n 'error'\n );\n }\n}\n\n/**\n * Export an IDM configuration object.\n * @param {String} id the desired configuration object\n * @param {String} file optional export file\n */\nexport async function exportConfigEntity(id, file) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`${id}`, 'idm');\n }\n const configEntity = await readConfigEntity(id);\n fs.writeFile(getFilePath(fileName, true), stringify(configEntity), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${id} export to file`, 'error');\n }\n return '';\n });\n}\n\n/**\n * Export all IDM configuration objects into separate JSON files in a directory specified by <directory>\n */\nexport async function exportAllRawConfigEntities() {\n const exportedConfigurations = await exportConfigEntities();\n for (const [id, value] of Object.entries(exportedConfigurations.config)) {\n if (value != null) {\n fse.outputFile(\n getFilePath(`${id}.json`, true),\n stringify(value),\n (err) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${id} to file - ${err}`,\n 'error'\n );\n }\n }\n );\n }\n }\n}\n\n/**\n * Export all IDM configuration objects\n * @param {String} entitiesFile JSON file that specifies the config entities to export/import\n * @param {String} envFile File that defines environment specific variables for replacement during configuration export/import\n */\nexport async function exportAllConfigEntities(entitiesFile, envFile) {\n let entriesToExport = [];\n // read list of entities to export\n fs.readFile(entitiesFile, 'utf8', async (err, data) => {\n if (err) throw err;\n const entriesData = JSON.parse(data);\n entriesToExport = entriesData.idm;\n // console.log(`entriesToExport ${entriesToExport}`);\n\n // read list of configs to parameterize for environment specific values\n const envParams = propertiesReader(envFile);\n\n try {\n const configurations = await readConfigEntities();\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Exporting config objects...'\n );\n const entityPromises = [];\n for (const configEntity of configurations) {\n if (entriesToExport.includes(configEntity._id)) {\n entityPromises.push(readConfigEntity(configEntity._id));\n }\n }\n const results = await Promise.all(entityPromises);\n for (const item of results) {\n if (item != null) {\n let configEntityString = stringify(item);\n envParams.each((key, value) => {\n configEntityString = replaceall(\n value,\n `\\${${key}}`,\n configEntityString\n );\n });\n fse.outputFile(\n getFilePath(`${item._id}.json`, true),\n configEntityString,\n (error) => {\n if (err) {\n return printMessage(\n `ERROR - can't save config ${item._id} to file - ${error}`,\n 'error'\n );\n }\n }\n );\n }\n }\n stopProgressIndicator(null, 'success');\n } catch (readConfigEntitiesError) {\n printMessage(readConfigEntitiesError, 'error');\n printMessage(\n `Error getting config entities: ${readConfigEntitiesError}`,\n 'error'\n );\n }\n });\n}\n\n/**\n * Import an IDM configuration object by id from file.\n * @param entityId the configuration object to import\n * @param file optional file to import\n * @param validate validate script hooks\n */\nexport async function importConfigEntityByIdFromFile(\n entityId: string,\n file?: string,\n validate?: boolean\n) {\n if (!file) {\n file = getTypedFilename(entityId, 'idm');\n }\n\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n\n const entityData = JSON.parse(fileData);\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n try {\n await updateConfigEntity(entityId, entityData);\n } catch (updateConfigEntityError) {\n printMessage(updateConfigEntityError, 'error');\n printMessage(`Error: ${updateConfigEntityError}`, 'error');\n }\n}\n\n/**\n * Import IDM configuration object from file.\n * @param file optional file to import\n * @param validate validate script hooks\n */\nexport async function importConfigEntityFromFile(\n file: string,\n validate?: boolean\n) {\n const fileData = fs.readFileSync(\n path.resolve(process.cwd(), getFilePath(file)),\n 'utf8'\n );\n const entityData = JSON.parse(fileData);\n const entityId = entityData._id;\n const isValid = areScriptHooksValid(entityData);\n if (validate && !isValid) {\n printMessage('Invalid IDM configuration object', 'error');\n return;\n }\n\n try {\n await updateConfigEntity(entityId, entityData);\n } catch (updateConfigEntityError) {\n printMessage(updateConfigEntityError, 'error');\n printMessage(`Error: ${updateConfigEntityError}`, 'error');\n }\n}\n\n/**\n * Import all IDM configuration objects from separate JSON files in a directory specified by <directory>\n * @param validate validate script hooks\n */\nexport async function importAllRawConfigEntities(validate?: boolean) {\n const baseDirectory = state.getDirectory();\n if (!fs.existsSync(baseDirectory)) {\n return;\n }\n const files = await readFiles(baseDirectory);\n const jsonFiles = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ path, content }) => ({\n // Remove .json extension\n entityId: path.substring(0, path.length - 5),\n content,\n path,\n }));\n\n let everyScriptValid = true;\n for (const file of jsonFiles) {\n const jsObject = JSON.parse(file.content);\n const isScriptValid = areScriptHooksValid(jsObject);\n if (!isScriptValid) {\n printMessage(`Invalid script hook in ${file.path}`, 'error');\n everyScriptValid = false;\n }\n }\n\n if (validate && !everyScriptValid) {\n return;\n }\n\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Importing config objects...'\n );\n\n const entityPromises = jsonFiles.map((file) => {\n return updateConfigEntity(file.entityId, JSON.parse(file.content));\n });\n\n const results = await Promise.allSettled(entityPromises);\n const errors = results.filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected'\n );\n\n if (errors.length > 0) {\n printMessage(`Failed to import ${errors.length} config objects:`, 'error');\n for (const error of errors) {\n printMessage(`- ${error.reason}`, 'error');\n }\n stopProgressIndicator(\n `Failed to import ${errors.length} config objects`,\n 'error'\n );\n return;\n }\n\n stopProgressIndicator(`Imported ${results.length} config objects`, 'success');\n}\n\n/**\n * Import all IDM configuration objects\n * @param entitiesFile JSON file that specifies the config entities to export/import\n * @param envFile File that defines environment specific variables for replacement during configuration export/import\n * @param validate validate script hooks\n */\nexport async function importAllConfigEntities(\n entitiesFile: string,\n envFile: string,\n validate?: boolean\n) {\n const baseDirectory = state.getDirectory();\n if (!fs.existsSync(baseDirectory)) {\n return;\n }\n const entriesToImport = JSON.parse(fs.readFileSync(entitiesFile, 'utf8')).idm;\n\n const envReader = propertiesReader(envFile);\n\n const files = await readFiles(baseDirectory);\n const jsonFiles = files\n .filter(({ path }) => path.toLowerCase().endsWith('.json'))\n .map(({ content, path }) => ({\n // Remove .json extension\n entityId: path.substring(0, path.length - 5),\n content,\n path,\n }));\n\n let everyScriptValid = true;\n for (const file of jsonFiles) {\n const jsObject = JSON.parse(file.content);\n const isScriptValid = areScriptHooksValid(jsObject);\n if (!isScriptValid) {\n printMessage(`Invalid script hook in ${file.path}`, 'error');\n everyScriptValid = false;\n }\n }\n\n if (validate && !everyScriptValid) {\n return;\n }\n\n createProgressIndicator(\n 'indeterminate',\n undefined,\n 'Importing config objects...'\n );\n\n const entityPromises = jsonFiles\n .filter(({ entityId }) => {\n return entriesToImport.includes(entityId);\n })\n .map(({ entityId, content }) => {\n const unsubstituted = unSubstituteEnvParams(content, envReader);\n return updateConfigEntity(entityId, JSON.parse(unsubstituted));\n });\n\n const results = await Promise.allSettled(entityPromises);\n const errors = results.filter(\n (result): result is PromiseRejectedResult => result.status === 'rejected'\n );\n\n if (errors.length > 0) {\n printMessage(`Failed to import ${errors.length} config objects:`, 'error');\n for (const error of errors) {\n printMessage(`- ${error.reason}`, 'error');\n }\n stopProgressIndicator(\n `Failed to import ${errors.length} config objects`,\n 'error'\n );\n return;\n }\n\n stopProgressIndicator(`Imported ${results.length} config objects`, 'success');\n}\n\n/**\n * Count number of managed objects of a given type\n * @param {String} type managed object type, e.g. alpha_user\n */\nexport async function countManagedObjects(type: string) {\n try {\n const result = await queryManagedObjects(type);\n printMessage(`${type}: ${result.length}`, 'data');\n } catch (error) {\n printMessage(error.response.data, 'error');\n printMessage(`Error querying managed objects by type: ${error}`, 'error');\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { frodo, state } from '@rockcarver/frodo-lib';
2
2
  import chokidar from 'chokidar';
3
3
  import fs from 'fs';
4
+ import { getFullExportConfig, isIdUsed } from '../utils/Config';
4
5
  import { createProgressIndicator, createTable, debugMessage, failSpinner, printMessage, showSpinner, spinSpinner, stopProgressIndicator, succeedSpinner, updateProgressIndicator } from '../utils/Console';
5
6
  import { getTypedFilename, isValidUrl, saveJsonToFile, saveTextToFile, titleCase } from '../utils/ExportImportUtils';
6
7
  import wordwrap from './utils/Wordwrap';
@@ -58,36 +59,64 @@ export function getTableRowMd(scriptObj) {
58
59
  /**
59
60
  * List scripts
60
61
  * @param {boolean} long detail list
62
+ * @param {boolean} usage display usage field
63
+ * @param {String | null} file Optional filename to determine usage
61
64
  * @returns {Promise<boolean>} true if no errors occurred during export, false otherwise
62
65
  */
63
- export async function listScripts(long = false) {
64
- let outcome = true;
66
+ export async function listScripts(long = false, usage = false, file = null) {
67
+ let spinnerId;
68
+ let scripts = [];
65
69
  debugMessage(`Cli.ScriptOps.listScripts: start`);
66
70
  try {
67
- const scripts = await readScripts();
71
+ spinnerId = createProgressIndicator('indeterminate', 0, `Reading scripts...`);
72
+ scripts = await readScripts();
68
73
  scripts.sort((a, b) => a.name.localeCompare(b.name));
69
- if (long) {
70
- const table = createTable(['Name', 'UUID', 'Language', 'Context', 'Description']);
71
- const langMap = {
72
- JAVASCRIPT: 'JS',
73
- GROOVY: 'Groovy'
74
- };
75
- scripts.forEach(script => {
76
- table.push([wordwrap(script.name, 25, ' '), script._id, langMap[script.language], wordwrap(titleCase(script.context.split('_').join(' ')), 25), wordwrap(script.description, 30)]);
77
- });
78
- printMessage(table.toString(), 'data');
79
- } else {
80
- scripts.forEach(script => {
81
- printMessage(`${script.name}`, 'data');
82
- });
83
- }
74
+ stopProgressIndicator(spinnerId, `Successfully read ${scripts.length} scripts.`, 'success');
84
75
  } catch (error) {
85
- outcome = false;
86
- printMessage(`Error listing scripts: ${error.message}`, 'error');
76
+ var _error$response;
77
+ stopProgressIndicator(spinnerId, `Error reading scripts: ${((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data) || error.message}`, 'fail');
87
78
  debugMessage(error);
79
+ debugMessage(`Cli.ScriptOps.listScripts: end [false]`);
80
+ return false;
88
81
  }
89
- debugMessage(`Cli.ScriptOps.listScripts: end [${outcome}]`);
90
- return outcome;
82
+ if (!long && !usage) {
83
+ scripts.forEach(script => {
84
+ printMessage(`${script.name}`, 'data');
85
+ });
86
+ debugMessage(`Cli.ScriptOps.listScripts: end [true]`);
87
+ return true;
88
+ }
89
+ let fullExport = null;
90
+ const headers = long ? ['Name', 'UUID', 'Language', 'Context', 'Description'] : ['Name'];
91
+ if (usage) {
92
+ try {
93
+ fullExport = await getFullExportConfig(file);
94
+ } catch (error) {
95
+ var _error$response2;
96
+ printMessage(`Error getting full export: ${((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data) || error.message}`, 'error');
97
+ debugMessage(`Cli.ScriptOps.listScripts: end [false]`);
98
+ return false;
99
+ }
100
+ //Delete scripts from full export so they aren't mistakenly used for determining usage
101
+ delete fullExport.script;
102
+ headers.push('Used');
103
+ }
104
+ const table = createTable(headers);
105
+ const langMap = {
106
+ JAVASCRIPT: 'JS',
107
+ GROOVY: 'Groovy'
108
+ };
109
+ scripts.forEach(script => {
110
+ const values = long ? [wordwrap(script.name, 25, ' '), script._id, langMap[script.language], wordwrap(titleCase(script.context.split('_').join(' ')), 25), wordwrap(script.description, 30)] : [wordwrap(script.name, 25, ' ')];
111
+ if (usage) {
112
+ const isScriptUsed = isIdUsed(fullExport, script._id, false);
113
+ values.push(isScriptUsed.used ? `${'yes'['brightGreen']} (at ${isScriptUsed.location})` : 'no'['brightRed']);
114
+ }
115
+ table.push(values);
116
+ });
117
+ printMessage(table.toString(), 'data');
118
+ debugMessage(`Cli.ScriptOps.listScripts: end [true]`);
119
+ return true;
91
120
  }
92
121
 
93
122
  /**