build-scripts/generateRunners.ts (88 lines of code) (raw):
/*!
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: MIT
*/
import * as fs from 'fs'
import * as path from 'path'
interface RunnerGenerator {
taskName: string
taskClients: string[]
additionalImports?: string[]
additionalArguments?: string[]
additionalSetupStatements?: string[]
successResult?: string
returnType?: string
}
const repoRoot = path.dirname(__dirname)
const header = `
/*!
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: MIT
*/
/* NOTE! this file is auto-generated by generateRunners.ts, do not edit it by hand or commit it */
`
function generate(
filename: string,
clientTypes: string[],
additionalArguments?: string[],
additionalImports?: string[],
additionalSetupStatements?: string[],
successResult?: string,
returnType?: string
) {
const importStament = `
import * as tl from 'azure-pipelines-task-lib/task'
import { SdkUtils } from 'lib/sdkutils'
import { warnIfBuildAgentTooLow } from 'lib/vstsUtils'
${
clientTypes === undefined
? ''
: `\nimport { ${clientTypes.map(it => 'createDefault' + it).join(', ')} } from 'lib/defaultClients'`
}
import { TaskOperations } from './TaskOperations'
import { buildTaskParameters } from './TaskParameters'${
additionalImports === undefined ? '' : '\n\n' + additionalImports.join('\n ')
}
`
const runStatement = `
async function run(): Promise<${returnType === undefined ? 'void' : returnType}> {
SdkUtils.readResources()${
additionalSetupStatements === undefined ? '' : '\n ' + additionalSetupStatements.join('\n ')
}
const taskParameters = buildTaskParameters()
return new TaskOperations(${
clientTypes === undefined
? ''
: '\n ' +
clientTypes
.map(it => {
// tslint:disable-next-line:prefer-template
return 'await createDefault' + it + '(taskParameters, tl.debug),'
})
.join('\n ')
}${
// tslint:disable-next-line:prefer-template
additionalArguments === undefined ? '' : '\n ' + additionalArguments.join(',\n ') + ','
}
taskParameters).execute()
}
`
// TODO: Optionally output "TaskResult.SucceededWithIssues" depending on result?
const run = `
run().then((result) => {
tl.setResult(tl.TaskResult.Succeeded, '')
}).catch((error) => {
tl.setResult(tl.TaskResult.Failed, \`\${error}\`)
})
`
const output = header + importStament + runStatement + run
fs.writeFileSync(`src/tasks/${filename}/${filename}.runner.ts`, output)
}
const generateFile = path.join(repoRoot, 'generate.json')
const parsedJson = JSON.parse(fs.readFileSync(generateFile).toString()) as RunnerGenerator[]
for (const json of parsedJson) {
generate(
json.taskName,
json.taskClients,
json.additionalArguments,
json.additionalImports,
json.additionalSetupStatements,
json.successResult,
json.returnType
)
}