@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.
- package/CHANGELOG.md +9 -1
- package/esm/app.js +2 -0
- package/esm/app.js.map +1 -1
- package/esm/cli/admin/admin.js +0 -1
- package/esm/cli/admin/admin.js.map +1 -1
- package/esm/cli/config/config-delete.js +22 -0
- package/esm/cli/config/config-delete.js.map +1 -0
- package/esm/cli/config/config-describe.js +22 -0
- package/esm/cli/config/config-describe.js.map +1 -0
- package/esm/cli/{admin/admin-export-full-cloud-config.js → config/config-export.js} +3 -3
- package/esm/cli/config/config-export.js.map +1 -0
- package/esm/cli/config/config-import.js +22 -0
- package/esm/cli/config/config-import.js.map +1 -0
- package/esm/cli/config/config-list.js +22 -0
- package/esm/cli/config/config-list.js.map +1 -0
- package/esm/cli/config/config.js +20 -0
- package/esm/cli/config/config.js.map +1 -0
- package/esm/cli/esv/esv-secret-list.js +2 -2
- package/esm/cli/esv/esv-secret-list.js.map +1 -1
- package/esm/cli/esv/esv-variable-list.js +2 -2
- package/esm/cli/esv/esv-variable-list.js.map +1 -1
- package/esm/cli/script/script-list.js +2 -2
- package/esm/cli/script/script-list.js.map +1 -1
- package/esm/ops/AdminOps.js +1 -103
- package/esm/ops/AdminOps.js.map +1 -1
- package/esm/ops/ConfigOps.js +128 -0
- package/esm/ops/ConfigOps.js.map +1 -0
- package/esm/ops/IdmOps.js +6 -3
- package/esm/ops/IdmOps.js.map +1 -1
- package/esm/ops/ScriptOps.js +51 -22
- package/esm/ops/ScriptOps.js.map +1 -1
- package/esm/ops/SecretsOps.js +62 -40
- package/esm/ops/SecretsOps.js.map +1 -1
- package/esm/ops/VariablesOps.js +35 -15
- package/esm/ops/VariablesOps.js.map +1 -1
- package/esm/utils/Config.js +147 -1
- package/esm/utils/Config.js.map +1 -1
- package/package.json +2 -2
- package/esm/cli/admin/admin-export-full-cloud-config.js.map +0 -1
package/esm/ops/AdminOps.js.map
CHANGED
|
@@ -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),
|
|
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),
|
|
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 =
|
|
122
|
+
let configEntityString = stringify(item);
|
|
120
123
|
envParams.each((key, value) => {
|
|
121
124
|
configEntityString = replaceall(value, `\${${key}}`, configEntityString);
|
|
122
125
|
});
|
package/esm/ops/IdmOps.js.map
CHANGED
|
@@ -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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"}
|
package/esm/ops/ScriptOps.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
71
|
+
spinnerId = createProgressIndicator('indeterminate', 0, `Reading scripts...`);
|
|
72
|
+
scripts = await readScripts();
|
|
68
73
|
scripts.sort((a, b) => a.name.localeCompare(b.name));
|
|
69
|
-
|
|
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
|
-
|
|
86
|
-
|
|
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
|
-
|
|
90
|
-
|
|
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
|
/**
|