UNPKG

@grnsft/if-github-plugin

Version:

Github plugin for Impact Framework.

87 lines 11.4 kB
"use strict"; 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==