// ==UserScript==
// @name GitHub Line Count
// @description Count lines of code in GitHub repositories
// @description:zh-CN 统计 GitHub 仓库的代码行数
// @version 1.0.0
// @author Wybxc
// @homepage https://github.com/Wybxc/github-line-count
// @match *://github.com/*
// @connect *://api.github.com/*
// @grant GM_registerMenuCommand
// @grant GM_getValue
// @grant GM_setValue
// @grant GM.xmlHttpRequest
// @grant GM_xmlHttpRequest
// @license GPL-2.0-or-later
// @namespace https://github.com/Wybxc/github-line-count
// @require https://unpkg.com/[email protected]
// @require https://unpkg.com/[email protected]
// @require https://unpkg.com/@trim21/[email protected]/dist/gm_fetch.js
// ==/UserScript==
(() => { // webpackBootstrap
"use strict";
var __webpack_modules__ = ({
163: (function (module, __unused_webpack___webpack_exports__, __webpack_require__) {
__webpack_require__.a(module, async function (__webpack_handle_async_dependencies__, __webpack_async_result__) { try {
/* ESM import */var _trim21_gm_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(568);
/* ESM import */var _trim21_gm_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_trim21_gm_fetch__WEBPACK_IMPORTED_MODULE_0__);
/* ESM import */var _octokit_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(635);
/* ESM import */var _octokit_request_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(736);
/* ESM import */var human_format__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(414);
/* ESM import */var human_format__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(human_format__WEBPACK_IMPORTED_MODULE_1__);
function _array_like_to_array(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
return arr2;
}
function _array_with_holes(arr) {
if (Array.isArray(arr)) return arr;
}
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _async_to_generator(fn) {
return function() {
var self = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
function _instanceof(left, right) {
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
return !!right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
}
function _iterable_to_array_limit(arr, i) {
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
if (_i == null) return;
var _arr = [];
var _n = true;
var _d = false;
var _s, _e;
try {
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally{
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally{
if (_d) throw _e;
}
}
return _arr;
}
function _non_iterable_rest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _sliced_to_array(arr, i) {
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
}
function _unsupported_iterable_to_array(o, minLen) {
if (!o) return;
if (typeof o === "string") return _array_like_to_array(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(n);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
}
function _ts_generator(thisArg, body) {
var f, y, t, g, _ = {
label: 0,
sent: function() {
if (t[0] & 1) throw t[1];
return t[1];
},
trys: [],
ops: []
};
return g = {
next: verb(0),
"throw": verb(1),
"return": verb(2)
}, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
return this;
}), g;
function verb(n) {
return function(v) {
return step([
n,
v
]);
};
}
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while(_)try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [
op[0] & 2,
t.value
];
switch(op[0]){
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return {
value: op[1],
done: false
};
case 5:
_.label++;
y = op[1];
op = [
0
];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2]) _.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
} catch (e) {
op = [
6,
e
];
y = 0;
} finally{
f = t = 0;
}
if (op[0] & 5) throw op[1];
return {
value: op[0] ? op[1] : void 0,
done: true
};
}
}
var gh_pat = GM_getValue("gh_pat", "");
GM_registerMenuCommand(gh_pat ? "Set GitHub PAT (already set ✅)" : "Set GitHub PAT", /*#__PURE__*/ _async_to_generator(function() {
var pat;
return _ts_generator(this, function(_state) {
switch(_state.label){
case 0:
pat = prompt("To avoid 429 errors, it's recommended to set a GitHub Personal Access Token (PAT) with the access to public repositories. It will also enable stats for private repositories if you provide the necessary permissions.\nEnter your GitHub Personal Access Token (PAT):");
if (!pat) return [
3,
2
];
GM_setValue("gh_pat", pat);
console.log("GitHub PAT has been set successfully.");
return [
4,
renderLoc()
];
case 1:
_state.sent();
return [
3,
3
];
case 2:
console.log("No PAT entered, operation cancelled.");
_state.label = 3;
case 3:
return [
2
];
}
});
}), {
id: "set-gh-pat",
title: "Set GitHub PAT"
});
var githubIcon = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJ3aGl0ZXNtb2tlIiByb2xlPSJpbWciIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48dGl0bGU+R2l0SHViPC90aXRsZT48cGF0aCBkPSJNMTIgLjI5N2MtNi42MyAwLTEyIDUuMzczLTEyIDEyIDAgNS4zMDMgMy40MzggOS44IDguMjA1IDExLjM4NS42LjExMy44Mi0uMjU4LjgyLS41NzcgMC0uMjg1LS4wMS0xLjA0LS4wMTUtMi4wNC0zLjMzOC43MjQtNC4wNDItMS42MS00LjA0Mi0xLjYxQzQuNDIyIDE4LjA3IDMuNjMzIDE3LjcgMy42MzMgMTcuN2MtMS4wODctLjc0NC4wODQtLjcyOS4wODQtLjcyOSAxLjIwNS4wODQgMS44MzggMS4yMzYgMS44MzggMS4yMzYgMS4wNyAxLjgzNSAyLjgwOSAxLjMwNSAzLjQ5NS45OTguMTA4LS43NzYuNDE3LTEuMzA1Ljc2LTEuNjA1LTIuNjY1LS4zLTUuNDY2LTEuMzMyLTUuNDY2LTUuOTMgMC0xLjMxLjQ2NS0yLjM4IDEuMjM1LTMuMjItLjEzNS0uMzAzLS41NC0xLjUyMy4xMDUtMy4xNzYgMCAwIDEuMDA1LS4zMjIgMy4zIDEuMjMuOTYtLjI2NyAxLjk4LS4zOTkgMy0uNDA1IDEuMDIuMDA2IDIuMDQuMTM4IDMgLjQwNSAyLjI4LTEuNTUyIDMuMjg1LTEuMjMgMy4yODUtMS4yMy42NDUgMS42NTMuMjQgMi44NzMuMTIgMy4xNzYuNzY1Ljg0IDEuMjMgMS45MSAxLjIzIDMuMjIgMCA0LjYxLTIuODA1IDUuNjI1LTUuNDc1IDUuOTIuNDIuMzYuODEgMS4wOTYuODEgMi4yMiAwIDEuNjA2LS4wMTUgMi44OTYtLjAxNSAzLjI4NiAwIC4zMTUuMjEuNjkuODI1LjU3QzIwLjU2NSAyMi4wOTIgMjQgMTcuNTkyIDI0IDEyLjI5N2MwLTYuNjI3LTUuMzczLTEyLTEyLTEyIi8+PC9zdmc+";
function renderBadge(options, title) {
var _document_getElementById, _document_querySelector;
var badge = window.badgen(options); // Workaround
(_document_getElementById = document.getElementById("github-line-count")) === null || _document_getElementById === void 0 ? void 0 : _document_getElementById.remove();
(_document_querySelector = document.querySelector(".AppHeader-context-full > nav > ul")) === null || _document_querySelector === void 0 ? void 0 : _document_querySelector.insertAdjacentHTML("beforeend", '<li id="github-line-count" style="margin-left: 0.5em">'.concat(badge, "</li>"));
if (title) {
var el = document.querySelector("#github-line-count > svg > title");
if (el) {
el.textContent = title;
}
}
}
function getCodeFrequencyStats(owner, repo) {
return _getCodeFrequencyStats.apply(this, arguments);
}
function _getCodeFrequencyStats() {
_getCodeFrequencyStats = _async_to_generator(function(owner, repo) {
var gh_pat, octokit, response;
return _ts_generator(this, function(_state) {
switch(_state.label){
case 0:
gh_pat = GM_getValue("gh_pat", "");
octokit = new _octokit_core__WEBPACK_IMPORTED_MODULE_2__/* .Octokit */.v({
auth: gh_pat || undefined,
request: {
fetch: (_trim21_gm_fetch__WEBPACK_IMPORTED_MODULE_0___default())
}
});
_state.label = 1;
case 1:
if (false) {}
return [
4,
octokit.request("GET /repos/{owner}/{repo}/stats/code_frequency", {
owner: owner,
repo: repo
})
];
case 2:
response = _state.sent();
if (response.status === 200) {
return [
2,
response.data
];
}
// The response may be 202, in which case we need to wait and retry
return [
4,
new Promise(function(resolve) {
return setTimeout(resolve, 2000);
})
];
case 3:
_state.sent();
return [
3,
1
];
case 4:
return [
2
];
}
});
});
return _getCodeFrequencyStats.apply(this, arguments);
}
function getFileTreeList(owner, repo, branch) {
return _getFileTreeList.apply(this, arguments);
}
function _getFileTreeList() {
_getFileTreeList = _async_to_generator(function(owner, repo, branch) {
var gh_pat, octokit, response;
return _ts_generator(this, function(_state) {
switch(_state.label){
case 0:
gh_pat = GM_getValue("gh_pat", "");
octokit = new _octokit_core__WEBPACK_IMPORTED_MODULE_2__/* .Octokit */.v({
auth: gh_pat || undefined,
request: {
fetch: (_trim21_gm_fetch__WEBPACK_IMPORTED_MODULE_0___default())
}
});
return [
4,
octokit.request("GET /repos/{owner}/{repo}/git/trees/{tree_sha}", {
owner: owner,
repo: repo,
tree_sha: branch,
recursive: "1"
})
];
case 1:
response = _state.sent();
return [
2,
response.data.tree.filter(function(file) {
return file.type === "tree";
})
];
}
});
});
return _getFileTreeList.apply(this, arguments);
}
function queryLineCount(owner, repo, treePaths) {
return _queryLineCount.apply(this, arguments);
}
function _queryLineCount() {
_queryLineCount = _async_to_generator(function(owner, repo, treePaths) {
var gh_pat, octokit, queries, response;
return _ts_generator(this, function(_state) {
switch(_state.label){
case 0:
gh_pat = GM_getValue("gh_pat", "");
octokit = new _octokit_core__WEBPACK_IMPORTED_MODULE_2__/* .Octokit */.v({
auth: gh_pat || undefined,
request: {
fetch: (_trim21_gm_fetch__WEBPACK_IMPORTED_MODULE_0___default())
}
});
queries = treePaths.map(function(path, i) {
return "file".concat(i, ': object(expression: "HEAD:').concat(path, '") {\n ... on Tree {\n entries {\n lineCount\n }\n }\n }');
}).join("\n");
return [
4,
octokit.graphql("query ($owner: String!, $repo: String!) {\n repository(owner: $owner, name: $repo) {\n ".concat(queries, "\n }\n }"), {
owner: owner,
repo: repo
})
];
case 1:
response = _state.sent();
return [
2,
Object.values(response.repository).flatMap(function(param) {
var entries = param.entries;
return entries;
}).reduce(function(acc, entry) {
return acc + entry.lineCount;
}, 0)
];
}
});
});
return _queryLineCount.apply(this, arguments);
}
function getErrorMessage(error) {
if (_instanceof(error, _octokit_request_error__WEBPACK_IMPORTED_MODULE_3__/* .RequestError */.L)) {
if (error.status === 422) {
return "Too many commits";
}
return "HTTP ".concat(error.status);
}
return "".concat(error).substring(0, 20);
}
function renderLoc() {
return _renderLoc.apply(this, arguments);
}
function _renderLoc() {
_renderLoc = _async_to_generator(function() {
var _document_querySelector, _document_querySelector1, _document_querySelector2, owner, repository, branch, repoKey, cachedLoc, lastUpdated, oneHour, loc, tree, error, stats, fallbackError;
return _ts_generator(this, function(_state) {
switch(_state.label){
case 0:
if (document.getElementById("github-line-count")) {
return [
2
];
}
owner = (_document_querySelector = document.querySelector(".AppHeader-context-full > nav > ul > li:nth-child(1) > a")) === null || _document_querySelector === void 0 ? void 0 : _document_querySelector.innerText.trim();
repository = (_document_querySelector1 = document.querySelector(".AppHeader-context-full > nav > ul > li:nth-child(2) > a")) === null || _document_querySelector1 === void 0 ? void 0 : _document_querySelector1.innerText.trim();
branch = (_document_querySelector2 = document.querySelector("button#branch-picker-repos-header-ref-selector")) === null || _document_querySelector2 === void 0 ? void 0 : _document_querySelector2.innerText.trim();
if (!owner || !repository || !branch) {
return [
2
];
}
renderBadge({
label: "Lines",
status: "Loading...",
color: "gray",
icon: githubIcon
});
// Check cache first
repoKey = "".concat(owner, "/").concat(repository);
cachedLoc = GM_getValue("".concat(repoKey, "/loc"), -1);
lastUpdated = GM_getValue("".concat(repoKey, "/lastUpdated"), 0);
oneHour = 60 * 60 * 1000;
if (Date.now() - lastUpdated < oneHour && cachedLoc >= 0) {
renderBadge({
label: "Lines",
status: human_format__WEBPACK_IMPORTED_MODULE_1___default()(cachedLoc),
color: cachedLoc < 10000 ? "green" : cachedLoc < 100000 ? "orange" : "red",
icon: githubIcon
}, "Lines: ".concat(cachedLoc));
return [
2
];
}
loc = -1;
_state.label = 1;
case 1:
_state.trys.push([
1,
4,
,
9
]);
return [
4,
getFileTreeList(owner, repository, branch)
];
case 2:
tree = _state.sent();
return [
4,
queryLineCount(owner, repository, tree.map(function(file) {
return file.path;
}))
];
case 3:
loc = _state.sent();
return [
3,
9
];
case 4:
error = _state.sent();
console.error("Error getting line count from file tree:", error);
_state.label = 5;
case 5:
_state.trys.push([
5,
7,
,
8
]);
return [
4,
getCodeFrequencyStats(owner, repository)
];
case 6:
stats = _state.sent();
loc = stats.reduce(function(acc, param) {
var _param = _sliced_to_array(param, 3), _ = _param[0], additions = _param[1], deletions = _param[2];
return acc + (additions !== null && additions !== void 0 ? additions : 0) + (deletions !== null && deletions !== void 0 ? deletions : 0);
}, 0);
return [
3,
8
];
case 7:
fallbackError = _state.sent();
renderBadge({
label: "Error",
status: getErrorMessage(fallbackError),
color: "red",
icon: githubIcon
});
console.error("Error getting code frequency stats:", fallbackError);
return [
2
];
case 8:
return [
3,
9
];
case 9:
// Cache the result and display if we got a valid line count
if (loc >= 0) {
GM_setValue("".concat(repoKey, "/loc"), loc);
GM_setValue("".concat(repoKey, "/lastUpdated"), Date.now());
renderBadge({
label: "Lines",
status: human_format__WEBPACK_IMPORTED_MODULE_1___default()(loc),
color: loc < 10000 ? "green" : loc < 100000 ? "orange" : "red",
icon: githubIcon
}, "Lines: ".concat(loc));
}
return [
2
];
}
});
});
return _renderLoc.apply(this, arguments);
}
await renderLoc();
// Observe for navigation changes
new MutationObserver(renderLoc).observe(document.body, {
childList: true
});
__webpack_async_result__();
} catch(e) { __webpack_async_result__(e); } }, 1);
}),
568: (function (module) {
module.exports = GM_fetch;
}),
414: (function (module) {
module.exports = humanFormat;
}),
648: (function (module) {
var __webpack_unused_export__;
const NullObject = function NullObject () { }
NullObject.prototype = Object.create(null)
/**
* RegExp to match *( ";" parameter ) in RFC 7231 sec 3.1.1.1
*
* parameter = token "=" ( token / quoted-string )
* token = 1*tchar
* tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*"
* / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
* / DIGIT / ALPHA
* ; any VCHAR, except delimiters
* quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
* qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text
* obs-text = %x80-FF
* quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
*/
const paramRE = /; *([!#$%&'*+.^\w`|~-]+)=("(?:[\v\u0020\u0021\u0023-\u005b\u005d-\u007e\u0080-\u00ff]|\\[\v\u0020-\u00ff])*"|[!#$%&'*+.^\w`|~-]+) */gu
/**
* RegExp to match quoted-pair in RFC 7230 sec 3.2.6
*
* quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
* obs-text = %x80-FF
*/
const quotedPairRE = /\\([\v\u0020-\u00ff])/gu
/**
* RegExp to match type in RFC 7231 sec 3.1.1.1
*
* media-type = type "/" subtype
* type = token
* subtype = token
*/
const mediaTypeRE = /^[!#$%&'*+.^\w|~-]+\/[!#$%&'*+.^\w|~-]+$/u
// default ContentType to prevent repeated object creation
const defaultContentType = { type: '', parameters: new NullObject() }
Object.freeze(defaultContentType.parameters)
Object.freeze(defaultContentType)
/**
* Parse media type to object.
*
* @param {string|object} header
* @return {Object}
* @public
*/
function parse (header) {
if (typeof header !== 'string') {
throw new TypeError('argument header is required and must be a string')
}
let index = header.indexOf(';')
const type = index !== -1
? header.slice(0, index).trim()
: header.trim()
if (mediaTypeRE.test(type) === false) {
throw new TypeError('invalid media type')
}
const result = {
type: type.toLowerCase(),
parameters: new NullObject()
}
// parse parameters
if (index === -1) {
return result
}
let key
let match
let value
paramRE.lastIndex = index
while ((match = paramRE.exec(header))) {
if (match.index !== index) {
throw new TypeError('invalid parameter format')
}
index += match[0].length
key = match[1].toLowerCase()
value = match[2]
if (value[0] === '"') {
// remove quotes and escapes
value = value
.slice(1, value.length - 1)
quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'))
}
result.parameters[key] = value
}
if (index !== header.length) {
throw new TypeError('invalid parameter format')
}
return result
}
function safeParse (header) {
if (typeof header !== 'string') {
return defaultContentType
}
let index = header.indexOf(';')
const type = index !== -1
? header.slice(0, index).trim()
: header.trim()
if (mediaTypeRE.test(type) === false) {
return defaultContentType
}
const result = {
type: type.toLowerCase(),
parameters: new NullObject()
}
// parse parameters
if (index === -1) {
return result
}
let key
let match
let value
paramRE.lastIndex = index
while ((match = paramRE.exec(header))) {
if (match.index !== index) {
return defaultContentType
}
index += match[0].length
key = match[1].toLowerCase()
value = match[2]
if (value[0] === '"') {
// remove quotes and escapes
value = value
.slice(1, value.length - 1)
quotedPairRE.test(value) && (value = value.replace(quotedPairRE, '$1'))
}
result.parameters[key] = value
}
if (index !== header.length) {
return defaultContentType
}
return result
}
__webpack_unused_export__ = { parse, safeParse }
__webpack_unused_export__ = parse
module.exports.safeParse = safeParse
__webpack_unused_export__ = defaultContentType
}),
635: (function (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
v: () => (/* binding */ Octokit)
});
;// CONCATENATED MODULE: ./node_modules/universal-user-agent/index.js
function getUserAgent() {
if (typeof navigator === "object" && "userAgent" in navigator) {
return navigator.userAgent;
}
if (typeof process === "object" && process.version !== undefined) {
return `Node.js/${process.version.substr(1)} (${process.platform}; ${
process.arch
})`;
}
return "<environment undetectable>";
}
;// CONCATENATED MODULE: ./node_modules/before-after-hook/lib/register.js
// @ts-check
function register(state, name, method, options) {
if (typeof method !== "function") {
throw new Error("method for before hook must be a function");
}
if (!options) {
options = {};
}
if (Array.isArray(name)) {
return name.reverse().reduce((callback, name) => {
return register.bind(null, state, name, callback, options);
}, method)();
}
return Promise.resolve().then(() => {
if (!state.registry[name]) {
return method(options);
}
return state.registry[name].reduce((method, registered) => {
return registered.hook.bind(null, method, options);
}, method)();
});
}
;// CONCATENATED MODULE: ./node_modules/before-after-hook/lib/add.js
// @ts-check
function addHook(state, kind, name, hook) {
const orig = hook;
if (!state.registry[name]) {
state.registry[name] = [];
}
if (kind === "before") {
hook = (method, options) => {
return Promise.resolve()
.then(orig.bind(null, options))
.then(method.bind(null, options));
};
}
if (kind === "after") {
hook = (method, options) => {
let result;
return Promise.resolve()
.then(method.bind(null, options))
.then((result_) => {
result = result_;
return orig(result, options);
})
.then(() => {
return result;
});
};
}
if (kind === "error") {
hook = (method, options) => {
return Promise.resolve()
.then(method.bind(null, options))
.catch((error) => {
return orig(error, options);
});
};
}
state.registry[name].push({
hook: hook,
orig: orig,
});
}
;// CONCATENATED MODULE: ./node_modules/before-after-hook/lib/remove.js
// @ts-check
function removeHook(state, name, method) {
if (!state.registry[name]) {
return;
}
const index = state.registry[name]
.map((registered) => {
return registered.orig;
})
.indexOf(method);
if (index === -1) {
return;
}
state.registry[name].splice(index, 1);
}
;// CONCATENATED MODULE: ./node_modules/before-after-hook/index.js
// @ts-check
// bind with array of arguments: https://stackoverflow.com/a/21792913
const bind = Function.bind;
const bindable = bind.bind(bind);
function bindApi(hook, state, name) {
const removeHookRef = bindable(removeHook, null).apply(
null,
name ? [state, name] : [state]
);
hook.api = { remove: removeHookRef };
hook.remove = removeHookRef;
["before", "error", "after", "wrap"].forEach((kind) => {
const args = name ? [state, kind, name] : [state, kind];
hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args);
});
}
function Singular() {
const singularHookName = Symbol("Singular");
const singularHookState = {
registry: {},
};
const singularHook = register.bind(null, singularHookState, singularHookName);
bindApi(singularHook, singularHookState, singularHookName);
return singularHook;
}
function Collection() {
const state = {
registry: {},
};
const hook = register.bind(null, state);
bindApi(hook, state);
return hook;
}
/* ESM default export */ const before_after_hook = ({ Singular, Collection });
;// CONCATENATED MODULE: ./node_modules/@octokit/endpoint/dist-bundle/index.js
// pkg/dist-src/defaults.js
// pkg/dist-src/version.js
var VERSION = "0.0.0-development";
// pkg/dist-src/defaults.js
var userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;
var DEFAULTS = {
method: "GET",
baseUrl: "https://api.github.com",
headers: {
accept: "application/vnd.github.v3+json",
"user-agent": userAgent
},
mediaType: {
format: ""
}
};
// pkg/dist-src/util/lowercase-keys.js
function lowercaseKeys(object) {
if (!object) {
return {};
}
return Object.keys(object).reduce((newObj, key) => {
newObj[key.toLowerCase()] = object[key];
return newObj;
}, {});
}
// pkg/dist-src/util/is-plain-object.js
function isPlainObject(value) {
if (typeof value !== "object" || value === null) return false;
if (Object.prototype.toString.call(value) !== "[object Object]") return false;
const proto = Object.getPrototypeOf(value);
if (proto === null) return true;
const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;
return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);
}
// pkg/dist-src/util/merge-deep.js
function mergeDeep(defaults, options) {
const result = Object.assign({}, defaults);
Object.keys(options).forEach((key) => {
if (isPlainObject(options[key])) {
if (!(key in defaults)) Object.assign(result, { [key]: options[key] });
else result[key] = mergeDeep(defaults[key], options[key]);
} else {
Object.assign(result, { [key]: options[key] });
}
});
return result;
}
// pkg/dist-src/util/remove-undefined-properties.js
function removeUndefinedProperties(obj) {
for (const key in obj) {
if (obj[key] === void 0) {
delete obj[key];
}
}
return obj;
}
// pkg/dist-src/merge.js
function merge(defaults, route, options) {
if (typeof route === "string") {
let [method, url] = route.split(" ");
options = Object.assign(url ? { method, url } : { url: method }, options);
} else {
options = Object.assign({}, route);
}
options.headers = lowercaseKeys(options.headers);
removeUndefinedProperties(options);
removeUndefinedProperties(options.headers);
const mergedOptions = mergeDeep(defaults || {}, options);
if (options.url === "/graphql") {
if (defaults && defaults.mediaType.previews?.length) {
mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(
(preview) => !mergedOptions.mediaType.previews.includes(preview)
).concat(mergedOptions.mediaType.previews);
}
mergedOptions.mediaType.previews = (mergedOptions.mediaType.previews || []).map((preview) => preview.replace(/-preview/, ""));
}
return mergedOptions;
}
// pkg/dist-src/util/add-query-parameters.js
function addQueryParameters(url, parameters) {
const separator = /\?/.test(url) ? "&" : "?";
const names = Object.keys(parameters);
if (names.length === 0) {
return url;
}
return url + separator + names.map((name) => {
if (name === "q") {
return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+");
}
return `${name}=${encodeURIComponent(parameters[name])}`;
}).join("&");
}
// pkg/dist-src/util/extract-url-variable-names.js
var urlVariableRegex = /\{[^{}}]+\}/g;
function removeNonChars(variableName) {
return variableName.replace(/(?:^\W+)|(?:(?<!\W)\W+$)/g, "").split(/,/);
}
function extractUrlVariableNames(url) {
const matches = url.match(urlVariableRegex);
if (!matches) {
return [];
}
return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);
}
// pkg/dist-src/util/omit.js
function omit(object, keysToOmit) {
const result = { __proto__: null };
for (const key of Object.keys(object)) {
if (keysToOmit.indexOf(key) === -1) {
result[key] = object[key];
}
}
return result;
}
// pkg/dist-src/util/url-template.js
function encodeReserved(str) {
return str.split(/(%[0-9A-Fa-f]{2})/g).map(function(part) {
if (!/%[0-9A-Fa-f]/.test(part)) {
part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
}
return part;
}).join("");
}
function encodeUnreserved(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return "%" + c.charCodeAt(0).toString(16).toUpperCase();
});
}
function encodeValue(operator, value, key) {
value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);
if (key) {
return encodeUnreserved(key) + "=" + value;
} else {
return value;
}
}
function isDefined(value) {
return value !== void 0 && value !== null;
}
function isKeyOperator(operator) {
return operator === ";" || operator === "&" || operator === "?";
}
function getValues(context, operator, key, modifier) {
var value = context[key], result = [];
if (isDefined(value) && value !== "") {
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
value = value.toString();
if (modifier && modifier !== "*") {
value = value.substring(0, parseInt(modifier, 10));
}
result.push(
encodeValue(operator, value, isKeyOperator(operator) ? key : "")
);
} else {
if (modifier === "*") {
if (Array.isArray(value)) {
value.filter(isDefined).forEach(function(value2) {
result.push(
encodeValue(operator, value2, isKeyOperator(operator) ? key : "")
);
});
} else {
Object.keys(value).forEach(function(k) {
if (isDefined(value[k])) {
result.push(encodeValue(operator, value[k], k));
}
});
}
} else {
const tmp = [];
if (Array.isArray(value)) {
value.filter(isDefined).forEach(function(value2) {
tmp.push(encodeValue(operator, value2));
});
} else {
Object.keys(value).forEach(function(k) {
if (isDefined(value[k])) {
tmp.push(encodeUnreserved(k));
tmp.push(encodeValue(operator, value[k].toString()));
}
});
}
if (isKeyOperator(operator)) {
result.push(encodeUnreserved(key) + "=" + tmp.join(","));
} else if (tmp.length !== 0) {
result.push(tmp.join(","));
}
}
}
} else {
if (operator === ";") {
if (isDefined(value)) {
result.push(encodeUnreserved(key));
}
} else if (value === "" && (operator === "&" || operator === "?")) {
result.push(encodeUnreserved(key) + "=");
} else if (value === "") {
result.push("");
}
}
return result;
}
function parseUrl(template) {
return {
expand: expand.bind(null, template)
};
}
function expand(template, context) {
var operators = ["+", "#", ".", "/", ";", "?", "&"];
template = template.replace(
/\{([^\{\}]+)\}|([^\{\}]+)/g,
function(_, expression, literal) {
if (expression) {
let operator = "";
const values = [];
if (operators.indexOf(expression.charAt(0)) !== -1) {
operator = expression.charAt(0);
expression = expression.substr(1);
}
expression.split(/,/g).forEach(function(variable) {
var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
});
if (operator && operator !== "+") {
var separator = ",";
if (operator === "?") {
separator = "&";
} else if (operator !== "#") {
separator = operator;
}
return (values.length !== 0 ? operator : "") + values.join(separator);
} else {
return values.join(",");
}
} else {
return encodeReserved(literal);
}
}
);
if (template === "/") {
return template;
} else {
return template.replace(/\/$/, "");
}
}
// pkg/dist-src/parse.js
function parse(options) {
let method = options.method.toUpperCase();
let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}");
let headers = Object.assign({}, options.headers);
let body;
let parameters = omit(options, [
"method",
"baseUrl",
"url",
"headers",
"request",
"mediaType"
]);
const urlVariableNames = extractUrlVariableNames(url);
url = parseUrl(url).expand(parameters);
if (!/^http/.test(url)) {
url = options.baseUrl + url;
}
const omittedParameters = Object.keys(options).filter((option) => urlVariableNames.includes(option)).concat("baseUrl");
const remainingParameters = omit(parameters, omittedParameters);
const isBinaryRequest = /application\/octet-stream/i.test(headers.accept);
if (!isBinaryRequest) {
if (options.mediaType.format) {
headers.accept = headers.accept.split(/,/).map(
(format) => format.replace(
/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/,
`application/vnd$1$2.${options.mediaType.format}`
)
).join(",");
}
if (url.endsWith("/graphql")) {
if (options.mediaType.previews?.length) {
const previewsFromAcceptHeader = headers.accept.match(/(?<![\w-])[\w-]+(?=-preview)/g) || [];
headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map((preview) => {
const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json";
return `application/vnd.github.${preview}-preview${format}`;
}).join(",");
}
}
}
if (["GET", "HEAD"].includes(method)) {
url = addQueryParameters(url, remainingParameters);
} else {
if ("data" in remainingParameters) {
body = remainingParameters.data;
} else {
if (Object.keys(remainingParameters).length) {
body = remainingParameters;
}
}
}
if (!headers["content-type"] && typeof body !== "undefined") {
headers["content-type"] = "application/json; charset=utf-8";
}
if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
body = "";
}
return Object.assign(
{ method, url, headers },
typeof body !== "undefined" ? { body } : null,
options.request ? { request: options.request } : null
);
}
// pkg/dist-src/endpoint-with-defaults.js
function endpointWithDefaults(defaults, route, options) {
return parse(merge(defaults, route, options));
}
// pkg/dist-src/with-defaults.js
function withDefaults(oldDefaults, newDefaults) {
const DEFAULTS2 = merge(oldDefaults, newDefaults);
const endpoint2 = endpointWithDefaults.bind(null, DEFAULTS2);
return Object.assign(endpoint2, {
DEFAULTS: DEFAULTS2,
defaults: withDefaults.bind(null, DEFAULTS2),
merge: merge.bind(null, DEFAULTS2),
parse
});
}
// pkg/dist-src/index.js
var dist_bundle_endpoint = withDefaults(null, DEFAULTS);
// EXTERNAL MODULE: ./node_modules/fast-content-type-parse/index.js
var fast_content_type_parse = __webpack_require__(648);
// EXTERNAL MODULE: ./node_modules/@octokit/request-error/dist-src/index.js
var dist_src = __webpack_require__(736);
;// CONCATENATED MODULE: ./node_modules/@octokit/request/dist-bundle/index.js
// pkg/dist-src/index.js
// pkg/dist-src/defaults.js
// pkg/dist-src/version.js
var dist_bundle_VERSION = "0.0.0-development";
// pkg/dist-src/defaults.js
var defaults_default = {
headers: {
"user-agent": `octokit-request.js/${dist_bundle_VERSION} ${getUserAgent()}`
}
};
// pkg/dist-src/fetch-wrapper.js
// pkg/dist-src/is-plain-object.js
function dist_bundle_isPlainObject(value) {
if (typeof value !== "object" || value === null) return false;
if (Object.prototype.toString.call(value) !== "[object Object]") return false;
const proto = Object.getPrototypeOf(value);
if (proto === null) return true;
const Ctor = Object.prototype.hasOwnProperty.call(proto, "constructor") && proto.constructor;
return typeof Ctor === "function" && Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value);
}
// pkg/dist-src/fetch-wrapper.js
async function fetchWrapper(requestOptions) {
const fetch = requestOptions.request?.fetch || globalThis.fetch;
if (!fetch) {
throw new Error(
"fetch is not set. Please pass a fetch implementation as new Octokit({ request: { fetch }}). Learn more at https://github.com/octokit/octokit.js/#fetch-missing"
);
}
const log = requestOptions.request?.log || console;
const parseSuccessResponseBody = requestOptions.request?.parseSuccessResponseBody !== false;
const body = dist_bundle_isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body) ? JSON.stringify(requestOptions.body) : requestOptions.body;
const requestHeaders = Object.fromEntries(
Object.entries(requestOptions.headers).map(([name, value]) => [
name,
String(value)
])
);
let fetchResponse;
try {
fetchResponse = await fetch(requestOptions.url, {
method: requestOptions.method,
body,
redirect: requestOptions.request?.redirect,
headers: requestHeaders,
signal: requestOptions.request?.signal,
// duplex must be set if request.body is ReadableStream or Async Iterables.
// See https://fetch.spec.whatwg.org/#dom-requestinit-duplex.
...requestOptions.body && { duplex: "half" }
});
} catch (error) {
let message = "Unknown Error";
if (error instanceof Error) {
if (error.name === "AbortError") {
error.status = 500;
throw error;
}
message = error.message;
if (error.name === "TypeError" && "cause" in error) {
if (error.cause instanceof Error) {
message = error.cause.message;
} else if (typeof error.cause === "string") {
message = error.cause;
}
}
}
const requestError = new dist_src/* RequestError */.L(message, 500, {
request: requestOptions
});
requestError.cause = error;
throw requestError;
}
const status = fetchResponse.status;
const url = fetchResponse.url;
const responseHeaders = {};
for (const [key, value] of fetchResponse.headers) {
responseHeaders[key] = value;
}
const octokitResponse = {
url,
status,
headers: responseHeaders,
data: ""
};
if ("deprecation" in responseHeaders) {
const matches = responseHeaders.link && responseHeaders.link.match(/<([^<>]+)>; rel="deprecation"/);
const deprecationLink = matches && matches.pop();
log.warn(
`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${responseHeaders.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`
);
}
if (status === 204 || status === 205) {
return octokitResponse;
}
if (requestOptions.method === "HEAD") {
if (status < 400) {
return octokitResponse;
}
throw new dist_src/* RequestError */.L(fetchResponse.statusText, status, {
response: octokitResponse,
request: requestOptions
});
}
if (status === 304) {
octokitResponse.data = await getResponseData(fetchResponse);
throw new dist_src/* RequestError */.L("Not modified", status, {
response: octokitResponse,
request: requestOptions
});
}
if (status >= 400) {
octokitResponse.data = await getResponseData(fetchResponse);
throw new dist_src/* RequestError */.L(toErrorMessage(octokitResponse.data), status, {
response: octokitResponse,
request: requestOptions
});
}
octokitResponse.data = parseSuccessResponseBody ? await getResponseData(fetchResponse) : fetchResponse.body;
return octokitResponse;
}
async function getResponseData(response) {
const contentType = response.headers.get("content-type");
if (!contentType) {
return response.text().catch(() => "");
}
const mimetype = (0,fast_content_type_parse.safeParse)(contentType);
if (isJSONResponse(mimetype)) {
let text = "";
try {
text = await response.text();
return JSON.parse(text);
} catch (err) {
return text;
}
} else if (mimetype.type.startsWith("text/") || mimetype.parameters.charset?.toLowerCase() === "utf-8") {
return response.text().catch(() => "");
} else {
return response.arrayBuffer().catch(() => new ArrayBuffer(0));
}
}
function isJSONResponse(mimetype) {
return mimetype.type === "application/json" || mimetype.type === "application/scim+json";
}
function toErrorMessage(data) {
if (typeof data === "string") {
return data;
}
if (data instanceof ArrayBuffer) {
return "Unknown error";
}
if ("message" in data) {
const suffix = "documentation_url" in data ? ` - ${data.documentation_url}` : "";
return Array.isArray(data.errors) ? `${data.message}: ${data.errors.map((v) => JSON.stringify(v)).join(", ")}${suffix}` : `${data.message}${suffix}`;
}
return `Unknown error: ${JSON.stringify(data)}`;
}
// pkg/dist-src/with-defaults.js
function dist_bundle_withDefaults(oldEndpoint, newDefaults) {
const endpoint2 = oldEndpoint.defaults(newDefaults);
const newApi = function(route, parameters) {
const endpointOptions = endpoint2.merge(route, parameters);
if (!endpointOptions.request || !endpointOptions.request.hook) {
return fetchWrapper(endpoint2.parse(endpointOptions));
}
const request2 = (route2, parameters2) => {
return fetchWrapper(
endpoint2.parse(endpoint2.merge(route2, parameters2))
);
};
Object.assign(request2, {
endpoint: endpoint2,
defaults: dist_bundle_withDefaults.bind(null, endpoint2)
});
return endpointOptions.request.hook(request2, endpointOptions);
};
return Object.assign(newApi, {
endpoint: endpoint2,
defaults: dist_bundle_withDefaults.bind(null, endpoint2)
});
}
// pkg/dist-src/index.js
var dist_bundle_request = dist_bundle_withDefaults(dist_bundle_endpoint, defaults_default);
;// CONCATENATED MODULE: ./node_modules/@octokit/graphql/dist-bundle/index.js
// pkg/dist-src/index.js
// pkg/dist-src/version.js
var graphql_dist_bundle_VERSION = "0.0.0-development";
// pkg/dist-src/with-defaults.js
// pkg/dist-src/graphql.js
// pkg/dist-src/error.js
function _buildMessageForResponseErrors(data) {
return `Request failed due to following response errors:
` + data.errors.map((e) => ` - ${e.message}`).join("\n");
}
var GraphqlResponseError = class extends Error {
constructor(request2, headers, response) {
super(_buildMessageForResponseErrors(response));
this.request = request2;
this.headers = headers;
this.response = response;
this.errors = response.errors;
this.data = response.data;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
}
}
name = "GraphqlResponseError";
errors;
data;
};
// pkg/dist-src/graphql.js
var NON_VARIABLE_OPTIONS = [
"method",
"baseUrl",
"url",
"headers",
"request",
"query",
"mediaType",
"operationName"
];
var FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"];
var GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/;
function graphql(request2, query, options) {
if (options) {
if (typeof query === "string" && "query" in options) {
return Promise.reject(
new Error(`[@octokit/graphql] "query" cannot be used as variable name`)
);
}
for (const key in options) {
if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue;
return Promise.reject(
new Error(
`[@octokit/graphql] "${key}" cannot be used as variable name`
)
);
}
}
const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query;
const requestOptions = Object.keys(
parsedOptions
).reduce((result, key) => {
if (NON_VARIABLE_OPTIONS.includes(key)) {
result[key] = parsedOptions[key];
return result;
}
if (!result.variables) {
result.variables = {};
}
result.variables[key] = parsedOptions[key];
return result;
}, {});
const baseUrl = parsedOptions.baseUrl || request2.endpoint.DEFAULTS.baseUrl;
if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {
requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");
}
return request2(requestOptions).then((response) => {
if (response.data.errors) {
const headers = {};
for (const key of Object.keys(response.headers)) {
headers[key] = response.headers[key];
}
throw new GraphqlResponseError(
requestOptions,
headers,
response.data
);
}
return response.data.data;
});
}
// pkg/dist-src/with-defaults.js
function graphql_dist_bundle_withDefaults(request2, newDefaults) {
const newRequest = request2.defaults(newDefaults);
const newApi = (query, options) => {
return graphql(newRequest, query, options);
};
return Object.assign(newApi, {
defaults: graphql_dist_bundle_withDefaults.bind(null, newRequest),
endpoint: newRequest.endpoint
});
}
// pkg/dist-src/index.js
var graphql2 = graphql_dist_bundle_withDefaults(dist_bundle_request, {
headers: {
"user-agent": `octokit-graphql.js/${graphql_dist_bundle_VERSION} ${getUserAgent()}`
},
method: "POST",
url: "/graphql"
});
function withCustomRequest(customRequest) {
return graphql_dist_bundle_withDefaults(customRequest, {
method: "POST",
url: "/graphql"
});
}
;// CONCATENATED MODULE: ./node_modules/@octokit/auth-token/dist-bundle/index.js
// pkg/dist-src/is-jwt.js
var b64url = "(?:[a-zA-Z0-9_-]+)";
var sep = "\\.";
var jwtRE = new RegExp(`^${b64url}${sep}${b64url}${sep}${b64url}$`);
var isJWT = jwtRE.test.bind(jwtRE);
// pkg/dist-src/auth.js
async function dist_bundle_auth(token) {
const isApp = isJWT(token);
const isInstallation = token.startsWith("v1.") || token.startsWith("ghs_");
const isUserToServer = token.startsWith("ghu_");
const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth";
return {
type: "token",
token,
tokenType
};
}
// pkg/dist-src/with-authorization-prefix.js
function withAuthorizationPrefix(token) {
if (token.split(/\./).length === 3) {
return `bearer ${token}`;
}
return `token ${token}`;
}
// pkg/dist-src/hook.js
async function dist_bundle_hook(token, request, route, parameters) {
const endpoint = request.endpoint.merge(
route,
parameters
);
endpoint.headers.authorization = withAuthorizationPrefix(token);
return request(endpoint);
}
// pkg/dist-src/index.js
var createTokenAuth = function createTokenAuth2(token) {
if (!token) {
throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");
}
if (typeof token !== "string") {
throw new Error(
"[@octokit/auth-token] Token passed to createTokenAuth is not a string"
);
}
token = token.replace(/^(token|bearer) +/i, "");
return Object.assign(dist_bundle_auth.bind(null, token), {
hook: dist_bundle_hook.bind(null, token)
});
};
;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/version.js
const version_VERSION = "6.1.5";
;// CONCATENATED MODULE: ./node_modules/@octokit/core/dist-src/index.js
const noop = () => {
};
const consoleWarn = console.warn.bind(console);
const consoleError = console.error.bind(console);
const userAgentTrail = `octokit-core.js/${version_VERSION} ${getUserAgent()}`;
class Octokit {
static VERSION = version_VERSION;
static defaults(defaults) {
const OctokitWithDefaults = class extends this {
constructor(...args) {
const options = args[0] || {};
if (typeof defaults === "function") {
super(defaults(options));
return;
}
super(
Object.assign(
{},
defaults,
options,
options.userAgent && defaults.userAgent ? {
userAgent: `${options.userAgent} ${defaults.userAgent}`
} : null
)
);
}
};
return OctokitWithDefaults;
}
static plugins = [];
/**
* Attach a plugin (or many) to your Octokit instance.
*
* @example
* const API = Octokit.plugin(plugin1, plugin2, plugin3, ...)
*/
static plugin(...newPlugins) {
const currentPlugins = this.plugins;
const NewOctokit = class extends this {
static plugins = currentPlugins.concat(
newPlugins.filter((plugin) => !currentPlugins.includes(plugin))
);
};
return NewOctokit;
}
constructor(options = {}) {
const hook = new before_after_hook.Collection();
const requestDefaults = {
baseUrl: dist_bundle_request.endpoint.DEFAULTS.baseUrl,
headers: {},
request: Object.assign({}, options.request, {
// @ts-ignore internal usage only, no need to type
hook: hook.bind(null, "request")
}),
mediaType: {
previews: [],
format: ""
}
};
requestDefaults.headers["user-agent"] = options.userAgent ? `${options.userAgent} ${userAgentTrail}` : userAgentTrail;
if (options.baseUrl) {
requestDefaults.baseUrl = options.baseUrl;
}
if (options.previews) {
requestDefaults.mediaType.previews = options.previews;
}
if (options.timeZone) {
requestDefaults.headers["time-zone"] = options.timeZone;
}
this.request = dist_bundle_request.defaults(requestDefaults);
this.graphql = withCustomRequest(this.request).defaults(requestDefaults);
this.log = Object.assign(
{
debug: noop,
info: noop,
warn: consoleWarn,
error: consoleError
},
options.log
);
this.hook = hook;
if (!options.authStrategy) {
if (!options.auth) {
this.auth = async () => ({
type: "unauthenticated"
});
} else {
const auth = createTokenAuth(options.auth);
hook.wrap("request", auth.hook);
this.auth = auth;
}
} else {
const { authStrategy, ...otherOptions } = options;
const auth = authStrategy(
Object.assign(
{
request: this.request,
log: this.log,
// we pass the current octokit instance as well as its constructor options
// to allow for authentication strategies that return a new octokit instance
// that shares the same internal state as the current one. The original
// requirement for this was the "event-octokit" authentication strategy
// of https://github.com/probot/octokit-auth-probot.
octokit: this,
octokitOptions: otherOptions
},
options.auth
)
);
hook.wrap("request", auth.hook);
this.auth = auth;
}
const classConstructor = this.constructor;
for (let i = 0; i < classConstructor.plugins.length; ++i) {
Object.assign(this, classConstructor.plugins[i](this, options));
}
}
// assigned during constructor
request;
graphql;
log;
hook;
// TODO: type `octokit.auth` based on passed options.authStrategy
auth;
}
}),
736: (function (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
__webpack_require__.d(__webpack_exports__, {
L: () => (RequestError)
});
class RequestError extends Error {
name;
/**
* http status code
*/
status;
/**
* Request options that lead to the error.
*/
request;
/**
* Response object if a response was received
*/
response;
constructor(message, statusCode, options) {
super(message);
this.name = "HttpError";
this.status = Number.parseInt(statusCode);
if (Number.isNaN(this.status)) {
this.status = 0;
}
if ("response" in options) {
this.response = options.response;
}
const requestCopy = Object.assign({}, options.request);
if (options.request.headers.authorization) {
requestCopy.headers = Object.assign({}, options.request.headers, {
authorization: options.request.headers.authorization.replace(
/(?<! ) .*$/,
" [REDACTED]"
)
});
}
requestCopy.url = requestCopy.url.replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]").replace(/\baccess_token=\w+/g, "access_token=[REDACTED]");
this.request = requestCopy;
}
}
}),
});
/************************************************************************/
// The module cache
var __webpack_module_cache__ = {};
// The require function
function __webpack_require__(moduleId) {
// Check if module is in cache
var cachedModule = __webpack_module_cache__[moduleId];
if (cachedModule !== undefined) {
return cachedModule.exports;
}
// Create a new module (and put it into the cache)
var module = (__webpack_module_cache__[moduleId] = {
exports: {}
});
// Execute the module function
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
// Return the exports of the module
return module.exports;
}
/************************************************************************/
// webpack/runtime/async_module
(() => {
var webpackQueues =
typeof Symbol === "function"
? Symbol("webpack queues")
: "__webpack_queues__";
var webpackExports =
typeof Symbol === "function"
? Symbol("webpack exports")
: "__webpack_exports__";
var webpackError =
typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__";
var resolveQueue = (queue) => {
if (queue && queue.d < 1) {
queue.d = 1;
queue.forEach((fn) => (fn.r--));
queue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));
}
}
var wrapDeps = (deps) => {
return deps.map((dep) => {
if (dep !== null && typeof dep === "object") {
if (dep[webpackQueues]) return dep;
if (dep.then) {
var queue = [];
queue.d = 0;
dep.then((r) => {
obj[webpackExports] = r;
resolveQueue(queue);
},(e) => {
obj[webpackError] = e;
resolveQueue(queue);
});
var obj = {};
obj[webpackQueues] = (fn) => (fn(queue));
return obj;
}
}
var ret = {};
ret[webpackQueues] = function() {};
ret[webpackExports] = dep;
return ret;
});
};
__webpack_require__.a = (module, body, hasAwait) => {
var queue;
hasAwait && ((queue = []).d = -1);
var depQueues = new Set();
var exports = module.exports;
var currentDeps;
var outerResolve;
var reject;
var promise = new Promise((resolve, rej) => {
reject = rej;
outerResolve = resolve;
});
promise[webpackExports] = exports;
promise[webpackQueues] = (fn) => { queue && fn(queue), depQueues.forEach(fn), promise["catch"](function() {}); };
module.exports = promise;
body((deps) => {
currentDeps = wrapDeps(deps);
var fn;
var getResult = () => {
return currentDeps.map((d) => {
if (d[webpackError]) throw d[webpackError];
return d[webpackExports];
});
}
var promise = new Promise((resolve) => {
fn = () => (resolve(getResult));
fn.r = 0;
var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))));
currentDeps.map((dep) => (dep[webpackQueues](fnQueue)));
});
return fn.r ? promise : getResult();
}, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)));
queue && queue.d < 0 && (queue.d = 0);
};
})();
// webpack/runtime/compat_get_default_export
(() => {
// getDefaultExport function for compatibility with non-ESM modules
__webpack_require__.n = (module) => {
var getter = module && module.__esModule ?
() => (module['default']) :
() => (module);
__webpack_require__.d(getter, { a: getter });
return getter;
};
})();
// webpack/runtime/define_property_getters
(() => {
__webpack_require__.d = (exports, definition) => {
for(var key in definition) {
if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
}
}
};
})();
// webpack/runtime/has_own_property
(() => {
__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
})();
// webpack/runtime/rspack_version
(() => {
__webpack_require__.rv = () => ("1.3.4")
})();
// webpack/runtime/rspack_unique_id
(() => {
__webpack_require__.ruid = "[email protected]";
})();
/************************************************************************/
// startup
// Load entry module and return exports
// This entry module used 'module' so it can't be inlined
var __webpack_exports__ = __webpack_require__(163);
})()
;
//# sourceMappingURL=bundle.js.map