mirror of
https://github.com/LukeHagar/vercel.git
synced 2025-12-06 21:07:47 +00:00
Add API for frameworks and examples (#3514)
* Add API for frameworks and examples * Adjust headers * Update frameworks list * Always use latest * Add types * Use now repo for downloading and listing * Use .existsSync * Remove unused packages * Use 307 for redirect * Add examples * Update tsconfig.json Co-Authored-By: Steven <steven@ceriously.com> * Make examples unique * Remove detectors from frameworks API * Use /api instead of Next.js * Install dependencies * Rename project * Change name * Empty * Change name * Update api/tsconfig.json Co-Authored-By: Steven <steven@ceriously.com> * Update examples Co-authored-by: Steven <steven@ceriously.com>
This commit is contained in:
70
api/_lib/examples/github-repo-info.ts
Normal file
70
api/_lib/examples/github-repo-info.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import fetch from 'node-fetch';
|
||||
import { Repo } from '../types';
|
||||
import { getExampleList } from './example-list';
|
||||
|
||||
/**
|
||||
* Fetch the meta info of a public github repo
|
||||
* @param {object} repo parsed by the `parse-github-url` package
|
||||
*/
|
||||
export async function getGitHubRepoInfo(repo: Repo) {
|
||||
const response = await fetch(`https://api.github.com/repos/${repo.repo}`, {
|
||||
headers: {
|
||||
Accept: 'application/vnd.github.machine-man-preview+json',
|
||||
},
|
||||
});
|
||||
|
||||
if (response.status !== 200) {
|
||||
console.log(`Non-200 response code from GitHub: ${response.status}`);
|
||||
console.log(await response.text());
|
||||
return null;
|
||||
}
|
||||
|
||||
const parsed = await response.json();
|
||||
|
||||
if (parsed.full_name !== repo.repo) {
|
||||
console.log(`Invalid response from GitHub`);
|
||||
console.log(`Received:`, parsed);
|
||||
return null;
|
||||
}
|
||||
|
||||
const data: { [key: string]: any } = {
|
||||
id: parsed.full_name,
|
||||
name: parsed.name,
|
||||
url: parsed.html_url,
|
||||
owner: parsed.owner.login,
|
||||
description: parsed.description,
|
||||
homepage: parsed.homepage,
|
||||
size: parsed.size,
|
||||
createdAt: parsed.created_at,
|
||||
updatedAt: parsed.updated_at,
|
||||
stars: parsed.stargazers_count,
|
||||
branch: repo.branch,
|
||||
};
|
||||
|
||||
const subdirPath = repo.repo + '/tree/' + repo.branch + '/';
|
||||
|
||||
if (repo.path.startsWith(subdirPath)) {
|
||||
// subdir
|
||||
data.subdir = repo.path.slice(subdirPath.length).split('/');
|
||||
}
|
||||
|
||||
if (data.id === 'zeit/now-examples' && data.subdir) {
|
||||
// from our examples, add `homepage` and `description` fields
|
||||
const example = data.subdir[0];
|
||||
const exampleList = await getExampleList();
|
||||
|
||||
for (const item of exampleList) {
|
||||
if (item.path === `/${example}`) {
|
||||
data.homepage = item.demo;
|
||||
data.description = item.description;
|
||||
data.exampleName = item.example;
|
||||
data.icon = item.icon;
|
||||
data.tagline = item.tagline;
|
||||
data.framework = item.framework;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
Reference in New Issue
Block a user