dd-trace
Version:
Datadog APM tracing client for JavaScript
84 lines (73 loc) • 2.62 kB
JavaScript
'use strict'
const {
getCommandDetails,
serializeDisplayCommand,
} = require('./command-runner')
const { sanitizeEnv } = require('./redaction')
/**
* Builds the normalized CI command metadata shape shared by reports and UI payloads.
*
* @param {object} framework manifest framework entry
* @returns {object|undefined} CI command candidate context when available
*/
function buildCiCommandCandidate (framework) {
const ciWiring = framework.ciWiring || {}
const command = framework.ciWiringCommand
if (!command && !hasCiWiringContext(ciWiring)) return
return removeUndefined({
provider: ciWiring.provider || undefined,
configFile: ciWiring.configFile || undefined,
workflow: ciWiring.workflow || undefined,
job: ciWiring.job || undefined,
step: ciWiring.step || undefined,
runner: ciWiring.runner || undefined,
shell: ciWiring.shell || undefined,
command: command ? serializeDisplayCommand(command) : ciWiring.command,
cwd: command?.cwd || ciWiring.workingDirectory,
whySelected: ciWiring.whySelected || ciWiring.selectionReason || ciWiring.diagnosis,
replayability: ciWiring.replayability,
replayBlocker: ciWiring.replayBlocker,
initialization: ciWiring.initialization,
env: buildCiEnvSummary(ciWiring, command),
packageScriptExpansionChain: getFirstArray(
ciWiring.packageScriptExpansionChain,
ciWiring.scriptExpansionChain,
ciWiring.commandExpansion
),
runnerToolChain: getFirstArray(
ciWiring.runnerToolChain,
ciWiring.toolChain,
ciWiring.commandChain
),
setupCommandIds: ciWiring.setupCommandIds,
unresolved: ciWiring.unresolved,
commandDetails: command && getCommandDetails(command),
})
}
function buildCiEnvSummary (ciWiring, command) {
const summary = removeUndefined({
workflow: sanitizeEnv(ciWiring.workflowEnv || ciWiring.env?.workflow),
job: sanitizeEnv(ciWiring.jobEnv || ciWiring.env?.job),
step: sanitizeEnv(ciWiring.stepEnv || command?.env || ciWiring.env?.step),
inherited: sanitizeEnv(ciWiring.inheritedEnv),
})
return Object.keys(summary).length > 0 ? summary : undefined
}
function hasCiWiringContext (ciWiring) {
return Object.keys(ciWiring).length > 0
}
function getFirstArray (...values) {
for (const value of values) {
if (Array.isArray(value) && value.length > 0) return value
}
}
function removeUndefined (object) {
const result = {}
for (const [key, value] of Object.entries(object)) {
if (value !== undefined) result[key] = value
}
return result
}
module.exports = {
buildCiCommandCandidate,
}