mirror of
https://github.com/actions/github-script.git
synced 2026-02-08 03:57:27 +00:00
Both of the .cts and .mts flavors. Because this action is written in CommonJS both have to compile to CommonJS in order to execute. As it is TypeScript there's already an expectation of some slowness, so I went with the approach of running the script via the node VM module. While a cleaner approach, it has the caveat that root level await in the script doesn't work. That should become available if https://github.com/actions/github-script/issues/457 is completed.
110 lines
3.1 KiB
TypeScript
110 lines
3.1 KiB
TypeScript
import * as core from '@actions/core'
|
|
import * as exec from '@actions/exec'
|
|
import {context, getOctokit} from '@actions/github'
|
|
import {defaults as defaultGitHubOptions} from '@actions/github/lib/utils'
|
|
import * as glob from '@actions/glob'
|
|
import * as io from '@actions/io'
|
|
import {requestLog} from '@octokit/plugin-request-log'
|
|
import {retry} from '@octokit/plugin-retry'
|
|
import {RequestRequestOptions} from '@octokit/types'
|
|
import {SupportedLanguage, interpretScript} from './interpret-script'
|
|
import {RetryOptions, getRetryOptions, parseNumberArray} from './retry-options'
|
|
import {wrapRequire} from './wrap-require'
|
|
|
|
process.on('unhandledRejection', handleError)
|
|
main().catch(handleError)
|
|
|
|
type Options = {
|
|
log?: Console
|
|
userAgent?: string
|
|
baseUrl?: string
|
|
previews?: string[]
|
|
retry?: RetryOptions
|
|
request?: RequestRequestOptions
|
|
language?: string
|
|
}
|
|
|
|
async function main(): Promise<void> {
|
|
const token = core.getInput('github-token', {required: true})
|
|
const debug = core.getBooleanInput('debug')
|
|
const userAgent = core.getInput('user-agent')
|
|
const previews = core.getInput('previews')
|
|
const baseUrl = core.getInput('base-url')
|
|
const retries = parseInt(core.getInput('retries'))
|
|
const exemptStatusCodes = parseNumberArray(
|
|
core.getInput('retry-exempt-status-codes')
|
|
)
|
|
const [retryOpts, requestOpts] = getRetryOptions(
|
|
retries,
|
|
exemptStatusCodes,
|
|
defaultGitHubOptions
|
|
)
|
|
const languageRaw = core.getInput('language')
|
|
|
|
const langValues = Object.keys(SupportedLanguage)
|
|
if (!langValues.includes(languageRaw)) {
|
|
throw new Error(
|
|
`"language" must be one of the following: "${langValues.join('", "')}"`
|
|
)
|
|
}
|
|
const language = SupportedLanguage[languageRaw as SupportedLanguage]
|
|
|
|
const opts: Options = {
|
|
log: debug ? console : undefined,
|
|
userAgent: userAgent || undefined,
|
|
previews: previews ? previews.split(',') : undefined,
|
|
retry: retryOpts,
|
|
request: requestOpts
|
|
}
|
|
|
|
// Setting `baseUrl` to undefined will prevent the default value from being used
|
|
// https://github.com/actions/github-script/issues/436
|
|
if (baseUrl) {
|
|
opts.baseUrl = baseUrl
|
|
}
|
|
|
|
const github = getOctokit(token, opts, retry, requestLog)
|
|
const script = core.getInput('script', {required: true})
|
|
|
|
const executable = await interpretScript(
|
|
language,
|
|
{
|
|
require: wrapRequire,
|
|
__original_require__: __non_webpack_require__,
|
|
github,
|
|
context,
|
|
core,
|
|
exec,
|
|
glob,
|
|
io
|
|
},
|
|
script
|
|
)
|
|
|
|
// Using property/value shorthand on `require` (e.g. `{require}`) causes compilation errors.
|
|
const result = await executable()
|
|
|
|
let encoding = core.getInput('result-encoding')
|
|
encoding = encoding ? encoding : 'json'
|
|
|
|
let output
|
|
|
|
switch (encoding) {
|
|
case 'json':
|
|
output = JSON.stringify(result)
|
|
break
|
|
case 'string':
|
|
output = String(result)
|
|
break
|
|
default:
|
|
throw new Error('"result-encoding" must be either "string" or "json"')
|
|
}
|
|
|
|
core.setOutput('result', output)
|
|
}
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
function handleError(err: any): void {
|
|
console.error(err)
|
|
core.setFailed(`Unhandled error: ${err}`)
|
|
}
|