UNPKG

bit-bin

Version:

<a href="https://opensource.org/licenses/Apache-2.0"><img alt="apache" src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a> <a href="https://github.com/teambit/bit/blob/master/CONTRIBUTING.md"><img alt="prs" src="https://img.shields.io/b

274 lines (205 loc) 7.04 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function _bluebird() { const data = require("bluebird"); _bluebird = function () { return data; }; return data; } function _defineProperty2() { const data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); _defineProperty2 = function () { return data; }; return data; } function _ramda() { const data = _interopRequireDefault(require("ramda")); _ramda = function () { return data; }; return data; } function _util() { const data = require("util"); _util = function () { return data; }; return data; } function _constants() { const data = require("../constants"); _constants = function () { return data; }; return data; } function _logger() { const data = _interopRequireDefault(require("../logger/logger")); _logger = function () { return data; }; return data; } function errors() { const data = _interopRequireWildcard(require("./exceptions")); errors = function () { return data; }; return data; } /* * Setting up block level variable to store class state * set's to null by default. */ let instance = null; /** * A class which manage all the hooks * This is a singelton class which expose getInstance method * This class used for register new hooks, actions for existing hooks and trigger hooks */ class HooksManager { constructor() { (0, _defineProperty2().default)(this, "hooks", new Map()); if (!instance) { // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! instance = this; } // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! return instance; } /** * Initialize the default hooks */ static init() { const self = new HooksManager(); _constants().HOOKS_NAMES.forEach(hookName => self.hooks.set(hookName, [])); } /** * Get the instance of the HooksManager * @return {HooksManager} instance of the HooksManager * */ static getInstance() { // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! return instance; } /** * register new hook name * @param {string} hookName * @param {boolean} throwIfExist - whether to throw an error if the hook name already exists * @return {boolean} whether the hook has been registerd */ registerNewHook(hookName, context = {}, throwIfExist = false) { if (this.hooks.has(hookName)) { // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! const contextMsg = context.extension ? `from ${context.extension}` : ''; _logger().default.warn(`trying to register an already existing hook ${hookName} ${contextMsg}`); if (throwIfExist) { throw new (errors().HookAlreadyExists)(hookName); } return false; } this.hooks.set(hookName, []); return true; } /** * Register action to an existing hook * @param {string} hookName - hook to register action to * @param {HookAction} hookAction - The action to register to the hook * @param {boolean} throwIfNotExist - whether to throw an exception in case the hook doesn't exists * @return {boolean} whether the action has been registerd successfully */ registerActionToHook(hookName, hookAction, context = {}, throwIfNotExist = false) { if (!this.hooks.has(hookName)) { // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! const contextMsg = context.extension ? `from ${context.extension}` : ''; _logger().default.warn(`trying to register to a non existing hook ${hookName} ${contextMsg}`); if (throwIfNotExist) { throw new (errors().HookNotExists)(hookName); } return false; } this.hooks.get(hookName).push(hookAction); return true; } /** * Trigger a hook - run all the actions registerd to this hook * The actions will be run in parallel and the errors will be aggregated * @param {string} hookName - The hook name to trigger * @return {HookFailures} Aggregated errors of the actions failures */ triggerHook(hookName, args = {}, headers = {}, context = {} // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! ) { var _this = this; return (0, _bluebird().coroutine)(function* () { const resultErrors = []; if (!_this.hooks.has(hookName)) { _logger().default.warn(`trying to trigger a non existing hook ${hookName}`); throw new (errors().HookNotExists)(hookName); } if (process.env.BIT_LOG) { // this is disabled by default due to performance implications // prefix your command with "BIT_LOG=*" to log all args and headers _logger().default.info(`triggering hook ${hookName} with args:\n ${_stringifyIfNeeded(_stripArgs(args))} \n and headers \n ${_stringifyIfNeeded(_stripHeaders(headers))} \n and context ${_stringifyIfNeeded(context)}`); } else { _logger().default.info(`triggering hook ${hookName}`); } const actions = _this.hooks.get(hookName); const actionsP = actions.map(action => { // Catch errors in order to aggregate them // Wrap in a promise in case the action doesn't return a promise return Promise.resolve().then(() => { _logger().default.info(`running action ${action.name} on hook ${hookName}`); return action.run(args, headers, context); }).catch(e => { _logger().default.error(`running action ${action.name} on hook ${hookName} failed, err:`, e); // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX! resultErrors.push({ [action.name]: e }); }); }); yield Promise.all(actionsP); return resultErrors; })(); } } exports.default = HooksManager; function _stringifyIfNeeded(val) { return typeof val === 'string' ? val : (0, _util().inspect)(val, { depth: 5 }); } /** * Remove some data from the logs (because it's too verbose or because it's sensitive) * @param {Object} args */ function _stripArgs(args) { // Create deep clone const res = _ramda().default.clone(args); if (res.componentObjects) { res.componentObjects = res.componentObjects.length; } return res; } /** * Remove some data from the logs (because it's too verbose or because it's sensitive) * @param {Object} headers */ function _stripHeaders(headers) { if (!headers) return; // Create deep clone const res = _ramda().default.clone(headers); if (res.context && res.context.pubSshKey) { const key = res.context.pubSshKey; res.context.pubSshKey = `last 70 characters: ${key.substr(key.length - 70)}`; } return res; }