From 4642226db024cf8c43266df88a8a324233b19d30 Mon Sep 17 00:00:00 2001 From: Shohei Ueda <30958501+peaceiris@users.noreply.github.com> Date: Sat, 18 Jan 2020 04:36:10 +0900 Subject: [PATCH] refactor: Use node-fetch instead of xmlhttprequest (#130) * deps: Add node-fetch, remove xmlhttprequest * refactor: Use node-fetch instead of xmlhttprequest --- package-lock.json | 19 +++++++--- package.json | 3 +- src/get-latest-version.ts | 49 ++++++++++++++++--------- src/index.ts | 77 +++++++++++++++++++++++++++------------ src/installer.ts | 2 +- 5 files changed, 103 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06dab96..35b4456 100644 --- a/package-lock.json +++ b/package-lock.json @@ -594,6 +594,15 @@ "integrity": "sha512-HU0q9GXazqiKwviVxg9SI/+t/nAsGkvLDkIdxz+ObejG2nX6Si00TeLqHMoS+a/1tjH7a8YpKVQwtgHuMQsldg==", "dev": true }, + "@types/node-fetch": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.4.tgz", + "integrity": "sha512-Oz6id++2qAOFuOlE1j0ouk1dzl3mmI1+qINPNBhi9nt/gVOz0G+13Ao6qjhdF0Ys+eOkhu6JnFmt38bR3H0POQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -6216,6 +6225,11 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -8262,11 +8276,6 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 176ad86..b086600 100644 --- a/package.json +++ b/package.json @@ -52,11 +52,12 @@ "@actions/exec": "^1.0.3", "@actions/io": "^1.0.2", "@actions/tool-cache": "^1.3.0", - "xmlhttprequest": "^1.8.0" + "node-fetch": "^2.6.0" }, "devDependencies": { "@types/jest": "^24.9.0", "@types/node": "^13.1.7", + "@types/node-fetch": "^2.5.4", "@typescript-eslint/parser": "^2.16.0", "@zeit/ncc": "^0.21.0", "eslint": "^6.8.0", diff --git a/src/get-latest-version.ts b/src/get-latest-version.ts index b7f9382..f0031a3 100644 --- a/src/get-latest-version.ts +++ b/src/get-latest-version.ts @@ -1,19 +1,34 @@ -const XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; +import fetch from 'node-fetch'; -export default function getLatestVersion(): Promise { - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - const url: string = 'https://formulae.brew.sh/api/formula/hugo.json'; - xhr.open('GET', url); - xhr.send(); - xhr.onreadystatechange = function() { - if (xhr.readyState === 4 && xhr.status === 200) { - const result = JSON.parse(xhr.responseText); - const latestVersion: string = result.versions.stable; - resolve(latestVersion); - } else if (xhr.readyState === 4 && xhr.status !== 200) { - reject(`ERROR: got status ${xhr.status} of ${url}`); - } - }; - }); +export function getURL(org: string, repo: string, api: string): string { + let url: string = ''; + + if (api === 'brew') { + url = `https://formulae.brew.sh/api/formula/${repo}.json`; + } else if (api === 'github') { + url = `https://api.github.com/repos/${org}/${repo}/releases/latest`; + } + + return url; +} + +export async function getLatestVersion( + org: string, + repo: string, + api: string +): Promise { + try { + const url = getURL(org, repo, api); + const response = await fetch(url); + const json = await response.json(); + let latestVersion: string = ''; + if (api === 'brew') { + latestVersion = json.versions.stable; + } else if (api === 'github') { + latestVersion = json.tag_name; + } + return latestVersion; + } catch (e) { + return e; + } } diff --git a/src/index.ts b/src/index.ts index 3b3925d..a7224c2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,35 +1,66 @@ import * as core from '@actions/core'; import * as exec from '@actions/exec'; -import getLatestVersion from './get-latest-version'; -import installer from './installer'; +import {getLatestVersion} from './get-latest-version'; +import {installer} from './installer'; -// most @actions toolkit packages have async methods -async function run() { - const showVersion = async () => { - await exec.exec('hugo version'); - }; +export interface actionResult { + exitcode: number; + output: string; +} +export async function showVersion( + cmd: string, + args: string[] +): Promise { try { - const hugoVersion: string = core.getInput('hugo-version'); + let result: actionResult = { + exitcode: 0, + output: '' + }; - if (hugoVersion === '' || hugoVersion === 'latest') { - getLatestVersion().then( - async function(latestVersion): Promise { - console.log(`Hugo version: ${latestVersion} (${hugoVersion})`); - await installer(latestVersion); - await showVersion(); - }, - function(error) { - core.setFailed(error); + const options = { + listeners: { + stdout: (data: Buffer) => { + result.output += data.toString(); } - ); + } + }; + + result.exitcode = await exec.exec(cmd, args, options); + core.debug(` + exit code: ${result.exitcode} + stdout: ${result.output} + `); + return result; + } catch (e) { + return e; + } +} + +async function run() { + try { + const toolVersion: string = core.getInput('hugo-version'); + let installVersion: string = ''; + + let result: actionResult = { + exitcode: 0, + output: '' + }; + + if (toolVersion === '' || toolVersion === 'latest') { + installVersion = await getLatestVersion('gohugoio', 'hugo', 'brew'); } else { - console.log(`Hugo version: ${hugoVersion}`); - await installer(hugoVersion); - await showVersion(); + installVersion = toolVersion; } - } catch (error) { - core.setFailed(error.message); + + core.info(`hugo version: ${installVersion}`); + await installer(installVersion); + result = await showVersion('hugo', ['version']); + + return result; + } catch (e) { + core.setFailed(`Action failed with error ${e}`); + return e; } } diff --git a/src/installer.ts b/src/installer.ts index e2513a4..5ce0f37 100644 --- a/src/installer.ts +++ b/src/installer.ts @@ -16,7 +16,7 @@ if (!tempDir) { tempDir = path.join(baseTempLocation, 'tmp'); } -export default async function installer(version: string) { +export async function installer(version: string) { try { const extended: string = core.getInput('extended'); console.log(`Hugo extended: ${extended}`);