1 Commits

Author SHA1 Message Date
Nick Alteen
65ea60d69b Add basic release management 2024-10-31 15:41:23 -04:00
33 changed files with 9593 additions and 34348 deletions

4
.eslintignore Normal file
View File

@@ -0,0 +1,4 @@
lib/
dist/
node_modules/
coverage/

50
.github/linters/.eslintrc.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
env:
commonjs: true
es6: true
jest: true
node: true
globals:
Atomics: readonly
SharedArrayBuffer: readonly
ignorePatterns:
- '!.*'
- '**/node_modules/.*'
- '**/dist/.*'
- '**/coverage/.*'
- '*.json'
parser: '@babel/eslint-parser'
parserOptions:
ecmaVersion: 2023
sourceType: module
requireConfigFile: false
babelOptions:
babelrc: false
configFile: false
presets:
- jest
plugins:
- jest
extends:
- eslint:recommended
- plugin:github/recommended
- plugin:jest/recommended
rules:
{
'camelcase': 'off',
'eslint-comments/no-use': 'off',
'eslint-comments/no-unused-disable': 'off',
'i18n-text/no-en': 'off',
'import/no-commonjs': 'off',
'import/no-namespace': 'off',
'no-console': 'off',
'no-unused-vars': 'off',
'prettier/prettier': 'error',
'semi': 'off'
}

View File

@@ -1,13 +1,7 @@
# See: https://github.com/DavidAnson/markdownlint
# Unordered list style
MD004:
style: dash
# Disable line length for tables
MD013:
tables: false
# Ordered list item prefix
MD029:
style: one

View File

@@ -1,5 +1,3 @@
# See: https://yamllint.readthedocs.io/en/stable/
rules:
document-end: disable
document-start:

View File

