UNPKG

@codefresh-io/cf-git-providers

Version:

An NPM module/CLI for interacting with various git providers

195 lines 7.72 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RateLimitManager = exports.hashToken = exports.isJsonString = exports.cleanUrlPrefix = exports.cleanEncodedFilePath = exports.assertPatWritePermission = exports.createProgress = exports.writeResultsToFile = exports.createNewLogger = exports.parseGitContext = exports.exitWithError = exports.errormsg = exports.to = void 0; const chalk_1 = require("chalk"); const debug_1 = __importDefault(require("debug")); const progress_1 = __importDefault(require("progress")); const git = __importStar(require("isomorphic-git")); const http = __importStar(require("isomorphic-git/http/node")); const uuid_1 = require("uuid"); const nodefs = __importStar(require("fs")); const fs_1 = require("fs"); const crypto_1 = require("crypto"); // eslint-disable-next-line @typescript-eslint/no-var-requires const CFError = require('cf-errors'); const to = async (fn) => { try { let res; if (typeof fn === 'function') { res = await fn(); } else { res = await fn; } return [null, res]; } catch (error) { return [error, null]; } }; exports.to = to; const errormsg = (msg) => { return (0, chalk_1.red) `error: ` + msg; }; exports.errormsg = errormsg; const exitWithError = (msg) => { console.error((0, exports.errormsg)(msg)); // eslint-disable-next-line unicorn/no-process-exit process.exit(1); }; exports.exitWithError = exitWithError; const parseGitContext = (gitContextStr) => { const isBase64 = /^([\d+/A-Za-z]{4})*([\d+/A-Za-z]{3}=|[\d+/A-Za-z]{2}==)?$/; if (isBase64.test(gitContextStr)) { gitContextStr = Buffer.from(gitContextStr, 'base64').toString('utf-8'); } try { const gitContext = JSON.parse(gitContextStr); return gitContext; } catch (error) { (0, exports.exitWithError)(`could not parse git context json, with error ${error}`); } }; exports.parseGitContext = parseGitContext; const createNewLogger = (namespace) => { const logger = (0, debug_1.default)(namespace); return { info: (msg) => logger('[%s] level: %s, msg: %s', new Date().toISOString(), 'info', msg), warn: (msg) => logger('[%s] level: %s, msg: %s', new Date().toISOString(), 'warn', msg), debug: (msg) => logger('[%s] level: %s, msg: %s', new Date().toISOString(), 'debug', msg), error: (msg) => logger('[%s] level: %s, msg: %s', new Date().toISOString(), 'error', msg), }; }; exports.createNewLogger = createNewLogger; const writeResultsToFile = async (fileName, data) => { const [writeErr] = await (0, exports.to)(async () => (0, fs_1.writeFileSync)(fileName, data)); if (writeErr) { (0, exports.exitWithError)(`failed to write result to file ${fileName}", ${writeErr}`); } }; exports.writeResultsToFile = writeResultsToFile; const createProgress = (resourceName, total, refreshMs = 200) => { const progressBar = new progress_1.default(`fetching ${resourceName} (:current/:total) [:bar] :percent eta=:etas elapsed=:elapsed`, { total, complete: '=', incomplete: ' ', width: 30, }); const interval = setInterval(() => { progressBar.render(); if (progressBar.complete) { clearInterval(interval); } }, refreshMs); const makeTick = (n = 1) => { progressBar.tick(n); }; return { tick: makeTick }; // return a simple interface }; exports.createProgress = createProgress; const assertPatWritePermission = async (url, auth) => { const tag = `write-check-${(0, uuid_1.v4)()}`; const dir = `/tmp/${tag}`; // create tmp dir if doesnt exist const [accessErr] = await (0, exports.to)(nodefs.promises.access(dir, nodefs.constants.F_OK)); if (accessErr) { await nodefs.promises.mkdir(dir, { recursive: true }); } try { await git.clone({ fs: nodefs, http, dir, url, onAuth: () => (auth) }); await git.tag({ fs: nodefs, dir, force: true, ref: tag }); // attempt to push the tag to verify write permissions await git.push({ fs: nodefs, http, dir, force: true, onAuth: () => (auth) }); // delete and push the write check tag await git.deleteTag({ fs: nodefs, dir, ref: tag }); await git.push({ fs: nodefs, http, dir, force: true, onAuth: () => (auth) }); } catch (error) { if (error instanceof git.Errors.HttpError) { const statusCode = error.data.statusCode; if (statusCode == 401 || statusCode == 403) { throw new CFError(`ValidationError: check your token permissions, failed assert write scopes with ${error}`); } } } }; exports.assertPatWritePermission = assertPatWritePermission; const removePrefixIfExists = (prefix, filepath) => { const hasPrefix = filepath.indexOf(prefix) === 0; return hasPrefix ? filepath.slice(prefix.length) : filepath; }; const cleanEncodedFilePath = (filepath, { preserveSlashes } = {}) => { const path = removePrefixIfExists('./', filepath); return preserveSlashes ? path.split('/').map(substr => encodeURIComponent(substr)).join('/') : encodeURIComponent(path); }; exports.cleanEncodedFilePath = cleanEncodedFilePath; const cleanUrlPrefix = (url) => { return url.startsWith('/') ? url.slice(1) : url; }; exports.cleanUrlPrefix = cleanUrlPrefix; const isJsonString = (str) => { try { JSON.parse(str); } catch { return false; } return true; }; exports.isJsonString = isJsonString; const hashToken = (token) => { return (0, crypto_1.createHash)('sha256').update(token).digest('hex'); }; exports.hashToken = hashToken; class RateLimitManager { static tokenResetMemory = new Map(); static set(token, resetTime) { if (resetTime && resetTime != 0) { this.tokenResetMemory.set((0, exports.hashToken)(token), resetTime); } else { this.tokenResetMemory.delete((0, exports.hashToken)(token)); } } static assert(token, requestErrorFunc) { const now = Math.floor(Date.now() / 1000); const reset = this.tokenResetMemory.get((0, exports.hashToken)(token)); if (reset && reset - now > 0) { throw requestErrorFunc(reset); } else { this.tokenResetMemory.delete((0, exports.hashToken)(token)); } } } exports.RateLimitManager = RateLimitManager; //# sourceMappingURL=index.js.map