drfg

0.0.4 • Public • Published

drfg - Download Release From GitHub

npm Build Status NPM version GitHub version

The idea of this package, is to make downloading / extracting / installing a GitHub repo's latest release a breeze (without creating a new repo, or using Git for that matter). Both in the terminal, and programmatically, if you are into that kind of thing...

npx drfg <github-username/repo>

This works for ALMOST any GitHub repo...

As long as the repository is using GitHub's releases feature, this script will work.

If a call to https://api.github.com/repos/{username/repo}/releases/latest returns a tag_name and zipball_url, then the script will download the zipball from zipball_url.

Additionally, if the repo contains a package.json after extraction, npm install will be run automatically, unless disabled. See advanced usage for more.

Table of Contents

Terminal Usage

Simple Usage

npx drfg <github-repo>

OR

npx drfg <github-repo> <new-folder-name>

For example, if you wanted to "clone" (download/extract/install) the repo sails-react-bootstrap-webpack, just do something like:

npx drfg neonexus/sails-react-bootstrap-webpack

This will download / extract / npm install the repo into a new folder sails-react-bootstrap-webpack. To change where the files get extracted to, add a second parameter to the command:

npx drfg neonexus/sails-react-bootstrap-webpack my-new-site

This will extract into my-new-site, instead of the repo name.

A Little More Advanced

If the repo contains a package.json in the root, but you don't want to npm install after extraction, just add no-npm:

npx drfg <github-repo> <no-npm?>

OR

npx drfg <github-repo> <new-folder> <no-npm?>

You can also provide a specific version to download / extract:

npx drfg <github-repo> <new-folder> <version?> <no-npm?>

NOTE: When supplying a version, you MUST supply a folder name.

This will download v4.2.3, into the folder new-site, and will skip the npm install step:

npx drfg neonexus/sails-react-bootstrap-webpack new-site v4.2.3 no-npm

Installing drfg Globally

npm i -g drfg

You can install drfg globally and run it directly (if you have your $PATH set correctly). This will save a small amount of time, as npx won't have to download and install, before running drfg. However, this also means you won't always be using the most up-to-date version of drfg (GitHub may change their API, security issues may arise, etc.).

To help ensure you are always up-to-date, drfg will use itself to check if there is an update, and if your current version doesn't match the latest version on GitHub, it will let you know. This does not prevent you from using the version you already have installed, but it will ask you if you want to continue (you can simply hit enter).

Example Update

Additional Script Names

Once installed globally, you can use drfg directly, with one of its few different binary names:

  • drfg
  • dl-rl-from-gh
  • download-rl-from-gh
  • download-rl-from-github
  • download-release-from-gh
  • download-release-from-github

Programmatic Usage

Using .then():

const drfg = require('drfg');

drfg.downloadAndExtract('username/my-repo', 'new-folder').then(
    (downloadInfo) => {}
);

// OR

drfg.downloadAndExtract({
    repo: 'username/my-repo',
    destinationFolder: 'my-clone'
}).then((downloadInfo) => {});

Using await:

const drfg = require('drfg');

const downloadInfo = await drfg.downloadAndExtract(
    'username/my-repo',
    'new-folder'
);

// OR

const downloadInfo = await drfg.downloadAndExtract({
    repo: 'username/my-repo',
    destinationFolder: 'my-clone'
});

downloadInfo will look something like:

{
    version: 'v1.0.1',
    downloadTime: '714.82 ms',
    extractionTime: '55.17 ms',
    installationTime: '2.75 s',
    totalTime: '3.61 s',
    zipballSize: '45.11 KiB',
    extractedSize: '146.73 KiB',
    installedSize: '19.45 MiB'
}

Advanced usage

const drfg = require('drfg');

// Parameters are: destination-folder, repo, version, skipNpmInstall
const downloadInfo = await drfg.downloadAndExtract(
    'username/my-repo',
    'new-folder',
    'v1.0.1',
    true
);

// OR
const downloadInfo = await drfg.downloadAndExtract({
    repo: 'username/my-repo',
    version: 'v1.0.1',
    skipInstall: true,
    destinationFolder: 'my-clone'
});

Getting Version Info for a Repo

const drfg = require('drfg');

const latestVersionInfo = await drfg.getVersionInfo('username/my-repo');

// OR

drfg.getVersionInfo('username/my-repo').then((latestVersionInfo) => {
    // Do stuff with the info...
});

latestVersionInfo will look something like:

{
    name: 'v1.0.1 (2023-10-01)',
    description: 'The version description body. This will likely contain markdown.',
    version: 'v1.0.1',
    isDraft: false,
    isPrerelease: false,
    createdAt: '2023-10-01T04:19:00Z',
    publishedAt: '2023-10-01T04:19:00Z',

    // `userSite` is the HTML URL for human use:
    userSite: 'https://github.com/{username/repo}/releases/tag/v1.0.1',

    // `zipball` is the URL drfg will use internally to download the repo:
    zipball: 'https://api.github.com/repos/{username/repo}/zipball/v1.0.1'
}

Get info for a specific version:

const drfg = require('drfg');

const latestVersionInfo = await drfg.getVersionInfo(
    'username/my-repo',
    'v1.0.1'
);

Don't Forget to Handle Errors...

const drfg = require('drfg');

drfg.downloadAndExtract('username/my-repo', 'new-folder')
    .then((successMessage) => {})
    .catch((e) => {});

drfg.getVersionInfo('username/my-repo')
    .then((latestVersionInfo) => {})
    .catch((e) => {});

// OR

try {
    const downloadInfo = await drfg.downloadAndExtract(
        'username/my-repo',
        'new-folder'
    );
} catch (e) {
    // Display the error...
}

try {
    const latestVersionInfo = await drfg.getVersionInfo(
        'username/my-repo'
    );
} catch (e) {
    // Display the error...
}

Package Sidebar

Install

npm i drfg

Weekly Downloads

2

Version

0.0.4

License

GPL-3.0-only

Unpacked Size

63.7 kB

Total Files

6

Last publish

Collaborators

  • neonexus