npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

github-apiv4

v3.0.1

Published

A collection of Github Graphql APIv4 queries.

Downloads

6

Readme

Github-APIv4

npm version

API | Contribute | FAQ

Github-APIv4 is a Node library that provides a list of Github graphql (APIv4) queries and their respective return types.

Getting Started

Installation

To use Github-APIv4, run:

npm i github-apiv4
# or "yarn add github-apiv4"

Usage

Javascript Example - query Viewer:

Save file as exampleJS.js

const githubApiv4 = require("github-apiv4");
const fetch = require("isomorphic-fetch");
const accessCode = "YOUR_GITHUB_ACCESS_CODE";

//Make the quest here

fetch("https://api.github.com/graphql", {
	method: "POST",
	headers: {
		"Content-Type": "application/json",
		Authorization: `bearer ${accessCode}`,
	},
	body: JSON.stringify({ query: githubApiv4.queries.Viewer }),
})
	.then((res) => res.json())
	.then((res) => console.log(res.data));

Github API response (res.data is) of type githubApiv4.types.Viewer

Execute script on the command line

node exampleJS.js

Typescript Example - query Viewer:

Save file as exampleJS.js

const { githubApiv4 } = "github-apiv4",
	{ fetch } = require("isomorphic-fetch");

const accessCode = "YOUR_GITHUB_ACCESS_CODE";
const query = queries.Viewer(`bio ${queries.Following({ first: 10, fields: "login" })}`);

//Make the request here using your HTTP client of choice
fetch("https://api.github.com/graphql", {
	method: "POST",
	headers: {
		"Content-Type": "application/json",
		Authorization: `bearer ${accessCode}`,
	},
	body: JSON.stringify({ query: query }),
})
	.then((res) =>
		res.json().then((res) => {
			//Check if the response has a data
			if (res.data) {
        //The return type is a typeof Viewer
				const response = res.data;

				console.log(response.viewer.bio);
				console.log(response.viewer.following);
			} else {
				//Show the error

				console.log("An error occurred", res);
				console.log(query);
			}
		})
	)
	.catch((err) => console.log(err));

Typescript Example - query Viewer:

Save file as exampleTS.ts

import * as githubApiv4 from "github-apiv4";
import * as fetch from "isomorphic-fetch";

const accessCode = "YOUR_GITHUB_ACCESS_CODE";
const query = queries.Viewer(`bio ${queries.Following({ first: 10, fields: "login" })}`);

//Make the request here using your HTTP client of choice
fetch("https://api.github.com/graphql", {
	method: "POST",
	headers: {
		"Content-Type": "application/json",
		Authorization: `bearer ${accessCode}`,
	},
	body: JSON.stringify({ query: query }),
})
	.then((res) =>
		res.json().then((res) => {
			//Check if the response has a data
			if (res.data) {
				//The return type is a typeof Viewer
				const response: types.Viewer = res.data;

				console.log(response.viewer.bio);
				console.log(response.viewer.following);
			} else {
				//Show the error

				console.log("An error occurred", res);
				console.log(query);
			}
		})
	)
	.catch((err) => console.log(err));

JavaScript Example - query Repository:

Save file as repositoryJS.js

const { githubApiv4 } = require("github-apiv4"),
	{ fetch } = require("isomorphic-fetch");

const accessCode = "YOUR_GITHUB_ACCESS_CODE";

//Assign Quaries to variables to help you not repeat yours
const user = queries.User("bio");
const commitCommentField = `
  body ${queries.Author("login")}
  ${queries.ReactionGroups("createdAt")}  
  ${queries.Reactions({ first: 10, fields: `${queries.Reactable("id")}` })} 
  ${queries.UserContentEdits({ first: 10, fields: "createdAt" })} 
`;