@@ -9,15 +9,33 @@
# expected from the build.
name: Check Transpiled JavaScript
# This workflow will only run on PRs targeting `main` and direct pushes to
# `main`. It will only run if the listed files/paths are modified (e.g. there is
# no need to run this workflow when documentation files are modified).
on:
pull_request:
branches:
- main
paths:
- src/**
- .node-version
- .prettierrc.json
- package.json
- package-lock.json
- tsconfig.json
push:
branches:
- main
paths:
- src/**
- .node-version
- .prettierrc.json
- package.json
- package-lock.json
- tsconfig.json
permissions:
checks: write
contents: read
jobs:
@@ -26,12 +44,10 @@ jobs:
runs-on: ubuntu-latest
steps:
# Checkout the repository.
- name: Checkout
id: checkout
uses: actions/checkout@v4
# Setup Node.js using the version specified in `.node-version`.
- name: Setup Node.js
id: setup-node
uses: actions/setup-node@v4
@@ -39,19 +55,17 @@ jobs:
node-version-file: .node-version
cache: npm
# Install dependencies using `npm ci`.
- name: Install Dependencies
id: install
run: npm ci
# Build the `dist/` directory.
- name: Build dist/ Directory
id: build
run: npm run bundle
# This will fail the workflow if the `dist/` directory is different than
# expected.
- name: Compare Directories
- name: Compare Expected and Actual Directories
id: diff
run: |
if [ ! -d dist/ ]; then

View File

@@ -0,0 +1,60 @@
# This workflow creates a new release any time a PR is merged that includes an
# update to the version listed in `package.json`. This ensures that the releases
# are always in sync with the version listed in the package manifest.
name: Continuous Delivery
on:
pull_request:
types:
- closed
branches:
- main
workflow_dispatch:
permissions:
contents: write
jobs:
release:
name: Release Version
runs-on: ubuntu-latest
# Only run this job if the workflow was triggered manually or a
# non-Dependabot PR was merged.
if: |
github.event_name == 'workflow_dispatch' ||
(github.event.pull_request.merged == true &&
startsWith(github.head_ref, 'dependabot/') == false)
steps:
- name: Checkout
id: checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true
# Parse the version from package.json and, if not already present,
# publish a new action version.
- name: Tag
id: tag
uses: issue-ops/semver@v2
with:
manifest-path: package.json
workspace: ${{ github.workspace }}
ref: main
# Always overwrite if the workflow was triggered manually.
overwrite: ${{ github.event_name == 'workflow_dispatch' }}
# Create a release using the tag from the previous step. The release will
# always be created if the workflow was triggered manually, but will only
# be created on PR merge if the tag step ran successfully.
- if: |
github.event_name == 'workflow_dispatch' ||
steps.tag.outcome == 'success'
name: Create Release
id: release
uses: issue-ops/releaser@v2
with:
tag: v${{ steps.tag.outputs.version }}

View File

@@ -1,3 +1,5 @@
# This workflow performs CI tests to ensure that the code reaching `main`
# has been tested and validated.
name: Continuous Integration
on:
@@ -9,6 +11,7 @@ on:
- main
permissions:
checks: write
contents: read
jobs:
@@ -57,7 +60,7 @@ jobs:
id: test-action
uses: ./
with:
milliseconds: 1000
milliseconds: 2000
- name: Print Output
id: output

View File

@@ -1,8 +1,3 @@
# This workflow will lint the entire codebase using the
# `super-linter/super-linter` action.
#
# For more information, see the super-linter repository:
# https://github.com/super-linter/super-linter
name: Lint Codebase
on:
@@ -24,14 +19,12 @@ jobs:
runs-on: ubuntu-latest
steps:
# Checkout the repository.
- name: Checkout
id: checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
# Setup Node.js using the version specified in `.node-version`.
- name: Setup Node.js
id: setup-node
uses: actions/setup-node@v4
@@ -39,12 +32,10 @@ jobs:
node-version-file: .node-version
cache: npm
# Install dependencies using `npm ci`.
- name: Install Dependencies
id: install
run: npm ci
# Lint the codebase using the `super-linter/super-linter` action.
- name: Lint Codebase
id: super-linter
uses: super-linter/super-linter/slim@v7
@@ -52,9 +43,6 @@ jobs:
DEFAULT_BRANCH: main
FILTER_REGEX_EXCLUDE: dist/**/*
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
LINTER_RULES_PATH: ${{ github.workspace }}
VALIDATE_ALL_CODEBASE: true
VALIDATE_JAVASCRIPT_ES: false
VALIDATE_JAVASCRIPT_STANDARD: false
VALIDATE_ALL_CODEBASE: true
VALIDATE_JSCPD: false
VALIDATE_JSON: false

41
.github/workflows/version-check.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
# This workflow checks the version of the action that will be published by the
# current pull request. If the version has already been published, the workflow
# fails in order to prevent PRs from being merged until the version has been
# incremented in the package.json manifest file.
name: Version Check
on:
pull_request:
branches:
- main
env:
MANIFEST_PATH: package.json
permissions:
checks: write
contents: read
pull-requests: write
jobs:
check-version:
name: Version Check
runs-on: ubuntu-latest
# Skips Dependabot PRs
if: ${{ startsWith(github.head_ref, 'dependabot/') == false }}
steps:
- name: Checkout
id: checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
fetch-tags: true
- name: Check Version
id: check-version
uses: issue-ops/semver@v2
with:
check-only: true
manifest-path: ${{ env.MANIFEST_PATH }}

View File

@@ -1 +1 @@
20.9.0
20.6.0

View File

@@ -1,4 +1,3 @@
.DS_Store
dist/
node_modules/
coverage/
coverage/

16
.prettierrc.json Normal file
View File

@@ -0,0 +1,16 @@
{
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": false,
"singleQuote": true,
"quoteProps": "as-needed",
"jsxSingleQuote": false,
"trailingComma": "none",
"bracketSpacing": true,
"bracketSameLine": true,
"arrowParens": "avoid",
"proseWrap": "always",
"htmlWhitespaceSensitivity": "css",
"endOfLine": "lf"
}

