mirror of
https://github.com/actions/github-script.git
synced 2026-02-08 03:57:27 +00:00
We lose the more normal looking export in favor of the `return` statement already traditional to this action, and thus can handle await statements without an ESM conversion. This is a separate commit from the former because I think the next major version of this action should switch to ESM, revert this commit, and use the more standard export notation in all supported languages.
194 lines
5.6 KiB
TypeScript
194 lines
5.6 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
|
|
import {SupportedLanguage, interpretScript} from '../src/interpret-script'
|
|
|
|
const scripts: Record<SupportedLanguage, string> = {
|
|
[SupportedLanguage.cjs]: `
|
|
const FS = require('node:fs') // Proof that we are in CommonJS.
|
|
var a // Proof that we are NOT in TypeScript.
|
|
return foo // Proof that we executed correctly. Also, this is the pre-existing function-style syntax.
|
|
`,
|
|
[SupportedLanguage.cts]: `
|
|
const FS = require('node:fs') // Proof that we are in CommonJS.
|
|
let a: string // Proof that we are in TypeScript.
|
|
return foo // Proof that we executed correctly.
|
|
`,
|
|
[SupportedLanguage.mts]: `
|
|
import FS from 'node:fs' // Proof that we are in an ES Module.
|
|
let a: string // Proof that we are in TypeScript.
|
|
return foo // Proof that we executed correctly.
|
|
`
|
|
}
|
|
|
|
describe(interpretScript.name, () => {
|
|
describe(`language set to ${SupportedLanguage.cjs}`, () => {
|
|
test(`throws when given a ${SupportedLanguage.cts} script`, async () => {
|
|
return expect(
|
|
interpretScript(
|
|
SupportedLanguage.cjs,
|
|
{foo: 'bar', require} as any,
|
|
scripts.cts
|
|
)
|
|
).rejects
|
|
})
|
|
|
|
test(`throws when given an ${SupportedLanguage.mts} script`, async () => {
|
|
return expect(
|
|
interpretScript(
|
|
SupportedLanguage.cjs,
|
|
{foo: 'bar', require} as any,
|
|
scripts.mts
|
|
)
|
|
).rejects
|
|
})
|
|
|
|
test(`interprets a ${SupportedLanguage.cjs} script`, async () => {
|
|
return expect(
|
|
interpretScript(
|
|
SupportedLanguage.cjs,
|
|
{foo: 'bar', require} as any,
|
|
scripts.cjs
|
|
)
|
|
).resolves
|
|
})
|
|
|
|
test(`when given a ${SupportedLanguage.cjs} script returns a function that can run it correctly`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.cjs,
|
|
{foo: 'bar', require} as any,
|
|
scripts.cjs
|
|
)
|
|
return expect(result()).resolves.toEqual('bar')
|
|
})
|
|
})
|
|
|
|
describe(`language set to ${SupportedLanguage.cts}`, () => {
|
|
test(`throws when given a ${SupportedLanguage.cjs} script`, async () => {
|
|
return expect(
|
|
interpretScript(
|
|
SupportedLanguage.cts,
|
|
{foo: 'bar', require} as any,
|
|
scripts.cjs
|
|
)
|
|
).rejects
|
|
})
|
|
|
|
test(`throws when given an ${SupportedLanguage.mts} script`, async () => {
|
|
return expect(
|
|
interpretScript(
|
|
SupportedLanguage.cts,
|
|
{foo: 'bar', require} as any,
|
|
scripts.mts
|
|
)
|
|
).rejects
|
|
})
|
|
|
|
test(`interprets a ${SupportedLanguage.cts} script`, async () => {
|
|
return expect(
|
|
interpretScript(
|
|
SupportedLanguage.cts,
|
|
{foo: 'bar', require} as any,
|
|
scripts.cts
|
|
)
|
|
).resolves
|
|
})
|
|
|
|
test(`when given a ${SupportedLanguage.cts} script returns a function that can run it correctly`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.cts,
|
|
{foo: 'bar', require} as any,
|
|
scripts.cts
|
|
)
|
|
return expect(result()).resolves.toEqual('bar')
|
|
})
|
|
|
|
test(`a script imports a script from disk`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.cts,
|
|
{require} as any,
|
|
`
|
|
const {test} = require('../test/requireable')
|
|
return test()
|
|
`
|
|
)
|
|
return expect(result()).resolves.toEqual('hello')
|
|
})
|
|
})
|
|
|
|
describe(`language set to ${SupportedLanguage.mts}`, () => {
|
|
test(`throws when given a ${SupportedLanguage.cjs} script`, async () => {
|
|
return expect(
|
|
interpretScript(SupportedLanguage.mts, {foo: 'bar'} as any, scripts.cjs)
|
|
).rejects
|
|
})
|
|
|
|
test(`throws when given a ${SupportedLanguage.cts} script`, async () => {
|
|
return expect(
|
|
interpretScript(SupportedLanguage.mts, {foo: 'bar'} as any, scripts.cts)
|
|
).rejects
|
|
})
|
|
|
|
test(`interprets an ${SupportedLanguage.mts} script`, async () => {
|
|
return expect(
|
|
interpretScript(SupportedLanguage.mts, {foo: 'bar'} as any, scripts.mts)
|
|
).resolves
|
|
})
|
|
|
|
test(`when given an ${SupportedLanguage.mts} script returns a function that can run it correctly`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.mts,
|
|
{foo: 'bar'} as any,
|
|
scripts.mts
|
|
)
|
|
return expect(result()).resolves.toEqual('bar')
|
|
})
|
|
|
|
test(`can access console`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.mts,
|
|
{} as any,
|
|
`console`
|
|
)
|
|
return expect(result()).resolves
|
|
})
|
|
|
|
test(`can access process`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.mts,
|
|
{} as any,
|
|
`process`
|
|
)
|
|
return expect(result()).resolves
|
|
})
|
|
|
|
test(`a script that returns an object`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.mts,
|
|
{} as any,
|
|
`return {a: 'b'}`
|
|
)
|
|
return expect(result()).resolves.toEqual({a: 'b'})
|
|
})
|
|
|
|
test(`a script that uses a root level await`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.mts,
|
|
{} as any,
|
|
`await Promise.resolve()`
|
|
)
|
|
return expect(result()).resolves
|
|
})
|
|
|
|
test(`a script imports a script from disk`, async () => {
|
|
const result = await interpretScript(
|
|
SupportedLanguage.mts,
|
|
{require} as any,
|
|
`
|
|
const {test} = await import('../test/importable')
|
|
return test()
|
|
`
|
|
)
|
|
return expect(result()).resolves.toEqual('hello')
|
|
})
|
|
})
|
|
})
|