//This creates the fields that will be used for the request
//Create as many Queries as you want and you can chain them
const fields = `
  ${queries.AssignableUsers({ first: 10, fields: "bio name" })} 
  ${queries.BranchProtectionRules({ first: 10, fields: "allowsDeletions" })} 
  ${queries.CodeOfConduct("id url body")}
  ${queries.Collaborators({ first: 10, fields: "name url login", affiliation: "OUTSIDE" })}
  ${queries.CommitComments({ first: 10, fields: commitCommentField })}
  contactLinks {name}
  defaultBranchRef{id name}
  ${queries.DeployKeys({ first: 10, fields: "id title " })}
  ${queries.Deployments({ first: 10, fields: "environment description" })}
  ${queries.Forks({ first: 10, fields: "description createdAt id" })}
  ${queries.Issue("22", "id body createdAt")}
  ${queries.Label("severe: new feature", "description")}
  ${queries.Labels({ first: 10, fields: "description" })}
  ${queries.Languages({ first: 10, fields: "color name" })}
  ${queries.LatestRelease("description")}
  ${queries.LicenseInfo("body")}
  ${queries.MentionableUsers({ first: 10, fields: "login" })} 
  ${queries.Milestones({ first: 10, fields: "description" })}
  ${queries.Milestone(3, "description")} 
  ${queries.Packages({ first: 10, fields: "name" })}
  ${queries.PinnedIssues({ first: 10, fields: "databaseId" })}
  ${queries.Projects({ first: 10, fields: "number body" })}
  ${queries.Project(14, "body number")} 
  ${queries.Refs({ refPrefix: "refs/", first: 10, fields: "prefix name" })}
  ${queries.Ref("refs/heads/dwds-integration", "name ")}
  ${queries.Releases({ first: 10, fields: "name" })}
  ${queries.Release("v0.4.0", "name description")}
  ${queries.RepositoryTopics({ first: 10, fields: `${queries.Topic(`name ${queries.RelatedTopics(10, "name")}`)}` })}
  ${queries.Stargazers({ first: 10, fields: "login" })}
  ${queries.Submodules({ first: 10, fields: "name" })}
  ${queries.VulnerabilityAlerts({ first: 10, fields: "createdAt" })}
  ${queries.Watchers({ first: 10, fields: "login" })}  
`;

//This passes the fields to the RepositoryQuery Query
const query = queries.RepositoryQuery("fundhillapi", "Sectur1", fields);

//Make the request here using your HTTP client of choice
fetch("https://api.github.com/graphql", {
	method: "POST",
	headers: {
		"Content-Type": "application/json",
		Authorization: `bearer ${accessCode}`,
	},
	body: JSON.stringify({ query: query }),
})
	.then((res) =>
		res.json().then((res) => {
			//Check if the response has a data
			if (res.data) {
        //The return type is a typeof Repository
				const response = res.data;

				console.log(response.repository.assignableUsers.nodes[4].name);
				console.log(response.repository.branchProtectionRules);
				console.log(response.repository.codeOfConduct.body);
				console.log(response.repository.collaborators.nodes[0].login);
				console.log(response.repository.commitComments.nodes[9].author);
				console.log(response.repository.commitComments.nodes[9].reactionGroups);
				console.log(response.repository.commitComments.nodes[9].reactions.nodes);
				console.log(response.repository.commitComments.nodes[9].userContentEdits.nodes);
				console.log(response.repository.contactLinks[0]);
				console.log(response.repository.defaultBranchRef);
				console.log(response.repository.deployments.nodes[0].description);
				console.log(response.repository.forks.nodes);
				console.log(response.repository.issue.body);
				console.log(response.repository.label);
				console.log(response.repository.labels);
				console.log(response.repository.languages.nodes[5].name);
				console.log(response.repository.latestRelease);
				console.log(response.repository.licenseInfo);
				console.log(response.repository.mentionableUsers);
				console.log(response.repository.milestones.nodes[4].description);
				console.log(response.repository.milestone.description);
				console.log(response.repository.packages);
				console.log(response.repository.projects.nodes);
				console.log(response.repository.project);
				console.log(response.repository.refs.nodes[5]);
				console.log(response.repository.ref);
				console.log(response.repository.releases.nodes);
				console.log(response.repository.release);
				console.log(response.repository.repositoryTopics.nodes[2].topic.relatedTopics[5].name);
				console.log(response.repository.stargazers);
				console.log(response.repository.submodules.nodes);
				console.log(response.repository.vulnerabilityAlerts);
			} else {
				//There can be more that one error in a Query so you can loop through them
				for (let error of res.errors) {
					console.log(error.message, error.locations);
				}

				console.log("An error occurred", res);
			}
		})
	)
	.catch((err) => console.log(err));

Typescript Example - query Repository:

Save file as repositoryTS.ts

import * as githubApiv4 from "github-apiv4";
import * as fetch from "isomorphic-fetch";

const accessCode = "YOUR_GITHUB_ACCESS_CODE";

//Assign Quaries to variables to help you not repeat yours
const user = queries.User("bio");
const commitCommentField = `
  body ${queries.Author("login")}
  ${queries.ReactionGroups("createdAt")}  
  ${queries.Reactions({ first: 10, fields: `${queries.Reactable("id")}` })} 
  ${queries.UserContentEdits({ first: 10, fields: "createdAt" })} 
`;

