mirror of
https://github.com/LukeHagar/stats-action.git
synced 2025-12-06 04:21:26 +00:00
Initial commit
This commit is contained in:
42
.devcontainer/devcontainer.json
Normal file
42
.devcontainer/devcontainer.json
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{
|
||||||
|
"name": "GitHub Actions (JavaScript)",
|
||||||
|
"image": "mcr.microsoft.com/devcontainers/javascript-node:20",
|
||||||
|
"postCreateCommand": "npm install",
|
||||||
|
"customizations": {
|
||||||
|
"codespaces": {
|
||||||
|
"openFiles": ["README.md"]
|
||||||
|
},
|
||||||
|
"vscode": {
|
||||||
|
"extensions": [
|
||||||
|
"bierner.markdown-preview-github-styles",
|
||||||
|
"davidanson.vscode-markdownlint",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"esbenp.prettier-vscode",
|
||||||
|
"github.copilot",
|
||||||
|
"github.copilot-chat",
|
||||||
|
"github.vscode-github-actions",
|
||||||
|
"github.vscode-pull-request-github",
|
||||||
|
"me-dutour-mathieu.vscode-github-actions",
|
||||||
|
"redhat.vscode-yaml",
|
||||||
|
"rvest.vs-code-prettier-eslint",
|
||||||
|
"yzhang.markdown-all-in-one"
|
||||||
|
],
|
||||||
|
"settings": {
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
|
"editor.tabSize": 2,
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"markdown.extension.list.indentationSize": "adaptive",
|
||||||
|
"markdown.extension.italic.indicator": "_",
|
||||||
|
"markdown.extension.orderedList.marker": "one"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"remoteEnv": {
|
||||||
|
"GITHUB_TOKEN": "${localEnv:GITHUB_TOKEN}"
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"ghcr.io/devcontainers/features/git-lfs:1": {},
|
||||||
|
"ghcr.io/devcontainers/features/github-cli:1": {},
|
||||||
|
"ghcr.io/devcontainers-contrib/features/prettier:1": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
4
.eslintignore
Normal file
4
.eslintignore
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
lib/
|
||||||
|
dist/
|
||||||
|
node_modules/
|
||||||
|
coverage/
|
||||||
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
* text=auto eol=lf
|
||||||
|
|
||||||
|
dist/** -diff linguist-generated=true
|
||||||
5
.github/codeql/codeql-config.yml
vendored
Normal file
5
.github/codeql/codeql-config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
name: JavaScript CodeQL Configuration
|
||||||
|
|
||||||
|
paths-ignore:
|
||||||
|
- node_modules
|
||||||
|
- dist
|
||||||
26
.github/dependabot.yml
vendored
Normal file
26
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
groups:
|
||||||
|
actions-minor:
|
||||||
|
update-types:
|
||||||
|
- minor
|
||||||
|
- patch
|
||||||
|
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
groups:
|
||||||
|
npm-development:
|
||||||
|
dependency-type: development
|
||||||
|
update-types:
|
||||||
|
- minor
|
||||||
|
- patch
|
||||||
|
npm-production:
|
||||||
|
dependency-type: production
|
||||||
|
update-types:
|
||||||
|
- patch
|
||||||
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'
|
||||||
|
}
|
||||||
18
.github/linters/.markdown-lint.yml
vendored
Normal file
18
.github/linters/.markdown-lint.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Unordered list style
|
||||||
|
MD004:
|
||||||
|
style: dash
|
||||||
|
|
||||||
|
# Ordered list item prefix
|
||||||
|
MD029:
|
||||||
|
style: one
|
||||||
|
|
||||||
|
# Spaces after list markers
|
||||||
|
MD030:
|
||||||
|
ul_single: 1
|
||||||
|
ol_single: 1
|
||||||
|
ul_multi: 1
|
||||||
|
ol_multi: 1
|
||||||
|
|
||||||
|
# Code block style
|
||||||
|
MD046:
|
||||||
|
style: fenced
|
||||||
10
.github/linters/.yaml-lint.yml
vendored
Normal file
10
.github/linters/.yaml-lint.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
rules:
|
||||||
|
document-end: disable
|
||||||
|
document-start:
|
||||||
|
level: warning
|
||||||
|
present: false
|
||||||
|
line-length:
|
||||||
|
level: warning
|
||||||
|
max: 80
|
||||||
|
allow-non-breakable-words: true
|
||||||
|
allow-non-breakable-inline-mappings: true
|
||||||
70
.github/workflows/check-dist.yml
vendored
Normal file
70
.github/workflows/check-dist.yml
vendored
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# In JavaScript actions, `dist/` is a special directory. When you reference
|
||||||
|
# an action with the `uses:` property, `dist/index.js` is the code that will be
|
||||||
|
# run. For this project, the `dist/index.js` file is transpiled from other
|
||||||
|
# source files. This workflow ensures the `dist/` directory contains the
|
||||||
|
# expected transpiled code.
|
||||||
|
#
|
||||||
|
# If this workflow is run from a feature branch, it will act as an additional CI
|
||||||
|
# check and fail if the checked-in `dist/` directory does not match what is
|
||||||
|
# expected from the build.
|
||||||
|
name: Check Transpiled JavaScript
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-dist:
|
||||||
|
name: Check dist/
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
statuses: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
id: checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
id: setup-node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: .node-version
|
||||||
|
cache: npm
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
id: install
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Build dist/ Directory
|
||||||
|
id: build
|
||||||
|
run: npm run bundle
|
||||||
|
|
||||||
|
# This will fail the workflow if the PR wasn't created by Dependabot.
|
||||||
|
- name: Compare Directories
|
||||||
|
id: diff
|
||||||
|
run: |
|
||||||
|
if [ "$(git diff --ignore-space-at-eol --text dist/ | wc -l)" -gt "0" ]; then
|
||||||
|
echo "Detected uncommitted changes after build. See status below:"
|
||||||
|
git diff --ignore-space-at-eol --text dist/
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If `dist/` was different than expected, and this was not a Dependabot
|
||||||
|
# PR, upload the expected version as a workflow artifact.
|
||||||
|
- if: ${{ failure() && steps.diff.outcome == 'failure' }}
|
||||||
|
name: Upload Artifact
|
||||||
|
id: upload
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: dist
|
||||||
|
path: dist/
|
||||||
64
.github/workflows/ci.yml
vendored
Normal file
64
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
name: Continuous Integration
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-javascript:
|
||||||
|
name: JavaScript Tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
id: checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
id: setup-node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: .node-version
|
||||||
|
cache: npm
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
id: npm-ci
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Check Format
|
||||||
|
id: npm-format-check
|
||||||
|
run: npm run format:check
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
id: npm-lint
|
||||||
|
run: npm run lint
|
||||||
|
|
||||||
|
- name: Test
|
||||||
|
id: npm-ci-test
|
||||||
|
run: npm run ci-test
|
||||||
|
|
||||||
|
test-action:
|
||||||
|
name: GitHub Actions Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
id: checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Test Local Action
|
||||||
|
id: test-action
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
milliseconds: 1000
|
||||||
|
|
||||||
|
- name: Print Output
|
||||||
|
id: output
|
||||||
|
run: echo "${{ steps.test-action.outputs.time }}"
|
||||||
73
.github/workflows/codeql-analysis.yml
vendored
Normal file
73
.github/workflows/codeql-analysis.yml
vendored
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# For most projects, this workflow file will not need changing; you simply need
|
||||||
|
# to commit it to your repository.
|
||||||
|
#
|
||||||
|
# You may wish to alter this file to override the set of languages analyzed,
|
||||||
|
# or to provide custom queries or build logic.
|
||||||
|
#
|
||||||
|
# ******** NOTE ********
|
||||||
|
# We have attempted to detect the languages in your repository. Please check
|
||||||
|
# the `language` matrix defined below to confirm you have the correct set of
|
||||||
|
# supported CodeQL languages.
|
||||||
|
#
|
||||||
|
name: CodeQL
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
schedule:
|
||||||
|
- cron: '24 5 * * 6'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: ['javascript']
|
||||||
|
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||||
|
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v3
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
config-file: ./.github/codeql/codeql-config.yml
|
||||||
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
|
# By default, queries listed here will override any specified in a config file.
|
||||||
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
|
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||||
|
|
||||||
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v3
|
||||||
|
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 https://git.io/JvXDl
|
||||||
|
|
||||||
|
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||||
|
# and modify them (or add more) to build your code if your project
|
||||||
|
# uses a compiled language
|
||||||
|
|
||||||
|
#- run: |
|
||||||
|
# make bootstrap
|
||||||
|
# make release
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v3
|
||||||
48
.github/workflows/linter.yml
vendored
Normal file
48
.github/workflows/linter.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
name: Lint Codebase
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: read
|
||||||
|
statuses: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
name: Lint Codebase
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
id: checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
id: setup-node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: .node-version
|
||||||
|
cache: npm
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
id: install
|
||||||
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Lint Codebase
|
||||||
|
id: super-linter
|
||||||
|
uses: super-linter/super-linter/slim@v6
|
||||||
|
env:
|
||||||
|
DEFAULT_BRANCH: main
|
||||||
|
FILTER_REGEX_EXCLUDE: dist/**/*
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
JAVASCRIPT_DEFAULT_STYLE: prettier
|
||||||
|
VALIDATE_ALL_CODEBASE: true
|
||||||
|
VALIDATE_JSCPD: false
|
||||||
103
.gitignore
vendored
Normal file
103
.gitignore
vendored
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
# Dependency directory
|
||||||
|
node_modules
|
||||||
|
|
||||||
|
# Rest pulled from https://github.com/github/gitignore/blob/master/Node.gitignore
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# next.js build output
|
||||||
|
.next
|
||||||
|
|
||||||
|
# nuxt.js build output
|
||||||
|
.nuxt
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# OS metadata
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Ignore built ts files
|
||||||
|
__tests__/runner/*
|
||||||
|
|
||||||
|
# IDE files
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
*.code-workspace
|
||||||
1
.node-version
Normal file
1
.node-version
Normal file
@@ -0,0 +1 @@
|
|||||||
|
20.6.0
|
||||||
3
.prettierignore
Normal file
3
.prettierignore
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
dist/
|
||||||
|
node_modules/
|
||||||
|
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"
|
||||||
|
}
|
||||||
3
CODEOWNERS
Normal file
3
CODEOWNERS
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Repository CODEOWNERS
|
||||||
|
|
||||||
|
* @actions/actions-oss-maintainers
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright 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.
|
||||||
205
README.md
Normal file
205
README.md
Normal file
@@ -0,0 +1,205 @@
|
|||||||
|
# Create a JavaScript Action
|
||||||
|
|
||||||
|
[](https://github.com/super-linter/super-linter)
|
||||||
|

|
||||||
|
|
||||||
|
Use this template to bootstrap the creation of a JavaScript action. :rocket:
|
||||||
|
|
||||||
|
This template includes compilation support, tests, a validation workflow,
|
||||||
|
publishing, and versioning guidance.
|
||||||
|
|
||||||
|
If you are new, there's also a simpler introduction in the
|
||||||
|
[Hello world JavaScript action repository](https://github.com/actions/hello-world-javascript-action).
|
||||||
|
|
||||||
|
## Create Your Own Action
|
||||||
|
|
||||||
|
To create your own action, you can use this repository as a template! Just
|
||||||
|
follow the below instructions:
|
||||||
|
|
||||||
|
1. Click the **Use this template** button at the top of the repository
|
||||||
|
1. Select **Create a new repository**
|
||||||
|
1. Select an owner and name for your new repository
|
||||||
|
1. Click **Create repository**
|
||||||
|
1. Clone your new repository
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
>
|
||||||
|
> Make sure to remove or update the [`CODEOWNERS`](./CODEOWNERS) file! For
|
||||||
|
> details on how to use this file, see
|
||||||
|
> [About code owners](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners).
|
||||||
|
|
||||||
|
## Initial Setup
|
||||||
|
|
||||||
|
After you've cloned the repository to your local machine or codespace, you'll
|
||||||
|
need to perform some initial setup steps before you can develop your action.
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
>
|
||||||
|
> You'll need to have a reasonably modern version of
|
||||||
|
> [Node.js](https://nodejs.org) handy. If you are using a version manager like
|
||||||
|
> [`nodenv`](https://github.com/nodenv/nodenv) or
|
||||||
|
> [`nvm`](https://github.com/nvm-sh/nvm), you can run `nodenv install` in the
|
||||||
|
> root of your repository to install the version specified in
|
||||||
|
> [`package.json`](./package.json). Otherwise, 20.x or later should work!
|
||||||
|
|
||||||
|
1. :hammer_and_wrench: Install the dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
1. :building_construction: Package the JavaScript for distribution
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run bundle
|
||||||
|
```
|
||||||
|
|
||||||
|
1. :white_check_mark: Run the tests
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm test
|
||||||
|
|
||||||
|
PASS ./index.test.js
|
||||||
|
✓ throws invalid number (3ms)
|
||||||
|
✓ wait 500 ms (504ms)
|
||||||
|
✓ test runs (95ms)
|
||||||
|
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Update the Action Metadata
|
||||||
|
|
||||||
|
The [`action.yml`](action.yml) file defines metadata about your action, such as
|
||||||
|
input(s) and output(s). For details about this file, see
|
||||||
|
[Metadata syntax for GitHub Actions](https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions).
|
||||||
|
|
||||||
|
When you copy this repository, update `action.yml` with the name, description,
|
||||||
|
inputs, and outputs for your action.
|
||||||
|
|
||||||
|
## Update the Action Code
|
||||||
|
|
||||||
|
The [`src/`](./src/) directory is the heart of your action! This contains the
|
||||||
|
source code that will be run when your action is invoked. You can replace the
|
||||||
|
contents of this directory with your own code.
|
||||||
|
|
||||||
|
There are a few things to keep in mind when writing your action code:
|
||||||
|
|
||||||
|
- Most GitHub Actions toolkit and CI/CD operations are processed asynchronously.
|
||||||
|
In `main.js`, you will see that the action is run in an `async` function.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
const core = require('@actions/core')
|
||||||
|
//...
|
||||||
|
|
||||||
|
async function run() {
|
||||||
|
try {
|
||||||
|
//...
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(error.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
For more information about the GitHub Actions toolkit, see the
|
||||||
|
[documentation](https://github.com/actions/toolkit/blob/master/README.md).
|
||||||
|
|
||||||
|
So, what are you waiting for? Go ahead and start customizing your action!
|
||||||
|
|
||||||
|
1. Create a new branch
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git checkout -b releases/v1
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Replace the contents of `src/` with your action code
|
||||||
|
1. Add tests to `__tests__/` for your source code
|
||||||
|
1. Format, test, and build the action
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run all
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
>
|
||||||
|
> This step is important! It will run [`ncc`](https://github.com/vercel/ncc)
|
||||||
|
> to build the final JavaScript action code with all dependencies included.
|
||||||
|
> If you do not run this step, your action will not work correctly when it is
|
||||||
|
> used in a workflow. This step also includes the `--license` option for
|
||||||
|
> `ncc`, which will create a license file for all of the production node
|
||||||
|
> modules used in your project.
|
||||||
|
|
||||||
|
1. Commit your changes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add .
|
||||||
|
git commit -m "My first action is ready!"
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Push them to your repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git push -u origin releases/v1
|
||||||
|
```
|
||||||
|
|
||||||
|
1. Create a pull request and get feedback on your action
|
||||||
|
1. Merge the pull request into the `main` branch
|
||||||
|
|
||||||
|
Your action is now published! :rocket:
|
||||||
|
|
||||||
|
For information about versioning your action, see
|
||||||
|
[Versioning](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md)
|
||||||
|
in the GitHub Actions toolkit.
|
||||||
|
|
||||||
|
## Validate the Action
|
||||||
|
|
||||||
|
You can now validate the action by referencing it in a workflow file. For
|
||||||
|
example, [`ci.yml`](./.github/workflows/ci.yml) demonstrates how to reference an
|
||||||
|
action in the same repository.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
id: checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Test Local Action
|
||||||
|
id: test-action
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
milliseconds: 1000
|
||||||
|
|
||||||
|
- name: Print Output
|
||||||
|
id: output
|
||||||
|
run: echo "${{ steps.test-action.outputs.time }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
For example workflow runs, check out the
|
||||||
|
[Actions tab](https://github.com/actions/javascript-action/actions)! :rocket:
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
After testing, you can create version tag(s) that developers can use to
|
||||||
|
reference different stable versions of your action. For more information, see
|
||||||
|
[Versioning](https://github.com/actions/toolkit/blob/master/docs/action-versioning.md)
|
||||||
|
in the GitHub Actions toolkit.
|
||||||
|
|
||||||
|
To include the action in a workflow in another repository, you can use the
|
||||||
|
`uses` syntax with the `@` symbol to reference a specific branch, tag, or commit
|
||||||
|
hash.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
id: checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Run my Action
|
||||||
|
id: run-action
|
||||||
|
uses: actions/javascript-action@v1 # Commit with the `v1` tag
|
||||||
|
with:
|
||||||
|
milliseconds: 1000
|
||||||
|
|
||||||
|
- name: Print Output
|
||||||
|
id: output
|
||||||
|
run: echo "${{ steps.run-action.outputs.time }}"
|
||||||
|
```
|
||||||
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()
|
||||||
|
})
|
||||||
|
})
|
||||||
96
__tests__/main.test.js
Normal file
96
__tests__/main.test.js
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
* Unit tests for the action's main functionality, src/main.js
|
||||||
|
*/
|
||||||
|
const core = require('@actions/core')
|
||||||
|
const main = require('../src/main')
|
||||||
|
|
||||||
|
// 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()
|
||||||
|
|
||||||
|
// Mock the action's main function
|
||||||
|
const runMock = jest.spyOn(main, 'run')
|
||||||
|
|
||||||
|
// Other utilities
|
||||||
|
const timeRegex = /^\d{2}:\d{2}:\d{2}/
|
||||||
|
|
||||||
|
describe('action', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
})
|
||||||
|
|
||||||
|
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 ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
await main.run()
|
||||||
|
expect(runMock).toHaveReturned()
|
||||||
|
|
||||||
|
// 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',
|
||||||
|
expect.stringMatching(timeRegex)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
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 ''
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
await main.run()
|
||||||
|
expect(runMock).toHaveReturned()
|
||||||
|
|
||||||
|
// Verify that all of the core library functions were called correctly
|
||||||
|
expect(setFailedMock).toHaveBeenNthCalledWith(
|
||||||
|
1,
|
||||||
|
'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'
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
24
__tests__/wait.test.js
Normal file
24
__tests__/wait.test.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Unit tests for src/wait.js
|
||||||
|
*/
|
||||||
|
const { wait } = require('../src/wait')
|
||||||
|
const { expect } = require('@jest/globals')
|
||||||
|
|
||||||
|
describe('wait.js', () => {
|
||||||
|
it('throws an invalid number', async () => {
|
||||||
|
const input = parseInt('foo', 10)
|
||||||
|
expect(isNaN(input)).toBe(true)
|
||||||
|
|
||||||
|
await expect(wait(input)).rejects.toThrow('milliseconds not a number')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('waits with a valid number', async () => {
|
||||||
|
const start = new Date()
|
||||||
|
await wait(500)
|
||||||
|
const end = new Date()
|
||||||
|
|
||||||
|
const delta = Math.abs(end.getTime() - start.getTime())
|
||||||
|
|
||||||
|
expect(delta).toBeGreaterThan(450)
|
||||||
|
})
|
||||||
|
})
|
||||||
19
action.yml
Normal file
19
action.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
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'
|
||||||
|
required: true
|
||||||
|
default: '1000'
|
||||||
|
|
||||||
|
# Define your outputs here.
|
||||||
|
outputs:
|
||||||
|
time:
|
||||||
|
description: 'Your output description here'
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: node20
|
||||||
|
main: dist/index.js
|
||||||
1
badges/coverage.svg
Normal file
1
badges/coverage.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="106" height="20" role="img" aria-label="Coverage: 100%"><title>Coverage: 100%</title><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="r"><rect width="106" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#r)"><rect width="63" height="20" fill="#555"/><rect x="63" width="43" height="20" fill="#4c1"/><rect width="106" height="20" fill="url(#s)"/></g><g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"><text aria-hidden="true" x="325" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="530">Coverage</text><text x="325" y="140" transform="scale(.1)" fill="#fff" textLength="530">Coverage</text><text aria-hidden="true" x="835" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="330">100%</text><text x="835" y="140" transform="scale(.1)" fill="#fff" textLength="330">100%</text></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
2926
dist/index.js
generated
vendored
Normal file
2926
dist/index.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
73
dist/licenses.txt
generated
vendored
Normal file
73
dist/licenses.txt
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
@actions/core
|
||||||
|
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.
|
||||||
|
|
||||||
|
@actions/http-client
|
||||||
|
MIT
|
||||||
|
Actions Http Client for Node.js
|
||||||
|
|
||||||
|
Copyright (c) GitHub, Inc.
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
|
||||||
|
uuid
|
||||||
|
MIT
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2010-2020 Robert Kieffer and other 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.
|
||||||
8584
package-lock.json
generated
Normal file
8584
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
81
package.json
Normal file
81
package.json
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
"name": "javascript-action",
|
||||||
|
"description": "GitHub Actions JavaScript Template",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"author": "",
|
||||||
|
"private": true,
|
||||||
|
"homepage": "https://github.com/actions/javascript-action#readme",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/actions/javascript-action.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/actions/javascript-action/issues"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"GitHub",
|
||||||
|
"Actions",
|
||||||
|
"JavaScript"
|
||||||
|
],
|
||||||
|
"exports": {
|
||||||
|
".": "./dist/index.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"bundle": "npm run format:write && npm run package",
|
||||||
|
"ci-test": "jest",
|
||||||
|
"format:write": "prettier --write **/*.js",
|
||||||
|
"format:check": "prettier --check **/*.js",
|
||||||
|
"lint": "npx eslint . -c ./.github/linters/.eslintrc.yml",
|
||||||
|
"package": "ncc build src/index.js --license licenses.txt",
|
||||||
|
"package:watch": "npm run package -- --watch",
|
||||||
|
"test": "(jest && make-coverage-badge --output-path ./badges/coverage.svg) || make-coverage-badge --output-path ./badges/coverage.svg",
|
||||||
|
"all": "npm run format:write && npm run lint && npm run test && 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.10.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.23.9",
|
||||||
|
"@babel/eslint-parser": "^7.23.10",
|
||||||
|
"@babel/preset-env": "^7.23.9",
|
||||||
|
"@vercel/ncc": "^0.38.1",
|
||||||
|
"babel-preset-jest": "^29.6.3",
|
||||||
|
"eslint": "^8.56.0",
|
||||||
|
"eslint-plugin-github": "^4.10.1",
|
||||||
|
"eslint-plugin-jest": "^27.9.0",
|
||||||
|
"jest": "^29.7.0",
|
||||||
|
"make-coverage-badge": "^1.2.0",
|
||||||
|
"prettier": "^3.2.5"
|
||||||
|
}
|
||||||
|
}
|
||||||
6
src/index.js
Normal file
6
src/index.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* The entrypoint for the action.
|
||||||
|
*/
|
||||||
|
const { run } = require('./main')
|
||||||
|
|
||||||
|
run()
|
||||||
30
src/main.js
Normal file
30
src/main.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
const core = require('@actions/core')
|
||||||
|
const { wait } = require('./wait')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main function for the action.
|
||||||
|
* @returns {Promise<void>} Resolves when the action is complete.
|
||||||
|
*/
|
||||||
|
async function run() {
|
||||||
|
try {
|
||||||
|
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 ...`)
|
||||||
|
|
||||||
|
// Log the current timestamp, wait, then log the new timestamp
|
||||||
|
core.debug(new Date().toTimeString())
|
||||||
|
await wait(parseInt(ms, 10))
|
||||||
|
core.debug(new Date().toTimeString())
|
||||||
|
|
||||||
|
// Set outputs for other workflow steps to use
|
||||||
|
core.setOutput('time', new Date().toTimeString())
|
||||||
|
} catch (error) {
|
||||||
|
// Fail the workflow run if an error occurs
|
||||||
|
core.setFailed(error.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
run
|
||||||
|
}
|
||||||
17
src/wait.js
Normal file
17
src/wait.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
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