View File

@@ -1,16 +0,0 @@
# See: https://prettier.io/docs/en/configuration
printWidth: 80
tabWidth: 2
useTabs: false
semi: false
singleQuote: true
quoteProps: as-needed
jsxSingleQuote: false
trailingComma: none
bracketSpacing: true
bracketSameLine: true
arrowParens: always
proseWrap: always
htmlWhitespaceSensitivity: css
endOfLine: lf

View File

@@ -1,7 +1,3 @@
############################################################################
# Repository CODEOWNERS #
# Order is important! The last matching pattern takes the most precedence. #
############################################################################
# Repository CODEOWNERS
# Default owners, unless a later match takes precedence.
* @actions/actions-oss-maintainers

View File

@@ -229,3 +229,28 @@ steps:
id: output
run: echo "${{ steps.run-action.outputs.time }}"
```
## Publishing a New Release
This project includes two workflow files, `continuous-integration.yml` and
`continuous-delivery.yml` that are used to build, test, and publish new releases
of the action.
The `continuous-integration.yml` workflow is triggered on every push to a pull
request branch. It will run unit tests and add a comment to the pull request
with the test results.
The `continuous-delivery.yml` workflow is triggered when a pull request is
merged to the `main` branch. It will create a new release of the action based on
the version specified in the `version` property of the `package.json` file.
The steps to publish a new version are as follows:
1. Create a feature branch
1. Make changes to the action code
1. Add tests for the changes
1. Update the `version` property in the `package.json` file
1. Commit and push the changes to the feature branch
1. Open a pull request to merge the changes to the `main` branch
After the pull request is merged, a new release will be created automatically.

View File

@@ -1,12 +0,0 @@
/**
* This file is used to mock the `@actions/core` module in tests.
*/
import { jest } from '@jest/globals'
export const debug = jest.fn()
export const error = jest.fn()
export const info = jest.fn()
export const getInput = jest.fn()
export const setOutput = jest.fn()
export const setFailed = jest.fn()
export const warning = jest.fn()

View File

@@ -1,3 +0,0 @@
import { jest } from '@jest/globals'
export const wait = jest.fn()

18
__tests__/index.test.js Normal file
View File

@@ -0,0 +1,18 @@
/**
* Unit tests for the action's entrypoint, src/index.js
*/
const { run } = require('../src/main')
// Mock the action's entrypoint
jest.mock('../src/main', () => ({
run: jest.fn()
}))
describe('index', () => {
it('calls run when imported', async () => {
require('../src/index')
expect(run).toHaveBeenCalled()
})
})

View File

@@ -1,62 +1,96 @@
/**
* Unit tests for the action's main functionality, src/main.js
*
* To mock dependencies in ESM, you can create fixtures that export mock
* functions and objects. For example, the core module is mocked in this test,
* so that the actual '@actions/core' module is not imported.
*/
import { jest } from '@jest/globals'
import * as core from '../__fixtures__/core.js'
import { wait } from '../__fixtures__/wait.js'
const core = require('@actions/core')
const main = require('../src/main')
// Mocks should be declared before the module being tested is imported.
jest.unstable_mockModule('@actions/core', () => core)
jest.unstable_mockModule('../src/wait.js', () => ({ wait }))
// Mock the GitHub Actions core library
const debugMock = jest.spyOn(core, 'debug').mockImplementation()
const getInputMock = jest.spyOn(core, 'getInput').mockImplementation()
const setFailedMock = jest.spyOn(core, 'setFailed').mockImplementation()
const setOutputMock = jest.spyOn(core, 'setOutput').mockImplementation()
// The module being tested should be imported dynamically. This ensures that the
// mocks are used in place of any actual dependencies.
const { run } = await import('../src/main.js')
// Mock the action's main function
const runMock = jest.spyOn(main, 'run')
describe('main.js', () => {
// Other utilities
const timeRegex = /^\d{2}:\d{2}:\d{2}/
describe('action', () => {
beforeEach(() => {
// Set the action's inputs as return values from core.getInput().
core.getInput.mockImplementation(() => '500')
// Mock the wait function so that it does not actually wait.
wait.mockImplementation(() => Promise.resolve('done!'))
jest.clearAllMocks()
})
afterEach(() => {
jest.resetAllMocks()
})
it('sets the time output', async () => {
// Set the action's inputs as return values from core.getInput()
getInputMock.mockImplementation(name => {
switch (name) {
case 'milliseconds':
return '500'
default:
return ''
}
})
it('Sets the time output', async () => {
await run()
await main.run()
expect(runMock).toHaveReturned()
// Verify the time output was set.
expect(core.setOutput).toHaveBeenNthCalledWith(
// Verify that all of the core library functions were called correctly
expect(debugMock).toHaveBeenNthCalledWith(1, 'Waiting 500 milliseconds ...')
expect(debugMock).toHaveBeenNthCalledWith(
2,
expect.stringMatching(timeRegex)
)
expect(debugMock).toHaveBeenNthCalledWith(
3,
expect.stringMatching(timeRegex)
)
expect(setOutputMock).toHaveBeenNthCalledWith(
1,
'time',
// Simple regex to match a time string in the format HH:MM:SS.
expect.stringMatching(/^\d{2}:\d{2}:\d{2}/)
expect.stringMatching(timeRegex)
)
})
it('Sets a failed status', async () => {
// Clear the getInput mock and return an invalid value.
core.getInput.mockClear().mockReturnValueOnce('this is not a number')
it('sets a failed status', async () => {
// Set the action's inputs as return values from core.getInput()
getInputMock.mockImplementation(name => {
switch (name) {
case 'milliseconds':
return 'this is not a number'
default:
return ''
}
})
// Clear the wait mock and return a rejected promise.
wait
.mockClear()
.mockRejectedValueOnce(new Error('milliseconds is not a number'))
await main.run()
expect(runMock).toHaveReturned()
await run()
// Verify that the action was marked as failed.
expect(core.setFailed).toHaveBeenNthCalledWith(
// Verify that all of the core library functions were called correctly
expect(setFailedMock).toHaveBeenNthCalledWith(
1,
'milliseconds is not a number'
'milliseconds not a number'
)
})
it('fails if no input is provided', async () => {
// Set the action's inputs as return values from core.getInput()
getInputMock.mockImplementation(name => {
switch (name) {
case 'milliseconds':
throw new Error('Input required and not supplied: milliseconds')
default:
return ''
}
})
await main.run()
expect(runMock).toHaveReturned()
// Verify that all of the core library functions were called correctly
expect(setFailedMock).toHaveBeenNthCalledWith(
1,
'Input required and not supplied: milliseconds'
)
})
})

View File

@@ -1,18 +1,18 @@
/**
* Unit tests for src/wait.js
*/
import { wait } from '../src/wait.js'
const { wait } = require('../src/wait')
const { expect } = require('@jest/globals')
describe('wait.js', () => {
it('Throws an invalid number', async () => {
it('throws an invalid number', async () => {
const input = parseInt('foo', 10)
expect(isNaN(input)).toBe(true)
await expect(wait(input)).rejects.toThrow('milliseconds is not a number')
await expect(wait(input)).rejects.toThrow('milliseconds not a number')
})
it('Waits with a valid number', async () => {
it('waits with a valid number', async () => {
const start = new Date()
await wait(500)
const end = new Date()

View File

@@ -1,23 +1,18 @@
name: The name of your action here
description: Provide a description here
author: Your name or organization here
# Add your action's branding here. This will appear on the GitHub Marketplace.
branding:
icon: heart
color: red
name: 'The name of your action here'
description: 'Provide a description here'
author: 'Your name or organization here'
# Define your inputs here.
inputs:
milliseconds:
description: Your input description here
description: 'Your input description here'
required: true
default: '1000'
# Define your outputs here.
outputs:
time:
description: Your output description here
description: 'Your output description here'
runs:
using: node20

30872
dist/index.js generated vendored

File diff suppressed because one or more lines are too long

2
dist/index.js.map generated vendored

File diff suppressed because one or more lines are too long

179
dist/licenses.txt generated vendored
View File

@@ -1,13 +1,5 @@
Name: @actions/core
Version: 1.11.1
License: MIT
Private: false
Description: Actions core lib
Repository: git+https://github.com/actions/toolkit.git
Homepage: https://github.com/actions/toolkit/tree/main/packages/core
License Copyright:
===
@actions/core
MIT
The MIT License (MIT)
Copyright 2019 GitHub
@@ -18,18 +10,20 @@ The above copyright notice and this permission notice shall be included in all c
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
@actions/exec
MIT
The MIT License (MIT)
Name: @actions/http-client
Version: 2.2.3
License: MIT
Private: false
Description: Actions Http Client
Repository: git+https://github.com/actions/toolkit.git
Homepage: https://github.com/actions/toolkit/tree/main/packages/http-client
License Copyright:
===
Copyright 2019 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@actions/http-client
MIT
Actions Http Client for Node.js
Copyright (c) GitHub, Inc.
@@ -52,19 +46,21 @@ NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
Name: tunnel
Version: 0.0.6
License: MIT
Private: false
Description: Node HTTP/HTTPS Agents for tunneling proxies
Repository: https://github.com/koichik/node-tunnel.git
Homepage: https://github.com/koichik/node-tunnel/
Author: Koichi Kobayashi <koichik@improvement.jp>
License Copyright:
===
@actions/io
MIT
The MIT License (MIT)
Copyright 2019 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tunnel
MIT
The MIT License (MIT)
Copyright (c) 2012 Koichi Kobayashi
@@ -86,124 +82,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
---
Name: undici
Version: 5.28.5
License: MIT
Private: false
Description: An HTTP/1.1 client, written from scratch for Node.js
Repository: git+https://github.com/nodejs/undici.git
Homepage: https://undici.nodejs.org
Contributors:
Daniele Belardi (https://github.com/dnlup)
Ethan Arrowood (https://github.com/ethan-arrowood)
Matteo Collina (https://github.com/mcollina)
Matthew Aitken (https://github.com/KhafraDev)
Robert Nagy (https://github.com/ronag)
Szymon Marczak (https://github.com/szmarczak)
Tomas Della Vedova (https://github.com/delvedor)
License Copyright:
===
MIT License
Copyright (c) Matteo Collina and Undici contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
---
Name: @fastify/busboy
Version: 2.1.1
License: MIT
Private: false
Description: A streaming parser for HTML form data for node.js
Repository: git+https://github.com/fastify/busboy.git
Author: Brian White <mscdex@mscdex.net>
Contributors:
Igor Savin <kibertoad@gmail.com> (https://github.com/kibertoad)
Aras Abbasi <aras.abbasi@gmail.com> (https://github.com/uzlopak)
License Copyright:
===
Copyright Brian White. All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
---
Name: @actions/exec
Version: 1.1.1
License: MIT
Private: false
Description: Actions exec lib
Repository: git+https://github.com/actions/toolkit.git
Homepage: https://github.com/actions/toolkit/tree/main/packages/exec
License Copyright:
===
The MIT License (MIT)
Copyright 2019 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
Name: @actions/io
Version: 1.1.3
License: MIT
Private: false
Description: Actions io lib
Repository: git+https://github.com/actions/toolkit.git
Homepage: https://github.com/actions/toolkit/tree/main/packages/io
License Copyright:
===
The MIT License (MIT)
Copyright 2019 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

1
dist/sourcemap-register.js generated vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -1,61 +0,0 @@
// See: https://eslint.org/docs/latest/use/configure/configuration-files
import { fixupPluginRules } from '@eslint/compat'
import { FlatCompat } from '@eslint/eslintrc'
import js from '@eslint/js'
import _import from 'eslint-plugin-import'
import jest from 'eslint-plugin-jest'
import prettier from 'eslint-plugin-prettier'
import globals from 'globals'
import path from 'node:path'
import { fileURLToPath } from 'node:url'
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const compat = new FlatCompat({
baseDirectory: __dirname,
recommendedConfig: js.configs.recommended,
allConfig: js.configs.all
})
export default [
{
ignores: ['**/coverage', '**/dist', '**/linter', '**/node_modules']
},
...compat.extends(
'eslint:recommended',
'plugin:jest/recommended',
'plugin:prettier/recommended'
),
{
plugins: {
import: fixupPluginRules(_import),
jest,
prettier
},
languageOptions: {
globals: {
...globals.node,
...globals.jest,
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
ecmaVersion: 2023,
sourceType: 'module'
},
rules: {
camelcase: 'off',
'eslint-comments/no-use': 'off',
'eslint-comments/no-unused-disable': 'off',
'i18n-text/no-en': 'off',
'import/no-namespace': 'off',
'no-console': 'off',
'no-shadow': 'off',
'no-unused-vars': 'off',
'prettier/prettier': 'error'
}
}
]

View File

@@ -1,30 +0,0 @@
// See: https://jestjs.io/docs/configuration
/** @type {import('jest').Config} */
const jestConfig = {
clearMocks: true,
collectCoverage: true,
collectCoverageFrom: ['./src/**'],
coverageDirectory: './coverage',
coveragePathIgnorePatterns: ['/node_modules/', '/dist/'],
coverageReporters: ['json-summary', 'text', 'lcov'],
// Uncomment the below lines if you would like to enforce a coverage threshold
// for your action. This will fail the build if the coverage is below the
// specified thresholds.
// coverageThreshold: {
// global: {
// branches: 100,
// functions: 100,
// lines: 100,
// statements: 100
// }
// },
moduleFileExtensions: ['js'],
reporters: ['default'],
testEnvironment: 'node',
testMatch: ['**/*.test.js'],
testPathIgnorePatterns: ['/dist/', '/node_modules/'],
verbose: true
}
export default jestConfig

12222
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,6 @@
"description": "GitHub Actions JavaScript Template",
"version": "0.0.0",
"author": "",
"type": "module",
"private": true,
"homepage": "https://github.com/actions/javascript-action#readme",
"repository": {
@@ -14,7 +13,9 @@
"url": "https://github.com/actions/javascript-action/issues"
},
"keywords": [
"actions"
"GitHub",
"Actions",
"JavaScript"
],
"exports": {
".": "./dist/index.js"
@@ -24,40 +25,59 @@
},
"scripts": {
"bundle": "npm run format:write && npm run package",
"ci-test": "NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 npx jest",
"ci-test": "npx jest",
"coverage": "npx make-coverage-badge --output-path ./badges/coverage.svg",
"format:write": "npx prettier --write .",
"format:check": "npx prettier --check .",
"lint": "npx eslint .",
"local-action": "npx local-action . src/main.js .env",
"package": "npx rollup --config rollup.config.js",
"lint": "npx eslint . -c ./.github/linters/.eslintrc.yml",
"package": "npx ncc build src/index.js -o dist --source-map --license licenses.txt",
"package:watch": "npm run package -- --watch",
"test": "NODE_OPTIONS=--experimental-vm-modules NODE_NO_WARNINGS=1 npx jest",
"test": "npx jest",
"all": "npm run format:write && npm run lint && npm run test && npm run coverage && npm run package"
},
"license": "MIT",
"eslintConfig": {
"extends": "./.github/linters/.eslintrc.yml"
},
"jest": {
"verbose": true,
"clearMocks": true,
"testEnvironment": "node",
"moduleFileExtensions": [
"js"
],
"testMatch": [
"**/*.test.js"
],
"testPathIgnorePatterns": [
"/node_modules/",
"/dist/"
],
"coverageReporters": [
"json-summary",
"text",
"lcov"
],
"collectCoverage": true,
"collectCoverageFrom": [
"./src/**"
]
},
"dependencies": {
"@actions/core": "^1.11.1"
},
"devDependencies": {
"@eslint/compat": "^1.2.6",
"@github/local-action": "^2.6.1",
"@jest/globals": "^29.7.0",
"@rollup/plugin-commonjs": "^28.0.2",
"@rollup/plugin-node-resolve": "^16.0.0",
"eslint": "^9.20.1",
"eslint-config-prettier": "^10.0.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jest": "^28.11.0",
"eslint-plugin-prettier": "^5.2.3",
"@babel/core": "^7.26.0",
"@babel/eslint-parser": "^7.25.9",
"@babel/preset-env": "^7.26.0",
"@github/local-action": "^2.1.2",
"@vercel/ncc": "^0.38.2",
"babel-preset-jest": "^29.6.3",
"eslint": "^8.57.1",
"eslint-plugin-github": "^5.0.2",
"eslint-plugin-jest": "^28.8.3",
"jest": "^29.7.0",
"make-coverage-badge": "^1.2.0",
"prettier": "^3.5.0",
"prettier-eslint": "^16.3.0",
"rollup": "^4.34.6",
"rollup-plugin-license": "^3.5.3"
},
"optionalDependencies": {
"@rollup/rollup-linux-x64-gnu": "*"
"prettier": "^3.3.3"
}
}

View File

@@ -1,27 +0,0 @@
// See: https://rollupjs.org/introduction/
import commonjs from '@rollup/plugin-commonjs'
import { nodeResolve } from '@rollup/plugin-node-resolve'
import license from 'rollup-plugin-license'
const config = {
input: 'src/index.js',
output: {
esModule: true,
file: 'dist/index.js',
format: 'es',
sourcemap: true
},
plugins: [
commonjs(),
nodeResolve({ preferBuiltins: true }),
license({
sourcemap: true,
thirdParty: {
output: 'dist/licenses.txt'
}
})
]
}
export default config

View File

@@ -1,8 +1,6 @@
/**
* The entrypoint for the action. This file simply imports and runs the action's
* main logic.
* The entrypoint for the action.
*/
import { run } from './main.js'
const { run } = require('./main')
/* istanbul ignore next */
run()

View File

@@ -1,14 +1,13 @@
import * as core from '@actions/core'
import { wait } from './wait.js'
const core = require('@actions/core')
const { wait } = require('./wait')
/**
* The main function for the action.
*
* @returns {Promise<void>} Resolves when the action is complete.
*/
export async function run() {
async function run() {
try {
const ms = core.getInput('milliseconds')
const ms = core.getInput('milliseconds', { required: true })
// Debug logs are only output if the `ACTIONS_STEP_DEBUG` secret is true
core.debug(`Waiting ${ms} milliseconds ...`)
@@ -22,6 +21,10 @@ export async function run() {
core.setOutput('time', new Date().toTimeString())
} catch (error) {
// Fail the workflow run if an error occurs
if (error instanceof Error) core.setFailed(error.message)
core.setFailed(error.message)
}
}
module.exports = {
run
}

View File

@@ -1,13 +1,17 @@
/**
* Waits for a number of milliseconds.
* Wait for a number of milliseconds.
*
* @param {number} milliseconds The number of milliseconds to wait.
* @returns {Promise<string>} Resolves with 'done!' after the wait is over.
*/
export async function wait(milliseconds) {
return new Promise((resolve) => {
if (isNaN(milliseconds)) throw new Error('milliseconds is not a number')
async function wait(milliseconds) {
return new Promise(resolve => {
if (isNaN(milliseconds)) {
throw new Error('milliseconds not a number')
}
setTimeout(() => resolve('done!'), milliseconds)
})
}
module.exports = { wait }