//This creates the fields that will be used for the request
//Create as many Queries as you want and you can chain them
const fields = `
  ${queries.AssignableUsers({ first: 10, fields: "bio name" })} 
  ${queries.BranchProtectionRules({ first: 10, fields: "allowsDeletions" })} 
  ${queries.CodeOfConduct("id url body")}
  ${queries.Collaborators({ first: 10, fields: "name url login", affiliation: "OUTSIDE" })}
  ${queries.CommitComments({ first: 10, fields: commitCommentField })}
  contactLinks {name}
  defaultBranchRef{id name}
  ${queries.DeployKeys({ first: 10, fields: "id title " })}
  ${queries.Deployments({ first: 10, fields: "environment description" })}
  ${queries.Forks({ first: 10, fields: "description createdAt id" })}
  ${queries.Issue("22", "id body createdAt")}
  ${queries.Label("severe: new feature", "description")}
  ${queries.Labels({ first: 10, fields: "description" })}
  ${queries.Languages({ first: 10, fields: "color name" })}
  ${queries.LatestRelease("description")}
  ${queries.LicenseInfo("body")}
  ${queries.MentionableUsers({ first: 10, fields: "login" })} 
  ${queries.Milestones({ first: 10, fields: "description" })}
  ${queries.Milestone(3, "description")} 
  ${queries.Packages({ first: 10, fields: "name" })}
  ${queries.PinnedIssues({ first: 10, fields: "databaseId" })}
  ${queries.Projects({ first: 10, fields: "number body" })}
  ${queries.Project(14, "body number")} 
  ${queries.Refs({ refPrefix: "refs/", first: 10, fields: "prefix name" })}
  ${queries.Ref("refs/heads/dwds-integration", "name ")}
  ${queries.Releases({ first: 10, fields: "name" })}
  ${queries.Release("v0.4.0", "name description")}
  ${queries.RepositoryTopics({ first: 10, fields: `${queries.Topic(`name ${queries.RelatedTopics(10, "name")}`)}` })}
  ${queries.Stargazers({ first: 10, fields: "login" })}
  ${queries.Submodules({ first: 10, fields: "name" })}
  ${queries.VulnerabilityAlerts({ first: 10, fields: "createdAt" })}
  ${queries.Watchers({ first: 10, fields: "login" })}  
`;

//This passes the fields to the RepositoryQuery Query
const query = queries.RepositoryQuery("fundhillapi", "Sectur1", fields);

//Make the request here using your HTTP client of choice
fetch("https://api.github.com/graphql", {
	method: "POST",
	headers: {
		"Content-Type": "application/json",
		Authorization: `bearer ${accessCode}`,
	},
	body: JSON.stringify({ query: query }),
})
	.then((res) =>
		res.json().then((res) => {
			//Check if the response has a data
			if (res.data) {
				//This creates a response variable with the typeof Repository
				const response: types.Repository = res.data;

				console.log(response.repository.assignableUsers.nodes[4].name);
				console.log(response.repository.branchProtectionRules);
				console.log(response.repository.codeOfConduct.body);
				console.log(response.repository.collaborators.nodes[0].login);
				console.log(response.repository.commitComments.nodes[9].author);
				console.log(response.repository.commitComments.nodes[9].reactionGroups);
				console.log(response.repository.commitComments.nodes[9].reactions.nodes);
				console.log(response.repository.commitComments.nodes[9].userContentEdits.nodes);
				console.log(response.repository.contactLinks[0]);
				console.log(response.repository.defaultBranchRef);
				console.log(response.repository.deployments.nodes[0].description);
				console.log(response.repository.forks.nodes);
				console.log(response.repository.issue.body);
				console.log(response.repository.label);
				console.log(response.repository.labels);
				console.log(response.repository.languages.nodes[5].name);
				console.log(response.repository.latestRelease);
				console.log(response.repository.licenseInfo);
				console.log(response.repository.mentionableUsers);
				console.log(response.repository.milestones.nodes[4].description);
				console.log(response.repository.milestone.description);
				console.log(response.repository.packages);
				console.log(response.repository.projects.nodes);
				console.log(response.repository.project);
				console.log(response.repository.refs.nodes[5]);
				console.log(response.repository.ref);
				console.log(response.repository.releases.nodes);
				console.log(response.repository.release);
				console.log(response.repository.repositoryTopics.nodes[2].topic.relatedTopics[5].name);
				console.log(response.repository.stargazers);
				console.log(response.repository.submodules.nodes);
				console.log(response.repository.vulnerabilityAlerts);
			} else {
				//There can be more that one error in a Query so you can loop through them
				for (let error of res.errors) {
					console.log(error.message, error.locations);
				}
				console.log("An error occurred", res);
			}
		})
	)
	.catch((err) => console.log(err));

