Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ module.exports = {
testEnvironment: 'node',
testMatch: ['**/__tests__/*.test.ts'],
transform: {
'^.+\\.ts$': 'ts-jest'
'^.+\\.ts$': ['ts-jest', {isolatedModules: true, diagnostics: {warnOnly: true}}]
},
verbose: true
}
6 changes: 5 additions & 1 deletion packages/core/RELEASES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# @actions/core Releases

### 1.11.1
## 2.0.0
- Add support for Node 24 [#2110](https://github.com/actions/toolkit/pull/2110)
- Bump @actions/http-client from 2.0.1 to 3.0.0

## 1.11.1
- Fix uses of `crypto.randomUUID` on Node 18 and earlier [#1842](https://github.com/actions/toolkit/pull/1842)

### 1.11.0
Expand Down
59 changes: 48 additions & 11 deletions packages/core/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@actions/core",
"version": "1.11.1",
"version": "2.0.0",
"description": "Actions core lib",
"keywords": [
"github",
Expand Down Expand Up @@ -37,7 +37,7 @@
},
"dependencies": {
"@actions/exec": "^1.1.1",
"@actions/http-client": "^2.0.1"
"@actions/http-client": "^3.0.0"
},
"devDependencies": {
"@types/node": "^16.18.112"
Expand Down
71 changes: 11 additions & 60 deletions packages/exec/__tests__/exec.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ import * as io from '@actions/io'
/* eslint-disable @typescript-eslint/unbound-method */

const IS_WINDOWS = process.platform === 'win32'
const SPAWN_WAIT_FOR_FILE = path.join(
__dirname,
'scripts',
'spawn-wait-for-file.js'
)

let outstream: stream.Writable
let errstream: stream.Writable
Expand Down Expand Up @@ -365,35 +370,18 @@ describe('@actions/exec', () => {
fs.writeFileSync(semaphorePath, '')

const nodePath = await io.which('node', true)
const scriptPath = path.join(__dirname, 'scripts', 'wait-for-file.js')
const debugList: string[] = []
const _testExecOptions = getExecOptions()
_testExecOptions.delay = 500
_testExecOptions.windowsVerbatimArguments = true
_testExecOptions.listeners = {
debug: (data: string) => {
debugList.push(data)
}
}

let exitCode: number
if (IS_WINDOWS) {
const toolName: string = await io.which('cmd.exe', true)
const args = [
'/D', // Disable execution of AutoRun commands from registry.
'/E:ON', // Enable command extensions. Note, command extensions are enabled by default, unless disabled via registry.
'/V:OFF', // Disable delayed environment expansion. Note, delayed environment expansion is disabled by default, unless enabled via registry.
'/S', // Will cause first and last quote after /C to be stripped.
'/C',
`"start "" /B "${nodePath}" "${scriptPath}" "file=${semaphorePath}""`
]
exitCode = await exec.exec(`"${toolName}"`, args, _testExecOptions)
} else {
const toolName: string = await io.which('bash', true)
const args = ['-c', `node '${scriptPath}' 'file=${semaphorePath}' &`]
const args = [SPAWN_WAIT_FOR_FILE, `file=${semaphorePath}`]

exitCode = await exec.exec(`"${toolName}"`, args, _testExecOptions)
}
const exitCode = await exec.exec(`"${nodePath}"`, args, _testExecOptions)

expect(exitCode).toBe(0)
expect(
Expand All @@ -411,36 +399,19 @@ describe('@actions/exec', () => {
fs.writeFileSync(semaphorePath, '')

const nodePath = await io.which('node', true)
const scriptPath = path.join(__dirname, 'scripts', 'wait-for-file.js')
const debugList: string[] = []
const _testExecOptions = getExecOptions()
_testExecOptions.delay = 500
_testExecOptions.windowsVerbatimArguments = true
_testExecOptions.listeners = {
debug: (data: string) => {
debugList.push(data)
}
}

let toolName: string
let args: string[]
if (IS_WINDOWS) {
toolName = await io.which('cmd.exe', true)
args = [
'/D', // Disable execution of AutoRun commands from registry.
'/E:ON', // Enable command extensions. Note, command extensions are enabled by default, unless disabled via registry.
'/V:OFF', // Disable delayed environment expansion. Note, delayed environment expansion is disabled by default, unless enabled via registry.
'/S', // Will cause first and last quote after /C to be stripped.
'/C',
`"start "" /B "${nodePath}" "${scriptPath}" "file=${semaphorePath}"" & exit /b 123`
]
} else {
toolName = await io.which('bash', true)
args = ['-c', `node '${scriptPath}' 'file=${semaphorePath}' & exit 123`]
}
const args = [SPAWN_WAIT_FOR_FILE, `file=${semaphorePath}`, 'exitCode=123']

await exec
.exec(`"${toolName}"`, args, _testExecOptions)
.exec(`"${nodePath}"`, args, _testExecOptions)
.then(() => {
throw new Error('Should not have succeeded')
})
Expand All @@ -465,40 +436,20 @@ describe('@actions/exec', () => {
fs.writeFileSync(semaphorePath, '')

const nodePath = await io.which('node', true)
const scriptPath = path.join(__dirname, 'scripts', 'wait-for-file.js')
const debugList: string[] = []
const _testExecOptions = getExecOptions()
_testExecOptions.delay = 500
_testExecOptions.failOnStdErr = true
_testExecOptions.windowsVerbatimArguments = true
_testExecOptions.listeners = {
debug: (data: string) => {
debugList.push(data)
}
}

let toolName: string
let args: string[]
if (IS_WINDOWS) {
toolName = await io.which('cmd.exe', true)
args = [
'/D', // Disable execution of AutoRun commands from registry.
'/E:ON', // Enable command extensions. Note, command extensions are enabled by default, unless disabled via registry.
'/V:OFF', // Disable delayed environment expansion. Note, delayed environment expansion is disabled by default, unless enabled via registry.
'/S', // Will cause first and last quote after /C to be stripped.
'/C',
`"start "" /B "${nodePath}" "${scriptPath}" "file=${semaphorePath}"" & echo hi 1>&2`
]
} else {
toolName = await io.which('bash', true)
args = [
'-c',
`node '${scriptPath}' 'file=${semaphorePath}' & echo hi 1>&2`
]
}
const args = [SPAWN_WAIT_FOR_FILE, `file=${semaphorePath}`, 'stderr=true']

await exec
.exec(`"${toolName}"`, args, _testExecOptions)
.exec(`"${nodePath}"`, args, _testExecOptions)
.then(() => {
throw new Error('Should not have succeeded')
})
Expand Down
51 changes: 51 additions & 0 deletions packages/exec/__tests__/scripts/spawn-wait-for-file.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
const childProcess = require('child_process')
const path = require('path')

function parseArgs() {
const result = {}
for (const arg of process.argv.slice(2)) {
const equalsIndex = arg.indexOf('=')
if (equalsIndex === -1) {
continue
}
const key = arg.slice(0, equalsIndex)
const value = arg.slice(equalsIndex + 1)
result[key] = value
}

return result
}

const args = parseArgs()
const filePath = args.file
if (!filePath) {
throw new Error('file is not specified')
}

const waitScript = path.join(__dirname, 'wait-for-file.js')
const waitArgs = [waitScript, `file=${filePath}`]

// Spawn with inherited stdio and detached on Unix, non-detached on Windows
// This keeps the streams open after parent exits
const isWindows = process.platform === 'win32'
const spawnOptions = {
stdio: 'inherit',
detached: !isWindows
}

// On Windows, we need to hide the window
if (isWindows) {
spawnOptions.windowsHide = true
}

const waitProcess = childProcess.spawn(process.execPath, waitArgs, spawnOptions)

// Unref so parent doesn't wait for child
waitProcess.unref()

if (args.stderr === 'true') {
process.stderr.write('hi')
}

const exitCode = args.exitCode ? parseInt(args.exitCode, 10) : 0
process.exit(exitCode)
4 changes: 2 additions & 2 deletions packages/exec/__tests__/scripts/stdoutputspecial.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
//first half of © character
process.stdout.write(Buffer.from([0xC2]), (err) => {
process.stdout.write(Buffer.from([0xC2]), () => {
//write in the callback so that the second byte is sent separately
setTimeout(() => {
process.stdout.write(Buffer.from([0xA9])) //second half of © character
}, 5000)
}, 100)

})
11 changes: 11 additions & 0 deletions packages/glob/__tests__/hash-files.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {hashFiles} from '../src/glob'
import {promises as fs} from 'fs'

const IS_WINDOWS = process.platform === 'win32'
const ORIGINAL_GITHUB_WORKSPACE = process.env['GITHUB_WORKSPACE']

/**
* These test focus on the ability of globber to find files
Expand All @@ -12,6 +13,16 @@ const IS_WINDOWS = process.platform === 'win32'
describe('globber', () => {
beforeAll(async () => {
await io.rmRF(getTestTemp())
process.env['GITHUB_WORKSPACE'] = __dirname
})

afterAll(async () => {
if (ORIGINAL_GITHUB_WORKSPACE) {
process.env['GITHUB_WORKSPACE'] = ORIGINAL_GITHUB_WORKSPACE
} else {
delete process.env['GITHUB_WORKSPACE']
}
await io.rmRF(getTestTemp())
})

it('basic hashfiles test', async () => {
Expand Down
Loading