Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,32 @@ npm install github-api-get

```javascript
---
import { getGithubTopics } from "./githubApi.js";
// in a module
export {};

// async ... getGithubTopics from github:
// import the function from the library
import { getGithubTopics } from "github-api-get";

// define a example usage function
export async function getGithubTopicsFromGithub() {
const loginName = "roebi";
const projectName = "01-01-vanilla-HTML5-starter-page";
const infoLog = true;
const isProd = true;

const githubTopics = getGithubTopics(loginName, projectName, infoLog, isProd) as Promise<String[]>;

const realGithubTopics = await githubTopics;
console.group("realGithubTopics");
console.info("realGithubTopics");
console.info(realGithubTopics);
console.groupEnd();
}

// run the example
await getGithubTopicsFromGithub();

// TODO ...
// if you need a part of the project information
// github-api.project.topics

Expand Down
2 changes: 1 addition & 1 deletion coverage/consts.js.html
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ <h1><a href="index.html">All files</a> consts.js</h1>
<div class="footer quiet pad2 space-top1 center small">
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2023-09-19T10:01:15.058Z
at 2023-09-19T23:40:19.793Z
</div>
<script src="prettify.js"></script>
<script>
Expand Down
331 changes: 331 additions & 0 deletions coverage/githubApiGet.js.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,331 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for githubApiGet.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" />
<link rel="stylesheet" href="base.css" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
.coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png);
}
</style>
</head>

<body>
<div class="wrapper">
<div class="pad1">
<h1><a href="index.html">All files</a> githubApiGet.js</h1>
<div class="clearfix">
<div class="fl pad1y space-right2">
<span class="strong">100% </span>
<span class="quiet">Statements</span>
<span class="fraction">84/84</span>
</div>

<div class="fl pad1y space-right2">
<span class="strong">100% </span>
<span class="quiet">Branches</span>
<span class="fraction">9/9</span>
</div>

<div class="fl pad1y space-right2">
<span class="strong">100% </span>
<span class="quiet">Functions</span>
<span class="fraction">2/2</span>
</div>

<div class="fl pad1y space-right2">
<span class="strong">100% </span>
<span class="quiet">Lines</span>
<span class="fraction">84/84</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the
previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input oninput="onInput()" type="search" id="fileSearch" />
</div>
</template>
</div>
<div class="status-line high"></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">// githubApi.ts
import fetch from "node-fetch";
import jp from "jsonpath";
import { GITHUB_API_BASE_URL } from "./consts.js";
// const isProd = false; // import.meta.env.PROD; // false;
/**
* Returns the github topics of a project.
*
* @remarks
* This method is part of the {@link githubApi | github-api}.
*
* @param {String} loginName - The github login name
* @param {String} projectName - The github project name
* @param {boolean} infoLog - true Logs group and info into the console
* @param {boolean} isProd - true Calls fetch to github api, false returns mock data with same structure
* @returns {Promise&lt;String[]&gt;} The github topics of a project
*/
export async function getGithubTopics(loginName, projectName, infoLog, isProd) {
if (infoLog) {
console.group("getGithubTopics");
}
if (loginName &amp;&amp; projectName) {
if (infoLog) {
console.info("githubApi.ts: loginName: " + loginName);
console.info("githubApi.ts: projectName: " + projectName);
}
if (infoLog) {
console.groupEnd();
}
// https://www.npmjs.com/package/jsonpath MIT License
return Promise.resolve(jp.query(await returnData(loginName, projectName, infoLog, isProd), "$.topics[*]"));
}
else {
if (infoLog) {
console.groupEnd();
}
return Promise.resolve([]);
}
}
/**
* Returns the github the project object / json of a project.
*
* @remarks
* This method is part of the {@link githubApi | github-api}.
*
* @param {String} loginName - The github login name
* @param {String} projectName - The github project name
* @param {boolean} infoLog - true Logs group and info into the console
* @param {boolean} isProd - true Calls fetch to github api, false returns mock data with same structure
* @returns {Promise&lt;any&gt;} The github the project object / json of a project
*/
async function returnData(loginName, projectName, infoLog, isProd) {
if (isProd) {
// get from github project api
const GITHUB_API_PROJECT_URL = GITHUB_API_BASE_URL + "repos/" + loginName + "/";
const response = await fetch(GITHUB_API_PROJECT_URL + projectName);
if (!response.ok) {
if (infoLog) {
console.info("API rate limit exceeded for nnn.nnn.nnn.nnn. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)");
console.info("https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting");
}
// Github has a Rate Limit
// in this case Status is 403 Forbidden
// and return this Message Object / Json:
// {
// message: "API rate limit exceeded for nnn.nnn.nnn.nnn. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)",
// documentation_url: 'https://docs.github.com/rest/overview/resources-in-the-rest-api#rate-limiting'
// }
}
return await response.json();
}
else {
// return mock data
// based on
// github-api/01-01-vanilla-HTML5-starter-page.json
return Promise.resolve({
name: "01-01-vanilla-HTML5-starter-page",
html_url: "https://github.com/roebi/01-01-vanilla-HTML5-starter-page",
description: "vanilla HTML 5 starter page - Have you ever heard of this HTML 5 tags ?",
homepage: "https://roebi.github.io/01-01-vanilla-HTML5-starter-page/",
topics: [" mockdata!", "html5", "html5-template", "roebi", "starter"],
});
}
}
&nbsp;</pre></td></tr></table></pre>

<div class="push"></div>
<!-- for sticky footer -->
</div>
<!-- /wrapper -->
<div class="footer quiet pad2 space-top1 center small">
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2023-09-19T23:40:19.793Z
</div>
<script src="prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="sorter.js"></script>
<script src="block-navigation.js"></script>
</body>
</html>
4 changes: 2 additions & 2 deletions coverage/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ <h1>All files</h1>
</tr>

<tr>
<td class="file high" data-value="githubApi.js"><a href="githubApi.js.html">githubApi.js</a></td>
<td class="file high" data-value="githubApiGet.js"><a href="githubApiGet.js.html">githubApiGet.js</a></td>
<td data-value="100" class="pic high">
<div class="chart">
<div class="cover-fill cover-full" style="width: 100%"></div>
Expand All @@ -117,7 +117,7 @@ <h1>All files</h1>
<div class="footer quiet pad2 space-top1 center small">
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2023-09-19T10:01:15.058Z
at 2023-09-19T23:40:19.793Z
</div>
<script src="prettify.js"></script>
<script>
Expand Down
Loading