diff --git a/.gitignore b/.gitignore index 6d462a19..9bcb7b6c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ .sass-cache/ _site/ docs/ -dist/ coverage/ node_modules/ diff --git a/dist/components/Gist.js b/dist/components/Gist.js new file mode 100644 index 00000000..ea6ca580 --- /dev/null +++ b/dist/components/Gist.js @@ -0,0 +1,176 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable); + global.Gist = mod.exports; + } +})(this, function (module, _Requestable2) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var Gist = function (_Requestable) { + _inherits(Gist, _Requestable); + + /** + * Create a Gist. + * @param {string} id - the id of the gist (not required when creating a gist) + * @param {Requestable.auth} [auth] - information required to authenticate to Github + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function Gist(id, auth, apiBase) { + _classCallCheck(this, Gist); + + var _this = _possibleConstructorReturn(this, (Gist.__proto__ || Object.getPrototypeOf(Gist)).call(this, auth, apiBase)); + + _this.__id = id; + return _this; + } + + /** + * Fetch a gist. + * @see https://developer.github.com/v3/gists/#get-a-single-gist + * @param {Requestable.callback} [cb] - will receive the gist + * @return {Promise} - the Promise for the http request + */ + + + _createClass(Gist, [{ + key: 'read', + value: function read(cb) { + return this._request('GET', '/gists/' + this.__id, null, cb); + } + }, { + key: 'create', + value: function create(gist, cb) { + var _this2 = this; + + return this._request('POST', '/gists', gist, cb).then(function (response) { + _this2.__id = response.data.id; + return response; + }); + } + }, { + key: 'delete', + value: function _delete(cb) { + return this._request('DELETE', '/gists/' + this.__id, null, cb); + } + }, { + key: 'fork', + value: function fork(cb) { + return this._request('POST', '/gists/' + this.__id + '/forks', null, cb); + } + }, { + key: 'update', + value: function update(gist, cb) { + return this._request('PATCH', '/gists/' + this.__id, gist, cb); + } + }, { + key: 'star', + value: function star(cb) { + return this._request('PUT', '/gists/' + this.__id + '/star', null, cb); + } + }, { + key: 'unstar', + value: function unstar(cb) { + return this._request('DELETE', '/gists/' + this.__id + '/star', null, cb); + } + }, { + key: 'isStarred', + value: function isStarred(cb) { + return this._request204or404('/gists/' + this.__id + '/star', null, cb); + } + }, { + key: 'listComments', + value: function listComments(cb) { + return this._requestAllPages('/gists/' + this.__id + '/comments', null, cb); + } + }, { + key: 'getComment', + value: function getComment(comment, cb) { + return this._request('GET', '/gists/' + this.__id + '/comments/' + comment, null, cb); + } + }, { + key: 'createComment', + value: function createComment(comment, cb) { + return this._request('POST', '/gists/' + this.__id + '/comments', { body: comment }, cb); + } + }, { + key: 'editComment', + value: function editComment(comment, body, cb) { + return this._request('PATCH', '/gists/' + this.__id + '/comments/' + comment, { body: body }, cb); + } + }, { + key: 'deleteComment', + value: function deleteComment(comment, cb) { + return this._request('DELETE', '/gists/' + this.__id + '/comments/' + comment, null, cb); + } + }]); + + return Gist; + }(_Requestable3.default); + + module.exports = Gist; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkdpc3QuanMiXSwibmFtZXMiOlsiR2lzdCIsImlkIiwiYXV0aCIsImFwaUJhc2UiLCJfX2lkIiwiY2IiLCJfcmVxdWVzdCIsImdpc3QiLCJ0aGVuIiwicmVzcG9uc2UiLCJkYXRhIiwiX3JlcXVlc3QyMDRvcjQwNCIsIl9yZXF1ZXN0QWxsUGFnZXMiLCJjb21tZW50IiwiYm9keSIsIlJlcXVlc3RhYmxlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFZTUEsSTs7O0FBQ0g7Ozs7OztBQU1BLGtCQUFZQyxFQUFaLEVBQWdCQyxJQUFoQixFQUFzQkMsT0FBdEIsRUFBK0I7QUFBQTs7QUFBQSw4R0FDdEJELElBRHNCLEVBQ2hCQyxPQURnQjs7QUFFNUIsWUFBS0MsSUFBTCxHQUFZSCxFQUFaO0FBRjRCO0FBRzlCOztBQUVEOzs7Ozs7Ozs7OzJCQU1LSSxFLEVBQUk7QUFDTixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxLQUFkLGNBQStCLEtBQUtGLElBQXBDLEVBQTRDLElBQTVDLEVBQWtEQyxFQUFsRCxDQUFQO0FBQ0Y7Ozs2QkFTTUUsSSxFQUFNRixFLEVBQUk7QUFBQTs7QUFDZCxlQUFPLEtBQUtDLFFBQUwsQ0FBYyxNQUFkLEVBQXNCLFFBQXRCLEVBQWdDQyxJQUFoQyxFQUFzQ0YsRUFBdEMsRUFDSEcsSUFERyxDQUNFLFVBQUNDLFFBQUQsRUFBYztBQUNqQixpQkFBS0wsSUFBTCxHQUFZSyxTQUFTQyxJQUFULENBQWNULEVBQTFCO0FBQ0EsaUJBQU9RLFFBQVA7QUFDRixTQUpHLENBQVA7QUFLRjs7OzhCQVFNSixFLEVBQUk7QUFDUixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxRQUFkLGNBQWtDLEtBQUtGLElBQXZDLEVBQStDLElBQS9DLEVBQXFEQyxFQUFyRCxDQUFQO0FBQ0Y7OzsyQkFRSUEsRSxFQUFJO0FBQ04sZUFBTyxLQUFLQyxRQUFMLENBQWMsTUFBZCxjQUFnQyxLQUFLRixJQUFyQyxhQUFtRCxJQUFuRCxFQUF5REMsRUFBekQsQ0FBUDtBQUNGOzs7NkJBU01FLEksRUFBTUYsRSxFQUFJO0FBQ2QsZUFBTyxLQUFLQyxRQUFMLENBQWMsT0FBZCxjQUFpQyxLQUFLRixJQUF0QyxFQUE4Q0csSUFBOUMsRUFBb0RGLEVBQXBELENBQVA7QUFDRjs7OzJCQVFJQSxFLEVBQUk7QUFDTixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxLQUFkLGNBQStCLEtBQUtGLElBQXBDLFlBQWlELElBQWpELEVBQXVEQyxFQUF2RCxDQUFQO0FBQ0Y7Ozs2QkFRTUEsRSxFQUFJO0FBQ1IsZUFBTyxLQUFLQyxRQUFMLENBQWMsUUFBZCxjQUFrQyxLQUFLRixJQUF2QyxZQUFvRCxJQUFwRCxFQUEwREMsRUFBMUQsQ0FBUDtBQUNGOzs7Z0NBUVNBLEUsRUFBSTtBQUNYLGVBQU8sS0FBS00sZ0JBQUwsYUFBZ0MsS0FBS1AsSUFBckMsWUFBa0QsSUFBbEQsRUFBd0RDLEVBQXhELENBQVA7QUFDRjs7O21DQVFZQSxFLEVBQUk7QUFDZCxlQUFPLEtBQUtPLGdCQUFMLGFBQWdDLEtBQUtSLElBQXJDLGdCQUFzRCxJQUF0RCxFQUE0REMsRUFBNUQsQ0FBUDtBQUNGOzs7aUNBU1VRLE8sRUFBU1IsRSxFQUFJO0FBQ3JCLGVBQU8sS0FBS0MsUUFBTCxDQUFjLEtBQWQsY0FBK0IsS0FBS0YsSUFBcEMsa0JBQXFEUyxPQUFyRCxFQUFnRSxJQUFoRSxFQUFzRVIsRUFBdEUsQ0FBUDtBQUNGOzs7b0NBU2FRLE8sRUFBU1IsRSxFQUFJO0FBQ3hCLGVBQU8sS0FBS0MsUUFBTCxDQUFjLE1BQWQsY0FBZ0MsS0FBS0YsSUFBckMsZ0JBQXNELEVBQUNVLE1BQU1ELE9BQVAsRUFBdEQsRUFBdUVSLEVBQXZFLENBQVA7QUFDRjs7O2tDQVVXUSxPLEVBQVNDLEksRUFBTVQsRSxFQUFJO0FBQzVCLGVBQU8sS0FBS0MsUUFBTCxDQUFjLE9BQWQsY0FBaUMsS0FBS0YsSUFBdEMsa0JBQXVEUyxPQUF2RCxFQUFrRSxFQUFDQyxNQUFNQSxJQUFQLEVBQWxFLEVBQWdGVCxFQUFoRixDQUFQO0FBQ0Y7OztvQ0FTYVEsTyxFQUFTUixFLEVBQUk7QUFDeEIsZUFBTyxLQUFLQyxRQUFMLENBQWMsUUFBZCxjQUFrQyxLQUFLRixJQUF2QyxrQkFBd0RTLE9BQXhELEVBQW1FLElBQW5FLEVBQXlFUixFQUF6RSxDQUFQO0FBQ0Y7Ozs7SUF2SmVVLHFCOztBQTBKbkJDLFNBQU9DLE9BQVAsR0FBaUJqQixJQUFqQiIsImZpbGUiOiJHaXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICogQGNvcHlyaWdodCAgMjAxMyBNaWNoYWVsIEF1ZnJlaXRlciAoRGV2ZWxvcG1lbnQgU2VlZCkgYW5kIDIwMTYgWWFob28gSW5jLlxuICogQGxpY2Vuc2UgICAgTGljZW5zZWQgdW5kZXIge0BsaW5rIGh0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlLUNsZWFyLmh0bWwgQlNELTMtQ2xhdXNlLUNsZWFyfS5cbiAqICAgICAgICAgICAgIEdpdGh1Yi5qcyBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZS5cbiAqL1xuXG5pbXBvcnQgUmVxdWVzdGFibGUgZnJvbSAnLi9SZXF1ZXN0YWJsZSc7XG5cbi8qKlxuICogQSBHaXN0IGNhbiByZXRyaWV2ZSBhbmQgbW9kaWZ5IGdpc3RzLlxuICovXG5jbGFzcyBHaXN0IGV4dGVuZHMgUmVxdWVzdGFibGUge1xuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBHaXN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gdGhlIGlkIG9mIHRoZSBnaXN0IChub3QgcmVxdWlyZWQgd2hlbiBjcmVhdGluZyBhIGdpc3QpXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmF1dGh9IFthdXRoXSAtIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGF1dGhlbnRpY2F0ZSB0byBHaXRodWJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYXBpQmFzZT1odHRwczovL2FwaS5naXRodWIuY29tXSAtIHRoZSBiYXNlIEdpdGh1YiBBUEkgVVJMXG4gICAgKi9cbiAgIGNvbnN0cnVjdG9yKGlkLCBhdXRoLCBhcGlCYXNlKSB7XG4gICAgICBzdXBlcihhdXRoLCBhcGlCYXNlKTtcbiAgICAgIHRoaXMuX19pZCA9IGlkO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEZldGNoIGEgZ2lzdC5cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXN0cy8jZ2V0LWEtc2luZ2xlLWdpc3RcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGdpc3RcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIFByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgcmVhZChjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvZ2lzdHMvJHt0aGlzLl9faWR9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZSBhIG5ldyBnaXN0LlxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2dpc3RzLyNjcmVhdGUtYS1naXN0XG4gICAgKiBAcGFyYW0ge09iamVjdH0gZ2lzdCAtIHRoZSBkYXRhIGZvciB0aGUgbmV3IGdpc3RcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIG5ldyBnaXN0IHVwb24gY3JlYXRpb25cbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIFByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgY3JlYXRlKGdpc3QsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsICcvZ2lzdHMnLCBnaXN0LCBjYilcbiAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fX2lkID0gcmVzcG9uc2UuZGF0YS5pZDtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgIH0pO1xuICAgfVxuXG4gICAvKipcbiAgICAqIERlbGV0ZSBhIGdpc3QuXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvZ2lzdHMvI2RlbGV0ZS1hLWdpc3RcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdHJ1ZSBpZiB0aGUgcmVxdWVzdCBzdWNjZWVkc1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgUHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBkZWxldGUoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdERUxFVEUnLCBgL2dpc3RzLyR7dGhpcy5fX2lkfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBGb3JrIGEgZ2lzdC5cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXN0cy8jZm9yay1hLWdpc3RcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGdpc3RcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIFByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZm9yayhjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BPU1QnLCBgL2dpc3RzLyR7dGhpcy5fX2lkfS9mb3Jrc2AsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBVcGRhdGUgYSBnaXN0LlxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2dpc3RzLyNlZGl0LWEtZ2lzdFxuICAgICogQHBhcmFtIHtPYmplY3R9IGdpc3QgLSB0aGUgbmV3IGRhdGEgZm9yIHRoZSBnaXN0XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gdGhlIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIEFQSSByZXN1bHRcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIFByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgdXBkYXRlKGdpc3QsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUEFUQ0gnLCBgL2dpc3RzLyR7dGhpcy5fX2lkfWAsIGdpc3QsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBTdGFyIGEgZ2lzdC5cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXN0cy8jc3Rhci1hLWdpc3RcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBzdWNjZXNzZnVsXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBQcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIHN0YXIoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQVVQnLCBgL2dpc3RzLyR7dGhpcy5fX2lkfS9zdGFyYCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIFVuc3RhciBhIGdpc3QuXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvZ2lzdHMvI3Vuc3Rhci1hLWdpc3RcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBzdWNjZXNzZnVsXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBQcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIHVuc3RhcihjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0RFTEVURScsIGAvZ2lzdHMvJHt0aGlzLl9faWR9L3N0YXJgLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ2hlY2sgaWYgYSBnaXN0IGlzIHN0YXJyZWQgYnkgdGhlIHVzZXIuXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvZ2lzdHMvI2NoZWNrLWlmLWEtZ2lzdC1pcy1zdGFycmVkXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRydWUgaWYgdGhlIGdpc3QgaXMgc3RhcnJlZCBhbmQgZmFsc2UgaWYgdGhlIGdpc3QgaXMgbm90IHN0YXJyZWRcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIFByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgaXNTdGFycmVkKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdDIwNG9yNDA0KGAvZ2lzdHMvJHt0aGlzLl9faWR9L3N0YXJgLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgZ2lzdCdzIGNvbW1lbnRzXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvZ2lzdHMvY29tbWVudHMvI2xpc3QtY29tbWVudHMtb24tYS1naXN0XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBhcnJheSBvZiBjb21tZW50c1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBsaXN0Q29tbWVudHMoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0QWxsUGFnZXMoYC9naXN0cy8ke3RoaXMuX19pZH0vY29tbWVudHNgLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRmV0Y2ggb25lIG9mIHRoZSBnaXN0J3MgY29tbWVudHNcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXN0cy9jb21tZW50cy8jZ2V0LWEtc2luZ2xlLWNvbW1lbnRcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb21tZW50IC0gdGhlIGlkIG9mIHRoZSBjb21tZW50XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBjb21tZW50XG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBQcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldENvbW1lbnQoY29tbWVudCwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL2dpc3RzLyR7dGhpcy5fX2lkfS9jb21tZW50cy8ke2NvbW1lbnR9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENvbW1lbnQgb24gYSBnaXN0XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvZ2lzdHMvY29tbWVudHMvI2NyZWF0ZS1hLWNvbW1lbnRcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50IC0gdGhlIGNvbW1lbnQgdG8gYWRkXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gdGhlIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgdGhlIEFQSSByZXN1bHRcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIFByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgY3JlYXRlQ29tbWVudChjb21tZW50LCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BPU1QnLCBgL2dpc3RzLyR7dGhpcy5fX2lkfS9jb21tZW50c2AsIHtib2R5OiBjb21tZW50fSwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEVkaXQgYSBjb21tZW50IG9uIHRoZSBnaXN0XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvZ2lzdHMvY29tbWVudHMvI2VkaXQtYS1jb21tZW50XG4gICAgKiBAcGFyYW0ge251bWJlcn0gY29tbWVudCAtIHRoZSBpZCBvZiB0aGUgY29tbWVudFxuICAgICogQHBhcmFtIHtzdHJpbmd9IGJvZHkgLSB0aGUgbmV3IGNvbW1lbnRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIG1vZGlmaWVkIGNvbW1lbnRcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZWRpdENvbW1lbnQoY29tbWVudCwgYm9keSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQQVRDSCcsIGAvZ2lzdHMvJHt0aGlzLl9faWR9L2NvbW1lbnRzLyR7Y29tbWVudH1gLCB7Ym9keTogYm9keX0sIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBEZWxldGUgYSBjb21tZW50IG9uIHRoZSBnaXN0LlxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2dpc3RzL2NvbW1lbnRzLyNkZWxldGUtYS1jb21tZW50XG4gICAgKiBAcGFyYW0ge251bWJlcn0gY29tbWVudCAtIHRoZSBpZCBvZiB0aGUgY29tbWVudFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0cnVlIGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBQcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGRlbGV0ZUNvbW1lbnQoY29tbWVudCwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdERUxFVEUnLCBgL2dpc3RzLyR7dGhpcy5fX2lkfS9jb21tZW50cy8ke2NvbW1lbnR9YCwgbnVsbCwgY2IpO1xuICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdpc3Q7XG4iXX0= +//# sourceMappingURL=Gist.js.map diff --git a/dist/components/Gist.js.map b/dist/components/Gist.js.map new file mode 100644 index 00000000..d79a5234 --- /dev/null +++ b/dist/components/Gist.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["Gist.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\n\n/**\n * A Gist can retrieve and modify gists.\n */\nclass Gist extends Requestable {\n /**\n * Create a Gist.\n * @param {string} id - the id of the gist (not required when creating a gist)\n * @param {Requestable.auth} [auth] - information required to authenticate to Github\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(id, auth, apiBase) {\n super(auth, apiBase);\n this.__id = id;\n }\n\n /**\n * Fetch a gist.\n * @see https://developer.github.com/v3/gists/#get-a-single-gist\n * @param {Requestable.callback} [cb] - will receive the gist\n * @return {Promise} - the Promise for the http request\n */\n read(cb) {\n return this._request('GET', `/gists/${this.__id}`, null, cb);\n }\n\n /**\n * Create a new gist.\n * @see https://developer.github.com/v3/gists/#create-a-gist\n * @param {Object} gist - the data for the new gist\n * @param {Requestable.callback} [cb] - will receive the new gist upon creation\n * @return {Promise} - the Promise for the http request\n */\n create(gist, cb) {\n return this._request('POST', '/gists', gist, cb)\n .then((response) => {\n this.__id = response.data.id;\n return response;\n });\n }\n\n /**\n * Delete a gist.\n * @see https://developer.github.com/v3/gists/#delete-a-gist\n * @param {Requestable.callback} [cb] - will receive true if the request succeeds\n * @return {Promise} - the Promise for the http request\n */\n delete(cb) {\n return this._request('DELETE', `/gists/${this.__id}`, null, cb);\n }\n\n /**\n * Fork a gist.\n * @see https://developer.github.com/v3/gists/#fork-a-gist\n * @param {Requestable.callback} [cb] - the function that will receive the gist\n * @return {Promise} - the Promise for the http request\n */\n fork(cb) {\n return this._request('POST', `/gists/${this.__id}/forks`, null, cb);\n }\n\n /**\n * Update a gist.\n * @see https://developer.github.com/v3/gists/#edit-a-gist\n * @param {Object} gist - the new data for the gist\n * @param {Requestable.callback} [cb] - the function that receives the API result\n * @return {Promise} - the Promise for the http request\n */\n update(gist, cb) {\n return this._request('PATCH', `/gists/${this.__id}`, gist, cb);\n }\n\n /**\n * Star a gist.\n * @see https://developer.github.com/v3/gists/#star-a-gist\n * @param {Requestable.callback} [cb] - will receive true if the request is successful\n * @return {Promise} - the Promise for the http request\n */\n star(cb) {\n return this._request('PUT', `/gists/${this.__id}/star`, null, cb);\n }\n\n /**\n * Unstar a gist.\n * @see https://developer.github.com/v3/gists/#unstar-a-gist\n * @param {Requestable.callback} [cb] - will receive true if the request is successful\n * @return {Promise} - the Promise for the http request\n */\n unstar(cb) {\n return this._request('DELETE', `/gists/${this.__id}/star`, null, cb);\n }\n\n /**\n * Check if a gist is starred by the user.\n * @see https://developer.github.com/v3/gists/#check-if-a-gist-is-starred\n * @param {Requestable.callback} [cb] - will receive true if the gist is starred and false if the gist is not starred\n * @return {Promise} - the Promise for the http request\n */\n isStarred(cb) {\n return this._request204or404(`/gists/${this.__id}/star`, null, cb);\n }\n\n /**\n * List the gist's comments\n * @see https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist\n * @param {Requestable.callback} [cb] - will receive the array of comments\n * @return {Promise} - the promise for the http request\n */\n listComments(cb) {\n return this._requestAllPages(`/gists/${this.__id}/comments`, null, cb);\n }\n\n /**\n * Fetch one of the gist's comments\n * @see https://developer.github.com/v3/gists/comments/#get-a-single-comment\n * @param {number} comment - the id of the comment\n * @param {Requestable.callback} [cb] - will receive the comment\n * @return {Promise} - the Promise for the http request\n */\n getComment(comment, cb) {\n return this._request('GET', `/gists/${this.__id}/comments/${comment}`, null, cb);\n }\n\n /**\n * Comment on a gist\n * @see https://developer.github.com/v3/gists/comments/#create-a-comment\n * @param {string} comment - the comment to add\n * @param {Requestable.callback} [cb] - the function that receives the API result\n * @return {Promise} - the Promise for the http request\n */\n createComment(comment, cb) {\n return this._request('POST', `/gists/${this.__id}/comments`, {body: comment}, cb);\n }\n\n /**\n * Edit a comment on the gist\n * @see https://developer.github.com/v3/gists/comments/#edit-a-comment\n * @param {number} comment - the id of the comment\n * @param {string} body - the new comment\n * @param {Requestable.callback} [cb] - will receive the modified comment\n * @return {Promise} - the promise for the http request\n */\n editComment(comment, body, cb) {\n return this._request('PATCH', `/gists/${this.__id}/comments/${comment}`, {body: body}, cb);\n }\n\n /**\n * Delete a comment on the gist.\n * @see https://developer.github.com/v3/gists/comments/#delete-a-comment\n * @param {number} comment - the id of the comment\n * @param {Requestable.callback} [cb] - will receive true if the request succeeds\n * @return {Promise} - the Promise for the http request\n */\n deleteComment(comment, cb) {\n return this._request('DELETE', `/gists/${this.__id}/comments/${comment}`, null, cb);\n }\n}\n\nmodule.exports = Gist;\n"],"file":"Gist.js"} \ No newline at end of file diff --git a/dist/components/GitHub.js b/dist/components/GitHub.js new file mode 100644 index 00000000..c2ceb111 --- /dev/null +++ b/dist/components/GitHub.js @@ -0,0 +1,151 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Gist', './User', './Issue', './Search', './RateLimit', './Repository', './Organization', './Team', './Markdown'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Gist'), require('./User'), require('./Issue'), require('./Search'), require('./RateLimit'), require('./Repository'), require('./Organization'), require('./Team'), require('./Markdown')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Gist, global.User, global.Issue, global.Search, global.RateLimit, global.Repository, global.Organization, global.Team, global.Markdown); + global.GitHub = mod.exports; + } +})(this, function (module, _Gist, _User, _Issue, _Search, _RateLimit, _Repository, _Organization, _Team, _Markdown) { + 'use strict'; + + var _Gist2 = _interopRequireDefault(_Gist); + + var _User2 = _interopRequireDefault(_User); + + var _Issue2 = _interopRequireDefault(_Issue); + + var _Search2 = _interopRequireDefault(_Search); + + var _RateLimit2 = _interopRequireDefault(_RateLimit); + + var _Repository2 = _interopRequireDefault(_Repository); + + var _Organization2 = _interopRequireDefault(_Organization); + + var _Team2 = _interopRequireDefault(_Team); + + var _Markdown2 = _interopRequireDefault(_Markdown); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + var GitHub = function () { + /** + * Create a new GitHub. + * @param {Requestable.auth} [auth] - the credentials to authenticate to Github. If auth is + * not provided requests will be made unauthenticated + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function GitHub(auth) { + var apiBase = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'https://api.github.com'; + + _classCallCheck(this, GitHub); + + this.__apiBase = apiBase; + this.__auth = auth || {}; + } + + /** + * Create a new Gist wrapper + * @param {number} [id] - the id for the gist, leave undefined when creating a new gist + * @return {Gist} + */ + + + _createClass(GitHub, [{ + key: 'getGist', + value: function getGist(id) { + return new _Gist2.default(id, this.__auth, this.__apiBase); + } + }, { + key: 'getUser', + value: function getUser(user) { + return new _User2.default(user, this.__auth, this.__apiBase); + } + }, { + key: 'getOrganization', + value: function getOrganization(organization) { + return new _Organization2.default(organization, this.__auth, this.__apiBase); + } + }, { + key: 'getTeam', + value: function getTeam(teamId) { + return new _Team2.default(teamId, this.__auth, this.__apiBase); + } + }, { + key: 'getRepo', + value: function getRepo(user, repo) { + return new _Repository2.default(this._getFullName(user, repo), this.__auth, this.__apiBase); + } + }, { + key: 'getIssues', + value: function getIssues(user, repo) { + return new _Issue2.default(this._getFullName(user, repo), this.__auth, this.__apiBase); + } + }, { + key: 'search', + value: function search(query) { + return new _Search2.default(query, this.__auth, this.__apiBase); + } + }, { + key: 'getRateLimit', + value: function getRateLimit() { + return new _RateLimit2.default(this.__auth, this.__apiBase); + } + }, { + key: 'getMarkdown', + value: function getMarkdown() { + return new _Markdown2.default(this.__auth, this.__apiBase); + } + }, { + key: '_getFullName', + value: function _getFullName(user, repo) { + var fullname = user; + + if (repo) { + fullname = user + '/' + repo; + } + + return fullname; + } + }]); + + return GitHub; + }(); + + module.exports = GitHub; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkdpdEh1Yi5qcyJdLCJuYW1lcyI6WyJHaXRIdWIiLCJhdXRoIiwiYXBpQmFzZSIsIl9fYXBpQmFzZSIsIl9fYXV0aCIsImlkIiwiR2lzdCIsInVzZXIiLCJVc2VyIiwib3JnYW5pemF0aW9uIiwiT3JnYW5pemF0aW9uIiwidGVhbUlkIiwiVGVhbSIsInJlcG8iLCJSZXBvc2l0b3J5IiwiX2dldEZ1bGxOYW1lIiwiSXNzdWUiLCJxdWVyeSIsIlNlYXJjaCIsIlJhdGVMaW1pdCIsIk1hcmtkb3duIiwiZnVsbG5hbWUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFxQk1BLE07QUFDSDs7Ozs7O0FBTUEsb0JBQVlDLElBQVosRUFBc0Q7QUFBQSxVQUFwQ0MsT0FBb0MsdUVBQTFCLHdCQUEwQjs7QUFBQTs7QUFDbkQsV0FBS0MsU0FBTCxHQUFpQkQsT0FBakI7QUFDQSxXQUFLRSxNQUFMLEdBQWNILFFBQVEsRUFBdEI7QUFDRjs7QUFFRDs7Ozs7Ozs7OzhCQUtRSSxFLEVBQUk7QUFDVCxlQUFPLElBQUlDLGNBQUosQ0FBU0QsRUFBVCxFQUFhLEtBQUtELE1BQWxCLEVBQTBCLEtBQUtELFNBQS9CLENBQVA7QUFDRjs7OzhCQVFPSSxJLEVBQU07QUFDWCxlQUFPLElBQUlDLGNBQUosQ0FBU0QsSUFBVCxFQUFlLEtBQUtILE1BQXBCLEVBQTRCLEtBQUtELFNBQWpDLENBQVA7QUFDRjs7O3NDQU9lTSxZLEVBQWM7QUFDM0IsZUFBTyxJQUFJQyxzQkFBSixDQUFpQkQsWUFBakIsRUFBK0IsS0FBS0wsTUFBcEMsRUFBNEMsS0FBS0QsU0FBakQsQ0FBUDtBQUNGOzs7OEJBT09RLE0sRUFBUTtBQUNiLGVBQU8sSUFBSUMsY0FBSixDQUFTRCxNQUFULEVBQWlCLEtBQUtQLE1BQXRCLEVBQThCLEtBQUtELFNBQW5DLENBQVA7QUFDRjs7OzhCQVFPSSxJLEVBQU1NLEksRUFBTTtBQUNqQixlQUFPLElBQUlDLG9CQUFKLENBQWUsS0FBS0MsWUFBTCxDQUFrQlIsSUFBbEIsRUFBd0JNLElBQXhCLENBQWYsRUFBOEMsS0FBS1QsTUFBbkQsRUFBMkQsS0FBS0QsU0FBaEUsQ0FBUDtBQUNGOzs7Z0NBUVNJLEksRUFBTU0sSSxFQUFNO0FBQ25CLGVBQU8sSUFBSUcsZUFBSixDQUFVLEtBQUtELFlBQUwsQ0FBa0JSLElBQWxCLEVBQXdCTSxJQUF4QixDQUFWLEVBQXlDLEtBQUtULE1BQTlDLEVBQXNELEtBQUtELFNBQTNELENBQVA7QUFDRjs7OzZCQU9NYyxLLEVBQU87QUFDWCxlQUFPLElBQUlDLGdCQUFKLENBQVdELEtBQVgsRUFBa0IsS0FBS2IsTUFBdkIsRUFBK0IsS0FBS0QsU0FBcEMsQ0FBUDtBQUNGOzs7cUNBTWM7QUFDWixlQUFPLElBQUlnQixtQkFBSixDQUFjLEtBQUtmLE1BQW5CLEVBQTJCLEtBQUtELFNBQWhDLENBQVA7QUFDRjs7O29DQU1hO0FBQ1gsZUFBTyxJQUFJaUIsa0JBQUosQ0FBYSxLQUFLaEIsTUFBbEIsRUFBMEIsS0FBS0QsU0FBL0IsQ0FBUDtBQUNGOzs7bUNBUVlJLEksRUFBTU0sSSxFQUFNO0FBQ3RCLFlBQUlRLFdBQVdkLElBQWY7O0FBRUEsWUFBSU0sSUFBSixFQUFVO0FBQ1BRLHFCQUFjZCxJQUFkLFNBQXNCTSxJQUF0QjtBQUNGOztBQUVELGVBQU9RLFFBQVA7QUFDRjs7Ozs7O0FBR0pDLFNBQU9DLE9BQVAsR0FBaUJ2QixNQUFqQiIsImZpbGUiOiJHaXRIdWIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKiBAY29weXJpZ2h0ICAyMDEzIE1pY2hhZWwgQXVmcmVpdGVyIChEZXZlbG9wbWVudCBTZWVkKSBhbmQgMjAxNiBZYWhvbyBJbmMuXG4gKiBAbGljZW5zZSAgICBMaWNlbnNlZCB1bmRlciB7QGxpbmsgaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UtQ2xlYXIuaHRtbCBCU0QtMy1DbGF1c2UtQ2xlYXJ9LlxuICogICAgICAgICAgICAgR2l0aHViLmpzIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLlxuICovXG4vKiBlc2xpbnQgdmFsaWQtanNkb2M6IFtcImVycm9yXCIsIHtcInJlcXVpcmVSZXR1cm5EZXNjcmlwdGlvblwiOiBmYWxzZX1dICovXG5cbmltcG9ydCBHaXN0IGZyb20gJy4vR2lzdCc7XG5pbXBvcnQgVXNlciBmcm9tICcuL1VzZXInO1xuaW1wb3J0IElzc3VlIGZyb20gJy4vSXNzdWUnO1xuaW1wb3J0IFNlYXJjaCBmcm9tICcuL1NlYXJjaCc7XG5pbXBvcnQgUmF0ZUxpbWl0IGZyb20gJy4vUmF0ZUxpbWl0JztcbmltcG9ydCBSZXBvc2l0b3J5IGZyb20gJy4vUmVwb3NpdG9yeSc7XG5pbXBvcnQgT3JnYW5pemF0aW9uIGZyb20gJy4vT3JnYW5pemF0aW9uJztcbmltcG9ydCBUZWFtIGZyb20gJy4vVGVhbSc7XG5pbXBvcnQgTWFya2Rvd24gZnJvbSAnLi9NYXJrZG93bic7XG5cbi8qKlxuICogR2l0SHViIGVuY2Fwc3VsYXRlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgdmFyaW91cyBBUEkgd3JhcHBlciBvYmplY3RzLlxuICovXG5jbGFzcyBHaXRIdWIge1xuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgR2l0SHViLlxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5hdXRofSBbYXV0aF0gLSB0aGUgY3JlZGVudGlhbHMgdG8gYXV0aGVudGljYXRlIHRvIEdpdGh1Yi4gSWYgYXV0aCBpc1xuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHByb3ZpZGVkIHJlcXVlc3RzIHdpbGwgYmUgbWFkZSB1bmF1dGhlbnRpY2F0ZWRcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYXBpQmFzZT1odHRwczovL2FwaS5naXRodWIuY29tXSAtIHRoZSBiYXNlIEdpdGh1YiBBUEkgVVJMXG4gICAgKi9cbiAgIGNvbnN0cnVjdG9yKGF1dGgsIGFwaUJhc2UgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbScpIHtcbiAgICAgIHRoaXMuX19hcGlCYXNlID0gYXBpQmFzZTtcbiAgICAgIHRoaXMuX19hdXRoID0gYXV0aCB8fCB7fTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgR2lzdCB3cmFwcGVyXG4gICAgKiBAcGFyYW0ge251bWJlcn0gW2lkXSAtIHRoZSBpZCBmb3IgdGhlIGdpc3QsIGxlYXZlIHVuZGVmaW5lZCB3aGVuIGNyZWF0aW5nIGEgbmV3IGdpc3RcbiAgICAqIEByZXR1cm4ge0dpc3R9XG4gICAgKi9cbiAgIGdldEdpc3QoaWQpIHtcbiAgICAgIHJldHVybiBuZXcgR2lzdChpZCwgdGhpcy5fX2F1dGgsIHRoaXMuX19hcGlCYXNlKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgVXNlciB3cmFwcGVyXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW3VzZXJdIC0gdGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0XG4gICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGxlYXZlIHVuZGVmaW5lZCBmb3IgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlclxuICAgICogQHJldHVybiB7VXNlcn1cbiAgICAqL1xuICAgZ2V0VXNlcih1c2VyKSB7XG4gICAgICByZXR1cm4gbmV3IFVzZXIodXNlciwgdGhpcy5fX2F1dGgsIHRoaXMuX19hcGlCYXNlKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgT3JnYW5pemF0aW9uIHdyYXBwZXJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdhbml6YXRpb24gLSB0aGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uXG4gICAgKiBAcmV0dXJuIHtPcmdhbml6YXRpb259XG4gICAgKi9cbiAgIGdldE9yZ2FuaXphdGlvbihvcmdhbml6YXRpb24pIHtcbiAgICAgIHJldHVybiBuZXcgT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbiwgdGhpcy5fX2F1dGgsIHRoaXMuX19hcGlCYXNlKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBjcmVhdGUgYSBuZXcgVGVhbSB3cmFwcGVyXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gdGVhbUlkIC0gdGhlIG5hbWUgb2YgdGhlIHRlYW1cbiAgICAqIEByZXR1cm4ge3RlYW19XG4gICAgKi9cbiAgIGdldFRlYW0odGVhbUlkKSB7XG4gICAgICByZXR1cm4gbmV3IFRlYW0odGVhbUlkLCB0aGlzLl9fYXV0aCwgdGhpcy5fX2FwaUJhc2UpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZSBhIG5ldyBSZXBvc2l0b3J5IHdyYXBwZXJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIC0gdGhlIHVzZXIgd2hvIG93bnMgdGhlIHJlc3Bvc2l0b3J5XG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbyAtIHRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5XG4gICAgKiBAcmV0dXJuIHtSZXBvc2l0b3J5fVxuICAgICovXG4gICBnZXRSZXBvKHVzZXIsIHJlcG8pIHtcbiAgICAgIHJldHVybiBuZXcgUmVwb3NpdG9yeSh0aGlzLl9nZXRGdWxsTmFtZSh1c2VyLCByZXBvKSwgdGhpcy5fX2F1dGgsIHRoaXMuX19hcGlCYXNlKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgSXNzdWUgd3JhcHBlclxuICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXIgLSB0aGUgdXNlciB3aG8gb3ducyB0aGUgcmVzcG9zaXRvcnlcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBvIC0gdGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnlcbiAgICAqIEByZXR1cm4ge0lzc3VlfVxuICAgICovXG4gICBnZXRJc3N1ZXModXNlciwgcmVwbykge1xuICAgICAgcmV0dXJuIG5ldyBJc3N1ZSh0aGlzLl9nZXRGdWxsTmFtZSh1c2VyLCByZXBvKSwgdGhpcy5fX2F1dGgsIHRoaXMuX19hcGlCYXNlKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgU2VhcmNoIHdyYXBwZXJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSAtIHRoZSBxdWVyeSB0byBzZWFyY2ggZm9yXG4gICAgKiBAcmV0dXJuIHtTZWFyY2h9XG4gICAgKi9cbiAgIHNlYXJjaChxdWVyeSkge1xuICAgICAgcmV0dXJuIG5ldyBTZWFyY2gocXVlcnksIHRoaXMuX19hdXRoLCB0aGlzLl9fYXBpQmFzZSk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ3JlYXRlIGEgbmV3IFJhdGVMaW1pdCB3cmFwcGVyXG4gICAgKiBAcmV0dXJuIHtSYXRlTGltaXR9XG4gICAgKi9cbiAgIGdldFJhdGVMaW1pdCgpIHtcbiAgICAgIHJldHVybiBuZXcgUmF0ZUxpbWl0KHRoaXMuX19hdXRoLCB0aGlzLl9fYXBpQmFzZSk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ3JlYXRlIGEgbmV3IE1hcmtkb3duIHdyYXBwZXJcbiAgICAqIEByZXR1cm4ge01hcmtkb3dufVxuICAgICovXG4gICBnZXRNYXJrZG93bigpIHtcbiAgICAgIHJldHVybiBuZXcgTWFya2Rvd24odGhpcy5fX2F1dGgsIHRoaXMuX19hcGlCYXNlKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDb21wdXRlcyB0aGUgZnVsbCByZXBvc2l0b3J5IG5hbWVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIC0gdGhlIHVzZXJuYW1lIChvciB0aGUgZnVsbCBuYW1lKVxuICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcG8gLSB0aGUgcmVwb3NpdG9yeSBuYW1lLCBtdXN0IG5vdCBiZSBwYXNzZWQgaWYgYHVzZXJgIGlzIHRoZSBmdWxsIG5hbWVcbiAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHJlcG9zaXRvcnkncyBmdWxsIG5hbWVcbiAgICAqL1xuICAgX2dldEZ1bGxOYW1lKHVzZXIsIHJlcG8pIHtcbiAgICAgIGxldCBmdWxsbmFtZSA9IHVzZXI7XG5cbiAgICAgIGlmIChyZXBvKSB7XG4gICAgICAgICBmdWxsbmFtZSA9IGAke3VzZXJ9LyR7cmVwb31gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZnVsbG5hbWU7XG4gICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gR2l0SHViO1xuIl19 +//# sourceMappingURL=GitHub.js.map diff --git a/dist/components/GitHub.js.map b/dist/components/GitHub.js.map new file mode 100644 index 00000000..6da4edcf --- /dev/null +++ b/dist/components/GitHub.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["GitHub.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n/* eslint valid-jsdoc: [\"error\", {\"requireReturnDescription\": false}] */\n\nimport Gist from './Gist';\nimport User from './User';\nimport Issue from './Issue';\nimport Search from './Search';\nimport RateLimit from './RateLimit';\nimport Repository from './Repository';\nimport Organization from './Organization';\nimport Team from './Team';\nimport Markdown from './Markdown';\n\n/**\n * GitHub encapsulates the functionality to create various API wrapper objects.\n */\nclass GitHub {\n /**\n * Create a new GitHub.\n * @param {Requestable.auth} [auth] - the credentials to authenticate to Github. If auth is\n * not provided requests will be made unauthenticated\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(auth, apiBase = 'https://api.github.com') {\n this.__apiBase = apiBase;\n this.__auth = auth || {};\n }\n\n /**\n * Create a new Gist wrapper\n * @param {number} [id] - the id for the gist, leave undefined when creating a new gist\n * @return {Gist}\n */\n getGist(id) {\n return new Gist(id, this.__auth, this.__apiBase);\n }\n\n /**\n * Create a new User wrapper\n * @param {string} [user] - the name of the user to get information about\n * leave undefined for the authenticated user\n * @return {User}\n */\n getUser(user) {\n return new User(user, this.__auth, this.__apiBase);\n }\n\n /**\n * Create a new Organization wrapper\n * @param {string} organization - the name of the organization\n * @return {Organization}\n */\n getOrganization(organization) {\n return new Organization(organization, this.__auth, this.__apiBase);\n }\n\n /**\n * create a new Team wrapper\n * @param {string} teamId - the name of the team\n * @return {team}\n */\n getTeam(teamId) {\n return new Team(teamId, this.__auth, this.__apiBase);\n }\n\n /**\n * Create a new Repository wrapper\n * @param {string} user - the user who owns the respository\n * @param {string} repo - the name of the repository\n * @return {Repository}\n */\n getRepo(user, repo) {\n return new Repository(this._getFullName(user, repo), this.__auth, this.__apiBase);\n }\n\n /**\n * Create a new Issue wrapper\n * @param {string} user - the user who owns the respository\n * @param {string} repo - the name of the repository\n * @return {Issue}\n */\n getIssues(user, repo) {\n return new Issue(this._getFullName(user, repo), this.__auth, this.__apiBase);\n }\n\n /**\n * Create a new Search wrapper\n * @param {string} query - the query to search for\n * @return {Search}\n */\n search(query) {\n return new Search(query, this.__auth, this.__apiBase);\n }\n\n /**\n * Create a new RateLimit wrapper\n * @return {RateLimit}\n */\n getRateLimit() {\n return new RateLimit(this.__auth, this.__apiBase);\n }\n\n /**\n * Create a new Markdown wrapper\n * @return {Markdown}\n */\n getMarkdown() {\n return new Markdown(this.__auth, this.__apiBase);\n }\n\n /**\n * Computes the full repository name\n * @param {string} user - the username (or the full name)\n * @param {string} repo - the repository name, must not be passed if `user` is the full name\n * @return {string} the repository's full name\n */\n _getFullName(user, repo) {\n let fullname = user;\n\n if (repo) {\n fullname = `${user}/${repo}`;\n }\n\n return fullname;\n }\n}\n\nmodule.exports = GitHub;\n"],"file":"GitHub.js"} \ No newline at end of file diff --git a/dist/components/Issue.js b/dist/components/Issue.js new file mode 100644 index 00000000..b57f6127 --- /dev/null +++ b/dist/components/Issue.js @@ -0,0 +1,187 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable); + global.Issue = mod.exports; + } +})(this, function (module, _Requestable2) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var Issue = function (_Requestable) { + _inherits(Issue, _Requestable); + + /** + * Create a new Issue + * @param {string} repository - the full name of the repository (`:user/:repo`) to get issues for + * @param {Requestable.auth} [auth] - information required to authenticate to Github + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function Issue(repository, auth, apiBase) { + _classCallCheck(this, Issue); + + var _this = _possibleConstructorReturn(this, (Issue.__proto__ || Object.getPrototypeOf(Issue)).call(this, auth, apiBase)); + + _this.__repository = repository; + return _this; + } + + /** + * Create a new issue + * @see https://developer.github.com/v3/issues/#create-an-issue + * @param {Object} issueData - the issue to create + * @param {Requestable.callback} [cb] - will receive the created issue + * @return {Promise} - the promise for the http request + */ + + + _createClass(Issue, [{ + key: 'createIssue', + value: function createIssue(issueData, cb) { + return this._request('POST', '/repos/' + this.__repository + '/issues', issueData, cb); + } + }, { + key: 'listIssues', + value: function listIssues(options, cb) { + return this._requestAllPages('/repos/' + this.__repository + '/issues', options, cb); + } + }, { + key: 'listIssueEvents', + value: function listIssueEvents(issue, cb) { + return this._request('GET', '/repos/' + this.__repository + '/issues/' + issue + '/events', null, cb); + } + }, { + key: 'listIssueComments', + value: function listIssueComments(issue, cb) { + return this._request('GET', '/repos/' + this.__repository + '/issues/' + issue + '/comments', null, cb); + } + }, { + key: 'getIssueComment', + value: function getIssueComment(id, cb) { + return this._request('GET', '/repos/' + this.__repository + '/issues/comments/' + id, null, cb); + } + }, { + key: 'createIssueComment', + value: function createIssueComment(issue, comment, cb) { + return this._request('POST', '/repos/' + this.__repository + '/issues/' + issue + '/comments', { body: comment }, cb); + } + }, { + key: 'editIssueComment', + value: function editIssueComment(id, comment, cb) { + return this._request('PATCH', '/repos/' + this.__repository + '/issues/comments/' + id, { body: comment }, cb); + } + }, { + key: 'deleteIssueComment', + value: function deleteIssueComment(id, cb) { + return this._request('DELETE', '/repos/' + this.__repository + '/issues/comments/' + id, null, cb); + } + }, { + key: 'editIssue', + value: function editIssue(issue, issueData, cb) { + return this._request('PATCH', '/repos/' + this.__repository + '/issues/' + issue, issueData, cb); + } + }, { + key: 'getIssue', + value: function getIssue(issue, cb) { + return this._request('GET', '/repos/' + this.__repository + '/issues/' + issue, null, cb); + } + }, { + key: 'listMilestones', + value: function listMilestones(options, cb) { + return this._request('GET', '/repos/' + this.__repository + '/milestones', options, cb); + } + }, { + key: 'getMilestone', + value: function getMilestone(milestone, cb) { + return this._request('GET', '/repos/' + this.__repository + '/milestones/' + milestone, null, cb); + } + }, { + key: 'createMilestone', + value: function createMilestone(milestoneData, cb) { + return this._request('POST', '/repos/' + this.__repository + '/milestones', milestoneData, cb); + } + }, { + key: 'editMilestone', + value: function editMilestone(milestone, milestoneData, cb) { + return this._request('PATCH', '/repos/' + this.__repository + '/milestones/' + milestone, milestoneData, cb); + } + }, { + key: 'deleteMilestone', + value: function deleteMilestone(milestone, cb) { + return this._request('DELETE', '/repos/' + this.__repository + '/milestones/' + milestone, null, cb); + } + }, { + key: 'createLabel', + value: function createLabel(labelData, cb) { + return this._request('POST', '/repos/' + this.__repository + '/labels', labelData, cb); + } + }]); + + return Issue; + }(_Requestable3.default); + + module.exports = Issue; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIklzc3VlLmpzIl0sIm5hbWVzIjpbIklzc3VlIiwicmVwb3NpdG9yeSIsImF1dGgiLCJhcGlCYXNlIiwiX19yZXBvc2l0b3J5IiwiaXNzdWVEYXRhIiwiY2IiLCJfcmVxdWVzdCIsIm9wdGlvbnMiLCJfcmVxdWVzdEFsbFBhZ2VzIiwiaXNzdWUiLCJpZCIsImNvbW1lbnQiLCJib2R5IiwibWlsZXN0b25lIiwibWlsZXN0b25lRGF0YSIsImxhYmVsRGF0YSIsIlJlcXVlc3RhYmxlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFZTUEsSzs7O0FBQ0g7Ozs7OztBQU1BLG1CQUFZQyxVQUFaLEVBQXdCQyxJQUF4QixFQUE4QkMsT0FBOUIsRUFBdUM7QUFBQTs7QUFBQSxnSEFDOUJELElBRDhCLEVBQ3hCQyxPQUR3Qjs7QUFFcEMsWUFBS0MsWUFBTCxHQUFvQkgsVUFBcEI7QUFGb0M7QUFHdEM7O0FBRUQ7Ozs7Ozs7Ozs7O2tDQU9ZSSxTLEVBQVdDLEUsRUFBSTtBQUN4QixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxNQUFkLGNBQWdDLEtBQUtILFlBQXJDLGNBQTREQyxTQUE1RCxFQUF1RUMsRUFBdkUsQ0FBUDtBQUNGOzs7aUNBU1VFLE8sRUFBU0YsRSxFQUFJO0FBQ3JCLGVBQU8sS0FBS0csZ0JBQUwsYUFBZ0MsS0FBS0wsWUFBckMsY0FBNERJLE9BQTVELEVBQXFFRixFQUFyRSxDQUFQO0FBQ0Y7OztzQ0FTZUksSyxFQUFPSixFLEVBQUk7QUFDeEIsZUFBTyxLQUFLQyxRQUFMLENBQWMsS0FBZCxjQUErQixLQUFLSCxZQUFwQyxnQkFBMkRNLEtBQTNELGNBQTJFLElBQTNFLEVBQWlGSixFQUFqRixDQUFQO0FBQ0Y7Ozt3Q0FTaUJJLEssRUFBT0osRSxFQUFJO0FBQzFCLGVBQU8sS0FBS0MsUUFBTCxDQUFjLEtBQWQsY0FBK0IsS0FBS0gsWUFBcEMsZ0JBQTJETSxLQUEzRCxnQkFBNkUsSUFBN0UsRUFBbUZKLEVBQW5GLENBQVA7QUFDRjs7O3NDQVNlSyxFLEVBQUlMLEUsRUFBSTtBQUNyQixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxLQUFkLGNBQStCLEtBQUtILFlBQXBDLHlCQUFvRU8sRUFBcEUsRUFBMEUsSUFBMUUsRUFBZ0ZMLEVBQWhGLENBQVA7QUFDRjs7O3lDQVVrQkksSyxFQUFPRSxPLEVBQVNOLEUsRUFBSTtBQUNwQyxlQUFPLEtBQUtDLFFBQUwsQ0FBYyxNQUFkLGNBQWdDLEtBQUtILFlBQXJDLGdCQUE0RE0sS0FBNUQsZ0JBQThFLEVBQUNHLE1BQU1ELE9BQVAsRUFBOUUsRUFBK0ZOLEVBQS9GLENBQVA7QUFDRjs7O3VDQVVnQkssRSxFQUFJQyxPLEVBQVNOLEUsRUFBSTtBQUMvQixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxPQUFkLGNBQWlDLEtBQUtILFlBQXRDLHlCQUFzRU8sRUFBdEUsRUFBNEUsRUFBQ0UsTUFBTUQsT0FBUCxFQUE1RSxFQUE2Rk4sRUFBN0YsQ0FBUDtBQUNGOzs7eUNBU2tCSyxFLEVBQUlMLEUsRUFBSTtBQUN4QixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxRQUFkLGNBQWtDLEtBQUtILFlBQXZDLHlCQUF1RU8sRUFBdkUsRUFBNkUsSUFBN0UsRUFBbUZMLEVBQW5GLENBQVA7QUFDRjs7O2dDQVVTSSxLLEVBQU9MLFMsRUFBV0MsRSxFQUFJO0FBQzdCLGVBQU8sS0FBS0MsUUFBTCxDQUFjLE9BQWQsY0FBaUMsS0FBS0gsWUFBdEMsZ0JBQTZETSxLQUE3RCxFQUFzRUwsU0FBdEUsRUFBaUZDLEVBQWpGLENBQVA7QUFDRjs7OytCQVNRSSxLLEVBQU9KLEUsRUFBSTtBQUNqQixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxLQUFkLGNBQStCLEtBQUtILFlBQXBDLGdCQUEyRE0sS0FBM0QsRUFBb0UsSUFBcEUsRUFBMEVKLEVBQTFFLENBQVA7QUFDRjs7O3FDQVNjRSxPLEVBQVNGLEUsRUFBSTtBQUN6QixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxLQUFkLGNBQStCLEtBQUtILFlBQXBDLGtCQUErREksT0FBL0QsRUFBd0VGLEVBQXhFLENBQVA7QUFDRjs7O21DQVNZUSxTLEVBQVdSLEUsRUFBSTtBQUN6QixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxLQUFkLGNBQStCLEtBQUtILFlBQXBDLG9CQUErRFUsU0FBL0QsRUFBNEUsSUFBNUUsRUFBa0ZSLEVBQWxGLENBQVA7QUFDRjs7O3NDQVNlUyxhLEVBQWVULEUsRUFBSTtBQUNoQyxlQUFPLEtBQUtDLFFBQUwsQ0FBYyxNQUFkLGNBQWdDLEtBQUtILFlBQXJDLGtCQUFnRVcsYUFBaEUsRUFBK0VULEVBQS9FLENBQVA7QUFDRjs7O29DQVVhUSxTLEVBQVdDLGEsRUFBZVQsRSxFQUFJO0FBQ3pDLGVBQU8sS0FBS0MsUUFBTCxDQUFjLE9BQWQsY0FBaUMsS0FBS0gsWUFBdEMsb0JBQWlFVSxTQUFqRSxFQUE4RUMsYUFBOUUsRUFBNkZULEVBQTdGLENBQVA7QUFDRjs7O3NDQVNlUSxTLEVBQVdSLEUsRUFBSTtBQUM1QixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxRQUFkLGNBQWtDLEtBQUtILFlBQXZDLG9CQUFrRVUsU0FBbEUsRUFBK0UsSUFBL0UsRUFBcUZSLEVBQXJGLENBQVA7QUFDRjs7O2tDQVNXVSxTLEVBQVdWLEUsRUFBSTtBQUN4QixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxNQUFkLGNBQWdDLEtBQUtILFlBQXJDLGNBQTREWSxTQUE1RCxFQUF1RVYsRUFBdkUsQ0FBUDtBQUNGOzs7O0lBOUxnQlcscUI7O0FBaU1wQkMsU0FBT0MsT0FBUCxHQUFpQm5CLEtBQWpCIiwiZmlsZSI6Iklzc3VlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICogQGNvcHlyaWdodCAgMjAxMyBNaWNoYWVsIEF1ZnJlaXRlciAoRGV2ZWxvcG1lbnQgU2VlZCkgYW5kIDIwMTYgWWFob28gSW5jLlxuICogQGxpY2Vuc2UgICAgTGljZW5zZWQgdW5kZXIge0BsaW5rIGh0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlLUNsZWFyLmh0bWwgQlNELTMtQ2xhdXNlLUNsZWFyfS5cbiAqICAgICAgICAgICAgIEdpdGh1Yi5qcyBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZS5cbiAqL1xuXG5pbXBvcnQgUmVxdWVzdGFibGUgZnJvbSAnLi9SZXF1ZXN0YWJsZSc7XG5cbi8qKlxuICogSXNzdWUgd3JhcHMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gZ2V0IGlzc3VlcyBmb3IgcmVwb3NpdG9yaWVzXG4gKi9cbmNsYXNzIElzc3VlIGV4dGVuZHMgUmVxdWVzdGFibGUge1xuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgSXNzdWVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBvc2l0b3J5IC0gdGhlIGZ1bGwgbmFtZSBvZiB0aGUgcmVwb3NpdG9yeSAoYDp1c2VyLzpyZXBvYCkgdG8gZ2V0IGlzc3VlcyBmb3JcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuYXV0aH0gW2F1dGhdIC0gaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIHRvIEdpdGh1YlxuICAgICogQHBhcmFtIHtzdHJpbmd9IFthcGlCYXNlPWh0dHBzOi8vYXBpLmdpdGh1Yi5jb21dIC0gdGhlIGJhc2UgR2l0aHViIEFQSSBVUkxcbiAgICAqL1xuICAgY29uc3RydWN0b3IocmVwb3NpdG9yeSwgYXV0aCwgYXBpQmFzZSkge1xuICAgICAgc3VwZXIoYXV0aCwgYXBpQmFzZSk7XG4gICAgICB0aGlzLl9fcmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ3JlYXRlIGEgbmV3IGlzc3VlXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvaXNzdWVzLyNjcmVhdGUtYW4taXNzdWVcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBpc3N1ZURhdGEgLSB0aGUgaXNzdWUgdG8gY3JlYXRlXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBjcmVhdGVkIGlzc3VlXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGNyZWF0ZUlzc3VlKGlzc3VlRGF0YSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQT1NUJywgYC9yZXBvcy8ke3RoaXMuX19yZXBvc2l0b3J5fS9pc3N1ZXNgLCBpc3N1ZURhdGEsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBMaXN0IHRoZSBpc3N1ZXMgZm9yIHRoZSByZXBvc2l0b3J5XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvaXNzdWVzLyNsaXN0LWlzc3Vlcy1mb3ItYS1yZXBvc2l0b3J5XG4gICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIGZpbHRlcmluZyBvcHRpb25zXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBhcnJheSBvZiBpc3N1ZXNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdElzc3VlcyhvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RBbGxQYWdlcyhgL3JlcG9zLyR7dGhpcy5fX3JlcG9zaXRvcnl9L2lzc3Vlc2AsIG9wdGlvbnMsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBMaXN0IHRoZSBldmVudHMgZm9yIGFuIGlzc3VlXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvaXNzdWVzL2V2ZW50cy8jbGlzdC1ldmVudHMtZm9yLWFuLWlzc3VlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gaXNzdWUgLSB0aGUgaXNzdWUgdG8gZ2V0IGV2ZW50cyBmb3JcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGxpc3Qgb2YgZXZlbnRzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGxpc3RJc3N1ZUV2ZW50cyhpc3N1ZSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX3JlcG9zaXRvcnl9L2lzc3Vlcy8ke2lzc3VlfS9ldmVudHNgLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCBjb21tZW50cyBvbiBhbiBpc3N1ZVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2lzc3Vlcy9jb21tZW50cy8jbGlzdC1jb21tZW50cy1vbi1hbi1pc3N1ZVxuICAgICogQHBhcmFtIHtudW1iZXJ9IGlzc3VlIC0gdGhlIGlkIG9mIHRoZSBpc3N1ZSB0byBnZXQgY29tbWVudHMgZnJvbVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgY29tbWVudHNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdElzc3VlQ29tbWVudHMoaXNzdWUsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR0VUJywgYC9yZXBvcy8ke3RoaXMuX19yZXBvc2l0b3J5fS9pc3N1ZXMvJHtpc3N1ZX0vY29tbWVudHNgLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2V0IGEgc2luZ2xlIGNvbW1lbnQgb24gYW4gaXNzdWVcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvY29tbWVudHMvI2dldC1hLXNpbmdsZS1jb21tZW50XG4gICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSB0aGUgY29tbWVudCBpZCB0byBnZXRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGNvbW1lbnRcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0SXNzdWVDb21tZW50KGlkLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fcmVwb3NpdG9yeX0vaXNzdWVzL2NvbW1lbnRzLyR7aWR9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENvbW1lbnQgb24gYW4gaXNzdWVcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvY29tbWVudHMvI2NyZWF0ZS1hLWNvbW1lbnRcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBpc3N1ZSAtIHRoZSBpZCBvZiB0aGUgaXNzdWUgdG8gY29tbWVudCBvblxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnQgLSB0aGUgY29tbWVudCB0byBhZGRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGNyZWF0ZWQgY29tbWVudFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBjcmVhdGVJc3N1ZUNvbW1lbnQoaXNzdWUsIGNvbW1lbnQsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsIGAvcmVwb3MvJHt0aGlzLl9fcmVwb3NpdG9yeX0vaXNzdWVzLyR7aXNzdWV9L2NvbW1lbnRzYCwge2JvZHk6IGNvbW1lbnR9LCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRWRpdCBhIGNvbW1lbnQgb24gYW4gaXNzdWVcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvY29tbWVudHMvI2VkaXQtYS1jb21tZW50XG4gICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSB0aGUgY29tbWVudCBpZCB0byBlZGl0XG4gICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudCAtIHRoZSBjb21tZW50IHRvIGVkaXRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGVkaXRlZCBjb21tZW50XG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGVkaXRJc3N1ZUNvbW1lbnQoaWQsIGNvbW1lbnQsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUEFUQ0gnLCBgL3JlcG9zLyR7dGhpcy5fX3JlcG9zaXRvcnl9L2lzc3Vlcy9jb21tZW50cy8ke2lkfWAsIHtib2R5OiBjb21tZW50fSwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIERlbGV0ZSBhIGNvbW1lbnQgb24gYW4gaXNzdWVcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvY29tbWVudHMvI2RlbGV0ZS1hLWNvbW1lbnRcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIHRoZSBjb21tZW50IGlkIHRvIGRlbGV0ZVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZGVsZXRlSXNzdWVDb21tZW50KGlkLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0RFTEVURScsIGAvcmVwb3MvJHt0aGlzLl9fcmVwb3NpdG9yeX0vaXNzdWVzL2NvbW1lbnRzLyR7aWR9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEVkaXQgYW4gaXNzdWVcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvI2VkaXQtYW4taXNzdWVcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBpc3N1ZSAtIHRoZSBpc3N1ZSBudW1iZXIgdG8gZWRpdFxuICAgICogQHBhcmFtIHtPYmplY3R9IGlzc3VlRGF0YSAtIHRoZSBuZXcgaXNzdWUgZGF0YVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbW9kaWZpZWQgaXNzdWVcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZWRpdElzc3VlKGlzc3VlLCBpc3N1ZURhdGEsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUEFUQ0gnLCBgL3JlcG9zLyR7dGhpcy5fX3JlcG9zaXRvcnl9L2lzc3Vlcy8ke2lzc3VlfWAsIGlzc3VlRGF0YSwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCBhIHBhcnRpY3VsYXIgaXNzdWVcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvI2dldC1hLXNpbmdsZS1pc3N1ZVxuICAgICogQHBhcmFtIHtudW1iZXJ9IGlzc3VlIC0gdGhlIGlzc3VlIG51bWJlciB0byBmZXRjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgaXNzdWVcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0SXNzdWUoaXNzdWUsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR0VUJywgYC9yZXBvcy8ke3RoaXMuX19yZXBvc2l0b3J5fS9pc3N1ZXMvJHtpc3N1ZX1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgbWlsZXN0b25lcyBmb3IgdGhlIHJlcG9zaXRvcnlcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvbWlsZXN0b25lcy8jbGlzdC1taWxlc3RvbmVzLWZvci1hLXJlcG9zaXRvcnlcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gZmlsdGVyaW5nIG9wdGlvbnNcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGFycmF5IG9mIG1pbGVzdG9uZXNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdE1pbGVzdG9uZXMob3B0aW9ucywgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX3JlcG9zaXRvcnl9L21pbGVzdG9uZXNgLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2V0IGEgbWlsZXN0b25lXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvaXNzdWVzL21pbGVzdG9uZXMvI2dldC1hLXNpbmdsZS1taWxlc3RvbmVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBtaWxlc3RvbmUgLSB0aGUgaWQgb2YgdGhlIG1pbGVzdG9uZSB0byBmZXRjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgYXJyYXkgb2YgbWlsZXN0b25lc1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBnZXRNaWxlc3RvbmUobWlsZXN0b25lLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fcmVwb3NpdG9yeX0vbWlsZXN0b25lcy8ke21pbGVzdG9uZX1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ3JlYXRlIGEgbmV3IG1pbGVzdG9uZVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2lzc3Vlcy9taWxlc3RvbmVzLyNjcmVhdGUtYS1taWxlc3RvbmVcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBtaWxlc3RvbmVEYXRhIC0gdGhlIG1pbGVzdG9uZSBkZWZpbml0aW9uXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBhcnJheSBvZiBtaWxlc3RvbmVzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGNyZWF0ZU1pbGVzdG9uZShtaWxlc3RvbmVEYXRhLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BPU1QnLCBgL3JlcG9zLyR7dGhpcy5fX3JlcG9zaXRvcnl9L21pbGVzdG9uZXNgLCBtaWxlc3RvbmVEYXRhLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRWRpdCBhIG1pbGVzdG9uZVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2lzc3Vlcy9taWxlc3RvbmVzLyN1cGRhdGUtYS1taWxlc3RvbmVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBtaWxlc3RvbmUgLSB0aGUgaWQgb2YgdGhlIG1pbGVzdG9uZSB0byBlZGl0XG4gICAgKiBAcGFyYW0ge09iamVjdH0gbWlsZXN0b25lRGF0YSAtIHRoZSB1cGRhdGVzIHRvIG1ha2UgdG8gdGhlIG1pbGVzdG9uZVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgYXJyYXkgb2YgbWlsZXN0b25lc1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBlZGl0TWlsZXN0b25lKG1pbGVzdG9uZSwgbWlsZXN0b25lRGF0YSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQQVRDSCcsIGAvcmVwb3MvJHt0aGlzLl9fcmVwb3NpdG9yeX0vbWlsZXN0b25lcy8ke21pbGVzdG9uZX1gLCBtaWxlc3RvbmVEYXRhLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRGVsZXRlIGEgbWlsZXN0b25lICh0aGlzIGlzIGRpc3RpbmN0IGZyb20gY2xvc2luZyBhIG1pbGVzdG9uZSlcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvbWlsZXN0b25lcy8jZGVsZXRlLWEtbWlsZXN0b25lXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gbWlsZXN0b25lIC0gdGhlIGlkIG9mIHRoZSBtaWxlc3RvbmUgdG8gZGVsZXRlXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBhcnJheSBvZiBtaWxlc3RvbmVzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGRlbGV0ZU1pbGVzdG9uZShtaWxlc3RvbmUsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnREVMRVRFJywgYC9yZXBvcy8ke3RoaXMuX19yZXBvc2l0b3J5fS9taWxlc3RvbmVzLyR7bWlsZXN0b25lfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgbGFiZWxcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9pc3N1ZXMvbGFiZWxzLyNjcmVhdGUtYS1sYWJlbFxuICAgICogQHBhcmFtIHtPYmplY3R9IGxhYmVsRGF0YSAtIHRoZSBsYWJlbCBkZWZpbml0aW9uXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsYWJlbFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBjcmVhdGVMYWJlbChsYWJlbERhdGEsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsIGAvcmVwb3MvJHt0aGlzLl9fcmVwb3NpdG9yeX0vbGFiZWxzYCwgbGFiZWxEYXRhLCBjYik7XG4gICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gSXNzdWU7XG4iXX0= +//# sourceMappingURL=Issue.js.map diff --git a/dist/components/Issue.js.map b/dist/components/Issue.js.map new file mode 100644 index 00000000..ddb0af6d --- /dev/null +++ b/dist/components/Issue.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["Issue.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\n\n/**\n * Issue wraps the functionality to get issues for repositories\n */\nclass Issue extends Requestable {\n /**\n * Create a new Issue\n * @param {string} repository - the full name of the repository (`:user/:repo`) to get issues for\n * @param {Requestable.auth} [auth] - information required to authenticate to Github\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(repository, auth, apiBase) {\n super(auth, apiBase);\n this.__repository = repository;\n }\n\n /**\n * Create a new issue\n * @see https://developer.github.com/v3/issues/#create-an-issue\n * @param {Object} issueData - the issue to create\n * @param {Requestable.callback} [cb] - will receive the created issue\n * @return {Promise} - the promise for the http request\n */\n createIssue(issueData, cb) {\n return this._request('POST', `/repos/${this.__repository}/issues`, issueData, cb);\n }\n\n /**\n * List the issues for the repository\n * @see https://developer.github.com/v3/issues/#list-issues-for-a-repository\n * @param {Object} options - filtering options\n * @param {Requestable.callback} [cb] - will receive the array of issues\n * @return {Promise} - the promise for the http request\n */\n listIssues(options, cb) {\n return this._requestAllPages(`/repos/${this.__repository}/issues`, options, cb);\n }\n\n /**\n * List the events for an issue\n * @see https://developer.github.com/v3/issues/events/#list-events-for-an-issue\n * @param {number} issue - the issue to get events for\n * @param {Requestable.callback} [cb] - will receive the list of events\n * @return {Promise} - the promise for the http request\n */\n listIssueEvents(issue, cb) {\n return this._request('GET', `/repos/${this.__repository}/issues/${issue}/events`, null, cb);\n }\n\n /**\n * List comments on an issue\n * @see https://developer.github.com/v3/issues/comments/#list-comments-on-an-issue\n * @param {number} issue - the id of the issue to get comments from\n * @param {Requestable.callback} [cb] - will receive the comments\n * @return {Promise} - the promise for the http request\n */\n listIssueComments(issue, cb) {\n return this._request('GET', `/repos/${this.__repository}/issues/${issue}/comments`, null, cb);\n }\n\n /**\n * Get a single comment on an issue\n * @see https://developer.github.com/v3/issues/comments/#get-a-single-comment\n * @param {number} id - the comment id to get\n * @param {Requestable.callback} [cb] - will receive the comment\n * @return {Promise} - the promise for the http request\n */\n getIssueComment(id, cb) {\n return this._request('GET', `/repos/${this.__repository}/issues/comments/${id}`, null, cb);\n }\n\n /**\n * Comment on an issue\n * @see https://developer.github.com/v3/issues/comments/#create-a-comment\n * @param {number} issue - the id of the issue to comment on\n * @param {string} comment - the comment to add\n * @param {Requestable.callback} [cb] - will receive the created comment\n * @return {Promise} - the promise for the http request\n */\n createIssueComment(issue, comment, cb) {\n return this._request('POST', `/repos/${this.__repository}/issues/${issue}/comments`, {body: comment}, cb);\n }\n\n /**\n * Edit a comment on an issue\n * @see https://developer.github.com/v3/issues/comments/#edit-a-comment\n * @param {number} id - the comment id to edit\n * @param {string} comment - the comment to edit\n * @param {Requestable.callback} [cb] - will receive the edited comment\n * @return {Promise} - the promise for the http request\n */\n editIssueComment(id, comment, cb) {\n return this._request('PATCH', `/repos/${this.__repository}/issues/comments/${id}`, {body: comment}, cb);\n }\n\n /**\n * Delete a comment on an issue\n * @see https://developer.github.com/v3/issues/comments/#delete-a-comment\n * @param {number} id - the comment id to delete\n * @param {Requestable.callback} [cb] - will receive true if the request is successful\n * @return {Promise} - the promise for the http request\n */\n deleteIssueComment(id, cb) {\n return this._request('DELETE', `/repos/${this.__repository}/issues/comments/${id}`, null, cb);\n }\n\n /**\n * Edit an issue\n * @see https://developer.github.com/v3/issues/#edit-an-issue\n * @param {number} issue - the issue number to edit\n * @param {Object} issueData - the new issue data\n * @param {Requestable.callback} [cb] - will receive the modified issue\n * @return {Promise} - the promise for the http request\n */\n editIssue(issue, issueData, cb) {\n return this._request('PATCH', `/repos/${this.__repository}/issues/${issue}`, issueData, cb);\n }\n\n /**\n * Get a particular issue\n * @see https://developer.github.com/v3/issues/#get-a-single-issue\n * @param {number} issue - the issue number to fetch\n * @param {Requestable.callback} [cb] - will receive the issue\n * @return {Promise} - the promise for the http request\n */\n getIssue(issue, cb) {\n return this._request('GET', `/repos/${this.__repository}/issues/${issue}`, null, cb);\n }\n\n /**\n * List the milestones for the repository\n * @see https://developer.github.com/v3/issues/milestones/#list-milestones-for-a-repository\n * @param {Object} options - filtering options\n * @param {Requestable.callback} [cb] - will receive the array of milestones\n * @return {Promise} - the promise for the http request\n */\n listMilestones(options, cb) {\n return this._request('GET', `/repos/${this.__repository}/milestones`, options, cb);\n }\n\n /**\n * Get a milestone\n * @see https://developer.github.com/v3/issues/milestones/#get-a-single-milestone\n * @param {string} milestone - the id of the milestone to fetch\n * @param {Requestable.callback} [cb] - will receive the array of milestones\n * @return {Promise} - the promise for the http request\n */\n getMilestone(milestone, cb) {\n return this._request('GET', `/repos/${this.__repository}/milestones/${milestone}`, null, cb);\n }\n\n /**\n * Create a new milestone\n * @see https://developer.github.com/v3/issues/milestones/#create-a-milestone\n * @param {Object} milestoneData - the milestone definition\n * @param {Requestable.callback} [cb] - will receive the array of milestones\n * @return {Promise} - the promise for the http request\n */\n createMilestone(milestoneData, cb) {\n return this._request('POST', `/repos/${this.__repository}/milestones`, milestoneData, cb);\n }\n\n /**\n * Edit a milestone\n * @see https://developer.github.com/v3/issues/milestones/#update-a-milestone\n * @param {string} milestone - the id of the milestone to edit\n * @param {Object} milestoneData - the updates to make to the milestone\n * @param {Requestable.callback} [cb] - will receive the array of milestones\n * @return {Promise} - the promise for the http request\n */\n editMilestone(milestone, milestoneData, cb) {\n return this._request('PATCH', `/repos/${this.__repository}/milestones/${milestone}`, milestoneData, cb);\n }\n\n /**\n * Delete a milestone (this is distinct from closing a milestone)\n * @see https://developer.github.com/v3/issues/milestones/#delete-a-milestone\n * @param {string} milestone - the id of the milestone to delete\n * @param {Requestable.callback} [cb] - will receive the array of milestones\n * @return {Promise} - the promise for the http request\n */\n deleteMilestone(milestone, cb) {\n return this._request('DELETE', `/repos/${this.__repository}/milestones/${milestone}`, null, cb);\n }\n\n /**\n * Create a new label\n * @see https://developer.github.com/v3/issues/labels/#create-a-label\n * @param {Object} labelData - the label definition\n * @param {Requestable.callback} [cb] - will receive the object representing the label\n * @return {Promise} - the promise for the http request\n */\n createLabel(labelData, cb) {\n return this._request('POST', `/repos/${this.__repository}/labels`, labelData, cb);\n }\n}\n\nmodule.exports = Issue;\n"],"file":"Issue.js"} \ No newline at end of file diff --git a/dist/components/Markdown.js b/dist/components/Markdown.js new file mode 100644 index 00000000..855df7ce --- /dev/null +++ b/dist/components/Markdown.js @@ -0,0 +1,112 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable); + global.Markdown = mod.exports; + } +})(this, function (module, _Requestable2) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var Markdown = function (_Requestable) { + _inherits(Markdown, _Requestable); + + /** + * construct a RateLimit + * @param {Requestable.auth} auth - the credentials to authenticate to GitHub + * @param {string} [apiBase] - the base Github API URL + * @return {Promise} - the promise for the http request + */ + function Markdown(auth, apiBase) { + _classCallCheck(this, Markdown); + + return _possibleConstructorReturn(this, (Markdown.__proto__ || Object.getPrototypeOf(Markdown)).call(this, auth, apiBase)); + } + + /** + * Render html from Markdown text. + * @see https://developer.github.com/v3/markdown/#render-an-arbitrary-markdown-document + * @param {Object} options - conversion options + * @param {string} [options.text] - the markdown text to convert + * @param {string} [options.mode=markdown] - can be either `markdown` or `gfm` + * @param {string} [options.context] - repository name if mode is gfm + * @param {Requestable.callback} [cb] - will receive the converted html + * @return {Promise} - the promise for the http request + */ + + + _createClass(Markdown, [{ + key: 'render', + value: function render(options, cb) { + return this._request('POST', '/markdown', options, cb); + } + }]); + + return Markdown; + }(_Requestable3.default); + + module.exports = Markdown; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk1hcmtkb3duLmpzIl0sIm5hbWVzIjpbIk1hcmtkb3duIiwiYXV0aCIsImFwaUJhc2UiLCJvcHRpb25zIiwiY2IiLCJfcmVxdWVzdCIsIlJlcXVlc3RhYmxlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFZTUEsUTs7O0FBQ0g7Ozs7OztBQU1BLHNCQUFZQyxJQUFaLEVBQWtCQyxPQUFsQixFQUEyQjtBQUFBOztBQUFBLGlIQUNsQkQsSUFEa0IsRUFDWkMsT0FEWTtBQUUxQjs7QUFFRDs7Ozs7Ozs7Ozs7Ozs7NkJBVU9DLE8sRUFBU0MsRSxFQUFJO0FBQ2pCLGVBQU8sS0FBS0MsUUFBTCxDQUFjLE1BQWQsRUFBc0IsV0FBdEIsRUFBbUNGLE9BQW5DLEVBQTRDQyxFQUE1QyxDQUFQO0FBQ0Y7Ozs7SUF2Qm1CRSxxQjs7QUEwQnZCQyxTQUFPQyxPQUFQLEdBQWlCUixRQUFqQiIsImZpbGUiOiJNYXJrZG93bi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqIEBjb3B5cmlnaHQgIDIwMTMgTWljaGFlbCBBdWZyZWl0ZXIgKERldmVsb3BtZW50IFNlZWQpIGFuZCAyMDE2IFlhaG9vIEluYy5cbiAqIEBsaWNlbnNlICAgIExpY2Vuc2VkIHVuZGVyIHtAbGluayBodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZS1DbGVhci5odG1sIEJTRC0zLUNsYXVzZS1DbGVhcn0uXG4gKiAgICAgICAgICAgICBHaXRodWIuanMgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUuXG4gKi9cblxuaW1wb3J0IFJlcXVlc3RhYmxlIGZyb20gJy4vUmVxdWVzdGFibGUnO1xuXG4vKipcbiAqIFJhdGVMaW1pdCBhbGxvd3MgdXNlcnMgdG8gcXVlcnkgdGhlaXIgcmF0ZS1saW1pdCBzdGF0dXNcbiAqL1xuY2xhc3MgTWFya2Rvd24gZXh0ZW5kcyBSZXF1ZXN0YWJsZSB7XG4gICAvKipcbiAgICAqIGNvbnN0cnVjdCBhIFJhdGVMaW1pdFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5hdXRofSBhdXRoIC0gdGhlIGNyZWRlbnRpYWxzIHRvIGF1dGhlbnRpY2F0ZSB0byBHaXRIdWJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYXBpQmFzZV0gLSB0aGUgYmFzZSBHaXRodWIgQVBJIFVSTFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBjb25zdHJ1Y3RvcihhdXRoLCBhcGlCYXNlKSB7XG4gICAgICBzdXBlcihhdXRoLCBhcGlCYXNlKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBSZW5kZXIgaHRtbCBmcm9tIE1hcmtkb3duIHRleHQuXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvbWFya2Rvd24vI3JlbmRlci1hbi1hcmJpdHJhcnktbWFya2Rvd24tZG9jdW1lbnRcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gY29udmVyc2lvbiBvcHRpb25zXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGV4dF0gLSB0aGUgbWFya2Rvd24gdGV4dCB0byBjb252ZXJ0XG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubW9kZT1tYXJrZG93bl0gLSBjYW4gYmUgZWl0aGVyIGBtYXJrZG93bmAgb3IgYGdmbWBcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb250ZXh0XSAtIHJlcG9zaXRvcnkgbmFtZSBpZiBtb2RlIGlzIGdmbVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgY29udmVydGVkIGh0bWxcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgcmVuZGVyKG9wdGlvbnMsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsICcvbWFya2Rvd24nLCBvcHRpb25zLCBjYik7XG4gICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTWFya2Rvd247XG4iXX0= +//# sourceMappingURL=Markdown.js.map diff --git a/dist/components/Markdown.js.map b/dist/components/Markdown.js.map new file mode 100644 index 00000000..c02dc0eb --- /dev/null +++ b/dist/components/Markdown.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["Markdown.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\n\n/**\n * RateLimit allows users to query their rate-limit status\n */\nclass Markdown extends Requestable {\n /**\n * construct a RateLimit\n * @param {Requestable.auth} auth - the credentials to authenticate to GitHub\n * @param {string} [apiBase] - the base Github API URL\n * @return {Promise} - the promise for the http request\n */\n constructor(auth, apiBase) {\n super(auth, apiBase);\n }\n\n /**\n * Render html from Markdown text.\n * @see https://developer.github.com/v3/markdown/#render-an-arbitrary-markdown-document\n * @param {Object} options - conversion options\n * @param {string} [options.text] - the markdown text to convert\n * @param {string} [options.mode=markdown] - can be either `markdown` or `gfm`\n * @param {string} [options.context] - repository name if mode is gfm\n * @param {Requestable.callback} [cb] - will receive the converted html\n * @return {Promise} - the promise for the http request\n */\n render(options, cb) {\n return this._request('POST', '/markdown', options, cb);\n }\n}\n\nmodule.exports = Markdown;\n"],"file":"Markdown.js"} \ No newline at end of file diff --git a/dist/components/Organization.js b/dist/components/Organization.js new file mode 100644 index 00000000..e5a05429 --- /dev/null +++ b/dist/components/Organization.js @@ -0,0 +1,139 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable); + global.Organization = mod.exports; + } +})(this, function (module, _Requestable2) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var Organization = function (_Requestable) { + _inherits(Organization, _Requestable); + + /** + * Create a new Organization + * @param {string} organization - the name of the organization + * @param {Requestable.auth} [auth] - information required to authenticate to Github + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function Organization(organization, auth, apiBase) { + _classCallCheck(this, Organization); + + var _this = _possibleConstructorReturn(this, (Organization.__proto__ || Object.getPrototypeOf(Organization)).call(this, auth, apiBase)); + + _this.__name = organization; + return _this; + } + + /** + * Create a repository in an organization + * @see https://developer.github.com/v3/repos/#create + * @param {Object} options - the repository definition + * @param {Requestable.callback} [cb] - will receive the created repository + * @return {Promise} - the promise for the http request + */ + + + _createClass(Organization, [{ + key: 'createRepo', + value: function createRepo(options, cb) { + return this._request('POST', '/orgs/' + this.__name + '/repos', options, cb); + } + }, { + key: 'getRepos', + value: function getRepos(cb) { + var requestOptions = this._getOptionsWithDefaults({ direction: 'desc' }); + + return this._requestAllPages('/orgs/' + this.__name + '/repos', requestOptions, cb); + } + }, { + key: 'isMember', + value: function isMember(username, cb) { + return this._request204or404('/orgs/' + this.__name + '/members/' + username, null, cb); + } + }, { + key: 'listMembers', + value: function listMembers(options, cb) { + return this._request('GET', '/orgs/' + this.__name + '/members', options, cb); + } + }, { + key: 'getTeams', + value: function getTeams(cb) { + return this._requestAllPages('/orgs/' + this.__name + '/teams', undefined, cb); + } + }, { + key: 'createTeam', + value: function createTeam(options, cb) { + return this._request('POST', '/orgs/' + this.__name + '/teams', options, cb); + } + }]); + + return Organization; + }(_Requestable3.default); + + module.exports = Organization; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIk9yZ2FuaXphdGlvbi5qcyJdLCJuYW1lcyI6WyJPcmdhbml6YXRpb24iLCJvcmdhbml6YXRpb24iLCJhdXRoIiwiYXBpQmFzZSIsIl9fbmFtZSIsIm9wdGlvbnMiLCJjYiIsIl9yZXF1ZXN0IiwicmVxdWVzdE9wdGlvbnMiLCJfZ2V0T3B0aW9uc1dpdGhEZWZhdWx0cyIsImRpcmVjdGlvbiIsIl9yZXF1ZXN0QWxsUGFnZXMiLCJ1c2VybmFtZSIsIl9yZXF1ZXN0MjA0b3I0MDQiLCJ1bmRlZmluZWQiLCJSZXF1ZXN0YWJsZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BWU1BLFk7OztBQUNIOzs7Ozs7QUFNQSwwQkFBWUMsWUFBWixFQUEwQkMsSUFBMUIsRUFBZ0NDLE9BQWhDLEVBQXlDO0FBQUE7O0FBQUEsOEhBQ2hDRCxJQURnQyxFQUMxQkMsT0FEMEI7O0FBRXRDLFlBQUtDLE1BQUwsR0FBY0gsWUFBZDtBQUZzQztBQUd4Qzs7QUFFRDs7Ozs7Ozs7Ozs7aUNBT1dJLE8sRUFBU0MsRSxFQUFJO0FBQ3JCLGVBQU8sS0FBS0MsUUFBTCxDQUFjLE1BQWQsYUFBK0IsS0FBS0gsTUFBcEMsYUFBb0RDLE9BQXBELEVBQTZEQyxFQUE3RCxDQUFQO0FBQ0Y7OzsrQkFRUUEsRSxFQUFJO0FBQ1YsWUFBSUUsaUJBQWlCLEtBQUtDLHVCQUFMLENBQTZCLEVBQUNDLFdBQVcsTUFBWixFQUE3QixDQUFyQjs7QUFFQSxlQUFPLEtBQUtDLGdCQUFMLFlBQStCLEtBQUtQLE1BQXBDLGFBQW9ESSxjQUFwRCxFQUFvRUYsRUFBcEUsQ0FBUDtBQUNGOzs7K0JBUVFNLFEsRUFBVU4sRSxFQUFJO0FBQ3BCLGVBQU8sS0FBS08sZ0JBQUwsWUFBK0IsS0FBS1QsTUFBcEMsaUJBQXNEUSxRQUF0RCxFQUFrRSxJQUFsRSxFQUF3RU4sRUFBeEUsQ0FBUDtBQUNGOzs7a0NBV1dELE8sRUFBU0MsRSxFQUFJO0FBQ3RCLGVBQU8sS0FBS0MsUUFBTCxDQUFjLEtBQWQsYUFBOEIsS0FBS0gsTUFBbkMsZUFBcURDLE9BQXJELEVBQThEQyxFQUE5RCxDQUFQO0FBQ0Y7OzsrQkFRUUEsRSxFQUFJO0FBQ1YsZUFBTyxLQUFLSyxnQkFBTCxZQUErQixLQUFLUCxNQUFwQyxhQUFvRFUsU0FBcEQsRUFBK0RSLEVBQS9ELENBQVA7QUFDRjs7O2lDQWNVRCxPLEVBQVNDLEUsRUFBSTtBQUNyQixlQUFPLEtBQUtDLFFBQUwsQ0FBYyxNQUFkLGFBQStCLEtBQUtILE1BQXBDLGFBQW9EQyxPQUFwRCxFQUE2REMsRUFBN0QsQ0FBUDtBQUNGOzs7O0lBbEZ1QlMscUI7O0FBcUYzQkMsU0FBT0MsT0FBUCxHQUFpQmpCLFlBQWpCIiwiZmlsZSI6Ik9yZ2FuaXphdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqIEBjb3B5cmlnaHQgIDIwMTMgTWljaGFlbCBBdWZyZWl0ZXIgKERldmVsb3BtZW50IFNlZWQpIGFuZCAyMDE2IFlhaG9vIEluYy5cbiAqIEBsaWNlbnNlICAgIExpY2Vuc2VkIHVuZGVyIHtAbGluayBodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZS1DbGVhci5odG1sIEJTRC0zLUNsYXVzZS1DbGVhcn0uXG4gKiAgICAgICAgICAgICBHaXRodWIuanMgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUuXG4gKi9cblxuaW1wb3J0IFJlcXVlc3RhYmxlIGZyb20gJy4vUmVxdWVzdGFibGUnO1xuXG4vKipcbiAqIE9yZ2FuaXphdGlvbiBlbmNhcHN1bGF0ZXMgdGhlIGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIHJlcG9zaXRvcmllcyBpbiBvcmdhbml6YXRpb25zXG4gKi9cbmNsYXNzIE9yZ2FuaXphdGlvbiBleHRlbmRzIFJlcXVlc3RhYmxlIHtcbiAgIC8qKlxuICAgICogQ3JlYXRlIGEgbmV3IE9yZ2FuaXphdGlvblxuICAgICogQHBhcmFtIHtzdHJpbmd9IG9yZ2FuaXphdGlvbiAtIHRoZSBuYW1lIG9mIHRoZSBvcmdhbml6YXRpb25cbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuYXV0aH0gW2F1dGhdIC0gaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gYXV0aGVudGljYXRlIHRvIEdpdGh1YlxuICAgICogQHBhcmFtIHtzdHJpbmd9IFthcGlCYXNlPWh0dHBzOi8vYXBpLmdpdGh1Yi5jb21dIC0gdGhlIGJhc2UgR2l0aHViIEFQSSBVUkxcbiAgICAqL1xuICAgY29uc3RydWN0b3Iob3JnYW5pemF0aW9uLCBhdXRoLCBhcGlCYXNlKSB7XG4gICAgICBzdXBlcihhdXRoLCBhcGlCYXNlKTtcbiAgICAgIHRoaXMuX19uYW1lID0gb3JnYW5pemF0aW9uO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZSBhIHJlcG9zaXRvcnkgaW4gYW4gb3JnYW5pemF0aW9uXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvI2NyZWF0ZVxuICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB0aGUgcmVwb3NpdG9yeSBkZWZpbml0aW9uXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBjcmVhdGVkIHJlcG9zaXRvcnlcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgY3JlYXRlUmVwbyhvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BPU1QnLCBgL29yZ3MvJHt0aGlzLl9fbmFtZX0vcmVwb3NgLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgcmVwb3NpdG9yaWVzIGluIGFuIG9yZ2FuaXphdGlvblxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zLyNsaXN0LW9yZ2FuaXphdGlvbi1yZXBvc2l0b3JpZXNcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGxpc3Qgb2YgcmVwb3NpdG9yaWVzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldFJlcG9zKGNiKSB7XG4gICAgICBsZXQgcmVxdWVzdE9wdGlvbnMgPSB0aGlzLl9nZXRPcHRpb25zV2l0aERlZmF1bHRzKHtkaXJlY3Rpb246ICdkZXNjJ30pO1xuXG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdEFsbFBhZ2VzKGAvb3Jncy8ke3RoaXMuX19uYW1lfS9yZXBvc2AsIHJlcXVlc3RPcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogUXVlcnkgaWYgdGhlIHVzZXIgaXMgYSBtZW1iZXIgb3Igbm90XG4gICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgLSB0aGUgdXNlciBpbiBxdWVzdGlvblxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0cnVlIGlmIHRoZSB1c2VyIGlzIGEgbWVtYmVyXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGlzTWVtYmVyKHVzZXJuYW1lLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QyMDRvcjQwNChgL29yZ3MvJHt0aGlzLl9fbmFtZX0vbWVtYmVycy8ke3VzZXJuYW1lfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBMaXN0IHRoZSB1c2VycyB3aG8gYXJlIG1lbWJlcnMgb2YgdGhlIGNvbXBhbnlcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9vcmdzL21lbWJlcnMvI21lbWJlcnMtbGlzdFxuICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBmaWx0ZXJpbmcgb3B0aW9uc1xuICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmZpbHRlcj1hbGxdIC0gY2FuIGJlIGVpdGhlciBgMmZhX2Rpc2FibGVkYCBvciBgYWxsYFxuICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnJvbGU9YWxsXSAtIGNhbiBiZSBvbmUgb2Y6IGBhbGxgLCBgYWRtaW5gLCBvciBgbWVtYmVyYFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiB1c2Vyc1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBsaXN0TWVtYmVycyhvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvb3Jncy8ke3RoaXMuX19uYW1lfS9tZW1iZXJzYCwgb3B0aW9ucywgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgdGhlIFRlYW1zIGluIHRoZSBPcmdhbml6YXRpb25cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9vcmdzL3RlYW1zLyNsaXN0LXRlYW1zXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBsaXN0IG9mIHRlYW1zXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldFRlYW1zKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdEFsbFBhZ2VzKGAvb3Jncy8ke3RoaXMuX19uYW1lfS90ZWFtc2AsIHVuZGVmaW5lZCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZSBhIHRlYW1cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9vcmdzL3RlYW1zLyNjcmVhdGUtdGVhbVxuICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBUZWFtIGNyZWF0aW9uIHBhcmFtZXRlcnNcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGVhbVxuICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRlc2NyaXB0aW9uXSAtIFRlYW0gZGVzY3JpcHRpb25cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5yZXBvX25hbWVzXSAtIFJlcG9zIHRvIGFkZCB0aGUgdGVhbSB0b1xuICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnByaXZhY3k9c2VjcmV0XSAtIFRoZSBsZXZlbCBvZiBwcml2YWN5IHRoZSB0ZWFtIHNob3VsZCBoYXZlLiBDYW4gYmUgZWl0aGVyIG9uZVxuICAgICogb2Y6IGBzZWNyZXRgLCBvciBgY2xvc2VkYFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgY3JlYXRlZCB0ZWFtXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGNyZWF0ZVRlYW0ob3B0aW9ucywgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQT1NUJywgYC9vcmdzLyR7dGhpcy5fX25hbWV9L3RlYW1zYCwgb3B0aW9ucywgY2IpO1xuICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IE9yZ2FuaXphdGlvbjtcbiJdfQ== +//# sourceMappingURL=Organization.js.map diff --git a/dist/components/Organization.js.map b/dist/components/Organization.js.map new file mode 100644 index 00000000..c7a02304 --- /dev/null +++ b/dist/components/Organization.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["Organization.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\n\n/**\n * Organization encapsulates the functionality to create repositories in organizations\n */\nclass Organization extends Requestable {\n /**\n * Create a new Organization\n * @param {string} organization - the name of the organization\n * @param {Requestable.auth} [auth] - information required to authenticate to Github\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(organization, auth, apiBase) {\n super(auth, apiBase);\n this.__name = organization;\n }\n\n /**\n * Create a repository in an organization\n * @see https://developer.github.com/v3/repos/#create\n * @param {Object} options - the repository definition\n * @param {Requestable.callback} [cb] - will receive the created repository\n * @return {Promise} - the promise for the http request\n */\n createRepo(options, cb) {\n return this._request('POST', `/orgs/${this.__name}/repos`, options, cb);\n }\n\n /**\n * List the repositories in an organization\n * @see https://developer.github.com/v3/repos/#list-organization-repositories\n * @param {Requestable.callback} [cb] - will receive the list of repositories\n * @return {Promise} - the promise for the http request\n */\n getRepos(cb) {\n let requestOptions = this._getOptionsWithDefaults({direction: 'desc'});\n\n return this._requestAllPages(`/orgs/${this.__name}/repos`, requestOptions, cb);\n }\n\n /**\n * Query if the user is a member or not\n * @param {string} username - the user in question\n * @param {Requestable.callback} [cb] - will receive true if the user is a member\n * @return {Promise} - the promise for the http request\n */\n isMember(username, cb) {\n return this._request204or404(`/orgs/${this.__name}/members/${username}`, null, cb);\n }\n\n /**\n * List the users who are members of the company\n * @see https://developer.github.com/v3/orgs/members/#members-list\n * @param {object} options - filtering options\n * @param {string} [options.filter=all] - can be either `2fa_disabled` or `all`\n * @param {string} [options.role=all] - can be one of: `all`, `admin`, or `member`\n * @param {Requestable.callback} [cb] - will receive the list of users\n * @return {Promise} - the promise for the http request\n */\n listMembers(options, cb) {\n return this._request('GET', `/orgs/${this.__name}/members`, options, cb);\n }\n\n /**\n * List the Teams in the Organization\n * @see https://developer.github.com/v3/orgs/teams/#list-teams\n * @param {Requestable.callback} [cb] - will receive the list of teams\n * @return {Promise} - the promise for the http request\n */\n getTeams(cb) {\n return this._requestAllPages(`/orgs/${this.__name}/teams`, undefined, cb);\n }\n\n /**\n * Create a team\n * @see https://developer.github.com/v3/orgs/teams/#create-team\n * @param {object} options - Team creation parameters\n * @param {string} options.name - The name of the team\n * @param {string} [options.description] - Team description\n * @param {string} [options.repo_names] - Repos to add the team to\n * @param {string} [options.privacy=secret] - The level of privacy the team should have. Can be either one\n * of: `secret`, or `closed`\n * @param {Requestable.callback} [cb] - will receive the created team\n * @return {Promise} - the promise for the http request\n */\n createTeam(options, cb) {\n return this._request('POST', `/orgs/${this.__name}/teams`, options, cb);\n }\n}\n\nmodule.exports = Organization;\n"],"file":"Organization.js"} \ No newline at end of file diff --git a/dist/components/RateLimit.js b/dist/components/RateLimit.js new file mode 100644 index 00000000..b53c6813 --- /dev/null +++ b/dist/components/RateLimit.js @@ -0,0 +1,108 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable); + global.RateLimit = mod.exports; + } +})(this, function (module, _Requestable2) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var RateLimit = function (_Requestable) { + _inherits(RateLimit, _Requestable); + + /** + * construct a RateLimit + * @param {Requestable.auth} auth - the credentials to authenticate to GitHub + * @param {string} [apiBase] - the base Github API URL + * @return {Promise} - the promise for the http request + */ + function RateLimit(auth, apiBase) { + _classCallCheck(this, RateLimit); + + return _possibleConstructorReturn(this, (RateLimit.__proto__ || Object.getPrototypeOf(RateLimit)).call(this, auth, apiBase)); + } + + /** + * Query the current rate limit + * @see https://developer.github.com/v3/rate_limit/ + * @param {Requestable.callback} [cb] - will receive the rate-limit data + * @return {Promise} - the promise for the http request + */ + + + _createClass(RateLimit, [{ + key: 'getRateLimit', + value: function getRateLimit(cb) { + return this._request('GET', '/rate_limit', null, cb); + } + }]); + + return RateLimit; + }(_Requestable3.default); + + module.exports = RateLimit; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJhdGVMaW1pdC5qcyJdLCJuYW1lcyI6WyJSYXRlTGltaXQiLCJhdXRoIiwiYXBpQmFzZSIsImNiIiwiX3JlcXVlc3QiLCJSZXF1ZXN0YWJsZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BWU1BLFM7OztBQUNIOzs7Ozs7QUFNQSx1QkFBWUMsSUFBWixFQUFrQkMsT0FBbEIsRUFBMkI7QUFBQTs7QUFBQSxtSEFDbEJELElBRGtCLEVBQ1pDLE9BRFk7QUFFMUI7O0FBRUQ7Ozs7Ozs7Ozs7bUNBTWFDLEUsRUFBSTtBQUNkLGVBQU8sS0FBS0MsUUFBTCxDQUFjLEtBQWQsRUFBcUIsYUFBckIsRUFBb0MsSUFBcEMsRUFBMENELEVBQTFDLENBQVA7QUFDRjs7OztJQW5Cb0JFLHFCOztBQXNCeEJDLFNBQU9DLE9BQVAsR0FBaUJQLFNBQWpCIiwiZmlsZSI6IlJhdGVMaW1pdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqIEBjb3B5cmlnaHQgIDIwMTMgTWljaGFlbCBBdWZyZWl0ZXIgKERldmVsb3BtZW50IFNlZWQpIGFuZCAyMDE2IFlhaG9vIEluYy5cbiAqIEBsaWNlbnNlICAgIExpY2Vuc2VkIHVuZGVyIHtAbGluayBodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZS1DbGVhci5odG1sIEJTRC0zLUNsYXVzZS1DbGVhcn0uXG4gKiAgICAgICAgICAgICBHaXRodWIuanMgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUuXG4gKi9cblxuaW1wb3J0IFJlcXVlc3RhYmxlIGZyb20gJy4vUmVxdWVzdGFibGUnO1xuXG4vKipcbiAqIFJhdGVMaW1pdCBhbGxvd3MgdXNlcnMgdG8gcXVlcnkgdGhlaXIgcmF0ZS1saW1pdCBzdGF0dXNcbiAqL1xuY2xhc3MgUmF0ZUxpbWl0IGV4dGVuZHMgUmVxdWVzdGFibGUge1xuICAgLyoqXG4gICAgKiBjb25zdHJ1Y3QgYSBSYXRlTGltaXRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuYXV0aH0gYXV0aCAtIHRoZSBjcmVkZW50aWFscyB0byBhdXRoZW50aWNhdGUgdG8gR2l0SHViXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW2FwaUJhc2VdIC0gdGhlIGJhc2UgR2l0aHViIEFQSSBVUkxcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgY29uc3RydWN0b3IoYXV0aCwgYXBpQmFzZSkge1xuICAgICAgc3VwZXIoYXV0aCwgYXBpQmFzZSk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogUXVlcnkgdGhlIGN1cnJlbnQgcmF0ZSBsaW1pdFxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JhdGVfbGltaXQvXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSByYXRlLWxpbWl0IGRhdGFcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0UmF0ZUxpbWl0KGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR0VUJywgJy9yYXRlX2xpbWl0JywgbnVsbCwgY2IpO1xuICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhdGVMaW1pdDtcbiJdfQ== +//# sourceMappingURL=RateLimit.js.map diff --git a/dist/components/RateLimit.js.map b/dist/components/RateLimit.js.map new file mode 100644 index 00000000..8ae70e98 --- /dev/null +++ b/dist/components/RateLimit.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["RateLimit.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\n\n/**\n * RateLimit allows users to query their rate-limit status\n */\nclass RateLimit extends Requestable {\n /**\n * construct a RateLimit\n * @param {Requestable.auth} auth - the credentials to authenticate to GitHub\n * @param {string} [apiBase] - the base Github API URL\n * @return {Promise} - the promise for the http request\n */\n constructor(auth, apiBase) {\n super(auth, apiBase);\n }\n\n /**\n * Query the current rate limit\n * @see https://developer.github.com/v3/rate_limit/\n * @param {Requestable.callback} [cb] - will receive the rate-limit data\n * @return {Promise} - the promise for the http request\n */\n getRateLimit(cb) {\n return this._request('GET', '/rate_limit', null, cb);\n }\n}\n\nmodule.exports = RateLimit;\n"],"file":"RateLimit.js"} \ No newline at end of file diff --git a/dist/components/Repository.js b/dist/components/Repository.js new file mode 100644 index 00000000..81b69d9c --- /dev/null +++ b/dist/components/Repository.js @@ -0,0 +1,524 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable', 'utf8', 'js-base64', 'debug'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable'), require('utf8'), require('js-base64'), require('debug')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable, global.utf8, global.jsBase64, global.debug); + global.Repository = mod.exports; + } +})(this, function (module, _Requestable2, _utf, _jsBase, _debug) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + var _utf2 = _interopRequireDefault(_utf); + + var _debug2 = _interopRequireDefault(_debug); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var log = (0, _debug2.default)('github:repository'); + + /** + * Respository encapsulates the functionality to create, query, and modify files. + */ + + var Repository = function (_Requestable) { + _inherits(Repository, _Requestable); + + /** + * Create a Repository. + * @param {string} fullname - the full name of the repository + * @param {Requestable.auth} [auth] - information required to authenticate to Github + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function Repository(fullname, auth, apiBase) { + _classCallCheck(this, Repository); + + var _this = _possibleConstructorReturn(this, (Repository.__proto__ || Object.getPrototypeOf(Repository)).call(this, auth, apiBase)); + + _this.__fullname = fullname; + _this.__currentTree = { + branch: null, + sha: null + }; + return _this; + } + + /** + * Get a reference + * @see https://developer.github.com/v3/git/refs/#get-a-reference + * @param {string} ref - the reference to get + * @param {Requestable.callback} [cb] - will receive the reference's refSpec or a list of refSpecs that match `ref` + * @return {Promise} - the promise for the http request + */ + + + _createClass(Repository, [{ + key: 'getRef', + value: function getRef(ref, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/git/refs/' + ref, null, cb); + } + }, { + key: 'createRef', + value: function createRef(options, cb) { + return this._request('POST', '/repos/' + this.__fullname + '/git/refs', options, cb); + } + }, { + key: 'deleteRef', + value: function deleteRef(ref, cb) { + return this._request('DELETE', '/repos/' + this.__fullname + '/git/refs/' + ref, null, cb); + } + }, { + key: 'deleteRepo', + value: function deleteRepo(cb) { + return this._request('DELETE', '/repos/' + this.__fullname, null, cb); + } + }, { + key: 'listTags', + value: function listTags(cb) { + return this._request('GET', '/repos/' + this.__fullname + '/tags', null, cb); + } + }, { + key: 'listPullRequests', + value: function listPullRequests(options, cb) { + options = options || {}; + return this._request('GET', '/repos/' + this.__fullname + '/pulls', options, cb); + } + }, { + key: 'getPullRequest', + value: function getPullRequest(number, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/pulls/' + number, null, cb); + } + }, { + key: 'listPullRequestFiles', + value: function listPullRequestFiles(number, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/pulls/' + number + '/files', null, cb); + } + }, { + key: 'compareBranches', + value: function compareBranches(base, head, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/compare/' + base + '...' + head, null, cb); + } + }, { + key: 'listBranches', + value: function listBranches(cb) { + return this._request('GET', '/repos/' + this.__fullname + '/branches', null, cb); + } + }, { + key: 'listAllBranches', + value: function listAllBranches() { + return this._requestAllPages('/repos/' + this.__fullname + '/branches', null); + } + }, { + key: 'getBlob', + value: function getBlob(sha, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/git/blobs/' + sha, null, cb, 'raw'); + } + }, { + key: 'getCommit', + value: function getCommit(sha, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/git/commits/' + sha, null, cb); + } + }, { + key: 'listCommits', + value: function listCommits(options, cb) { + options = options || {}; + + options.since = this._dateToISO(options.since); + options.until = this._dateToISO(options.until); + + return this._request('GET', '/repos/' + this.__fullname + '/commits', options, cb); + } + }, { + key: 'getSingleCommit', + value: function getSingleCommit(ref, cb) { + ref = ref || ''; + return this._request('GET', '/repos/' + this.__fullname + '/commits/' + ref, null, cb); + } + }, { + key: 'getSha', + value: function getSha(branch, path, cb) { + branch = branch ? '?ref=' + branch : ''; + return this._request('GET', '/repos/' + this.__fullname + '/contents/' + path + branch, null, cb); + } + }, { + key: 'listStatuses', + value: function listStatuses(sha, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/commits/' + sha + '/statuses', null, cb); + } + }, { + key: 'getTree', + value: function getTree(treeSHA, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/git/trees/' + treeSHA, null, cb); + } + }, { + key: 'createBlob', + value: function createBlob(content, cb) { + var postBody = this._getContentObject(content); + + log('sending content', postBody); + return this._request('POST', '/repos/' + this.__fullname + '/git/blobs', postBody, cb); + } + }, { + key: '_getContentObject', + value: function _getContentObject(content) { + if (typeof content === 'string') { + log('contet is a string'); + return { + content: _utf2.default.encode(content), + encoding: 'utf-8' + }; + } else if (typeof Buffer !== 'undefined' && content instanceof Buffer) { + log('We appear to be in Node'); + return { + content: content.toString('base64'), + encoding: 'base64' + }; + } else if (typeof Blob !== 'undefined' && content instanceof Blob) { + log('We appear to be in the browser'); + return { + content: _jsBase.Base64.encode(content), + encoding: 'base64' + }; + } else { + // eslint-disable-line + log('Not sure what this content is: ' + (typeof content === 'undefined' ? 'undefined' : _typeof(content)) + ', ' + JSON.stringify(content)); + throw new Error('Unknown content passed to postBlob. Must be string or Buffer (node) or Blob (web)'); + } + } + }, { + key: 'updateTree', + value: function updateTree(baseTreeSHA, path, blobSHA, cb) { + var newTree = { + base_tree: baseTreeSHA, // eslint-disable-line + tree: [{ + path: path, + sha: blobSHA, + mode: '100644', + type: 'blob' + }] + }; + + return this._request('POST', '/repos/' + this.__fullname + '/git/trees', newTree, cb); + } + }, { + key: 'createTree', + value: function createTree(tree, baseSHA, cb) { + return this._request('POST', '/repos/' + this.__fullname + '/git/trees', { + tree: tree, + base_tree: baseSHA // eslint-disable-line + }, cb); + } + }, { + key: 'commit', + value: function commit(parent, tree, message, cb) { + var _this2 = this; + + var data = { + message: message, + tree: tree, + parents: [parent] + }; + + return this._request('POST', '/repos/' + this.__fullname + '/git/commits', data, cb).then(function (response) { + _this2.__currentTree.sha = response.data.sha; // Update latest commit + return response; + }); + } + }, { + key: 'updateHead', + value: function updateHead(ref, commitSHA, force, cb) { + return this._request('PATCH', '/repos/' + this.__fullname + '/git/refs/' + ref, { + sha: commitSHA, + force: force + }, cb); + } + }, { + key: 'getDetails', + value: function getDetails(cb) { + return this._request('GET', '/repos/' + this.__fullname, null, cb); + } + }, { + key: 'getContributors', + value: function getContributors(cb) { + return this._request('GET', '/repos/' + this.__fullname + '/stats/contributors', null, cb); + } + }, { + key: 'getCollaborators', + value: function getCollaborators(cb) { + return this._request('GET', '/repos/' + this.__fullname + '/collaborators', null, cb); + } + }, { + key: 'isCollaborator', + value: function isCollaborator(username, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/collaborators/' + username, null, cb); + } + }, { + key: 'getContents', + value: function getContents(ref, path, raw, cb) { + path = path ? '' + encodeURI(path) : ''; + return this._request('GET', '/repos/' + this.__fullname + '/contents/' + path, { + ref: ref + }, cb, raw); + } + }, { + key: 'getReadme', + value: function getReadme(ref, raw, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/readme', { + ref: ref + }, cb, raw); + } + }, { + key: 'fork', + value: function fork(cb) { + return this._request('POST', '/repos/' + this.__fullname + '/forks', null, cb); + } + }, { + key: 'listForks', + value: function listForks(cb) { + return this._request('GET', '/repos/' + this.__fullname + '/forks', null, cb); + } + }, { + key: 'createBranch', + value: function createBranch(oldBranch, newBranch, cb) { + var _this3 = this; + + if (typeof newBranch === 'function') { + cb = newBranch; + newBranch = oldBranch; + oldBranch = 'master'; + } + + return this.getRef('heads/' + oldBranch).then(function (response) { + var sha = response.data.object.sha; + return _this3.createRef({ + sha: sha, + ref: 'refs/heads/' + newBranch + }, cb); + }); + } + }, { + key: 'createPullRequest', + value: function createPullRequest(options, cb) { + return this._request('POST', '/repos/' + this.__fullname + '/pulls', options, cb); + } + }, { + key: 'updatePullRequst', + value: function updatePullRequst(number, options, cb) { + return this._request('PATCH', '/repos/' + this.__fullname + '/pulls/' + number, options, cb); + } + }, { + key: 'listHooks', + value: function listHooks(cb) { + return this._request('GET', '/repos/' + this.__fullname + '/hooks', null, cb); + } + }, { + key: 'getHook', + value: function getHook(id, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/hooks/' + id, null, cb); + } + }, { + key: 'createHook', + value: function createHook(options, cb) { + return this._request('POST', '/repos/' + this.__fullname + '/hooks', options, cb); + } + }, { + key: 'updateHook', + value: function updateHook(id, options, cb) { + return this._request('PATCH', '/repos/' + this.__fullname + '/hooks/' + id, options, cb); + } + }, { + key: 'deleteHook', + value: function deleteHook(id, cb) { + return this._request('DELETE', this.__repoPath + '/hooks/' + id, null, cb); + } + }, { + key: 'deleteFile', + value: function deleteFile(branch, path, cb) { + var _this4 = this; + + return this.getSha(branch, path).then(function (response) { + var deleteCommit = { + message: 'Delete the file at \'' + path + '\'', + sha: response.data.sha, + branch: branch + }; + return _this4._request('DELETE', '/repos/' + _this4.__fullname + '/contents/' + path, deleteCommit, cb); + }); + } + }, { + key: 'move', + value: function move(branch, oldPath, newPath, cb) { + var _this5 = this; + + var oldSha = void 0; + return this.getRef('heads/' + branch).then(function (_ref) { + var object = _ref.data.object; + return _this5.getTree(object.sha + '?recursive=true'); + }).then(function (_ref2) { + var _ref2$data = _ref2.data, + tree = _ref2$data.tree, + sha = _ref2$data.sha; + + oldSha = sha; + var newTree = tree.map(function (ref) { + if (ref.path === oldPath) { + ref.path = newPath; + } + if (ref.type === 'tree') { + delete ref.sha; + } + return ref; + }); + return _this5.createTree(newTree); + }).then(function (_ref3) { + var tree = _ref3.data; + return _this5.commit(oldSha, tree.sha, 'Renamed \'' + oldPath + '\' to \'' + newPath + '\''); + }).then(function (_ref4) { + var commit = _ref4.data; + return _this5.updateHead('heads/' + branch, commit.sha, true, cb); + }); + } + }, { + key: 'writeFile', + value: function writeFile(branch, path, content, message, options, cb) { + var _this6 = this; + + if (typeof options === 'function') { + cb = options; + options = {}; + } + var filePath = path ? encodeURI(path) : ''; + var shouldEncode = options.encode !== false; + var commit = { + branch: branch, + message: message, + author: options.author, + committer: options.committer, + content: shouldEncode ? _jsBase.Base64.encode(content) : content + }; + + return this.getSha(branch, filePath).then(function (response) { + commit.sha = response.data.sha; + return _this6._request('PUT', '/repos/' + _this6.__fullname + '/contents/' + filePath, commit, cb); + }, function () { + return _this6._request('PUT', '/repos/' + _this6.__fullname + '/contents/' + filePath, commit, cb); + }); + } + }, { + key: 'isStarred', + value: function isStarred(cb) { + return this._request204or404('/user/starred/' + this.__fullname, null, cb); + } + }, { + key: 'star', + value: function star(cb) { + return this._request('PUT', '/user/starred/' + this.__fullname, null, cb); + } + }, { + key: 'unstar', + value: function unstar(cb) { + return this._request('DELETE', '/user/starred/' + this.__fullname, null, cb); + } + }, { + key: 'createRelease', + value: function createRelease(options, cb) { + return this._request('POST', '/repos/' + this.__fullname + '/releases', options, cb); + } + }, { + key: 'updateRelease', + value: function updateRelease(id, options, cb) { + return this._request('PATCH', '/repos/' + this.__fullname + '/releases/' + id, options, cb); + } + }, { + key: 'listReleases', + value: function listReleases(cb) { + return this._request('GET', '/repos/' + this.__fullname + '/releases', null, cb); + } + }, { + key: 'getRelease', + value: function getRelease(id, cb) { + return this._request('GET', '/repos/' + this.__fullname + '/releases/' + id, null, cb); + } + }, { + key: 'deleteRelease', + value: function deleteRelease(id, cb) { + return this._request('DELETE', '/repos/' + this.__fullname + '/releases/' + id, null, cb); + } + }, { + key: 'mergePullRequest', + value: function mergePullRequest(number, options, cb) { + return this._request('PUT', '/repos/' + this.__fullname + '/pulls/' + number + '/merge', options, cb); + } + }]); + + return Repository; + }(_Requestable3.default); + + module.exports = Repository; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJlcG9zaXRvcnkuanMiXSwibmFtZXMiOlsibG9nIiwiUmVwb3NpdG9yeSIsImZ1bGxuYW1lIiwiYXV0aCIsImFwaUJhc2UiLCJfX2Z1bGxuYW1lIiwiX19jdXJyZW50VHJlZSIsImJyYW5jaCIsInNoYSIsInJlZiIsImNiIiwiX3JlcXVlc3QiLCJvcHRpb25zIiwibnVtYmVyIiwiYmFzZSIsImhlYWQiLCJfcmVxdWVzdEFsbFBhZ2VzIiwic2luY2UiLCJfZGF0ZVRvSVNPIiwidW50aWwiLCJwYXRoIiwidHJlZVNIQSIsImNvbnRlbnQiLCJwb3N0Qm9keSIsIl9nZXRDb250ZW50T2JqZWN0IiwiVXRmOCIsImVuY29kZSIsImVuY29kaW5nIiwiQnVmZmVyIiwidG9TdHJpbmciLCJCbG9iIiwiQmFzZTY0IiwiSlNPTiIsInN0cmluZ2lmeSIsIkVycm9yIiwiYmFzZVRyZWVTSEEiLCJibG9iU0hBIiwibmV3VHJlZSIsImJhc2VfdHJlZSIsInRyZWUiLCJtb2RlIiwidHlwZSIsImJhc2VTSEEiLCJwYXJlbnQiLCJtZXNzYWdlIiwiZGF0YSIsInBhcmVudHMiLCJ0aGVuIiwicmVzcG9uc2UiLCJjb21taXRTSEEiLCJmb3JjZSIsInVzZXJuYW1lIiwicmF3IiwiZW5jb2RlVVJJIiwib2xkQnJhbmNoIiwibmV3QnJhbmNoIiwiZ2V0UmVmIiwib2JqZWN0IiwiY3JlYXRlUmVmIiwiaWQiLCJfX3JlcG9QYXRoIiwiZ2V0U2hhIiwiZGVsZXRlQ29tbWl0Iiwib2xkUGF0aCIsIm5ld1BhdGgiLCJvbGRTaGEiLCJnZXRUcmVlIiwibWFwIiwiY3JlYXRlVHJlZSIsImNvbW1pdCIsInVwZGF0ZUhlYWQiLCJmaWxlUGF0aCIsInNob3VsZEVuY29kZSIsImF1dGhvciIsImNvbW1pdHRlciIsIl9yZXF1ZXN0MjA0b3I0MDQiLCJSZXF1ZXN0YWJsZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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XG4gKiBAY29weXJpZ2h0ICAyMDEzIE1pY2hhZWwgQXVmcmVpdGVyIChEZXZlbG9wbWVudCBTZWVkKSBhbmQgMjAxNiBZYWhvbyBJbmMuXG4gKiBAbGljZW5zZSAgICBMaWNlbnNlZCB1bmRlciB7QGxpbmsgaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UtQ2xlYXIuaHRtbCBCU0QtMy1DbGF1c2UtQ2xlYXJ9LlxuICogICAgICAgICAgICAgR2l0aHViLmpzIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLlxuICovXG5cbmltcG9ydCBSZXF1ZXN0YWJsZSBmcm9tICcuL1JlcXVlc3RhYmxlJztcbmltcG9ydCBVdGY4IGZyb20gJ3V0ZjgnO1xuaW1wb3J0IHtcbiAgIEJhc2U2NFxufSBmcm9tICdqcy1iYXNlNjQnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmNvbnN0IGxvZyA9IGRlYnVnKCdnaXRodWI6cmVwb3NpdG9yeScpO1xuXG4vKipcbiAqIFJlc3Bvc2l0b3J5IGVuY2Fwc3VsYXRlcyB0aGUgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUsIHF1ZXJ5LCBhbmQgbW9kaWZ5IGZpbGVzLlxuICovXG5jbGFzcyBSZXBvc2l0b3J5IGV4dGVuZHMgUmVxdWVzdGFibGUge1xuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBSZXBvc2l0b3J5LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bGxuYW1lIC0gdGhlIGZ1bGwgbmFtZSBvZiB0aGUgcmVwb3NpdG9yeVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5hdXRofSBbYXV0aF0gLSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBhdXRoZW50aWNhdGUgdG8gR2l0aHViXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW2FwaUJhc2U9aHR0cHM6Ly9hcGkuZ2l0aHViLmNvbV0gLSB0aGUgYmFzZSBHaXRodWIgQVBJIFVSTFxuICAgICovXG4gICBjb25zdHJ1Y3RvcihmdWxsbmFtZSwgYXV0aCwgYXBpQmFzZSkge1xuICAgICAgc3VwZXIoYXV0aCwgYXBpQmFzZSk7XG4gICAgICB0aGlzLl9fZnVsbG5hbWUgPSBmdWxsbmFtZTtcbiAgICAgIHRoaXMuX19jdXJyZW50VHJlZSA9IHtcbiAgICAgICAgIGJyYW5jaDogbnVsbCxcbiAgICAgICAgIHNoYTogbnVsbFxuICAgICAgfTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgYSByZWZlcmVuY2VcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXQvcmVmcy8jZ2V0LWEtcmVmZXJlbmNlXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIC0gdGhlIHJlZmVyZW5jZSB0byBnZXRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIHJlZmVyZW5jZSdzIHJlZlNwZWMgb3IgYSBsaXN0IG9mIHJlZlNwZWNzIHRoYXQgbWF0Y2ggYHJlZmBcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0UmVmKHJlZiwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9naXQvcmVmcy8ke3JlZn1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ3JlYXRlIGEgcmVmZXJlbmNlXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvZ2l0L3JlZnMvI2NyZWF0ZS1hLXJlZmVyZW5jZVxuICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB0aGUgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlZlxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgcmVmXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGNyZWF0ZVJlZihvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BPU1QnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9naXQvcmVmc2AsIG9wdGlvbnMsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBEZWxldGUgYSByZWZlcmVuY2VcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXQvcmVmcy8jZGVsZXRlLWEtcmVmZXJlbmNlXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIC0gdGhlIG5hbWUgb2YgdGhlIHJlZiB0byBkZWx0ZVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWxcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZGVsZXRlUmVmKHJlZiwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdERUxFVEUnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9naXQvcmVmcy8ke3JlZn1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRGVsZXRlIGEgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zLyNkZWxldGUtYS1yZXBvc2l0b3J5XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRydWUgaWYgdGhlIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBkZWxldGVSZXBvKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnREVMRVRFJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgdGFncyBvbiBhIHJlcG9zaXRvcnlcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy8jbGlzdC10YWdzXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSB0YWcgZGF0YVxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBsaXN0VGFncyhjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L3RhZ3NgLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgb3BlbiBwdWxsIHJlcXVlc3RzIG9uIHRoZSByZXBvc2l0b3J5XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcHVsbHMvI2xpc3QtcHVsbC1yZXF1ZXN0c1xuICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRvIGZpbHRlciB0aGUgc2VhcmNoXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSBsaXN0IG9mIFBSc1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBsaXN0UHVsbFJlcXVlc3RzKG9wdGlvbnMsIGNiKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9wdWxsc2AsIG9wdGlvbnMsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBwdWxsIHJlcXVlc3RcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9wdWxscy8jZ2V0LWEtc2luZ2xlLXB1bGwtcmVxdWVzdFxuICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciAtIHRoZSBQUiB5b3Ugd2lzaCB0byBmZXRjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgUFIgZnJvbSB0aGUgQVBJXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldFB1bGxSZXF1ZXN0KG51bWJlciwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9wdWxscy8ke251bWJlcn1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgZmlsZXMgb2YgYSBzcGVjaWZpYyBwdWxsIHJlcXVlc3RcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9wdWxscy8jbGlzdC1wdWxsLXJlcXVlc3RzLWZpbGVzXG4gICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG51bWJlciAtIHRoZSBQUiB5b3Ugd2lzaCB0byBmZXRjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiBmaWxlcyBmcm9tIHRoZSBBUElcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdFB1bGxSZXF1ZXN0RmlsZXMobnVtYmVyLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L3B1bGxzLyR7bnVtYmVyfS9maWxlc2AsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDb21wYXJlIHR3byBicmFuY2hlcy9jb21taXRzL3JlcG9zaXRvcmllc1xuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2NvbW1pdHMvI2NvbXBhcmUtdHdvLWNvbW1pdHNcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIC0gdGhlIGJhc2UgY29tbWl0XG4gICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZCAtIHRoZSBoZWFkIGNvbW1pdFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIGNvbXBhcmlzb25cbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgY29tcGFyZUJyYW5jaGVzKGJhc2UsIGhlYWQsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR0VUJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vY29tcGFyZS8ke2Jhc2V9Li4uJHtoZWFkfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBMaXN0IGFsbCB0aGUgYnJhbmNoZXMgZm9yIHRoZSByZXBvc2l0b3J5XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvI2xpc3QtYnJhbmNoZXNcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRoZSBsaXN0IG9mIGJyYW5jaGVzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGxpc3RCcmFuY2hlcyhjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2JyYW5jaGVzYCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgYWxsIHRoZSBicmFuY2hlcyBmb3IgdGhlIHJlcG9zaXRvcnkgKGFmdGVyIHBhZ2luYXRpb24pXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvI2xpc3QtYnJhbmNoZXNcbiAgICAqIEBwYXJhbSB7fVxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBsaXN0QWxsQnJhbmNoZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdEFsbFBhZ2VzKGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2JyYW5jaGVzYCwgbnVsbCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2V0IGEgcmF3IGJsb2IgZnJvbSB0aGUgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2dpdC9ibG9icy8jZ2V0LWEtYmxvYlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHNoYSAtIHRoZSBzaGEgb2YgdGhlIGJsb2IgdG8gZmV0Y2hcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRoZSBibG9iIGZyb20gdGhlIEFQSVxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBnZXRCbG9iKHNoYSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9naXQvYmxvYnMvJHtzaGF9YCwgbnVsbCwgY2IsICdyYXcnKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgYSBjb21taXQgZnJvbSB0aGUgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2NvbW1pdHMvI2dldC1hLXNpbmdsZS1jb21taXRcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaGEgLSB0aGUgc2hhIGZvciB0aGUgY29tbWl0IHRvIGZldGNoXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgY29tbWl0IGRhdGFcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0Q29tbWl0KHNoYSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9naXQvY29tbWl0cy8ke3NoYX1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgY29tbWl0cyBvbiBhIHJlcG9zaXRvcnksIG9wdGlvbmFsbHkgZmlsdGVyaW5nIGJ5IHBhdGgsIGF1dGhvciBvciB0aW1lIHJhbmdlXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvY29tbWl0cy8jbGlzdC1jb21taXRzLW9uLWEtcmVwb3NpdG9yeVxuICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIHRoZSBmaWx0ZXJpbmcgb3B0aW9ucyBmb3IgY29tbWl0c1xuICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNoYV0gLSB0aGUgU0hBIG9yIGJyYW5jaCB0byBzdGFydCBmcm9tXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGF0aF0gLSB0aGUgcGF0aCB0byBzZWFyY2ggb25cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5hdXRob3JdIC0gdGhlIGNvbW1pdCBhdXRob3JcbiAgICAqIEBwYXJhbSB7KERhdGV8c3RyaW5nKX0gW29wdGlvbnMuc2luY2VdIC0gb25seSBjb21taXRzIGFmdGVyIHRoaXMgZGF0ZSB3aWxsIGJlIHJldHVybmVkXG4gICAgKiBAcGFyYW0geyhEYXRlfHN0cmluZyl9IFtvcHRpb25zLnVudGlsXSAtIG9ubHkgY29tbWl0cyBiZWZvcmUgdGhpcyBkYXRlIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRoZSBsaXN0IG9mIGNvbW1pdHMgZm91bmQgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGxpc3RDb21taXRzKG9wdGlvbnMsIGNiKSB7XG4gICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgb3B0aW9ucy5zaW5jZSA9IHRoaXMuX2RhdGVUb0lTTyhvcHRpb25zLnNpbmNlKTtcbiAgICAgIG9wdGlvbnMudW50aWwgPSB0aGlzLl9kYXRlVG9JU08ob3B0aW9ucy51bnRpbCk7XG5cbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9jb21taXRzYCwgb3B0aW9ucywgY2IpO1xuICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhIHNpbmdsZSBjb21taXQgaW5mb3JtYXRpb24gZm9yIGEgcmVwb3NpdG9yeVxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy9jb21taXRzLyNnZXQtYS1zaW5nbGUtY29tbWl0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiAtIHRoZSByZWZlcmVuY2UgZm9yIHRoZSBjb21taXQtaXNoXG4gICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIGNvbW1pdCBpbmZvcm1hdGlvblxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAgKi9cbiAgIGdldFNpbmdsZUNvbW1pdChyZWYsIGNiKSB7XG4gICAgICByZWYgPSByZWYgfHwgJyc7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR0VUJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vY29tbWl0cy8ke3JlZn1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2V0IHRoYSBzaGEgZm9yIGEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIHJlcG9zaXRvcnkuIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvblxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2NvbnRlbnRzLyNnZXQtY29udGVudHNcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYnJhbmNoXSAtIHRoZSBicmFuY2ggdG8gbG9vayBpbiwgb3IgdGhlIHJlcG9zaXRvcnkncyBkZWZhdWx0IGJyYW5jaCBpZiBvbWl0dGVkXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIHRoZSBwYXRoIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVxdWVzdGVkIG9iamVjdCwgaW5jbHVkaW5nIGEgYFNIQWAgcHJvcGVydHlcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0U2hhKGJyYW5jaCwgcGF0aCwgY2IpIHtcbiAgICAgIGJyYW5jaCA9IGJyYW5jaCA/IGA/cmVmPSR7YnJhbmNofWAgOiAnJztcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9jb250ZW50cy8ke3BhdGh9JHticmFuY2h9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgdGhlIGNvbW1pdCBzdGF0dXNlcyBmb3IgYSBwYXJ0aWN1bGFyIHNoYSwgYnJhbmNoLCBvciB0YWdcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy9zdGF0dXNlcy8jbGlzdC1zdGF0dXNlcy1mb3ItYS1zcGVjaWZpYy1yZWZcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaGEgLSB0aGUgc2hhLCBicmFuY2gsIG9yIHRhZyB0byBnZXQgc3RhdHVzZXMgZm9yXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiBzdGF0dXNlc1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBsaXN0U3RhdHVzZXMoc2hhLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2NvbW1pdHMvJHtzaGF9L3N0YXR1c2VzYCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCBhIGRlc2NyaXB0aW9uIG9mIGEgZ2l0IHRyZWVcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXQvdHJlZXMvI2dldC1hLXRyZWVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlU0hBIC0gdGhlIFNIQSBvZiB0aGUgdHJlZSB0byBmZXRjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIGNhbGxiYWNrIGRhdGFcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0VHJlZSh0cmVlU0hBLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2dpdC90cmVlcy8ke3RyZWVTSEF9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZSBhIGJsb2JcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXQvYmxvYnMvI2NyZWF0ZS1hLWJsb2JcbiAgICAqIEBwYXJhbSB7KHN0cmluZ3xCdWZmZXJ8QmxvYil9IGNvbnRlbnQgLSB0aGUgY29udGVudCB0byBhZGQgdG8gdGhlIHJlcG9zaXRvcnlcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRoZSBkZXRhaWxzIG9mIHRoZSBjcmVhdGVkIGJsb2JcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgY3JlYXRlQmxvYihjb250ZW50LCBjYikge1xuICAgICAgbGV0IHBvc3RCb2R5ID0gdGhpcy5fZ2V0Q29udGVudE9iamVjdChjb250ZW50KTtcblxuICAgICAgbG9nKCdzZW5kaW5nIGNvbnRlbnQnLCBwb3N0Qm9keSk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2dpdC9ibG9ic2AsIHBvc3RCb2R5LCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2V0IHRoZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBwcm92aWRlZCBjb250ZW50XG4gICAgKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ8QmxvYn0gY29udGVudCAtIHRoZSBjb250ZW50IHRvIHNlbmQgdG8gdGhlIHNlcnZlclxuICAgICogQHJldHVybiB7T2JqZWN0fSB0aGUgcmVwcmVzZW50YXRpb24gb2YgYGNvbnRlbnRgIGZvciB0aGUgR2l0SHViIEFQSVxuICAgICovXG4gICBfZ2V0Q29udGVudE9iamVjdChjb250ZW50KSB7XG4gICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICBsb2coJ2NvbnRldCBpcyBhIHN0cmluZycpO1xuICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFV0ZjguZW5jb2RlKGNvbnRlbnQpLFxuICAgICAgICAgICAgZW5jb2Rpbmc6ICd1dGYtOCdcbiAgICAgICAgIH07XG5cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgY29udGVudCBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgbG9nKCdXZSBhcHBlYXIgdG8gYmUgaW4gTm9kZScpO1xuICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgZW5jb2Rpbmc6ICdiYXNlNjQnXG4gICAgICAgICB9O1xuXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiBjb250ZW50IGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICAgbG9nKCdXZSBhcHBlYXIgdG8gYmUgaW4gdGhlIGJyb3dzZXInKTtcbiAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBCYXNlNjQuZW5jb2RlKGNvbnRlbnQpLFxuICAgICAgICAgICAgZW5jb2Rpbmc6ICdiYXNlNjQnXG4gICAgICAgICB9O1xuXG4gICAgICB9IGVsc2UgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICBsb2coYE5vdCBzdXJlIHdoYXQgdGhpcyBjb250ZW50IGlzOiAke3R5cGVvZiBjb250ZW50fSwgJHtKU09OLnN0cmluZ2lmeShjb250ZW50KX1gKTtcbiAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjb250ZW50IHBhc3NlZCB0byBwb3N0QmxvYi4gTXVzdCBiZSBzdHJpbmcgb3IgQnVmZmVyIChub2RlKSBvciBCbG9iICh3ZWIpJyk7XG4gICAgICB9XG4gICB9XG5cbiAgIC8qKlxuICAgICogVXBkYXRlIGEgdHJlZSBpbiBHaXRcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9naXQvdHJlZXMvI2NyZWF0ZS1hLXRyZWVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVHJlZVNIQSAtIHRoZSBTSEEgb2YgdGhlIHRyZWUgdG8gdXBkYXRlXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIHRoZSBwYXRoIGZvciB0aGUgbmV3IGZpbGVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBibG9iU0hBIC0gdGhlIFNIQSBmb3IgdGhlIGJsb2IgdG8gcHV0IGF0IGBwYXRoYFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIG5ldyB0cmVlIHRoYXQgaXMgY3JlYXRlZFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBSZXBvc2l0b3J5I2NyZWF0ZVRyZWV9IGluc3RlYWRcbiAgICAqL1xuICAgdXBkYXRlVHJlZShiYXNlVHJlZVNIQSwgcGF0aCwgYmxvYlNIQSwgY2IpIHtcbiAgICAgIGxldCBuZXdUcmVlID0ge1xuICAgICAgICAgYmFzZV90cmVlOiBiYXNlVHJlZVNIQSwgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgICAgICAgdHJlZTogW3tcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICBzaGE6IGJsb2JTSEEsXG4gICAgICAgICAgICBtb2RlOiAnMTAwNjQ0JyxcbiAgICAgICAgICAgIHR5cGU6ICdibG9iJ1xuICAgICAgICAgfV1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQT1NUJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vZ2l0L3RyZWVzYCwgbmV3VHJlZSwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZSBhIG5ldyB0cmVlIGluIGdpdFxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2dpdC90cmVlcy8jY3JlYXRlLWEtdHJlZVxuICAgICogQHBhcmFtIHtPYmplY3R9IHRyZWUgLSB0aGUgdHJlZSB0byBjcmVhdGVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlU0hBIC0gdGhlIHJvb3Qgc2hhIG9mIHRoZSB0cmVlXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgbmV3IHRyZWUgdGhhdCBpcyBjcmVhdGVkXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGNyZWF0ZVRyZWUodHJlZSwgYmFzZVNIQSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQT1NUJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vZ2l0L3RyZWVzYCwge1xuICAgICAgICAgdHJlZSxcbiAgICAgICAgIGJhc2VfdHJlZTogYmFzZVNIQSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICB9LCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQWRkIGEgY29tbWl0IHRvIHRoZSByZXBvc2l0b3J5XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvZ2l0L2NvbW1pdHMvI2NyZWF0ZS1hLWNvbW1pdFxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudCAtIHRoZSBTSEEgb2YgdGhlIHBhcmVudCBjb21taXRcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB0cmVlIC0gdGhlIFNIQSBvZiB0aGUgdHJlZSBmb3IgdGhpcyBjb21taXRcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gdGhlIGNvbW1pdCBtZXNzYWdlXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgY29tbWl0IHRoYXQgaXMgY3JlYXRlZFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBjb21taXQocGFyZW50LCB0cmVlLCBtZXNzYWdlLCBjYikge1xuICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgdHJlZSxcbiAgICAgICAgIHBhcmVudHM6IFtwYXJlbnRdXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2dpdC9jb21taXRzYCwgZGF0YSwgY2IpXG4gICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX19jdXJyZW50VHJlZS5zaGEgPSByZXNwb25zZS5kYXRhLnNoYTsgLy8gVXBkYXRlIGxhdGVzdCBjb21taXRcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgIH0pO1xuICAgfVxuXG4gICAvKipcbiAgICAqIFVwZGF0ZSBhIHJlZlxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2dpdC9yZWZzLyN1cGRhdGUtYS1yZWZlcmVuY2VcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgLSB0aGUgcmVmIHRvIHVwZGF0ZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1pdFNIQSAtIHRoZSBTSEEgdG8gcG9pbnQgdGhlIHJlZmVyZW5jZSB0b1xuICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIGluZGljYXRlcyB3aGV0aGVyIHRvIGZvcmNlIG9yIGVuc3VyZSBhIGZhc3QtZm9yd2FyZCB1cGRhdGVcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRoZSB1cGRhdGVkIHJlZiBiYWNrXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIHVwZGF0ZUhlYWQocmVmLCBjb21taXRTSEEsIGZvcmNlLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BBVENIJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vZ2l0L3JlZnMvJHtyZWZ9YCwge1xuICAgICAgICAgc2hhOiBjb21taXRTSEEsXG4gICAgICAgICBmb3JjZTogZm9yY2VcbiAgICAgIH0sIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcG9zaXRvcnlcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy8jZ2V0XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcG9zaXRvcnlcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0RGV0YWlscyhjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgdGhlIGNvbnRyaWJ1dG9ycyB0byB0aGUgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zLyNsaXN0LWNvbnRyaWJ1dG9yc1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIGxpc3Qgb2YgY29udHJpYnV0b3JzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldENvbnRyaWJ1dG9ycyhjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L3N0YXRzL2NvbnRyaWJ1dG9yc2AsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBMaXN0IHRoZSB1c2VycyB3aG8gYXJlIGNvbGxhYm9yYXRvcnMgb24gdGhlIHJlcG9zaXRvcnkuIFRoZSBjdXJyZW50bHkgYXV0aGVudGljYXRlZCB1c2VyIG11c3QgaGF2ZVxuICAgICogcHVzaCBhY2Nlc3MgdG8gdXNlIHRoaXMgbWV0aG9kXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvY29sbGFib3JhdG9ycy8jbGlzdC1jb2xsYWJvcmF0b3JzXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiBjb2xsYWJvcmF0b3JzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldENvbGxhYm9yYXRvcnMoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9jb2xsYWJvcmF0b3JzYCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENoZWNrIGlmIGEgdXNlciBpcyBhIGNvbGxhYm9yYXRvciBvbiB0aGUgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2NvbGxhYm9yYXRvcnMvI2NoZWNrLWlmLWEtdXNlci1pcy1hLWNvbGxhYm9yYXRvclxuICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lIC0gdGhlIHVzZXIgdG8gY2hlY2tcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRydWUgaWYgdGhlIHVzZXIgaXMgYSBjb2xsYWJvcmF0b3IgYW5kIGZhbHNlIGlmIHRoZXkgYXJlIG5vdFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdCB7Qm9vbGVhbn0gW2Rlc2NyaXB0aW9uXVxuICAgICovXG4gICBpc0NvbGxhYm9yYXRvcih1c2VybmFtZSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9jb2xsYWJvcmF0b3JzLyR7dXNlcm5hbWV9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCB0aGUgY29udGVudHMgb2YgYSByZXBvc2l0b3J5XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvY29udGVudHMvI2dldC1jb250ZW50c1xuICAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiAtIHRoZSByZWYgdG8gY2hlY2tcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gdGhlIHBhdGggY29udGFpbmluZyB0aGUgY29udGVudCB0byBmZXRjaFxuICAgICogQHBhcmFtIHtib29sZWFufSByYXcgLSBgdHJ1ZWAgaWYgdGhlIHJlc3VsdHMgc2hvdWxkIGJlIHJldHVybmVkIHJhdyBpbnN0ZWFkIG9mIEdpdEh1YidzIG5vcm1hbGl6ZWQgZm9ybWF0XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgZmV0Y2hlZCBkYXRhXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldENvbnRlbnRzKHJlZiwgcGF0aCwgcmF3LCBjYikge1xuICAgICAgcGF0aCA9IHBhdGggPyBgJHtlbmNvZGVVUkkocGF0aCl9YCA6ICcnO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2NvbnRlbnRzLyR7cGF0aH1gLCB7XG4gICAgICAgICByZWZcbiAgICAgIH0sIGNiLCByYXcpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCB0aGUgUkVBRE1FIG9mIGEgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2NvbnRlbnRzLyNnZXQtdGhlLXJlYWRtZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiAtIHRoZSByZWYgdG8gY2hlY2tcbiAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmF3IC0gYHRydWVgIGlmIHRoZSByZXN1bHRzIHNob3VsZCBiZSByZXR1cm5lZCByYXcgaW5zdGVhZCBvZiBHaXRIdWIncyBub3JtYWxpemVkIGZvcm1hdFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIGZldGNoZWQgZGF0YVxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBnZXRSZWFkbWUocmVmLCByYXcsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR0VUJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vcmVhZG1lYCwge1xuICAgICAgICAgcmVmXG4gICAgICB9LCBjYiwgcmF3KTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBGb3JrIGEgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2ZvcmtzLyNjcmVhdGUtYS1mb3JrXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ld2x5IGNyZWF0ZWQgZm9ya1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBmb3JrKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2ZvcmtzYCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgYSByZXBvc2l0b3J5J3MgZm9ya3NcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy9mb3Jrcy8jbGlzdC1mb3Jrc1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIGZvcmtlZCBmcm9tIHRoaXMgb25lXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGxpc3RGb3JrcyhjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L2ZvcmtzYCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENyZWF0ZSBhIG5ldyBicmFuY2ggZnJvbSBhbiBleGlzdGluZyBicmFuY2guXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW29sZEJyYW5jaD1tYXN0ZXJdIC0gdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIGJyYW5jaFxuICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0JyYW5jaCAtIHRoZSBuYW1lIG9mIHRoZSBuZXcgYnJhbmNoXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgY29tbWl0IGRhdGEgZm9yIHRoZSBoZWFkIG9mIHRoZSBuZXcgYnJhbmNoXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGNyZWF0ZUJyYW5jaChvbGRCcmFuY2gsIG5ld0JyYW5jaCwgY2IpIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3QnJhbmNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICBjYiA9IG5ld0JyYW5jaDtcbiAgICAgICAgIG5ld0JyYW5jaCA9IG9sZEJyYW5jaDtcbiAgICAgICAgIG9sZEJyYW5jaCA9ICdtYXN0ZXInO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5nZXRSZWYoYGhlYWRzLyR7b2xkQnJhbmNofWApXG4gICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGxldCBzaGEgPSByZXNwb25zZS5kYXRhLm9iamVjdC5zaGE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVSZWYoe1xuICAgICAgICAgICAgICAgc2hhLFxuICAgICAgICAgICAgICAgcmVmOiBgcmVmcy9oZWFkcy8ke25ld0JyYW5jaH1gXG4gICAgICAgICAgICB9LCBjYik7XG4gICAgICAgICB9KTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgcHVsbCByZXF1ZXN0XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcHVsbHMvI2NyZWF0ZS1hLXB1bGwtcmVxdWVzdFxuICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB0aGUgcHVsbCByZXF1ZXN0IGRlc2NyaXB0aW9uXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgbmV3IHB1bGwgcmVxdWVzdFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBjcmVhdGVQdWxsUmVxdWVzdChvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BPU1QnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9wdWxsc2AsIG9wdGlvbnMsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBVcGRhdGUgYSBwdWxsIHJlcXVlc3RcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9wdWxscy8jdXBkYXRlLWEtcHVsbC1yZXF1ZXN0XG4gICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG51bWJlciAtIHRoZSBudW1iZXIgb2YgdGhlIHB1bGwgcmVxdWVzdCB0byB1cGRhdGVcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gdGhlIHB1bGwgcmVxdWVzdCBkZXNjcmlwdGlvblxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgcHVsbCByZXF1ZXN0IGluZm9ybWF0aW9uXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIHVwZGF0ZVB1bGxSZXF1c3QobnVtYmVyLCBvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BBVENIJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vcHVsbHMvJHtudW1iZXJ9YCwgb3B0aW9ucywgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgdGhlIGhvb2tzIGZvciB0aGUgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2hvb2tzLyNsaXN0LWhvb2tzXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiBob29rc1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBsaXN0SG9va3MoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9ob29rc2AsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgYSBob29rIGZvciB0aGUgcmVwb3NpdG9yeVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2hvb2tzLyNnZXQtc2luZ2xlLWhvb2tcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZCAtIHRoZSBpZCBvZiB0aGUgd2Vib29rXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgZGV0YWlscyBvZiB0aGUgd2Vib29rXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldEhvb2soaWQsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR0VUJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vaG9va3MvJHtpZH1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQWRkIGEgbmV3IGhvb2sgdG8gdGhlIHJlcG9zaXRvcnlcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy9ob29rcy8jY3JlYXRlLWEtaG9va1xuICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB0aGUgY29uZmlndXJhdGlvbiBkZXNjcmliaW5nIHRoZSBuZXcgaG9va1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIG5ldyB3ZWJob29rXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGNyZWF0ZUhvb2sob3B0aW9ucywgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQT1NUJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vaG9va3NgLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRWRpdCBhbiBleGlzdGluZyB3ZWJob29rXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvaG9va3MvI2VkaXQtYS1ob29rXG4gICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSB0aGUgaWQgb2YgdGhlIHdlYmhvb2tcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gdGhlIG5ldyBkZXNjcmlwdGlvbiBvZiB0aGUgd2ViaG9va1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIHVwZGF0ZWQgd2ViaG9va1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICB1cGRhdGVIb29rKGlkLCBvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BBVENIJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vaG9va3MvJHtpZH1gLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRGVsZXRlIGEgd2ViaG9va1xuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL2hvb2tzLyNkZWxldGUtYS1ob29rXG4gICAgKiBAcGFyYW0ge251bWJlcn0gaWQgLSB0aGUgaWQgb2YgdGhlIHdlYmhvb2sgdG8gYmUgZGVsZXRlZFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdHJ1ZSBpZiB0aGUgY2FsbCBpcyBzdWNjZXNzZnVsXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGRlbGV0ZUhvb2soaWQsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnREVMRVRFJywgYCR7dGhpcy5fX3JlcG9QYXRofS9ob29rcy8ke2lkfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBEZWxldGUgYSBmaWxlIGZyb20gYSBicmFuY2hcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy9jb250ZW50cy8jZGVsZXRlLWEtZmlsZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IGJyYW5jaCAtIHRoZSBicmFuY2ggdG8gZGVsZXRlIGZyb20sIG9yIHRoZSBkZWZhdWx0IGJyYW5jaCBpZiBub3Qgc3BlY2lmaWVkXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIHRoZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHJlbW92ZVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIGNvbW1pdCBpbiB3aGljaCB0aGUgZGVsZXRlIG9jY3VycmVkXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGRlbGV0ZUZpbGUoYnJhbmNoLCBwYXRoLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2hhKGJyYW5jaCwgcGF0aClcbiAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGVsZXRlQ29tbWl0ID0ge1xuICAgICAgICAgICAgICAgbWVzc2FnZTogYERlbGV0ZSB0aGUgZmlsZSBhdCAnJHtwYXRofSdgLFxuICAgICAgICAgICAgICAgc2hhOiByZXNwb25zZS5kYXRhLnNoYSxcbiAgICAgICAgICAgICAgIGJyYW5jaFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdERUxFVEUnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9jb250ZW50cy8ke3BhdGh9YCwgZGVsZXRlQ29tbWl0LCBjYik7XG4gICAgICAgICB9KTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgaW4gYSByZXBvIGZyb20gb2xkUGF0aCB0byBuZXdfcGF0aFxuICAgICogQHBhcmFtIHtzdHJpbmd9IGJyYW5jaCAtIHRoZSBicmFuY2ggdG8gY2Fycnkgb3V0IHRoZSByZWZlcmVuY2UgY2hhbmdlLCBvciB0aGUgZGVmYXVsdCBicmFuY2ggaWYgbm90IHNwZWNpZmllZFxuICAgICogQHBhcmFtIHtzdHJpbmd9IG9sZFBhdGggLSBvcmlnaW5hbCBwYXRoXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3UGF0aCAtIG5ldyByZWZlcmVuY2UgcGF0aFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIGNvbW1pdCBpbiB3aGljaCB0aGUgbW92ZSBvY2N1cnJlZFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBtb3ZlKGJyYW5jaCwgb2xkUGF0aCwgbmV3UGF0aCwgY2IpIHtcbiAgICAgIGxldCBvbGRTaGE7XG4gICAgICByZXR1cm4gdGhpcy5nZXRSZWYoYGhlYWRzLyR7YnJhbmNofWApXG4gICAgICAgICAudGhlbigoe2RhdGE6IHtvYmplY3R9fSkgPT4gdGhpcy5nZXRUcmVlKGAke29iamVjdC5zaGF9P3JlY3Vyc2l2ZT10cnVlYCkpXG4gICAgICAgICAudGhlbigoe2RhdGE6IHt0cmVlLCBzaGF9fSkgPT4ge1xuICAgICAgICAgICAgb2xkU2hhID0gc2hhO1xuICAgICAgICAgICAgbGV0IG5ld1RyZWUgPSB0cmVlLm1hcCgocmVmKSA9PiB7XG4gICAgICAgICAgICAgICBpZiAocmVmLnBhdGggPT09IG9sZFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgIHJlZi5wYXRoID0gbmV3UGF0aDtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGlmIChyZWYudHlwZSA9PT0gJ3RyZWUnKSB7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgcmVmLnNoYTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIHJldHVybiByZWY7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRyZWUobmV3VHJlZSk7XG4gICAgICAgICB9KVxuICAgICAgICAgLnRoZW4oKHtkYXRhOiB0cmVlfSkgPT4gdGhpcy5jb21taXQob2xkU2hhLCB0cmVlLnNoYSwgYFJlbmFtZWQgJyR7b2xkUGF0aH0nIHRvICcke25ld1BhdGh9J2ApKVxuICAgICAgICAgLnRoZW4oKHtkYXRhOiBjb21taXR9KSA9PiB0aGlzLnVwZGF0ZUhlYWQoYGhlYWRzLyR7YnJhbmNofWAsIGNvbW1pdC5zaGEsIHRydWUsIGNiKSk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogV3JpdGUgYSBmaWxlIHRvIHRoZSByZXBvc2l0b3J5XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvY29udGVudHMvI3VwZGF0ZS1hLWZpbGVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBicmFuY2ggLSB0aGUgbmFtZSBvZiB0aGUgYnJhbmNoXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIHRoZSBwYXRoIGZvciB0aGUgZmlsZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gdGhlIGNvbW1pdCBtZXNzYWdlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gY29tbWl0IG9wdGlvbnNcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5hdXRob3JdIC0gdGhlIGF1dGhvciBvZiB0aGUgY29tbWl0XG4gICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY29tbWl0ZXJdIC0gdGhlIGNvbW1pdHRlclxuICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5lbmNvZGVdIC0gdHJ1ZSBpZiB0aGUgY29udGVudCBzaG91bGQgYmUgYmFzZTY0IGVuY29kZWRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRoZSBuZXcgY29tbWl0XG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIHdyaXRlRmlsZShicmFuY2gsIHBhdGgsIGNvbnRlbnQsIG1lc3NhZ2UsIG9wdGlvbnMsIGNiKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgIGNiID0gb3B0aW9ucztcbiAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cbiAgICAgIGxldCBmaWxlUGF0aCA9IHBhdGggPyBlbmNvZGVVUkkocGF0aCkgOiAnJztcbiAgICAgIGxldCBzaG91bGRFbmNvZGUgPSBvcHRpb25zLmVuY29kZSAhPT0gZmFsc2U7XG4gICAgICBsZXQgY29tbWl0ID0ge1xuICAgICAgICAgYnJhbmNoLFxuICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgIGF1dGhvcjogb3B0aW9ucy5hdXRob3IsXG4gICAgICAgICBjb21taXR0ZXI6IG9wdGlvbnMuY29tbWl0dGVyLFxuICAgICAgICAgY29udGVudDogc2hvdWxkRW5jb2RlID8gQmFzZTY0LmVuY29kZShjb250ZW50KSA6IGNvbnRlbnRcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLmdldFNoYShicmFuY2gsIGZpbGVQYXRoKVxuICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb21taXQuc2hhID0gcmVzcG9uc2UuZGF0YS5zaGE7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUFVUJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vY29udGVudHMvJHtmaWxlUGF0aH1gLCBjb21taXQsIGNiKTtcbiAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQVVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9jb250ZW50cy8ke2ZpbGVQYXRofWAsIGNvbW1pdCwgY2IpO1xuICAgICAgICAgfSk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ2hlY2sgaWYgYSByZXBvc2l0b3J5IGlzIHN0YXJyZWQgYnkgeW91XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvYWN0aXZpdHkvc3RhcnJpbmcvI2NoZWNrLWlmLXlvdS1hcmUtc3RhcnJpbmctYS1yZXBvc2l0b3J5XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0cnVlIGlmIHRoZSByZXBvc2l0b3J5IGlzIHN0YXJyZWQgYW5kIGZhbHNlIGlmIHRoZSByZXBvc2l0b3J5XG4gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3Qgc3RhcnJlZFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdCB7Qm9vbGVhbn0gW2Rlc2NyaXB0aW9uXVxuICAgICovXG4gICBpc1N0YXJyZWQoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0MjA0b3I0MDQoYC91c2VyL3N0YXJyZWQvJHt0aGlzLl9fZnVsbG5hbWV9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIFN0YXIgYSByZXBvc2l0b3J5XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvYWN0aXZpdHkvc3RhcnJpbmcvI3N0YXItYS1yZXBvc2l0b3J5XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0cnVlIGlmIHRoZSByZXBvc2l0b3J5IGlzIHN0YXJyZWRcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgc3RhcihjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BVVCcsIGAvdXNlci9zdGFycmVkLyR7dGhpcy5fX2Z1bGxuYW1lfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBVbnN0YXIgYSByZXBvc2l0b3J5XG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvYWN0aXZpdHkvc3RhcnJpbmcvI3Vuc3Rhci1hLXJlcG9zaXRvcnlcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRydWUgaWYgdGhlIHJlcG9zaXRvcnkgaXMgdW5zdGFycmVkXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIHVuc3RhcihjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0RFTEVURScsIGAvdXNlci9zdGFycmVkLyR7dGhpcy5fX2Z1bGxuYW1lfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgcmVsZWFzZVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL3JlbGVhc2VzLyNjcmVhdGUtYS1yZWxlYXNlXG4gICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVsZWFzZVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIG5ld2x5IGNyZWF0ZWQgcmVsZWFzZVxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBjcmVhdGVSZWxlYXNlKG9wdGlvbnMsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L3JlbGVhc2VzYCwgb3B0aW9ucywgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEVkaXQgYSByZWxlYXNlXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvcmVsZWFzZXMvI2VkaXQtYS1yZWxlYXNlXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSB0aGUgaWQgb2YgdGhlIHJlbGVhc2VcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWxlYXNlXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHdpbGwgcmVjZWl2ZSB0aGUgbW9kaWZpZWQgcmVsZWFzZVxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICB1cGRhdGVSZWxlYXNlKGlkLCBvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BBVENIJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vcmVsZWFzZXMvJHtpZH1gLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2V0IGluZm9ybWF0aW9uIGFib3V0IGFsbCByZWxlYXNlc1xuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3JlcG9zL3JlbGVhc2VzLyNsaXN0LXJlbGVhc2VzLWZvci1hLXJlcG9zaXRvcnlcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRoZSByZWxlYXNlIGluZm9ybWF0aW9uXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGxpc3RSZWxlYXNlcyhjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L3JlbGVhc2VzYCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHJlbGVhc2VcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy9yZWxlYXNlcy8jZ2V0LWEtc2luZ2xlLXJlbGVhc2VcbiAgICAqIEBwYXJhbSB7c3RyaWdufSBpZCAtIHRoZSBpZCBvZiB0aGUgcmVsZWFzZVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gY2IgLSB3aWxsIHJlY2VpdmUgdGhlIHJlbGVhc2UgaW5mb3JtYXRpb25cbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZ2V0UmVsZWFzZShpZCwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3JlcG9zLyR7dGhpcy5fX2Z1bGxuYW1lfS9yZWxlYXNlcy8ke2lkfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBEZWxldGUgYSByZWxlYXNlXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvcmVsZWFzZXMvI2RlbGV0ZS1hLXJlbGVhc2VcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIHRoZSByZWxlYXNlIHRvIGJlIGRlbGV0ZWRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IGNiIC0gd2lsbCByZWNlaXZlIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGRlbGV0ZVJlbGVhc2UoaWQsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnREVMRVRFJywgYC9yZXBvcy8ke3RoaXMuX19mdWxsbmFtZX0vcmVsZWFzZXMvJHtpZH1gLCBudWxsLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTWVyZ2UgYSBwdWxsIHJlcXVlc3RcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9wdWxscy8jbWVyZ2UtYS1wdWxsLXJlcXVlc3QtbWVyZ2UtYnV0dG9uXG4gICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IG51bWJlciAtIHRoZSBudW1iZXIgb2YgdGhlIHB1bGwgcmVxdWVzdCB0byBtZXJnZVxuICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB0aGUgbWVyZ2Ugb3B0aW9ucyBmb3IgdGhlIHB1bGwgcmVxdWVzdFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbWVyZ2UgaW5mb3JtYXRpb24gaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIG1lcmdlUHVsbFJlcXVlc3QobnVtYmVyLCBvcHRpb25zLCBjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ1BVVCcsIGAvcmVwb3MvJHt0aGlzLl9fZnVsbG5hbWV9L3B1bGxzLyR7bnVtYmVyfS9tZXJnZWAsIG9wdGlvbnMsIGNiKTtcbiAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZXBvc2l0b3J5O1xuIl19 +//# sourceMappingURL=Repository.js.map diff --git a/dist/components/Repository.js.map b/dist/components/Repository.js.map new file mode 100644 index 00000000..ba8c74af --- /dev/null +++ b/dist/components/Repository.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["Repository.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\nimport Utf8 from 'utf8';\nimport {\n Base64\n} from 'js-base64';\nimport debug from 'debug';\nconst log = debug('github:repository');\n\n/**\n * Respository encapsulates the functionality to create, query, and modify files.\n */\nclass Repository extends Requestable {\n /**\n * Create a Repository.\n * @param {string} fullname - the full name of the repository\n * @param {Requestable.auth} [auth] - information required to authenticate to Github\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(fullname, auth, apiBase) {\n super(auth, apiBase);\n this.__fullname = fullname;\n this.__currentTree = {\n branch: null,\n sha: null\n };\n }\n\n /**\n * Get a reference\n * @see https://developer.github.com/v3/git/refs/#get-a-reference\n * @param {string} ref - the reference to get\n * @param {Requestable.callback} [cb] - will receive the reference's refSpec or a list of refSpecs that match `ref`\n * @return {Promise} - the promise for the http request\n */\n getRef(ref, cb) {\n return this._request('GET', `/repos/${this.__fullname}/git/refs/${ref}`, null, cb);\n }\n\n /**\n * Create a reference\n * @see https://developer.github.com/v3/git/refs/#create-a-reference\n * @param {Object} options - the object describing the ref\n * @param {Requestable.callback} [cb] - will receive the ref\n * @return {Promise} - the promise for the http request\n */\n createRef(options, cb) {\n return this._request('POST', `/repos/${this.__fullname}/git/refs`, options, cb);\n }\n\n /**\n * Delete a reference\n * @see https://developer.github.com/v3/git/refs/#delete-a-reference\n * @param {string} ref - the name of the ref to delte\n * @param {Requestable.callback} [cb] - will receive true if the request is successful\n * @return {Promise} - the promise for the http request\n */\n deleteRef(ref, cb) {\n return this._request('DELETE', `/repos/${this.__fullname}/git/refs/${ref}`, null, cb);\n }\n\n /**\n * Delete a repository\n * @see https://developer.github.com/v3/repos/#delete-a-repository\n * @param {Requestable.callback} [cb] - will receive true if the request is successful\n * @return {Promise} - the promise for the http request\n */\n deleteRepo(cb) {\n return this._request('DELETE', `/repos/${this.__fullname}`, null, cb);\n }\n\n /**\n * List the tags on a repository\n * @see https://developer.github.com/v3/repos/#list-tags\n * @param {Requestable.callback} [cb] - will receive the tag data\n * @return {Promise} - the promise for the http request\n */\n listTags(cb) {\n return this._request('GET', `/repos/${this.__fullname}/tags`, null, cb);\n }\n\n /**\n * List the open pull requests on the repository\n * @see https://developer.github.com/v3/pulls/#list-pull-requests\n * @param {Object} options - options to filter the search\n * @param {Requestable.callback} [cb] - will receive the list of PRs\n * @return {Promise} - the promise for the http request\n */\n listPullRequests(options, cb) {\n options = options || {};\n return this._request('GET', `/repos/${this.__fullname}/pulls`, options, cb);\n }\n\n /**\n * Get information about a specific pull request\n * @see https://developer.github.com/v3/pulls/#get-a-single-pull-request\n * @param {number} number - the PR you wish to fetch\n * @param {Requestable.callback} [cb] - will receive the PR from the API\n * @return {Promise} - the promise for the http request\n */\n getPullRequest(number, cb) {\n return this._request('GET', `/repos/${this.__fullname}/pulls/${number}`, null, cb);\n }\n\n /**\n * List the files of a specific pull request\n * @see https://developer.github.com/v3/pulls/#list-pull-requests-files\n * @param {number|string} number - the PR you wish to fetch\n * @param {Requestable.callback} [cb] - will receive the list of files from the API\n * @return {Promise} - the promise for the http request\n */\n listPullRequestFiles(number, cb) {\n return this._request('GET', `/repos/${this.__fullname}/pulls/${number}/files`, null, cb);\n }\n\n /**\n * Compare two branches/commits/repositories\n * @see https://developer.github.com/v3/repos/commits/#compare-two-commits\n * @param {string} base - the base commit\n * @param {string} head - the head commit\n * @param {Requestable.callback} cb - will receive the comparison\n * @return {Promise} - the promise for the http request\n */\n compareBranches(base, head, cb) {\n return this._request('GET', `/repos/${this.__fullname}/compare/${base}...${head}`, null, cb);\n }\n\n /**\n * List all the branches for the repository\n * @see https://developer.github.com/v3/repos/#list-branches\n * @param {Requestable.callback} cb - will receive the list of branches\n * @return {Promise} - the promise for the http request\n */\n listBranches(cb) {\n return this._request('GET', `/repos/${this.__fullname}/branches`, null, cb);\n }\n\n /**\n * List all the branches for the repository (after pagination)\n * @see https://developer.github.com/v3/repos/#list-branches\n * @param {}\n * @return {Promise} - the promise for the http request\n */\n listAllBranches() {\n return this._requestAllPages(`/repos/${this.__fullname}/branches`, null);\n }\n\n /**\n * Get a raw blob from the repository\n * @see https://developer.github.com/v3/git/blobs/#get-a-blob\n * @param {string} sha - the sha of the blob to fetch\n * @param {Requestable.callback} cb - will receive the blob from the API\n * @return {Promise} - the promise for the http request\n */\n getBlob(sha, cb) {\n return this._request('GET', `/repos/${this.__fullname}/git/blobs/${sha}`, null, cb, 'raw');\n }\n\n /**\n * Get a commit from the repository\n * @see https://developer.github.com/v3/repos/commits/#get-a-single-commit\n * @param {string} sha - the sha for the commit to fetch\n * @param {Requestable.callback} cb - will receive the commit data\n * @return {Promise} - the promise for the http request\n */\n getCommit(sha, cb) {\n return this._request('GET', `/repos/${this.__fullname}/git/commits/${sha}`, null, cb);\n }\n\n /**\n * List the commits on a repository, optionally filtering by path, author or time range\n * @see https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository\n * @param {Object} [options] - the filtering options for commits\n * @param {string} [options.sha] - the SHA or branch to start from\n * @param {string} [options.path] - the path to search on\n * @param {string} [options.author] - the commit author\n * @param {(Date|string)} [options.since] - only commits after this date will be returned\n * @param {(Date|string)} [options.until] - only commits before this date will be returned\n * @param {Requestable.callback} cb - will receive the list of commits found matching the criteria\n * @return {Promise} - the promise for the http request\n */\n listCommits(options, cb) {\n options = options || {};\n\n options.since = this._dateToISO(options.since);\n options.until = this._dateToISO(options.until);\n\n return this._request('GET', `/repos/${this.__fullname}/commits`, options, cb);\n }\n\n /**\n * Gets a single commit information for a repository\n * @see https://developer.github.com/v3/repos/commits/#get-a-single-commit\n * @param {string} ref - the reference for the commit-ish\n * @param {Requestable.callback} cb - will receive the commit information\n * @return {Promise} - the promise for the http request\n */\n getSingleCommit(ref, cb) {\n ref = ref || '';\n return this._request('GET', `/repos/${this.__fullname}/commits/${ref}`, null, cb);\n }\n\n /**\n * Get tha sha for a particular object in the repository. This is a convenience function\n * @see https://developer.github.com/v3/repos/contents/#get-contents\n * @param {string} [branch] - the branch to look in, or the repository's default branch if omitted\n * @param {string} path - the path of the file or directory\n * @param {Requestable.callback} cb - will receive a description of the requested object, including a `SHA` property\n * @return {Promise} - the promise for the http request\n */\n getSha(branch, path, cb) {\n branch = branch ? `?ref=${branch}` : '';\n return this._request('GET', `/repos/${this.__fullname}/contents/${path}${branch}`, null, cb);\n }\n\n /**\n * List the commit statuses for a particular sha, branch, or tag\n * @see https://developer.github.com/v3/repos/statuses/#list-statuses-for-a-specific-ref\n * @param {string} sha - the sha, branch, or tag to get statuses for\n * @param {Requestable.callback} cb - will receive the list of statuses\n * @return {Promise} - the promise for the http request\n */\n listStatuses(sha, cb) {\n return this._request('GET', `/repos/${this.__fullname}/commits/${sha}/statuses`, null, cb);\n }\n\n /**\n * Get a description of a git tree\n * @see https://developer.github.com/v3/git/trees/#get-a-tree\n * @param {string} treeSHA - the SHA of the tree to fetch\n * @param {Requestable.callback} cb - will receive the callback data\n * @return {Promise} - the promise for the http request\n */\n getTree(treeSHA, cb) {\n return this._request('GET', `/repos/${this.__fullname}/git/trees/${treeSHA}`, null, cb);\n }\n\n /**\n * Create a blob\n * @see https://developer.github.com/v3/git/blobs/#create-a-blob\n * @param {(string|Buffer|Blob)} content - the content to add to the repository\n * @param {Requestable.callback} cb - will receive the details of the created blob\n * @return {Promise} - the promise for the http request\n */\n createBlob(content, cb) {\n let postBody = this._getContentObject(content);\n\n log('sending content', postBody);\n return this._request('POST', `/repos/${this.__fullname}/git/blobs`, postBody, cb);\n }\n\n /**\n * Get the object that represents the provided content\n * @param {string|Buffer|Blob} content - the content to send to the server\n * @return {Object} the representation of `content` for the GitHub API\n */\n _getContentObject(content) {\n if (typeof content === 'string') {\n log('contet is a string');\n return {\n content: Utf8.encode(content),\n encoding: 'utf-8'\n };\n\n } else if (typeof Buffer !== 'undefined' && content instanceof Buffer) {\n log('We appear to be in Node');\n return {\n content: content.toString('base64'),\n encoding: 'base64'\n };\n\n } else if (typeof Blob !== 'undefined' && content instanceof Blob) {\n log('We appear to be in the browser');\n return {\n content: Base64.encode(content),\n encoding: 'base64'\n };\n\n } else { // eslint-disable-line\n log(`Not sure what this content is: ${typeof content}, ${JSON.stringify(content)}`);\n throw new Error('Unknown content passed to postBlob. Must be string or Buffer (node) or Blob (web)');\n }\n }\n\n /**\n * Update a tree in Git\n * @see https://developer.github.com/v3/git/trees/#create-a-tree\n * @param {string} baseTreeSHA - the SHA of the tree to update\n * @param {string} path - the path for the new file\n * @param {string} blobSHA - the SHA for the blob to put at `path`\n * @param {Requestable.callback} cb - will receive the new tree that is created\n * @return {Promise} - the promise for the http request\n * @deprecated use {@link Repository#createTree} instead\n */\n updateTree(baseTreeSHA, path, blobSHA, cb) {\n let newTree = {\n base_tree: baseTreeSHA, // eslint-disable-line\n tree: [{\n path: path,\n sha: blobSHA,\n mode: '100644',\n type: 'blob'\n }]\n };\n\n return this._request('POST', `/repos/${this.__fullname}/git/trees`, newTree, cb);\n }\n\n /**\n * Create a new tree in git\n * @see https://developer.github.com/v3/git/trees/#create-a-tree\n * @param {Object} tree - the tree to create\n * @param {string} baseSHA - the root sha of the tree\n * @param {Requestable.callback} cb - will receive the new tree that is created\n * @return {Promise} - the promise for the http request\n */\n createTree(tree, baseSHA, cb) {\n return this._request('POST', `/repos/${this.__fullname}/git/trees`, {\n tree,\n base_tree: baseSHA // eslint-disable-line\n }, cb);\n }\n\n /**\n * Add a commit to the repository\n * @see https://developer.github.com/v3/git/commits/#create-a-commit\n * @param {string} parent - the SHA of the parent commit\n * @param {string} tree - the SHA of the tree for this commit\n * @param {string} message - the commit message\n * @param {Requestable.callback} cb - will receive the commit that is created\n * @return {Promise} - the promise for the http request\n */\n commit(parent, tree, message, cb) {\n let data = {\n message,\n tree,\n parents: [parent]\n };\n\n return this._request('POST', `/repos/${this.__fullname}/git/commits`, data, cb)\n .then((response) => {\n this.__currentTree.sha = response.data.sha; // Update latest commit\n return response;\n });\n }\n\n /**\n * Update a ref\n * @see https://developer.github.com/v3/git/refs/#update-a-reference\n * @param {string} ref - the ref to update\n * @param {string} commitSHA - the SHA to point the reference to\n * @param {boolean} force - indicates whether to force or ensure a fast-forward update\n * @param {Requestable.callback} cb - will receive the updated ref back\n * @return {Promise} - the promise for the http request\n */\n updateHead(ref, commitSHA, force, cb) {\n return this._request('PATCH', `/repos/${this.__fullname}/git/refs/${ref}`, {\n sha: commitSHA,\n force: force\n }, cb);\n }\n\n /**\n * Get information about the repository\n * @see https://developer.github.com/v3/repos/#get\n * @param {Requestable.callback} cb - will receive the information about the repository\n * @return {Promise} - the promise for the http request\n */\n getDetails(cb) {\n return this._request('GET', `/repos/${this.__fullname}`, null, cb);\n }\n\n /**\n * List the contributors to the repository\n * @see https://developer.github.com/v3/repos/#list-contributors\n * @param {Requestable.callback} cb - will receive the list of contributors\n * @return {Promise} - the promise for the http request\n */\n getContributors(cb) {\n return this._request('GET', `/repos/${this.__fullname}/stats/contributors`, null, cb);\n }\n\n /**\n * List the users who are collaborators on the repository. The currently authenticated user must have\n * push access to use this method\n * @see https://developer.github.com/v3/repos/collaborators/#list-collaborators\n * @param {Requestable.callback} cb - will receive the list of collaborators\n * @return {Promise} - the promise for the http request\n */\n getCollaborators(cb) {\n return this._request('GET', `/repos/${this.__fullname}/collaborators`, null, cb);\n }\n\n /**\n * Check if a user is a collaborator on the repository\n * @see https://developer.github.com/v3/repos/collaborators/#check-if-a-user-is-a-collaborator\n * @param {string} username - the user to check\n * @param {Requestable.callback} cb - will receive true if the user is a collaborator and false if they are not\n * @return {Promise} - the promise for the http request {Boolean} [description]\n */\n isCollaborator(username, cb) {\n return this._request('GET', `/repos/${this.__fullname}/collaborators/${username}`, null, cb);\n }\n\n /**\n * Get the contents of a repository\n * @see https://developer.github.com/v3/repos/contents/#get-contents\n * @param {string} ref - the ref to check\n * @param {string} path - the path containing the content to fetch\n * @param {boolean} raw - `true` if the results should be returned raw instead of GitHub's normalized format\n * @param {Requestable.callback} cb - will receive the fetched data\n * @return {Promise} - the promise for the http request\n */\n getContents(ref, path, raw, cb) {\n path = path ? `${encodeURI(path)}` : '';\n return this._request('GET', `/repos/${this.__fullname}/contents/${path}`, {\n ref\n }, cb, raw);\n }\n\n /**\n * Get the README of a repository\n * @see https://developer.github.com/v3/repos/contents/#get-the-readme\n * @param {string} ref - the ref to check\n * @param {boolean} raw - `true` if the results should be returned raw instead of GitHub's normalized format\n * @param {Requestable.callback} cb - will receive the fetched data\n * @return {Promise} - the promise for the http request\n */\n getReadme(ref, raw, cb) {\n return this._request('GET', `/repos/${this.__fullname}/readme`, {\n ref\n }, cb, raw);\n }\n\n /**\n * Fork a repository\n * @see https://developer.github.com/v3/repos/forks/#create-a-fork\n * @param {Requestable.callback} cb - will receive the information about the newly created fork\n * @return {Promise} - the promise for the http request\n */\n fork(cb) {\n return this._request('POST', `/repos/${this.__fullname}/forks`, null, cb);\n }\n\n /**\n * List a repository's forks\n * @see https://developer.github.com/v3/repos/forks/#list-forks\n * @param {Requestable.callback} cb - will receive the list of repositories forked from this one\n * @return {Promise} - the promise for the http request\n */\n listForks(cb) {\n return this._request('GET', `/repos/${this.__fullname}/forks`, null, cb);\n }\n\n /**\n * Create a new branch from an existing branch.\n * @param {string} [oldBranch=master] - the name of the existing branch\n * @param {string} newBranch - the name of the new branch\n * @param {Requestable.callback} cb - will receive the commit data for the head of the new branch\n * @return {Promise} - the promise for the http request\n */\n createBranch(oldBranch, newBranch, cb) {\n if (typeof newBranch === 'function') {\n cb = newBranch;\n newBranch = oldBranch;\n oldBranch = 'master';\n }\n\n return this.getRef(`heads/${oldBranch}`)\n .then((response) => {\n let sha = response.data.object.sha;\n return this.createRef({\n sha,\n ref: `refs/heads/${newBranch}`\n }, cb);\n });\n }\n\n /**\n * Create a new pull request\n * @see https://developer.github.com/v3/pulls/#create-a-pull-request\n * @param {Object} options - the pull request description\n * @param {Requestable.callback} cb - will receive the new pull request\n * @return {Promise} - the promise for the http request\n */\n createPullRequest(options, cb) {\n return this._request('POST', `/repos/${this.__fullname}/pulls`, options, cb);\n }\n\n /**\n * Update a pull request\n * @see https://developer.github.com/v3/pulls/#update-a-pull-request\n * @param {number|string} number - the number of the pull request to update\n * @param {Object} options - the pull request description\n * @param {Requestable.callback} [cb] - will receive the pull request information\n * @return {Promise} - the promise for the http request\n */\n updatePullRequst(number, options, cb) {\n return this._request('PATCH', `/repos/${this.__fullname}/pulls/${number}`, options, cb);\n }\n\n /**\n * List the hooks for the repository\n * @see https://developer.github.com/v3/repos/hooks/#list-hooks\n * @param {Requestable.callback} cb - will receive the list of hooks\n * @return {Promise} - the promise for the http request\n */\n listHooks(cb) {\n return this._request('GET', `/repos/${this.__fullname}/hooks`, null, cb);\n }\n\n /**\n * Get a hook for the repository\n * @see https://developer.github.com/v3/repos/hooks/#get-single-hook\n * @param {number} id - the id of the webook\n * @param {Requestable.callback} cb - will receive the details of the webook\n * @return {Promise} - the promise for the http request\n */\n getHook(id, cb) {\n return this._request('GET', `/repos/${this.__fullname}/hooks/${id}`, null, cb);\n }\n\n /**\n * Add a new hook to the repository\n * @see https://developer.github.com/v3/repos/hooks/#create-a-hook\n * @param {Object} options - the configuration describing the new hook\n * @param {Requestable.callback} cb - will receive the new webhook\n * @return {Promise} - the promise for the http request\n */\n createHook(options, cb) {\n return this._request('POST', `/repos/${this.__fullname}/hooks`, options, cb);\n }\n\n /**\n * Edit an existing webhook\n * @see https://developer.github.com/v3/repos/hooks/#edit-a-hook\n * @param {number} id - the id of the webhook\n * @param {Object} options - the new description of the webhook\n * @param {Requestable.callback} cb - will receive the updated webhook\n * @return {Promise} - the promise for the http request\n */\n updateHook(id, options, cb) {\n return this._request('PATCH', `/repos/${this.__fullname}/hooks/${id}`, options, cb);\n }\n\n /**\n * Delete a webhook\n * @see https://developer.github.com/v3/repos/hooks/#delete-a-hook\n * @param {number} id - the id of the webhook to be deleted\n * @param {Requestable.callback} cb - will receive true if the call is successful\n * @return {Promise} - the promise for the http request\n */\n deleteHook(id, cb) {\n return this._request('DELETE', `${this.__repoPath}/hooks/${id}`, null, cb);\n }\n\n /**\n * Delete a file from a branch\n * @see https://developer.github.com/v3/repos/contents/#delete-a-file\n * @param {string} branch - the branch to delete from, or the default branch if not specified\n * @param {string} path - the path of the file to remove\n * @param {Requestable.callback} cb - will receive the commit in which the delete occurred\n * @return {Promise} - the promise for the http request\n */\n deleteFile(branch, path, cb) {\n return this.getSha(branch, path)\n .then((response) => {\n const deleteCommit = {\n message: `Delete the file at '${path}'`,\n sha: response.data.sha,\n branch\n };\n return this._request('DELETE', `/repos/${this.__fullname}/contents/${path}`, deleteCommit, cb);\n });\n }\n\n /**\n * Change all references in a repo from oldPath to new_path\n * @param {string} branch - the branch to carry out the reference change, or the default branch if not specified\n * @param {string} oldPath - original path\n * @param {string} newPath - new reference path\n * @param {Requestable.callback} cb - will receive the commit in which the move occurred\n * @return {Promise} - the promise for the http request\n */\n move(branch, oldPath, newPath, cb) {\n let oldSha;\n return this.getRef(`heads/${branch}`)\n .then(({data: {object}}) => this.getTree(`${object.sha}?recursive=true`))\n .then(({data: {tree, sha}}) => {\n oldSha = sha;\n let newTree = tree.map((ref) => {\n if (ref.path === oldPath) {\n ref.path = newPath;\n }\n if (ref.type === 'tree') {\n delete ref.sha;\n }\n return ref;\n });\n return this.createTree(newTree);\n })\n .then(({data: tree}) => this.commit(oldSha, tree.sha, `Renamed '${oldPath}' to '${newPath}'`))\n .then(({data: commit}) => this.updateHead(`heads/${branch}`, commit.sha, true, cb));\n }\n\n /**\n * Write a file to the repository\n * @see https://developer.github.com/v3/repos/contents/#update-a-file\n * @param {string} branch - the name of the branch\n * @param {string} path - the path for the file\n * @param {string} content - the contents of the file\n * @param {string} message - the commit message\n * @param {Object} [options] - commit options\n * @param {Object} [options.author] - the author of the commit\n * @param {Object} [options.commiter] - the committer\n * @param {boolean} [options.encode] - true if the content should be base64 encoded\n * @param {Requestable.callback} cb - will receive the new commit\n * @return {Promise} - the promise for the http request\n */\n writeFile(branch, path, content, message, options, cb) {\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n let filePath = path ? encodeURI(path) : '';\n let shouldEncode = options.encode !== false;\n let commit = {\n branch,\n message,\n author: options.author,\n committer: options.committer,\n content: shouldEncode ? Base64.encode(content) : content\n };\n\n return this.getSha(branch, filePath)\n .then((response) => {\n commit.sha = response.data.sha;\n return this._request('PUT', `/repos/${this.__fullname}/contents/${filePath}`, commit, cb);\n }, () => {\n return this._request('PUT', `/repos/${this.__fullname}/contents/${filePath}`, commit, cb);\n });\n }\n\n /**\n * Check if a repository is starred by you\n * @see https://developer.github.com/v3/activity/starring/#check-if-you-are-starring-a-repository\n * @param {Requestable.callback} cb - will receive true if the repository is starred and false if the repository\n * is not starred\n * @return {Promise} - the promise for the http request {Boolean} [description]\n */\n isStarred(cb) {\n return this._request204or404(`/user/starred/${this.__fullname}`, null, cb);\n }\n\n /**\n * Star a repository\n * @see https://developer.github.com/v3/activity/starring/#star-a-repository\n * @param {Requestable.callback} cb - will receive true if the repository is starred\n * @return {Promise} - the promise for the http request\n */\n star(cb) {\n return this._request('PUT', `/user/starred/${this.__fullname}`, null, cb);\n }\n\n /**\n * Unstar a repository\n * @see https://developer.github.com/v3/activity/starring/#unstar-a-repository\n * @param {Requestable.callback} cb - will receive true if the repository is unstarred\n * @return {Promise} - the promise for the http request\n */\n unstar(cb) {\n return this._request('DELETE', `/user/starred/${this.__fullname}`, null, cb);\n }\n\n /**\n * Create a new release\n * @see https://developer.github.com/v3/repos/releases/#create-a-release\n * @param {Object} options - the description of the release\n * @param {Requestable.callback} cb - will receive the newly created release\n * @return {Promise} - the promise for the http request\n */\n createRelease(options, cb) {\n return this._request('POST', `/repos/${this.__fullname}/releases`, options, cb);\n }\n\n /**\n * Edit a release\n * @see https://developer.github.com/v3/repos/releases/#edit-a-release\n * @param {string} id - the id of the release\n * @param {Object} options - the description of the release\n * @param {Requestable.callback} cb - will receive the modified release\n * @return {Promise} - the promise for the http request\n */\n updateRelease(id, options, cb) {\n return this._request('PATCH', `/repos/${this.__fullname}/releases/${id}`, options, cb);\n }\n\n /**\n * Get information about all releases\n * @see https://developer.github.com/v3/repos/releases/#list-releases-for-a-repository\n * @param {Requestable.callback} cb - will receive the release information\n * @return {Promise} - the promise for the http request\n */\n listReleases(cb) {\n return this._request('GET', `/repos/${this.__fullname}/releases`, null, cb);\n }\n\n /**\n * Get information about a release\n * @see https://developer.github.com/v3/repos/releases/#get-a-single-release\n * @param {strign} id - the id of the release\n * @param {Requestable.callback} cb - will receive the release information\n * @return {Promise} - the promise for the http request\n */\n getRelease(id, cb) {\n return this._request('GET', `/repos/${this.__fullname}/releases/${id}`, null, cb);\n }\n\n /**\n * Delete a release\n * @see https://developer.github.com/v3/repos/releases/#delete-a-release\n * @param {string} id - the release to be deleted\n * @param {Requestable.callback} cb - will receive true if the operation is successful\n * @return {Promise} - the promise for the http request\n */\n deleteRelease(id, cb) {\n return this._request('DELETE', `/repos/${this.__fullname}/releases/${id}`, null, cb);\n }\n\n /**\n * Merge a pull request\n * @see https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button\n * @param {number|string} number - the number of the pull request to merge\n * @param {Object} options - the merge options for the pull request\n * @param {Requestable.callback} [cb] - will receive the merge information if the operation is successful\n * @return {Promise} - the promise for the http request\n */\n mergePullRequest(number, options, cb) {\n return this._request('PUT', `/repos/${this.__fullname}/pulls/${number}/merge`, options, cb);\n }\n}\n\nmodule.exports = Repository;\n"],"file":"Repository.js"} \ No newline at end of file diff --git a/dist/components/Requestable.js b/dist/components/Requestable.js new file mode 100644 index 00000000..74316e94 --- /dev/null +++ b/dist/components/Requestable.js @@ -0,0 +1,385 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', 'request-extensible', 'request-http-cache', 'debug', 'js-base64', 'es6-promise'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('request-extensible'), require('request-http-cache'), require('debug'), require('js-base64'), require('es6-promise')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.requestExtensible, global.requestHttpCache, global.debug, global.jsBase64, global.Promise); + global.Requestable = mod.exports; + } +})(this, function (module, _requestExtensible, _requestHttpCache, _debug, _jsBase, _es6Promise) { + 'use strict'; + + var _requestExtensible2 = _interopRequireDefault(_requestExtensible); + + var _requestHttpCache2 = _interopRequireDefault(_requestHttpCache); + + var _debug2 = _interopRequireDefault(_debug); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; + } : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var httpRequestCache = new _requestHttpCache2.default({ + max: 256 * 1024 * 1024 // Maximum cache size (256mb) + }); + + var request = (0, _requestExtensible2.default)({ + extensions: [httpRequestCache.extension] + }); + + var log = (0, _debug2.default)('github:request'); + + if (typeof Promise === 'undefined') { + (0, _es6Promise.polyfill)(); + } + + /** + * The error structure returned when a network call fails + */ + + var ResponseError = function (_Error) { + _inherits(ResponseError, _Error); + + /** + * Construct a new ResponseError + * @param {string} message - an message to return instead of the the default error message + * @param {string} path - the requested path + * @param {Object} response - the object returned by Axios + */ + function ResponseError(message, path, response) { + _classCallCheck(this, ResponseError); + + var _this = _possibleConstructorReturn(this, (ResponseError.__proto__ || Object.getPrototypeOf(ResponseError)).call(this, message)); + + _this.path = path; + _this.request = response.config; + _this.response = response; + _this.status = response.status; + return _this; + } + + return ResponseError; + }(Error); + + var Requestable = function () { + /** + * Either a username and password or an oauth token for Github + * @typedef {Object} Requestable.auth + * @prop {string} [username] - the Github username + * @prop {string} [password] - the user's password + * @prop {token} [token] - an OAuth token + */ + /** + * Initialize the http internals. + * @param {Requestable.auth} [auth] - the credentials to authenticate to Github. If auth is + * not provided request will be made unauthenticated + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function Requestable(auth, apiBase) { + _classCallCheck(this, Requestable); + + this.__apiBase = apiBase || 'https://api.github.com'; + this.__auth = { + token: auth.token, + username: auth.username, + password: auth.password + }; + + if (auth.token) { + this.__authorizationHeader = 'token ' + auth.token; + } else if (auth.username && auth.password) { + this.__authorizationHeader = 'Basic ' + _jsBase.Base64.encode(auth.username + ':' + auth.password); + } + } + + /** + * Compute the URL to use to make a request. + * @private + * @param {string} path - either a URL relative to the API base or an absolute URL + * @return {string} - the URL to use + */ + + + _createClass(Requestable, [{ + key: '__getURL', + value: function __getURL(path) { + var url = path; + + if (path.indexOf('//') === -1) { + url = this.__apiBase + path; + } + + var newCacheBuster = 'timestamp=' + new Date().getTime(); + return url.replace(/(timestamp=\d+)/, newCacheBuster); + } + }, { + key: '__getRequestHeaders', + value: function __getRequestHeaders(raw) { + var headers = { + 'Accept': raw ? 'application/vnd.github.v3.raw+json' : 'application/vnd.github.v3+json', + 'Content-Type': 'application/json;charset=UTF-8' + }; + + if (this.__authorizationHeader) { + headers.Authorization = this.__authorizationHeader; + } + + return headers; + } + }, { + key: '_getOptionsWithDefaults', + value: function _getOptionsWithDefaults() { + var requestOptions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (!(requestOptions.visibility || requestOptions.affiliation)) { + requestOptions.type = requestOptions.type || 'all'; + } + requestOptions.sort = requestOptions.sort || 'updated'; + requestOptions.per_page = requestOptions.per_page || '100'; // eslint-disable-line + + return requestOptions; + } + }, { + key: '_dateToISO', + value: function _dateToISO(date) { + if (date && date instanceof Date) { + date = date.toISOString(); + } + + return date; + } + }, { + key: '_request', + value: function _request(method, path, data, cb, raw) { + var url = this.__getURL(path); + + var headers = this.__getRequestHeaders(raw); + // Failsafe check for directly making request from NodeJS + if (!headers['User-Agent']) { + headers['User-Agent'] = 'request'; + } + + var queryParams = {}; + var shouldUseDataAsParams = data && (typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' && methodHasNoBody(method); + if (shouldUseDataAsParams) { + queryParams = data; + data = undefined; + } + + var config = { + url: url, + method: method, + headers: headers, + params: queryParams, + data: data, + responseType: raw ? 'text' : 'json' + }; + + log(config.method + ' to ' + config.url); + + var requestPromise = new Promise(function (resolve, reject) { + request(config, function (err, response, body) { + var ret = { + status: response ? response.statusCode : null, + statusText: response ? response.statusMessage : null, + headers: response ? response.headers : null, + config: config + }; + if (err === null && response && response.statusCode >= 200 && response.statusCode < 300) { + if (raw) { + ret.data = body; + } else { + ret.data = JSON.parse(body); + } + resolve(ret); + } else { + ret.data = body; + callbackErrorOrRejectOrThrow(cb, reject, path)(ret); + } + }); + }); + // const requestPromise = axios(config).catch(callbackErrorOrThrow(cb, path)); + + if (cb) { + requestPromise.then(function (response) { + cb(null, response.data || true, response); + }); + } + + return requestPromise; + } + }, { + key: '_request204or404', + value: function _request204or404(path, data, cb) { + var method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'GET'; + + return this._request(method, path, data).then(function success(response) { + if (cb) { + cb(null, true, response); + } + return true; + }, function failure(response) { + if (response.status === 404) { + if (cb) { + cb(null, false, response); + } + return false; + } + + if (cb) { + cb(response); + } + throw response; + }); + } + }, { + key: '_requestAllPages', + value: function _requestAllPages(path, options, cb, results) { + var _this2 = this; + + results = results || []; + + return this._request('GET', path, options).then(function (response) { + var thisGroup = void 0; + if (response.data instanceof Array) { + thisGroup = response.data; + } else if (response.data.items instanceof Array) { + thisGroup = response.data.items; + } else { + var message = 'cannot figure out how to append ' + response.data + ' to the result set'; + throw new ResponseError(message, path, response); + } + results.push.apply(results, thisGroup); + + var nextUrl = getNextPage(response.headers.link); + if (nextUrl) { + log('getting next page: ' + nextUrl); + return _this2._requestAllPages(nextUrl, options, cb, results); + } + + if (cb) { + cb(null, results, response); + } + + response.data = results; + return response; + }).catch(callbackErrorOrRejectOrThrow(cb, null, path)); + } + }]); + + return Requestable; + }(); + + module.exports = Requestable; + + // ////////////////////////// // + // Private helper functions // + // ////////////////////////// // + var METHODS_WITH_NO_BODY = ['GET', 'HEAD', 'DELETE']; + function methodHasNoBody(method) { + return METHODS_WITH_NO_BODY.indexOf(method) !== -1; + } + + function getNextPage() { + var linksHeader = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + + var links = linksHeader.split(/\s*,\s*/); // splits and strips the urls + return links.reduce(function (nextUrl, link) { + if (link.search(/rel="next"/) !== -1) { + return (link.match(/<(.*)>/) || [])[1]; + } + + return nextUrl; + }, undefined); + } + + function callbackErrorOrRejectOrThrow(cb, reject, path) { + return function handler(object) { + var error = void 0; + if (object.hasOwnProperty('config')) { + var status = object.status, + statusText = object.statusText, + _object$config = object.config, + method = _object$config.method, + url = _object$config.url; + + var message = status + ' error making request ' + method + ' ' + url + ': "' + statusText + '"'; + error = new ResponseError(message, path, object); + log(message + ' ' + JSON.stringify(object.data)); + } else { + error = object; + } + if (cb) { + log('going to error callback'); + cb(error); + } else if (reject) { + reject(error); + } else { + log('throwing error'); + throw error; + } + }; + } +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlJlcXVlc3RhYmxlLmpzIl0sIm5hbWVzIjpbImh0dHBSZXF1ZXN0Q2FjaGUiLCJSZXF1ZXN0SHR0cENhY2hlIiwibWF4IiwicmVxdWVzdCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJsb2ciLCJQcm9taXNlIiwiUmVzcG9uc2VFcnJvciIsIm1lc3NhZ2UiLCJwYXRoIiwicmVzcG9uc2UiLCJjb25maWciLCJzdGF0dXMiLCJFcnJvciIsIlJlcXVlc3RhYmxlIiwiYXV0aCIsImFwaUJhc2UiLCJfX2FwaUJhc2UiLCJfX2F1dGgiLCJ0b2tlbiIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJfX2F1dGhvcml6YXRpb25IZWFkZXIiLCJCYXNlNjQiLCJlbmNvZGUiLCJ1cmwiLCJpbmRleE9mIiwibmV3Q2FjaGVCdXN0ZXIiLCJEYXRlIiwiZ2V0VGltZSIsInJlcGxhY2UiLCJyYXciLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsInJlcXVlc3RPcHRpb25zIiwidmlzaWJpbGl0eSIsImFmZmlsaWF0aW9uIiwidHlwZSIsInNvcnQiLCJwZXJfcGFnZSIsImRhdGUiLCJ0b0lTT1N0cmluZyIsIm1ldGhvZCIsImRhdGEiLCJjYiIsIl9fZ2V0VVJMIiwiX19nZXRSZXF1ZXN0SGVhZGVycyIsInF1ZXJ5UGFyYW1zIiwic2hvdWxkVXNlRGF0YUFzUGFyYW1zIiwibWV0aG9kSGFzTm9Cb2R5IiwidW5kZWZpbmVkIiwicGFyYW1zIiwicmVzcG9uc2VUeXBlIiwicmVxdWVzdFByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZXJyIiwiYm9keSIsInJldCIsInN0YXR1c0NvZGUiLCJzdGF0dXNUZXh0Iiwic3RhdHVzTWVzc2FnZSIsIkpTT04iLCJwYXJzZSIsImNhbGxiYWNrRXJyb3JPclJlamVjdE9yVGhyb3ciLCJ0aGVuIiwiX3JlcXVlc3QiLCJzdWNjZXNzIiwiZmFpbHVyZSIsIm9wdGlvbnMiLCJyZXN1bHRzIiwidGhpc0dyb3VwIiwiQXJyYXkiLCJpdGVtcyIsInB1c2giLCJhcHBseSIsIm5leHRVcmwiLCJnZXROZXh0UGFnZSIsImxpbmsiLCJfcmVxdWVzdEFsbFBhZ2VzIiwiY2F0Y2giLCJtb2R1bGUiLCJleHBvcnRzIiwiTUVUSE9EU19XSVRIX05PX0JPRFkiLCJsaW5rc0hlYWRlciIsImxpbmtzIiwic3BsaXQiLCJyZWR1Y2UiLCJzZWFyY2giLCJtYXRjaCIsImhhbmRsZXIiLCJvYmplY3QiLCJlcnJvciIsImhhc093blByb3BlcnR5Iiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhQSxPQUFNQSxtQkFBbUIsSUFBSUMsMEJBQUosQ0FBcUI7QUFDNUNDLFdBQUssTUFBSSxJQUFKLEdBQVMsSUFEOEIsQ0FDekI7QUFEeUIsSUFBckIsQ0FBekI7O0FBSUEsT0FBTUMsVUFBVSxpQ0FBVztBQUN6QkMsa0JBQVksQ0FBRUosaUJBQWlCSyxTQUFuQjtBQURhLElBQVgsQ0FBaEI7O0FBSUEsT0FBTUMsTUFBTSxxQkFBTSxnQkFBTixDQUFaOztBQUVBLE9BQUksT0FBT0MsT0FBUCxLQUFtQixXQUF2QixFQUFvQztBQUNqQztBQUNGOztBQUVEOzs7O09BR01DLGE7OztBQUNIOzs7Ozs7QUFNQSw2QkFBWUMsT0FBWixFQUFxQkMsSUFBckIsRUFBMkJDLFFBQTNCLEVBQXFDO0FBQUE7O0FBQUEsbUlBQzVCRixPQUQ0Qjs7QUFFbEMsZUFBS0MsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsZUFBS1AsT0FBTCxHQUFlUSxTQUFTQyxNQUF4QjtBQUNBLGVBQUtELFFBQUwsR0FBZ0JBLFFBQWhCO0FBQ0EsZUFBS0UsTUFBTCxHQUFjRixTQUFTRSxNQUF2QjtBQUxrQztBQU1wQzs7O0tBYndCQyxLOztPQW1CdEJDLFc7QUFDSDs7Ozs7OztBQU9BOzs7Ozs7QUFNQSwyQkFBWUMsSUFBWixFQUFrQkMsT0FBbEIsRUFBMkI7QUFBQTs7QUFDeEIs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S0FBSDtBQUNGLFVBSEQsTUFHTyxJQUFJckMsTUFBSixFQUFZO0FBQ2pCQSxtQkFBT3FDLEtBQVA7QUFDRCxVQUZNLE1BRUE7QUFDSnZGLGdCQUFJLGdCQUFKO0FBQ0Esa0JBQU11RixLQUFOO0FBQ0Y7QUFDSCxPQW5CRDtBQW9CRiIsImZpbGUiOiJSZXF1ZXN0YWJsZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqIEBjb3B5cmlnaHQgIDIwMTYgWWFob28gSW5jLlxuICogQGxpY2Vuc2UgICAgTGljZW5zZWQgdW5kZXIge0BsaW5rIGh0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlLUNsZWFyLmh0bWwgQlNELTMtQ2xhdXNlLUNsZWFyfS5cbiAqICAgICAgICAgICAgIEdpdGh1Yi5qcyBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZS5cbiAqL1xuXG5pbXBvcnQgcmVxdWVzdEV4dCBmcm9tICdyZXF1ZXN0LWV4dGVuc2libGUnO1xuaW1wb3J0IFJlcXVlc3RIdHRwQ2FjaGUgZnJvbSAncmVxdWVzdC1odHRwLWNhY2hlJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQge0Jhc2U2NH0gZnJvbSAnanMtYmFzZTY0JztcbmltcG9ydCB7cG9seWZpbGx9IGZyb20gJ2VzNi1wcm9taXNlJztcblxuY29uc3QgaHR0cFJlcXVlc3RDYWNoZSA9IG5ldyBSZXF1ZXN0SHR0cENhY2hlKHtcbiAgbWF4OiAyNTYqMTAyNCoxMDI0IC8vIE1heGltdW0gY2FjaGUgc2l6ZSAoMjU2bWIpXG59KTtcblxuY29uc3QgcmVxdWVzdCA9IHJlcXVlc3RFeHQoe1xuICBleHRlbnNpb25zOiBbIGh0dHBSZXF1ZXN0Q2FjaGUuZXh0ZW5zaW9uIF1cbn0pO1xuXG5jb25zdCBsb2cgPSBkZWJ1ZygnZ2l0aHViOnJlcXVlc3QnKTtcblxuaWYgKHR5cGVvZiBQcm9taXNlID09PSAndW5kZWZpbmVkJykge1xuICAgcG9seWZpbGwoKTtcbn1cblxuLyoqXG4gKiBUaGUgZXJyb3Igc3RydWN0dXJlIHJldHVybmVkIHdoZW4gYSBuZXR3b3JrIGNhbGwgZmFpbHNcbiAqL1xuY2xhc3MgUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgIC8qKlxuICAgICogQ29uc3RydWN0IGEgbmV3IFJlc3BvbnNlRXJyb3JcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gYW4gbWVzc2FnZSB0byByZXR1cm4gaW5zdGVhZCBvZiB0aGUgdGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSB0aGUgcmVxdWVzdGVkIHBhdGhcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSAtIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgQXhpb3NcbiAgICAqL1xuICAgY29uc3RydWN0b3IobWVzc2FnZSwgcGF0aCwgcmVzcG9uc2UpIHtcbiAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgIHRoaXMucmVxdWVzdCA9IHJlc3BvbnNlLmNvbmZpZztcbiAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgIHRoaXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgfVxufVxuXG4vKipcbiAqIFJlcXVlc3RhYmxlIHdyYXBzIHRoZSBsb2dpYyBmb3IgbWFraW5nIGh0dHAgcmVxdWVzdHMgdG8gdGhlIEFQSVxuICovXG5jbGFzcyBSZXF1ZXN0YWJsZSB7XG4gICAvKipcbiAgICAqIEVpdGhlciBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBvciBhbiBvYXV0aCB0b2tlbiBmb3IgR2l0aHViXG4gICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBSZXF1ZXN0YWJsZS5hdXRoXG4gICAgKiBAcHJvcCB7c3RyaW5nfSBbdXNlcm5hbWVdIC0gdGhlIEdpdGh1YiB1c2VybmFtZVxuICAgICogQHByb3Age3N0cmluZ30gW3Bhc3N3b3JkXSAtIHRoZSB1c2VyJ3MgcGFzc3dvcmRcbiAgICAqIEBwcm9wIHt0b2tlbn0gW3Rva2VuXSAtIGFuIE9BdXRoIHRva2VuXG4gICAgKi9cbiAgIC8qKlxuICAgICogSW5pdGlhbGl6ZSB0aGUgaHR0cCBpbnRlcm5hbHMuXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmF1dGh9IFthdXRoXSAtIHRoZSBjcmVkZW50aWFscyB0byBhdXRoZW50aWNhdGUgdG8gR2l0aHViLiBJZiBhdXRoIGlzXG4gICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcHJvdmlkZWQgcmVxdWVzdCB3aWxsIGJlIG1hZGUgdW5hdXRoZW50aWNhdGVkXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW2FwaUJhc2U9aHR0cHM6Ly9hcGkuZ2l0aHViLmNvbV0gLSB0aGUgYmFzZSBHaXRodWIgQVBJIFVSTFxuICAgICovXG4gICBjb25zdHJ1Y3RvcihhdXRoLCBhcGlCYXNlKSB7XG4gICAgICB0aGlzLl9fYXBpQmFzZSA9IGFwaUJhc2UgfHwgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20nO1xuICAgICAgdGhpcy5fX2F1dGggPSB7XG4gICAgICAgICB0b2tlbjogYXV0aC50b2tlbixcbiAgICAgICAgIHVzZXJuYW1lOiBhdXRoLnVzZXJuYW1lLFxuICAgICAgICAgcGFzc3dvcmQ6IGF1dGgucGFzc3dvcmRcbiAgICAgIH07XG5cbiAgICAgIGlmIChhdXRoLnRva2VuKSB7XG4gICAgICAgICB0aGlzLl9fYXV0aG9yaXphdGlvbkhlYWRlciA9ICd0b2tlbiAnICsgYXV0aC50b2tlbjtcbiAgICAgIH0gZWxzZSBpZiAoYXV0aC51c2VybmFtZSAmJiBhdXRoLnBhc3N3b3JkKSB7XG4gICAgICAgICB0aGlzLl9fYXV0aG9yaXphdGlvbkhlYWRlciA9ICdCYXNpYyAnICsgQmFzZTY0LmVuY29kZShhdXRoLnVzZXJuYW1lICsgJzonICsgYXV0aC5wYXNzd29yZCk7XG4gICAgICB9XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ29tcHV0ZSB0aGUgVVJMIHRvIHVzZSB0byBtYWtlIGEgcmVxdWVzdC5cbiAgICAqIEBwcml2YXRlXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIGVpdGhlciBhIFVSTCByZWxhdGl2ZSB0byB0aGUgQVBJIGJhc2Ugb3IgYW4gYWJzb2x1dGUgVVJMXG4gICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gdGhlIFVSTCB0byB1c2VcbiAgICAqL1xuICAgX19nZXRVUkwocGF0aCkge1xuICAgICAgbGV0IHVybCA9IHBhdGg7XG5cbiAgICAgIGlmIChwYXRoLmluZGV4T2YoJy8vJykgPT09IC0xKSB7XG4gICAgICAgICB1cmwgPSB0aGlzLl9fYXBpQmFzZSArIHBhdGg7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdDYWNoZUJ1c3RlciA9ICd0aW1lc3RhbXA9JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKC8odGltZXN0YW1wPVxcZCspLywgbmV3Q2FjaGVCdXN0ZXIpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENvbXB1dGUgdGhlIGhlYWRlcnMgcmVxdWlyZWQgZm9yIGFuIEFQSSByZXF1ZXN0LlxuICAgICogQHByaXZhdGVcbiAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmF3IC0gaWYgdGhlIHJlcXVlc3Qgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgSlNPTiBvciBhcyBhIHJhdyByZXF1ZXN0XG4gICAgKiBAcmV0dXJuIHtPYmplY3R9IC0gdGhlIGhlYWRlcnMgdG8gdXNlIGluIHRoZSByZXF1ZXN0XG4gICAgKi9cbiAgIF9fZ2V0UmVxdWVzdEhlYWRlcnMocmF3KSB7XG4gICAgICBsZXQgaGVhZGVycyA9IHtcbiAgICAgICAgICdBY2NlcHQnOiByYXcgPyAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52My5yYXcranNvbicgOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yi52Mytqc29uJyxcbiAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04J1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuX19hdXRob3JpemF0aW9uSGVhZGVyKSB7XG4gICAgICAgICBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSB0aGlzLl9fYXV0aG9yaXphdGlvbkhlYWRlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICB9XG5cbiAgIC8qKlxuICAgICogU2V0cyB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciBBUEkgcmVxdWVzdHNcbiAgICAqIEBwcm90ZWN0ZWRcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdE9wdGlvbnM9e31dIC0gdGhlIGN1cnJlbnQgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3RcbiAgICAqIEByZXR1cm4ge09iamVjdH0gLSB0aGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSByZXF1ZXN0XG4gICAgKi9cbiAgIF9nZXRPcHRpb25zV2l0aERlZmF1bHRzKHJlcXVlc3RPcHRpb25zID0ge30pIHtcbiAgICAgIGlmICghKHJlcXVlc3RPcHRpb25zLnZpc2liaWxpdHkgfHwgcmVxdWVzdE9wdGlvbnMuYWZmaWxpYXRpb24pKSB7XG4gICAgICAgICByZXF1ZXN0T3B0aW9ucy50eXBlID0gcmVxdWVzdE9wdGlvbnMudHlwZSB8fCAnYWxsJztcbiAgICAgIH1cbiAgICAgIHJlcXVlc3RPcHRpb25zLnNvcnQgPSByZXF1ZXN0T3B0aW9ucy5zb3J0IHx8ICd1cGRhdGVkJztcbiAgICAgIHJlcXVlc3RPcHRpb25zLnBlcl9wYWdlID0gcmVxdWVzdE9wdGlvbnMucGVyX3BhZ2UgfHwgJzEwMCc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblxuICAgICAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xuICAgfVxuXG4gICAvKipcbiAgICAqIGlmIGEgYERhdGVgIGlzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGFuIElTTyBzdHJpbmdcbiAgICAqIEBwYXJhbSB7Kn0gZGF0ZSAtIHRoZSBvYmplY3QgdG8gYXR0ZW1wdCB0byBjb29lcmNlIGludG8gYW4gSVNPIGRhdGUgc3RyaW5nXG4gICAgKiBAcmV0dXJuIHtzdHJpbmd9IC0gdGhlIElTTyByZXByZXNlbnRhdGlvbiBvZiBgZGF0ZWAgb3Igd2hhdGV2ZXIgd2FzIHBhc3NlZCBpbiBpZiBpdCB3YXMgbm90IGEgZGF0ZVxuICAgICovXG4gICBfZGF0ZVRvSVNPKGRhdGUpIHtcbiAgICAgIGlmIChkYXRlICYmIChkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgIGRhdGUgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRlO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEEgZnVuY3Rpb24gdGhhdCByZWNlaXZlcyB0aGUgcmVzdWx0IG9mIHRoZSBBUEkgcmVxdWVzdC5cbiAgICAqIEBjYWxsYmFjayBSZXF1ZXN0YWJsZS5jYWxsYmFja1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5FcnJvcn0gZXJyb3IgLSB0aGUgZXJyb3IgcmV0dXJuZWQgYnkgdGhlIEFQSSBvciBgbnVsbGBcbiAgICAqIEBwYXJhbSB7KE9iamVjdHx0cnVlKX0gcmVzdWx0IC0gdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIEFQSSBvciBgdHJ1ZWAgaWYgdGhlIEFQSSByZXR1cm5zIGAyMDQgTm8gQ29udGVudGBcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0IC0gdGhlIHJhdyB7QGxpbmtjb2RlIGh0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zI3Jlc3BvbnNlLXNjaGVtYSBSZXNwb25zZX1cbiAgICAqL1xuICAgLyoqXG4gICAgKiBNYWtlIGEgcmVxdWVzdC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgLSB0aGUgbWV0aG9kIGZvciB0aGUgcmVxdWVzdCAoR0VULCBQVVQsIFBPU1QsIERFTEVURSlcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gdGhlIHBhdGggZm9yIHRoZSByZXF1ZXN0XG4gICAgKiBAcGFyYW0geyp9IFtkYXRhXSAtIHRoZSBkYXRhIHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gRm9yIEhUVFAgbWV0aG9kcyB0aGF0IGRvbid0IGhhdmUgYSBib2R5IHRoZSBkYXRhXG4gICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHNlbnQgYXMgcXVlcnkgcGFyYW1ldGVyc1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHRoZSBjYWxsYmFjayBmb3IgdGhlIHJlcXVlc3RcbiAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jhdz1mYWxzZV0gLSBpZiB0aGUgcmVxdWVzdCBzaG91bGQgYmUgc2VudCBhcyByYXcuIElmIHRoaXMgaXMgYSBmYWxzeSB2YWx1ZSB0aGVuIHRoZVxuICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHdpbGwgYmUgbWFkZSBhcyBKU09OXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBQcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIF9yZXF1ZXN0KG1ldGhvZCwgcGF0aCwgZGF0YSwgY2IsIHJhdykge1xuICAgICAgY29uc3QgdXJsID0gdGhpcy5fX2dldFVSTChwYXRoKTtcblxuICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLl9fZ2V0UmVxdWVzdEhlYWRlcnMocmF3KTtcbiAgICAgIC8vIEZhaWxzYWZlIGNoZWNrIGZvciBkaXJlY3RseSBtYWtpbmcgcmVxdWVzdCBmcm9tIE5vZGVKU1xuICAgICAgaWYoIWhlYWRlcnNbJ1VzZXItQWdlbnQnXSkge1xuICAgICAgICBoZWFkZXJzWydVc2VyLUFnZW50J10gPSAncmVxdWVzdCc7XG4gICAgICB9XG5cbiAgICAgIGxldCBxdWVyeVBhcmFtcyA9IHt9O1xuICAgICAgY29uc3Qgc2hvdWxkVXNlRGF0YUFzUGFyYW1zID0gZGF0YSAmJiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSAmJiBtZXRob2RIYXNOb0JvZHkobWV0aG9kKTtcbiAgICAgIGlmIChzaG91bGRVc2VEYXRhQXNQYXJhbXMpIHtcbiAgICAgICAgIHF1ZXJ5UGFyYW1zID0gZGF0YTtcbiAgICAgICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtcyxcbiAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICByZXNwb25zZVR5cGU6IHJhdyA/ICd0ZXh0JyA6ICdqc29uJ1xuICAgICAgfTtcblxuICAgICAgbG9nKGAke2NvbmZpZy5tZXRob2R9IHRvICR7Y29uZmlnLnVybH1gKTtcblxuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlcXVlc3QoY29uZmlnLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlLCBib2R5KSB7XG4gICAgICAgICAgbGV0IHJldCA9IHtcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2U/cmVzcG9uc2Uuc3RhdHVzQ29kZTpudWxsLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2U/cmVzcG9uc2Uuc3RhdHVzTWVzc2FnZTpudWxsLFxuICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2U/cmVzcG9uc2UuaGVhZGVyczpudWxsLFxuICAgICAgICAgICAgY29uZmlnOiBjb25maWdcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZXJyID09PSBudWxsICYmIHJlc3BvbnNlICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDApIHtcbiAgICAgICAgICAgIGlmKHJhdykge1xuICAgICAgICAgICAgICByZXQuZGF0YSA9IGJvZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0LmRhdGEgPSBKU09OLnBhcnNlKGJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldC5kYXRhID0gYm9keTtcbiAgICAgICAgICAgIGNhbGxiYWNrRXJyb3JPclJlamVjdE9yVGhyb3coY2IsIHJlamVjdCwgcGF0aCkocmV0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IGF4aW9zKGNvbmZpZykuY2F0Y2goY2FsbGJhY2tFcnJvck9yVGhyb3coY2IsIHBhdGgpKTtcblxuICAgICAgaWYgKGNiKSB7XG4gICAgICAgICByZXF1ZXN0UHJvbWlzZS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgY2IobnVsbCwgcmVzcG9uc2UuZGF0YSB8fCB0cnVlLCByZXNwb25zZSk7XG4gICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcXVlc3RQcm9taXNlO1xuICAgfVxuXG4gICAvKipcbiAgICAqIE1ha2UgYSByZXF1ZXN0IHRvIGFuIGVuZHBvaW50IHRoZSByZXR1cm5zIDIwNCB3aGVuIHRydWUgYW5kIDQwNCB3aGVuIGZhbHNlXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIHRoZSBwYXRoIHRvIHJlcXVlc3RcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gYW55IHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0XG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBjYiAtIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBgdHJ1ZWAgb3IgYGZhbHNlYFxuICAgICogQHBhcmFtIHttZXRob2R9IFttZXRob2Q9R0VUXSAtIEhUVFAgTWV0aG9kIHRvIHVzZVxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBfcmVxdWVzdDIwNG9yNDA0KHBhdGgsIGRhdGEsIGNiLCBtZXRob2QgPSAnR0VUJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QobWV0aG9kLCBwYXRoLCBkYXRhKVxuICAgICAgICAgLnRoZW4oZnVuY3Rpb24gc3VjY2VzcyhyZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICBjYihudWxsLCB0cnVlLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgIH0sIGZ1bmN0aW9uIGZhaWx1cmUocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgICBjYihudWxsLCBmYWxzZSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgICAgIGNiKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IHJlc3BvbnNlO1xuICAgICAgICAgfSk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTWFrZSBhIHJlcXVlc3QgYW5kIGZldGNoIGFsbCB0aGUgYXZhaWxhYmxlIGRhdGEuIEdpdGh1YiB3aWxsIHBhZ2luYXRlIHJlc3BvbnNlcyBzbyBmb3IgcXVlcmllc1xuICAgICogdGhhdCBtaWdodCBzcGFuIG11bHRpcGxlIHBhZ2VzIHRoaXMgbWV0aG9kIGlzIHByZWZlcnJlZCB0byB7QGxpbmsgUmVxdWVzdGFibGUjcmVxdWVzdH1cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gdGhlIHBhdGggdG8gcmVxdWVzdFxuICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB0aGUgcXVlcnkgcGFyYW1ldGVycyB0byBpbmNsdWRlXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gdGhlIGZ1bmN0aW9uIHRvIHJlY2VpdmUgdGhlIGRhdGEuIFRoZSByZXR1cm5lZCBkYXRhIHdpbGwgYWx3YXlzIGJlIGFuIGFycmF5LlxuICAgICogQHBhcmFtIHtPYmplY3RbXX0gcmVzdWx0cyAtIHRoZSBwYXJ0aWFsIHJlc3VsdHMuIFRoaXMgYXJndW1lbnQgaXMgaW50ZW5kZWQgZm9yIGludGVyYWwgdXNlIG9ubHkuXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIGEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgd2hlbiBhbGwgcGFnZXMgaGF2ZSBiZWVuIGZldGNoZWRcbiAgICAqIEBkZXByZWNhdGVkIFRoaXMgd2lsbCBiZSBmb2xkZWQgaW50byB7QGxpbmsgUmVxdWVzdGFibGUjX3JlcXVlc3R9IGluIHRoZSAyLjAgcmVsZWFzZS5cbiAgICAqL1xuICAgX3JlcXVlc3RBbGxQYWdlcyhwYXRoLCBvcHRpb25zLCBjYiwgcmVzdWx0cykge1xuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBwYXRoLCBvcHRpb25zKVxuICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGhpc0dyb3VwO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgdGhpc0dyb3VwID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZGF0YS5pdGVtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICAgICB0aGlzR3JvdXAgPSByZXNwb25zZS5kYXRhLml0ZW1zO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYGNhbm5vdCBmaWd1cmUgb3V0IGhvdyB0byBhcHBlbmQgJHtyZXNwb25zZS5kYXRhfSB0byB0aGUgcmVzdWx0IHNldGA7XG4gICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VFcnJvcihtZXNzYWdlLCBwYXRoLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnB1c2guYXBwbHkocmVzdWx0cywgdGhpc0dyb3VwKTtcblxuICAgICAgICAgICAgY29uc3QgbmV4dFVybCA9IGdldE5leHRQYWdlKHJlc3BvbnNlLmhlYWRlcnMubGluayk7XG4gICAgICAgICAgICBpZiAobmV4dFVybCkge1xuICAgICAgICAgICAgICAgbG9nKGBnZXR0aW5nIG5leHQgcGFnZTogJHtuZXh0VXJsfWApO1xuICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RBbGxQYWdlcyhuZXh0VXJsLCBvcHRpb25zLCBjYiwgcmVzdWx0cyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgICAgY2IobnVsbCwgcmVzdWx0cywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNwb25zZS5kYXRhID0gcmVzdWx0cztcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgIH0pLmNhdGNoKGNhbGxiYWNrRXJyb3JPclJlamVjdE9yVGhyb3coY2IsIG51bGwsIHBhdGgpKTtcbiAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZXF1ZXN0YWJsZTtcblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gLy9cbi8vICBQcml2YXRlIGhlbHBlciBmdW5jdGlvbnMgIC8vXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAvL1xuY29uc3QgTUVUSE9EU19XSVRIX05PX0JPRFkgPSBbJ0dFVCcsICdIRUFEJywgJ0RFTEVURSddO1xuZnVuY3Rpb24gbWV0aG9kSGFzTm9Cb2R5KG1ldGhvZCkge1xuICAgcmV0dXJuIE1FVEhPRFNfV0lUSF9OT19CT0RZLmluZGV4T2YobWV0aG9kKSAhPT0gLTE7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRQYWdlKGxpbmtzSGVhZGVyID0gJycpIHtcbiAgIGNvbnN0IGxpbmtzID0gbGlua3NIZWFkZXIuc3BsaXQoL1xccyosXFxzKi8pOyAvLyBzcGxpdHMgYW5kIHN0cmlwcyB0aGUgdXJsc1xuICAgcmV0dXJuIGxpbmtzLnJlZHVjZShmdW5jdGlvbihuZXh0VXJsLCBsaW5rKSB7XG4gICAgICBpZiAobGluay5zZWFyY2goL3JlbD1cIm5leHRcIi8pICE9PSAtMSkge1xuICAgICAgICAgcmV0dXJuIChsaW5rLm1hdGNoKC88KC4qKT4vKSB8fCBbXSlbMV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0VXJsO1xuICAgfSwgdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gY2FsbGJhY2tFcnJvck9yUmVqZWN0T3JUaHJvdyhjYiwgcmVqZWN0LCBwYXRoKSB7XG4gICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihvYmplY3QpIHtcbiAgICAgIGxldCBlcnJvcjtcbiAgICAgIGlmIChvYmplY3QuaGFzT3duUHJvcGVydHkoJ2NvbmZpZycpKSB7XG4gICAgICAgICBjb25zdCB7c3RhdHVzLCBzdGF0dXNUZXh0LCBjb25maWc6IHttZXRob2QsIHVybH19ID0gb2JqZWN0O1xuICAgICAgICAgbGV0IG1lc3NhZ2UgPSAoYCR7c3RhdHVzfSBlcnJvciBtYWtpbmcgcmVxdWVzdCAke21ldGhvZH0gJHt1cmx9OiBcIiR7c3RhdHVzVGV4dH1cImApO1xuICAgICAgICAgZXJyb3IgPSBuZXcgUmVzcG9uc2VFcnJvcihtZXNzYWdlLCBwYXRoLCBvYmplY3QpO1xuICAgICAgICAgbG9nKGAke21lc3NhZ2V9ICR7SlNPTi5zdHJpbmdpZnkob2JqZWN0LmRhdGEpfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGVycm9yID0gb2JqZWN0O1xuICAgICAgfVxuICAgICAgaWYgKGNiKSB7XG4gICAgICAgICBsb2coJ2dvaW5nIHRvIGVycm9yIGNhbGxiYWNrJyk7XG4gICAgICAgICBjYihlcnJvcik7XG4gICAgICB9IGVsc2UgaWYgKHJlamVjdCkge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGxvZygndGhyb3dpbmcgZXJyb3InKTtcbiAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgfTtcbn1cbiJdfQ== +//# sourceMappingURL=Requestable.js.map diff --git a/dist/components/Requestable.js.map b/dist/components/Requestable.js.map new file mode 100644 index 00000000..88123f8e --- /dev/null +++ b/dist/components/Requestable.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["Requestable.js"],"sourcesContent":["/**\n * @file\n * @copyright 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport requestExt from 'request-extensible';\nimport RequestHttpCache from 'request-http-cache';\nimport debug from 'debug';\nimport {Base64} from 'js-base64';\nimport {polyfill} from 'es6-promise';\n\nconst httpRequestCache = new RequestHttpCache({\n max: 256*1024*1024 // Maximum cache size (256mb)\n});\n\nconst request = requestExt({\n extensions: [ httpRequestCache.extension ]\n});\n\nconst log = debug('github:request');\n\nif (typeof Promise === 'undefined') {\n polyfill();\n}\n\n/**\n * The error structure returned when a network call fails\n */\nclass ResponseError extends Error {\n /**\n * Construct a new ResponseError\n * @param {string} message - an message to return instead of the the default error message\n * @param {string} path - the requested path\n * @param {Object} response - the object returned by Axios\n */\n constructor(message, path, response) {\n super(message);\n this.path = path;\n this.request = response.config;\n this.response = response;\n this.status = response.status;\n }\n}\n\n/**\n * Requestable wraps the logic for making http requests to the API\n */\nclass Requestable {\n /**\n * Either a username and password or an oauth token for Github\n * @typedef {Object} Requestable.auth\n * @prop {string} [username] - the Github username\n * @prop {string} [password] - the user's password\n * @prop {token} [token] - an OAuth token\n */\n /**\n * Initialize the http internals.\n * @param {Requestable.auth} [auth] - the credentials to authenticate to Github. If auth is\n * not provided request will be made unauthenticated\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(auth, apiBase) {\n this.__apiBase = apiBase || 'https://api.github.com';\n this.__auth = {\n token: auth.token,\n username: auth.username,\n password: auth.password\n };\n\n if (auth.token) {\n this.__authorizationHeader = 'token ' + auth.token;\n } else if (auth.username && auth.password) {\n this.__authorizationHeader = 'Basic ' + Base64.encode(auth.username + ':' + auth.password);\n }\n }\n\n /**\n * Compute the URL to use to make a request.\n * @private\n * @param {string} path - either a URL relative to the API base or an absolute URL\n * @return {string} - the URL to use\n */\n __getURL(path) {\n let url = path;\n\n if (path.indexOf('//') === -1) {\n url = this.__apiBase + path;\n }\n\n let newCacheBuster = 'timestamp=' + new Date().getTime();\n return url.replace(/(timestamp=\\d+)/, newCacheBuster);\n }\n\n /**\n * Compute the headers required for an API request.\n * @private\n * @param {boolean} raw - if the request should be treated as JSON or as a raw request\n * @return {Object} - the headers to use in the request\n */\n __getRequestHeaders(raw) {\n let headers = {\n 'Accept': raw ? 'application/vnd.github.v3.raw+json' : 'application/vnd.github.v3+json',\n 'Content-Type': 'application/json;charset=UTF-8'\n };\n\n if (this.__authorizationHeader) {\n headers.Authorization = this.__authorizationHeader;\n }\n\n return headers;\n }\n\n /**\n * Sets the default options for API requests\n * @protected\n * @param {Object} [requestOptions={}] - the current options for the request\n * @return {Object} - the options to pass to the request\n */\n _getOptionsWithDefaults(requestOptions = {}) {\n if (!(requestOptions.visibility || requestOptions.affiliation)) {\n requestOptions.type = requestOptions.type || 'all';\n }\n requestOptions.sort = requestOptions.sort || 'updated';\n requestOptions.per_page = requestOptions.per_page || '100'; // eslint-disable-line\n\n return requestOptions;\n }\n\n /**\n * if a `Date` is passed to this function it will be converted to an ISO string\n * @param {*} date - the object to attempt to cooerce into an ISO date string\n * @return {string} - the ISO representation of `date` or whatever was passed in if it was not a date\n */\n _dateToISO(date) {\n if (date && (date instanceof Date)) {\n date = date.toISOString();\n }\n\n return date;\n }\n\n /**\n * A function that receives the result of the API request.\n * @callback Requestable.callback\n * @param {Requestable.Error} error - the error returned by the API or `null`\n * @param {(Object|true)} result - the data returned by the API or `true` if the API returns `204 No Content`\n * @param {Object} request - the raw {@linkcode https://github.com/mzabriskie/axios#response-schema Response}\n */\n /**\n * Make a request.\n * @param {string} method - the method for the request (GET, PUT, POST, DELETE)\n * @param {string} path - the path for the request\n * @param {*} [data] - the data to send to the server. For HTTP methods that don't have a body the data\n * will be sent as query parameters\n * @param {Requestable.callback} [cb] - the callback for the request\n * @param {boolean} [raw=false] - if the request should be sent as raw. If this is a falsy value then the\n * request will be made as JSON\n * @return {Promise} - the Promise for the http request\n */\n _request(method, path, data, cb, raw) {\n const url = this.__getURL(path);\n\n let headers = this.__getRequestHeaders(raw);\n // Failsafe check for directly making request from NodeJS\n if(!headers['User-Agent']) {\n headers['User-Agent'] = 'request';\n }\n\n let queryParams = {};\n const shouldUseDataAsParams = data && (typeof data === 'object') && methodHasNoBody(method);\n if (shouldUseDataAsParams) {\n queryParams = data;\n data = undefined;\n }\n\n const config = {\n url: url,\n method: method,\n headers: headers,\n params: queryParams,\n data: data,\n responseType: raw ? 'text' : 'json'\n };\n\n log(`${config.method} to ${config.url}`);\n\n const requestPromise = new Promise((resolve, reject) => {\n request(config, function(err, response, body) {\n let ret = {\n status: response?response.statusCode:null,\n statusText: response?response.statusMessage:null,\n headers: response?response.headers:null,\n config: config\n }\n if(err === null && response && response.statusCode >= 200 && response.statusCode < 300) {\n if(raw) {\n ret.data = body;\n }\n else {\n ret.data = JSON.parse(body);\n }\n resolve(ret);\n }\n else {\n ret.data = body;\n callbackErrorOrRejectOrThrow(cb, reject, path)(ret);\n }\n });\n });\n // const requestPromise = axios(config).catch(callbackErrorOrThrow(cb, path));\n\n if (cb) {\n requestPromise.then((response) => {\n cb(null, response.data || true, response);\n });\n }\n\n return requestPromise;\n }\n\n /**\n * Make a request to an endpoint the returns 204 when true and 404 when false\n * @param {string} path - the path to request\n * @param {Object} data - any query parameters for the request\n * @param {Requestable.callback} cb - the callback that will receive `true` or `false`\n * @param {method} [method=GET] - HTTP Method to use\n * @return {Promise} - the promise for the http request\n */\n _request204or404(path, data, cb, method = 'GET') {\n return this._request(method, path, data)\n .then(function success(response) {\n if (cb) {\n cb(null, true, response);\n }\n return true;\n }, function failure(response) {\n if (response.status === 404) {\n if (cb) {\n cb(null, false, response);\n }\n return false;\n }\n\n if (cb) {\n cb(response);\n }\n throw response;\n });\n }\n\n /**\n * Make a request and fetch all the available data. Github will paginate responses so for queries\n * that might span multiple pages this method is preferred to {@link Requestable#request}\n * @param {string} path - the path to request\n * @param {Object} options - the query parameters to include\n * @param {Requestable.callback} [cb] - the function to receive the data. The returned data will always be an array.\n * @param {Object[]} results - the partial results. This argument is intended for interal use only.\n * @return {Promise} - a promise which will resolve when all pages have been fetched\n * @deprecated This will be folded into {@link Requestable#_request} in the 2.0 release.\n */\n _requestAllPages(path, options, cb, results) {\n results = results || [];\n\n return this._request('GET', path, options)\n .then((response) => {\n let thisGroup;\n if (response.data instanceof Array) {\n thisGroup = response.data;\n } else if (response.data.items instanceof Array) {\n thisGroup = response.data.items;\n } else {\n let message = `cannot figure out how to append ${response.data} to the result set`;\n throw new ResponseError(message, path, response);\n }\n results.push.apply(results, thisGroup);\n\n const nextUrl = getNextPage(response.headers.link);\n if (nextUrl) {\n log(`getting next page: ${nextUrl}`);\n return this._requestAllPages(nextUrl, options, cb, results);\n }\n\n if (cb) {\n cb(null, results, response);\n }\n\n response.data = results;\n return response;\n }).catch(callbackErrorOrRejectOrThrow(cb, null, path));\n }\n}\n\nmodule.exports = Requestable;\n\n// ////////////////////////// //\n// Private helper functions //\n// ////////////////////////// //\nconst METHODS_WITH_NO_BODY = ['GET', 'HEAD', 'DELETE'];\nfunction methodHasNoBody(method) {\n return METHODS_WITH_NO_BODY.indexOf(method) !== -1;\n}\n\nfunction getNextPage(linksHeader = '') {\n const links = linksHeader.split(/\\s*,\\s*/); // splits and strips the urls\n return links.reduce(function(nextUrl, link) {\n if (link.search(/rel=\"next\"/) !== -1) {\n return (link.match(/<(.*)>/) || [])[1];\n }\n\n return nextUrl;\n }, undefined);\n}\n\nfunction callbackErrorOrRejectOrThrow(cb, reject, path) {\n return function handler(object) {\n let error;\n if (object.hasOwnProperty('config')) {\n const {status, statusText, config: {method, url}} = object;\n let message = (`${status} error making request ${method} ${url}: \"${statusText}\"`);\n error = new ResponseError(message, path, object);\n log(`${message} ${JSON.stringify(object.data)}`);\n } else {\n error = object;\n }\n if (cb) {\n log('going to error callback');\n cb(error);\n } else if (reject) {\n reject(error);\n } else {\n log('throwing error');\n throw error;\n }\n };\n}\n"],"file":"Requestable.js"} \ No newline at end of file diff --git a/dist/components/Search.js b/dist/components/Search.js new file mode 100644 index 00000000..4cfc7d75 --- /dev/null +++ b/dist/components/Search.js @@ -0,0 +1,164 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable', 'debug'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable'), require('debug')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable, global.debug); + global.Search = mod.exports; + } +})(this, function (module, _Requestable2, _debug) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + var _debug2 = _interopRequireDefault(_debug); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var log = (0, _debug2.default)('github:search'); + + /** + * Wrap the Search API + */ + + var Search = function (_Requestable) { + _inherits(Search, _Requestable); + + /** + * Create a Search + * @param {Object} defaults - defaults for the search + * @param {Requestable.auth} [auth] - information required to authenticate to Github + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function Search(defaults, auth, apiBase) { + _classCallCheck(this, Search); + + var _this = _possibleConstructorReturn(this, (Search.__proto__ || Object.getPrototypeOf(Search)).call(this, auth, apiBase)); + + _this.__defaults = _this._getOptionsWithDefaults(defaults); + return _this; + } + + /** + * Available search options + * @see https://developer.github.com/v3/search/#parameters + * @typedef {Object} Search.Params + * @param {string} q - the query to make + * @param {string} sort - the sort field, one of `stars`, `forks`, or `updated`. + * Default is [best match](https://developer.github.com/v3/search/#ranking-search-results) + * @param {string} order - the ordering, either `asc` or `desc` + */ + /** + * Perform a search on the GitHub API + * @private + * @param {string} path - the scope of the search + * @param {Search.Params} [withOptions] - additional parameters for the search + * @param {Requestable.callback} [cb] - will receive the results of the search + * @return {Promise} - the promise for the http request + */ + + + _createClass(Search, [{ + key: '_search', + value: function _search(path) { + var _this2 = this; + + var withOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var cb = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; + + var requestOptions = {}; + Object.keys(this.__defaults).forEach(function (prop) { + requestOptions[prop] = _this2.__defaults[prop]; + }); + Object.keys(withOptions).forEach(function (prop) { + requestOptions[prop] = withOptions[prop]; + }); + + log('searching ' + path + ' with options:', requestOptions); + return this._requestAllPages('/search/' + path, requestOptions, cb); + } + }, { + key: 'forRepositories', + value: function forRepositories(options, cb) { + return this._search('repositories', options, cb); + } + }, { + key: 'forCode', + value: function forCode(options, cb) { + return this._search('code', options, cb); + } + }, { + key: 'forIssues', + value: function forIssues(options, cb) { + return this._search('issues', options, cb); + } + }, { + key: 'forUsers', + value: function forUsers(options, cb) { + return this._search('users', options, cb); + } + }]); + + return Search; + }(_Requestable3.default); + + module.exports = Search; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNlYXJjaC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJTZWFyY2giLCJkZWZhdWx0cyIsImF1dGgiLCJhcGlCYXNlIiwiX19kZWZhdWx0cyIsIl9nZXRPcHRpb25zV2l0aERlZmF1bHRzIiwicGF0aCIsIndpdGhPcHRpb25zIiwiY2IiLCJ1bmRlZmluZWQiLCJyZXF1ZXN0T3B0aW9ucyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwicHJvcCIsIl9yZXF1ZXN0QWxsUGFnZXMiLCJvcHRpb25zIiwiX3NlYXJjaCIsIlJlcXVlc3RhYmxlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLE1BQU1BLE1BQU0scUJBQU0sZUFBTixDQUFaOztBQUVBOzs7O01BR01DLE07OztBQUNIOzs7Ozs7QUFNQSxvQkFBWUMsUUFBWixFQUFzQkMsSUFBdEIsRUFBNEJDLE9BQTVCLEVBQXFDO0FBQUE7O0FBQUEsa0hBQzVCRCxJQUQ0QixFQUN0QkMsT0FEc0I7O0FBRWxDLFlBQUtDLFVBQUwsR0FBa0IsTUFBS0MsdUJBQUwsQ0FBNkJKLFFBQTdCLENBQWxCO0FBRmtDO0FBR3BDOztBQUVEOzs7Ozs7Ozs7QUFTQTs7Ozs7Ozs7Ozs7OzhCQVFRSyxJLEVBQXdDO0FBQUE7O0FBQUEsWUFBbENDLFdBQWtDLHVFQUFwQixFQUFvQjtBQUFBLFlBQWhCQyxFQUFnQix1RUFBWEMsU0FBVzs7QUFDN0MsWUFBSUMsaUJBQWlCLEVBQXJCO0FBQ0FDLGVBQU9DLElBQVAsQ0FBWSxLQUFLUixVQUFqQixFQUE2QlMsT0FBN0IsQ0FBcUMsVUFBQ0MsSUFBRCxFQUFVO0FBQzVDSix5QkFBZUksSUFBZixJQUF1QixPQUFLVixVQUFMLENBQWdCVSxJQUFoQixDQUF2QjtBQUNGLFNBRkQ7QUFHQUgsZUFBT0MsSUFBUCxDQUFZTCxXQUFaLEVBQXlCTSxPQUF6QixDQUFpQyxVQUFDQyxJQUFELEVBQVU7QUFDeENKLHlCQUFlSSxJQUFmLElBQXVCUCxZQUFZTyxJQUFaLENBQXZCO0FBQ0YsU0FGRDs7QUFJQWYsMkJBQWlCTyxJQUFqQixxQkFBdUNJLGNBQXZDO0FBQ0EsZUFBTyxLQUFLSyxnQkFBTCxjQUFpQ1QsSUFBakMsRUFBeUNJLGNBQXpDLEVBQXlERixFQUF6RCxDQUFQO0FBQ0Y7OztzQ0FTZVEsTyxFQUFTUixFLEVBQUk7QUFDMUIsZUFBTyxLQUFLUyxPQUFMLENBQWEsY0FBYixFQUE2QkQsT0FBN0IsRUFBc0NSLEVBQXRDLENBQVA7QUFDRjs7OzhCQVNPUSxPLEVBQVNSLEUsRUFBSTtBQUNsQixlQUFPLEtBQUtTLE9BQUwsQ0FBYSxNQUFiLEVBQXFCRCxPQUFyQixFQUE4QlIsRUFBOUIsQ0FBUDtBQUNGOzs7Z0NBU1NRLE8sRUFBU1IsRSxFQUFJO0FBQ3BCLGVBQU8sS0FBS1MsT0FBTCxDQUFhLFFBQWIsRUFBdUJELE9BQXZCLEVBQWdDUixFQUFoQyxDQUFQO0FBQ0Y7OzsrQkFTUVEsTyxFQUFTUixFLEVBQUk7QUFDbkIsZUFBTyxLQUFLUyxPQUFMLENBQWEsT0FBYixFQUFzQkQsT0FBdEIsRUFBK0JSLEVBQS9CLENBQVA7QUFDRjs7OztJQXBGaUJVLHFCOztBQXVGckJDLFNBQU9DLE9BQVAsR0FBaUJwQixNQUFqQiIsImZpbGUiOiJTZWFyY2guanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKiBAY29weXJpZ2h0ICAyMDEzIE1pY2hhZWwgQXVmcmVpdGVyIChEZXZlbG9wbWVudCBTZWVkKSBhbmQgMjAxNiBZYWhvbyBJbmMuXG4gKiBAbGljZW5zZSAgICBMaWNlbnNlZCB1bmRlciB7QGxpbmsgaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UtQ2xlYXIuaHRtbCBCU0QtMy1DbGF1c2UtQ2xlYXJ9LlxuICogICAgICAgICAgICAgR2l0aHViLmpzIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLlxuICovXG5cbmltcG9ydCBSZXF1ZXN0YWJsZSBmcm9tICcuL1JlcXVlc3RhYmxlJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5jb25zdCBsb2cgPSBkZWJ1ZygnZ2l0aHViOnNlYXJjaCcpO1xuXG4vKipcbiAqIFdyYXAgdGhlIFNlYXJjaCBBUElcbiAqL1xuY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVxdWVzdGFibGUge1xuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBTZWFyY2hcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0cyAtIGRlZmF1bHRzIGZvciB0aGUgc2VhcmNoXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmF1dGh9IFthdXRoXSAtIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGF1dGhlbnRpY2F0ZSB0byBHaXRodWJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYXBpQmFzZT1odHRwczovL2FwaS5naXRodWIuY29tXSAtIHRoZSBiYXNlIEdpdGh1YiBBUEkgVVJMXG4gICAgKi9cbiAgIGNvbnN0cnVjdG9yKGRlZmF1bHRzLCBhdXRoLCBhcGlCYXNlKSB7XG4gICAgICBzdXBlcihhdXRoLCBhcGlCYXNlKTtcbiAgICAgIHRoaXMuX19kZWZhdWx0cyA9IHRoaXMuX2dldE9wdGlvbnNXaXRoRGVmYXVsdHMoZGVmYXVsdHMpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEF2YWlsYWJsZSBzZWFyY2ggb3B0aW9uc1xuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3NlYXJjaC8jcGFyYW1ldGVyc1xuICAgICogQHR5cGVkZWYge09iamVjdH0gU2VhcmNoLlBhcmFtc1xuICAgICogQHBhcmFtIHtzdHJpbmd9IHEgLSB0aGUgcXVlcnkgdG8gbWFrZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IHNvcnQgLSB0aGUgc29ydCBmaWVsZCwgb25lIG9mIGBzdGFyc2AsIGBmb3Jrc2AsIG9yIGB1cGRhdGVkYC5cbiAgICAqICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgW2Jlc3QgbWF0Y2hdKGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvc2VhcmNoLyNyYW5raW5nLXNlYXJjaC1yZXN1bHRzKVxuICAgICogQHBhcmFtIHtzdHJpbmd9IG9yZGVyIC0gdGhlIG9yZGVyaW5nLCBlaXRoZXIgYGFzY2Agb3IgYGRlc2NgXG4gICAgKi9cbiAgIC8qKlxuICAgICogUGVyZm9ybSBhIHNlYXJjaCBvbiB0aGUgR2l0SHViIEFQSVxuICAgICogQHByaXZhdGVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gdGhlIHNjb3BlIG9mIHRoZSBzZWFyY2hcbiAgICAqIEBwYXJhbSB7U2VhcmNoLlBhcmFtc30gW3dpdGhPcHRpb25zXSAtIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIHNlYXJjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIF9zZWFyY2gocGF0aCwgd2l0aE9wdGlvbnMgPSB7fSwgY2IgPSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCByZXF1ZXN0T3B0aW9ucyA9IHt9O1xuICAgICAgT2JqZWN0LmtleXModGhpcy5fX2RlZmF1bHRzKS5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgICByZXF1ZXN0T3B0aW9uc1twcm9wXSA9IHRoaXMuX19kZWZhdWx0c1twcm9wXTtcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmtleXMod2l0aE9wdGlvbnMpLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgIHJlcXVlc3RPcHRpb25zW3Byb3BdID0gd2l0aE9wdGlvbnNbcHJvcF07XG4gICAgICB9KTtcblxuICAgICAgbG9nKGBzZWFyY2hpbmcgJHtwYXRofSB3aXRoIG9wdGlvbnM6YCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RBbGxQYWdlcyhgL3NlYXJjaC8ke3BhdGh9YCwgcmVxdWVzdE9wdGlvbnMsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBTZWFyY2ggZm9yIHJlcG9zaXRvcmllc1xuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3NlYXJjaC8jc2VhcmNoLXJlcG9zaXRvcmllc1xuICAgICogQHBhcmFtIHtTZWFyY2guUGFyYW1zfSBbb3B0aW9uc10gLSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBzZWFyY2hcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIHJlc3VsdHMgb2YgdGhlIHNlYXJjaFxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBmb3JSZXBvc2l0b3JpZXMob3B0aW9ucywgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZWFyY2goJ3JlcG9zaXRvcmllcycsIG9wdGlvbnMsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBTZWFyY2ggZm9yIGNvZGVcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9zZWFyY2gvI3NlYXJjaC1jb2RlXG4gICAgKiBAcGFyYW0ge1NlYXJjaC5QYXJhbXN9IFtvcHRpb25zXSAtIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIHNlYXJjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGZvckNvZGUob3B0aW9ucywgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZWFyY2goJ2NvZGUnLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogU2VhcmNoIGZvciBpc3N1ZXNcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9zZWFyY2gvI3NlYXJjaC1pc3N1ZXNcbiAgICAqIEBwYXJhbSB7U2VhcmNoLlBhcmFtc30gW29wdGlvbnNdIC0gYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgc2VhcmNoXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSByZXN1bHRzIG9mIHRoZSBzZWFyY2hcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZm9ySXNzdWVzKG9wdGlvbnMsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VhcmNoKCdpc3N1ZXMnLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogU2VhcmNoIGZvciB1c2Vyc1xuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3NlYXJjaC8jc2VhcmNoLXVzZXJzXG4gICAgKiBAcGFyYW0ge1NlYXJjaC5QYXJhbXN9IFtvcHRpb25zXSAtIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIHNlYXJjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgcmVzdWx0cyBvZiB0aGUgc2VhcmNoXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGZvclVzZXJzKG9wdGlvbnMsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VhcmNoKCd1c2VycycsIG9wdGlvbnMsIGNiKTtcbiAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBTZWFyY2g7XG4iXX0= +//# sourceMappingURL=Search.js.map diff --git a/dist/components/Search.js.map b/dist/components/Search.js.map new file mode 100644 index 00000000..9276c5e8 --- /dev/null +++ b/dist/components/Search.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["Search.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\nimport debug from 'debug';\nconst log = debug('github:search');\n\n/**\n * Wrap the Search API\n */\nclass Search extends Requestable {\n /**\n * Create a Search\n * @param {Object} defaults - defaults for the search\n * @param {Requestable.auth} [auth] - information required to authenticate to Github\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(defaults, auth, apiBase) {\n super(auth, apiBase);\n this.__defaults = this._getOptionsWithDefaults(defaults);\n }\n\n /**\n * Available search options\n * @see https://developer.github.com/v3/search/#parameters\n * @typedef {Object} Search.Params\n * @param {string} q - the query to make\n * @param {string} sort - the sort field, one of `stars`, `forks`, or `updated`.\n * Default is [best match](https://developer.github.com/v3/search/#ranking-search-results)\n * @param {string} order - the ordering, either `asc` or `desc`\n */\n /**\n * Perform a search on the GitHub API\n * @private\n * @param {string} path - the scope of the search\n * @param {Search.Params} [withOptions] - additional parameters for the search\n * @param {Requestable.callback} [cb] - will receive the results of the search\n * @return {Promise} - the promise for the http request\n */\n _search(path, withOptions = {}, cb = undefined) {\n let requestOptions = {};\n Object.keys(this.__defaults).forEach((prop) => {\n requestOptions[prop] = this.__defaults[prop];\n });\n Object.keys(withOptions).forEach((prop) => {\n requestOptions[prop] = withOptions[prop];\n });\n\n log(`searching ${path} with options:`, requestOptions);\n return this._requestAllPages(`/search/${path}`, requestOptions, cb);\n }\n\n /**\n * Search for repositories\n * @see https://developer.github.com/v3/search/#search-repositories\n * @param {Search.Params} [options] - additional parameters for the search\n * @param {Requestable.callback} [cb] - will receive the results of the search\n * @return {Promise} - the promise for the http request\n */\n forRepositories(options, cb) {\n return this._search('repositories', options, cb);\n }\n\n /**\n * Search for code\n * @see https://developer.github.com/v3/search/#search-code\n * @param {Search.Params} [options] - additional parameters for the search\n * @param {Requestable.callback} [cb] - will receive the results of the search\n * @return {Promise} - the promise for the http request\n */\n forCode(options, cb) {\n return this._search('code', options, cb);\n }\n\n /**\n * Search for issues\n * @see https://developer.github.com/v3/search/#search-issues\n * @param {Search.Params} [options] - additional parameters for the search\n * @param {Requestable.callback} [cb] - will receive the results of the search\n * @return {Promise} - the promise for the http request\n */\n forIssues(options, cb) {\n return this._search('issues', options, cb);\n }\n\n /**\n * Search for users\n * @see https://developer.github.com/v3/search/#search-users\n * @param {Search.Params} [options] - additional parameters for the search\n * @param {Requestable.callback} [cb] - will receive the results of the search\n * @return {Promise} - the promise for the http request\n */\n forUsers(options, cb) {\n return this._search('users', options, cb);\n }\n}\n\nmodule.exports = Search;\n"],"file":"Search.js"} \ No newline at end of file diff --git a/dist/components/Team.js b/dist/components/Team.js new file mode 100644 index 00000000..0e0ab4be --- /dev/null +++ b/dist/components/Team.js @@ -0,0 +1,174 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable', 'debug'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable'), require('debug')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable, global.debug); + global.Team = mod.exports; + } +})(this, function (module, _Requestable2, _debug) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + var _debug2 = _interopRequireDefault(_debug); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var log = (0, _debug2.default)('github:team'); + + /** + * A Team allows scoping of API requests to a particular Github Organization Team. + */ + + var Team = function (_Requestable) { + _inherits(Team, _Requestable); + + /** + * Create a Team. + * @param {string} [teamId] - the id for the team + * @param {Requestable.auth} [auth] - information required to authenticate to Github + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function Team(teamId, auth, apiBase) { + _classCallCheck(this, Team); + + var _this = _possibleConstructorReturn(this, (Team.__proto__ || Object.getPrototypeOf(Team)).call(this, auth, apiBase)); + + _this.__teamId = teamId; + return _this; + } + + /** + * Get Team information + * @see https://developer.github.com/v3/orgs/teams/#get-team + * @param {Requestable.callback} [cb] - will receive the team + * @return {Promise} - the promise for the http request + */ + + + _createClass(Team, [{ + key: 'getTeam', + value: function getTeam(cb) { + log('Fetching Team ' + this.__teamId); + return this._request('Get', '/teams/' + this.__teamId, undefined, cb); + } + }, { + key: 'listRepos', + value: function listRepos(cb) { + log('Fetching repositories for Team ' + this.__teamId); + return this._requestAllPages('/teams/' + this.__teamId + '/repos', undefined, cb); + } + }, { + key: 'editTeam', + value: function editTeam(options, cb) { + log('Editing Team ' + this.__teamId); + return this._request('PATCH', '/teams/' + this.__teamId, options, cb); + } + }, { + key: 'listMembers', + value: function listMembers(options, cb) { + log('Getting members of Team ' + this.__teamId); + return this._requestAllPages('/teams/' + this.__teamId + '/members', options, cb); + } + }, { + key: 'getMembership', + value: function getMembership(username, cb) { + log('Getting membership of user ' + username + ' in Team ' + this.__teamId); + return this._request('GET', '/teams/' + this.__teamId + '/memberships/' + username, undefined, cb); + } + }, { + key: 'addMembership', + value: function addMembership(username, options, cb) { + log('Adding user ' + username + ' to Team ' + this.__teamId); + return this._request('PUT', '/teams/' + this.__teamId + '/memberships/' + username, options, cb); + } + }, { + key: 'isManagedRepo', + value: function isManagedRepo(owner, repo, cb) { + log('Getting repo management by Team ' + this.__teamId + ' for repo ' + owner + '/' + repo); + return this._request204or404('/teams/' + this.__teamId + '/repos/' + owner + '/' + repo, undefined, cb); + } + }, { + key: 'manageRepo', + value: function manageRepo(owner, repo, options, cb) { + log('Adding or Updating repo management by Team ' + this.__teamId + ' for repo ' + owner + '/' + repo); + return this._request204or404('/teams/' + this.__teamId + '/repos/' + owner + '/' + repo, options, cb, 'PUT'); + } + }, { + key: 'unmanageRepo', + value: function unmanageRepo(owner, repo, cb) { + log('Remove repo management by Team ' + this.__teamId + ' for repo ' + owner + '/' + repo); + return this._request204or404('/teams/' + this.__teamId + '/repos/' + owner + '/' + repo, undefined, cb, 'DELETE'); + } + }, { + key: 'deleteTeam', + value: function deleteTeam(cb) { + log('Deleting Team ' + this.__teamId); + return this._request204or404('/teams/' + this.__teamId, undefined, cb, 'DELETE'); + } + }]); + + return Team; + }(_Requestable3.default); + + module.exports = Team; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRlYW0uanMiXSwibmFtZXMiOlsibG9nIiwiVGVhbSIsInRlYW1JZCIsImF1dGgiLCJhcGlCYXNlIiwiX190ZWFtSWQiLCJjYiIsIl9yZXF1ZXN0IiwidW5kZWZpbmVkIiwiX3JlcXVlc3RBbGxQYWdlcyIsIm9wdGlvbnMiLCJ1c2VybmFtZSIsIm93bmVyIiwicmVwbyIsIl9yZXF1ZXN0MjA0b3I0MDQiLCJSZXF1ZXN0YWJsZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTQSxNQUFNQSxNQUFNLHFCQUFNLGFBQU4sQ0FBWjs7QUFFQTs7OztNQUdNQyxJOzs7QUFDSDs7Ozs7O0FBTUEsa0JBQVlDLE1BQVosRUFBb0JDLElBQXBCLEVBQTBCQyxPQUExQixFQUFtQztBQUFBOztBQUFBLDhHQUMxQkQsSUFEMEIsRUFDcEJDLE9BRG9COztBQUVoQyxZQUFLQyxRQUFMLEdBQWdCSCxNQUFoQjtBQUZnQztBQUdsQzs7QUFFRDs7Ozs7Ozs7Ozs4QkFNUUksRSxFQUFJO0FBQ1ROLCtCQUFxQixLQUFLSyxRQUExQjtBQUNBLGVBQU8sS0FBS0UsUUFBTCxDQUFjLEtBQWQsY0FBK0IsS0FBS0YsUUFBcEMsRUFBZ0RHLFNBQWhELEVBQTJERixFQUEzRCxDQUFQO0FBQ0Y7OztnQ0FRU0EsRSxFQUFJO0FBQ1hOLGdEQUFzQyxLQUFLSyxRQUEzQztBQUNBLGVBQU8sS0FBS0ksZ0JBQUwsYUFBZ0MsS0FBS0osUUFBckMsYUFBdURHLFNBQXZELEVBQWtFRixFQUFsRSxDQUFQO0FBQ0Y7OzsrQkFjUUksTyxFQUFTSixFLEVBQUk7QUFDbkJOLDhCQUFvQixLQUFLSyxRQUF6QjtBQUNBLGVBQU8sS0FBS0UsUUFBTCxDQUFjLE9BQWQsY0FBaUMsS0FBS0YsUUFBdEMsRUFBa0RLLE9BQWxELEVBQTJESixFQUEzRCxDQUFQO0FBQ0Y7OztrQ0FVV0ksTyxFQUFTSixFLEVBQUk7QUFDdEJOLHlDQUErQixLQUFLSyxRQUFwQztBQUNBLGVBQU8sS0FBS0ksZ0JBQUwsYUFBZ0MsS0FBS0osUUFBckMsZUFBeURLLE9BQXpELEVBQWtFSixFQUFsRSxDQUFQO0FBQ0Y7OztvQ0FTYUssUSxFQUFVTCxFLEVBQUk7QUFDekJOLDRDQUFrQ1csUUFBbEMsaUJBQXNELEtBQUtOLFFBQTNEO0FBQ0EsZUFBTyxLQUFLRSxRQUFMLENBQWMsS0FBZCxjQUErQixLQUFLRixRQUFwQyxxQkFBNERNLFFBQTVELEVBQXdFSCxTQUF4RSxFQUFtRkYsRUFBbkYsQ0FBUDtBQUNGOzs7b0NBWWFLLFEsRUFBVUQsTyxFQUFTSixFLEVBQUk7QUFDbENOLDZCQUFtQlcsUUFBbkIsaUJBQXVDLEtBQUtOLFFBQTVDO0FBQ0EsZUFBTyxLQUFLRSxRQUFMLENBQWMsS0FBZCxjQUErQixLQUFLRixRQUFwQyxxQkFBNERNLFFBQTVELEVBQXdFRCxPQUF4RSxFQUFpRkosRUFBakYsQ0FBUDtBQUNGOzs7b0NBVWFNLEssRUFBT0MsSSxFQUFNUCxFLEVBQUk7QUFDNUJOLGlEQUF1QyxLQUFLSyxRQUE1QyxrQkFBaUVPLEtBQWpFLFNBQTBFQyxJQUExRTtBQUNBLGVBQU8sS0FBS0MsZ0JBQUwsYUFBZ0MsS0FBS1QsUUFBckMsZUFBdURPLEtBQXZELFNBQWdFQyxJQUFoRSxFQUF3RUwsU0FBeEUsRUFBbUZGLEVBQW5GLENBQVA7QUFDRjs7O2lDQWFVTSxLLEVBQU9DLEksRUFBTUgsTyxFQUFTSixFLEVBQUk7QUFDbENOLDREQUFrRCxLQUFLSyxRQUF2RCxrQkFBNEVPLEtBQTVFLFNBQXFGQyxJQUFyRjtBQUNBLGVBQU8sS0FBS0MsZ0JBQUwsYUFBZ0MsS0FBS1QsUUFBckMsZUFBdURPLEtBQXZELFNBQWdFQyxJQUFoRSxFQUF3RUgsT0FBeEUsRUFBaUZKLEVBQWpGLEVBQXFGLEtBQXJGLENBQVA7QUFDRjs7O21DQVVZTSxLLEVBQU9DLEksRUFBTVAsRSxFQUFJO0FBQzNCTixnREFBc0MsS0FBS0ssUUFBM0Msa0JBQWdFTyxLQUFoRSxTQUF5RUMsSUFBekU7QUFDQSxlQUFPLEtBQUtDLGdCQUFMLGFBQWdDLEtBQUtULFFBQXJDLGVBQXVETyxLQUF2RCxTQUFnRUMsSUFBaEUsRUFBd0VMLFNBQXhFLEVBQW1GRixFQUFuRixFQUF1RixRQUF2RixDQUFQO0FBQ0Y7OztpQ0FRVUEsRSxFQUFJO0FBQ1pOLCtCQUFxQixLQUFLSyxRQUExQjtBQUNBLGVBQU8sS0FBS1MsZ0JBQUwsYUFBZ0MsS0FBS1QsUUFBckMsRUFBaURHLFNBQWpELEVBQTRERixFQUE1RCxFQUFnRSxRQUFoRSxDQUFQO0FBQ0Y7Ozs7SUE5SWVTLHFCOztBQWlKbkJDLFNBQU9DLE9BQVAsR0FBaUJoQixJQUFqQiIsImZpbGUiOiJUZWFtLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICogQGNvcHlyaWdodCAgMjAxNiBNYXR0IFNtaXRoIChEZXZlbG9wbWVudCBTZWVkKVxuICogQGxpY2Vuc2UgICAgTGljZW5zZWQgdW5kZXIge0BsaW5rIGh0dHBzOi8vc3BkeC5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlLUNsZWFyLmh0bWwgQlNELTMtQ2xhdXNlLUNsZWFyfS5cbiAqICAgICAgICAgICAgIEdpdGh1Yi5qcyBpcyBmcmVlbHkgZGlzdHJpYnV0YWJsZS5cbiAqL1xuXG5pbXBvcnQgUmVxdWVzdGFibGUgZnJvbSAnLi9SZXF1ZXN0YWJsZSc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuY29uc3QgbG9nID0gZGVidWcoJ2dpdGh1Yjp0ZWFtJyk7XG5cbi8qKlxuICogQSBUZWFtIGFsbG93cyBzY29waW5nIG9mIEFQSSByZXF1ZXN0cyB0byBhIHBhcnRpY3VsYXIgR2l0aHViIE9yZ2FuaXphdGlvbiBUZWFtLlxuICovXG5jbGFzcyBUZWFtIGV4dGVuZHMgUmVxdWVzdGFibGUge1xuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBUZWFtLlxuICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZWFtSWRdIC0gdGhlIGlkIGZvciB0aGUgdGVhbVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5hdXRofSBbYXV0aF0gLSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBhdXRoZW50aWNhdGUgdG8gR2l0aHViXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW2FwaUJhc2U9aHR0cHM6Ly9hcGkuZ2l0aHViLmNvbV0gLSB0aGUgYmFzZSBHaXRodWIgQVBJIFVSTFxuICAgICovXG4gICBjb25zdHJ1Y3Rvcih0ZWFtSWQsIGF1dGgsIGFwaUJhc2UpIHtcbiAgICAgIHN1cGVyKGF1dGgsIGFwaUJhc2UpO1xuICAgICAgdGhpcy5fX3RlYW1JZCA9IHRlYW1JZDtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgVGVhbSBpbmZvcm1hdGlvblxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL29yZ3MvdGVhbXMvI2dldC10ZWFtXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmNhbGxiYWNrfSBbY2JdIC0gd2lsbCByZWNlaXZlIHRoZSB0ZWFtXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldFRlYW0oY2IpIHtcbiAgICAgIGxvZyhgRmV0Y2hpbmcgVGVhbSAke3RoaXMuX190ZWFtSWR9YCk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR2V0JywgYC90ZWFtcy8ke3RoaXMuX190ZWFtSWR9YCwgdW5kZWZpbmVkLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgVGVhbSdzIHJlcG9zaXRvcmllc1xuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL29yZ3MvdGVhbXMvI2xpc3QtdGVhbS1yZXBvc1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdFJlcG9zKGNiKSB7XG4gICAgICBsb2coYEZldGNoaW5nIHJlcG9zaXRvcmllcyBmb3IgVGVhbSAke3RoaXMuX190ZWFtSWR9YCk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdEFsbFBhZ2VzKGAvdGVhbXMvJHt0aGlzLl9fdGVhbUlkfS9yZXBvc2AsIHVuZGVmaW5lZCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEVkaXQgVGVhbSBpbmZvcm1hdGlvblxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL29yZ3MvdGVhbXMvI2VkaXQtdGVhbVxuICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBQYXJhbWV0ZXJzIGZvciB0ZWFtIGVkaXRcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGVhbVxuICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRlc2NyaXB0aW9uXSAtIFRlYW0gZGVzY3JpcHRpb25cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5yZXBvX25hbWVzXSAtIFJlcG9zIHRvIGFkZCB0aGUgdGVhbSB0b1xuICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnByaXZhY3k9c2VjcmV0XSAtIFRoZSBsZXZlbCBvZiBwcml2YWN5IHRoZSB0ZWFtIHNob3VsZCBoYXZlLiBDYW4gYmUgZWl0aGVyIG9uZVxuICAgICogb2Y6IGBzZWNyZXRgLCBvciBgY2xvc2VkYFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgdXBkYXRlZCB0ZWFtXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGVkaXRUZWFtKG9wdGlvbnMsIGNiKSB7XG4gICAgICBsb2coYEVkaXRpbmcgVGVhbSAke3RoaXMuX190ZWFtSWR9YCk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUEFUQ0gnLCBgL3RlYW1zLyR7dGhpcy5fX3RlYW1JZH1gLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTGlzdCB0aGUgdXNlcnMgd2hvIGFyZSBtZW1iZXJzIG9mIHRoZSBUZWFtXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvb3Jncy90ZWFtcy8jbGlzdC10ZWFtLW1lbWJlcnNcbiAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gUGFyYW1ldGVycyBmb3IgbGlzdGluZyB0ZWFtIHVzZXJzXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucm9sZT1hbGxdIC0gY2FuIGJlIG9uZSBvZjogYGFsbGAsIGBtYWludGFpbmVyYCwgb3IgYG1lbWJlcmBcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGxpc3Qgb2YgdXNlcnNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdE1lbWJlcnMob3B0aW9ucywgY2IpIHtcbiAgICAgIGxvZyhgR2V0dGluZyBtZW1iZXJzIG9mIFRlYW0gJHt0aGlzLl9fdGVhbUlkfWApO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RBbGxQYWdlcyhgL3RlYW1zLyR7dGhpcy5fX3RlYW1JZH0vbWVtYmVyc2AsIG9wdGlvbnMsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgVGVhbSBtZW1iZXJzaGlwIHN0YXR1cyBmb3IgYSB1c2VyXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvb3Jncy90ZWFtcy8jZ2V0LXRlYW0tbWVtYmVyc2hpcFxuICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJuYW1lIC0gY2FuIGJlIG9uZSBvZjogYGFsbGAsIGBtYWludGFpbmVyYCwgb3IgYG1lbWJlcmBcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIG1lbWJlcnNoaXAgc3RhdHVzIG9mIGEgdXNlclxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBnZXRNZW1iZXJzaGlwKHVzZXJuYW1lLCBjYikge1xuICAgICAgbG9nKGBHZXR0aW5nIG1lbWJlcnNoaXAgb2YgdXNlciAke3VzZXJuYW1lfSBpbiBUZWFtICR7dGhpcy5fX3RlYW1JZH1gKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCBgL3RlYW1zLyR7dGhpcy5fX3RlYW1JZH0vbWVtYmVyc2hpcHMvJHt1c2VybmFtZX1gLCB1bmRlZmluZWQsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBBZGQgYSBtZW1iZXIgdG8gdGhlIFRlYW1cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9vcmdzL3RlYW1zLyNhZGQtdGVhbS1tZW1iZXJzaGlwXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgLSBjYW4gYmUgb25lIG9mOiBgYWxsYCwgYG1haW50YWluZXJgLCBvciBgbWVtYmVyYFxuICAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBQYXJhbWV0ZXJzIGZvciBhZGRpbmcgYSB0ZWFtIG1lbWJlclxuICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnJvbGU9bWVtYmVyXSAtIFRoZSByb2xlIHRoYXQgdGhpcyB1c2VyIHNob3VsZCBoYXZlIGluIHRoZSB0ZWFtLiBDYW4gYmUgb25lXG4gICAgKiBvZjogYG1lbWJlcmAsIG9yIGBtYWludGFpbmVyYFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbWVtYmVyc2hpcCBzdGF0dXMgb2YgYWRkZWQgdXNlclxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBhZGRNZW1iZXJzaGlwKHVzZXJuYW1lLCBvcHRpb25zLCBjYikge1xuICAgICAgbG9nKGBBZGRpbmcgdXNlciAke3VzZXJuYW1lfSB0byBUZWFtICR7dGhpcy5fX3RlYW1JZH1gKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQVVQnLCBgL3RlYW1zLyR7dGhpcy5fX3RlYW1JZH0vbWVtYmVyc2hpcHMvJHt1c2VybmFtZX1gLCBvcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2V0IHJlcG8gbWFuYWdlbWVudCBzdGF0dXMgZm9yIHRlYW1cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9vcmdzL3RlYW1zLyNyZW1vdmUtdGVhbS1tZW1iZXJzaGlwXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gb3duZXIgLSBPcmdhbml6YXRpb24gbmFtZVxuICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcG8gLSBSZXBvIG5hbWVcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIG1lbWJlcnNoaXAgc3RhdHVzIG9mIGFkZGVkIHVzZXJcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgaXNNYW5hZ2VkUmVwbyhvd25lciwgcmVwbywgY2IpIHtcbiAgICAgIGxvZyhgR2V0dGluZyByZXBvIG1hbmFnZW1lbnQgYnkgVGVhbSAke3RoaXMuX190ZWFtSWR9IGZvciByZXBvICR7b3duZXJ9LyR7cmVwb31gKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0MjA0b3I0MDQoYC90ZWFtcy8ke3RoaXMuX190ZWFtSWR9L3JlcG9zLyR7b3duZXJ9LyR7cmVwb31gLCB1bmRlZmluZWQsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBBZGQgb3IgVXBkYXRlIHJlcG8gbWFuYWdlbWVudCBzdGF0dXMgZm9yIHRlYW1cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9vcmdzL3RlYW1zLyNhZGQtb3ItdXBkYXRlLXRlYW0tcmVwb3NpdG9yeVxuICAgICogQHBhcmFtIHtzdHJpbmd9IG93bmVyIC0gT3JnYW5pemF0aW9uIG5hbWVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSByZXBvIC0gUmVwbyBuYW1lXG4gICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFBhcmFtZXRlcnMgZm9yIGFkZGluZyBvciB1cGRhdGluZyByZXBvIG1hbmFnZW1lbnQgZm9yIHRoZSB0ZWFtXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMucGVybWlzc2lvbl0gLSBUaGUgcGVybWlzc2lvbiB0byBncmFudCB0aGUgdGVhbSBvbiB0aGlzIHJlcG9zaXRvcnkuIENhbiBiZSBvbmVcbiAgICAqIG9mOiBgcHVsbGAsIGBwdXNoYCwgb3IgYGFkbWluYFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbWVtYmVyc2hpcCBzdGF0dXMgb2YgYWRkZWQgdXNlclxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBtYW5hZ2VSZXBvKG93bmVyLCByZXBvLCBvcHRpb25zLCBjYikge1xuICAgICAgbG9nKGBBZGRpbmcgb3IgVXBkYXRpbmcgcmVwbyBtYW5hZ2VtZW50IGJ5IFRlYW0gJHt0aGlzLl9fdGVhbUlkfSBmb3IgcmVwbyAke293bmVyfS8ke3JlcG99YCk7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdDIwNG9yNDA0KGAvdGVhbXMvJHt0aGlzLl9fdGVhbUlkfS9yZXBvcy8ke293bmVyfS8ke3JlcG99YCwgb3B0aW9ucywgY2IsICdQVVQnKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBSZW1vdmUgcmVwbyBtYW5hZ2VtZW50IHN0YXR1cyBmb3IgdGVhbVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL29yZ3MvdGVhbXMvI3JlbW92ZS10ZWFtLXJlcG9zaXRvcnlcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBvd25lciAtIE9yZ2FuaXphdGlvbiBuYW1lXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcmVwbyAtIFJlcG8gbmFtZVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbWVtYmVyc2hpcCBzdGF0dXMgb2YgYWRkZWQgdXNlclxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICB1bm1hbmFnZVJlcG8ob3duZXIsIHJlcG8sIGNiKSB7XG4gICAgICBsb2coYFJlbW92ZSByZXBvIG1hbmFnZW1lbnQgYnkgVGVhbSAke3RoaXMuX190ZWFtSWR9IGZvciByZXBvICR7b3duZXJ9LyR7cmVwb31gKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0MjA0b3I0MDQoYC90ZWFtcy8ke3RoaXMuX190ZWFtSWR9L3JlcG9zLyR7b3duZXJ9LyR7cmVwb31gLCB1bmRlZmluZWQsIGNiLCAnREVMRVRFJyk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogRGVsZXRlIFRlYW1cbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9vcmdzL3RlYW1zLyNkZWxldGUtdGVhbVxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgZGVsZXRlVGVhbShjYikge1xuICAgICAgbG9nKGBEZWxldGluZyBUZWFtICR7dGhpcy5fX3RlYW1JZH1gKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0MjA0b3I0MDQoYC90ZWFtcy8ke3RoaXMuX190ZWFtSWR9YCwgdW5kZWZpbmVkLCBjYiwgJ0RFTEVURScpO1xuICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFRlYW07XG4iXX0= +//# sourceMappingURL=Team.js.map diff --git a/dist/components/Team.js.map b/dist/components/Team.js.map new file mode 100644 index 00000000..d7323e92 --- /dev/null +++ b/dist/components/Team.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["Team.js"],"sourcesContent":["/**\n * @file\n * @copyright 2016 Matt Smith (Development Seed)\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\nimport debug from 'debug';\nconst log = debug('github:team');\n\n/**\n * A Team allows scoping of API requests to a particular Github Organization Team.\n */\nclass Team extends Requestable {\n /**\n * Create a Team.\n * @param {string} [teamId] - the id for the team\n * @param {Requestable.auth} [auth] - information required to authenticate to Github\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(teamId, auth, apiBase) {\n super(auth, apiBase);\n this.__teamId = teamId;\n }\n\n /**\n * Get Team information\n * @see https://developer.github.com/v3/orgs/teams/#get-team\n * @param {Requestable.callback} [cb] - will receive the team\n * @return {Promise} - the promise for the http request\n */\n getTeam(cb) {\n log(`Fetching Team ${this.__teamId}`);\n return this._request('Get', `/teams/${this.__teamId}`, undefined, cb);\n }\n\n /**\n * List the Team's repositories\n * @see https://developer.github.com/v3/orgs/teams/#list-team-repos\n * @param {Requestable.callback} [cb] - will receive the list of repositories\n * @return {Promise} - the promise for the http request\n */\n listRepos(cb) {\n log(`Fetching repositories for Team ${this.__teamId}`);\n return this._requestAllPages(`/teams/${this.__teamId}/repos`, undefined, cb);\n }\n\n /**\n * Edit Team information\n * @see https://developer.github.com/v3/orgs/teams/#edit-team\n * @param {object} options - Parameters for team edit\n * @param {string} options.name - The name of the team\n * @param {string} [options.description] - Team description\n * @param {string} [options.repo_names] - Repos to add the team to\n * @param {string} [options.privacy=secret] - The level of privacy the team should have. Can be either one\n * of: `secret`, or `closed`\n * @param {Requestable.callback} [cb] - will receive the updated team\n * @return {Promise} - the promise for the http request\n */\n editTeam(options, cb) {\n log(`Editing Team ${this.__teamId}`);\n return this._request('PATCH', `/teams/${this.__teamId}`, options, cb);\n }\n\n /**\n * List the users who are members of the Team\n * @see https://developer.github.com/v3/orgs/teams/#list-team-members\n * @param {object} options - Parameters for listing team users\n * @param {string} [options.role=all] - can be one of: `all`, `maintainer`, or `member`\n * @param {Requestable.callback} [cb] - will receive the list of users\n * @return {Promise} - the promise for the http request\n */\n listMembers(options, cb) {\n log(`Getting members of Team ${this.__teamId}`);\n return this._requestAllPages(`/teams/${this.__teamId}/members`, options, cb);\n }\n\n /**\n * Get Team membership status for a user\n * @see https://developer.github.com/v3/orgs/teams/#get-team-membership\n * @param {string} username - can be one of: `all`, `maintainer`, or `member`\n * @param {Requestable.callback} [cb] - will receive the membership status of a user\n * @return {Promise} - the promise for the http request\n */\n getMembership(username, cb) {\n log(`Getting membership of user ${username} in Team ${this.__teamId}`);\n return this._request('GET', `/teams/${this.__teamId}/memberships/${username}`, undefined, cb);\n }\n\n /**\n * Add a member to the Team\n * @see https://developer.github.com/v3/orgs/teams/#add-team-membership\n * @param {string} username - can be one of: `all`, `maintainer`, or `member`\n * @param {object} options - Parameters for adding a team member\n * @param {string} [options.role=member] - The role that this user should have in the team. Can be one\n * of: `member`, or `maintainer`\n * @param {Requestable.callback} [cb] - will receive the membership status of added user\n * @return {Promise} - the promise for the http request\n */\n addMembership(username, options, cb) {\n log(`Adding user ${username} to Team ${this.__teamId}`);\n return this._request('PUT', `/teams/${this.__teamId}/memberships/${username}`, options, cb);\n }\n\n /**\n * Get repo management status for team\n * @see https://developer.github.com/v3/orgs/teams/#remove-team-membership\n * @param {string} owner - Organization name\n * @param {string} repo - Repo name\n * @param {Requestable.callback} [cb] - will receive the membership status of added user\n * @return {Promise} - the promise for the http request\n */\n isManagedRepo(owner, repo, cb) {\n log(`Getting repo management by Team ${this.__teamId} for repo ${owner}/${repo}`);\n return this._request204or404(`/teams/${this.__teamId}/repos/${owner}/${repo}`, undefined, cb);\n }\n\n /**\n * Add or Update repo management status for team\n * @see https://developer.github.com/v3/orgs/teams/#add-or-update-team-repository\n * @param {string} owner - Organization name\n * @param {string} repo - Repo name\n * @param {object} options - Parameters for adding or updating repo management for the team\n * @param {string} [options.permission] - The permission to grant the team on this repository. Can be one\n * of: `pull`, `push`, or `admin`\n * @param {Requestable.callback} [cb] - will receive the membership status of added user\n * @return {Promise} - the promise for the http request\n */\n manageRepo(owner, repo, options, cb) {\n log(`Adding or Updating repo management by Team ${this.__teamId} for repo ${owner}/${repo}`);\n return this._request204or404(`/teams/${this.__teamId}/repos/${owner}/${repo}`, options, cb, 'PUT');\n }\n\n /**\n * Remove repo management status for team\n * @see https://developer.github.com/v3/orgs/teams/#remove-team-repository\n * @param {string} owner - Organization name\n * @param {string} repo - Repo name\n * @param {Requestable.callback} [cb] - will receive the membership status of added user\n * @return {Promise} - the promise for the http request\n */\n unmanageRepo(owner, repo, cb) {\n log(`Remove repo management by Team ${this.__teamId} for repo ${owner}/${repo}`);\n return this._request204or404(`/teams/${this.__teamId}/repos/${owner}/${repo}`, undefined, cb, 'DELETE');\n }\n\n /**\n * Delete Team\n * @see https://developer.github.com/v3/orgs/teams/#delete-team\n * @param {Requestable.callback} [cb] - will receive the list of repositories\n * @return {Promise} - the promise for the http request\n */\n deleteTeam(cb) {\n log(`Deleting Team ${this.__teamId}`);\n return this._request204or404(`/teams/${this.__teamId}`, undefined, cb, 'DELETE');\n }\n}\n\nmodule.exports = Team;\n"],"file":"Team.js"} \ No newline at end of file diff --git a/dist/components/User.js b/dist/components/User.js new file mode 100644 index 00000000..7972a491 --- /dev/null +++ b/dist/components/User.js @@ -0,0 +1,197 @@ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define(['module', './Requestable', 'debug'], factory); + } else if (typeof exports !== "undefined") { + factory(module, require('./Requestable'), require('debug')); + } else { + var mod = { + exports: {} + }; + factory(mod, global.Requestable, global.debug); + global.User = mod.exports; + } +})(this, function (module, _Requestable2, _debug) { + 'use strict'; + + var _Requestable3 = _interopRequireDefault(_Requestable2); + + var _debug2 = _interopRequireDefault(_debug); + + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var _createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + + function _possibleConstructorReturn(self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return call && (typeof call === "object" || typeof call === "function") ? call : self; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; + } + + var log = (0, _debug2.default)('github:user'); + + /** + * A User allows scoping of API requests to a particular Github user. + */ + + var User = function (_Requestable) { + _inherits(User, _Requestable); + + /** + * Create a User. + * @param {string} [username] - the user to use for user-scoped queries + * @param {Requestable.auth} [auth] - information required to authenticate to Github + * @param {string} [apiBase=https://api.github.com] - the base Github API URL + */ + function User(username, auth, apiBase) { + _classCallCheck(this, User); + + var _this = _possibleConstructorReturn(this, (User.__proto__ || Object.getPrototypeOf(User)).call(this, auth, apiBase)); + + _this.__user = username; + return _this; + } + + /** + * Get the url for the request. (dependent on if we're requesting for the authenticated user or not) + * @private + * @param {string} endpoint - the endpoint being requested + * @return {string} - the resolved endpoint + */ + + + _createClass(User, [{ + key: '__getScopedUrl', + value: function __getScopedUrl(endpoint) { + if (this.__user) { + return endpoint ? '/users/' + this.__user + '/' + endpoint : '/users/' + this.__user; + } else { + // eslint-disable-line + switch (endpoint) { + case '': + return '/user'; + + case 'notifications': + case 'gists': + return '/' + endpoint; + + default: + return '/user/' + endpoint; + } + } + } + }, { + key: 'listRepos', + value: function listRepos(options, cb) { + if (typeof options === 'function') { + cb = options; + options = {}; + } + + options = this._getOptionsWithDefaults(options); + + log('Fetching repositories with options: ' + JSON.stringify(options)); + return this._requestAllPages(this.__getScopedUrl('repos'), options, cb); + } + }, { + key: 'listOrgs', + value: function listOrgs(cb) { + return this._request('GET', this.__getScopedUrl('orgs'), null, cb); + } + }, { + key: 'listGists', + value: function listGists(cb) { + return this._request('GET', this.__getScopedUrl('gists'), null, cb); + } + }, { + key: 'listNotifications', + value: function listNotifications(options, cb) { + options = options || {}; + if (typeof options === 'function') { + cb = options; + options = {}; + } + + options.since = this._dateToISO(options.since); + options.before = this._dateToISO(options.before); + + return this._request('GET', this.__getScopedUrl('notifications'), options, cb); + } + }, { + key: 'getProfile', + value: function getProfile(cb) { + return this._request('GET', this.__getScopedUrl(''), null, cb); + } + }, { + key: 'listStarredRepos', + value: function listStarredRepos(cb) { + var requestOptions = this._getOptionsWithDefaults(); + return this._requestAllPages(this.__getScopedUrl('starred'), requestOptions, cb); + } + }, { + key: 'follow', + value: function follow(username, cb) { + return this._request('PUT', '/user/following/' + this.__user, null, cb); + } + }, { + key: 'unfollow', + value: function unfollow(username, cb) { + return this._request('DELETE', '/user/following/' + this.__user, null, cb); + } + }, { + key: 'createRepo', + value: function createRepo(options, cb) { + return this._request('POST', '/user/repos', options, cb); + } + }]); + + return User; + }(_Requestable3.default); + + module.exports = User; +}); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVzZXIuanMiXSwibmFtZXMiOlsibG9nIiwiVXNlciIsInVzZXJuYW1lIiwiYXV0aCIsImFwaUJhc2UiLCJfX3VzZXIiLCJlbmRwb2ludCIsIm9wdGlvbnMiLCJjYiIsIl9nZXRPcHRpb25zV2l0aERlZmF1bHRzIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9yZXF1ZXN0QWxsUGFnZXMiLCJfX2dldFNjb3BlZFVybCIsIl9yZXF1ZXN0Iiwic2luY2UiLCJfZGF0ZVRvSVNPIiwiYmVmb3JlIiwicmVxdWVzdE9wdGlvbnMiLCJSZXF1ZXN0YWJsZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTQSxPQUFNQSxNQUFNLHFCQUFNLGFBQU4sQ0FBWjs7QUFFQTs7OztPQUdNQyxJOzs7QUFDSDs7Ozs7O0FBTUEsb0JBQVlDLFFBQVosRUFBc0JDLElBQXRCLEVBQTRCQyxPQUE1QixFQUFxQztBQUFBOztBQUFBLGlIQUM1QkQsSUFENEIsRUFDdEJDLE9BRHNCOztBQUVsQyxlQUFLQyxNQUFMLEdBQWNILFFBQWQ7QUFGa0M7QUFHcEM7O0FBRUQ7Ozs7Ozs7Ozs7d0NBTWVJLFEsRUFBVTtBQUN0QixnQkFBSSxLQUFLRCxNQUFULEVBQWlCO0FBQ2Qsc0JBQU9DLHVCQUNNLEtBQUtELE1BRFgsU0FDcUJDLFFBRHJCLGVBRU0sS0FBS0QsTUFGbEI7QUFLRixhQU5ELE1BTU87QUFBRTtBQUNOLHVCQUFRQyxRQUFSO0FBQ0csdUJBQUssRUFBTDtBQUNHLDRCQUFPLE9BQVA7O0FBRUgsdUJBQUssZUFBTDtBQUNBLHVCQUFLLE9BQUw7QUFDRyxrQ0FBV0EsUUFBWDs7QUFFSDtBQUNHLHVDQUFnQkEsUUFBaEI7QUFUTjtBQVdGO0FBQ0g7OzttQ0FTU0MsTyxFQUFTQyxFLEVBQUk7QUFDcEIsZ0JBQUksT0FBT0QsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNoQ0Msb0JBQUtELE9BQUw7QUFDQUEseUJBQVUsRUFBVjtBQUNGOztBQUVEQSxzQkFBVSxLQUFLRSx1QkFBTCxDQUE2QkYsT0FBN0IsQ0FBVjs7QUFFQVAseURBQTJDVSxLQUFLQyxTQUFMLENBQWVKLE9BQWYsQ0FBM0M7QUFDQSxtQkFBTyxLQUFLSyxnQkFBTCxDQUFzQixLQUFLQyxjQUFMLENBQW9CLE9BQXBCLENBQXRCLEVBQW9ETixPQUFwRCxFQUE2REMsRUFBN0QsQ0FBUDtBQUNGOzs7a0NBUVFBLEUsRUFBSTtBQUNWLG1CQUFPLEtBQUtNLFFBQUwsQ0FBYyxLQUFkLEVBQXFCLEtBQUtELGNBQUwsQ0FBb0IsTUFBcEIsQ0FBckIsRUFBa0QsSUFBbEQsRUFBd0RMLEVBQXhELENBQVA7QUFDRjs7O21DQVFTQSxFLEVBQUk7QUFDWCxtQkFBTyxLQUFLTSxRQUFMLENBQWMsS0FBZCxFQUFxQixLQUFLRCxjQUFMLENBQW9CLE9BQXBCLENBQXJCLEVBQW1ELElBQW5ELEVBQXlETCxFQUF6RCxDQUFQO0FBQ0Y7OzsyQ0FTaUJELE8sRUFBU0MsRSxFQUFJO0FBQzVCRCxzQkFBVUEsV0FBVyxFQUFyQjtBQUNBLGdCQUFJLE9BQU9BLE9BQVAsS0FBbUIsVUFBdkIsRUFBbUM7QUFDaENDLG9CQUFLRCxPQUFMO0FBQ0FBLHlCQUFVLEVBQVY7QUFDRjs7QUFFREEsb0JBQVFRLEtBQVIsR0FBZ0IsS0FBS0MsVUFBTCxDQUFnQlQsUUFBUVEsS0FBeEIsQ0FBaEI7QUFDQVIsb0JBQVFVLE1BQVIsR0FBaUIsS0FBS0QsVUFBTCxDQUFnQlQsUUFBUVUsTUFBeEIsQ0FBakI7O0FBRUEsbUJBQU8sS0FBS0gsUUFBTCxDQUFjLEtBQWQsRUFBcUIsS0FBS0QsY0FBTCxDQUFvQixlQUFwQixDQUFyQixFQUEyRE4sT0FBM0QsRUFBb0VDLEVBQXBFLENBQVA7QUFDRjs7O29DQVFVQSxFLEVBQUk7QUFDWixtQkFBTyxLQUFLTSxRQUFMLENBQWMsS0FBZCxFQUFxQixLQUFLRCxjQUFMLENBQW9CLEVBQXBCLENBQXJCLEVBQThDLElBQTlDLEVBQW9ETCxFQUFwRCxDQUFQO0FBQ0Y7OzswQ0FRZ0JBLEUsRUFBSTtBQUNsQixnQkFBSVUsaUJBQWlCLEtBQUtULHVCQUFMLEVBQXJCO0FBQ0EsbUJBQU8sS0FBS0csZ0JBQUwsQ0FBc0IsS0FBS0MsY0FBTCxDQUFvQixTQUFwQixDQUF0QixFQUFzREssY0FBdEQsRUFBc0VWLEVBQXRFLENBQVA7QUFDRjs7O2dDQVNNTixRLEVBQVVNLEUsRUFBSTtBQUNsQixtQkFBTyxLQUFLTSxRQUFMLENBQWMsS0FBZCx1QkFBd0MsS0FBS1QsTUFBN0MsRUFBdUQsSUFBdkQsRUFBNkRHLEVBQTdELENBQVA7QUFDRjs7O2tDQVNRTixRLEVBQVVNLEUsRUFBSTtBQUNwQixtQkFBTyxLQUFLTSxRQUFMLENBQWMsUUFBZCx1QkFBMkMsS0FBS1QsTUFBaEQsRUFBMEQsSUFBMUQsRUFBZ0VHLEVBQWhFLENBQVA7QUFDRjs7O29DQVNVRCxPLEVBQVNDLEUsRUFBSTtBQUNyQixtQkFBTyxLQUFLTSxRQUFMLENBQWMsTUFBZCxFQUFzQixhQUF0QixFQUFxQ1AsT0FBckMsRUFBOENDLEVBQTlDLENBQVA7QUFDRjs7OztLQXZKZVcscUI7O0FBMEpuQkMsVUFBT0MsT0FBUCxHQUFpQnBCLElBQWpCIiwiZmlsZSI6IlVzZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKiBAY29weXJpZ2h0ICAyMDEzIE1pY2hhZWwgQXVmcmVpdGVyIChEZXZlbG9wbWVudCBTZWVkKSBhbmQgMjAxNiBZYWhvbyBJbmMuXG4gKiBAbGljZW5zZSAgICBMaWNlbnNlZCB1bmRlciB7QGxpbmsgaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2UtQ2xlYXIuaHRtbCBCU0QtMy1DbGF1c2UtQ2xlYXJ9LlxuICogICAgICAgICAgICAgR2l0aHViLmpzIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLlxuICovXG5cbmltcG9ydCBSZXF1ZXN0YWJsZSBmcm9tICcuL1JlcXVlc3RhYmxlJztcbmltcG9ydCBkZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5jb25zdCBsb2cgPSBkZWJ1ZygnZ2l0aHViOnVzZXInKTtcblxuLyoqXG4gKiBBIFVzZXIgYWxsb3dzIHNjb3Bpbmcgb2YgQVBJIHJlcXVlc3RzIHRvIGEgcGFydGljdWxhciBHaXRodWIgdXNlci5cbiAqL1xuY2xhc3MgVXNlciBleHRlbmRzIFJlcXVlc3RhYmxlIHtcbiAgIC8qKlxuICAgICogQ3JlYXRlIGEgVXNlci5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdXNlcm5hbWVdIC0gdGhlIHVzZXIgdG8gdXNlIGZvciB1c2VyLXNjb3BlZCBxdWVyaWVzXG4gICAgKiBAcGFyYW0ge1JlcXVlc3RhYmxlLmF1dGh9IFthdXRoXSAtIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGF1dGhlbnRpY2F0ZSB0byBHaXRodWJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBbYXBpQmFzZT1odHRwczovL2FwaS5naXRodWIuY29tXSAtIHRoZSBiYXNlIEdpdGh1YiBBUEkgVVJMXG4gICAgKi9cbiAgIGNvbnN0cnVjdG9yKHVzZXJuYW1lLCBhdXRoLCBhcGlCYXNlKSB7XG4gICAgICBzdXBlcihhdXRoLCBhcGlCYXNlKTtcbiAgICAgIHRoaXMuX191c2VyID0gdXNlcm5hbWU7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2V0IHRoZSB1cmwgZm9yIHRoZSByZXF1ZXN0LiAoZGVwZW5kZW50IG9uIGlmIHdlJ3JlIHJlcXVlc3RpbmcgZm9yIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIgb3Igbm90KVxuICAgICogQHByaXZhdGVcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbmRwb2ludCAtIHRoZSBlbmRwb2ludCBiZWluZyByZXF1ZXN0ZWRcbiAgICAqIEByZXR1cm4ge3N0cmluZ30gLSB0aGUgcmVzb2x2ZWQgZW5kcG9pbnRcbiAgICAqL1xuICAgX19nZXRTY29wZWRVcmwoZW5kcG9pbnQpIHtcbiAgICAgIGlmICh0aGlzLl9fdXNlcikge1xuICAgICAgICAgcmV0dXJuIGVuZHBvaW50ID9cbiAgICAgICAgICAgIGAvdXNlcnMvJHt0aGlzLl9fdXNlcn0vJHtlbmRwb2ludH1gIDpcbiAgICAgICAgICAgIGAvdXNlcnMvJHt0aGlzLl9fdXNlcn1gXG4gICAgICAgICAgICA7XG5cbiAgICAgIH0gZWxzZSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgIHN3aXRjaCAoZW5kcG9pbnQpIHtcbiAgICAgICAgICAgIGNhc2UgJyc6XG4gICAgICAgICAgICAgICByZXR1cm4gJy91c2VyJztcblxuICAgICAgICAgICAgY2FzZSAnbm90aWZpY2F0aW9ucyc6XG4gICAgICAgICAgICBjYXNlICdnaXN0cyc6XG4gICAgICAgICAgICAgICByZXR1cm4gYC8ke2VuZHBvaW50fWA7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICByZXR1cm4gYC91c2VyLyR7ZW5kcG9pbnR9YDtcbiAgICAgICAgIH1cbiAgICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAgKiBMaXN0IHRoZSB1c2VyJ3MgcmVwb3NpdG9yaWVzXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvcmVwb3MvI2xpc3QtdXNlci1yZXBvc2l0b3JpZXNcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBhbnkgb3B0aW9ucyB0byByZWZpbmUgdGhlIHNlYXJjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdFJlcG9zKG9wdGlvbnMsIGNiKSB7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgIGNiID0gb3B0aW9ucztcbiAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgb3B0aW9ucyA9IHRoaXMuX2dldE9wdGlvbnNXaXRoRGVmYXVsdHMob3B0aW9ucyk7XG5cbiAgICAgIGxvZyhgRmV0Y2hpbmcgcmVwb3NpdG9yaWVzIHdpdGggb3B0aW9uczogJHtKU09OLnN0cmluZ2lmeShvcHRpb25zKX1gKTtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0QWxsUGFnZXModGhpcy5fX2dldFNjb3BlZFVybCgncmVwb3MnKSwgb3B0aW9ucywgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgdGhlIG9yZ3MgdGhhdCB0aGUgdXNlciBiZWxvbmdzIHRvXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvb3Jncy8jbGlzdC11c2VyLW9yZ2FuaXphdGlvbnNcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGxpc3Qgb2Ygb3JnYW5pemF0aW9uc1xuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBsaXN0T3JncyhjYikge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3QoJ0dFVCcsIHRoaXMuX19nZXRTY29wZWRVcmwoJ29yZ3MnKSwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgdGhlIHVzZXIncyBnaXN0c1xuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL2dpc3RzLyNsaXN0LWEtdXNlcnMtZ2lzdHNcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGxpc3Qgb2YgZ2lzdHNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdEdpc3RzKGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnR0VUJywgdGhpcy5fX2dldFNjb3BlZFVybCgnZ2lzdHMnKSwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIExpc3QgdGhlIHVzZXIncyBub3RpZmljYXRpb25zXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvYWN0aXZpdHkvbm90aWZpY2F0aW9ucy8jbGlzdC15b3VyLW5vdGlmaWNhdGlvbnNcbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gLSBhbnkgb3B0aW9ucyB0byByZWZpbmUgdGhlIHNlYXJjaFxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdE5vdGlmaWNhdGlvbnMob3B0aW9ucywgY2IpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICBjYiA9IG9wdGlvbnM7XG4gICAgICAgICBvcHRpb25zID0ge307XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMuc2luY2UgPSB0aGlzLl9kYXRlVG9JU08ob3B0aW9ucy5zaW5jZSk7XG4gICAgICBvcHRpb25zLmJlZm9yZSA9IHRoaXMuX2RhdGVUb0lTTyhvcHRpb25zLmJlZm9yZSk7XG5cbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCB0aGlzLl9fZ2V0U2NvcGVkVXJsKCdub3RpZmljYXRpb25zJyksIG9wdGlvbnMsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBTaG93IHRoZSB1c2VyJ3MgcHJvZmlsZVxuICAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5naXRodWIuY29tL3YzL3VzZXJzLyNnZXQtYS1zaW5nbGUtdXNlclxuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0aGUgdXNlcidzIGluZm9ybWF0aW9uXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGdldFByb2ZpbGUoY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdHRVQnLCB0aGlzLl9fZ2V0U2NvcGVkVXJsKCcnKSwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldHMgdGhlIGxpc3Qgb2Ygc3RhcnJlZCByZXBvc2l0b3JpZXMgZm9yIHRoZSB1c2VyXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvYWN0aXZpdHkvc3RhcnJpbmcvI2xpc3QtcmVwb3NpdG9yaWVzLWJlaW5nLXN0YXJyZWRcbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIGxpc3Qgb2Ygc3RhcnJlZCByZXBvc2l0b3JpZXNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgbGlzdFN0YXJyZWRSZXBvcyhjYikge1xuICAgICAgbGV0IHJlcXVlc3RPcHRpb25zID0gdGhpcy5fZ2V0T3B0aW9uc1dpdGhEZWZhdWx0cygpO1xuICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RBbGxQYWdlcyh0aGlzLl9fZ2V0U2NvcGVkVXJsKCdzdGFycmVkJyksIHJlcXVlc3RPcHRpb25zLCBjYik7XG4gICB9XG5cbiAgIC8qKlxuICAgICogSGF2ZSB0aGUgYXV0aGVudGljYXRlZCB1c2VyIGZvbGxvdyB0aGlzIHVzZXJcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My91c2Vycy9mb2xsb3dlcnMvI2ZvbGxvdy1hLXVzZXJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VybmFtZSAtIHRoZSB1c2VyIHRvIGZvbGxvd1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHdpbGwgcmVjZWl2ZSB0cnVlIGlmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzXG4gICAgKiBAcmV0dXJuIHtQcm9taXNlfSAtIHRoZSBwcm9taXNlIGZvciB0aGUgaHR0cCByZXF1ZXN0XG4gICAgKi9cbiAgIGZvbGxvdyh1c2VybmFtZSwgY2IpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KCdQVVQnLCBgL3VzZXIvZm9sbG93aW5nLyR7dGhpcy5fX3VzZXJ9YCwgbnVsbCwgY2IpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEhhdmUgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXIgdW5mb2xsb3cgdGhpcyB1c2VyXG4gICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmdpdGh1Yi5jb20vdjMvdXNlcnMvZm9sbG93ZXJzLyNmb2xsb3ctYS11c2VyXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcm5hbWUgLSB0aGUgdXNlciB0byB1bmZvbGxvd1xuICAgICogQHBhcmFtIHtSZXF1ZXN0YWJsZS5jYWxsYmFja30gW2NiXSAtIHJlY2VpdmVzIHRydWUgaWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHNcbiAgICAqIEByZXR1cm4ge1Byb21pc2V9IC0gdGhlIHByb21pc2UgZm9yIHRoZSBodHRwIHJlcXVlc3RcbiAgICAqL1xuICAgdW5mb2xsb3codXNlcm5hbWUsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnREVMRVRFJywgYC91c2VyL2ZvbGxvd2luZy8ke3RoaXMuX191c2VyfWAsIG51bGwsIGNiKTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBDcmVhdGUgYSBuZXcgcmVwb3NpdG9yeSBmb3IgdGhlIGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHVzZXJcbiAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My9yZXBvcy8jY3JlYXRlXG4gICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIHRoZSByZXBvc2l0b3J5IGRlZmluaXRpb25cbiAgICAqIEBwYXJhbSB7UmVxdWVzdGFibGUuY2FsbGJhY2t9IFtjYl0gLSB3aWxsIHJlY2VpdmUgdGhlIEFQSSByZXNwb25zZVxuICAgICogQHJldHVybiB7UHJvbWlzZX0gLSB0aGUgcHJvbWlzZSBmb3IgdGhlIGh0dHAgcmVxdWVzdFxuICAgICovXG4gICBjcmVhdGVSZXBvKG9wdGlvbnMsIGNiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdCgnUE9TVCcsICcvdXNlci9yZXBvcycsIG9wdGlvbnMsIGNiKTtcbiAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBVc2VyO1xuIl19 +//# sourceMappingURL=User.js.map diff --git a/dist/components/User.js.map b/dist/components/User.js.map new file mode 100644 index 00000000..c5bec5e6 --- /dev/null +++ b/dist/components/User.js.map @@ -0,0 +1 @@ +{"version":3,"names":[],"mappings":"","sources":["User.js"],"sourcesContent":["/**\n * @file\n * @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.\n * @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.\n * Github.js is freely distributable.\n */\n\nimport Requestable from './Requestable';\nimport debug from 'debug';\nconst log = debug('github:user');\n\n/**\n * A User allows scoping of API requests to a particular Github user.\n */\nclass User extends Requestable {\n /**\n * Create a User.\n * @param {string} [username] - the user to use for user-scoped queries\n * @param {Requestable.auth} [auth] - information required to authenticate to Github\n * @param {string} [apiBase=https://api.github.com] - the base Github API URL\n */\n constructor(username, auth, apiBase) {\n super(auth, apiBase);\n this.__user = username;\n }\n\n /**\n * Get the url for the request. (dependent on if we're requesting for the authenticated user or not)\n * @private\n * @param {string} endpoint - the endpoint being requested\n * @return {string} - the resolved endpoint\n */\n __getScopedUrl(endpoint) {\n if (this.__user) {\n return endpoint ?\n `/users/${this.__user}/${endpoint}` :\n `/users/${this.__user}`\n ;\n\n } else { // eslint-disable-line\n switch (endpoint) {\n case '':\n return '/user';\n\n case 'notifications':\n case 'gists':\n return `/${endpoint}`;\n\n default:\n return `/user/${endpoint}`;\n }\n }\n }\n\n /**\n * List the user's repositories\n * @see https://developer.github.com/v3/repos/#list-user-repositories\n * @param {Object} [options={}] - any options to refine the search\n * @param {Requestable.callback} [cb] - will receive the list of repositories\n * @return {Promise} - the promise for the http request\n */\n listRepos(options, cb) {\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n options = this._getOptionsWithDefaults(options);\n\n log(`Fetching repositories with options: ${JSON.stringify(options)}`);\n return this._requestAllPages(this.__getScopedUrl('repos'), options, cb);\n }\n\n /**\n * List the orgs that the user belongs to\n * @see https://developer.github.com/v3/orgs/#list-user-organizations\n * @param {Requestable.callback} [cb] - will receive the list of organizations\n * @return {Promise} - the promise for the http request\n */\n listOrgs(cb) {\n return this._request('GET', this.__getScopedUrl('orgs'), null, cb);\n }\n\n /**\n * List the user's gists\n * @see https://developer.github.com/v3/gists/#list-a-users-gists\n * @param {Requestable.callback} [cb] - will receive the list of gists\n * @return {Promise} - the promise for the http request\n */\n listGists(cb) {\n return this._request('GET', this.__getScopedUrl('gists'), null, cb);\n }\n\n /**\n * List the user's notifications\n * @see https://developer.github.com/v3/activity/notifications/#list-your-notifications\n * @param {Object} [options={}] - any options to refine the search\n * @param {Requestable.callback} [cb] - will receive the list of repositories\n * @return {Promise} - the promise for the http request\n */\n listNotifications(options, cb) {\n options = options || {};\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n options.since = this._dateToISO(options.since);\n options.before = this._dateToISO(options.before);\n\n return this._request('GET', this.__getScopedUrl('notifications'), options, cb);\n }\n\n /**\n * Show the user's profile\n * @see https://developer.github.com/v3/users/#get-a-single-user\n * @param {Requestable.callback} [cb] - will receive the user's information\n * @return {Promise} - the promise for the http request\n */\n getProfile(cb) {\n return this._request('GET', this.__getScopedUrl(''), null, cb);\n }\n\n /**\n * Gets the list of starred repositories for the user\n * @see https://developer.github.com/v3/activity/starring/#list-repositories-being-starred\n * @param {Requestable.callback} [cb] - will receive the list of starred repositories\n * @return {Promise} - the promise for the http request\n */\n listStarredRepos(cb) {\n let requestOptions = this._getOptionsWithDefaults();\n return this._requestAllPages(this.__getScopedUrl('starred'), requestOptions, cb);\n }\n\n /**\n * Have the authenticated user follow this user\n * @see https://developer.github.com/v3/users/followers/#follow-a-user\n * @param {string} username - the user to follow\n * @param {Requestable.callback} [cb] - will receive true if the request succeeds\n * @return {Promise} - the promise for the http request\n */\n follow(username, cb) {\n return this._request('PUT', `/user/following/${this.__user}`, null, cb);\n }\n\n /**\n * Have the currently authenticated user unfollow this user\n * @see https://developer.github.com/v3/users/followers/#follow-a-user\n * @param {string} username - the user to unfollow\n * @param {Requestable.callback} [cb] - receives true if the request succeeds\n * @return {Promise} - the promise for the http request\n */\n unfollow(username, cb) {\n return this._request('DELETE', `/user/following/${this.__user}`, null, cb);\n }\n\n /**\n * Create a new repository for the currently authenticated user\n * @see https://developer.github.com/v3/repos/#create\n * @param {object} options - the repository definition\n * @param {Requestable.callback} [cb] - will receive the API response\n * @return {Promise} - the promise for the http request\n */\n createRepo(options, cb) {\n return this._request('POST', '/user/repos', options, cb);\n }\n}\n\nmodule.exports = User;\n"],"file":"User.js"} \ No newline at end of file diff --git a/gulpfile.babel.js b/gulpfile.babel.js index c3d669f5..7cc83f23 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -29,10 +29,10 @@ gulp.task('clean', function() { }); gulp.task('build', [ - 'build:bundled:min', - 'build:external:min', - 'build:bundled:debug', - 'build:external:debug', +// 'build:bundled:min', +// 'build:external:min', +// 'build:bundled:debug', +// 'build:external:debug', 'build:components' ]); @@ -46,7 +46,8 @@ const externalConfig = { entries: 'lib/GitHub.js', standalone: 'GitHub', external: [ - 'axios', + 'request-extensible', + 'request-http-cache', 'js-base64', 'es6-promise', 'debug', diff --git a/lib/Repository.js b/lib/Repository.js index de77ae48..db97810c 100644 --- a/lib/Repository.js +++ b/lib/Repository.js @@ -141,6 +141,16 @@ class Repository extends Requestable { return this._request('GET', `/repos/${this.__fullname}/branches`, null, cb); } + /** + * List all the branches for the repository (after pagination) + * @see https://developer.github.com/v3/repos/#list-branches + * @param {} + * @return {Promise} - the promise for the http request + */ + listAllBranches() { + return this._requestAllPages(`/repos/${this.__fullname}/branches`, null); + } + /** * Get a raw blob from the repository * @see https://developer.github.com/v3/git/blobs/#get-a-blob diff --git a/lib/Requestable.js b/lib/Requestable.js index 95c23bbd..d54e304f 100644 --- a/lib/Requestable.js +++ b/lib/Requestable.js @@ -5,11 +5,20 @@ * Github.js is freely distributable. */ -import axios from 'axios'; +import requestExt from 'request-extensible'; +import RequestHttpCache from 'request-http-cache'; import debug from 'debug'; import {Base64} from 'js-base64'; import {polyfill} from 'es6-promise'; +const httpRequestCache = new RequestHttpCache({ + max: 256*1024*1024 // Maximum cache size (256mb) +}); + +const request = requestExt({ + extensions: [ httpRequestCache.extension ] +}); + const log = debug('github:request'); if (typeof Promise === 'undefined') { @@ -152,9 +161,14 @@ class Requestable { */ _request(method, path, data, cb, raw) { const url = this.__getURL(path); - const headers = this.__getRequestHeaders(raw); - let queryParams = {}; + let headers = this.__getRequestHeaders(raw); + // Failsafe check for directly making request from NodeJS + if(!headers['User-Agent']) { + headers['User-Agent'] = 'request'; + } + + let queryParams = {}; const shouldUseDataAsParams = data && (typeof data === 'object') && methodHasNoBody(method); if (shouldUseDataAsParams) { queryParams = data; @@ -171,7 +185,31 @@ class Requestable { }; log(`${config.method} to ${config.url}`); - const requestPromise = axios(config).catch(callbackErrorOrThrow(cb, path)); + + const requestPromise = new Promise((resolve, reject) => { + request(config, function(err, response, body) { + let ret = { + status: response?response.statusCode:null, + statusText: response?response.statusMessage:null, + headers: response?response.headers:null, + config: config + } + if(err === null && response && response.statusCode >= 200 && response.statusCode < 300) { + if(raw) { + ret.data = body; + } + else { + ret.data = JSON.parse(body); + } + resolve(ret); + } + else { + ret.data = body; + callbackErrorOrRejectOrThrow(cb, reject, path)(ret); + } + }); + }); + // const requestPromise = axios(config).catch(callbackErrorOrThrow(cb, path)); if (cb) { requestPromise.then((response) => { @@ -250,7 +288,7 @@ class Requestable { response.data = results; return response; - }).catch(callbackErrorOrThrow(cb, path)); + }).catch(callbackErrorOrRejectOrThrow(cb, null, path)); } } @@ -275,7 +313,7 @@ function getNextPage(linksHeader = '') { }, undefined); } -function callbackErrorOrThrow(cb, path) { +function callbackErrorOrRejectOrThrow(cb, reject, path) { return function handler(object) { let error; if (object.hasOwnProperty('config')) { @@ -289,6 +327,8 @@ function callbackErrorOrThrow(cb, path) { if (cb) { log('going to error callback'); cb(error); + } else if (reject) { + reject(error); } else { log('throwing error'); throw error; diff --git a/package.json b/package.json index 15d451a0..62485541 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "github-api", - "version": "2.3.0", + "version": "2.3.1", "license": "BSD-3-Clause-Clear", "description": "A higher-level wrapper around the Github API.", "main": "dist/components/GitHub.js", @@ -45,10 +45,11 @@ "lib/*" ], "dependencies": { - "axios": "^0.10.0", "debug": "^2.2.0", "es6-promise": "^3.0.2", "js-base64": "^2.1.9", + "request-extensible": "^0.1.1", + "request-http-cache": "^1.0.1", "utf8": "^2.1.1" }, "devDependencies": {