{"action":"created","comment":{"url":"https://api.github.com/repos/openshift/origin-web-common/pulls/comments/174267783","pull_request_review_id":103593154,"id":174267783,"diff_hunk":"@@ -0,0 +1,660 @@\n+/*\n+ * This is a pared down version of hawtio-core in order to remove the outdated\n+ * dependency as part the migration from bower to yarn.\n+ *\n+ * TODO Figure out a better strategy for API discovery so that this can be\n+ * removed altogether.\n+ *\n+ */\n+\n+// log initialization\n+/* globals Logger window console document localStorage $ angular jQuery navigator Jolokia */\n+(function() {\n+  'use strict';\n+\n+  Logger.setLevel(Logger.INFO);\n+  Logger.storagePrefix = 'hawtio';\n+\n+  Logger.oldGet = Logger.get;\n+  Logger.loggers = {};\n+  Logger.get = function(name) {\n+    var answer = Logger.oldGet(name);\n+    Logger.loggers[name] = answer;\n+    return answer;\n+  };\n+\n+  // we'll default to 100 statements I guess...\n+  window['LogBuffer'] = 100;\n+\n+  if ('localStorage' in window) {\n+    if (!('logLevel' in window.localStorage)) {\n+      window.localStorage['logLevel'] = JSON.stringify(Logger.INFO);\n+    }\n+    var logLevel = Logger.DEBUG;\n+    try {\n+      logLevel = JSON.parse(window.localStorage['logLevel']);\n+    } catch (e) {\n+      console.error(\"Failed to parse log level setting: \", e);\n+    }\n+    // console.log(\"Using log level: \", logLevel);\n+    Logger.setLevel(logLevel);\n+    if ('showLog' in window.localStorage) {\n+      var showLog = window.localStorage['showLog'];\n+      // console.log(\"showLog: \", showLog);\n+      if (showLog === 'true') {\n+        var container = document.getElementById(\"log-panel\");\n+        if (container) {\n+          container.setAttribute(\"style\", \"bottom: 50%;\");\n+        }\n+      }\n+    }\n+    if ('logBuffer' in window.localStorage) {\n+      var logBuffer = window.localStorage['logBuffer'];\n+      window['LogBuffer'] = parseInt(logBuffer, 10);\n+    } else {\n+      window.localStorage['logBuffer'] = window['LogBuffer'];\n+    }\n+    if ('childLoggers' in window.localStorage) {\n+      var childLoggers = [];\n+      try {\n+        childLoggers = JSON.parse(localStorage['childLoggers']);\n+      } catch (e) {\n+\n+      }\n+      childLoggers.forEach(function(child) {\n+        Logger.get(child.logger).setLevel(Logger[child.level]);\n+      });\n+    }\n+  }\n+\n+  var consoleLogger = null;\n+\n+  if ('console' in window) {\n+    window['JSConsole'] = window.console;\n+    consoleLogger = function(messages, context) {\n+      var MyConsole = window['JSConsole'];\n+      var hdlr = MyConsole.log;\n+      // Prepend the logger's name to the log message for easy identification.\n+      if (context.name) {\n+        messages[0] = \"[\" + context.name + \"] \" + messages[0];\n+      }\n+      // Delegate through to custom warn/error loggers if present on the console.\n+      if (context.level === Logger.WARN && 'warn' in MyConsole) {\n+        hdlr = MyConsole.warn;\n+      } else if (context.level === Logger.ERROR && 'error' in MyConsole) {\n+        hdlr = MyConsole.error;\n+      } else if (context.level === Logger.INFO && 'info' in MyConsole) {\n+        hdlr = MyConsole.info;\n+      }\n+      if (hdlr && hdlr.apply) {\n+        try {\n+          hdlr.apply(MyConsole, messages);\n+        } catch (e) {\n+          MyConsole.log(messages);\n+        }\n+      }\n+    };\n+  }\n+\n+  // keep these hidden in the Logger object\n+  Logger.getType = function(obj) {\n+    return Object.prototype.toString.call(obj).slice(8, -1);\n+  };\n+\n+  Logger.isError = function(obj) {\n+    return obj && Logger.getType(obj) === 'Error';\n+  };\n+\n+  Logger.isArray = function (obj) {\n+    return obj && Logger.getType(obj) === 'Array';\n+  };\n+\n+  Logger.isObject = function (obj) {\n+    return obj && Logger.getType(obj) === 'Object';\n+  };\n+\n+  Logger.isString = function(obj) {\n+    return obj && Logger.getType(obj) === 'String';\n+  };\n+\n+  window['logInterceptors'] = [];\n+\n+  Logger.formatStackTraceString = function(stack) {\n+    var lines = stack.split(\"\\n\");\n+    if (lines.length > 100) {\n+      // too many lines, let's snip the middle so the browser doesn't bail\n+      var start = 20;\n+      var amount = lines.length - start * 2;\n+      lines.splice(start, amount, '>>> snipped ' + amount + ' frames <<<');\n+    }\n+    var stackTrace = \"<div class=\\\"log-stack-trace\\\">\\n\";\n+    for (var j = 0; j < lines.length; j++) {\n+      var line = lines[j];\n+      if (line.trim().length === 0) {\n+        continue;\n+      }\n+      //line = line.replace(/\\s/g, \"&nbsp;\");\n+      stackTrace = stackTrace + \"<p>\" + line + \"</p>\\n\";\n+    }\n+    stackTrace = stackTrace + \"</div>\\n\";\n+    return stackTrace;\n+  };\n+\n+\n+  Logger.setHandler(function(messages, context) {\n+    // MyConsole.log(\"context: \", context);\n+    // MyConsole.log(\"messages: \", messages);\n+    var node = undefined;\n+    var panel = undefined;\n+    var container = document.getElementById(\"hawtio-log-panel\");\n+    if (container) {\n+      panel = document.getElementById(\"hawtio-log-panel-statements\");\n+      node = document.createElement(\"li\");\n+    }\n+    var text = \"\";\n+    var postLog = [];\n+    // try and catch errors logged via console.error(e.toString) and reformat\n+    if (context['level'].name === 'ERROR' && messages.length === 1) {\n+      if (Logger.isString(messages[0])) {\n+        var message = messages[0];\n+        var messageSplit = message.split(/\\n/);\n+        if (messageSplit.length > 1) {\n+          // we may have more cases that require normalizing, so a more flexible solution\n+          // may be needed\n+          var lookFor = \"Error: Jolokia-Error: \";\n+          if (messageSplit[0].search(lookFor) === 0) {\n+            var msg = messageSplit[0].slice(lookFor.length);\n+            window['JSConsole'].info(\"msg: \", msg);\n+            try {\n+              var errorObject = JSON.parse(msg);\n+              var error = new Error();\n+              error.message = errorObject['error'];\n+              error.stack = errorObject['stacktrace'].replace(\"\\\\t\", \"&nbsp;&nbsp\").replace(\"\\\\n\", \"\\n\");\n+              messages = [error];\n+            } catch (e) {\n+              // we'll just bail and let it get logged as a string...\n+            }\n+          } else {\n+            var error = new Error();\n+            error.message = messageSplit[0];\n+            error.stack = message;\n+            messages = [error];\n+          }\n+        }\n+      }\n+    }\n+    var scroll = false;\n+    if (node) {\n+      for (var i = 0; i < messages.length; i++) {\n+        var message = messages[i];\n+        if (Logger.isArray(message) || Logger.isObject(message)) {\n+          var obj = \"\" ;\n+          try {\n+            obj = '<pre data-language=\"javascript\">' + JSON.stringify(message, null, 2) + '</pre>';\n+          } catch (error) {\n+            obj = message + \" (failed to convert) \";\n+            // silently ignore, could be a circular object...\n+          }\n+          text = text + obj;\n+        } else if (Logger.isError(message)) {\n+          if ('message' in message) {\n+            text = text + message['message'];\n+          }\n+          if ('stack' in message) {\n+            postLog.push(function() {\n+              var stackTrace = Logger.formatStackTraceString(message['stack']);\n+              var logger = Logger;\n+              if (context.name) {\n+                logger = Logger.get(context['name']);\n+              }\n+              logger.info(\"Stack trace: \", stackTrace);\n+            });\n+          }\n+        } else {\n+          text = text + message;\n+        }\n+      }\n+      if (context.name) {\n+        text = '[<span class=\"green\">' + context.name + '</span>] ' + text;\n+      }\n+      node.innerHTML = text;\n+      node.className = context.level.name;\n+      if (container) {\n+        if (container.scrollHeight === 0) {\n+          scroll = true;\n+        }\n+        if (panel.scrollTop > (panel.scrollHeight - container.scrollHeight - 200)) {\n+          scroll = true;\n+        }\n+      }\n+    }\n+    function onAdd() {\n+      if (panel && node) {\n+        panel.appendChild(node);\n+        if (panel.childNodes.length > parseInt(window['LogBuffer'])) {\n+          panel.removeChild(panel.firstChild);\n+        }\n+        if (scroll) {\n+          panel.scrollTop = panel.scrollHeight;\n+        }\n+      }\n+      if (consoleLogger) {\n+        consoleLogger(messages, context);\n+      }\n+      var interceptors = window['logInterceptors'];\n+      for (var i = 0; i < interceptors.length; i++) {\n+        interceptors[i](context.level.name, text);\n+      }\n+    }\n+    onAdd();\n+    postLog.forEach(function (func) { func(); });\n+  });\n+\n+})();\n+\n+/*\n+ * Plugin loader and discovery mechanism\n+ */\n+var pluginLoader = (function(self) {\n+  'use strict';\n+\n+  var log = Logger;\n+\n+  var bootstrapEl = document.documentElement;\n+\n+  self.log = log;\n+\n+  /**\n+   * List of URLs that the plugin loader will try and discover\n+   * plugins from\n+   * @type {Array}\n+   */\n+  // self.urls = [];\n+\n+  /**\n+   * Holds all of the angular modules that need to be bootstrapped\n+   * @type {Array}\n+   */\n+  self.modules = [];\n+\n+  /**\n+   * Tasks to be run before bootstrapping, tasks can be async.\n+   * Supply a function that takes the next task to be\n+   * executed as an argument and be sure to call the passed\n+   * in function.\n+   *\n+   * @type {Array}\n+   */\n+  self.tasks = [];\n+\n+  self.setBootstrapElement = function(el) {\n+    log.debug(\"Setting bootstrap element to: \", el);\n+    bootstrapEl = el;\n+  }\n+\n+  self.getBootstrapElement = function() {\n+    return bootstrapEl;\n+  }\n+\n+  self.registerPreBootstrapTask = function(task, front) {\n+    if (angular.isFunction(task)) {\n+      log.debug(\"Adding legacy task\");\n+      task = {\n+        task: task\n+      };\n+    }\n+\n+    if (!task.name) {\n+      task.name = 'unnamed-task-' + (self.tasks.length + 1);\n+    }\n+\n+    if (task.depends && !angular.isArray(task.depends) && task.depends !== '*') {\n+      task.depends = [task.depends];\n+    }\n+\n+    if (!front) {\n+      self.tasks.push(task);\n+    } else {\n+      self.tasks.unshift(task);\n+    }\n+  };\n+\n+  self.addModule = function(module) {\n+    log.debug(\"Adding module: \" + module);\n+    self.modules.push(module);\n+  };\n+\n+  // self.addUrl = function(url) {\n+  //   log.debug(\"Adding URL: \" + url);\n+  //   self.urls.push(url);\n+  // };\n+\n+  self.getModules = function() {\n+    return self.modules;\n+  };\n+\n+  self.loaderCallback = null;\n+\n+  self.setLoaderCallback = function(cb) {\n+    self.loaderCallback = cb;\n+    // log.debug(\"Setting callback to : \", self.loaderCallback);\n+  };\n+\n+  function intersection(search, needle) {\n+    if (!angular.isArray(needle)) {\n+      needle = [needle];\n+    }\n+    var answer = [];\n+    needle.forEach(function(n) {\n+      search.forEach(function(s) {\n+        if (n === s) {\n+          answer.push(s);\n+        }\n+      });\n+    });\n+    return answer;\n+  }\n+\n+\n+  self.loadPlugins = function(callback) {\n+\n+    var lcb = self.loaderCallback;\n+\n+    var plugins = {};\n+\n+    // var urlsToLoad = self.urls.length;\n+    // var totalUrls = urlsToLoad;\n+\n+    var bootstrap = function() {\n+      var executedTasks = [];\n+      var deferredTasks = [];\n+\n+      var bootstrapTask = {\n+        name: 'Hawtio Bootstrap',\n+        depends: '*',\n+        runs: 0,\n+        task: function(next) {\n+          function listTasks() {\n+            deferredTasks.forEach(function(task) {\n+              self.log.info(\"  name: \" + task.name + \" depends: \", task.depends);\n+            });\n+          }\n+          if (deferredTasks.length > 0) {\n+            self.log.info(\"tasks yet to run: \");\n+            listTasks();\n+            bootstrapTask.runs = bootstrapTask.runs + 1;\n+            self.log.info(\"Task list restarted : \", bootstrapTask.runs, \" times\");\n+            if (bootstrapTask.runs === 5) {\n+              self.log.info(\"Orphaned tasks: \");\n+              listTasks();\n+              deferredTasks.length = 0;\n+            } else {\n+              deferredTasks.push(bootstrapTask);\n+            }\n+          }\n+          self.log.debug(\"Executed tasks: \", executedTasks);\n+          next();\n+        }\n+      }\n+\n+      self.registerPreBootstrapTask(bootstrapTask);\n+\n+      var executeTask = function() {\n+        var tObj = null;\n+        var tmp = [];\n+        // if we've executed all of the tasks, let's drain any deferred tasks\n+        // into the regular task queue\n+        if (self.tasks.length === 0) {\n+          tObj = deferredTasks.shift();\n+        }\n+        // first check and see what tasks have executed and see if we can pull a task\n+        // from the deferred queue\n+        while(!tObj && deferredTasks.length > 0) {\n+          var task = deferredTasks.shift();\n+          if (task.depends === '*') {\n+            if (self.tasks.length > 0) {\n+              tmp.push(task);\n+            } else {\n+              tObj = task;\n+            }\n+          } else {\n+            var intersect = intersection(executedTasks, task.depends);\n+            if (intersect.length === task.depends.length) {\n+              tObj = task;\n+            } else {\n+              tmp.push(task);\n+            }\n+          }\n+        }\n+        if (tmp.length > 0) {\n+          tmp.forEach(function(task) {\n+            deferredTasks.push(task);\n+          });\n+        }\n+        // no deferred tasks to execute, let's get a new task\n+        if (!tObj) {\n+          tObj = self.tasks.shift();\n+        }\n+        // check if task has dependencies\n+        if (tObj && tObj.depends && self.tasks.length > 0) {\n+          self.log.debug(\"Task '\" + tObj.name + \"' has dependencies: \", tObj.depends);\n+          if (tObj.depends === '*') {\n+            if (self.tasks.length > 0) {\n+              self.log.debug(\"Task '\" + tObj.name + \"' wants to run after all other tasks, deferring\");\n+              deferredTasks.push(tObj);\n+              executeTask();\n+              return;\n+            }\n+          } else {\n+            var intersect = intersection(executedTasks, tObj.depends);\n+            if (intersect.length != tObj.depends.length) {\n+              self.log.debug(\"Deferring task: '\" + tObj.name + \"'\");\n+              deferredTasks.push(tObj);\n+              executeTask();\n+              return;\n+            }\n+          }\n+        }\n+        if (tObj) {\n+          self.log.debug(\"Executing task: '\" + tObj.name + \"'\");\n+          //self.log.debug(\"ExecutedTasks: \", executedTasks);\n+          var called = false;\n+          var next = function() {\n+            if (next.notFired) {\n+              next.notFired = false;\n+              executedTasks.push(tObj.name);\n+              setTimeout(executeTask, 1);\n+            }\n+          }\n+          next.notFired = true;\n+          tObj.task(next);\n+        } else {\n+          self.log.debug(\"All tasks executed\");\n+          setTimeout(callback, 1);\n+        }\n+      };\n+      setTimeout(executeTask, 1);\n+    };\n+\n+    var loadScripts = (function() {\n+\n+      // keep track of when scripts are loaded so we can execute the callback\n+      var loaded = 0;\n+      $.each(plugins, function(key, data) {\n+        loaded = loaded + data.Scripts.length;\n+      });\n+\n+      var totalScripts = loaded;\n+\n+      var scriptLoaded = function() {\n+        $.ajaxSetup({async:true});\n+        loaded = loaded - 1;\n+        if (lcb) {\n+          lcb.scriptLoaderCallback(lcb, totalScripts, loaded + 1);\n+        }\n+        if (loaded === 0) {\n+          bootstrap();\n+        }\n+      };\n+\n+      if (loaded > 0) {\n+        $.each(plugins, function(key, data) {\n+\n+          data.Scripts.forEach( function(script) {\n+\n+            // log.debug(\"Loading script: \", data.Name + \" script: \" + script);\n+\n+            var scriptName = data.Context + \"/\" + script;\n+            log.debug(\"Fetching script: \", scriptName);\n+            $.ajaxSetup({async:false});\n+            $.getScript(scriptName)\n+            .done(function(textStatus) {\n+              log.debug(\"Loaded script: \", scriptName);\n+            })\n+            .fail(function(jqxhr, settings, exception) {\n+              log.info(\"Failed loading script: \\\"\", exception.message, \"\\\" (<a href=\\\"\", scriptName, \":\", exception.lineNumber, \"\\\">\", scriptName, \":\", exception.lineNumber, \"</a>)\");\n+            })\n+            .always(scriptLoaded);\n+          });\n+        });\n+      } else {\n+        // no scripts to load, so just do the callback\n+        $.ajaxSetup({async:true});\n+        bootstrap();\n+      }\n+      return this;\n+    })();\n+  };\n+\n+  self.debug = function() {\n+    log.debug(\"modules\");\n+    log.debug(self.modules);\n+  };\n+\n+  self.setLoaderCallback({\n+    scriptLoaderCallback: function (self, total, remaining) {\n+      log.debug(\"Total scripts: \", total, \" Remaining: \", remaining);\n+    }\n+  });\n+\n+  return self;\n+\n+})(pluginLoader || {}, window, undefined);\n+\n+// Plugin responsible for bootstrapping the app\n+var BootstrapPlugin = (function () {\n+    'use strict';\n+\n+    function BootstrapPluginClass(){}\n+\n+    /**\n+     * The app's injector, set once bootstrap is completed\n+     */\n+    Object.defineProperty(BootstrapPluginClass.prototype, \"injector\", {\n+      get: function() {\n+        return BootstrapPlugin._injector;\n+      },\n+      enumerable: true,\n+      configurable: true\n+    });\n+\n+    var BootstrapPlugin = new BootstrapPluginClass();\n+\n+    /**\n+     * This plugin's name and angular module\n+     */\n+    BootstrapPlugin.pluginName = \"bootstrap-plugin\";\n+    /**\n+     * This plugins logger instance\n+     */\n+    var log = Logger.get(BootstrapPlugin.pluginName);\n+\n+    var _module = angular.module(BootstrapPlugin.pluginName, []);\n+    _module.config([\"$locationProvider\", function ($locationProvider) {\n+      $locationProvider.html5Mode(true);\n+    }]);\n+\n+    _module.run(['documentBase', function (documentBase) {\n+      log.debug(\"loaded\");\n+    }]);\n+\n+    BootstrapPlugin.documentBase = function() {\n+      var base = $('head').find('base');\n+      var answer = '/'\n+      if (base && base.length > 0) {\n+        answer = base.attr('href');\n+      } else {\n+        log.warn(\"Document is missing a 'base' tag, defaulting to '/'\");\n+      }\n+      return answer;\n+    }\n+\n+    // Holds the document base so plugins can easily\n+    // figure out absolute URLs when needed\n+    _module.factory('documentBase', function() {\n+      return BootstrapPlugin.documentBase();\n+    });\n+\n+    pluginLoader.addModule(\"ng\");\n+    pluginLoader.addModule(\"ngSanitize\");\n+    pluginLoader.addModule(BootstrapPlugin.pluginName);\n+\n+    // bootstrap the app\n+    $(function () {\n+\n+      jQuery.uaMatch = function( ua ) {\n+        ua = ua.toLowerCase();\n+\n+        var match = /(chrome)[ \\/]([\\w.]+)/.exec( ua ) ||\n+          /(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\n+          /(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec( ua ) ||\n+          /(msie) ([\\w.]+)/.exec( ua ) ||\n+          ua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec( ua ) ||\n+          [];\n+\n+        return {\n+          browser: match[ 1 ] || \"\",\n+          version: match[ 2 ] || \"0\"\n+        };\n+      };\n+\n+      // Don't clobber any existing jQuery.browser in case it's different\n+      if ( !jQuery.browser ) {\n+        var matched = jQuery.uaMatch( navigator.userAgent );\n+        var browser = {};\n+\n+        if ( matched.browser ) {\n+          browser[ matched.browser ] = true;\n+          browser.version = matched.version;\n+        }\n+\n+        // Chrome is Webkit, but Webkit is also Safari.\n+        if ( browser.chrome ) {\n+          browser.webkit = true;\n+        } else if ( browser.webkit ) {\n+          browser.safari = true;\n+        }\n+\n+        jQuery.browser = browser;\n+      }\n+\n+      pluginLoader.loadPlugins(function() {\n+\n+        if (BootstrapPlugin.injector) {\n+          log.debug(\"Application already bootstrapped\");\n+          return;\n+        }\n+\n+        var bootstrapEl = pluginLoader.getBootstrapElement();\n+        log.debug(\"Using bootstrap element: \", bootstrapEl);\n+\n+        BootstrapPlugin._injector = angular.bootstrap(bootstrapEl, pluginLoader.getModules(), {\n+          strictDi: false\n+        });\n+        log.debug(\"Bootstrapped application\");\n+      });\n+    });\n+    return BootstrapPlugin;\n+})();\n+","path":"src/pluginLoader.js","position":659,"original_position":659,"commit_id":"06f9bd13dae9b141588581fd73fdb3ef45f7f855","original_commit_id":"06f9bd13dae9b141588581fd73fdb3ef45f7f855","user":{"login":"benjaminapetersen","id":280512,"avatar_url":"https://avatars0.githubusercontent.com/u/280512?v=4","gravatar_id":"","url":"https://api.github.com/users/benjaminapetersen","html_url":"https://github.com/benjaminapetersen","followers_url":"https://api.github.com/users/benjaminapetersen/followers","following_url":"https://api.github.com/users/benjaminapetersen/following{/other_user}","gists_url":"https://api.github.com/users/benjaminapetersen/gists{/gist_id}","starred_url":"https://api.github.com/users/benjaminapetersen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/benjaminapetersen/subscriptions","organizations_url":"https://api.github.com/users/benjaminapetersen/orgs","repos_url":"https://api.github.com/users/benjaminapetersen/repos","events_url":"https://api.github.com/users/benjaminapetersen/events{/privacy}","received_events_url":"https://api.github.com/users/benjaminapetersen/received_events","type":"User","site_admin":false},"body":"Works for me then!  @spadgett advice tends to be spot on! ","created_at":"2018-03-13T20:09:16Z","updated_at":"2018-03-13T20:09:16Z","html_url":"https://github.com/openshift/origin-web-common/pull/316#discussion_r174267783","pull_request_url":"https://api.github.com/repos/openshift/origin-web-common/pulls/316","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/openshift/origin-web-common/pulls/comments/174267783"},"html":{"href":"https://github.com/openshift/origin-web-common/pull/316#discussion_r174267783"},"pull_request":{"href":"https://api.github.com/repos/openshift/origin-web-common/pulls/316"}},"in_reply_to_id":174264677},"pull_request":{"url":"https://api.github.com/repos/openshift/origin-web-common/pulls/316","id":174488507,"html_url":"https://github.com/openshift/origin-web-common/pull/316","diff_url":"https://github.com/openshift/origin-web-common/pull/316.diff","patch_url":"https://github.com/openshift/origin-web-common/pull/316.patch","issue_url":"https://api.github.com/repos/openshift/origin-web-common/issues/316","number":316,"state":"open","locked":false,"title":"[WIP] Remove hawtio dependency","user":{"login":"TheRealJon","id":22625502,"avatar_url":"https://avatars0.githubusercontent.com/u/22625502?v=4","gravatar_id":"","url":"https://api.github.com/users/TheRealJon","html_url":"https://github.com/TheRealJon","followers_url":"https://api.github.com/users/TheRealJon/followers","following_url":"https://api.github.com/users/TheRealJon/following{/other_user}","gists_url":"https://api.github.com/users/TheRealJon/gists{/gist_id}","starred_url":"https://api.github.com/users/TheRealJon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheRealJon/subscriptions","organizations_url":"https://api.github.com/users/TheRealJon/orgs","repos_url":"https://api.github.com/users/TheRealJon/repos","events_url":"https://api.github.com/users/TheRealJon/events{/privacy}","received_events_url":"https://api.github.com/users/TheRealJon/received_events","type":"User","site_admin":false},"body":"**Breaking Changes** Remove hawtio-core dependency. A pared down version of hawtio-core is now bundled with the dist scripts. Once this is approved and published, catalog and console will need to be adjusted to properly consume the pluginLoader provided by this repo.","created_at":"2018-03-12T20:40:58Z","updated_at":"2018-03-13T20:09:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5ce34dbba3de51ffdef2923e02a9d5b19e4d5282","assignee":null,"assignees":[],"requested_reviewers":[{"login":"spadgett","id":1167259,"avatar_url":"https://avatars1.githubusercontent.com/u/1167259?v=4","gravatar_id":"","url":"https://api.github.com/users/spadgett","html_url":"https://github.com/spadgett","followers_url":"https://api.github.com/users/spadgett/followers","following_url":"https://api.github.com/users/spadgett/following{/other_user}","gists_url":"https://api.github.com/users/spadgett/gists{/gist_id}","starred_url":"https://api.github.com/users/spadgett/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spadgett/subscriptions","organizations_url":"https://api.github.com/users/spadgett/orgs","repos_url":"https://api.github.com/users/spadgett/repos","events_url":"https://api.github.com/users/spadgett/events{/privacy}","received_events_url":"https://api.github.com/users/spadgett/received_events","type":"User","site_admin":false},{"login":"dtaylor113","id":12733153,"avatar_url":"https://avatars2.githubusercontent.com/u/12733153?v=4","gravatar_id":"","url":"https://api.github.com/users/dtaylor113","html_url":"https://github.com/dtaylor113","followers_url":"https://api.github.com/users/dtaylor113/followers","following_url":"https://api.github.com/users/dtaylor113/following{/other_user}","gists_url":"https://api.github.com/users/dtaylor113/gists{/gist_id}","starred_url":"https://api.github.com/users/dtaylor113/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dtaylor113/subscriptions","organizations_url":"https://api.github.com/users/dtaylor113/orgs","repos_url":"https://api.github.com/users/dtaylor113/repos","events_url":"https://api.github.com/users/dtaylor113/events{/privacy}","received_events_url":"https://api.github.com/users/dtaylor113/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":711694386,"url":"https://api.github.com/repos/openshift/origin-web-common/labels/do-not-merge/work-in-progress","name":"do-not-merge/work-in-progress","color":"e11d21","default":false},{"id":718139366,"url":"https://api.github.com/repos/openshift/origin-web-common/labels/size/XXL","name":"size/XXL","color":"ee0000","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/openshift/origin-web-common/pulls/316/commits","review_comments_url":"https://api.github.com/repos/openshift/origin-web-common/pulls/316/comments","review_comment_url":"https://api.github.com/repos/openshift/origin-web-common/pulls/comments{/number}","comments_url":"https://api.github.com/repos/openshift/origin-web-common/issues/316/comments","statuses_url":"https://api.github.com/repos/openshift/origin-web-common/statuses/06f9bd13dae9b141588581fd73fdb3ef45f7f855","head":{"label":"TheRealJon:remove-hawtio","ref":"remove-hawtio","sha":"06f9bd13dae9b141588581fd73fdb3ef45f7f855","user":{"login":"TheRealJon","id":22625502,"avatar_url":"https://avatars0.githubusercontent.com/u/22625502?v=4","gravatar_id":"","url":"https://api.github.com/users/TheRealJon","html_url":"https://github.com/TheRealJon","followers_url":"https://api.github.com/users/TheRealJon/followers","following_url":"https://api.github.com/users/TheRealJon/following{/other_user}","gists_url":"https://api.github.com/users/TheRealJon/gists{/gist_id}","starred_url":"https://api.github.com/users/TheRealJon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheRealJon/subscriptions","organizations_url":"https://api.github.com/users/TheRealJon/orgs","repos_url":"https://api.github.com/users/TheRealJon/repos","events_url":"https://api.github.com/users/TheRealJon/events{/privacy}","received_events_url":"https://api.github.com/users/TheRealJon/received_events","type":"User","site_admin":false},"repo":{"id":109314386,"name":"origin-web-common","full_name":"TheRealJon/origin-web-common","owner":{"login":"TheRealJon","id":22625502,"avatar_url":"https://avatars0.githubusercontent.com/u/22625502?v=4","gravatar_id":"","url":"https://api.github.com/users/TheRealJon","html_url":"https://github.com/TheRealJon","followers_url":"https://api.github.com/users/TheRealJon/followers","following_url":"https://api.github.com/users/TheRealJon/following{/other_user}","gists_url":"https://api.github.com/users/TheRealJon/gists{/gist_id}","starred_url":"https://api.github.com/users/TheRealJon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TheRealJon/subscriptions","organizations_url":"https://api.github.com/users/TheRealJon/orgs","repos_url":"https://api.github.com/users/TheRealJon/repos","events_url":"https://api.github.com/users/TheRealJon/events{/privacy}","received_events_url":"https://api.github.com/users/TheRealJon/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/TheRealJon/origin-web-common","description":null,"fork":true,"url":"https://api.github.com/repos/TheRealJon/origin-web-common","forks_url":"https://api.github.com/repos/TheRealJon/origin-web-common/forks","keys_url":"https://api.github.com/repos/TheRealJon/origin-web-common/keys{/key_id}","collaborators_url":"https://api.github.com/repos/TheRealJon/origin-web-common/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/TheRealJon/origin-web-common/teams","hooks_url":"https://api.github.com/repos/TheRealJon/origin-web-common/hooks","issue_events_url":"https://api.github.com/repos/TheRealJon/origin-web-common/issues/events{/number}","events_url":"https://api.github.com/repos/TheRealJon/origin-web-common/events","assignees_url":"https://api.github.com/repos/TheRealJon/origin-web-common/assignees{/user}","branches_url":"https://api.github.com/repos/TheRealJon/origin-web-common/branches{/branch}","tags_url":"https://api.github.com/repos/TheRealJon/origin-web-common/tags","blobs_url":"https://api.github.com/repos/TheRealJon/origin-web-common/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/TheRealJon/origin-web-common/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/TheRealJon/origin-web-common/git/refs{/sha}","trees_url":"https://api.github.com/repos/TheRealJon/origin-web-common/git/trees{/sha}","statuses_url":"https://api.github.com/repos/TheRealJon/origin-web-common/statuses/{sha}","languages_url":"https://api.github.com/repos/TheRealJon/origin-web-common/languages","stargazers_url":"https://api.github.com/repos/TheRealJon/origin-web-common/stargazers","contributors_url":"https://api.github.com/repos/TheRealJon/origin-web-common/contributors","subscribers_url":"https://api.github.com/repos/TheRealJon/origin-web-common/subscribers","subscription_url":"https://api.github.com/repos/TheRealJon/origin-web-common/subscription","commits_url":"https://api.github.com/repos/TheRealJon/origin-web-common/commits{/sha}","git_commits_url":"https://api.github.com/repos/TheRealJon/origin-web-common/git/commits{/sha}","comments_url":"https://api.github.com/repos/TheRealJon/origin-web-common/comments{/number}","issue_comment_url":"https://api.github.com/repos/TheRealJon/origin-web-common/issues/comments{/number}","contents_url":"https://api.github.com/repos/TheRealJon/origin-web-common/contents/{+path}","compare_url":"https://api.github.com/repos/TheRealJon/origin-web-common/compare/{base}...{head}","merges_url":"https://api.github.com/repos/TheRealJon/origin-web-common/merges","archive_url":"https://api.github.com/repos/TheRealJon/origin-web-common/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/TheRealJon/origin-web-common/downloads","issues_url":"https://api.github.com/repos/TheRealJon/origin-web-common/issues{/number}","pulls_url":"https://api.github.com/repos/TheRealJon/origin-web-common/pulls{/number}","milestones_url":"https://api.github.com/repos/TheRealJon/origin-web-common/milestones{/number}","notifications_url":"https://api.github.com/repos/TheRealJon/origin-web-common/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/TheRealJon/origin-web-common/labels{/name}","releases_url":"https://api.github.com/repos/TheRealJon/origin-web-common/releases{/id}","deployments_url":"https://api.github.com/repos/TheRealJon/origin-web-common/deployments","created_at":"2017-11-02T20:17:23Z","updated_at":"2017-11-02T20:17:25Z","pushed_at":"2018-03-13T17:30:14Z","git_url":"git://github.com/TheRealJon/origin-web-common.git","ssh_url":"git@github.com:TheRealJon/origin-web-common.git","clone_url":"https://github.com/TheRealJon/origin-web-common.git","svn_url":"https://github.com/TheRealJon/origin-web-common","homepage":null,"size":2335,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"openshift:master","ref":"master","sha":"0964cfa9a347470a09822c9892799fc560dc7165","user":{"login":"openshift","id":792337,"avatar_url":"https://avatars3.githubusercontent.com/u/792337?v=4","gravatar_id":"","url":"https://api.github.com/users/openshift","html_url":"https://github.com/openshift","followers_url":"https://api.github.com/users/openshift/followers","following_url":"https://api.github.com/users/openshift/following{/other_user}","gists_url":"https://api.github.com/users/openshift/gists{/gist_id}","starred_url":"https://api.github.com/users/openshift/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openshift/subscriptions","organizations_url":"https://api.github.com/users/openshift/orgs","repos_url":"https://api.github.com/users/openshift/repos","events_url":"https://api.github.com/users/openshift/events{/privacy}","received_events_url":"https://api.github.com/users/openshift/received_events","type":"Organization","site_admin":false},"repo":{"id":81274150,"name":"origin-web-common","full_name":"openshift/origin-web-common","owner":{"login":"openshift","id":792337,"avatar_url":"https://avatars3.githubusercontent.com/u/792337?v=4","gravatar_id":"","url":"https://api.github.com/users/openshift","html_url":"https://github.com/openshift","followers_url":"https://api.github.com/users/openshift/followers","following_url":"https://api.github.com/users/openshift/following{/other_user}","gists_url":"https://api.github.com/users/openshift/gists{/gist_id}","starred_url":"https://api.github.com/users/openshift/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/openshift/subscriptions","organizations_url":"https://api.github.com/users/openshift/orgs","repos_url":"https://api.github.com/users/openshift/repos","events_url":"https://api.github.com/users/openshift/events{/privacy}","received_events_url":"https://api.github.com/users/openshift/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/openshift/origin-web-common","description":null,"fork":false,"url":"https://api.github.com/repos/openshift/origin-web-common","forks_url":"https://api.github.com/repos/openshift/origin-web-common/forks","keys_url":"https://api.github.com/repos/openshift/origin-web-common/keys{/key_id}","collaborators_url":"https://api.github.com/repos/openshift/origin-web-common/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/openshift/origin-web-common/teams","hooks_url":"https://api.github.com/repos/openshift/origin-web-common/hooks","issue_events_url":"https://api.github.com/repos/openshift/origin-web-common/issues/events{/number}","events_url":"https://api.github.com/repos/openshift/origin-web-common/events","assignees_url":"https://api.github.com/repos/openshift/origin-web-common/assignees{/user}","branches_url":"https://api.github.com/repos/openshift/origin-web-common/branches{/branch}","tags_url":"https://api.github.com/repos/openshift/origin-web-common/tags","blobs_url":"https://api.github.com/repos/openshift/origin-web-common/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/openshift/origin-web-common/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/openshift/origin-web-common/git/refs{/sha}","trees_url":"https://api.github.com/repos/openshift/origin-web-common/git/trees{/sha}","statuses_url":"https://api.github.com/repos/openshift/origin-web-common/statuses/{sha}","languages_url":"https://api.github.com/repos/openshift/origin-web-common/languages","stargazers_url":"https://api.github.com/repos/openshift/origin-web-common/stargazers","contributors_url":"https://api.github.com/repos/openshift/origin-web-common/contributors","subscribers_url":"https://api.github.com/repos/openshift/origin-web-common/subscribers","subscription_url":"https://api.github.com/repos/openshift/origin-web-common/subscription","commits_url":"https://api.github.com/repos/openshift/origin-web-common/commits{/sha}","git_commits_url":"https://api.github.com/repos/openshift/origin-web-common/git/commits{/sha}","comments_url":"https://api.github.com/repos/openshift/origin-web-common/comments{/number}","issue_comment_url":"https://api.github.com/repos/openshift/origin-web-common/issues/comments{/number}","contents_url":"https://api.github.com/repos/openshift/origin-web-common/contents/{+path}","compare_url":"https://api.github.com/repos/openshift/origin-web-common/compare/{base}...{head}","merges_url":"https://api.github.com/repos/openshift/origin-web-common/merges","archive_url":"https://api.github.com/repos/openshift/origin-web-common/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/openshift/origin-web-common/downloads","issues_url":"https://api.github.com/repos/openshift/origin-web-common/issues{/number}","pulls_url":"https://api.github.com/repos/openshift/origin-web-common/pulls{/number}","milestones_url":"https://api.github.com/repos/openshift/origin-web-common/milestones{/number}","notifications_url":"https://api.github.com/repos/openshift/origin-web-common/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/openshift/origin-web-common/labels{/name}","releases_url":"https://api.github.com/repos/openshift/origin-web-common/releases{/id}","deployments_url":"https://api.github.com/repos/openshift/origin-web-common/deployments","created_at":"2017-02-08T01:36:07Z","updated_at":"2018-01-11T18:12:42Z","pushed_at":"2018-03-13T17:30:15Z","git_url":"git://github.com/openshift/origin-web-common.git","ssh_url":"git@github.com:openshift/origin-web-common.git","clone_url":"https://github.com/openshift/origin-web-common.git","svn_url":"https://github.com/openshift/origin-web-common","homepage":null,"size":2158,"stargazers_count":6,"watchers_count":6,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":37,"mirror_url":null,"archived":false,"open_issues_count":14,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":37,"open_issues":14,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/openshift/origin-web-common/pulls/316"},"html":{"href":"https://github.com/openshift/origin-web-common/pull/316"},"issue":{"href":"https://api.github.com/repos/openshift/origin-web-common/issues/316"},"comments":{"href":"https://api.github.com/repos/openshift/origin-web-common/issues/316/comments"},"review_comments":{"href":"https://api.github.com/repos/openshift/origin-web-common/pulls/316/comments"},"review_comment":{"href":"https://api.github.com/repos/openshift/origin-web-common/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/openshift/origin-web-common/pulls/316/commits"},"statuses":{"href":"https://api.github.com/repos/openshift/origin-web-common/statuses/06f9bd13dae9b141588581fd73fdb3ef45f7f855"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"benjaminapetersen"}}