@vighnesh153/github-gist
TypeScript icon, indicating that this package has built-in type declarations

0.4.7 • Public • Published

GitHub Gist REST API Wrapper

npm npm bundle size (scoped) npm (scoped) GitHub GitHub issues

A simple promise-based wrapper over the GitHub's REST API to play with GitHub Gists.

Installation

npm install @vighnesh153/github-gist

# Peer dependency
npm install axios

Before you begin

To interact with the gist in your GitHub account, you need to create a Personal Access Token with the gist scope.

Usage

Importing

  • Import/Export
import { GithubGist } from '@vighnesh153/github-gist';
  • Require
const { GithubGist } = require('@vighnesh153/github-gist');
  • As a script tag (UMD modules)
<!--More on JS Deliver: https://www.jsdelivr.com/-->
<script src="https://cdn.jsdelivr.net/npm/@vighnesh153/github-gist/dist/main.umd.js"></script>

<script>
  const GithubGist = GithubGistUmd.GithubGist;

  // rest of the code below
</script>

Instantiation

const gist = await GithubGist.initializeUsingGistId({
  // Required
  personalAccessToken: '<GITHUB_PERSONAL_ACCESS_TOKEN>',

  // Required
  gistId: '<YOUR-GIST-ID>',

  // --- OPTIONAL PARAMS BELOW ---

  // Since the gist is also commit based, we can cache the GET urls because git guarantees that
  // if the content changes, its SHA will also change which will lead to a new URL for latest content
  // If you have lot of gists and you think that caching all the files will be heavy, you can disable
  // caching by setting it to false
  enableRequestCaching: true,

  // Whether the Gist will be a public gist or a secret gist. Note that secret gists are still
  // accessible via URLs
  isPublic: false,

  // Content GET url is CORS protected and we cannot use it directly on the frontend. So, by default,
  // we add a Proxy configuration to bypass CORS protection
  //
  // If you are running this on a server/backend, you can set it to `{ type: 'none' }`
  //
  // If you want to configure CORS manually, you can use the third type:
  // `{ type: 'custom', customRequestConfig: (url) => AxiosRequestConfig }`
  //
  corsConfig: { type: 'default' },
});

Files in Gist

A gist can have multiple files. To create a file, do the following:

You can only store string content in a file. So, if you are creating a JSON file, remember to stringify the content

const pikachuJson = gist.createNewFile('pikachu.json');

console.log(pikachuJson.content);
// ''

pikachuJson.content = JSON.stringify({ message: 'Pikachu is the best' });

console.log(JSON.parse(pikachuJson.content));
// { message: "Pikachu is the best" }

Save a file

Just creating the file won't save it on your GitHub Gist. To save, you will have to invoke the save() method on it

// This will save the file on the Gist
await pikachuJson.save();

Save multiple files at once

If you have multiple new files or modified files, you can invoke save() on the gist itself to save all the files in a single HTTP request

const pikachuPython = gist.createNewFile('pikachu.py');
pikachuPython.content = `print("Pikachu is the best")`;

const pikachuJs = gist.createNewFile('pikachu.js');
pikachuJs.content = `console.log("Pikachu is the best")`;

// Saves all files in a single request
await gist.save();

Get an existing file

You can access the previously created file by doing the following

const existingPikachuJson = gist.getFileByName('pikachu.json');

Alternatively, you can also use createNewFile which will return the existing file, if it exists, else, create it and return it.

const existingPikachuJson = gist.createNewFile('pikachu.json');

Fetch the latest content of a gist

If you suspect that your local gist instance is out of date with the actual GitHub Gist, you can fetch the latest content

// Entire gist
await gist.fetchLatestContent();

// Specific file
await pikachuJson.fetchLatestContent();

Get all the files

const files = gist.files;

Get the owner of the gist

const ownerLogin = gist.owner;

Things to be aware of

Gist is an awesome way to store small amount data without having to spin up a database. But it does come with some caveats.

  • You cannot use it in a multi-threaded application because all the save requests are force pushes, and you could overwrite other thread's changes
  • Requests are not atomic
  • Don't invoke save in parallel. Wait for the previous Promise to resolve completely before starting the next one.

Package Sidebar

Install

npm i @vighnesh153/github-gist

Weekly Downloads

1,739

Version

0.4.7

License

MIT

Unpacked Size

249 kB

Total Files

34

Last publish

Collaborators

  • vighnesh153