Typescript Example - creating a PullRequest:

Save file as createPullrequest.js

const { types } = require("github-apiv4"),
  fetch = require("isomorphic-fetch"),
  { mutation } = require("./mutations")

//This assigns the mutation to the mutation variable
const mutation = mutations.CreatePullRequest({baseRefName:"master", body:"Merge Mutation with Master", headRefName:"Awesome", title:"Mutations", repositoryId:"MDEwOlJlcG9zaXRvcnkzNzAzNDg4NDU=",},queries.PullRequest("title body id")),

//Make the request here using your HTTP client of choice
fetch('https://api.github.com/graphql', {
  method: 'POST', "headers": {
    'Content-Type': 'application/json',
    'Authorization': `bearer ${accessCode}`,
    "Accept": "application/vnd.github.update-refs-preview+json " + "application/vnd.github.hawkgirl-preview+json " +
      "application/vnd.github.starfox-preview+json " + "application/vnd.github.merge-info-preview+json " +
      "application/vnd.github.corsair-preview+json " + "application/vnd.github.flash-preview+json " +
      "application/vnd.github.bane-preview+json " + "application/vnd.github.package-deletes-preview+json " +
      "application/vnd.github.slothette-preview+json " + "application/vnd.github.stone-crop-preview+json"
  },
  body: JSON.stringify({ query: mutation }),
}).then(res => res.json().then(res => {
  //Check if the response has a data
  if (res.data) {
    //The return type is a typeof PullRequest
    const response:types.CreatePullRequest = res.data; 

    if(res.errors) console.log(res.errors)

    console.log(data.createPullRequest.pullRequest)
  } else {
    //There can be more that one error in a Query so you can loop through them
    console.log("An error occurred", res)
  }
}))
  .catch(err => console.log(err));

Typescript Example - creating a PullRequesr:

Save file as createPullrequest.ts

import { types } from "github-apiv4"
import fetch from "isomorphic-fetch";
import { mutation } from "./mutations"

//This assigns the mutation
const mutation = mutations.CreatePullRequest({baseRefName:"master", body:"Merge Mutation with Master", headRefName:"Awesome", title:"Mutations", repositoryId:"MDEwOlJlcG9zaXRvcnkzNzAzNDg4NDU=",},queries.PullRequest("title body id")),

fetch('https://api.github.com/graphql', {
  method: 'POST', "headers": {
    'Content-Type': 'application/json',
    'Authorization': `bearer ${accessCode}`,
    "Accept": "application/vnd.github.update-refs-preview+json " + "application/vnd.github.hawkgirl-preview+json " +
      "application/vnd.github.starfox-preview+json " + "application/vnd.github.merge-info-preview+json " +
      "application/vnd.github.corsair-preview+json " + "application/vnd.github.flash-preview+json " +
      "application/vnd.github.bane-preview+json " + "application/vnd.github.package-deletes-preview+json " +
      "application/vnd.github.slothette-preview+json " + "application/vnd.github.stone-crop-preview+json"
  },
  body: JSON.stringify({ query: mutation }),
}).then(res => res.json().then(res => {
  //Check if the response has a data

  if (res.data) {
    //There can be more that one error in a Query so you can loop through them
    if(res.errors)console.log(res.errors)

    //This creates a response variable with the typeof PullRequest
    const data: types.CreatePullRequest = res.data

    console.log(data.createPullRequest.pullRequest)
  } else {
    //There can be more that one error in a Query so you can loop through them
    console.log("An error occurred", res)
  }
}))
  .catch(err => console.log(err));

Save file as createProject.js

const { types } = require("github-apiv4"),
 { fetch } = require("isomorphic-fetch"),
 { mutation } = ("./mutations")

//This creates the mutation
const mutation = mutations.mutations.CreateProject({name: "GitHubv4", ownerId:"MDQ6VXNlcjIyODE3NDky",body:"This is the test project for Githubv4", repositoryIds:[`"MDEwOlJlcG9zaXRvcnkzNjgxMzc4NjU="`]}, queries.Project("body url")),

