mirror of
https://github.com/actions/javascript-action.git
synced 2026-01-07 13:17:36 +08:00
Compare commits
1 Commits
ncalteen/l
...
ncalteen/r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
65ea60d69b |
4
.eslintignore
Normal file
4
.eslintignore
Normal file
@@ -0,0 +1,4 @@
|
||||
lib/
|
||||
dist/
|
||||
node_modules/
|
||||
coverage/
|
||||
50
.github/linters/.eslintrc.yml
vendored
Normal file
50
.github/linters/.eslintrc.yml
vendored
Normal 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'
|
||||
}
|
||||
@@ -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
|
||||
@@ -1,5 +1,3 @@
|
||||
# See: https://yamllint.readthedocs.io/en/stable/
|
||||
|
||||
rules:
|
||||
document-end: disable
|
||||
document-start:
|
||||
24
.github/workflows/check-dist.yml
vendored
24
.github/workflows/check-dist.yml
vendored
@@ -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
|
||||
|
||||
60
.github/workflows/continuous-delivery.yml
vendored
Normal file
60
.github/workflows/continuous-delivery.yml
vendored
Normal 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 }}
|
||||
@@ -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
|
||||
14
.github/workflows/linter.yml
vendored
14
.github/workflows/linter.yml
vendored
@@ -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
41
.github/workflows/version-check.yml
vendored
Normal 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 }}
|
||||
@@ -1 +1 @@
|
||||
20.9.0
|
||||
20.6.0
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
.DS_Store
|
||||
dist/
|
||||
node_modules/
|
||||
coverage/
|
||||
coverage/
|
||||
16
.prettierrc.json
Normal file
16
.prettierrc.json
Normal 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"
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
25
README.md
25
README.md
@@ -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.
|
||||
|
||||
@@ -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()
|
||||
@@ -1,3 +0,0 @@
|
||||
import { jest } from '@jest/globals'
|
||||
|
||||
export const wait = jest.fn()
|
||||
18
__tests__/index.test.js
Normal file
18
__tests__/index.test.js
Normal 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()
|
||||
})
|
||||
})
|
||||
@@ -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'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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()
|
||||
|
||||
15
action.yml
15
action.yml
@@ -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
30872
dist/index.js
generated
vendored
File diff suppressed because one or more lines are too long
2
dist/index.js.map
generated
vendored
2
dist/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
179
dist/licenses.txt
generated
vendored
179
dist/licenses.txt
generated
vendored
@@ -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
1
dist/sourcemap-register.js
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -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'
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -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
12222
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
68
package.json
68
package.json
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -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()
|
||||
|
||||
15
src/main.js
15
src/main.js
@@ -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
|
||||
}
|
||||
|
||||
12
src/wait.js
12
src/wait.js
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user