Socket
Socket
Sign inDemoInstall

gh-release-fetch

Package Overview
Dependencies
Maintainers
20
Versions
20
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

gh-release-fetch - npm Package Compare versions

Comparing version 1.1.0 to 2.0.0

.editorconfig

6

dist/index.d.ts

@@ -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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc