eleventy-plugin-github-repos
Version:
An Eleventy plugin that creates a collection containing metadata from an account's GitHub repositories
98 lines (97 loc) • 3.76 kB
JavaScript
import Fetch from "@11ty/eleventy-fetch";
import logger from 'cli-logger';
export default function (eleventyConfig, _options = {}) {
eleventyConfig.addCollection('githubRepos', async (collectionApi) => {
const configDefaults = {
apiKey: '',
cacheRequests: false,
cacheDuration: '1d',
debugMode: false,
quitOnError: false,
userAccount: ''
};
const APP_NAME = 'Eleventy-Plugin-GitHub-Repos';
const durationStr = `[${APP_NAME}] Duration`;
var conf = { console: true, level: logger.INFO };
conf.prefix = function (record) {
return `[${APP_NAME}]`;
};
var log = logger(conf);
const config = Object.assign({}, configDefaults, _options);
const debugMode = config.debugMode || false;
log.level(debugMode ? log.DEBUG : log.INFO);
log.debug('Debug mode enabled');
if (debugMode) {
console.log('\nConfiguration:');
console.table(config);
}
if (!config.userAccount) {
log.error('Missing GitHub user account');
process.exit(1);
}
if (!config.apiKey) {
log.error('No GitHub API key provided, using unauthenticated access');
if (config.quitOnError)
process.exit(1);
}
var currentPage = 0;
var done = false;
var options = {};
var repoURL;
var requestOptions = {};
var result = [];
if (config.apiKey)
requestOptions.headers = { 'Authorization': `Bearer ${config.apiKey}` };
options.fetchOptions = { options: requestOptions };
if (config.cacheRequests) {
options.duration = config.cacheDuration;
options.type = "json";
}
if (debugMode) {
console.log('Fetch Options:');
console.table(options);
console.log();
}
log.info(`Fetching GitHub repositories for ${config.userAccount} using ${config.cacheRequests ? 'Eleventy-Fetch' : 'fetch'}`);
console.time(durationStr);
while (!done) {
currentPage += 1;
repoURL = `https://api.github.com/users/${config.userAccount}/repos?per_page=100&page=${currentPage}`;
log.info(`Fetching ${repoURL}`);
if (config.cacheRequests) {
var data = await Fetch(repoURL, options);
if (data.length > 0) {
log.debug(`Found ${data.length} repos`);
result = result.concat(data);
}
else {
log.debug('No more repos');
done = true;
}
}
else {
var response = await fetch(repoURL, requestOptions);
var tempRes = await response.json();
if (response.status == 200) {
if (tempRes.length === 0) {
done = true;
}
else {
log.debug(`Found ${tempRes.length} repos`);
result = result.concat(tempRes);
}
}
else {
log.error(`\nError: ${response.status} - ${response.statusText}\n`);
if (tempRes.message)
log.info(tempRes.message, tempRes.documentation_url);
if (config.quitOnError)
process.exit(1);
}
}
}
console.timeEnd(durationStr);
log.info(`Gathered repository metadata for ${result.length} repos`);
return result;
});
}