mirror of
https://github.com/joelwmale/webhook-action.git
synced 2024-11-25 08:56:57 +01:00
Convert action to ts
- Add optional header support - Add optional body support
This commit is contained in:
parent
749e2dcbc6
commit
00f958821e
18 changed files with 1836 additions and 46 deletions
1
.eslintignore
Normal file
1
.eslintignore
Normal file
|
@ -0,0 +1 @@
|
||||||
|
dist/
|
18
.eslintrc.json
Normal file
18
.eslintrc.json
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"commonjs": true,
|
||||||
|
"es6": true,
|
||||||
|
"jest": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"globals": {
|
||||||
|
"Atomics": "readonly",
|
||||||
|
"SharedArrayBuffer": "readonly"
|
||||||
|
},
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": 2018
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
}
|
||||||
|
}
|
56
.gitignore
vendored
Normal file
56
.gitignore
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
# OS metadata
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Ignore built ts files
|
||||||
|
__tests__/runner/*
|
||||||
|
lib/**/*
|
3
.prettierignore
Normal file
3
.prettierignore
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
dist/
|
||||||
|
lib/
|
||||||
|
node_modules/
|
10
.prettierrc.json
Normal file
10
.prettierrc.json
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"printWidth": 80,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"useTabs": false,
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "none",
|
||||||
|
"bracketSpacing": false,
|
||||||
|
"arrowParens": "avoid"
|
||||||
|
}
|
20
Dockerfile
20
Dockerfile
|
@ -1,20 +0,0 @@
|
||||||
FROM debian:9.8-slim
|
|
||||||
|
|
||||||
LABEL "version"="1.0.0"
|
|
||||||
LABEL "repository"="https://github.com/joelwmale/webhook-action"
|
|
||||||
LABEL "homepage"="https://github.com/joelwmale/webhook-action"
|
|
||||||
LABEL "maintainer"="Joel Male <joel@joelmale.com>"
|
|
||||||
LABEL "com.github.actions.name"="Webhook Action"
|
|
||||||
LABEL "com.github.actions.description"="Posts data to an endpoint on any event"
|
|
||||||
LABEL "com.github.actions.icon"="message-square"
|
|
||||||
LABEL "com.github.actions.color"="gray-dark"
|
|
||||||
|
|
||||||
# Install curl
|
|
||||||
RUN apt-get update && apt-get install -y curl
|
|
||||||
|
|
||||||
# Add the entry point
|
|
||||||
ADD entrypoint.sh /entrypoint.sh
|
|
||||||
RUN chmod +x /entrypoint.sh
|
|
||||||
|
|
||||||
# Load the entry point
|
|
||||||
ENTRYPOINT ["/entrypoint.sh"]
|
|
45
README.md
45
README.md
|
@ -11,24 +11,15 @@ Supports all [workflow event types](https://developer.github.com/webhooks/#event
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Sending a string:
|
Example:
|
||||||
|
|
||||||
```yml
|
```yml
|
||||||
- name: Webhook
|
- name: Webhook
|
||||||
uses: joelwmale/webhook-action@master
|
uses: joelwmale/webhook-action@master
|
||||||
env:
|
with:
|
||||||
WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}
|
url: ${{ secrets.WEBHOOK_URL }}
|
||||||
data: "Hello from github actions!"
|
headers: "{Content-Type: 'application/json'}"
|
||||||
```
|
body: "{event: 'Deployment', project: 'joelwmale/webhook-action'}"
|
||||||
|
|
||||||
Sending a body of data:
|
|
||||||
|
|
||||||
```yml
|
|
||||||
- name: Webhook
|
|
||||||
uses: joelwmale/webhook-action@master
|
|
||||||
env:
|
|
||||||
WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}
|
|
||||||
data: "{'deployment': 'finished', 'project': 'actions'}"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
It is **highly** recommended to use the action is an explicit commit SHA-1:
|
It is **highly** recommended to use the action is an explicit commit SHA-1:
|
||||||
|
@ -37,19 +28,29 @@ It is **highly** recommended to use the action is an explicit commit SHA-1:
|
||||||
|
|
||||||
### Arguments
|
### Arguments
|
||||||
|
|
||||||
* ```yml
|
### Headers
|
||||||
data: "Hello from github actions!"
|
|
||||||
```
|
|
||||||
|
|
||||||
* ```yml
|
Allows you to send custom headers with the request
|
||||||
data: "{'deployment': 'finished', 'project': 'actions'}"
|
|
||||||
```
|
```yml
|
||||||
|
headers: "{Repository: 'joelwmale/webhook-action'}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Body
|
||||||
|
|
||||||
|
Allows you to send a json payload in a string format
|
||||||
|
|
||||||
|
```yml
|
||||||
|
body: "{event: 'Deployment', project: 'joelwmale/webhook-action'}"
|
||||||
|
```
|
||||||
|
|
||||||
### Environment
|
### Environment
|
||||||
|
|
||||||
The action is expecting a single environment variable of your data. This can be pre-encoded json string, or just a message. Format it to how your API is expecting.
|
The action is expecpecting a few environmental variables:
|
||||||
|
|
||||||
* **`WEBHOOK_URL`** (**required**): This is the webhook url to send the payload to.
|
* **`url`** (**required**): The url to send the webhook to
|
||||||
|
* **`headers`** (**optional**): Any headers you want to be sent with the webhook
|
||||||
|
* **`body`** (**optional**): The body of data send with the webhook
|
||||||
|
|
||||||
## Issues
|
## Issues
|
||||||
|
|
||||||
|
|
13
action.yml
Normal file
13
action.yml
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
name: 'Webhook'
|
||||||
|
description: 'Wait a designated number of milliseconds'
|
||||||
|
inputs:
|
||||||
|
milliseconds: # id of input
|
||||||
|
description: 'number of milliseconds to wait'
|
||||||
|
required: true
|
||||||
|
default: '1000'
|
||||||
|
outputs:
|
||||||
|
time: # output will be available to future steps
|
||||||
|
description: 'The message to output'
|
||||||
|
runs:
|
||||||
|
using: 'node12'
|
||||||
|
main: 'dist/index.js'
|
67
dist/http.js
vendored
Normal file
67
dist/http.js
vendored
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
"use strict";
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||||
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||||
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||||
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||||
|
function step(op) {
|
||||||
|
if (f) throw new TypeError("Generator is already executing.");
|
||||||
|
while (_) try {
|
||||||
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||||||
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||||
|
switch (op[0]) {
|
||||||
|
case 0: case 1: t = op; break;
|
||||||
|
case 4: _.label++; return { value: op[1], done: false };
|
||||||
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||||||
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||||||
|
default:
|
||||||
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||||||
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||||||
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||||||
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||||||
|
if (t[2]) _.ops.pop();
|
||||||
|
_.trys.pop(); continue;
|
||||||
|
}
|
||||||
|
op = body.call(thisArg, _);
|
||||||
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||||||
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
exports.http = void 0;
|
||||||
|
var Http = (function () {
|
||||||
|
function Http() {
|
||||||
|
}
|
||||||
|
Http.prototype.make = function (url, headers, body) {
|
||||||
|
return __awaiter(this, void 0, void 0, function () {
|
||||||
|
var _this = this;
|
||||||
|
return __generator(this, function (_a) {
|
||||||
|
return [2, new Promise(function (resolve, reject) {
|
||||||
|
fetch(url, _this.getOptions('post', headers, body))
|
||||||
|
.then(function (res) { return resolve(res.body); })
|
||||||
|
.catch(function (res) { return reject(res.body); });
|
||||||
|
})];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Http.prototype.getOptions = function (method, headers, body) {
|
||||||
|
var options = {
|
||||||
|
headers: JSON.parse(headers),
|
||||||
|
method: method
|
||||||
|
};
|
||||||
|
options.body = JSON.stringify(body);
|
||||||
|
options.headers['content-type'] = 'application/json';
|
||||||
|
return options;
|
||||||
|
};
|
||||||
|
return Http;
|
||||||
|
}());
|
||||||
|
exports.http = new Http();
|
||||||
|
//# sourceMappingURL=http.js.map
|
1
dist/http.js.map
vendored
Normal file
1
dist/http.js.map
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;IAAA;IAuBA,CAAC;IAtBO,mBAAI,GAAV,UAAW,GAAW,EAAE,OAAe,EAAE,IAAY;;;;gBACnD,WAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM;wBACjC,KAAK,CAAC,GAAG,EAAE,KAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;6BAC/C,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAjB,CAAiB,CAAC;6BAChC,KAAK,CAAC,UAAC,GAAG,IAAK,OAAA,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAhB,CAAgB,CAAC,CAAC;oBACtC,CAAC,CAAC,EAAC;;;KACJ;IAED,yBAAU,GAAV,UAAW,MAAc,EAAE,OAAe,EAAE,IAAY;QACtD,IAAM,OAAO,GAAQ;YACnB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC5B,MAAM,QAAA;SACP,CAAC;QAGF,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAGpC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAErD,OAAO,OAAO,CAAC;IACjB,CAAC;IACH,WAAC;AAAD,CAAC,AAvBD,IAuBC;AAEY,QAAA,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC"}
|
64
dist/main.js
vendored
Normal file
64
dist/main.js
vendored
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
"use strict";
|
||||||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||||
|
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||||
|
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||||
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||||
|
function step(op) {
|
||||||
|
if (f) throw new TypeError("Generator is already executing.");
|
||||||
|
while (_) try {
|
||||||
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||||||
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||||
|
switch (op[0]) {
|
||||||
|
case 0: case 1: t = op; break;
|
||||||
|
case 4: _.label++; return { value: op[1], done: false };
|
||||||
|
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||||||
|
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||||||
|
default:
|
||||||
|
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||||||
|
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||||||
|
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||||||
|
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||||||
|
if (t[2]) _.ops.pop();
|
||||||
|
_.trys.pop(); continue;
|
||||||
|
}
|
||||||
|
op = body.call(thisArg, _);
|
||||||
|
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||||||
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
var core = require("@actions/core");
|
||||||
|
var http_1 = require("./http");
|
||||||
|
function run() {
|
||||||
|
var _a;
|
||||||
|
return __awaiter(this, void 0, void 0, function () {
|
||||||
|
var url, headers, body;
|
||||||
|
return __generator(this, function (_b) {
|
||||||
|
try {
|
||||||
|
url = core.getInput('url');
|
||||||
|
headers = (_a = core.getInput('headers')) !== null && _a !== void 0 ? _a : {};
|
||||||
|
body = core.getInput('body');
|
||||||
|
core.info("Sending webhook request to " + url + "...");
|
||||||
|
core.debug((new Date()).toTimeString());
|
||||||
|
http_1.http.make(url, headers, body).then(function (res) { return console.log('hi'); });
|
||||||
|
core.info((new Date()).toTimeString());
|
||||||
|
core.setOutput('time', new Date().toTimeString());
|
||||||
|
}
|
||||||
|
catch (error) {
|
||||||
|
core.setFailed(error.message);
|
||||||
|
}
|
||||||
|
return [2];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
run();
|
||||||
|
//# sourceMappingURL=main.js.map
|
1
dist/main.js.map
vendored
Normal file
1
dist/main.js.map
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oCAAsC;AACtC,+BAA8B;AAG9B,SAAe,GAAG;;;;;YAChB,IAAI;gBACI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC3B,OAAO,SAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,mCAAI,EAAE,CAAC;gBACzC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAGnC,IAAI,CAAC,IAAI,CAAC,gCAA8B,GAAG,QAAK,CAAC,CAAC;gBAGlD,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;gBAGxC,WAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAjB,CAAiB,CAAC,CAAC;gBAG/D,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;gBAGvC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;aACnD;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;aAC/B;;;;CACF;AAED,GAAG,EAAE,CAAC"}
|
|
@ -1,4 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -eu
|
|
||||||
|
|
||||||
curl -X POST -H "Content-Type: application/json" --data "{ \"data\": \"$data\" }" $WEBHOOK_URL
|
|
41
package.json
Normal file
41
package.json
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
{
|
||||||
|
"name": "webhook-action",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"private": true,
|
||||||
|
"description": "Github Webhook Action",
|
||||||
|
"main": "dist/main.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc",
|
||||||
|
"format": "prettier --write **/*.ts",
|
||||||
|
"lint": "eslint src/**/*.ts",
|
||||||
|
"package": "ncc build --source-map"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/joelwmale/webhook-action.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"actions",
|
||||||
|
"node",
|
||||||
|
"webhook",
|
||||||
|
"action"
|
||||||
|
],
|
||||||
|
"author": "Joel Male",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@actions/core": "^1.2.4",
|
||||||
|
"fetch": "^1.1.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/jest": "^26.0.10",
|
||||||
|
"@types/node": "^14.6.0",
|
||||||
|
"@typescript-eslint/parser": "^3.9.1",
|
||||||
|
"@vercel/ncc": "^0.23.0",
|
||||||
|
"eslint": "^7.5.0",
|
||||||
|
"eslint-plugin-github": "^4.1.1",
|
||||||
|
"eslint-plugin-jest": "^23.20.0",
|
||||||
|
"js-yaml": "^3.14.0",
|
||||||
|
"prettier": "2.0.5",
|
||||||
|
"typescript": "^3.9.7"
|
||||||
|
}
|
||||||
|
}
|
26
src/http.ts
Normal file
26
src/http.ts
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
class Http {
|
||||||
|
async make(url: string, headers: string, body: string): Promise<any> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
fetch(url, this.getOptions('post', headers, body))
|
||||||
|
.then((res) => resolve(res.body))
|
||||||
|
.catch((res) => reject(res.body));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getOptions(method: string, headers: string, body: string) {
|
||||||
|
const options: any = {
|
||||||
|
headers: JSON.parse(headers),
|
||||||
|
method
|
||||||
|
};
|
||||||
|
|
||||||
|
// stringify the body
|
||||||
|
options.body = JSON.stringify(body);
|
||||||
|
|
||||||
|
// set these headers
|
||||||
|
options.headers['content-type'] = 'application/json';
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const http = new Http();
|
30
src/main.ts
Normal file
30
src/main.ts
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import * as core from '@actions/core';
|
||||||
|
import { http } from './http';
|
||||||
|
|
||||||
|
// most @actions toolkit packages have async methods
|
||||||
|
async function run() {
|
||||||
|
try {
|
||||||
|
const url = core.getInput('url');
|
||||||
|
const headers = core.getInput('headers') ?? '';
|
||||||
|
const body = core.getInput('body') ?? '';
|
||||||
|
|
||||||
|
// initial info
|
||||||
|
core.info(`Sending webhook request to ${url}...`);
|
||||||
|
|
||||||
|
// debug start
|
||||||
|
core.debug((new Date()).toTimeString()); // debug is only output if you set the secret `ACTIONS_RUNNER_DEBUG` to true
|
||||||
|
|
||||||
|
// make the request
|
||||||
|
http.make(url, headers, body).then((res) => console.log('hi'));
|
||||||
|
|
||||||
|
// debug end
|
||||||
|
core.info((new Date()).toTimeString());
|
||||||
|
|
||||||
|
// output the time it took
|
||||||
|
core.setOutput('time', new Date().toTimeString());
|
||||||
|
} catch (error) {
|
||||||
|
core.setFailed(error.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
run();
|
21
tsconfig.json
Normal file
21
tsconfig.json
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"strictPropertyInitialization": false,
|
||||||
|
"jsx": "react",
|
||||||
|
"lib": [
|
||||||
|
"dom",
|
||||||
|
"es7"
|
||||||
|
],
|
||||||
|
"module": "commonjs",
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"outDir": "./dist/",
|
||||||
|
"removeComments": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"strict": true,
|
||||||
|
"target": "es5"
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules"]
|
||||||
|
}
|
Loading…
Reference in a new issue