@grnsft/if-github-plugin
Version:
Github plugin for Impact Framework.
87 lines • 11.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Github = void 0;
const zod_1 = require("zod");
const interfaces_1 = require("@grnsft/if-core/interfaces");
const utils_1 = require("@grnsft/if-core/utils");
const api_1 = require("./api");
const { ConfigError } = utils_1.ERRORS;
exports.Github = (0, interfaces_1.PluginFactory)({
metadata: {
inputs: {},
outputs: {
clones: {
description: 'the clones count of the given repository in the specified time range',
unit: 'number',
'aggregation-method': { time: 'sum', component: 'sum' },
},
size: {
description: 'the size of the given repository',
unit: 'GB',
'aggregation-method': { time: 'sum', component: 'sum' },
},
},
},
implementation: async (inputs, config) => {
const { repo } = config;
const { clones, size } = await getRepoData(repo);
return inputs.map(input => ({
...input,
clones: getClonesForTimeRange(input, clones),
size,
}));
},
inputValidation: (input, _config, index) => {
const schema = zod_1.z.object({
timestamp: zod_1.z.string().or(zod_1.z.date()),
duration: zod_1.z.number().or(zod_1.z.string()),
});
return (0, utils_1.validate)(schema, input, index);
},
configValidation: (config) => {
if (!config || !Object.keys(config)?.length) {
throw new ConfigError('Config is not provided.');
}
const schema = zod_1.z.object({
repo: zod_1.z.string().regex(/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9._-]+$/),
});
return (0, utils_1.validate)(schema, config);
},
});
/**
* Gets repo data from the GitHub API.
*/
const getRepoData = async (repo) => {
const [owner, repoName] = repo.split('/');
return await (0, api_1.GithubAPI)().getRepoClonesAndSizes(owner, repoName);
};
/**
* Gets clones count for the given input data.
*/
const getClonesForTimeRange = (input, clones) => {
const twoWeeksInMilliseconds = 14 * 24 * 60 * 60 * 1000;
const { timestamp, duration } = input;
const evaledDuration = eval(duration) * 1000;
const convertedTimestamp = localToUTC(timestamp);
const startTime = new Date(convertedTimestamp || timestamp).getTime();
const endTime = startTime + evaledDuration;
if (evaledDuration > twoWeeksInMilliseconds) {
console.warn('The `duration` exceeds two weeks. The GitHub API provides a maximum of 2 weeks of data. The plugin calculated data for two weeks.\n');
}
return clones.reduce((totalCount, clone) => {
const cloneTime = new Date(clone.timestamp).getTime();
if (cloneTime >= startTime && cloneTime <= endTime) {
return totalCount + clone.count;
}
return totalCount;
}, 0);
};
/**
* Converts a local time to an ISO string in UTC format.
*/
const localToUTC = (timestamp) => {
const date = new Date(timestamp);
const utcDate = new Date(date.getTime() + date.getTimezoneOffset() * 60000);
return utcDate.toISOString();
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUFzQjtBQUd0QiwyREFBeUQ7QUFDekQsaURBQXVEO0FBRXZELCtCQUFnQztBQUVoQyxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsY0FBTSxDQUFDO0FBRWhCLFFBQUEsTUFBTSxHQUFHLElBQUEsMEJBQWEsRUFBQztJQUNsQyxRQUFRLEVBQUU7UUFDUixNQUFNLEVBQUUsRUFBRTtRQUNWLE9BQU8sRUFBRTtZQUNQLE1BQU0sRUFBRTtnQkFDTixXQUFXLEVBQ1Qsc0VBQXNFO2dCQUN4RSxJQUFJLEVBQUUsUUFBUTtnQkFDZCxvQkFBb0IsRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBQzthQUN0RDtZQUNELElBQUksRUFBRTtnQkFDSixXQUFXLEVBQUUsa0NBQWtDO2dCQUMvQyxJQUFJLEVBQUUsSUFBSTtnQkFDVixvQkFBb0IsRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBQzthQUN0RDtTQUNGO0tBQ0Y7SUFDRCxjQUFjLEVBQUUsS0FBSyxFQUFFLE1BQXNCLEVBQUUsTUFBb0IsRUFBRSxFQUFFO1FBQ3JFLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxNQUFNLENBQUM7UUFDdEIsTUFBTSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUMsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsS0FBSztZQUNSLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO1lBQzVDLElBQUk7U0FDTCxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDRCxlQUFlLEVBQUUsQ0FD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RyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFFNUUsT0FBTyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDL0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuXG5pbXBvcnQge1BsdWdpblBhcmFtcywgQ29uZmlnUGFyYW1zfSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvdHlwZXMnO1xuaW1wb3J0IHtQbHVnaW5GYWN0b3J5fSBmcm9tICdAZ3Juc2Z0L2lmLWNvcmUvaW50ZXJmYWNlcyc7XG5pbXBvcnQge0VSUk9SUywgdmFsaWRhdGV9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5cbmltcG9ydCB7R2l0aHViQVBJfSBmcm9tICcuL2FwaSc7XG5cbmNvbnN0IHtDb25maWdFcnJvcn0gPSBFUlJPUlM7XG5cbmV4cG9ydCBjb25zdCBHaXRodWIgPSBQbHVnaW5GYWN0b3J5KHtcbiAgbWV0YWRhdGE6IHtcbiAgICBpbnB1dHM6IHt9LFxuICAgIG91dHB1dHM6IHtcbiAgICAgIGNsb25lczoge1xuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAndGhlIGNsb25lcyBjb3VudCBvZiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBpbiB0aGUgc3BlY2lmaWVkIHRpbWUgcmFuZ2UnLFxuICAgICAgICB1bml0OiAnbnVtYmVyJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHt0aW1lOiAnc3VtJywgY29tcG9uZW50OiAnc3VtJ30sXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ3RoZSBzaXplIG9mIHRoZSBnaXZlbiByZXBvc2l0b3J5JyxcbiAgICAgICAgdW5pdDogJ0dCJyxcbiAgICAgICAgJ2FnZ3JlZ2F0aW9uLW1ldGhvZCc6IHt0aW1lOiAnc3VtJywgY29tcG9uZW50OiAnc3VtJ30sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGltcGxlbWVudGF0aW9uOiBhc3luYyAoaW5wdXRzOiBQbHVnaW5QYXJhbXNbXSwgY29uZmlnOiBDb25maWdQYXJhbXMpID0+IHtcbiAgICBjb25zdCB7cmVwb30gPSBjb25maWc7XG4gICAgY29uc3Qge2Nsb25lcywgc2l6ZX0gPSBhd2FpdCBnZXRSZXBvRGF0YShyZXBvKTtcblxuICAgIHJldHVybiBpbnB1dHMubWFwKGlucHV0ID0+ICh7XG4gICAgICAuLi5pbnB1dCxcbiAgICAgIGNsb25lczogZ2V0Q2xvbmVzRm9yVGltZVJhbmdlKGlucHV0LCBjbG9uZXMpLFxuICAgICAgc2l6ZSxcbiAgICB9KSk7XG4gIH0sXG4gIGlucHV0VmFsaWRhdGlvbjogKFxuICAgIGlucHV0OiBQbHVnaW5QYXJhbXMsXG4gICAgX2NvbmZpZzogQ29uZmlnUGFyYW1zLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKSA9PiB7XG4gICAgY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xuICAgICAgdGltZXN0YW1wOiB6LnN0cmluZygpLm9yKHouZGF0ZSgpKSxcbiAgICAgIGR1cmF0aW9uOiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlPHouaW5mZXI8dHlwZW9mIHNjaGVtYT4+KHNjaGVtYSwgaW5wdXQsIGluZGV4KTtcbiAgfSxcbiAgY29uZmlnVmFsaWRhdGlvbjogKGNvbmZpZzogQ29uZmlnUGFyYW1zKSA9PiB7XG4gICAgaWYgKCFjb25maWcgfHwgIU9iamVjdC5rZXlzKGNvbmZpZyk/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdDb25maWcgaXMgbm90IHByb3ZpZGVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICAgIHJlcG86IHouc3RyaW5nKCkucmVnZXgoL15bYS16QS1aMC05Xy1dK1xcL1thLXpBLVowLTkuXy1dKyQvKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGNvbmZpZyk7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBHZXRzIHJlcG8gZGF0YSBmcm9tIHRoZSBHaXRIdWIgQVBJLlxuICovXG5jb25zdCBnZXRSZXBvRGF0YSA9IGFzeW5jIChyZXBvOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgW293bmVyLCByZXBvTmFtZV0gPSByZXBvLnNwbGl0KCcvJyk7XG5cbiAgcmV0dXJuIGF3YWl0IEdpdGh1YkFQSSgpLmdldFJlcG9DbG9uZXNBbmRTaXplcyhvd25lciwgcmVwb05hbWUpO1xufTtcblxuLyoqXG4gKiBHZXRzIGNsb25lcyBjb3VudCBmb3IgdGhlIGdpdmVuIGlucHV0IGRhdGEuXG4gKi9cbmNvbnN0IGdldENsb25lc0ZvclRpbWVSYW5nZSA9IChcbiAgaW5wdXQ6IFBsdWdpblBhcmFtcyxcbiAgY2xvbmVzOiB7dGltZXN0YW1wOiBzdHJpbmc7IGNvdW50OiBudW1iZXJ9W11cbikgPT4ge1xuICBjb25zdCB0d29XZWVrc0luTWlsbGlzZWNvbmRzID0gMTQgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICBjb25zdCB7dGltZXN0YW1wLCBkdXJhdGlvbn0gPSBpbnB1dDtcbiAgY29uc3QgZXZhbGVkRHVyYXRpb24gPSBldmFsKGR1cmF0aW9uKSAqIDEwMDA7XG4gIGNvbnN0IGNvbnZlcnRlZFRpbWVzdGFtcCA9IGxvY2FsVG9VVEModGltZXN0YW1wKTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoY29udmVydGVkVGltZXN0YW1wIHx8IHRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICBjb25zdCBlbmRUaW1lID0gc3RhcnRUaW1lICsgZXZhbGVkRHVyYXRpb247XG5cbiAgaWYgKGV2YWxlZER1cmF0aW9uID4gdHdvV2Vla3NJbk1pbGxpc2Vjb25kcykge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdUaGUgYGR1cmF0aW9uYCBleGNlZWRzIHR3byB3ZWVrcy4gVGhlIEdpdEh1YiBBUEkgcHJvdmlkZXMgYSBtYXhpbXVtIG9mIDIgd2Vla3Mgb2YgZGF0YS4gVGhlIHBsdWdpbiBjYWxjdWxhdGVkIGRhdGEgZm9yIHR3byB3ZWVrcy5cXG4nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBjbG9uZXMucmVkdWNlKCh0b3RhbENvdW50LCBjbG9uZSkgPT4ge1xuICAgIGNvbnN0IGNsb25lVGltZSA9IG5ldyBEYXRlKGNsb25lLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuXG4gICAgaWYgKGNsb25lVGltZSA+PSBzdGFydFRpbWUgJiYgY2xvbmVUaW1lIDw9IGVuZFRpbWUpIHtcbiAgICAgIHJldHVybiB0b3RhbENvdW50ICsgY2xvbmUuY291bnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvdGFsQ291bnQ7XG4gIH0sIDApO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGxvY2FsIHRpbWUgdG8gYW4gSVNPIHN0cmluZyBpbiBVVEMgZm9ybWF0LlxuICovXG5jb25zdCBsb2NhbFRvVVRDID0gKHRpbWVzdGFtcDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHRpbWVzdGFtcCk7XG4gIGNvbnN0IHV0Y0RhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSArIGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwKTtcblxuICByZXR1cm4gdXRjRGF0ZS50b0lTT1N0cmluZygpO1xufTtcbiJdfQ==