//Make the request here using your HTTP client of choice
fetch('https://api.github.com/graphql', {
  method: 'POST', "headers": {
    'Content-Type': 'application/json',
    'Authorization': `bearer ${accessCode}`,
    "Accept": "application/vnd.github.update-refs-preview+json " + "application/vnd.github.hawkgirl-preview+json " +
      "application/vnd.github.starfox-preview+json " + "application/vnd.github.merge-info-preview+json " +
      "application/vnd.github.corsair-preview+json " + "application/vnd.github.flash-preview+json " +
      "application/vnd.github.bane-preview+json " + "application/vnd.github.package-deletes-preview+json " +
      "application/vnd.github.slothette-preview+json " + "application/vnd.github.stone-crop-preview+json"
  },
  body: JSON.stringify({ query: mutation }),
}).then(res => res.json().then(res => {
  //Check if the response has a data
  if (res.data) {
    //The return type is a typeof CreateProject
    const response = res.data;

    //There can be more that one error in a Query so you can loop through them
    if(res.errors)console.log(res.errors)

    console.log(data.CreateProject.project)
  } else {
    console.log("An error occurred", res)
  }
}))
  .catch(err => console.log(err));

Typescript Example - creating a Project:

Save file as createProject.ts

import { types } from "github-apiv4"
import fetch from "isomorphic-fetch";
import { mutation } from "./mutations"

//This creates the mutation
const mutation = mutations.mutations.CreateProject({name: "GitHubv4", ownerId:"MDQ6VXNlcjIyODE3NDky",body:"This is the test project for Githubv4", repositoryIds:[`"MDEwOlJlcG9zaXRvcnkzNjgxMzc4NjU="`]}, queries.Project("body url")),

//Make the request here using your HTTP client of choice
fetch('https://api.github.com/graphql', {
  method: 'POST', "headers": {
    'Content-Type': 'application/json',
    'Authorization': `bearer ${accessCode}`,
    "Accept": "application/vnd.github.update-refs-preview+json " + "application/vnd.github.hawkgirl-preview+json " +
      "application/vnd.github.starfox-preview+json " + "application/vnd.github.merge-info-preview+json " +
      "application/vnd.github.corsair-preview+json " + "application/vnd.github.flash-preview+json " +
      "application/vnd.github.bane-preview+json " + "application/vnd.github.package-deletes-preview+json " +
      "application/vnd.github.slothette-preview+json " + "application/vnd.github.stone-crop-preview+json"
  },
  body: JSON.stringify({ query: mutation }),
}).then(res => res.json().then(res => {
  //Check if the response has a data
  if (res.data) {
    
    //There can be more that one error in a Query so you can loop through them
    if(res.errors)console.log(res.errors)

    //This creates a response variable with the typeof CreateProject
    const data: types.CreateProject = res.data
    
    console.log(data.CreateProject.project)
  } else {
    console.log("An error occurred", res)
  }
}))
  .catch(err => console.log(err));

Github API response (res.data is) of type githubApiv4.types.Viewer

Execute script on the command line

tsc exampleTS.ts
node exampleTS.js

Apollo Client Example - query Repository:

Save file as apolloClient.ts

import * as githubApiV4 from "github-apiv4";
import { HttpLink } from "apollo-link-http";
import ApolloClient from "apollo-client";
import { InMemoryCache, IntrospectionFragmentMatcher, NormalizedCacheObject } from "apollo-cache-inmemory";
import { fetch } from "cross-fetch";
import gql from "graphql-tag";

const accessCode = "YOUR_GITHUB_ACCESS_CODE";
const client: ApolloClient<NormalizedCacheObject> = new ApolloClient({
	link: new HttpLink({ uri: "https://api.github.com/graphql", fetch }),
	cache: new InMemoryCache({
		fragmentMatcher: new IntrospectionFragmentMatcher({
			introspectionQueryResultData: {
				__schema: {
					types: [],
				},
			},
		}),
	}),
});

// query variables used in repository query (githubApiV4.queryVariables.Repository)
const queryVariables: githubApiV4.queryVariables.Repository = {
	repositoryName: "github-apiv4",
	repositoryOwner: "community",
};

// query with apollo-client
client
	.query({
		query: gql`
			${githubApiV4.queries.Repository}
		`,
		variables: queryVariables,
		context: {
			headers: {
				Authorization: `bearer ${accessCode}`,
			},
		},
	})
	.then((res) => {
		if (res.data as githubApiV4.types.Repository) {
			console.log(res.data);
		} else {
			console.log("Type Mismatch!");
		}
	});

Github API response (res.data is) of type githubApiv4.types.Repository

Execute script on the command line

tsc apolloClient.ts
node apolloClient.js

Resources

Contribute

Contributing to Github-APIv4

Check out contributing guide to get an overview of github-apiv4 development.

FAQ

Questions?