gh-release-fetch
Advanced tools
Comparing version 1.1.0 to 2.0.0
@@ -1,7 +0,3 @@ | ||
/// <reference types="node" /> | ||
import { RequestInit } from 'node-fetch'; | ||
import { Agent } from 'http'; | ||
interface DownloadOptions { | ||
agent?: Agent; | ||
} | ||
declare type DownloadOptions = Pick<RequestInit, 'agent'>; | ||
export interface Release { | ||
@@ -8,0 +4,0 @@ repository: string; |
"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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const download = require("download"); | ||
const mkdirp = require("mkdirp"); | ||
const node_fetch_1 = require("node-fetch"); | ||
exports.newerVersion = exports.updateAvailable = exports.fetchVersion = exports.fetchLatest = void 0; | ||
const download_1 = __importDefault(require("download")); | ||
const make_dir_1 = __importDefault(require("make-dir")); | ||
const node_fetch_1 = __importDefault(require("node-fetch")); | ||
const semver_1 = require("semver"); | ||
function fetchLatest(release, fetchOptions) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
// eslint-disable-next-line no-param-reassign | ||
release.version = yield resolveRelease(release.repository, fetchOptions); | ||
return fetchVersion(release, { agent: fetchOptions && fetchOptions.agent }); | ||
const agent = fetchOptions && fetchOptions.agent; | ||
return fetchVersion(release, { agent }); | ||
}); | ||
@@ -40,5 +47,3 @@ } | ||
const json = yield res.json(); | ||
if (res.status === 403 && | ||
typeof json.message === 'string' && | ||
json.message.includes('API rate limit exceeded')) { | ||
if (res.status === 403 && typeof json.message === 'string' && json.message.includes('API rate limit exceeded')) { | ||
throw new Error('API rate limit exceeded, please try again later'); | ||
@@ -52,6 +57,6 @@ } | ||
const url = `https://github.com/${release.repository}/releases/download/${release.version}/${release.package}`; | ||
mkdirp.sync(release.destination); | ||
yield download(url, release.destination, { | ||
yield make_dir_1.default(release.destination); | ||
yield download_1.default(url, release.destination, { | ||
extract: release.extract, | ||
agent | ||
agent: agent, | ||
}); | ||
@@ -81,6 +86,6 @@ }); | ||
} | ||
const l = latestVersion.replace(/^v/, ''); | ||
const c = currentVersion.replace(/^v/, ''); | ||
return semver_1.gt(l, c); | ||
const normalizedLatestVersion = latestVersion.replace(/^v/, ''); | ||
const normalizedCurrentVersion = currentVersion.replace(/^v/, ''); | ||
return semver_1.gt(normalizedLatestVersion, normalizedCurrentVersion); | ||
} | ||
exports.newerVersion = newerVersion; |
{ | ||
"name": "gh-release-fetch", | ||
"version": "1.1.0", | ||
"version": "2.0.0", | ||
"description": "A library to fetch release binaries from GitHub Releases", | ||
"main": "dist/index.js", | ||
"scripts": { | ||
"prepublishOnly": "npm ci && run-s build test", | ||
"test": "jest", | ||
"build": "tsc", | ||
"build:watch": "tsc --watch", | ||
"lint": "tslint --project \"./tsconfig.json\"" | ||
"format": "run-s format:check-fix:*", | ||
"format:ci": "run-s format:check:*", | ||
"format:check-fix:lint": "run-e format:check:lint format:fix:lint", | ||
"format:check:lint": "cross-env-shell eslint $npm_package_config_eslint", | ||
"format:fix:lint": "cross-env-shell eslint --fix $npm_package_config_eslint", | ||
"format:check-fix:prettier": "run-e format:check:prettier format:fix:prettier", | ||
"format:check:prettier": "cross-env-shell prettier --check $npm_package_config_prettier", | ||
"format:fix:prettier": "cross-env-shell prettier --write $npm_package_config_prettier" | ||
}, | ||
"keywords": [], | ||
"config": { | ||
"eslint": "--ignore-path .gitignore --cache --format=codeframe --max-warnings=0 \"{src,tests,.github}/**/*.{ts,js,html}\" \"*.{ts,js,html}\" \".*.{ts,js,html}\"", | ||
"prettier": "--ignore-path .gitignore --loglevel=warn \"{src,tests,.github}/**/*.{ts,js,md,yml,json,html}\" \"*.{ts,js,yml,json,html}\" \".*.{ts,js,yml,json,html}\" \"!package-lock.json\"" | ||
}, | ||
"husky": { | ||
"hooks": { | ||
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS", | ||
"pre-push": "npm run format" | ||
} | ||
}, | ||
"keywords": [ | ||
"github", | ||
"release", | ||
"fetch" | ||
], | ||
"engines": { | ||
"node": ">=10" | ||
}, | ||
"author": "David Calavera", | ||
"license": "MIT", | ||
"devDependencies": { | ||
"@types/jest": "^24.0.11", | ||
"@types/node": "^11.12.0", | ||
"jest": "^24.5.0", | ||
"ts-jest": "^24.0.0", | ||
"tslint": "^5.14.0", | ||
"typescript": "^3.3.4000" | ||
"@netlify/eslint-config-node": "^3.1.4", | ||
"@types/jest": "^26.0.0", | ||
"@types/node": "^14.0.0", | ||
"@typescript-eslint/eslint-plugin": "^4.27.0", | ||
"@typescript-eslint/parser": "^4.27.0", | ||
"husky": "^4.3.8", | ||
"jest": "^27.0.0", | ||
"ts-jest": "^27.0.0", | ||
"typescript": "^4.0.0" | ||
}, | ||
"dependencies": { | ||
"@types/download": "^6.2.4", | ||
"@types/mkdirp": "^0.5.2", | ||
"@types/download": "^8.0.0", | ||
"@types/node-fetch": "^2.1.6", | ||
"@types/semver": "^5.5.0", | ||
"download": "^7.1.0", | ||
"mkdirp": "^0.5.1", | ||
"@types/semver": "^7.0.0", | ||
"download": "^8.0.0", | ||
"make-dir": "^3.1.0", | ||
"node-fetch": "^2.3.0", | ||
"semver": "^5.6.0" | ||
"semver": "^7.0.0" | ||
} | ||
} |
@@ -1,23 +0,24 @@ | ||
import { newerVersion, fetchLatest } from "./index"; | ||
/* eslint-disable @typescript-eslint/no-var-requires,node/global-require */ | ||
import { newerVersion, fetchLatest } from './index' | ||
test("compare versions", () => { | ||
expect(newerVersion("0.1.0", "0.0.1")).toBe(true); | ||
expect(newerVersion("v0.1.0", "v0.0.1")).toBe(true); | ||
expect(newerVersion("v0.0.1", "")).toBe(true); | ||
test('compare versions', () => { | ||
expect(newerVersion('0.1.0', '0.0.1')).toBe(true) | ||
expect(newerVersion('v0.1.0', 'v0.0.1')).toBe(true) | ||
expect(newerVersion('v0.0.1', '')).toBe(true) | ||
expect(newerVersion("0.0.1", "0.0.1")).toBe(false); | ||
expect(newerVersion("v0.0.1", "v0.0.1")).toBe(false); | ||
expect(newerVersion("", "0.0.1")).toBe(false); | ||
}); | ||
expect(newerVersion('0.0.1', '0.0.1')).toBe(false) | ||
expect(newerVersion('v0.0.1', 'v0.0.1')).toBe(false) | ||
expect(newerVersion('', '0.0.1')).toBe(false) | ||
}) | ||
jest.mock("node-fetch"); | ||
jest.mock("download"); | ||
jest.mock('node-fetch') | ||
jest.mock('download') | ||
describe("fetchLatest", () => { | ||
describe('fetchLatest', () => { | ||
beforeEach(() => { | ||
jest.clearAllMocks(); | ||
}); | ||
jest.clearAllMocks() | ||
}) | ||
test("should throw error when api limit is reached", async () => { | ||
const fetch = require("node-fetch"); | ||
test('should throw error when api limit is reached', async () => { | ||
const fetch = require('node-fetch') | ||
const response = { | ||
@@ -27,22 +28,20 @@ status: 403, | ||
Promise.resolve({ | ||
message: "API rate limit exceeded for ", | ||
message: 'API rate limit exceeded for ', | ||
}), | ||
}; | ||
fetch.mockResolvedValue(response); | ||
} | ||
fetch.mockResolvedValue(response) | ||
await expect( | ||
fetchLatest({ | ||
repository: "netlify/test", | ||
package: "test", | ||
destination: "bin/test", | ||
version: "1.0.0", | ||
repository: 'netlify/test', | ||
package: 'test', | ||
destination: 'bin/test', | ||
version: '1.0.0', | ||
extract: true, | ||
}) | ||
).rejects.toEqual( | ||
new Error("API rate limit exceeded, please try again later") | ||
); | ||
}); | ||
}), | ||
).rejects.toEqual(new Error('API rate limit exceeded, please try again later')) | ||
}) | ||
test("should add fetch options to API call when passed as a second argument", async () => { | ||
const fetch = require("node-fetch"); | ||
test('should add fetch options to API call when passed as a second argument', async () => { | ||
const fetch = require('node-fetch') | ||
const response = { | ||
@@ -52,6 +51,6 @@ status: 200, | ||
Promise.resolve({ | ||
tag_name: "v1.0.0", | ||
tag_name: 'v1.0.0', | ||
}), | ||
}; | ||
fetch.mockResolvedValue(response); | ||
} | ||
fetch.mockResolvedValue(response) | ||
@@ -61,20 +60,18 @@ await expect( | ||
{ | ||
repository: "netlify/test", | ||
package: "test", | ||
destination: "bin/test", | ||
version: "1.0.0", | ||
repository: 'netlify/test', | ||
package: 'test', | ||
destination: 'bin/test', | ||
version: '1.0.0', | ||
extract: true, | ||
}, | ||
{ headers: { Authorization: "token some_token" } } | ||
) | ||
); | ||
{ headers: { Authorization: 'token some_token' } }, | ||
), | ||
) | ||
expect(fetch).toHaveBeenCalledTimes(1); | ||
expect( | ||
fetch | ||
).toHaveBeenCalledWith( | ||
"https://api.github.com/repos/netlify/test/releases/latest", | ||
{ headers: { Authorization: "token some_token" } } | ||
); | ||
}); | ||
}); | ||
expect(fetch).toHaveBeenCalledTimes(1) | ||
expect(fetch).toHaveBeenCalledWith('https://api.github.com/repos/netlify/test/releases/latest', { | ||
headers: { Authorization: 'token some_token' }, | ||
}) | ||
}) | ||
}) | ||
/* eslint-enable @typescript-eslint/no-var-requires,node/global-require */ |
@@ -1,31 +0,28 @@ | ||
import * as download from 'download'; | ||
import * as mkdirp from 'mkdirp'; | ||
import fetch, { RequestInit } from 'node-fetch'; | ||
import { gt } from 'semver'; | ||
import { Agent } from 'http'; | ||
import { Agent } from 'http' | ||
interface DownloadOptions { agent?: Agent; } | ||
import download from 'download' | ||
import makeDir from 'make-dir' | ||
import fetch, { RequestInit } from 'node-fetch' | ||
import { gt } from 'semver' | ||
type DownloadOptions = Pick<RequestInit, 'agent'> | ||
export interface Release { | ||
repository: string; | ||
package: string; | ||
destination: string; | ||
version: string; | ||
extract: boolean; | ||
repository: string | ||
package: string | ||
destination: string | ||
version: string | ||
extract: boolean | ||
} | ||
export async function fetchLatest( | ||
release: Release, | ||
fetchOptions?: RequestInit | ||
) { | ||
release.version = await resolveRelease(release.repository, fetchOptions); | ||
return fetchVersion(release, { agent: fetchOptions && fetchOptions.agent }); | ||
export async function fetchLatest(release: Release, fetchOptions?: RequestInit): Promise<void> { | ||
// eslint-disable-next-line no-param-reassign | ||
release.version = await resolveRelease(release.repository, fetchOptions) | ||
const agent = fetchOptions && fetchOptions.agent | ||
return fetchVersion(release, { agent }) | ||
} | ||
export async function fetchVersion( | ||
release: Release, | ||
{ agent }: DownloadOptions = {} | ||
) { | ||
validateRelease(release); | ||
await downloadFile(release, { agent }); | ||
export async function fetchVersion(release: Release, { agent }: DownloadOptions = {}): Promise<void> { | ||
validateRelease(release) | ||
await downloadFile(release, { agent }) | ||
} | ||
@@ -36,34 +33,24 @@ | ||
currentVersion: string, | ||
fetchOptions?: RequestInit | ||
fetchOptions?: RequestInit, | ||
): Promise<boolean> { | ||
const latestVersion = await resolveRelease(repository, fetchOptions); | ||
return newerVersion(latestVersion, currentVersion); | ||
const latestVersion = await resolveRelease(repository, fetchOptions) | ||
return newerVersion(latestVersion, currentVersion) | ||
} | ||
async function resolveRelease( | ||
repository: string, | ||
fetchOptions?: RequestInit | ||
): Promise<string> { | ||
const res = await fetch( | ||
`https://api.github.com/repos/${repository}/releases/latest`, | ||
fetchOptions | ||
); | ||
const json = await res.json(); | ||
if ( | ||
res.status === 403 && | ||
typeof json.message === 'string' && | ||
json.message.includes('API rate limit exceeded') | ||
) { | ||
throw new Error('API rate limit exceeded, please try again later'); | ||
async function resolveRelease(repository: string, fetchOptions?: RequestInit): Promise<string> { | ||
const res = await fetch(`https://api.github.com/repos/${repository}/releases/latest`, fetchOptions) | ||
const json = await res.json() | ||
if (res.status === 403 && typeof json.message === 'string' && json.message.includes('API rate limit exceeded')) { | ||
throw new Error('API rate limit exceeded, please try again later') | ||
} | ||
return json.tag_name; | ||
return json.tag_name | ||
} | ||
async function downloadFile(release: Release, { agent }: DownloadOptions) { | ||
const url = `https://github.com/${release.repository}/releases/download/${release.version}/${release.package}`; | ||
mkdirp.sync(release.destination); | ||
const url = `https://github.com/${release.repository}/releases/download/${release.version}/${release.package}` | ||
await makeDir(release.destination) | ||
await download(url, release.destination, { | ||
extract: release.extract, | ||
agent | ||
}); | ||
agent: agent as Agent, | ||
}) | ||
} | ||
@@ -73,15 +60,15 @@ | ||
if (!release.repository) { | ||
throw new Error('Missing release repository'); | ||
throw new Error('Missing release repository') | ||
} | ||
if (!release.package) { | ||
throw new Error('Missing release package name'); | ||
throw new Error('Missing release package name') | ||
} | ||
if (!release.destination) { | ||
throw new Error('Missing release destination'); | ||
throw new Error('Missing release destination') | ||
} | ||
if (!release.version) { | ||
throw new Error('Missing release version'); | ||
throw new Error('Missing release version') | ||
} | ||
@@ -92,13 +79,13 @@ } | ||
if (!latestVersion) { | ||
return false; | ||
return false | ||
} | ||
if (!currentVersion) { | ||
return true; | ||
return true | ||
} | ||
const l = latestVersion.replace(/^v/, ''); | ||
const c = currentVersion.replace(/^v/, ''); | ||
const normalizedLatestVersion = latestVersion.replace(/^v/, '') | ||
const normalizedCurrentVersion = currentVersion.replace(/^v/, '') | ||
return gt(l, c); | ||
return gt(normalizedLatestVersion, normalizedCurrentVersion) | ||
} |
{ | ||
"compilerOptions": { | ||
"target": "es6", | ||
"module": "commonjs", | ||
"declaration": true, | ||
"outDir": "./dist", | ||
"strict": true | ||
}, | ||
"include": ["src/**/*"], | ||
"exclude": ["node_modules", "**/*.spec.ts"] | ||
"compilerOptions": { | ||
"target": "es6", | ||
"module": "commonjs", | ||
"declaration": true, | ||
"outDir": "./dist", | ||
"strict": true, | ||
"esModuleInterop": true | ||
}, | ||
"include": ["src/**/*"], | ||
"exclude": ["node_modules", "**/*.spec.ts"] | ||
} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
19528
7
20
9
304
2
+ Addedmake-dir@^3.1.0
+ Added@types/download@8.0.5(transitive)
+ Added@types/got@9.6.12(transitive)
+ Added@types/semver@7.5.8(transitive)
+ Added@types/tough-cookie@4.0.5(transitive)
+ Addeddownload@8.0.0(transitive)
+ Addedfile-type@11.1.0(transitive)
+ Addedfilenamify@3.0.0(transitive)
+ Addedform-data@2.5.1(transitive)
+ Addedget-stream@4.1.0(transitive)
+ Addedmake-dir@2.1.03.1.0(transitive)
+ Addedpify@4.0.1(transitive)
+ Addedpump@3.0.2(transitive)
+ Addedsemver@6.3.17.6.3(transitive)
- Removed@types/mkdirp@^0.5.2
- Removedmkdirp@^0.5.1
- Removed@types/download@6.2.4(transitive)
- Removed@types/got@8.3.6(transitive)
- Removed@types/mkdirp@0.5.2(transitive)
- Removed@types/semver@5.5.0(transitive)
- Removedcaw@2.0.1(transitive)
- Removedconfig-chain@1.1.13(transitive)
- Removeddownload@7.1.0(transitive)
- Removedfile-type@8.1.0(transitive)
- Removedfilenamify@2.1.0(transitive)
- Removedget-proxy@2.1.0(transitive)
- Removedini@1.3.8(transitive)
- Removedminimist@1.2.8(transitive)
- Removedmkdirp@0.5.6(transitive)
- Removednpm-conf@1.1.3(transitive)
- Removedproto-list@1.2.4(transitive)
- Removedtunnel-agent@0.6.0(transitive)
Updated@types/download@^8.0.0
Updated@types/semver@^7.0.0
Updateddownload@^8.0.0
Updatedsemver@^7.0.0