mirror of
https://github.com/actions/checkout.git
synced 2024-11-14 14:15:40 +01:00
13334 lines
500 KiB
JavaScript
13334 lines
500 KiB
JavaScript
|
module.exports =
|
|||
|
/******/ (function(modules, runtime) { // webpackBootstrap
|
|||
|
/******/ "use strict";
|
|||
|
/******/ // The module cache
|
|||
|
/******/ var installedModules = {};
|
|||
|
/******/
|
|||
|
/******/ // The require function
|
|||
|
/******/ function __webpack_require__(moduleId) {
|
|||
|
/******/
|
|||
|
/******/ // Check if module is in cache
|
|||
|
/******/ if(installedModules[moduleId]) {
|
|||
|
/******/ return installedModules[moduleId].exports;
|
|||
|
/******/ }
|
|||
|
/******/ // Create a new module (and put it into the cache)
|
|||
|
/******/ var module = installedModules[moduleId] = {
|
|||
|
/******/ i: moduleId,
|
|||
|
/******/ l: false,
|
|||
|
/******/ exports: {}
|
|||
|
/******/ };
|
|||
|
/******/
|
|||
|
/******/ // Execute the module function
|
|||
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|||
|
/******/
|
|||
|
/******/ // Flag the module as loaded
|
|||
|
/******/ module.l = true;
|
|||
|
/******/
|
|||
|
/******/ // Return the exports of the module
|
|||
|
/******/ return module.exports;
|
|||
|
/******/ }
|
|||
|
/******/
|
|||
|
/******/
|
|||
|
/******/ __webpack_require__.ab = __dirname + "/";
|
|||
|
/******/
|
|||
|
/******/ // the startup function
|
|||
|
/******/ function startup() {
|
|||
|
/******/ // Load entry module and return exports
|
|||
|
/******/ return __webpack_require__(198);
|
|||
|
/******/ };
|
|||
|
/******/
|
|||
|
/******/ // run startup
|
|||
|
/******/ return startup();
|
|||
|
/******/ })
|
|||
|
/************************************************************************/
|
|||
|
/******/ ({
|
|||
|
|
|||
|
/***/ 0:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = withDefaults
|
|||
|
|
|||
|
const graphql = __webpack_require__(500)
|
|||
|
|
|||
|
function withDefaults (request, newDefaults) {
|
|||
|
const newRequest = request.defaults(newDefaults)
|
|||
|
const newApi = function (query, options) {
|
|||
|
return graphql(newRequest, query, options)
|
|||
|
}
|
|||
|
|
|||
|
newApi.defaults = withDefaults.bind(null, newRequest)
|
|||
|
return newApi
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 1:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const childProcess = __webpack_require__(129);
|
|||
|
const path = __webpack_require__(622);
|
|||
|
const util_1 = __webpack_require__(669);
|
|||
|
const ioUtil = __webpack_require__(672);
|
|||
|
const exec = util_1.promisify(childProcess.exec);
|
|||
|
/**
|
|||
|
* Copies a file or folder.
|
|||
|
* Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js
|
|||
|
*
|
|||
|
* @param source source path
|
|||
|
* @param dest destination path
|
|||
|
* @param options optional. See CopyOptions.
|
|||
|
*/
|
|||
|
function cp(source, dest, options = {}) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const { force, recursive } = readCopyOptions(options);
|
|||
|
const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null;
|
|||
|
// Dest is an existing file, but not forcing
|
|||
|
if (destStat && destStat.isFile() && !force) {
|
|||
|
return;
|
|||
|
}
|
|||
|
// If dest is an existing directory, should copy inside.
|
|||
|
const newDest = destStat && destStat.isDirectory()
|
|||
|
? path.join(dest, path.basename(source))
|
|||
|
: dest;
|
|||
|
if (!(yield ioUtil.exists(source))) {
|
|||
|
throw new Error(`no such file or directory: ${source}`);
|
|||
|
}
|
|||
|
const sourceStat = yield ioUtil.stat(source);
|
|||
|
if (sourceStat.isDirectory()) {
|
|||
|
if (!recursive) {
|
|||
|
throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`);
|
|||
|
}
|
|||
|
else {
|
|||
|
yield cpDirRecursive(source, newDest, 0, force);
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
if (path.relative(source, newDest) === '') {
|
|||
|
// a file cannot be copied to itself
|
|||
|
throw new Error(`'${newDest}' and '${source}' are the same file`);
|
|||
|
}
|
|||
|
yield copyFile(source, newDest, force);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
exports.cp = cp;
|
|||
|
/**
|
|||
|
* Moves a path.
|
|||
|
*
|
|||
|
* @param source source path
|
|||
|
* @param dest destination path
|
|||
|
* @param options optional. See MoveOptions.
|
|||
|
*/
|
|||
|
function mv(source, dest, options = {}) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
if (yield ioUtil.exists(dest)) {
|
|||
|
let destExists = true;
|
|||
|
if (yield ioUtil.isDirectory(dest)) {
|
|||
|
// If dest is directory copy src into dest
|
|||
|
dest = path.join(dest, path.basename(source));
|
|||
|
destExists = yield ioUtil.exists(dest);
|
|||
|
}
|
|||
|
if (destExists) {
|
|||
|
if (options.force == null || options.force) {
|
|||
|
yield rmRF(dest);
|
|||
|
}
|
|||
|
else {
|
|||
|
throw new Error('Destination already exists');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
yield mkdirP(path.dirname(dest));
|
|||
|
yield ioUtil.rename(source, dest);
|
|||
|
});
|
|||
|
}
|
|||
|
exports.mv = mv;
|
|||
|
/**
|
|||
|
* Remove a path recursively with force
|
|||
|
*
|
|||
|
* @param inputPath path to remove
|
|||
|
*/
|
|||
|
function rmRF(inputPath) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
if (ioUtil.IS_WINDOWS) {
|
|||
|
// Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another
|
|||
|
// program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del.
|
|||
|
try {
|
|||
|
if (yield ioUtil.isDirectory(inputPath, true)) {
|
|||
|
yield exec(`rd /s /q "${inputPath}"`);
|
|||
|
}
|
|||
|
else {
|
|||
|
yield exec(`del /f /a "${inputPath}"`);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
// if you try to delete a file that doesn't exist, desired result is achieved
|
|||
|
// other errors are valid
|
|||
|
if (err.code !== 'ENOENT')
|
|||
|
throw err;
|
|||
|
}
|
|||
|
// Shelling out fails to remove a symlink folder with missing source, this unlink catches that
|
|||
|
try {
|
|||
|
yield ioUtil.unlink(inputPath);
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
// if you try to delete a file that doesn't exist, desired result is achieved
|
|||
|
// other errors are valid
|
|||
|
if (err.code !== 'ENOENT')
|
|||
|
throw err;
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
let isDir = false;
|
|||
|
try {
|
|||
|
isDir = yield ioUtil.isDirectory(inputPath);
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
// if you try to delete a file that doesn't exist, desired result is achieved
|
|||
|
// other errors are valid
|
|||
|
if (err.code !== 'ENOENT')
|
|||
|
throw err;
|
|||
|
return;
|
|||
|
}
|
|||
|
if (isDir) {
|
|||
|
yield exec(`rm -rf "${inputPath}"`);
|
|||
|
}
|
|||
|
else {
|
|||
|
yield ioUtil.unlink(inputPath);
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
exports.rmRF = rmRF;
|
|||
|
/**
|
|||
|
* Make a directory. Creates the full path with folders in between
|
|||
|
* Will throw if it fails
|
|||
|
*
|
|||
|
* @param fsPath path to create
|
|||
|
* @returns Promise<void>
|
|||
|
*/
|
|||
|
function mkdirP(fsPath) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
yield ioUtil.mkdirP(fsPath);
|
|||
|
});
|
|||
|
}
|
|||
|
exports.mkdirP = mkdirP;
|
|||
|
/**
|
|||
|
* Returns path of a tool had the tool actually been invoked. Resolves via paths.
|
|||
|
* If you check and the tool does not exist, it will throw.
|
|||
|
*
|
|||
|
* @param tool name of the tool
|
|||
|
* @param check whether to check if tool exists
|
|||
|
* @returns Promise<string> path to tool
|
|||
|
*/
|
|||
|
function which(tool, check) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
if (!tool) {
|
|||
|
throw new Error("parameter 'tool' is required");
|
|||
|
}
|
|||
|
// recursive when check=true
|
|||
|
if (check) {
|
|||
|
const result = yield which(tool, false);
|
|||
|
if (!result) {
|
|||
|
if (ioUtil.IS_WINDOWS) {
|
|||
|
throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`);
|
|||
|
}
|
|||
|
else {
|
|||
|
throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
try {
|
|||
|
// build the list of extensions to try
|
|||
|
const extensions = [];
|
|||
|
if (ioUtil.IS_WINDOWS && process.env.PATHEXT) {
|
|||
|
for (const extension of process.env.PATHEXT.split(path.delimiter)) {
|
|||
|
if (extension) {
|
|||
|
extensions.push(extension);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// if it's rooted, return it if exists. otherwise return empty.
|
|||
|
if (ioUtil.isRooted(tool)) {
|
|||
|
const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions);
|
|||
|
if (filePath) {
|
|||
|
return filePath;
|
|||
|
}
|
|||
|
return '';
|
|||
|
}
|
|||
|
// if any path separators, return empty
|
|||
|
if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\'))) {
|
|||
|
return '';
|
|||
|
}
|
|||
|
// build the list of directories
|
|||
|
//
|
|||
|
// Note, technically "where" checks the current directory on Windows. From a toolkit perspective,
|
|||
|
// it feels like we should not do this. Checking the current directory seems like more of a use
|
|||
|
// case of a shell, and the which() function exposed by the toolkit should strive for consistency
|
|||
|
// across platforms.
|
|||
|
const directories = [];
|
|||
|
if (process.env.PATH) {
|
|||
|
for (const p of process.env.PATH.split(path.delimiter)) {
|
|||
|
if (p) {
|
|||
|
directories.push(p);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// return the first match
|
|||
|
for (const directory of directories) {
|
|||
|
const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions);
|
|||
|
if (filePath) {
|
|||
|
return filePath;
|
|||
|
}
|
|||
|
}
|
|||
|
return '';
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
throw new Error(`which failed with message ${err.message}`);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
exports.which = which;
|
|||
|
function readCopyOptions(options) {
|
|||
|
const force = options.force == null ? true : options.force;
|
|||
|
const recursive = Boolean(options.recursive);
|
|||
|
return { force, recursive };
|
|||
|
}
|
|||
|
function cpDirRecursive(sourceDir, destDir, currentDepth, force) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
// Ensure there is not a run away recursive copy
|
|||
|
if (currentDepth >= 255)
|
|||
|
return;
|
|||
|
currentDepth++;
|
|||
|
yield mkdirP(destDir);
|
|||
|
const files = yield ioUtil.readdir(sourceDir);
|
|||
|
for (const fileName of files) {
|
|||
|
const srcFile = `${sourceDir}/${fileName}`;
|
|||
|
const destFile = `${destDir}/${fileName}`;
|
|||
|
const srcFileStat = yield ioUtil.lstat(srcFile);
|
|||
|
if (srcFileStat.isDirectory()) {
|
|||
|
// Recurse
|
|||
|
yield cpDirRecursive(srcFile, destFile, currentDepth, force);
|
|||
|
}
|
|||
|
else {
|
|||
|
yield copyFile(srcFile, destFile, force);
|
|||
|
}
|
|||
|
}
|
|||
|
// Change the mode for the newly created directory
|
|||
|
yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode);
|
|||
|
});
|
|||
|
}
|
|||
|
// Buffered file copy
|
|||
|
function copyFile(srcFile, destFile, force) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) {
|
|||
|
// unlink/re-link it
|
|||
|
try {
|
|||
|
yield ioUtil.lstat(destFile);
|
|||
|
yield ioUtil.unlink(destFile);
|
|||
|
}
|
|||
|
catch (e) {
|
|||
|
// Try to override file permission
|
|||
|
if (e.code === 'EPERM') {
|
|||
|
yield ioUtil.chmod(destFile, '0666');
|
|||
|
yield ioUtil.unlink(destFile);
|
|||
|
}
|
|||
|
// other errors = it doesn't exist, no work to do
|
|||
|
}
|
|||
|
// Copy over symlink
|
|||
|
const symlinkFull = yield ioUtil.readlink(srcFile);
|
|||
|
yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null);
|
|||
|
}
|
|||
|
else if (!(yield ioUtil.exists(destFile)) || force) {
|
|||
|
yield ioUtil.copyFile(srcFile, destFile);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
//# sourceMappingURL=io.js.map
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 2:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
const os = __webpack_require__(87);
|
|||
|
const macosRelease = __webpack_require__(118);
|
|||
|
const winRelease = __webpack_require__(49);
|
|||
|
|
|||
|
const osName = (platform, release) => {
|
|||
|
if (!platform && release) {
|
|||
|
throw new Error('You can\'t specify a `release` without specifying `platform`');
|
|||
|
}
|
|||
|
|
|||
|
platform = platform || os.platform();
|
|||
|
|
|||
|
let id;
|
|||
|
|
|||
|
if (platform === 'darwin') {
|
|||
|
if (!release && os.platform() === 'darwin') {
|
|||
|
release = os.release();
|
|||
|
}
|
|||
|
|
|||
|
const prefix = release ? (Number(release.split('.')[0]) > 15 ? 'macOS' : 'OS X') : 'macOS';
|
|||
|
id = release ? macosRelease(release).name : '';
|
|||
|
return prefix + (id ? ' ' + id : '');
|
|||
|
}
|
|||
|
|
|||
|
if (platform === 'linux') {
|
|||
|
if (!release && os.platform() === 'linux') {
|
|||
|
release = os.release();
|
|||
|
}
|
|||
|
|
|||
|
id = release ? release.replace(/^(\d+\.\d+).*/, '$1') : '';
|
|||
|
return 'Linux' + (id ? ' ' + id : '');
|
|||
|
}
|
|||
|
|
|||
|
if (platform === 'win32') {
|
|||
|
if (!release && os.platform() === 'win32') {
|
|||
|
release = os.release();
|
|||
|
}
|
|||
|
|
|||
|
id = release ? winRelease(release) : '';
|
|||
|
return 'Windows' + (id ? ' ' + id : '');
|
|||
|
}
|
|||
|
|
|||
|
return platform;
|
|||
|
};
|
|||
|
|
|||
|
module.exports = osName;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 3:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
var once = __webpack_require__(969);
|
|||
|
|
|||
|
var noop = function() {};
|
|||
|
|
|||
|
var isRequest = function(stream) {
|
|||
|
return stream.setHeader && typeof stream.abort === 'function';
|
|||
|
};
|
|||
|
|
|||
|
var isChildProcess = function(stream) {
|
|||
|
return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3
|
|||
|
};
|
|||
|
|
|||
|
var eos = function(stream, opts, callback) {
|
|||
|
if (typeof opts === 'function') return eos(stream, null, opts);
|
|||
|
if (!opts) opts = {};
|
|||
|
|
|||
|
callback = once(callback || noop);
|
|||
|
|
|||
|
var ws = stream._writableState;
|
|||
|
var rs = stream._readableState;
|
|||
|
var readable = opts.readable || (opts.readable !== false && stream.readable);
|
|||
|
var writable = opts.writable || (opts.writable !== false && stream.writable);
|
|||
|
var cancelled = false;
|
|||
|
|
|||
|
var onlegacyfinish = function() {
|
|||
|
if (!stream.writable) onfinish();
|
|||
|
};
|
|||
|
|
|||
|
var onfinish = function() {
|
|||
|
writable = false;
|
|||
|
if (!readable) callback.call(stream);
|
|||
|
};
|
|||
|
|
|||
|
var onend = function() {
|
|||
|
readable = false;
|
|||
|
if (!writable) callback.call(stream);
|
|||
|
};
|
|||
|
|
|||
|
var onexit = function(exitCode) {
|
|||
|
callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);
|
|||
|
};
|
|||
|
|
|||
|
var onerror = function(err) {
|
|||
|
callback.call(stream, err);
|
|||
|
};
|
|||
|
|
|||
|
var onclose = function() {
|
|||
|
process.nextTick(onclosenexttick);
|
|||
|
};
|
|||
|
|
|||
|
var onclosenexttick = function() {
|
|||
|
if (cancelled) return;
|
|||
|
if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close'));
|
|||
|
if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close'));
|
|||
|
};
|
|||
|
|
|||
|
var onrequest = function() {
|
|||
|
stream.req.on('finish', onfinish);
|
|||
|
};
|
|||
|
|
|||
|
if (isRequest(stream)) {
|
|||
|
stream.on('complete', onfinish);
|
|||
|
stream.on('abort', onclose);
|
|||
|
if (stream.req) onrequest();
|
|||
|
else stream.on('request', onrequest);
|
|||
|
} else if (writable && !ws) { // legacy streams
|
|||
|
stream.on('end', onlegacyfinish);
|
|||
|
stream.on('close', onlegacyfinish);
|
|||
|
}
|
|||
|
|
|||
|
if (isChildProcess(stream)) stream.on('exit', onexit);
|
|||
|
|
|||
|
stream.on('end', onend);
|
|||
|
stream.on('finish', onfinish);
|
|||
|
if (opts.error !== false) stream.on('error', onerror);
|
|||
|
stream.on('close', onclose);
|
|||
|
|
|||
|
return function() {
|
|||
|
cancelled = true;
|
|||
|
stream.removeListener('complete', onfinish);
|
|||
|
stream.removeListener('abort', onclose);
|
|||
|
stream.removeListener('request', onrequest);
|
|||
|
if (stream.req) stream.req.removeListener('finish', onfinish);
|
|||
|
stream.removeListener('end', onlegacyfinish);
|
|||
|
stream.removeListener('close', onlegacyfinish);
|
|||
|
stream.removeListener('finish', onfinish);
|
|||
|
stream.removeListener('exit', onexit);
|
|||
|
stream.removeListener('end', onend);
|
|||
|
stream.removeListener('error', onerror);
|
|||
|
stream.removeListener('close', onclose);
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
module.exports = eos;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 8:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = iterator;
|
|||
|
|
|||
|
const normalizePaginatedListResponse = __webpack_require__(301);
|
|||
|
|
|||
|
function iterator(octokit, options) {
|
|||
|
const headers = options.headers;
|
|||
|
let url = octokit.request.endpoint(options).url;
|
|||
|
|
|||
|
return {
|
|||
|
[Symbol.asyncIterator]: () => ({
|
|||
|
next() {
|
|||
|
if (!url) {
|
|||
|
return Promise.resolve({ done: true });
|
|||
|
}
|
|||
|
|
|||
|
return octokit
|
|||
|
.request({ url, headers })
|
|||
|
|
|||
|
.then(response => {
|
|||
|
normalizePaginatedListResponse(octokit, url, response);
|
|||
|
|
|||
|
// `response.headers.link` format:
|
|||
|
// '<https://api.github.com/users/aseemk/followers?page=2>; rel="next", <https://api.github.com/users/aseemk/followers?page=2>; rel="last"'
|
|||
|
// sets `url` to undefined if "next" URL is not present or `link` header is not set
|
|||
|
url = ((response.headers.link || "").match(
|
|||
|
/<([^>]+)>;\s*rel="next"/
|
|||
|
) || [])[1];
|
|||
|
|
|||
|
return { value: response };
|
|||
|
});
|
|||
|
}
|
|||
|
})
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 9:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const os = __webpack_require__(87);
|
|||
|
const events = __webpack_require__(614);
|
|||
|
const child = __webpack_require__(129);
|
|||
|
/* eslint-disable @typescript-eslint/unbound-method */
|
|||
|
const IS_WINDOWS = process.platform === 'win32';
|
|||
|
/*
|
|||
|
* Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way.
|
|||
|
*/
|
|||
|
class ToolRunner extends events.EventEmitter {
|
|||
|
constructor(toolPath, args, options) {
|
|||
|
super();
|
|||
|
if (!toolPath) {
|
|||
|
throw new Error("Parameter 'toolPath' cannot be null or empty.");
|
|||
|
}
|
|||
|
this.toolPath = toolPath;
|
|||
|
this.args = args || [];
|
|||
|
this.options = options || {};
|
|||
|
}
|
|||
|
_debug(message) {
|
|||
|
if (this.options.listeners && this.options.listeners.debug) {
|
|||
|
this.options.listeners.debug(message);
|
|||
|
}
|
|||
|
}
|
|||
|
_getCommandString(options, noPrefix) {
|
|||
|
const toolPath = this._getSpawnFileName();
|
|||
|
const args = this._getSpawnArgs(options);
|
|||
|
let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool
|
|||
|
if (IS_WINDOWS) {
|
|||
|
// Windows + cmd file
|
|||
|
if (this._isCmdFile()) {
|
|||
|
cmd += toolPath;
|
|||
|
for (const a of args) {
|
|||
|
cmd += ` ${a}`;
|
|||
|
}
|
|||
|
}
|
|||
|
// Windows + verbatim
|
|||
|
else if (options.windowsVerbatimArguments) {
|
|||
|
cmd += `"${toolPath}"`;
|
|||
|
for (const a of args) {
|
|||
|
cmd += ` ${a}`;
|
|||
|
}
|
|||
|
}
|
|||
|
// Windows (regular)
|
|||
|
else {
|
|||
|
cmd += this._windowsQuoteCmdArg(toolPath);
|
|||
|
for (const a of args) {
|
|||
|
cmd += ` ${this._windowsQuoteCmdArg(a)}`;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
// OSX/Linux - this can likely be improved with some form of quoting.
|
|||
|
// creating processes on Unix is fundamentally different than Windows.
|
|||
|
// on Unix, execvp() takes an arg array.
|
|||
|
cmd += toolPath;
|
|||
|
for (const a of args) {
|
|||
|
cmd += ` ${a}`;
|
|||
|
}
|
|||
|
}
|
|||
|
return cmd;
|
|||
|
}
|
|||
|
_processLineBuffer(data, strBuffer, onLine) {
|
|||
|
try {
|
|||
|
let s = strBuffer + data.toString();
|
|||
|
let n = s.indexOf(os.EOL);
|
|||
|
while (n > -1) {
|
|||
|
const line = s.substring(0, n);
|
|||
|
onLine(line);
|
|||
|
// the rest of the string ...
|
|||
|
s = s.substring(n + os.EOL.length);
|
|||
|
n = s.indexOf(os.EOL);
|
|||
|
}
|
|||
|
strBuffer = s;
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
// streaming lines to console is best effort. Don't fail a build.
|
|||
|
this._debug(`error processing line. Failed with error ${err}`);
|
|||
|
}
|
|||
|
}
|
|||
|
_getSpawnFileName() {
|
|||
|
if (IS_WINDOWS) {
|
|||
|
if (this._isCmdFile()) {
|
|||
|
return process.env['COMSPEC'] || 'cmd.exe';
|
|||
|
}
|
|||
|
}
|
|||
|
return this.toolPath;
|
|||
|
}
|
|||
|
_getSpawnArgs(options) {
|
|||
|
if (IS_WINDOWS) {
|
|||
|
if (this._isCmdFile()) {
|
|||
|
let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;
|
|||
|
for (const a of this.args) {
|
|||
|
argline += ' ';
|
|||
|
argline += options.windowsVerbatimArguments
|
|||
|
? a
|
|||
|
: this._windowsQuoteCmdArg(a);
|
|||
|
}
|
|||
|
argline += '"';
|
|||
|
return [argline];
|
|||
|
}
|
|||
|
}
|
|||
|
return this.args;
|
|||
|
}
|
|||
|
_endsWith(str, end) {
|
|||
|
return str.endsWith(end);
|
|||
|
}
|
|||
|
_isCmdFile() {
|
|||
|
const upperToolPath = this.toolPath.toUpperCase();
|
|||
|
return (this._endsWith(upperToolPath, '.CMD') ||
|
|||
|
this._endsWith(upperToolPath, '.BAT'));
|
|||
|
}
|
|||
|
_windowsQuoteCmdArg(arg) {
|
|||
|
// for .exe, apply the normal quoting rules that libuv applies
|
|||
|
if (!this._isCmdFile()) {
|
|||
|
return this._uvQuoteCmdArg(arg);
|
|||
|
}
|
|||
|
// otherwise apply quoting rules specific to the cmd.exe command line parser.
|
|||
|
// the libuv rules are generic and are not designed specifically for cmd.exe
|
|||
|
// command line parser.
|
|||
|
//
|
|||
|
// for a detailed description of the cmd.exe command line parser, refer to
|
|||
|
// http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912
|
|||
|
// need quotes for empty arg
|
|||
|
if (!arg) {
|
|||
|
return '""';
|
|||
|
}
|
|||
|
// determine whether the arg needs to be quoted
|
|||
|
const cmdSpecialChars = [
|
|||
|
' ',
|
|||
|
'\t',
|
|||
|
'&',
|
|||
|
'(',
|
|||
|
')',
|
|||
|
'[',
|
|||
|
']',
|
|||
|
'{',
|
|||
|
'}',
|
|||
|
'^',
|
|||
|
'=',
|
|||
|
';',
|
|||
|
'!',
|
|||
|
"'",
|
|||
|
'+',
|
|||
|
',',
|
|||
|
'`',
|
|||
|
'~',
|
|||
|
'|',
|
|||
|
'<',
|
|||
|
'>',
|
|||
|
'"'
|
|||
|
];
|
|||
|
let needsQuotes = false;
|
|||
|
for (const char of arg) {
|
|||
|
if (cmdSpecialChars.some(x => x === char)) {
|
|||
|
needsQuotes = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
// short-circuit if quotes not needed
|
|||
|
if (!needsQuotes) {
|
|||
|
return arg;
|
|||
|
}
|
|||
|
// the following quoting rules are very similar to the rules that by libuv applies.
|
|||
|
//
|
|||
|
// 1) wrap the string in quotes
|
|||
|
//
|
|||
|
// 2) double-up quotes - i.e. " => ""
|
|||
|
//
|
|||
|
// this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately
|
|||
|
// doesn't work well with a cmd.exe command line.
|
|||
|
//
|
|||
|
// note, replacing " with "" also works well if the arg is passed to a downstream .NET console app.
|
|||
|
// for example, the command line:
|
|||
|
// foo.exe "myarg:""my val"""
|
|||
|
// is parsed by a .NET console app into an arg array:
|
|||
|
// [ "myarg:\"my val\"" ]
|
|||
|
// which is the same end result when applying libuv quoting rules. although the actual
|
|||
|
// command line from libuv quoting rules would look like:
|
|||
|
// foo.exe "myarg:\"my val\""
|
|||
|
//
|
|||
|
// 3) double-up slashes that precede a quote,
|
|||
|
// e.g. hello \world => "hello \world"
|
|||
|
// hello\"world => "hello\\""world"
|
|||
|
// hello\\"world => "hello\\\\""world"
|
|||
|
// hello world\ => "hello world\\"
|
|||
|
//
|
|||
|
// technically this is not required for a cmd.exe command line, or the batch argument parser.
|
|||
|
// the reasons for including this as a .cmd quoting rule are:
|
|||
|
//
|
|||
|
// a) this is optimized for the scenario where the argument is passed from the .cmd file to an
|
|||
|
// external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule.
|
|||
|
//
|
|||
|
// b) it's what we've been doing previously (by deferring to node default behavior) and we
|
|||
|
// haven't heard any complaints about that aspect.
|
|||
|
//
|
|||
|
// note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be
|
|||
|
// escaped when used on the command line directly - even though within a .cmd file % can be escaped
|
|||
|
// by using %%.
|
|||
|
//
|
|||
|
// the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts
|
|||
|
// the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing.
|
|||
|
//
|
|||
|
// one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would
|
|||
|
// often work, since it is unlikely that var^ would exist, and the ^ character is removed when the
|
|||
|
// variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args
|
|||
|
// to an external program.
|
|||
|
//
|
|||
|
// an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file.
|
|||
|
// % can be escaped within a .cmd file.
|
|||
|
let reverse = '"';
|
|||
|
let quoteHit = true;
|
|||
|
for (let i = arg.length; i > 0; i--) {
|
|||
|
// walk the string in reverse
|
|||
|
reverse += arg[i - 1];
|
|||
|
if (quoteHit && arg[i - 1] === '\\') {
|
|||
|
reverse += '\\'; // double the slash
|
|||
|
}
|
|||
|
else if (arg[i - 1] === '"') {
|
|||
|
quoteHit = true;
|
|||
|
reverse += '"'; // double the quote
|
|||
|
}
|
|||
|
else {
|
|||
|
quoteHit = false;
|
|||
|
}
|
|||
|
}
|
|||
|
reverse += '"';
|
|||
|
return reverse
|
|||
|
.split('')
|
|||
|
.reverse()
|
|||
|
.join('');
|
|||
|
}
|
|||
|
_uvQuoteCmdArg(arg) {
|
|||
|
// Tool runner wraps child_process.spawn() and needs to apply the same quoting as
|
|||
|
// Node in certain cases where the undocumented spawn option windowsVerbatimArguments
|
|||
|
// is used.
|
|||
|
//
|
|||
|
// Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV,
|
|||
|
// see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details),
|
|||
|
// pasting copyright notice from Node within this function:
|
|||
|
//
|
|||
|
// Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
|||
|
//
|
|||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|||
|
// of this software and associated documentation files (the "Software"), to
|
|||
|
// deal in the Software without restriction, including without limitation the
|
|||
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|||
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|||
|
// furnished to do so, subject to the following conditions:
|
|||
|
//
|
|||
|
// The above copyright notice and this permission notice shall be included in
|
|||
|
// all copies or substantial portions of the Software.
|
|||
|
//
|
|||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|||
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|||
|
// IN THE SOFTWARE.
|
|||
|
if (!arg) {
|
|||
|
// Need double quotation for empty argument
|
|||
|
return '""';
|
|||
|
}
|
|||
|
if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) {
|
|||
|
// No quotation needed
|
|||
|
return arg;
|
|||
|
}
|
|||
|
if (!arg.includes('"') && !arg.includes('\\')) {
|
|||
|
// No embedded double quotes or backslashes, so I can just wrap
|
|||
|
// quote marks around the whole thing.
|
|||
|
return `"${arg}"`;
|
|||
|
}
|
|||
|
// Expected input/output:
|
|||
|
// input : hello"world
|
|||
|
// output: "hello\"world"
|
|||
|
// input : hello""world
|
|||
|
// output: "hello\"\"world"
|
|||
|
// input : hello\world
|
|||
|
// output: hello\world
|
|||
|
// input : hello\\world
|
|||
|
// output: hello\\world
|
|||
|
// input : hello\"world
|
|||
|
// output: "hello\\\"world"
|
|||
|
// input : hello\\"world
|
|||
|
// output: "hello\\\\\"world"
|
|||
|
// input : hello world\
|
|||
|
// output: "hello world\\" - note the comment in libuv actually reads "hello world\"
|
|||
|
// but it appears the comment is wrong, it should be "hello world\\"
|
|||
|
let reverse = '"';
|
|||
|
let quoteHit = true;
|
|||
|
for (let i = arg.length; i > 0; i--) {
|
|||
|
// walk the string in reverse
|
|||
|
reverse += arg[i - 1];
|
|||
|
if (quoteHit && arg[i - 1] === '\\') {
|
|||
|
reverse += '\\';
|
|||
|
}
|
|||
|
else if (arg[i - 1] === '"') {
|
|||
|
quoteHit = true;
|
|||
|
reverse += '\\';
|
|||
|
}
|
|||
|
else {
|
|||
|
quoteHit = false;
|
|||
|
}
|
|||
|
}
|
|||
|
reverse += '"';
|
|||
|
return reverse
|
|||
|
.split('')
|
|||
|
.reverse()
|
|||
|
.join('');
|
|||
|
}
|
|||
|
_cloneExecOptions(options) {
|
|||
|
options = options || {};
|
|||
|
const result = {
|
|||
|
cwd: options.cwd || process.cwd(),
|
|||
|
env: options.env || process.env,
|
|||
|
silent: options.silent || false,
|
|||
|
windowsVerbatimArguments: options.windowsVerbatimArguments || false,
|
|||
|
failOnStdErr: options.failOnStdErr || false,
|
|||
|
ignoreReturnCode: options.ignoreReturnCode || false,
|
|||
|
delay: options.delay || 10000
|
|||
|
};
|
|||
|
result.outStream = options.outStream || process.stdout;
|
|||
|
result.errStream = options.errStream || process.stderr;
|
|||
|
return result;
|
|||
|
}
|
|||
|
_getSpawnOptions(options, toolPath) {
|
|||
|
options = options || {};
|
|||
|
const result = {};
|
|||
|
result.cwd = options.cwd;
|
|||
|
result.env = options.env;
|
|||
|
result['windowsVerbatimArguments'] =
|
|||
|
options.windowsVerbatimArguments || this._isCmdFile();
|
|||
|
if (options.windowsVerbatimArguments) {
|
|||
|
result.argv0 = `"${toolPath}"`;
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Exec a tool.
|
|||
|
* Output will be streamed to the live console.
|
|||
|
* Returns promise with return code
|
|||
|
*
|
|||
|
* @param tool path to tool to exec
|
|||
|
* @param options optional exec options. See ExecOptions
|
|||
|
* @returns number
|
|||
|
*/
|
|||
|
exec() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
return new Promise((resolve, reject) => {
|
|||
|
this._debug(`exec tool: ${this.toolPath}`);
|
|||
|
this._debug('arguments:');
|
|||
|
for (const arg of this.args) {
|
|||
|
this._debug(` ${arg}`);
|
|||
|
}
|
|||
|
const optionsNonNull = this._cloneExecOptions(this.options);
|
|||
|
if (!optionsNonNull.silent && optionsNonNull.outStream) {
|
|||
|
optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL);
|
|||
|
}
|
|||
|
const state = new ExecState(optionsNonNull, this.toolPath);
|
|||
|
state.on('debug', (message) => {
|
|||
|
this._debug(message);
|
|||
|
});
|
|||
|
const fileName = this._getSpawnFileName();
|
|||
|
const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName));
|
|||
|
const stdbuffer = '';
|
|||
|
if (cp.stdout) {
|
|||
|
cp.stdout.on('data', (data) => {
|
|||
|
if (this.options.listeners && this.options.listeners.stdout) {
|
|||
|
this.options.listeners.stdout(data);
|
|||
|
}
|
|||
|
if (!optionsNonNull.silent && optionsNonNull.outStream) {
|
|||
|
optionsNonNull.outStream.write(data);
|
|||
|
}
|
|||
|
this._processLineBuffer(data, stdbuffer, (line) => {
|
|||
|
if (this.options.listeners && this.options.listeners.stdline) {
|
|||
|
this.options.listeners.stdline(line);
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
const errbuffer = '';
|
|||
|
if (cp.stderr) {
|
|||
|
cp.stderr.on('data', (data) => {
|
|||
|
state.processStderr = true;
|
|||
|
if (this.options.listeners && this.options.listeners.stderr) {
|
|||
|
this.options.listeners.stderr(data);
|
|||
|
}
|
|||
|
if (!optionsNonNull.silent &&
|
|||
|
optionsNonNull.errStream &&
|
|||
|
optionsNonNull.outStream) {
|
|||
|
const s = optionsNonNull.failOnStdErr
|
|||
|
? optionsNonNull.errStream
|
|||
|
: optionsNonNull.outStream;
|
|||
|
s.write(data);
|
|||
|
}
|
|||
|
this._processLineBuffer(data, errbuffer, (line) => {
|
|||
|
if (this.options.listeners && this.options.listeners.errline) {
|
|||
|
this.options.listeners.errline(line);
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
cp.on('error', (err) => {
|
|||
|
state.processError = err.message;
|
|||
|
state.processExited = true;
|
|||
|
state.processClosed = true;
|
|||
|
state.CheckComplete();
|
|||
|
});
|
|||
|
cp.on('exit', (code) => {
|
|||
|
state.processExitCode = code;
|
|||
|
state.processExited = true;
|
|||
|
this._debug(`Exit code ${code} received from tool '${this.toolPath}'`);
|
|||
|
state.CheckComplete();
|
|||
|
});
|
|||
|
cp.on('close', (code) => {
|
|||
|
state.processExitCode = code;
|
|||
|
state.processExited = true;
|
|||
|
state.processClosed = true;
|
|||
|
this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);
|
|||
|
state.CheckComplete();
|
|||
|
});
|
|||
|
state.on('done', (error, exitCode) => {
|
|||
|
if (stdbuffer.length > 0) {
|
|||
|
this.emit('stdline', stdbuffer);
|
|||
|
}
|
|||
|
if (errbuffer.length > 0) {
|
|||
|
this.emit('errline', errbuffer);
|
|||
|
}
|
|||
|
cp.removeAllListeners();
|
|||
|
if (error) {
|
|||
|
reject(error);
|
|||
|
}
|
|||
|
else {
|
|||
|
resolve(exitCode);
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
exports.ToolRunner = ToolRunner;
|
|||
|
/**
|
|||
|
* Convert an arg string to an array of args. Handles escaping
|
|||
|
*
|
|||
|
* @param argString string of arguments
|
|||
|
* @returns string[] array of arguments
|
|||
|
*/
|
|||
|
function argStringToArray(argString) {
|
|||
|
const args = [];
|
|||
|
let inQuotes = false;
|
|||
|
let escaped = false;
|
|||
|
let arg = '';
|
|||
|
function append(c) {
|
|||
|
// we only escape double quotes.
|
|||
|
if (escaped && c !== '"') {
|
|||
|
arg += '\\';
|
|||
|
}
|
|||
|
arg += c;
|
|||
|
escaped = false;
|
|||
|
}
|
|||
|
for (let i = 0; i < argString.length; i++) {
|
|||
|
const c = argString.charAt(i);
|
|||
|
if (c === '"') {
|
|||
|
if (!escaped) {
|
|||
|
inQuotes = !inQuotes;
|
|||
|
}
|
|||
|
else {
|
|||
|
append(c);
|
|||
|
}
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (c === '\\' && escaped) {
|
|||
|
append(c);
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (c === '\\' && inQuotes) {
|
|||
|
escaped = true;
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (c === ' ' && !inQuotes) {
|
|||
|
if (arg.length > 0) {
|
|||
|
args.push(arg);
|
|||
|
arg = '';
|
|||
|
}
|
|||
|
continue;
|
|||
|
}
|
|||
|
append(c);
|
|||
|
}
|
|||
|
if (arg.length > 0) {
|
|||
|
args.push(arg.trim());
|
|||
|
}
|
|||
|
return args;
|
|||
|
}
|
|||
|
exports.argStringToArray = argStringToArray;
|
|||
|
class ExecState extends events.EventEmitter {
|
|||
|
constructor(options, toolPath) {
|
|||
|
super();
|
|||
|
this.processClosed = false; // tracks whether the process has exited and stdio is closed
|
|||
|
this.processError = '';
|
|||
|
this.processExitCode = 0;
|
|||
|
this.processExited = false; // tracks whether the process has exited
|
|||
|
this.processStderr = false; // tracks whether stderr was written to
|
|||
|
this.delay = 10000; // 10 seconds
|
|||
|
this.done = false;
|
|||
|
this.timeout = null;
|
|||
|
if (!toolPath) {
|
|||
|
throw new Error('toolPath must not be empty');
|
|||
|
}
|
|||
|
this.options = options;
|
|||
|
this.toolPath = toolPath;
|
|||
|
if (options.delay) {
|
|||
|
this.delay = options.delay;
|
|||
|
}
|
|||
|
}
|
|||
|
CheckComplete() {
|
|||
|
if (this.done) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (this.processClosed) {
|
|||
|
this._setResult();
|
|||
|
}
|
|||
|
else if (this.processExited) {
|
|||
|
this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this);
|
|||
|
}
|
|||
|
}
|
|||
|
_debug(message) {
|
|||
|
this.emit('debug', message);
|
|||
|
}
|
|||
|
_setResult() {
|
|||
|
// determine whether there is an error
|
|||
|
let error;
|
|||
|
if (this.processExited) {
|
|||
|
if (this.processError) {
|
|||
|
error = new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`);
|
|||
|
}
|
|||
|
else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) {
|
|||
|
error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`);
|
|||
|
}
|
|||
|
else if (this.processStderr && this.options.failOnStdErr) {
|
|||
|
error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`);
|
|||
|
}
|
|||
|
}
|
|||
|
// clear the timeout
|
|||
|
if (this.timeout) {
|
|||
|
clearTimeout(this.timeout);
|
|||
|
this.timeout = null;
|
|||
|
}
|
|||
|
this.done = true;
|
|||
|
this.emit('done', error, this.processExitCode);
|
|||
|
}
|
|||
|
static HandleTimeout(state) {
|
|||
|
if (state.done) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (!state.processClosed && state.processExited) {
|
|||
|
const message = `The STDIO streams did not close within ${state.delay /
|
|||
|
1000} seconds of the exit event from process '${state.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;
|
|||
|
state._debug(message);
|
|||
|
}
|
|||
|
state._setResult();
|
|||
|
}
|
|||
|
}
|
|||
|
//# sourceMappingURL=toolrunner.js.map
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 11:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
// Returns a wrapper function that returns a wrapped callback
|
|||
|
// The wrapper function should do some stuff, and return a
|
|||
|
// presumably different callback function.
|
|||
|
// This makes sure that own properties are retained, so that
|
|||
|
// decorations and such are not lost along the way.
|
|||
|
module.exports = wrappy
|
|||
|
function wrappy (fn, cb) {
|
|||
|
if (fn && cb) return wrappy(fn)(cb)
|
|||
|
|
|||
|
if (typeof fn !== 'function')
|
|||
|
throw new TypeError('need wrapper function')
|
|||
|
|
|||
|
Object.keys(fn).forEach(function (k) {
|
|||
|
wrapper[k] = fn[k]
|
|||
|
})
|
|||
|
|
|||
|
return wrapper
|
|||
|
|
|||
|
function wrapper() {
|
|||
|
var args = new Array(arguments.length)
|
|||
|
for (var i = 0; i < args.length; i++) {
|
|||
|
args[i] = arguments[i]
|
|||
|
}
|
|||
|
var ret = fn.apply(this, args)
|
|||
|
var cb = args[args.length-1]
|
|||
|
if (typeof ret === 'function' && ret !== cb) {
|
|||
|
Object.keys(cb).forEach(function (k) {
|
|||
|
ret[k] = cb[k]
|
|||
|
})
|
|||
|
}
|
|||
|
return ret
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 18:
|
|||
|
/***/ (function() {
|
|||
|
|
|||
|
eval("require")("encoding");
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 19:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = authenticationPlugin;
|
|||
|
|
|||
|
const { Deprecation } = __webpack_require__(692);
|
|||
|
const once = __webpack_require__(969);
|
|||
|
|
|||
|
const deprecateAuthenticate = once((log, deprecation) => log.warn(deprecation));
|
|||
|
|
|||
|
const authenticate = __webpack_require__(674);
|
|||
|
const beforeRequest = __webpack_require__(471);
|
|||
|
const requestError = __webpack_require__(349);
|
|||
|
|
|||
|
function authenticationPlugin(octokit, options) {
|
|||
|
if (options.auth) {
|
|||
|
octokit.authenticate = () => {
|
|||
|
deprecateAuthenticate(
|
|||
|
octokit.log,
|
|||
|
new Deprecation(
|
|||
|
'[@octokit/rest] octokit.authenticate() is deprecated and has no effect when "auth" option is set on Octokit constructor'
|
|||
|
)
|
|||
|
);
|
|||
|
};
|
|||
|
return;
|
|||
|
}
|
|||
|
const state = {
|
|||
|
octokit,
|
|||
|
auth: false
|
|||
|
};
|
|||
|
octokit.authenticate = authenticate.bind(null, state);
|
|||
|
octokit.hook.before("request", beforeRequest.bind(null, state));
|
|||
|
octokit.hook.error("request", requestError.bind(null, state));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 20:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
const cp = __webpack_require__(129);
|
|||
|
const parse = __webpack_require__(568);
|
|||
|
const enoent = __webpack_require__(881);
|
|||
|
|
|||
|
function spawn(command, args, options) {
|
|||
|
// Parse the arguments
|
|||
|
const parsed = parse(command, args, options);
|
|||
|
|
|||
|
// Spawn the child process
|
|||
|
const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);
|
|||
|
|
|||
|
// Hook into child process "exit" event to emit an error if the command
|
|||
|
// does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
|
|||
|
enoent.hookChildProcess(spawned, parsed);
|
|||
|
|
|||
|
return spawned;
|
|||
|
}
|
|||
|
|
|||
|
function spawnSync(command, args, options) {
|
|||
|
// Parse the arguments
|
|||
|
const parsed = parse(command, args, options);
|
|||
|
|
|||
|
// Spawn the child process
|
|||
|
const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);
|
|||
|
|
|||
|
// Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16
|
|||
|
result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = spawn;
|
|||
|
module.exports.spawn = spawn;
|
|||
|
module.exports.sync = spawnSync;
|
|||
|
|
|||
|
module.exports._parse = parse;
|
|||
|
module.exports._enoent = enoent;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 34:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("https");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 39:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
module.exports = opts => {
|
|||
|
opts = opts || {};
|
|||
|
|
|||
|
const env = opts.env || process.env;
|
|||
|
const platform = opts.platform || process.platform;
|
|||
|
|
|||
|
if (platform !== 'win32') {
|
|||
|
return 'PATH';
|
|||
|
}
|
|||
|
|
|||
|
return Object.keys(env).find(x => x.toUpperCase() === 'PATH') || 'Path';
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 46:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = getUserAgentNode
|
|||
|
|
|||
|
const osName = __webpack_require__(2)
|
|||
|
|
|||
|
function getUserAgentNode () {
|
|||
|
try {
|
|||
|
return `Node.js/${process.version.substr(1)} (${osName()}; ${process.arch})`
|
|||
|
} catch (error) {
|
|||
|
if (/wmic os get Caption/.test(error.message)) {
|
|||
|
return 'Windows <version undetectable>'
|
|||
|
}
|
|||
|
|
|||
|
throw error
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 47:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = factory;
|
|||
|
|
|||
|
const Octokit = __webpack_require__(402);
|
|||
|
const registerPlugin = __webpack_require__(855);
|
|||
|
|
|||
|
function factory(plugins) {
|
|||
|
const Api = Octokit.bind(null, plugins || []);
|
|||
|
Api.plugin = registerPlugin.bind(null, plugins || []);
|
|||
|
return Api;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 49:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
const os = __webpack_require__(87);
|
|||
|
const execa = __webpack_require__(955);
|
|||
|
|
|||
|
// Reference: https://www.gaijin.at/en/lstwinver.php
|
|||
|
const names = new Map([
|
|||
|
['10.0', '10'],
|
|||
|
['6.3', '8.1'],
|
|||
|
['6.2', '8'],
|
|||
|
['6.1', '7'],
|
|||
|
['6.0', 'Vista'],
|
|||
|
['5.2', 'Server 2003'],
|
|||
|
['5.1', 'XP'],
|
|||
|
['5.0', '2000'],
|
|||
|
['4.9', 'ME'],
|
|||
|
['4.1', '98'],
|
|||
|
['4.0', '95']
|
|||
|
]);
|
|||
|
|
|||
|
const windowsRelease = release => {
|
|||
|
const version = /\d+\.\d/.exec(release || os.release());
|
|||
|
|
|||
|
if (release && !version) {
|
|||
|
throw new Error('`release` argument doesn\'t match `n.n`');
|
|||
|
}
|
|||
|
|
|||
|
const ver = (version || [])[0];
|
|||
|
|
|||
|
// Server 2008, 2012 and 2016 versions are ambiguous with desktop versions and must be detected at runtime.
|
|||
|
// If `release` is omitted or we're on a Windows system, and the version number is an ambiguous version
|
|||
|
// then use `wmic` to get the OS caption: https://msdn.microsoft.com/en-us/library/aa394531(v=vs.85).aspx
|
|||
|
// If the resulting caption contains the year 2008, 2012 or 2016, it is a server version, so return a server OS name.
|
|||
|
if ((!release || release === os.release()) && ['6.1', '6.2', '6.3', '10.0'].includes(ver)) {
|
|||
|
const stdout = execa.sync('wmic', ['os', 'get', 'Caption']).stdout || '';
|
|||
|
const year = (stdout.match(/2008|2012|2016/) || [])[0];
|
|||
|
if (year) {
|
|||
|
return `Server ${year}`;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return names.get(ver);
|
|||
|
};
|
|||
|
|
|||
|
module.exports = windowsRelease;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 87:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("os");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 118:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
const os = __webpack_require__(87);
|
|||
|
|
|||
|
const nameMap = new Map([
|
|||
|
[19, 'Catalina'],
|
|||
|
[18, 'Mojave'],
|
|||
|
[17, 'High Sierra'],
|
|||
|
[16, 'Sierra'],
|
|||
|
[15, 'El Capitan'],
|
|||
|
[14, 'Yosemite'],
|
|||
|
[13, 'Mavericks'],
|
|||
|
[12, 'Mountain Lion'],
|
|||
|
[11, 'Lion'],
|
|||
|
[10, 'Snow Leopard'],
|
|||
|
[9, 'Leopard'],
|
|||
|
[8, 'Tiger'],
|
|||
|
[7, 'Panther'],
|
|||
|
[6, 'Jaguar'],
|
|||
|
[5, 'Puma']
|
|||
|
]);
|
|||
|
|
|||
|
const macosRelease = release => {
|
|||
|
release = Number((release || os.release()).split('.')[0]);
|
|||
|
return {
|
|||
|
name: nameMap.get(release),
|
|||
|
version: '10.' + (release - 4)
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
module.exports = macosRelease;
|
|||
|
// TODO: remove this in the next major version
|
|||
|
module.exports.default = macosRelease;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 126:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
/**
|
|||
|
* lodash (Custom Build) <https://lodash.com/>
|
|||
|
* Build: `lodash modularize exports="npm" -o ./`
|
|||
|
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
|
|||
|
* Released under MIT license <https://lodash.com/license>
|
|||
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
*/
|
|||
|
|
|||
|
/** Used as the size to enable large array optimizations. */
|
|||
|
var LARGE_ARRAY_SIZE = 200;
|
|||
|
|
|||
|
/** Used to stand-in for `undefined` hash values. */
|
|||
|
var HASH_UNDEFINED = '__lodash_hash_undefined__';
|
|||
|
|
|||
|
/** Used as references for various `Number` constants. */
|
|||
|
var INFINITY = 1 / 0;
|
|||
|
|
|||
|
/** `Object#toString` result references. */
|
|||
|
var funcTag = '[object Function]',
|
|||
|
genTag = '[object GeneratorFunction]';
|
|||
|
|
|||
|
/**
|
|||
|
* Used to match `RegExp`
|
|||
|
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
|
|||
|
*/
|
|||
|
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
|||
|
|
|||
|
/** Used to detect host constructors (Safari). */
|
|||
|
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|||
|
|
|||
|
/** Detect free variable `global` from Node.js. */
|
|||
|
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
|
|||
|
|
|||
|
/** Detect free variable `self`. */
|
|||
|
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
|||
|
|
|||
|
/** Used as a reference to the global object. */
|
|||
|
var root = freeGlobal || freeSelf || Function('return this')();
|
|||
|
|
|||
|
/**
|
|||
|
* A specialized version of `_.includes` for arrays without support for
|
|||
|
* specifying an index to search from.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} [array] The array to inspect.
|
|||
|
* @param {*} target The value to search for.
|
|||
|
* @returns {boolean} Returns `true` if `target` is found, else `false`.
|
|||
|
*/
|
|||
|
function arrayIncludes(array, value) {
|
|||
|
var length = array ? array.length : 0;
|
|||
|
return !!length && baseIndexOf(array, value, 0) > -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* This function is like `arrayIncludes` except that it accepts a comparator.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} [array] The array to inspect.
|
|||
|
* @param {*} target The value to search for.
|
|||
|
* @param {Function} comparator The comparator invoked per element.
|
|||
|
* @returns {boolean} Returns `true` if `target` is found, else `false`.
|
|||
|
*/
|
|||
|
function arrayIncludesWith(array, value, comparator) {
|
|||
|
var index = -1,
|
|||
|
length = array ? array.length : 0;
|
|||
|
|
|||
|
while (++index < length) {
|
|||
|
if (comparator(value, array[index])) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.findIndex` and `_.findLastIndex` without
|
|||
|
* support for iteratee shorthands.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @param {Function} predicate The function invoked per iteration.
|
|||
|
* @param {number} fromIndex The index to search from.
|
|||
|
* @param {boolean} [fromRight] Specify iterating from right to left.
|
|||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|||
|
*/
|
|||
|
function baseFindIndex(array, predicate, fromIndex, fromRight) {
|
|||
|
var length = array.length,
|
|||
|
index = fromIndex + (fromRight ? 1 : -1);
|
|||
|
|
|||
|
while ((fromRight ? index-- : ++index < length)) {
|
|||
|
if (predicate(array[index], index, array)) {
|
|||
|
return index;
|
|||
|
}
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.indexOf` without `fromIndex` bounds checks.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @param {*} value The value to search for.
|
|||
|
* @param {number} fromIndex The index to search from.
|
|||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|||
|
*/
|
|||
|
function baseIndexOf(array, value, fromIndex) {
|
|||
|
if (value !== value) {
|
|||
|
return baseFindIndex(array, baseIsNaN, fromIndex);
|
|||
|
}
|
|||
|
var index = fromIndex - 1,
|
|||
|
length = array.length;
|
|||
|
|
|||
|
while (++index < length) {
|
|||
|
if (array[index] === value) {
|
|||
|
return index;
|
|||
|
}
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isNaN` without support for number objects.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
|
|||
|
*/
|
|||
|
function baseIsNaN(value) {
|
|||
|
return value !== value;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a cache value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} cache The cache to query.
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function cacheHas(cache, key) {
|
|||
|
return cache.has(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the value at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} [object] The object to query.
|
|||
|
* @param {string} key The key of the property to get.
|
|||
|
* @returns {*} Returns the property value.
|
|||
|
*/
|
|||
|
function getValue(object, key) {
|
|||
|
return object == null ? undefined : object[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a host object in IE < 9.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
|
|||
|
*/
|
|||
|
function isHostObject(value) {
|
|||
|
// Many host objects are `Object` objects that can coerce to strings
|
|||
|
// despite having improperly defined `toString` methods.
|
|||
|
var result = false;
|
|||
|
if (value != null && typeof value.toString != 'function') {
|
|||
|
try {
|
|||
|
result = !!(value + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `set` to an array of its values.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} set The set to convert.
|
|||
|
* @returns {Array} Returns the values.
|
|||
|
*/
|
|||
|
function setToArray(set) {
|
|||
|
var index = -1,
|
|||
|
result = Array(set.size);
|
|||
|
|
|||
|
set.forEach(function(value) {
|
|||
|
result[++index] = value;
|
|||
|
});
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/** Used for built-in method references. */
|
|||
|
var arrayProto = Array.prototype,
|
|||
|
funcProto = Function.prototype,
|
|||
|
objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Used to detect overreaching core-js shims. */
|
|||
|
var coreJsData = root['__core-js_shared__'];
|
|||
|
|
|||
|
/** Used to detect methods masquerading as native. */
|
|||
|
var maskSrcKey = (function() {
|
|||
|
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
|
|||
|
return uid ? ('Symbol(src)_1.' + uid) : '';
|
|||
|
}());
|
|||
|
|
|||
|
/** Used to resolve the decompiled source of functions. */
|
|||
|
var funcToString = funcProto.toString;
|
|||
|
|
|||
|
/** Used to check objects for own properties. */
|
|||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|||
|
|
|||
|
/**
|
|||
|
* Used to resolve the
|
|||
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
|||
|
* of values.
|
|||
|
*/
|
|||
|
var objectToString = objectProto.toString;
|
|||
|
|
|||
|
/** Used to detect if a method is native. */
|
|||
|
var reIsNative = RegExp('^' +
|
|||
|
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
|
|||
|
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
|||
|
);
|
|||
|
|
|||
|
/** Built-in value references. */
|
|||
|
var splice = arrayProto.splice;
|
|||
|
|
|||
|
/* Built-in method references that are verified to be native. */
|
|||
|
var Map = getNative(root, 'Map'),
|
|||
|
Set = getNative(root, 'Set'),
|
|||
|
nativeCreate = getNative(Object, 'create');
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a hash object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function Hash(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf Hash
|
|||
|
*/
|
|||
|
function hashClear() {
|
|||
|
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf Hash
|
|||
|
* @param {Object} hash The hash to modify.
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function hashDelete(key) {
|
|||
|
return this.has(key) && delete this.__data__[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the hash value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function hashGet(key) {
|
|||
|
var data = this.__data__;
|
|||
|
if (nativeCreate) {
|
|||
|
var result = data[key];
|
|||
|
return result === HASH_UNDEFINED ? undefined : result;
|
|||
|
}
|
|||
|
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a hash value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function hashHas(key) {
|
|||
|
var data = this.__data__;
|
|||
|
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the hash `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the hash instance.
|
|||
|
*/
|
|||
|
function hashSet(key, value) {
|
|||
|
var data = this.__data__;
|
|||
|
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `Hash`.
|
|||
|
Hash.prototype.clear = hashClear;
|
|||
|
Hash.prototype['delete'] = hashDelete;
|
|||
|
Hash.prototype.get = hashGet;
|
|||
|
Hash.prototype.has = hashHas;
|
|||
|
Hash.prototype.set = hashSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an list cache object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function ListCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf ListCache
|
|||
|
*/
|
|||
|
function listCacheClear() {
|
|||
|
this.__data__ = [];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function listCacheDelete(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var lastIndex = data.length - 1;
|
|||
|
if (index == lastIndex) {
|
|||
|
data.pop();
|
|||
|
} else {
|
|||
|
splice.call(data, index, 1);
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the list cache value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function listCacheGet(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
return index < 0 ? undefined : data[index][1];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a list cache value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function listCacheHas(key) {
|
|||
|
return assocIndexOf(this.__data__, key) > -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the list cache `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the list cache instance.
|
|||
|
*/
|
|||
|
function listCacheSet(key, value) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
data.push([key, value]);
|
|||
|
} else {
|
|||
|
data[index][1] = value;
|
|||
|
}
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `ListCache`.
|
|||
|
ListCache.prototype.clear = listCacheClear;
|
|||
|
ListCache.prototype['delete'] = listCacheDelete;
|
|||
|
ListCache.prototype.get = listCacheGet;
|
|||
|
ListCache.prototype.has = listCacheHas;
|
|||
|
ListCache.prototype.set = listCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a map cache object to store key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function MapCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf MapCache
|
|||
|
*/
|
|||
|
function mapCacheClear() {
|
|||
|
this.__data__ = {
|
|||
|
'hash': new Hash,
|
|||
|
'map': new (Map || ListCache),
|
|||
|
'string': new Hash
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheDelete(key) {
|
|||
|
return getMapData(this, key)['delete'](key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the map value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function mapCacheGet(key) {
|
|||
|
return getMapData(this, key).get(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a map value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheHas(key) {
|
|||
|
return getMapData(this, key).has(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the map `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the map cache instance.
|
|||
|
*/
|
|||
|
function mapCacheSet(key, value) {
|
|||
|
getMapData(this, key).set(key, value);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `MapCache`.
|
|||
|
MapCache.prototype.clear = mapCacheClear;
|
|||
|
MapCache.prototype['delete'] = mapCacheDelete;
|
|||
|
MapCache.prototype.get = mapCacheGet;
|
|||
|
MapCache.prototype.has = mapCacheHas;
|
|||
|
MapCache.prototype.set = mapCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
*
|
|||
|
* Creates an array cache object to store unique values.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [values] The values to cache.
|
|||
|
*/
|
|||
|
function SetCache(values) {
|
|||
|
var index = -1,
|
|||
|
length = values ? values.length : 0;
|
|||
|
|
|||
|
this.__data__ = new MapCache;
|
|||
|
while (++index < length) {
|
|||
|
this.add(values[index]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Adds `value` to the array cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name add
|
|||
|
* @memberOf SetCache
|
|||
|
* @alias push
|
|||
|
* @param {*} value The value to cache.
|
|||
|
* @returns {Object} Returns the cache instance.
|
|||
|
*/
|
|||
|
function setCacheAdd(value) {
|
|||
|
this.__data__.set(value, HASH_UNDEFINED);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is in the array cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf SetCache
|
|||
|
* @param {*} value The value to search for.
|
|||
|
* @returns {number} Returns `true` if `value` is found, else `false`.
|
|||
|
*/
|
|||
|
function setCacheHas(value) {
|
|||
|
return this.__data__.has(value);
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `SetCache`.
|
|||
|
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
|
|||
|
SetCache.prototype.has = setCacheHas;
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the index at which the `key` is found in `array` of key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @param {*} key The key to search for.
|
|||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|||
|
*/
|
|||
|
function assocIndexOf(array, key) {
|
|||
|
var length = array.length;
|
|||
|
while (length--) {
|
|||
|
if (eq(array[length][0], key)) {
|
|||
|
return length;
|
|||
|
}
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isNative` without bad shim checks.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a native function,
|
|||
|
* else `false`.
|
|||
|
*/
|
|||
|
function baseIsNative(value) {
|
|||
|
if (!isObject(value) || isMasked(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
|
|||
|
return pattern.test(toSource(value));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.uniqBy` without support for iteratee shorthands.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @param {Function} [iteratee] The iteratee invoked per element.
|
|||
|
* @param {Function} [comparator] The comparator invoked per element.
|
|||
|
* @returns {Array} Returns the new duplicate free array.
|
|||
|
*/
|
|||
|
function baseUniq(array, iteratee, comparator) {
|
|||
|
var index = -1,
|
|||
|
includes = arrayIncludes,
|
|||
|
length = array.length,
|
|||
|
isCommon = true,
|
|||
|
result = [],
|
|||
|
seen = result;
|
|||
|
|
|||
|
if (comparator) {
|
|||
|
isCommon = false;
|
|||
|
includes = arrayIncludesWith;
|
|||
|
}
|
|||
|
else if (length >= LARGE_ARRAY_SIZE) {
|
|||
|
var set = iteratee ? null : createSet(array);
|
|||
|
if (set) {
|
|||
|
return setToArray(set);
|
|||
|
}
|
|||
|
isCommon = false;
|
|||
|
includes = cacheHas;
|
|||
|
seen = new SetCache;
|
|||
|
}
|
|||
|
else {
|
|||
|
seen = iteratee ? [] : result;
|
|||
|
}
|
|||
|
outer:
|
|||
|
while (++index < length) {
|
|||
|
var value = array[index],
|
|||
|
computed = iteratee ? iteratee(value) : value;
|
|||
|
|
|||
|
value = (comparator || value !== 0) ? value : 0;
|
|||
|
if (isCommon && computed === computed) {
|
|||
|
var seenIndex = seen.length;
|
|||
|
while (seenIndex--) {
|
|||
|
if (seen[seenIndex] === computed) {
|
|||
|
continue outer;
|
|||
|
}
|
|||
|
}
|
|||
|
if (iteratee) {
|
|||
|
seen.push(computed);
|
|||
|
}
|
|||
|
result.push(value);
|
|||
|
}
|
|||
|
else if (!includes(seen, computed, comparator)) {
|
|||
|
if (seen !== result) {
|
|||
|
seen.push(computed);
|
|||
|
}
|
|||
|
result.push(value);
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a set object of `values`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} values The values to add to the set.
|
|||
|
* @returns {Object} Returns the new set.
|
|||
|
*/
|
|||
|
var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
|
|||
|
return new Set(values);
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the data for `map`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} map The map to query.
|
|||
|
* @param {string} key The reference key.
|
|||
|
* @returns {*} Returns the map data.
|
|||
|
*/
|
|||
|
function getMapData(map, key) {
|
|||
|
var data = map.__data__;
|
|||
|
return isKeyable(key)
|
|||
|
? data[typeof key == 'string' ? 'string' : 'hash']
|
|||
|
: data.map;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the native function at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {string} key The key of the method to get.
|
|||
|
* @returns {*} Returns the function if it's native, else `undefined`.
|
|||
|
*/
|
|||
|
function getNative(object, key) {
|
|||
|
var value = getValue(object, key);
|
|||
|
return baseIsNative(value) ? value : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is suitable for use as unique object key.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
|
|||
|
*/
|
|||
|
function isKeyable(value) {
|
|||
|
var type = typeof value;
|
|||
|
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
|
|||
|
? (value !== '__proto__')
|
|||
|
: (value === null);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `func` has its source masked.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to check.
|
|||
|
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
|
|||
|
*/
|
|||
|
function isMasked(func) {
|
|||
|
return !!maskSrcKey && (maskSrcKey in func);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `func` to its source code.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to process.
|
|||
|
* @returns {string} Returns the source code.
|
|||
|
*/
|
|||
|
function toSource(func) {
|
|||
|
if (func != null) {
|
|||
|
try {
|
|||
|
return funcToString.call(func);
|
|||
|
} catch (e) {}
|
|||
|
try {
|
|||
|
return (func + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return '';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a duplicate-free version of an array, using
|
|||
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|||
|
* for equality comparisons, in which only the first occurrence of each
|
|||
|
* element is kept.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Array
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @returns {Array} Returns the new duplicate free array.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.uniq([2, 1, 2]);
|
|||
|
* // => [2, 1]
|
|||
|
*/
|
|||
|
function uniq(array) {
|
|||
|
return (array && array.length)
|
|||
|
? baseUniq(array)
|
|||
|
: [];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Performs a
|
|||
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|||
|
* comparison between two values to determine if they are equivalent.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to compare.
|
|||
|
* @param {*} other The other value to compare.
|
|||
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1 };
|
|||
|
* var other = { 'a': 1 };
|
|||
|
*
|
|||
|
* _.eq(object, object);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq(object, other);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq('a', 'a');
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq('a', Object('a'));
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq(NaN, NaN);
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function eq(value, other) {
|
|||
|
return value === other || (value !== value && other !== other);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a `Function` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isFunction(_);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isFunction(/abc/);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isFunction(value) {
|
|||
|
// The use of `Object#toString` avoids issues with the `typeof` operator
|
|||
|
// in Safari 8-9 which returns 'object' for typed array and other constructors.
|
|||
|
var tag = isObject(value) ? objectToString.call(value) : '';
|
|||
|
return tag == funcTag || tag == genTag;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is the
|
|||
|
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
|
|||
|
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObject({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(_.noop);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObject(value) {
|
|||
|
var type = typeof value;
|
|||
|
return !!value && (type == 'object' || type == 'function');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* This method returns `undefined`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 2.3.0
|
|||
|
* @category Util
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.times(2, _.noop);
|
|||
|
* // => [undefined, undefined]
|
|||
|
*/
|
|||
|
function noop() {
|
|||
|
// No operation performed.
|
|||
|
}
|
|||
|
|
|||
|
module.exports = uniq;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 129:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("child_process");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 143:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = withAuthorizationPrefix;
|
|||
|
|
|||
|
const atob = __webpack_require__(368);
|
|||
|
|
|||
|
const REGEX_IS_BASIC_AUTH = /^[\w-]+:/;
|
|||
|
|
|||
|
function withAuthorizationPrefix(authorization) {
|
|||
|
if (/^(basic|bearer|token) /i.test(authorization)) {
|
|||
|
return authorization;
|
|||
|
}
|
|||
|
|
|||
|
try {
|
|||
|
if (REGEX_IS_BASIC_AUTH.test(atob(authorization))) {
|
|||
|
return `basic ${authorization}`;
|
|||
|
}
|
|||
|
} catch (error) {}
|
|||
|
|
|||
|
if (authorization.split(/\./).length === 3) {
|
|||
|
return `bearer ${authorization}`;
|
|||
|
}
|
|||
|
|
|||
|
return `token ${authorization}`;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 145:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
const pump = __webpack_require__(453);
|
|||
|
const bufferStream = __webpack_require__(966);
|
|||
|
|
|||
|
class MaxBufferError extends Error {
|
|||
|
constructor() {
|
|||
|
super('maxBuffer exceeded');
|
|||
|
this.name = 'MaxBufferError';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function getStream(inputStream, options) {
|
|||
|
if (!inputStream) {
|
|||
|
return Promise.reject(new Error('Expected a stream'));
|
|||
|
}
|
|||
|
|
|||
|
options = Object.assign({maxBuffer: Infinity}, options);
|
|||
|
|
|||
|
const {maxBuffer} = options;
|
|||
|
|
|||
|
let stream;
|
|||
|
return new Promise((resolve, reject) => {
|
|||
|
const rejectPromise = error => {
|
|||
|
if (error) { // A null check
|
|||
|
error.bufferedData = stream.getBufferedValue();
|
|||
|
}
|
|||
|
reject(error);
|
|||
|
};
|
|||
|
|
|||
|
stream = pump(inputStream, bufferStream(options), error => {
|
|||
|
if (error) {
|
|||
|
rejectPromise(error);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
resolve();
|
|||
|
});
|
|||
|
|
|||
|
stream.on('data', () => {
|
|||
|
if (stream.getBufferedLength() > maxBuffer) {
|
|||
|
rejectPromise(new MaxBufferError());
|
|||
|
}
|
|||
|
});
|
|||
|
}).then(() => stream.getBufferedValue());
|
|||
|
}
|
|||
|
|
|||
|
module.exports = getStream;
|
|||
|
module.exports.buffer = (stream, options) => getStream(stream, Object.assign({}, options, {encoding: 'buffer'}));
|
|||
|
module.exports.array = (stream, options) => getStream(stream, Object.assign({}, options, {array: true}));
|
|||
|
module.exports.MaxBufferError = MaxBufferError;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 148:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = paginatePlugin;
|
|||
|
|
|||
|
const iterator = __webpack_require__(8);
|
|||
|
const paginate = __webpack_require__(807);
|
|||
|
|
|||
|
function paginatePlugin(octokit) {
|
|||
|
octokit.paginate = paginate.bind(null, octokit);
|
|||
|
octokit.paginate.iterator = iterator.bind(null, octokit);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 168:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
const alias = ['stdin', 'stdout', 'stderr'];
|
|||
|
|
|||
|
const hasAlias = opts => alias.some(x => Boolean(opts[x]));
|
|||
|
|
|||
|
module.exports = opts => {
|
|||
|
if (!opts) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
if (opts.stdio && hasAlias(opts)) {
|
|||
|
throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${alias.map(x => `\`${x}\``).join(', ')}`);
|
|||
|
}
|
|||
|
|
|||
|
if (typeof opts.stdio === 'string') {
|
|||
|
return opts.stdio;
|
|||
|
}
|
|||
|
|
|||
|
const stdio = opts.stdio || [];
|
|||
|
|
|||
|
if (!Array.isArray(stdio)) {
|
|||
|
throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``);
|
|||
|
}
|
|||
|
|
|||
|
const result = [];
|
|||
|
const len = Math.max(stdio.length, alias.length);
|
|||
|
|
|||
|
for (let i = 0; i < len; i++) {
|
|||
|
let value = null;
|
|||
|
|
|||
|
if (stdio[i] !== undefined) {
|
|||
|
value = stdio[i];
|
|||
|
} else if (opts[alias[i]] !== undefined) {
|
|||
|
value = opts[alias[i]];
|
|||
|
}
|
|||
|
|
|||
|
result[i] = value;
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 190:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = authenticationPlugin;
|
|||
|
|
|||
|
const beforeRequest = __webpack_require__(863);
|
|||
|
const requestError = __webpack_require__(991);
|
|||
|
const validate = __webpack_require__(954);
|
|||
|
|
|||
|
function authenticationPlugin(octokit, options) {
|
|||
|
if (!options.auth) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
validate(options.auth);
|
|||
|
|
|||
|
const state = {
|
|||
|
octokit,
|
|||
|
auth: options.auth
|
|||
|
};
|
|||
|
|
|||
|
octokit.hook.before("request", beforeRequest.bind(null, state));
|
|||
|
octokit.hook.error("request", requestError.bind(null, state));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 197:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = isexe
|
|||
|
isexe.sync = sync
|
|||
|
|
|||
|
var fs = __webpack_require__(747)
|
|||
|
|
|||
|
function isexe (path, options, cb) {
|
|||
|
fs.stat(path, function (er, stat) {
|
|||
|
cb(er, er ? false : checkStat(stat, options))
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
function sync (path, options) {
|
|||
|
return checkStat(fs.statSync(path), options)
|
|||
|
}
|
|||
|
|
|||
|
function checkStat (stat, options) {
|
|||
|
return stat.isFile() && checkMode(stat, options)
|
|||
|
}
|
|||
|
|
|||
|
function checkMode (stat, options) {
|
|||
|
var mod = stat.mode
|
|||
|
var uid = stat.uid
|
|||
|
var gid = stat.gid
|
|||
|
|
|||
|
var myUid = options.uid !== undefined ?
|
|||
|
options.uid : process.getuid && process.getuid()
|
|||
|
var myGid = options.gid !== undefined ?
|
|||
|
options.gid : process.getgid && process.getgid()
|
|||
|
|
|||
|
var u = parseInt('100', 8)
|
|||
|
var g = parseInt('010', 8)
|
|||
|
var o = parseInt('001', 8)
|
|||
|
var ug = u | g
|
|||
|
|
|||
|
var ret = (mod & o) ||
|
|||
|
(mod & g) && gid === myGid ||
|
|||
|
(mod & u) && uid === myUid ||
|
|||
|
(mod & ug) && myUid === 0
|
|||
|
|
|||
|
return ret
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 198:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|||
|
if (mod && mod.__esModule) return mod;
|
|||
|
var result = {};
|
|||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|||
|
result["default"] = mod;
|
|||
|
return result;
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const core = __importStar(__webpack_require__(470));
|
|||
|
const coreCommand = __importStar(__webpack_require__(431));
|
|||
|
const gitSourceProvider = __importStar(__webpack_require__(293));
|
|||
|
const inputHelper = __importStar(__webpack_require__(821));
|
|||
|
const path = __importStar(__webpack_require__(622));
|
|||
|
const cleanupRepositoryPath = process.env['STATE_repositoryPath'];
|
|||
|
function run() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
try {
|
|||
|
const sourceSettings = inputHelper.getInputs();
|
|||
|
try {
|
|||
|
// Register problem matcher
|
|||
|
coreCommand.issueCommand('add-matcher', {}, path.join(__dirname, 'problem-matcher.json'));
|
|||
|
// Get sources
|
|||
|
yield gitSourceProvider.getSource(sourceSettings);
|
|||
|
}
|
|||
|
finally {
|
|||
|
// Unregister problem matcher
|
|||
|
coreCommand.issueCommand('remove-matcher', { owner: 'checkout-git' }, '');
|
|||
|
}
|
|||
|
}
|
|||
|
catch (error) {
|
|||
|
core.setFailed(error.message);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
function cleanup() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
try {
|
|||
|
yield gitSourceProvider.cleanup(cleanupRepositoryPath);
|
|||
|
}
|
|||
|
catch (error) {
|
|||
|
core.warning(error.message);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
// Main
|
|||
|
if (!cleanupRepositoryPath) {
|
|||
|
run();
|
|||
|
}
|
|||
|
// Post
|
|||
|
else {
|
|||
|
cleanup();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 211:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
|||
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|||
|
|
|||
|
var osName = _interopDefault(__webpack_require__(2));
|
|||
|
|
|||
|
function getUserAgent() {
|
|||
|
try {
|
|||
|
return `Node.js/${process.version.substr(1)} (${osName()}; ${process.arch})`;
|
|||
|
} catch (error) {
|
|||
|
if (/wmic os get Caption/.test(error.message)) {
|
|||
|
return "Windows <version undetectable>";
|
|||
|
}
|
|||
|
|
|||
|
throw error;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.getUserAgent = getUserAgent;
|
|||
|
//# sourceMappingURL=index.js.map
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 215:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = {"name":"@octokit/rest","version":"16.33.0","publishConfig":{"access":"public"},"description":"GitHub REST API client for Node.js","keywords":["octokit","github","rest","api-client"],"author":"Gregor Martynus (https://github.com/gr2m)","contributors":[{"name":"Mike de Boer","email":"info@mikedeboer.nl"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Joe Gallo","email":"joe@brassafrax.com"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"repository":"https://github.com/octokit/rest.js","dependencies":{"@octokit/request":"^5.0.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^12.0.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.0.0","cypress":"^3.0.0","glob":"^7.1.2","http-proxy-agent":"^2.1.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","mkdirp":"^0.5.1","mocha":"^6.0.0","mustache":"^3.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^14.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^15.0.0","sinon":"^7.2.4","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"types":"index.d.ts","scripts":{"coverage":"nyc report --reporter=html && open coverage/index.html","lint":"prettier --check '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","lint:fix":"prettier --write '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","pretest":"npm run -s lint","test":"nyc mocha test/mocha-node-setup.js \"test/*/**/*-test.js\"","test:browser":"cypress run --browser chrome","build":"npm-run-all build:*","build:ts":"npm run -s update-endpoints:typescript","prebuild:browser":"mkdirp dist/","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:code":"node scripts/update-endpoints/code","update-endpoints:typescript":"node scripts/update-endpoints/typescript","prevalidate:ts":"npm run -s build:ts","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","start-fixtures-server":"octokit-fixtures-server"},"license":"MIT","files":["index.js","index.d.ts","lib","plugins"],"nyc":{"ignore":["test"]},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}],"_resolved":"https://registry.npmjs.org/@octokit/rest/-/rest-16.33.0.tgz","_integrity":"sha512-t4jMR+odsfooQwmHiREoTQixVTX2DfdbSaO+lKrW9R5XBuk0DW+5T/JdfwtxAGUAHgvDDpWY/NVVDfEPTzxD6g==","_from":"@octokit/rest@16.33.0"};
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 227:
|
|||
|
/***/ (function(__unusedmodule, exports) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
function getCheckoutInfo(git, ref, commit) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
if (!git) {
|
|||
|
throw new Error('Arg git cannot be empty');
|
|||
|
}
|
|||
|
if (!ref && !commit) {
|
|||
|
throw new Error('Args ref and commit cannot both be empty');
|
|||
|
}
|
|||
|
const result = {};
|
|||
|
const upperRef = (ref || '').toUpperCase();
|
|||
|
// SHA only
|
|||
|
if (!ref) {
|
|||
|
result.ref = commit;
|
|||
|
}
|
|||
|
// refs/heads/
|
|||
|
else if (upperRef.startsWith('REFS/HEADS/')) {
|
|||
|
const branch = ref.substring('refs/heads/'.length);
|
|||
|
result.ref = branch;
|
|||
|
result.startPoint = `refs/remotes/origin/${branch}`;
|
|||
|
}
|
|||
|
// refs/pull/
|
|||
|
else if (upperRef.startsWith('REFS/PULL/')) {
|
|||
|
const branch = ref.substring('refs/pull/'.length);
|
|||
|
result.ref = `refs/remotes/pull/${branch}`;
|
|||
|
}
|
|||
|
// refs/tags/
|
|||
|
else if (upperRef.startsWith('REFS/')) {
|
|||
|
result.ref = ref;
|
|||
|
}
|
|||
|
// Unqualified ref, check for a matching branch or tag
|
|||
|
else {
|
|||
|
if (yield git.branchExists(true, `origin/${ref}`)) {
|
|||
|
result.ref = ref;
|
|||
|
result.startPoint = `refs/remotes/origin/${ref}`;
|
|||
|
}
|
|||
|
else if (yield git.tagExists(`${ref}`)) {
|
|||
|
result.ref = `refs/tags/${ref}`;
|
|||
|
}
|
|||
|
else {
|
|||
|
throw new Error(`A branch or tag with the name '${ref}' could not be found`);
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
exports.getCheckoutInfo = getCheckoutInfo;
|
|||
|
function getRefSpec(ref, commit) {
|
|||
|
if (!ref && !commit) {
|
|||
|
throw new Error('Args ref and commit cannot both be empty');
|
|||
|
}
|
|||
|
const upperRef = (ref || '').toUpperCase();
|
|||
|
// SHA
|
|||
|
if (commit) {
|
|||
|
// refs/heads
|
|||
|
if (upperRef.startsWith('REFS/HEADS/')) {
|
|||
|
const branch = ref.substring('refs/heads/'.length);
|
|||
|
return [`+${commit}:refs/remotes/origin/${branch}`];
|
|||
|
}
|
|||
|
// refs/pull/
|
|||
|
else if (upperRef.startsWith('REFS/PULL/')) {
|
|||
|
const branch = ref.substring('refs/pull/'.length);
|
|||
|
return [`+${commit}:refs/remotes/pull/${branch}`];
|
|||
|
}
|
|||
|
// refs/tags/
|
|||
|
else if (upperRef.startsWith('REFS/TAGS/')) {
|
|||
|
return [`+${commit}:${ref}`];
|
|||
|
}
|
|||
|
// Otherwise no destination ref
|
|||
|
else {
|
|||
|
return [commit];
|
|||
|
}
|
|||
|
}
|
|||
|
// Unqualified ref, check for a matching branch or tag
|
|||
|
else if (!upperRef.startsWith('REFS/')) {
|
|||
|
return [
|
|||
|
`+refs/heads/${ref}*:refs/remotes/origin/${ref}*`,
|
|||
|
`+refs/tags/${ref}*:refs/tags/${ref}*`
|
|||
|
];
|
|||
|
}
|
|||
|
// refs/heads/
|
|||
|
else if (upperRef.startsWith('REFS/HEADS/')) {
|
|||
|
const branch = ref.substring('refs/heads/'.length);
|
|||
|
return [`+${ref}:refs/remotes/origin/${branch}`];
|
|||
|
}
|
|||
|
// refs/pull/
|
|||
|
else if (upperRef.startsWith('REFS/PULL/')) {
|
|||
|
const branch = ref.substring('refs/pull/'.length);
|
|||
|
return [`+${ref}:refs/remotes/pull/${branch}`];
|
|||
|
}
|
|||
|
// refs/tags/
|
|||
|
else {
|
|||
|
return [`+${ref}:${ref}`];
|
|||
|
}
|
|||
|
}
|
|||
|
exports.getRefSpec = getRefSpec;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 248:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = octokitRegisterEndpoints;
|
|||
|
|
|||
|
const registerEndpoints = __webpack_require__(899);
|
|||
|
|
|||
|
function octokitRegisterEndpoints(octokit) {
|
|||
|
octokit.registerEndpoints = registerEndpoints.bind(null, octokit);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 260:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
// Note: since nyc uses this module to output coverage, any lines
|
|||
|
// that are in the direct sync flow of nyc's outputCoverage are
|
|||
|
// ignored, since we can never get coverage for them.
|
|||
|
var assert = __webpack_require__(357)
|
|||
|
var signals = __webpack_require__(654)
|
|||
|
|
|||
|
var EE = __webpack_require__(614)
|
|||
|
/* istanbul ignore if */
|
|||
|
if (typeof EE !== 'function') {
|
|||
|
EE = EE.EventEmitter
|
|||
|
}
|
|||
|
|
|||
|
var emitter
|
|||
|
if (process.__signal_exit_emitter__) {
|
|||
|
emitter = process.__signal_exit_emitter__
|
|||
|
} else {
|
|||
|
emitter = process.__signal_exit_emitter__ = new EE()
|
|||
|
emitter.count = 0
|
|||
|
emitter.emitted = {}
|
|||
|
}
|
|||
|
|
|||
|
// Because this emitter is a global, we have to check to see if a
|
|||
|
// previous version of this library failed to enable infinite listeners.
|
|||
|
// I know what you're about to say. But literally everything about
|
|||
|
// signal-exit is a compromise with evil. Get used to it.
|
|||
|
if (!emitter.infinite) {
|
|||
|
emitter.setMaxListeners(Infinity)
|
|||
|
emitter.infinite = true
|
|||
|
}
|
|||
|
|
|||
|
module.exports = function (cb, opts) {
|
|||
|
assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')
|
|||
|
|
|||
|
if (loaded === false) {
|
|||
|
load()
|
|||
|
}
|
|||
|
|
|||
|
var ev = 'exit'
|
|||
|
if (opts && opts.alwaysLast) {
|
|||
|
ev = 'afterexit'
|
|||
|
}
|
|||
|
|
|||
|
var remove = function () {
|
|||
|
emitter.removeListener(ev, cb)
|
|||
|
if (emitter.listeners('exit').length === 0 &&
|
|||
|
emitter.listeners('afterexit').length === 0) {
|
|||
|
unload()
|
|||
|
}
|
|||
|
}
|
|||
|
emitter.on(ev, cb)
|
|||
|
|
|||
|
return remove
|
|||
|
}
|
|||
|
|
|||
|
module.exports.unload = unload
|
|||
|
function unload () {
|
|||
|
if (!loaded) {
|
|||
|
return
|
|||
|
}
|
|||
|
loaded = false
|
|||
|
|
|||
|
signals.forEach(function (sig) {
|
|||
|
try {
|
|||
|
process.removeListener(sig, sigListeners[sig])
|
|||
|
} catch (er) {}
|
|||
|
})
|
|||
|
process.emit = originalProcessEmit
|
|||
|
process.reallyExit = originalProcessReallyExit
|
|||
|
emitter.count -= 1
|
|||
|
}
|
|||
|
|
|||
|
function emit (event, code, signal) {
|
|||
|
if (emitter.emitted[event]) {
|
|||
|
return
|
|||
|
}
|
|||
|
emitter.emitted[event] = true
|
|||
|
emitter.emit(event, code, signal)
|
|||
|
}
|
|||
|
|
|||
|
// { <signal>: <listener fn>, ... }
|
|||
|
var sigListeners = {}
|
|||
|
signals.forEach(function (sig) {
|
|||
|
sigListeners[sig] = function listener () {
|
|||
|
// If there are no other listeners, an exit is coming!
|
|||
|
// Simplest way: remove us and then re-send the signal.
|
|||
|
// We know that this will kill the process, so we can
|
|||
|
// safely emit now.
|
|||
|
var listeners = process.listeners(sig)
|
|||
|
if (listeners.length === emitter.count) {
|
|||
|
unload()
|
|||
|
emit('exit', null, sig)
|
|||
|
/* istanbul ignore next */
|
|||
|
emit('afterexit', null, sig)
|
|||
|
/* istanbul ignore next */
|
|||
|
process.kill(process.pid, sig)
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
module.exports.signals = function () {
|
|||
|
return signals
|
|||
|
}
|
|||
|
|
|||
|
module.exports.load = load
|
|||
|
|
|||
|
var loaded = false
|
|||
|
|
|||
|
function load () {
|
|||
|
if (loaded) {
|
|||
|
return
|
|||
|
}
|
|||
|
loaded = true
|
|||
|
|
|||
|
// This is the number of onSignalExit's that are in play.
|
|||
|
// It's important so that we can count the correct number of
|
|||
|
// listeners on signals, and don't wait for the other one to
|
|||
|
// handle it instead of us.
|
|||
|
emitter.count += 1
|
|||
|
|
|||
|
signals = signals.filter(function (sig) {
|
|||
|
try {
|
|||
|
process.on(sig, sigListeners[sig])
|
|||
|
return true
|
|||
|
} catch (er) {
|
|||
|
return false
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
process.emit = processEmit
|
|||
|
process.reallyExit = processReallyExit
|
|||
|
}
|
|||
|
|
|||
|
var originalProcessReallyExit = process.reallyExit
|
|||
|
function processReallyExit (code) {
|
|||
|
process.exitCode = code || 0
|
|||
|
emit('exit', process.exitCode, null)
|
|||
|
/* istanbul ignore next */
|
|||
|
emit('afterexit', process.exitCode, null)
|
|||
|
/* istanbul ignore next */
|
|||
|
originalProcessReallyExit.call(process, process.exitCode)
|
|||
|
}
|
|||
|
|
|||
|
var originalProcessEmit = process.emit
|
|||
|
function processEmit (ev, arg) {
|
|||
|
if (ev === 'exit') {
|
|||
|
if (arg !== undefined) {
|
|||
|
process.exitCode = arg
|
|||
|
}
|
|||
|
var ret = originalProcessEmit.apply(this, arguments)
|
|||
|
emit('exit', process.exitCode, null)
|
|||
|
/* istanbul ignore next */
|
|||
|
emit('afterexit', process.exitCode, null)
|
|||
|
return ret
|
|||
|
} else {
|
|||
|
return originalProcessEmit.apply(this, arguments)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 262:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const fs_1 = __webpack_require__(747);
|
|||
|
const os_1 = __webpack_require__(87);
|
|||
|
class Context {
|
|||
|
/**
|
|||
|
* Hydrate the context from the environment
|
|||
|
*/
|
|||
|
constructor() {
|
|||
|
this.payload = {};
|
|||
|
if (process.env.GITHUB_EVENT_PATH) {
|
|||
|
if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) {
|
|||
|
this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));
|
|||
|
}
|
|||
|
else {
|
|||
|
process.stdout.write(`GITHUB_EVENT_PATH ${process.env.GITHUB_EVENT_PATH} does not exist${os_1.EOL}`);
|
|||
|
}
|
|||
|
}
|
|||
|
this.eventName = process.env.GITHUB_EVENT_NAME;
|
|||
|
this.sha = process.env.GITHUB_SHA;
|
|||
|
this.ref = process.env.GITHUB_REF;
|
|||
|
this.workflow = process.env.GITHUB_WORKFLOW;
|
|||
|
this.action = process.env.GITHUB_ACTION;
|
|||
|
this.actor = process.env.GITHUB_ACTOR;
|
|||
|
}
|
|||
|
get issue() {
|
|||
|
const payload = this.payload;
|
|||
|
return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pullRequest || payload).number });
|
|||
|
}
|
|||
|
get repo() {
|
|||
|
if (process.env.GITHUB_REPOSITORY) {
|
|||
|
const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
|
|||
|
return { owner, repo };
|
|||
|
}
|
|||
|
if (this.payload.repository) {
|
|||
|
return {
|
|||
|
owner: this.payload.repository.owner.login,
|
|||
|
repo: this.payload.repository.name
|
|||
|
};
|
|||
|
}
|
|||
|
throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'");
|
|||
|
}
|
|||
|
}
|
|||
|
exports.Context = Context;
|
|||
|
//# sourceMappingURL=context.js.map
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 265:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = getPage
|
|||
|
|
|||
|
const deprecate = __webpack_require__(370)
|
|||
|
const getPageLinks = __webpack_require__(577)
|
|||
|
const HttpError = __webpack_require__(297)
|
|||
|
|
|||
|
function getPage (octokit, link, which, headers) {
|
|||
|
deprecate(`octokit.get${which.charAt(0).toUpperCase() + which.slice(1)}Page() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`)
|
|||
|
const url = getPageLinks(link)[which]
|
|||
|
|
|||
|
if (!url) {
|
|||
|
const urlError = new HttpError(`No ${which} page found`, 404)
|
|||
|
return Promise.reject(urlError)
|
|||
|
}
|
|||
|
|
|||
|
const requestOptions = {
|
|||
|
url,
|
|||
|
headers: applyAcceptHeader(link, headers)
|
|||
|
}
|
|||
|
|
|||
|
const promise = octokit.request(requestOptions)
|
|||
|
|
|||
|
return promise
|
|||
|
}
|
|||
|
|
|||
|
function applyAcceptHeader (res, headers) {
|
|||
|
const previous = res.headers && res.headers['x-github-media-type']
|
|||
|
|
|||
|
if (!previous || (headers && headers.accept)) {
|
|||
|
return headers
|
|||
|
}
|
|||
|
headers = headers || {}
|
|||
|
headers.accept = 'application/vnd.' + previous
|
|||
|
.replace('; param=', '.')
|
|||
|
.replace('; format=', '+')
|
|||
|
|
|||
|
return headers
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 280:
|
|||
|
/***/ (function(module, exports) {
|
|||
|
|
|||
|
exports = module.exports = SemVer
|
|||
|
|
|||
|
var debug
|
|||
|
/* istanbul ignore next */
|
|||
|
if (typeof process === 'object' &&
|
|||
|
process.env &&
|
|||
|
process.env.NODE_DEBUG &&
|
|||
|
/\bsemver\b/i.test(process.env.NODE_DEBUG)) {
|
|||
|
debug = function () {
|
|||
|
var args = Array.prototype.slice.call(arguments, 0)
|
|||
|
args.unshift('SEMVER')
|
|||
|
console.log.apply(console, args)
|
|||
|
}
|
|||
|
} else {
|
|||
|
debug = function () {}
|
|||
|
}
|
|||
|
|
|||
|
// Note: this is the semver.org version of the spec that it implements
|
|||
|
// Not necessarily the package version of this code.
|
|||
|
exports.SEMVER_SPEC_VERSION = '2.0.0'
|
|||
|
|
|||
|
var MAX_LENGTH = 256
|
|||
|
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||
|
|||
|
/* istanbul ignore next */ 9007199254740991
|
|||
|
|
|||
|
// Max safe segment length for coercion.
|
|||
|
var MAX_SAFE_COMPONENT_LENGTH = 16
|
|||
|
|
|||
|
// The actual regexps go on exports.re
|
|||
|
var re = exports.re = []
|
|||
|
var src = exports.src = []
|
|||
|
var R = 0
|
|||
|
|
|||
|
// The following Regular Expressions can be used for tokenizing,
|
|||
|
// validating, and parsing SemVer version strings.
|
|||
|
|
|||
|
// ## Numeric Identifier
|
|||
|
// A single `0`, or a non-zero digit followed by zero or more digits.
|
|||
|
|
|||
|
var NUMERICIDENTIFIER = R++
|
|||
|
src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'
|
|||
|
var NUMERICIDENTIFIERLOOSE = R++
|
|||
|
src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'
|
|||
|
|
|||
|
// ## Non-numeric Identifier
|
|||
|
// Zero or more digits, followed by a letter or hyphen, and then zero or
|
|||
|
// more letters, digits, or hyphens.
|
|||
|
|
|||
|
var NONNUMERICIDENTIFIER = R++
|
|||
|
src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'
|
|||
|
|
|||
|
// ## Main Version
|
|||
|
// Three dot-separated numeric identifiers.
|
|||
|
|
|||
|
var MAINVERSION = R++
|
|||
|
src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
|
|||
|
'(' + src[NUMERICIDENTIFIER] + ')\\.' +
|
|||
|
'(' + src[NUMERICIDENTIFIER] + ')'
|
|||
|
|
|||
|
var MAINVERSIONLOOSE = R++
|
|||
|
src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
|
|||
|
'(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
|
|||
|
'(' + src[NUMERICIDENTIFIERLOOSE] + ')'
|
|||
|
|
|||
|
// ## Pre-release Version Identifier
|
|||
|
// A numeric identifier, or a non-numeric identifier.
|
|||
|
|
|||
|
var PRERELEASEIDENTIFIER = R++
|
|||
|
src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
|
|||
|
'|' + src[NONNUMERICIDENTIFIER] + ')'
|
|||
|
|
|||
|
var PRERELEASEIDENTIFIERLOOSE = R++
|
|||
|
src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
|
|||
|
'|' + src[NONNUMERICIDENTIFIER] + ')'
|
|||
|
|
|||
|
// ## Pre-release Version
|
|||
|
// Hyphen, followed by one or more dot-separated pre-release version
|
|||
|
// identifiers.
|
|||
|
|
|||
|
var PRERELEASE = R++
|
|||
|
src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
|
|||
|
'(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'
|
|||
|
|
|||
|
var PRERELEASELOOSE = R++
|
|||
|
src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
|
|||
|
'(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'
|
|||
|
|
|||
|
// ## Build Metadata Identifier
|
|||
|
// Any combination of digits, letters, or hyphens.
|
|||
|
|
|||
|
var BUILDIDENTIFIER = R++
|
|||
|
src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'
|
|||
|
|
|||
|
// ## Build Metadata
|
|||
|
// Plus sign, followed by one or more period-separated build metadata
|
|||
|
// identifiers.
|
|||
|
|
|||
|
var BUILD = R++
|
|||
|
src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
|
|||
|
'(?:\\.' + src[BUILDIDENTIFIER] + ')*))'
|
|||
|
|
|||
|
// ## Full Version String
|
|||
|
// A main version, followed optionally by a pre-release version and
|
|||
|
// build metadata.
|
|||
|
|
|||
|
// Note that the only major, minor, patch, and pre-release sections of
|
|||
|
// the version string are capturing groups. The build metadata is not a
|
|||
|
// capturing group, because it should not ever be used in version
|
|||
|
// comparison.
|
|||
|
|
|||
|
var FULL = R++
|
|||
|
var FULLPLAIN = 'v?' + src[MAINVERSION] +
|
|||
|
src[PRERELEASE] + '?' +
|
|||
|
src[BUILD] + '?'
|
|||
|
|
|||
|
src[FULL] = '^' + FULLPLAIN + '$'
|
|||
|
|
|||
|
// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
|
|||
|
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
|
|||
|
// common in the npm registry.
|
|||
|
var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
|
|||
|
src[PRERELEASELOOSE] + '?' +
|
|||
|
src[BUILD] + '?'
|
|||
|
|
|||
|
var LOOSE = R++
|
|||
|
src[LOOSE] = '^' + LOOSEPLAIN + '$'
|
|||
|
|
|||
|
var GTLT = R++
|
|||
|
src[GTLT] = '((?:<|>)?=?)'
|
|||
|
|
|||
|
// Something like "2.*" or "1.2.x".
|
|||
|
// Note that "x.x" is a valid xRange identifer, meaning "any version"
|
|||
|
// Only the first item is strictly required.
|
|||
|
var XRANGEIDENTIFIERLOOSE = R++
|
|||
|
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'
|
|||
|
var XRANGEIDENTIFIER = R++
|
|||
|
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'
|
|||
|
|
|||
|
var XRANGEPLAIN = R++
|
|||
|
src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
|
|||
|
'(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
|
|||
|
'(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
|
|||
|
'(?:' + src[PRERELEASE] + ')?' +
|
|||
|
src[BUILD] + '?' +
|
|||
|
')?)?'
|
|||
|
|
|||
|
var XRANGEPLAINLOOSE = R++
|
|||
|
src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
|
|||
|
'(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
|
|||
|
'(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
|
|||
|
'(?:' + src[PRERELEASELOOSE] + ')?' +
|
|||
|
src[BUILD] + '?' +
|
|||
|
')?)?'
|
|||
|
|
|||
|
var XRANGE = R++
|
|||
|
src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'
|
|||
|
var XRANGELOOSE = R++
|
|||
|
src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'
|
|||
|
|
|||
|
// Coercion.
|
|||
|
// Extract anything that could conceivably be a part of a valid semver
|
|||
|
var COERCE = R++
|
|||
|
src[COERCE] = '(?:^|[^\\d])' +
|
|||
|
'(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +
|
|||
|
'(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
|
|||
|
'(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +
|
|||
|
'(?:$|[^\\d])'
|
|||
|
|
|||
|
// Tilde ranges.
|
|||
|
// Meaning is "reasonably at or greater than"
|
|||
|
var LONETILDE = R++
|
|||
|
src[LONETILDE] = '(?:~>?)'
|
|||
|
|
|||
|
var TILDETRIM = R++
|
|||
|
src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'
|
|||
|
re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g')
|
|||
|
var tildeTrimReplace = '$1~'
|
|||
|
|
|||
|
var TILDE = R++
|
|||
|
src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'
|
|||
|
var TILDELOOSE = R++
|
|||
|
src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'
|
|||
|
|
|||
|
// Caret ranges.
|
|||
|
// Meaning is "at least and backwards compatible with"
|
|||
|
var LONECARET = R++
|
|||
|
src[LONECARET] = '(?:\\^)'
|
|||
|
|
|||
|
var CARETTRIM = R++
|
|||
|
src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'
|
|||
|
re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g')
|
|||
|
var caretTrimReplace = '$1^'
|
|||
|
|
|||
|
var CARET = R++
|
|||
|
src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'
|
|||
|
var CARETLOOSE = R++
|
|||
|
src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'
|
|||
|
|
|||
|
// A simple gt/lt/eq thing, or just "" to indicate "any version"
|
|||
|
var COMPARATORLOOSE = R++
|
|||
|
src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'
|
|||
|
var COMPARATOR = R++
|
|||
|
src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'
|
|||
|
|
|||
|
// An expression to strip any whitespace between the gtlt and the thing
|
|||
|
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
|
|||
|
var COMPARATORTRIM = R++
|
|||
|
src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
|
|||
|
'\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'
|
|||
|
|
|||
|
// this one has to use the /g flag
|
|||
|
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g')
|
|||
|
var comparatorTrimReplace = '$1$2$3'
|
|||
|
|
|||
|
// Something like `1.2.3 - 1.2.4`
|
|||
|
// Note that these all use the loose form, because they'll be
|
|||
|
// checked against either the strict or loose comparator form
|
|||
|
// later.
|
|||
|
var HYPHENRANGE = R++
|
|||
|
src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
|
|||
|
'\\s+-\\s+' +
|
|||
|
'(' + src[XRANGEPLAIN] + ')' +
|
|||
|
'\\s*$'
|
|||
|
|
|||
|
var HYPHENRANGELOOSE = R++
|
|||
|
src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
|
|||
|
'\\s+-\\s+' +
|
|||
|
'(' + src[XRANGEPLAINLOOSE] + ')' +
|
|||
|
'\\s*$'
|
|||
|
|
|||
|
// Star ranges basically just allow anything at all.
|
|||
|
var STAR = R++
|
|||
|
src[STAR] = '(<|>)?=?\\s*\\*'
|
|||
|
|
|||
|
// Compile to actual regexp objects.
|
|||
|
// All are flag-free, unless they were created above with a flag.
|
|||
|
for (var i = 0; i < R; i++) {
|
|||
|
debug(i, src[i])
|
|||
|
if (!re[i]) {
|
|||
|
re[i] = new RegExp(src[i])
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.parse = parse
|
|||
|
function parse (version, options) {
|
|||
|
if (!options || typeof options !== 'object') {
|
|||
|
options = {
|
|||
|
loose: !!options,
|
|||
|
includePrerelease: false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (version instanceof SemVer) {
|
|||
|
return version
|
|||
|
}
|
|||
|
|
|||
|
if (typeof version !== 'string') {
|
|||
|
return null
|
|||
|
}
|
|||
|
|
|||
|
if (version.length > MAX_LENGTH) {
|
|||
|
return null
|
|||
|
}
|
|||
|
|
|||
|
var r = options.loose ? re[LOOSE] : re[FULL]
|
|||
|
if (!r.test(version)) {
|
|||
|
return null
|
|||
|
}
|
|||
|
|
|||
|
try {
|
|||
|
return new SemVer(version, options)
|
|||
|
} catch (er) {
|
|||
|
return null
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.valid = valid
|
|||
|
function valid (version, options) {
|
|||
|
var v = parse(version, options)
|
|||
|
return v ? v.version : null
|
|||
|
}
|
|||
|
|
|||
|
exports.clean = clean
|
|||
|
function clean (version, options) {
|
|||
|
var s = parse(version.trim().replace(/^[=v]+/, ''), options)
|
|||
|
return s ? s.version : null
|
|||
|
}
|
|||
|
|
|||
|
exports.SemVer = SemVer
|
|||
|
|
|||
|
function SemVer (version, options) {
|
|||
|
if (!options || typeof options !== 'object') {
|
|||
|
options = {
|
|||
|
loose: !!options,
|
|||
|
includePrerelease: false
|
|||
|
}
|
|||
|
}
|
|||
|
if (version instanceof SemVer) {
|
|||
|
if (version.loose === options.loose) {
|
|||
|
return version
|
|||
|
} else {
|
|||
|
version = version.version
|
|||
|
}
|
|||
|
} else if (typeof version !== 'string') {
|
|||
|
throw new TypeError('Invalid Version: ' + version)
|
|||
|
}
|
|||
|
|
|||
|
if (version.length > MAX_LENGTH) {
|
|||
|
throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
|
|||
|
}
|
|||
|
|
|||
|
if (!(this instanceof SemVer)) {
|
|||
|
return new SemVer(version, options)
|
|||
|
}
|
|||
|
|
|||
|
debug('SemVer', version, options)
|
|||
|
this.options = options
|
|||
|
this.loose = !!options.loose
|
|||
|
|
|||
|
var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL])
|
|||
|
|
|||
|
if (!m) {
|
|||
|
throw new TypeError('Invalid Version: ' + version)
|
|||
|
}
|
|||
|
|
|||
|
this.raw = version
|
|||
|
|
|||
|
// these are actually numbers
|
|||
|
this.major = +m[1]
|
|||
|
this.minor = +m[2]
|
|||
|
this.patch = +m[3]
|
|||
|
|
|||
|
if (this.major > MAX_SAFE_INTEGER || this.major < 0) {
|
|||
|
throw new TypeError('Invalid major version')
|
|||
|
}
|
|||
|
|
|||
|
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {
|
|||
|
throw new TypeError('Invalid minor version')
|
|||
|
}
|
|||
|
|
|||
|
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {
|
|||
|
throw new TypeError('Invalid patch version')
|
|||
|
}
|
|||
|
|
|||
|
// numberify any prerelease numeric ids
|
|||
|
if (!m[4]) {
|
|||
|
this.prerelease = []
|
|||
|
} else {
|
|||
|
this.prerelease = m[4].split('.').map(function (id) {
|
|||
|
if (/^[0-9]+$/.test(id)) {
|
|||
|
var num = +id
|
|||
|
if (num >= 0 && num < MAX_SAFE_INTEGER) {
|
|||
|
return num
|
|||
|
}
|
|||
|
}
|
|||
|
return id
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
this.build = m[5] ? m[5].split('.') : []
|
|||
|
this.format()
|
|||
|
}
|
|||
|
|
|||
|
SemVer.prototype.format = function () {
|
|||
|
this.version = this.major + '.' + this.minor + '.' + this.patch
|
|||
|
if (this.prerelease.length) {
|
|||
|
this.version += '-' + this.prerelease.join('.')
|
|||
|
}
|
|||
|
return this.version
|
|||
|
}
|
|||
|
|
|||
|
SemVer.prototype.toString = function () {
|
|||
|
return this.version
|
|||
|
}
|
|||
|
|
|||
|
SemVer.prototype.compare = function (other) {
|
|||
|
debug('SemVer.compare', this.version, this.options, other)
|
|||
|
if (!(other instanceof SemVer)) {
|
|||
|
other = new SemVer(other, this.options)
|
|||
|
}
|
|||
|
|
|||
|
return this.compareMain(other) || this.comparePre(other)
|
|||
|
}
|
|||
|
|
|||
|
SemVer.prototype.compareMain = function (other) {
|
|||
|
if (!(other instanceof SemVer)) {
|
|||
|
other = new SemVer(other, this.options)
|
|||
|
}
|
|||
|
|
|||
|
return compareIdentifiers(this.major, other.major) ||
|
|||
|
compareIdentifiers(this.minor, other.minor) ||
|
|||
|
compareIdentifiers(this.patch, other.patch)
|
|||
|
}
|
|||
|
|
|||
|
SemVer.prototype.comparePre = function (other) {
|
|||
|
if (!(other instanceof SemVer)) {
|
|||
|
other = new SemVer(other, this.options)
|
|||
|
}
|
|||
|
|
|||
|
// NOT having a prerelease is > having one
|
|||
|
if (this.prerelease.length && !other.prerelease.length) {
|
|||
|
return -1
|
|||
|
} else if (!this.prerelease.length && other.prerelease.length) {
|
|||
|
return 1
|
|||
|
} else if (!this.prerelease.length && !other.prerelease.length) {
|
|||
|
return 0
|
|||
|
}
|
|||
|
|
|||
|
var i = 0
|
|||
|
do {
|
|||
|
var a = this.prerelease[i]
|
|||
|
var b = other.prerelease[i]
|
|||
|
debug('prerelease compare', i, a, b)
|
|||
|
if (a === undefined && b === undefined) {
|
|||
|
return 0
|
|||
|
} else if (b === undefined) {
|
|||
|
return 1
|
|||
|
} else if (a === undefined) {
|
|||
|
return -1
|
|||
|
} else if (a === b) {
|
|||
|
continue
|
|||
|
} else {
|
|||
|
return compareIdentifiers(a, b)
|
|||
|
}
|
|||
|
} while (++i)
|
|||
|
}
|
|||
|
|
|||
|
// preminor will bump the version up to the next minor release, and immediately
|
|||
|
// down to pre-release. premajor and prepatch work the same way.
|
|||
|
SemVer.prototype.inc = function (release, identifier) {
|
|||
|
switch (release) {
|
|||
|
case 'premajor':
|
|||
|
this.prerelease.length = 0
|
|||
|
this.patch = 0
|
|||
|
this.minor = 0
|
|||
|
this.major++
|
|||
|
this.inc('pre', identifier)
|
|||
|
break
|
|||
|
case 'preminor':
|
|||
|
this.prerelease.length = 0
|
|||
|
this.patch = 0
|
|||
|
this.minor++
|
|||
|
this.inc('pre', identifier)
|
|||
|
break
|
|||
|
case 'prepatch':
|
|||
|
// If this is already a prerelease, it will bump to the next version
|
|||
|
// drop any prereleases that might already exist, since they are not
|
|||
|
// relevant at this point.
|
|||
|
this.prerelease.length = 0
|
|||
|
this.inc('patch', identifier)
|
|||
|
this.inc('pre', identifier)
|
|||
|
break
|
|||
|
// If the input is a non-prerelease version, this acts the same as
|
|||
|
// prepatch.
|
|||
|
case 'prerelease':
|
|||
|
if (this.prerelease.length === 0) {
|
|||
|
this.inc('patch', identifier)
|
|||
|
}
|
|||
|
this.inc('pre', identifier)
|
|||
|
break
|
|||
|
|
|||
|
case 'major':
|
|||
|
// If this is a pre-major version, bump up to the same major version.
|
|||
|
// Otherwise increment major.
|
|||
|
// 1.0.0-5 bumps to 1.0.0
|
|||
|
// 1.1.0 bumps to 2.0.0
|
|||
|
if (this.minor !== 0 ||
|
|||
|
this.patch !== 0 ||
|
|||
|
this.prerelease.length === 0) {
|
|||
|
this.major++
|
|||
|
}
|
|||
|
this.minor = 0
|
|||
|
this.patch = 0
|
|||
|
this.prerelease = []
|
|||
|
break
|
|||
|
case 'minor':
|
|||
|
// If this is a pre-minor version, bump up to the same minor version.
|
|||
|
// Otherwise increment minor.
|
|||
|
// 1.2.0-5 bumps to 1.2.0
|
|||
|
// 1.2.1 bumps to 1.3.0
|
|||
|
if (this.patch !== 0 || this.prerelease.length === 0) {
|
|||
|
this.minor++
|
|||
|
}
|
|||
|
this.patch = 0
|
|||
|
this.prerelease = []
|
|||
|
break
|
|||
|
case 'patch':
|
|||
|
// If this is not a pre-release version, it will increment the patch.
|
|||
|
// If it is a pre-release it will bump up to the same patch version.
|
|||
|
// 1.2.0-5 patches to 1.2.0
|
|||
|
// 1.2.0 patches to 1.2.1
|
|||
|
if (this.prerelease.length === 0) {
|
|||
|
this.patch++
|
|||
|
}
|
|||
|
this.prerelease = []
|
|||
|
break
|
|||
|
// This probably shouldn't be used publicly.
|
|||
|
// 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
|
|||
|
case 'pre':
|
|||
|
if (this.prerelease.length === 0) {
|
|||
|
this.prerelease = [0]
|
|||
|
} else {
|
|||
|
var i = this.prerelease.length
|
|||
|
while (--i >= 0) {
|
|||
|
if (typeof this.prerelease[i] === 'number') {
|
|||
|
this.prerelease[i]++
|
|||
|
i = -2
|
|||
|
}
|
|||
|
}
|
|||
|
if (i === -1) {
|
|||
|
// didn't increment anything
|
|||
|
this.prerelease.push(0)
|
|||
|
}
|
|||
|
}
|
|||
|
if (identifier) {
|
|||
|
// 1.2.0-beta.1 bumps to 1.2.0-beta.2,
|
|||
|
// 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
|
|||
|
if (this.prerelease[0] === identifier) {
|
|||
|
if (isNaN(this.prerelease[1])) {
|
|||
|
this.prerelease = [identifier, 0]
|
|||
|
}
|
|||
|
} else {
|
|||
|
this.prerelease = [identifier, 0]
|
|||
|
}
|
|||
|
}
|
|||
|
break
|
|||
|
|
|||
|
default:
|
|||
|
throw new Error('invalid increment argument: ' + release)
|
|||
|
}
|
|||
|
this.format()
|
|||
|
this.raw = this.version
|
|||
|
return this
|
|||
|
}
|
|||
|
|
|||
|
exports.inc = inc
|
|||
|
function inc (version, release, loose, identifier) {
|
|||
|
if (typeof (loose) === 'string') {
|
|||
|
identifier = loose
|
|||
|
loose = undefined
|
|||
|
}
|
|||
|
|
|||
|
try {
|
|||
|
return new SemVer(version, loose).inc(release, identifier).version
|
|||
|
} catch (er) {
|
|||
|
return null
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.diff = diff
|
|||
|
function diff (version1, version2) {
|
|||
|
if (eq(version1, version2)) {
|
|||
|
return null
|
|||
|
} else {
|
|||
|
var v1 = parse(version1)
|
|||
|
var v2 = parse(version2)
|
|||
|
var prefix = ''
|
|||
|
if (v1.prerelease.length || v2.prerelease.length) {
|
|||
|
prefix = 'pre'
|
|||
|
var defaultResult = 'prerelease'
|
|||
|
}
|
|||
|
for (var key in v1) {
|
|||
|
if (key === 'major' || key === 'minor' || key === 'patch') {
|
|||
|
if (v1[key] !== v2[key]) {
|
|||
|
return prefix + key
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return defaultResult // may be undefined
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.compareIdentifiers = compareIdentifiers
|
|||
|
|
|||
|
var numeric = /^[0-9]+$/
|
|||
|
function compareIdentifiers (a, b) {
|
|||
|
var anum = numeric.test(a)
|
|||
|
var bnum = numeric.test(b)
|
|||
|
|
|||
|
if (anum && bnum) {
|
|||
|
a = +a
|
|||
|
b = +b
|
|||
|
}
|
|||
|
|
|||
|
return a === b ? 0
|
|||
|
: (anum && !bnum) ? -1
|
|||
|
: (bnum && !anum) ? 1
|
|||
|
: a < b ? -1
|
|||
|
: 1
|
|||
|
}
|
|||
|
|
|||
|
exports.rcompareIdentifiers = rcompareIdentifiers
|
|||
|
function rcompareIdentifiers (a, b) {
|
|||
|
return compareIdentifiers(b, a)
|
|||
|
}
|
|||
|
|
|||
|
exports.major = major
|
|||
|
function major (a, loose) {
|
|||
|
return new SemVer(a, loose).major
|
|||
|
}
|
|||
|
|
|||
|
exports.minor = minor
|
|||
|
function minor (a, loose) {
|
|||
|
return new SemVer(a, loose).minor
|
|||
|
}
|
|||
|
|
|||
|
exports.patch = patch
|
|||
|
function patch (a, loose) {
|
|||
|
return new SemVer(a, loose).patch
|
|||
|
}
|
|||
|
|
|||
|
exports.compare = compare
|
|||
|
function compare (a, b, loose) {
|
|||
|
return new SemVer(a, loose).compare(new SemVer(b, loose))
|
|||
|
}
|
|||
|
|
|||
|
exports.compareLoose = compareLoose
|
|||
|
function compareLoose (a, b) {
|
|||
|
return compare(a, b, true)
|
|||
|
}
|
|||
|
|
|||
|
exports.rcompare = rcompare
|
|||
|
function rcompare (a, b, loose) {
|
|||
|
return compare(b, a, loose)
|
|||
|
}
|
|||
|
|
|||
|
exports.sort = sort
|
|||
|
function sort (list, loose) {
|
|||
|
return list.sort(function (a, b) {
|
|||
|
return exports.compare(a, b, loose)
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
exports.rsort = rsort
|
|||
|
function rsort (list, loose) {
|
|||
|
return list.sort(function (a, b) {
|
|||
|
return exports.rcompare(a, b, loose)
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
exports.gt = gt
|
|||
|
function gt (a, b, loose) {
|
|||
|
return compare(a, b, loose) > 0
|
|||
|
}
|
|||
|
|
|||
|
exports.lt = lt
|
|||
|
function lt (a, b, loose) {
|
|||
|
return compare(a, b, loose) < 0
|
|||
|
}
|
|||
|
|
|||
|
exports.eq = eq
|
|||
|
function eq (a, b, loose) {
|
|||
|
return compare(a, b, loose) === 0
|
|||
|
}
|
|||
|
|
|||
|
exports.neq = neq
|
|||
|
function neq (a, b, loose) {
|
|||
|
return compare(a, b, loose) !== 0
|
|||
|
}
|
|||
|
|
|||
|
exports.gte = gte
|
|||
|
function gte (a, b, loose) {
|
|||
|
return compare(a, b, loose) >= 0
|
|||
|
}
|
|||
|
|
|||
|
exports.lte = lte
|
|||
|
function lte (a, b, loose) {
|
|||
|
return compare(a, b, loose) <= 0
|
|||
|
}
|
|||
|
|
|||
|
exports.cmp = cmp
|
|||
|
function cmp (a, op, b, loose) {
|
|||
|
switch (op) {
|
|||
|
case '===':
|
|||
|
if (typeof a === 'object')
|
|||
|
a = a.version
|
|||
|
if (typeof b === 'object')
|
|||
|
b = b.version
|
|||
|
return a === b
|
|||
|
|
|||
|
case '!==':
|
|||
|
if (typeof a === 'object')
|
|||
|
a = a.version
|
|||
|
if (typeof b === 'object')
|
|||
|
b = b.version
|
|||
|
return a !== b
|
|||
|
|
|||
|
case '':
|
|||
|
case '=':
|
|||
|
case '==':
|
|||
|
return eq(a, b, loose)
|
|||
|
|
|||
|
case '!=':
|
|||
|
return neq(a, b, loose)
|
|||
|
|
|||
|
case '>':
|
|||
|
return gt(a, b, loose)
|
|||
|
|
|||
|
case '>=':
|
|||
|
return gte(a, b, loose)
|
|||
|
|
|||
|
case '<':
|
|||
|
return lt(a, b, loose)
|
|||
|
|
|||
|
case '<=':
|
|||
|
return lte(a, b, loose)
|
|||
|
|
|||
|
default:
|
|||
|
throw new TypeError('Invalid operator: ' + op)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.Comparator = Comparator
|
|||
|
function Comparator (comp, options) {
|
|||
|
if (!options || typeof options !== 'object') {
|
|||
|
options = {
|
|||
|
loose: !!options,
|
|||
|
includePrerelease: false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (comp instanceof Comparator) {
|
|||
|
if (comp.loose === !!options.loose) {
|
|||
|
return comp
|
|||
|
} else {
|
|||
|
comp = comp.value
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!(this instanceof Comparator)) {
|
|||
|
return new Comparator(comp, options)
|
|||
|
}
|
|||
|
|
|||
|
debug('comparator', comp, options)
|
|||
|
this.options = options
|
|||
|
this.loose = !!options.loose
|
|||
|
this.parse(comp)
|
|||
|
|
|||
|
if (this.semver === ANY) {
|
|||
|
this.value = ''
|
|||
|
} else {
|
|||
|
this.value = this.operator + this.semver.version
|
|||
|
}
|
|||
|
|
|||
|
debug('comp', this)
|
|||
|
}
|
|||
|
|
|||
|
var ANY = {}
|
|||
|
Comparator.prototype.parse = function (comp) {
|
|||
|
var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
|
|||
|
var m = comp.match(r)
|
|||
|
|
|||
|
if (!m) {
|
|||
|
throw new TypeError('Invalid comparator: ' + comp)
|
|||
|
}
|
|||
|
|
|||
|
this.operator = m[1]
|
|||
|
if (this.operator === '=') {
|
|||
|
this.operator = ''
|
|||
|
}
|
|||
|
|
|||
|
// if it literally is just '>' or '' then allow anything.
|
|||
|
if (!m[2]) {
|
|||
|
this.semver = ANY
|
|||
|
} else {
|
|||
|
this.semver = new SemVer(m[2], this.options.loose)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Comparator.prototype.toString = function () {
|
|||
|
return this.value
|
|||
|
}
|
|||
|
|
|||
|
Comparator.prototype.test = function (version) {
|
|||
|
debug('Comparator.test', version, this.options.loose)
|
|||
|
|
|||
|
if (this.semver === ANY) {
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
if (typeof version === 'string') {
|
|||
|
version = new SemVer(version, this.options)
|
|||
|
}
|
|||
|
|
|||
|
return cmp(version, this.operator, this.semver, this.options)
|
|||
|
}
|
|||
|
|
|||
|
Comparator.prototype.intersects = function (comp, options) {
|
|||
|
if (!(comp instanceof Comparator)) {
|
|||
|
throw new TypeError('a Comparator is required')
|
|||
|
}
|
|||
|
|
|||
|
if (!options || typeof options !== 'object') {
|
|||
|
options = {
|
|||
|
loose: !!options,
|
|||
|
includePrerelease: false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var rangeTmp
|
|||
|
|
|||
|
if (this.operator === '') {
|
|||
|
rangeTmp = new Range(comp.value, options)
|
|||
|
return satisfies(this.value, rangeTmp, options)
|
|||
|
} else if (comp.operator === '') {
|
|||
|
rangeTmp = new Range(this.value, options)
|
|||
|
return satisfies(comp.semver, rangeTmp, options)
|
|||
|
}
|
|||
|
|
|||
|
var sameDirectionIncreasing =
|
|||
|
(this.operator === '>=' || this.operator === '>') &&
|
|||
|
(comp.operator === '>=' || comp.operator === '>')
|
|||
|
var sameDirectionDecreasing =
|
|||
|
(this.operator === '<=' || this.operator === '<') &&
|
|||
|
(comp.operator === '<=' || comp.operator === '<')
|
|||
|
var sameSemVer = this.semver.version === comp.semver.version
|
|||
|
var differentDirectionsInclusive =
|
|||
|
(this.operator === '>=' || this.operator === '<=') &&
|
|||
|
(comp.operator === '>=' || comp.operator === '<=')
|
|||
|
var oppositeDirectionsLessThan =
|
|||
|
cmp(this.semver, '<', comp.semver, options) &&
|
|||
|
((this.operator === '>=' || this.operator === '>') &&
|
|||
|
(comp.operator === '<=' || comp.operator === '<'))
|
|||
|
var oppositeDirectionsGreaterThan =
|
|||
|
cmp(this.semver, '>', comp.semver, options) &&
|
|||
|
((this.operator === '<=' || this.operator === '<') &&
|
|||
|
(comp.operator === '>=' || comp.operator === '>'))
|
|||
|
|
|||
|
return sameDirectionIncreasing || sameDirectionDecreasing ||
|
|||
|
(sameSemVer && differentDirectionsInclusive) ||
|
|||
|
oppositeDirectionsLessThan || oppositeDirectionsGreaterThan
|
|||
|
}
|
|||
|
|
|||
|
exports.Range = Range
|
|||
|
function Range (range, options) {
|
|||
|
if (!options || typeof options !== 'object') {
|
|||
|
options = {
|
|||
|
loose: !!options,
|
|||
|
includePrerelease: false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (range instanceof Range) {
|
|||
|
if (range.loose === !!options.loose &&
|
|||
|
range.includePrerelease === !!options.includePrerelease) {
|
|||
|
return range
|
|||
|
} else {
|
|||
|
return new Range(range.raw, options)
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (range instanceof Comparator) {
|
|||
|
return new Range(range.value, options)
|
|||
|
}
|
|||
|
|
|||
|
if (!(this instanceof Range)) {
|
|||
|
return new Range(range, options)
|
|||
|
}
|
|||
|
|
|||
|
this.options = options
|
|||
|
this.loose = !!options.loose
|
|||
|
this.includePrerelease = !!options.includePrerelease
|
|||
|
|
|||
|
// First, split based on boolean or ||
|
|||
|
this.raw = range
|
|||
|
this.set = range.split(/\s*\|\|\s*/).map(function (range) {
|
|||
|
return this.parseRange(range.trim())
|
|||
|
}, this).filter(function (c) {
|
|||
|
// throw out any that are not relevant for whatever reason
|
|||
|
return c.length
|
|||
|
})
|
|||
|
|
|||
|
if (!this.set.length) {
|
|||
|
throw new TypeError('Invalid SemVer Range: ' + range)
|
|||
|
}
|
|||
|
|
|||
|
this.format()
|
|||
|
}
|
|||
|
|
|||
|
Range.prototype.format = function () {
|
|||
|
this.range = this.set.map(function (comps) {
|
|||
|
return comps.join(' ').trim()
|
|||
|
}).join('||').trim()
|
|||
|
return this.range
|
|||
|
}
|
|||
|
|
|||
|
Range.prototype.toString = function () {
|
|||
|
return this.range
|
|||
|
}
|
|||
|
|
|||
|
Range.prototype.parseRange = function (range) {
|
|||
|
var loose = this.options.loose
|
|||
|
range = range.trim()
|
|||
|
// `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
|
|||
|
var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]
|
|||
|
range = range.replace(hr, hyphenReplace)
|
|||
|
debug('hyphen replace', range)
|
|||
|
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
|
|||
|
range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace)
|
|||
|
debug('comparator trim', range, re[COMPARATORTRIM])
|
|||
|
|
|||
|
// `~ 1.2.3` => `~1.2.3`
|
|||
|
range = range.replace(re[TILDETRIM], tildeTrimReplace)
|
|||
|
|
|||
|
// `^ 1.2.3` => `^1.2.3`
|
|||
|
range = range.replace(re[CARETTRIM], caretTrimReplace)
|
|||
|
|
|||
|
// normalize spaces
|
|||
|
range = range.split(/\s+/).join(' ')
|
|||
|
|
|||
|
// At this point, the range is completely trimmed and
|
|||
|
// ready to be split into comparators.
|
|||
|
|
|||
|
var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]
|
|||
|
var set = range.split(' ').map(function (comp) {
|
|||
|
return parseComparator(comp, this.options)
|
|||
|
}, this).join(' ').split(/\s+/)
|
|||
|
if (this.options.loose) {
|
|||
|
// in loose mode, throw out any that are not valid comparators
|
|||
|
set = set.filter(function (comp) {
|
|||
|
return !!comp.match(compRe)
|
|||
|
})
|
|||
|
}
|
|||
|
set = set.map(function (comp) {
|
|||
|
return new Comparator(comp, this.options)
|
|||
|
}, this)
|
|||
|
|
|||
|
return set
|
|||
|
}
|
|||
|
|
|||
|
Range.prototype.intersects = function (range, options) {
|
|||
|
if (!(range instanceof Range)) {
|
|||
|
throw new TypeError('a Range is required')
|
|||
|
}
|
|||
|
|
|||
|
return this.set.some(function (thisComparators) {
|
|||
|
return thisComparators.every(function (thisComparator) {
|
|||
|
return range.set.some(function (rangeComparators) {
|
|||
|
return rangeComparators.every(function (rangeComparator) {
|
|||
|
return thisComparator.intersects(rangeComparator, options)
|
|||
|
})
|
|||
|
})
|
|||
|
})
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// Mostly just for testing and legacy API reasons
|
|||
|
exports.toComparators = toComparators
|
|||
|
function toComparators (range, options) {
|
|||
|
return new Range(range, options).set.map(function (comp) {
|
|||
|
return comp.map(function (c) {
|
|||
|
return c.value
|
|||
|
}).join(' ').trim().split(' ')
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// comprised of xranges, tildes, stars, and gtlt's at this point.
|
|||
|
// already replaced the hyphen ranges
|
|||
|
// turn into a set of JUST comparators.
|
|||
|
function parseComparator (comp, options) {
|
|||
|
debug('comp', comp, options)
|
|||
|
comp = replaceCarets(comp, options)
|
|||
|
debug('caret', comp)
|
|||
|
comp = replaceTildes(comp, options)
|
|||
|
debug('tildes', comp)
|
|||
|
comp = replaceXRanges(comp, options)
|
|||
|
debug('xrange', comp)
|
|||
|
comp = replaceStars(comp, options)
|
|||
|
debug('stars', comp)
|
|||
|
return comp
|
|||
|
}
|
|||
|
|
|||
|
function isX (id) {
|
|||
|
return !id || id.toLowerCase() === 'x' || id === '*'
|
|||
|
}
|
|||
|
|
|||
|
// ~, ~> --> * (any, kinda silly)
|
|||
|
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
|
|||
|
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
|
|||
|
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
|
|||
|
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
|
|||
|
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
|
|||
|
function replaceTildes (comp, options) {
|
|||
|
return comp.trim().split(/\s+/).map(function (comp) {
|
|||
|
return replaceTilde(comp, options)
|
|||
|
}).join(' ')
|
|||
|
}
|
|||
|
|
|||
|
function replaceTilde (comp, options) {
|
|||
|
var r = options.loose ? re[TILDELOOSE] : re[TILDE]
|
|||
|
return comp.replace(r, function (_, M, m, p, pr) {
|
|||
|
debug('tilde', comp, _, M, m, p, pr)
|
|||
|
var ret
|
|||
|
|
|||
|
if (isX(M)) {
|
|||
|
ret = ''
|
|||
|
} else if (isX(m)) {
|
|||
|
ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
|
|||
|
} else if (isX(p)) {
|
|||
|
// ~1.2 == >=1.2.0 <1.3.0
|
|||
|
ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
|
|||
|
} else if (pr) {
|
|||
|
debug('replaceTilde pr', pr)
|
|||
|
ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
|
|||
|
' <' + M + '.' + (+m + 1) + '.0'
|
|||
|
} else {
|
|||
|
// ~1.2.3 == >=1.2.3 <1.3.0
|
|||
|
ret = '>=' + M + '.' + m + '.' + p +
|
|||
|
' <' + M + '.' + (+m + 1) + '.0'
|
|||
|
}
|
|||
|
|
|||
|
debug('tilde return', ret)
|
|||
|
return ret
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// ^ --> * (any, kinda silly)
|
|||
|
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
|
|||
|
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
|
|||
|
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
|
|||
|
// ^1.2.3 --> >=1.2.3 <2.0.0
|
|||
|
// ^1.2.0 --> >=1.2.0 <2.0.0
|
|||
|
function replaceCarets (comp, options) {
|
|||
|
return comp.trim().split(/\s+/).map(function (comp) {
|
|||
|
return replaceCaret(comp, options)
|
|||
|
}).join(' ')
|
|||
|
}
|
|||
|
|
|||
|
function replaceCaret (comp, options) {
|
|||
|
debug('caret', comp, options)
|
|||
|
var r = options.loose ? re[CARETLOOSE] : re[CARET]
|
|||
|
return comp.replace(r, function (_, M, m, p, pr) {
|
|||
|
debug('caret', comp, _, M, m, p, pr)
|
|||
|
var ret
|
|||
|
|
|||
|
if (isX(M)) {
|
|||
|
ret = ''
|
|||
|
} else if (isX(m)) {
|
|||
|
ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
|
|||
|
} else if (isX(p)) {
|
|||
|
if (M === '0') {
|
|||
|
ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
|
|||
|
} else {
|
|||
|
ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'
|
|||
|
}
|
|||
|
} else if (pr) {
|
|||
|
debug('replaceCaret pr', pr)
|
|||
|
if (M === '0') {
|
|||
|
if (m === '0') {
|
|||
|
ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
|
|||
|
' <' + M + '.' + m + '.' + (+p + 1)
|
|||
|
} else {
|
|||
|
ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
|
|||
|
' <' + M + '.' + (+m + 1) + '.0'
|
|||
|
}
|
|||
|
} else {
|
|||
|
ret = '>=' + M + '.' + m + '.' + p + '-' + pr +
|
|||
|
' <' + (+M + 1) + '.0.0'
|
|||
|
}
|
|||
|
} else {
|
|||
|
debug('no pr')
|
|||
|
if (M === '0') {
|
|||
|
if (m === '0') {
|
|||
|
ret = '>=' + M + '.' + m + '.' + p +
|
|||
|
' <' + M + '.' + m + '.' + (+p + 1)
|
|||
|
} else {
|
|||
|
ret = '>=' + M + '.' + m + '.' + p +
|
|||
|
' <' + M + '.' + (+m + 1) + '.0'
|
|||
|
}
|
|||
|
} else {
|
|||
|
ret = '>=' + M + '.' + m + '.' + p +
|
|||
|
' <' + (+M + 1) + '.0.0'
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
debug('caret return', ret)
|
|||
|
return ret
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
function replaceXRanges (comp, options) {
|
|||
|
debug('replaceXRanges', comp, options)
|
|||
|
return comp.split(/\s+/).map(function (comp) {
|
|||
|
return replaceXRange(comp, options)
|
|||
|
}).join(' ')
|
|||
|
}
|
|||
|
|
|||
|
function replaceXRange (comp, options) {
|
|||
|
comp = comp.trim()
|
|||
|
var r = options.loose ? re[XRANGELOOSE] : re[XRANGE]
|
|||
|
return comp.replace(r, function (ret, gtlt, M, m, p, pr) {
|
|||
|
debug('xRange', comp, ret, gtlt, M, m, p, pr)
|
|||
|
var xM = isX(M)
|
|||
|
var xm = xM || isX(m)
|
|||
|
var xp = xm || isX(p)
|
|||
|
var anyX = xp
|
|||
|
|
|||
|
if (gtlt === '=' && anyX) {
|
|||
|
gtlt = ''
|
|||
|
}
|
|||
|
|
|||
|
if (xM) {
|
|||
|
if (gtlt === '>' || gtlt === '<') {
|
|||
|
// nothing is allowed
|
|||
|
ret = '<0.0.0'
|
|||
|
} else {
|
|||
|
// nothing is forbidden
|
|||
|
ret = '*'
|
|||
|
}
|
|||
|
} else if (gtlt && anyX) {
|
|||
|
// we know patch is an x, because we have any x at all.
|
|||
|
// replace X with 0
|
|||
|
if (xm) {
|
|||
|
m = 0
|
|||
|
}
|
|||
|
p = 0
|
|||
|
|
|||
|
if (gtlt === '>') {
|
|||
|
// >1 => >=2.0.0
|
|||
|
// >1.2 => >=1.3.0
|
|||
|
// >1.2.3 => >= 1.2.4
|
|||
|
gtlt = '>='
|
|||
|
if (xm) {
|
|||
|
M = +M + 1
|
|||
|
m = 0
|
|||
|
p = 0
|
|||
|
} else {
|
|||
|
m = +m + 1
|
|||
|
p = 0
|
|||
|
}
|
|||
|
} else if (gtlt === '<=') {
|
|||
|
// <=0.7.x is actually <0.8.0, since any 0.7.x should
|
|||
|
// pass. Similarly, <=7.x is actually <8.0.0, etc.
|
|||
|
gtlt = '<'
|
|||
|
if (xm) {
|
|||
|
M = +M + 1
|
|||
|
} else {
|
|||
|
m = +m + 1
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ret = gtlt + M + '.' + m + '.' + p
|
|||
|
} else if (xm) {
|
|||
|
ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'
|
|||
|
} else if (xp) {
|
|||
|
ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'
|
|||
|
}
|
|||
|
|
|||
|
debug('xRange return', ret)
|
|||
|
|
|||
|
return ret
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
// Because * is AND-ed with everything else in the comparator,
|
|||
|
// and '' means "any version", just remove the *s entirely.
|
|||
|
function replaceStars (comp, options) {
|
|||
|
debug('replaceStars', comp, options)
|
|||
|
// Looseness is ignored here. star is always as loose as it gets!
|
|||
|
return comp.trim().replace(re[STAR], '')
|
|||
|
}
|
|||
|
|
|||
|
// This function is passed to string.replace(re[HYPHENRANGE])
|
|||
|
// M, m, patch, prerelease, build
|
|||
|
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
|
|||
|
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
|
|||
|
// 1.2 - 3.4 => >=1.2.0 <3.5.0
|
|||
|
function hyphenReplace ($0,
|
|||
|
from, fM, fm, fp, fpr, fb,
|
|||
|
to, tM, tm, tp, tpr, tb) {
|
|||
|
if (isX(fM)) {
|
|||
|
from = ''
|
|||
|
} else if (isX(fm)) {
|
|||
|
from = '>=' + fM + '.0.0'
|
|||
|
} else if (isX(fp)) {
|
|||
|
from = '>=' + fM + '.' + fm + '.0'
|
|||
|
} else {
|
|||
|
from = '>=' + from
|
|||
|
}
|
|||
|
|
|||
|
if (isX(tM)) {
|
|||
|
to = ''
|
|||
|
} else if (isX(tm)) {
|
|||
|
to = '<' + (+tM + 1) + '.0.0'
|
|||
|
} else if (isX(tp)) {
|
|||
|
to = '<' + tM + '.' + (+tm + 1) + '.0'
|
|||
|
} else if (tpr) {
|
|||
|
to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr
|
|||
|
} else {
|
|||
|
to = '<=' + to
|
|||
|
}
|
|||
|
|
|||
|
return (from + ' ' + to).trim()
|
|||
|
}
|
|||
|
|
|||
|
// if ANY of the sets match ALL of its comparators, then pass
|
|||
|
Range.prototype.test = function (version) {
|
|||
|
if (!version) {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
if (typeof version === 'string') {
|
|||
|
version = new SemVer(version, this.options)
|
|||
|
}
|
|||
|
|
|||
|
for (var i = 0; i < this.set.length; i++) {
|
|||
|
if (testSet(this.set[i], version, this.options)) {
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
function testSet (set, version, options) {
|
|||
|
for (var i = 0; i < set.length; i++) {
|
|||
|
if (!set[i].test(version)) {
|
|||
|
return false
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (version.prerelease.length && !options.includePrerelease) {
|
|||
|
// Find the set of versions that are allowed to have prereleases
|
|||
|
// For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
|
|||
|
// That should allow `1.2.3-pr.2` to pass.
|
|||
|
// However, `1.2.4-alpha.notready` should NOT be allowed,
|
|||
|
// even though it's within the range set by the comparators.
|
|||
|
for (i = 0; i < set.length; i++) {
|
|||
|
debug(set[i].semver)
|
|||
|
if (set[i].semver === ANY) {
|
|||
|
continue
|
|||
|
}
|
|||
|
|
|||
|
if (set[i].semver.prerelease.length > 0) {
|
|||
|
var allowed = set[i].semver
|
|||
|
if (allowed.major === version.major &&
|
|||
|
allowed.minor === version.minor &&
|
|||
|
allowed.patch === version.patch) {
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Version has a -pre, but it's not one of the ones we like.
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
exports.satisfies = satisfies
|
|||
|
function satisfies (version, range, options) {
|
|||
|
try {
|
|||
|
range = new Range(range, options)
|
|||
|
} catch (er) {
|
|||
|
return false
|
|||
|
}
|
|||
|
return range.test(version)
|
|||
|
}
|
|||
|
|
|||
|
exports.maxSatisfying = maxSatisfying
|
|||
|
function maxSatisfying (versions, range, options) {
|
|||
|
var max = null
|
|||
|
var maxSV = null
|
|||
|
try {
|
|||
|
var rangeObj = new Range(range, options)
|
|||
|
} catch (er) {
|
|||
|
return null
|
|||
|
}
|
|||
|
versions.forEach(function (v) {
|
|||
|
if (rangeObj.test(v)) {
|
|||
|
// satisfies(v, range, options)
|
|||
|
if (!max || maxSV.compare(v) === -1) {
|
|||
|
// compare(max, v, true)
|
|||
|
max = v
|
|||
|
maxSV = new SemVer(max, options)
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
return max
|
|||
|
}
|
|||
|
|
|||
|
exports.minSatisfying = minSatisfying
|
|||
|
function minSatisfying (versions, range, options) {
|
|||
|
var min = null
|
|||
|
var minSV = null
|
|||
|
try {
|
|||
|
var rangeObj = new Range(range, options)
|
|||
|
} catch (er) {
|
|||
|
return null
|
|||
|
}
|
|||
|
versions.forEach(function (v) {
|
|||
|
if (rangeObj.test(v)) {
|
|||
|
// satisfies(v, range, options)
|
|||
|
if (!min || minSV.compare(v) === 1) {
|
|||
|
// compare(min, v, true)
|
|||
|
min = v
|
|||
|
minSV = new SemVer(min, options)
|
|||
|
}
|
|||
|
}
|
|||
|
})
|
|||
|
return min
|
|||
|
}
|
|||
|
|
|||
|
exports.minVersion = minVersion
|
|||
|
function minVersion (range, loose) {
|
|||
|
range = new Range(range, loose)
|
|||
|
|
|||
|
var minver = new SemVer('0.0.0')
|
|||
|
if (range.test(minver)) {
|
|||
|
return minver
|
|||
|
}
|
|||
|
|
|||
|
minver = new SemVer('0.0.0-0')
|
|||
|
if (range.test(minver)) {
|
|||
|
return minver
|
|||
|
}
|
|||
|
|
|||
|
minver = null
|
|||
|
for (var i = 0; i < range.set.length; ++i) {
|
|||
|
var comparators = range.set[i]
|
|||
|
|
|||
|
comparators.forEach(function (comparator) {
|
|||
|
// Clone to avoid manipulating the comparator's semver object.
|
|||
|
var compver = new SemVer(comparator.semver.version)
|
|||
|
switch (comparator.operator) {
|
|||
|
case '>':
|
|||
|
if (compver.prerelease.length === 0) {
|
|||
|
compver.patch++
|
|||
|
} else {
|
|||
|
compver.prerelease.push(0)
|
|||
|
}
|
|||
|
compver.raw = compver.format()
|
|||
|
/* fallthrough */
|
|||
|
case '':
|
|||
|
case '>=':
|
|||
|
if (!minver || gt(minver, compver)) {
|
|||
|
minver = compver
|
|||
|
}
|
|||
|
break
|
|||
|
case '<':
|
|||
|
case '<=':
|
|||
|
/* Ignore maximum versions */
|
|||
|
break
|
|||
|
/* istanbul ignore next */
|
|||
|
default:
|
|||
|
throw new Error('Unexpected operation: ' + comparator.operator)
|
|||
|
}
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
if (minver && range.test(minver)) {
|
|||
|
return minver
|
|||
|
}
|
|||
|
|
|||
|
return null
|
|||
|
}
|
|||
|
|
|||
|
exports.validRange = validRange
|
|||
|
function validRange (range, options) {
|
|||
|
try {
|
|||
|
// Return '*' instead of '' so that truthiness works.
|
|||
|
// This will throw if it's invalid anyway
|
|||
|
return new Range(range, options).range || '*'
|
|||
|
} catch (er) {
|
|||
|
return null
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Determine if version is less than all the versions possible in the range
|
|||
|
exports.ltr = ltr
|
|||
|
function ltr (version, range, options) {
|
|||
|
return outside(version, range, '<', options)
|
|||
|
}
|
|||
|
|
|||
|
// Determine if version is greater than all the versions possible in the range.
|
|||
|
exports.gtr = gtr
|
|||
|
function gtr (version, range, options) {
|
|||
|
return outside(version, range, '>', options)
|
|||
|
}
|
|||
|
|
|||
|
exports.outside = outside
|
|||
|
function outside (version, range, hilo, options) {
|
|||
|
version = new SemVer(version, options)
|
|||
|
range = new Range(range, options)
|
|||
|
|
|||
|
var gtfn, ltefn, ltfn, comp, ecomp
|
|||
|
switch (hilo) {
|
|||
|
case '>':
|
|||
|
gtfn = gt
|
|||
|
ltefn = lte
|
|||
|
ltfn = lt
|
|||
|
comp = '>'
|
|||
|
ecomp = '>='
|
|||
|
break
|
|||
|
case '<':
|
|||
|
gtfn = lt
|
|||
|
ltefn = gte
|
|||
|
ltfn = gt
|
|||
|
comp = '<'
|
|||
|
ecomp = '<='
|
|||
|
break
|
|||
|
default:
|
|||
|
throw new TypeError('Must provide a hilo val of "<" or ">"')
|
|||
|
}
|
|||
|
|
|||
|
// If it satisifes the range it is not outside
|
|||
|
if (satisfies(version, range, options)) {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
// From now on, variable terms are as if we're in "gtr" mode.
|
|||
|
// but note that everything is flipped for the "ltr" function.
|
|||
|
|
|||
|
for (var i = 0; i < range.set.length; ++i) {
|
|||
|
var comparators = range.set[i]
|
|||
|
|
|||
|
var high = null
|
|||
|
var low = null
|
|||
|
|
|||
|
comparators.forEach(function (comparator) {
|
|||
|
if (comparator.semver === ANY) {
|
|||
|
comparator = new Comparator('>=0.0.0')
|
|||
|
}
|
|||
|
high = high || comparator
|
|||
|
low = low || comparator
|
|||
|
if (gtfn(comparator.semver, high.semver, options)) {
|
|||
|
high = comparator
|
|||
|
} else if (ltfn(comparator.semver, low.semver, options)) {
|
|||
|
low = comparator
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
// If the edge version comparator has a operator then our version
|
|||
|
// isn't outside it
|
|||
|
if (high.operator === comp || high.operator === ecomp) {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
// If the lowest version comparator has an operator and our version
|
|||
|
// is less than it then it isn't higher than the range
|
|||
|
if ((!low.operator || low.operator === comp) &&
|
|||
|
ltefn(version, low.semver)) {
|
|||
|
return false
|
|||
|
} else if (low.operator === ecomp && ltfn(version, low.semver)) {
|
|||
|
return false
|
|||
|
}
|
|||
|
}
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
exports.prerelease = prerelease
|
|||
|
function prerelease (version, options) {
|
|||
|
var parsed = parse(version, options)
|
|||
|
return (parsed && parsed.prerelease.length) ? parsed.prerelease : null
|
|||
|
}
|
|||
|
|
|||
|
exports.intersects = intersects
|
|||
|
function intersects (r1, r2, options) {
|
|||
|
r1 = new Range(r1, options)
|
|||
|
r2 = new Range(r2, options)
|
|||
|
return r1.intersects(r2)
|
|||
|
}
|
|||
|
|
|||
|
exports.coerce = coerce
|
|||
|
function coerce (version) {
|
|||
|
if (version instanceof SemVer) {
|
|||
|
return version
|
|||
|
}
|
|||
|
|
|||
|
if (typeof version !== 'string') {
|
|||
|
return null
|
|||
|
}
|
|||
|
|
|||
|
var match = version.match(re[COERCE])
|
|||
|
|
|||
|
if (match == null) {
|
|||
|
return null
|
|||
|
}
|
|||
|
|
|||
|
return parse(match[1] +
|
|||
|
'.' + (match[2] || '0') +
|
|||
|
'.' + (match[3] || '0'))
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 289:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|||
|
if (mod && mod.__esModule) return mod;
|
|||
|
var result = {};
|
|||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|||
|
result["default"] = mod;
|
|||
|
return result;
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const core = __importStar(__webpack_require__(470));
|
|||
|
const exec = __importStar(__webpack_require__(986));
|
|||
|
const fshelper = __importStar(__webpack_require__(618));
|
|||
|
const io = __importStar(__webpack_require__(1));
|
|||
|
const path = __importStar(__webpack_require__(622));
|
|||
|
const git_version_1 = __webpack_require__(559);
|
|||
|
function CreateCommandManager(workingDirectory, lfs) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
return yield GitCommandManager.createCommandManager(workingDirectory, lfs);
|
|||
|
});
|
|||
|
}
|
|||
|
exports.CreateCommandManager = CreateCommandManager;
|
|||
|
class GitCommandManager {
|
|||
|
// Private constructor; use createCommandManager()
|
|||
|
constructor() {
|
|||
|
this.gitEnv = {
|
|||
|
GIT_TERMINAL_PROMPT: '0',
|
|||
|
GCM_INTERACTIVE: 'Never' // Disable prompting for git credential manager
|
|||
|
};
|
|||
|
this.gitPath = '';
|
|||
|
this.lfs = false;
|
|||
|
this.workingDirectory = '';
|
|||
|
}
|
|||
|
branchDelete(remote, branch) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const args = ['branch', '--delete', '--force'];
|
|||
|
if (remote) {
|
|||
|
args.push('--remote');
|
|||
|
}
|
|||
|
args.push(branch);
|
|||
|
yield this.execGit(args);
|
|||
|
});
|
|||
|
}
|
|||
|
branchExists(remote, pattern) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const args = ['branch', '--list'];
|
|||
|
if (remote) {
|
|||
|
args.push('--remote');
|
|||
|
}
|
|||
|
args.push(pattern);
|
|||
|
const output = yield this.execGit(args);
|
|||
|
return !!output.stdout.trim();
|
|||
|
});
|
|||
|
}
|
|||
|
branchList(remote) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const result = [];
|
|||
|
// Note, this implementation uses "rev-parse --symbolic" because the output from
|
|||
|
// "branch --list" is more difficult when in a detached HEAD state.
|
|||
|
const args = ['rev-parse', '--symbolic'];
|
|||
|
if (remote) {
|
|||
|
args.push('--remotes=origin');
|
|||
|
}
|
|||
|
else {
|
|||
|
args.push('--branches');
|
|||
|
}
|
|||
|
const output = yield this.execGit(args);
|
|||
|
for (let branch of output.stdout.trim().split('\n')) {
|
|||
|
branch = branch.trim();
|
|||
|
if (branch) {
|
|||
|
result.push(branch);
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
checkout(ref, startPoint) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const args = ['checkout', '--progress', '--force'];
|
|||
|
if (startPoint) {
|
|||
|
args.push('-B', ref, startPoint);
|
|||
|
}
|
|||
|
else {
|
|||
|
args.push(ref);
|
|||
|
}
|
|||
|
yield this.execGit(args);
|
|||
|
});
|
|||
|
}
|
|||
|
checkoutDetach() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const args = ['checkout', '--detach'];
|
|||
|
yield this.execGit(args);
|
|||
|
});
|
|||
|
}
|
|||
|
config(configKey, configValue) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
yield this.execGit(['config', configKey, configValue]);
|
|||
|
});
|
|||
|
}
|
|||
|
configExists(configKey) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const pattern = configKey.replace(/[^a-zA-Z0-9_]/g, x => {
|
|||
|
return `\\${x}`;
|
|||
|
});
|
|||
|
const output = yield this.execGit(['config', '--name-only', '--get-regexp', pattern], true);
|
|||
|
return output.exitCode === 0;
|
|||
|
});
|
|||
|
}
|
|||
|
fetch(fetchDepth, refSpec) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const args = [
|
|||
|
'-c',
|
|||
|
'protocol.version=2',
|
|||
|
'fetch',
|
|||
|
'--no-tags',
|
|||
|
'--prune',
|
|||
|
'--progress',
|
|||
|
'--no-recurse-submodules'
|
|||
|
];
|
|||
|
if (fetchDepth > 0) {
|
|||
|
args.push(`--depth=${fetchDepth}`);
|
|||
|
}
|
|||
|
else if (fshelper.fileExistsSync(path.join(this.workingDirectory, '.git', 'shallow'))) {
|
|||
|
args.push('--unshallow');
|
|||
|
}
|
|||
|
args.push('origin');
|
|||
|
for (const arg of refSpec) {
|
|||
|
args.push(arg);
|
|||
|
}
|
|||
|
let attempt = 1;
|
|||
|
const maxAttempts = 3;
|
|||
|
while (attempt <= maxAttempts) {
|
|||
|
const allowAllExitCodes = attempt < maxAttempts;
|
|||
|
const output = yield this.execGit(args, allowAllExitCodes);
|
|||
|
if (output.exitCode === 0) {
|
|||
|
break;
|
|||
|
}
|
|||
|
const seconds = this.getRandomIntInclusive(1, 10);
|
|||
|
core.warning(`Git fetch failed with exit code ${output.exitCode}. Waiting ${seconds} seconds before trying again.`);
|
|||
|
yield this.sleep(seconds * 1000);
|
|||
|
attempt++;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
getWorkingDirectory() {
|
|||
|
return this.workingDirectory;
|
|||
|
}
|
|||
|
init() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
yield this.execGit(['init', this.workingDirectory]);
|
|||
|
});
|
|||
|
}
|
|||
|
isDetached() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
// Note, this implementation uses "branch --show-current" because
|
|||
|
// "rev-parse --symbolic-full-name HEAD" can fail on a new repo
|
|||
|
// with nothing checked out.
|
|||
|
const output = yield this.execGit(['branch', '--show-current']);
|
|||
|
return output.stdout.trim() === '';
|
|||
|
});
|
|||
|
}
|
|||
|
lfsFetch(ref) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const args = ['lfs', 'fetch', 'origin', ref];
|
|||
|
let attempt = 1;
|
|||
|
const maxAttempts = 3;
|
|||
|
while (attempt <= maxAttempts) {
|
|||
|
const allowAllExitCodes = attempt < maxAttempts;
|
|||
|
const output = yield this.execGit(args, allowAllExitCodes);
|
|||
|
if (output.exitCode === 0) {
|
|||
|
break;
|
|||
|
}
|
|||
|
const seconds = this.getRandomIntInclusive(1, 10);
|
|||
|
core.warning(`Git lfs fetch failed with exit code ${output.exitCode}. Waiting ${seconds} seconds before trying again.`);
|
|||
|
yield this.sleep(seconds * 1000);
|
|||
|
attempt++;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
lfsInstall() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
yield this.execGit(['lfs', 'install', '--local']);
|
|||
|
});
|
|||
|
}
|
|||
|
log1() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
yield this.execGit(['log', '-1']);
|
|||
|
});
|
|||
|
}
|
|||
|
remoteAdd(remoteName, remoteUrl) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
yield this.execGit(['remote', 'add', remoteName, remoteUrl]);
|
|||
|
});
|
|||
|
}
|
|||
|
tagExists(pattern) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const output = yield this.execGit(['tag', '--list', pattern]);
|
|||
|
return !!output.stdout.trim();
|
|||
|
});
|
|||
|
}
|
|||
|
tryClean() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const output = yield this.execGit(['clean', '-ffdx'], true);
|
|||
|
return output.exitCode === 0;
|
|||
|
});
|
|||
|
}
|
|||
|
tryConfigUnset(configKey) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const output = yield this.execGit(['config', '--unset-all', configKey], true);
|
|||
|
return output.exitCode === 0;
|
|||
|
});
|
|||
|
}
|
|||
|
tryDisableAutomaticGarbageCollection() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const output = yield this.execGit(['config', 'gc.auto', '0'], true);
|
|||
|
return output.exitCode === 0;
|
|||
|
});
|
|||
|
}
|
|||
|
tryGetFetchUrl() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const output = yield this.execGit(['config', '--get', 'remote.origin.url'], true);
|
|||
|
if (output.exitCode !== 0) {
|
|||
|
return '';
|
|||
|
}
|
|||
|
const stdout = output.stdout.trim();
|
|||
|
if (stdout.includes('\n')) {
|
|||
|
return '';
|
|||
|
}
|
|||
|
return stdout;
|
|||
|
});
|
|||
|
}
|
|||
|
tryReset() {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const output = yield this.execGit(['reset', '--hard', 'HEAD'], true);
|
|||
|
return output.exitCode === 0;
|
|||
|
});
|
|||
|
}
|
|||
|
static createCommandManager(workingDirectory, lfs) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const result = new GitCommandManager();
|
|||
|
yield result.initializeCommandManager(workingDirectory, lfs);
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
execGit(args, allowAllExitCodes = false) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
fshelper.directoryExistsSync(this.workingDirectory, true);
|
|||
|
const result = new GitOutput();
|
|||
|
const env = {};
|
|||
|
for (const key of Object.keys(process.env)) {
|
|||
|
env[key] = process.env[key];
|
|||
|
}
|
|||
|
for (const key of Object.keys(this.gitEnv)) {
|
|||
|
env[key] = this.gitEnv[key];
|
|||
|
}
|
|||
|
const stdout = [];
|
|||
|
const options = {
|
|||
|
cwd: this.workingDirectory,
|
|||
|
env,
|
|||
|
ignoreReturnCode: allowAllExitCodes,
|
|||
|
listeners: {
|
|||
|
stdout: (data) => {
|
|||
|
stdout.push(data.toString());
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
result.exitCode = yield exec.exec(`"${this.gitPath}"`, args, options);
|
|||
|
result.stdout = stdout.join('');
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
initializeCommandManager(workingDirectory, lfs) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
this.workingDirectory = workingDirectory;
|
|||
|
// Git-lfs will try to pull down assets if any of the local/user/system setting exist.
|
|||
|
// If the user didn't enable `LFS` in their pipeline definition, disable LFS fetch/checkout.
|
|||
|
this.lfs = lfs;
|
|||
|
if (!this.lfs) {
|
|||
|
this.gitEnv['GIT_LFS_SKIP_SMUDGE'] = '1';
|
|||
|
}
|
|||
|
this.gitPath = yield io.which('git', true);
|
|||
|
// Git version
|
|||
|
core.debug('Getting git version');
|
|||
|
let gitVersion = new git_version_1.GitVersion();
|
|||
|
let gitOutput = yield this.execGit(['version']);
|
|||
|
let stdout = gitOutput.stdout.trim();
|
|||
|
if (!stdout.includes('\n')) {
|
|||
|
const match = stdout.match(/\d+\.\d+(\.\d+)?/);
|
|||
|
if (match) {
|
|||
|
gitVersion = new git_version_1.GitVersion(match[0]);
|
|||
|
}
|
|||
|
}
|
|||
|
if (!gitVersion.isValid()) {
|
|||
|
throw new Error('Unable to determine git version');
|
|||
|
}
|
|||
|
// Minimum git version
|
|||
|
// Note:
|
|||
|
// - Auth header not supported before 2.9
|
|||
|
// - Wire protocol v2 not supported before 2.18
|
|||
|
const minimumGitVersion = new git_version_1.GitVersion('2.18');
|
|||
|
if (!gitVersion.checkMinimum(minimumGitVersion)) {
|
|||
|
throw new Error(`Minimum required git version is ${minimumGitVersion}. Your git ('${this.gitPath}') is ${gitVersion}`);
|
|||
|
}
|
|||
|
if (this.lfs) {
|
|||
|
// Git-lfs version
|
|||
|
core.debug('Getting git-lfs version');
|
|||
|
let gitLfsVersion = new git_version_1.GitVersion();
|
|||
|
const gitLfsPath = yield io.which('git-lfs', true);
|
|||
|
gitOutput = yield this.execGit(['lfs', 'version']);
|
|||
|
stdout = gitOutput.stdout.trim();
|
|||
|
if (!stdout.includes('\n')) {
|
|||
|
const match = stdout.match(/\d+\.\d+(\.\d+)?/);
|
|||
|
if (match) {
|
|||
|
gitLfsVersion = new git_version_1.GitVersion(match[0]);
|
|||
|
}
|
|||
|
}
|
|||
|
if (!gitLfsVersion.isValid()) {
|
|||
|
throw new Error('Unable to determine git-lfs version');
|
|||
|
}
|
|||
|
// Minimum git-lfs version
|
|||
|
// Note:
|
|||
|
// - Auth header not supported before 2.1
|
|||
|
const minimumGitLfsVersion = new git_version_1.GitVersion('2.1');
|
|||
|
if (!gitLfsVersion.checkMinimum(minimumGitLfsVersion)) {
|
|||
|
throw new Error(`Minimum required git-lfs version is ${minimumGitLfsVersion}. Your git-lfs ('${gitLfsPath}') is ${gitLfsVersion}`);
|
|||
|
}
|
|||
|
}
|
|||
|
// Set the user agent
|
|||
|
const gitHttpUserAgent = `git/${gitVersion} (github-actions-checkout)`;
|
|||
|
core.debug(`Set git useragent to: ${gitHttpUserAgent}`);
|
|||
|
this.gitEnv['GIT_HTTP_USER_AGENT'] = gitHttpUserAgent;
|
|||
|
});
|
|||
|
}
|
|||
|
getRandomIntInclusive(minimum, maximum) {
|
|||
|
minimum = Math.floor(minimum);
|
|||
|
maximum = Math.floor(maximum);
|
|||
|
return Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
|
|||
|
}
|
|||
|
sleep(milliseconds) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
return new Promise(resolve => setTimeout(resolve, milliseconds));
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
class GitOutput {
|
|||
|
constructor() {
|
|||
|
this.stdout = '';
|
|||
|
this.exitCode = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 293:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|||
|
if (mod && mod.__esModule) return mod;
|
|||
|
var result = {};
|
|||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|||
|
result["default"] = mod;
|
|||
|
return result;
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const core = __importStar(__webpack_require__(470));
|
|||
|
const coreCommand = __importStar(__webpack_require__(431));
|
|||
|
const fs = __importStar(__webpack_require__(747));
|
|||
|
const fsHelper = __importStar(__webpack_require__(618));
|
|||
|
const gitCommandManager = __importStar(__webpack_require__(289));
|
|||
|
const io = __importStar(__webpack_require__(1));
|
|||
|
const path = __importStar(__webpack_require__(622));
|
|||
|
const refHelper = __importStar(__webpack_require__(227));
|
|||
|
const authConfigKey = `http.https://github.com/.extraheader`;
|
|||
|
function getSource(settings) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
core.info(`Syncing repository: ${settings.repositoryOwner}/${settings.repositoryName}`);
|
|||
|
const repositoryUrl = `https://github.com/${encodeURIComponent(settings.repositoryOwner)}/${encodeURIComponent(settings.repositoryName)}`;
|
|||
|
// Remove conflicting file path
|
|||
|
if (fsHelper.fileExistsSync(settings.repositoryPath)) {
|
|||
|
yield io.rmRF(settings.repositoryPath);
|
|||
|
}
|
|||
|
// Create directory
|
|||
|
let isExisting = true;
|
|||
|
if (!fsHelper.directoryExistsSync(settings.repositoryPath)) {
|
|||
|
isExisting = false;
|
|||
|
yield io.mkdirP(settings.repositoryPath);
|
|||
|
}
|
|||
|
// Git command manager
|
|||
|
core.info(`Working directory is '${settings.repositoryPath}'`);
|
|||
|
const git = yield gitCommandManager.CreateCommandManager(settings.repositoryPath, settings.lfs);
|
|||
|
// Try prepare existing directory, otherwise recreate
|
|||
|
if (isExisting &&
|
|||
|
!(yield tryPrepareExistingDirectory(git, settings.repositoryPath, repositoryUrl, settings.clean))) {
|
|||
|
yield io.rmRF(settings.repositoryPath);
|
|||
|
yield io.mkdirP(settings.repositoryPath);
|
|||
|
}
|
|||
|
// Initialize the repository
|
|||
|
if (!fsHelper.directoryExistsSync(path.join(settings.repositoryPath, '.git'))) {
|
|||
|
yield git.init();
|
|||
|
yield git.remoteAdd('origin', repositoryUrl);
|
|||
|
}
|
|||
|
// Disable automatic garbage collection
|
|||
|
if (!(yield git.tryDisableAutomaticGarbageCollection())) {
|
|||
|
core.warning(`Unable to turn off git automatic garbage collection. The git fetch operation may trigger garbage collection and cause a delay.`);
|
|||
|
}
|
|||
|
// Remove possible previous extraheader
|
|||
|
yield removeGitConfig(git, authConfigKey);
|
|||
|
// Add extraheader (auth)
|
|||
|
const base64Credentials = Buffer.from(`x-access-token:${settings.accessToken}`, 'utf8').toString('base64');
|
|||
|
core.setSecret(base64Credentials);
|
|||
|
const authConfigValue = `AUTHORIZATION: basic ${base64Credentials}`;
|
|||
|
yield git.config(authConfigKey, authConfigValue);
|
|||
|
// LFS install
|
|||
|
if (settings.lfs) {
|
|||
|
yield git.lfsInstall();
|
|||
|
}
|
|||
|
// Fetch
|
|||
|
const refSpec = refHelper.getRefSpec(settings.ref, settings.commit);
|
|||
|
yield git.fetch(settings.fetchDepth, refSpec);
|
|||
|
// Checkout info
|
|||
|
const checkoutInfo = yield refHelper.getCheckoutInfo(git, settings.ref, settings.commit);
|
|||
|
// LFS fetch
|
|||
|
// Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time).
|
|||
|
// Explicit lfs fetch will fetch lfs objects in parallel.
|
|||
|
if (settings.lfs) {
|
|||
|
yield git.lfsFetch(checkoutInfo.startPoint || checkoutInfo.ref);
|
|||
|
}
|
|||
|
// Checkout
|
|||
|
yield git.checkout(checkoutInfo.ref, checkoutInfo.startPoint);
|
|||
|
// Dump some info about the checked out commit
|
|||
|
yield git.log1();
|
|||
|
// Set intra-task state for cleanup
|
|||
|
coreCommand.issueCommand('save-state', { name: 'repositoryPath' }, settings.repositoryPath);
|
|||
|
});
|
|||
|
}
|
|||
|
exports.getSource = getSource;
|
|||
|
function cleanup(repositoryPath) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
// Repo exists?
|
|||
|
if (!fsHelper.fileExistsSync(path.join(repositoryPath, '.git', 'config'))) {
|
|||
|
return;
|
|||
|
}
|
|||
|
fsHelper.directoryExistsSync(repositoryPath, true);
|
|||
|
// Remove the config key
|
|||
|
const git = yield gitCommandManager.CreateCommandManager(repositoryPath, false);
|
|||
|
yield removeGitConfig(git, authConfigKey);
|
|||
|
});
|
|||
|
}
|
|||
|
exports.cleanup = cleanup;
|
|||
|
function tryPrepareExistingDirectory(git, repositoryPath, repositoryUrl, clean) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
// Fetch URL does not match
|
|||
|
if (!fsHelper.directoryExistsSync(path.join(repositoryPath, '.git')) ||
|
|||
|
repositoryUrl !== (yield git.tryGetFetchUrl())) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// Delete any index.lock and shallow.lock left by a previously canceled run or crashed git process
|
|||
|
const lockPaths = [
|
|||
|
path.join(repositoryPath, '.git', 'index.lock'),
|
|||
|
path.join(repositoryPath, '.git', 'shallow.lock')
|
|||
|
];
|
|||
|
for (const lockPath of lockPaths) {
|
|||
|
try {
|
|||
|
yield io.rmRF(lockPath);
|
|||
|
}
|
|||
|
catch (error) {
|
|||
|
core.debug(`Unable to delete '${lockPath}'. ${error.message}`);
|
|||
|
}
|
|||
|
}
|
|||
|
try {
|
|||
|
// Checkout detached HEAD
|
|||
|
if (!(yield git.isDetached())) {
|
|||
|
yield git.checkoutDetach();
|
|||
|
}
|
|||
|
// Remove all refs/heads/*
|
|||
|
let branches = yield git.branchList(false);
|
|||
|
for (const branch of branches) {
|
|||
|
yield git.branchDelete(false, branch);
|
|||
|
}
|
|||
|
// Remove all refs/remotes/origin/* to avoid conflicts
|
|||
|
branches = yield git.branchList(true);
|
|||
|
for (const branch of branches) {
|
|||
|
yield git.branchDelete(true, branch);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (error) {
|
|||
|
core.warning(`Unable to prepare the existing repository. The repository will be recreated instead.`);
|
|||
|
return false;
|
|||
|
}
|
|||
|
// Clean
|
|||
|
if (clean) {
|
|||
|
let succeeded = true;
|
|||
|
if (!(yield git.tryClean())) {
|
|||
|
core.debug(`The clean command failed. This might be caused by: 1) path too long, 2) permission issue, or 3) file in use. For futher investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.`);
|
|||
|
succeeded = false;
|
|||
|
}
|
|||
|
else if (!(yield git.tryReset())) {
|
|||
|
succeeded = false;
|
|||
|
}
|
|||
|
if (!succeeded) {
|
|||
|
core.warning(`Unable to clean or reset the repository. The repository will be recreated instead.`);
|
|||
|
}
|
|||
|
return succeeded;
|
|||
|
}
|
|||
|
return true;
|
|||
|
});
|
|||
|
}
|
|||
|
function removeGitConfig(git, configKey) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
if ((yield git.configExists(configKey)) &&
|
|||
|
!(yield git.tryConfigUnset(configKey))) {
|
|||
|
// Load the config contents
|
|||
|
core.warning(`Failed to remove '${configKey}' from the git config. Attempting to remove the config value by editing the file directly.`);
|
|||
|
const configPath = path.join(git.getWorkingDirectory(), '.git', 'config');
|
|||
|
fsHelper.fileExistsSync(configPath);
|
|||
|
let contents = fs.readFileSync(configPath).toString() || '';
|
|||
|
// Filter - only includes lines that do not contain the config key
|
|||
|
const upperConfigKey = configKey.toUpperCase();
|
|||
|
const split = contents
|
|||
|
.split('\n')
|
|||
|
.filter(x => !x.toUpperCase().includes(upperConfigKey));
|
|||
|
contents = split.join('\n');
|
|||
|
// Rewrite the config file
|
|||
|
fs.writeFileSync(configPath, contents);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 294:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = parseOptions;
|
|||
|
|
|||
|
const { Deprecation } = __webpack_require__(692);
|
|||
|
const { getUserAgent } = __webpack_require__(619);
|
|||
|
const once = __webpack_require__(969);
|
|||
|
|
|||
|
const pkg = __webpack_require__(215);
|
|||
|
|
|||
|
const deprecateOptionsTimeout = once((log, deprecation) =>
|
|||
|
log.warn(deprecation)
|
|||
|
);
|
|||
|
const deprecateOptionsAgent = once((log, deprecation) => log.warn(deprecation));
|
|||
|
const deprecateOptionsHeaders = once((log, deprecation) =>
|
|||
|
log.warn(deprecation)
|
|||
|
);
|
|||
|
|
|||
|
function parseOptions(options, log, hook) {
|
|||
|
if (options.headers) {
|
|||
|
options.headers = Object.keys(options.headers).reduce((newObj, key) => {
|
|||
|
newObj[key.toLowerCase()] = options.headers[key];
|
|||
|
return newObj;
|
|||
|
}, {});
|
|||
|
}
|
|||
|
|
|||
|
const clientDefaults = {
|
|||
|
headers: options.headers || {},
|
|||
|
request: options.request || {},
|
|||
|
mediaType: {
|
|||
|
previews: [],
|
|||
|
format: ""
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
if (options.baseUrl) {
|
|||
|
clientDefaults.baseUrl = options.baseUrl;
|
|||
|
}
|
|||
|
|
|||
|
if (options.userAgent) {
|
|||
|
clientDefaults.headers["user-agent"] = options.userAgent;
|
|||
|
}
|
|||
|
|
|||
|
if (options.previews) {
|
|||
|
clientDefaults.mediaType.previews = options.previews;
|
|||
|
}
|
|||
|
|
|||
|
if (options.timeZone) {
|
|||
|
clientDefaults.headers["time-zone"] = options.timeZone;
|
|||
|
}
|
|||
|
|
|||
|
if (options.timeout) {
|
|||
|
deprecateOptionsTimeout(
|
|||
|
log,
|
|||
|
new Deprecation(
|
|||
|
"[@octokit/rest] new Octokit({timeout}) is deprecated. Use {request: {timeout}} instead. See https://github.com/octokit/request.js#request"
|
|||
|
)
|
|||
|
);
|
|||
|
clientDefaults.request.timeout = options.timeout;
|
|||
|
}
|
|||
|
|
|||
|
if (options.agent) {
|
|||
|
deprecateOptionsAgent(
|
|||
|
log,
|
|||
|
new Deprecation(
|
|||
|
"[@octokit/rest] new Octokit({agent}) is deprecated. Use {request: {agent}} instead. See https://github.com/octokit/request.js#request"
|
|||
|
)
|
|||
|
);
|
|||
|
clientDefaults.request.agent = options.agent;
|
|||
|
}
|
|||
|
|
|||
|
if (options.headers) {
|
|||
|
deprecateOptionsHeaders(
|
|||
|
log,
|
|||
|
new Deprecation(
|
|||
|
"[@octokit/rest] new Octokit({headers}) is deprecated. Use {userAgent, previews} instead. See https://github.com/octokit/request.js#request"
|
|||
|
)
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
const userAgentOption = clientDefaults.headers["user-agent"];
|
|||
|
const defaultUserAgent = `octokit.js/${pkg.version} ${getUserAgent()}`;
|
|||
|
|
|||
|
clientDefaults.headers["user-agent"] = [userAgentOption, defaultUserAgent]
|
|||
|
.filter(Boolean)
|
|||
|
.join(" ");
|
|||
|
|
|||
|
clientDefaults.request.hook = hook.bind(null, "request");
|
|||
|
|
|||
|
return clientDefaults;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 297:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = class HttpError extends Error {
|
|||
|
constructor (message, code, headers) {
|
|||
|
super(message)
|
|||
|
|
|||
|
// Maintains proper stack trace (only available on V8)
|
|||
|
/* istanbul ignore next */
|
|||
|
if (Error.captureStackTrace) {
|
|||
|
Error.captureStackTrace(this, this.constructor)
|
|||
|
}
|
|||
|
|
|||
|
this.name = 'HttpError'
|
|||
|
this.code = code
|
|||
|
this.headers = headers
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 301:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
/**
|
|||
|
* Some “list” response that can be paginated have a different response structure
|
|||
|
*
|
|||
|
* They have a `total_count` key in the response (search also has `incomplete_results`,
|
|||
|
* /installation/repositories also has `repository_selection`), as well as a key with
|
|||
|
* the list of the items which name varies from endpoint to endpoint:
|
|||
|
*
|
|||
|
* - https://developer.github.com/v3/search/#example (key `items`)
|
|||
|
* - https://developer.github.com/v3/checks/runs/#response-3 (key: `check_runs`)
|
|||
|
* - https://developer.github.com/v3/checks/suites/#response-1 (key: `check_suites`)
|
|||
|
* - https://developer.github.com/v3/apps/installations/#list-repositories (key: `repositories`)
|
|||
|
* - https://developer.github.com/v3/apps/installations/#list-installations-for-a-user (key `installations`)
|
|||
|
*
|
|||
|
* Octokit normalizes these responses so that paginated results are always returned following
|
|||
|
* the same structure. One challenge is that if the list response has only one page, no Link
|
|||
|
* header is provided, so this header alone is not sufficient to check wether a response is
|
|||
|
* paginated or not. For the exceptions with the namespace, a fallback check for the route
|
|||
|
* paths has to be added in order to normalize the response. We cannot check for the total_count
|
|||
|
* property because it also exists in the response of Get the combined status for a specific ref.
|
|||
|
*/
|
|||
|
|
|||
|
module.exports = normalizePaginatedListResponse;
|
|||
|
|
|||
|
const { Deprecation } = __webpack_require__(692);
|
|||
|
const once = __webpack_require__(969);
|
|||
|
|
|||
|
const deprecateIncompleteResults = once((log, deprecation) =>
|
|||
|
log.warn(deprecation)
|
|||
|
);
|
|||
|
const deprecateTotalCount = once((log, deprecation) => log.warn(deprecation));
|
|||
|
const deprecateNamespace = once((log, deprecation) => log.warn(deprecation));
|
|||
|
|
|||
|
const REGEX_IS_SEARCH_PATH = /^\/search\//;
|
|||
|
const REGEX_IS_CHECKS_PATH = /^\/repos\/[^/]+\/[^/]+\/commits\/[^/]+\/(check-runs|check-suites)/;
|
|||
|
const REGEX_IS_INSTALLATION_REPOSITORIES_PATH = /^\/installation\/repositories/;
|
|||
|
const REGEX_IS_USER_INSTALLATIONS_PATH = /^\/user\/installations/;
|
|||
|
|
|||
|
function normalizePaginatedListResponse(octokit, url, response) {
|
|||
|
const path = url.replace(octokit.request.endpoint.DEFAULTS.baseUrl, "");
|
|||
|
if (
|
|||
|
!REGEX_IS_SEARCH_PATH.test(path) &&
|
|||
|
!REGEX_IS_CHECKS_PATH.test(path) &&
|
|||
|
!REGEX_IS_INSTALLATION_REPOSITORIES_PATH.test(path) &&
|
|||
|
!REGEX_IS_USER_INSTALLATIONS_PATH.test(path)
|
|||
|
) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// keep the additional properties intact to avoid a breaking change,
|
|||
|
// but log a deprecation warning when accessed
|
|||
|
const incompleteResults = response.data.incomplete_results;
|
|||
|
const repositorySelection = response.data.repository_selection;
|
|||
|
const totalCount = response.data.total_count;
|
|||
|
delete response.data.incomplete_results;
|
|||
|
delete response.data.repository_selection;
|
|||
|
delete response.data.total_count;
|
|||
|
|
|||
|
const namespaceKey = Object.keys(response.data)[0];
|
|||
|
|
|||
|
response.data = response.data[namespaceKey];
|
|||
|
|
|||
|
Object.defineProperty(response.data, namespaceKey, {
|
|||
|
get() {
|
|||
|
deprecateNamespace(
|
|||
|
octokit.log,
|
|||
|
new Deprecation(
|
|||
|
`[@octokit/rest] "result.data.${namespaceKey}" is deprecated. Use "result.data" instead`
|
|||
|
)
|
|||
|
);
|
|||
|
return response.data;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
if (typeof incompleteResults !== "undefined") {
|
|||
|
Object.defineProperty(response.data, "incomplete_results", {
|
|||
|
get() {
|
|||
|
deprecateIncompleteResults(
|
|||
|
octokit.log,
|
|||
|
new Deprecation(
|
|||
|
'[@octokit/rest] "result.data.incomplete_results" is deprecated.'
|
|||
|
)
|
|||
|
);
|
|||
|
return incompleteResults;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (typeof repositorySelection !== "undefined") {
|
|||
|
Object.defineProperty(response.data, "repository_selection", {
|
|||
|
get() {
|
|||
|
deprecateTotalCount(
|
|||
|
octokit.log,
|
|||
|
new Deprecation(
|
|||
|
'[@octokit/rest] "result.data.repository_selection" is deprecated.'
|
|||
|
)
|
|||
|
);
|
|||
|
return repositorySelection;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
Object.defineProperty(response.data, "total_count", {
|
|||
|
get() {
|
|||
|
deprecateTotalCount(
|
|||
|
octokit.log,
|
|||
|
new Deprecation(
|
|||
|
'[@octokit/rest] "result.data.total_count" is deprecated.'
|
|||
|
)
|
|||
|
);
|
|||
|
return totalCount;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 309:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = octokitRestNormalizeGitReferenceResponses;
|
|||
|
|
|||
|
const { RequestError } = __webpack_require__(463);
|
|||
|
|
|||
|
function octokitRestNormalizeGitReferenceResponses(octokit) {
|
|||
|
octokit.hook.wrap("request", (request, options) => {
|
|||
|
const isGetOrListRefRequest = /\/repos\/:?\w+\/:?\w+\/git\/refs\/:?\w+/.test(
|
|||
|
options.url
|
|||
|
);
|
|||
|
|
|||
|
if (!isGetOrListRefRequest) {
|
|||
|
return request(options);
|
|||
|
}
|
|||
|
|
|||
|
const isGetRefRequest = "ref" in options;
|
|||
|
|
|||
|
return request(options)
|
|||
|
.then(response => {
|
|||
|
// request single reference
|
|||
|
if (isGetRefRequest) {
|
|||
|
if (Array.isArray(response.data)) {
|
|||
|
throw new RequestError(
|
|||
|
`More than one reference found for "${options.ref}"`,
|
|||
|
404,
|
|||
|
{
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
// ✅ received single reference
|
|||
|
return response;
|
|||
|
}
|
|||
|
|
|||
|
// request list of references
|
|||
|
if (!Array.isArray(response.data)) {
|
|||
|
response.data = [response.data];
|
|||
|
}
|
|||
|
|
|||
|
return response;
|
|||
|
})
|
|||
|
|
|||
|
.catch(error => {
|
|||
|
if (isGetRefRequest) {
|
|||
|
throw error;
|
|||
|
}
|
|||
|
|
|||
|
if (error.status === 404) {
|
|||
|
return {
|
|||
|
status: 200,
|
|||
|
headers: error.headers,
|
|||
|
data: []
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
throw error;
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 314:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = {"name":"@octokit/graphql","version":"2.1.3","publishConfig":{"access":"public"},"description":"GitHub GraphQL API client for browsers and Node","main":"index.js","scripts":{"prebuild":"mkdirp dist/","build":"npm-run-all build:*","build:development":"webpack --mode development --entry . --output-library=octokitGraphql --output=./dist/octokit-graphql.js --profile --json > dist/bundle-stats.json","build:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=octokitGraphql --output-path=./dist --output-filename=octokit-graphql.min.js --devtool source-map","bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","coverage":"nyc report --reporter=html && open coverage/index.html","coverage:upload":"nyc report --reporter=text-lcov | coveralls","pretest":"standard","test":"nyc mocha test/*-test.js","test:browser":"cypress run --browser chrome"},"repository":{"type":"git","url":"https://github.com/octokit/graphql.js.git"},"keywords":["octokit","github","api","graphql"],"author":"Gregor Martynus (https://github.com/gr2m)","license":"MIT","bugs":{"url":"https://github.com/octokit/graphql.js/issues"},"homepage":"https://github.com/octokit/graphql.js#readme","dependencies":{"@octokit/request":"^5.0.0","universal-user-agent":"^2.0.3"},"devDependencies":{"chai":"^4.2.0","compression-webpack-plugin":"^2.0.0","coveralls":"^3.0.3","cypress":"^3.1.5","fetch-mock":"^7.3.1","mkdirp":"^0.5.1","mocha":"^6.0.0","npm-run-all":"^4.1.3","nyc":"^14.0.0","semantic-release":"^15.13.3","simple-mock":"^0.8.0","standard":"^12.0.1","webpack":"^4.29.6","webpack-bundle-analyzer":"^3.1.0","webpack-cli":"^3.2.3"},"bundlesize":[{"path":"./dist/octokit-graphql.min.js.gz","maxSize":"5KB"}],"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"standard":{"globals":["describe","before","beforeEach","afterEach","after","it","expect"]},"files":["lib"],"_resolved":"https://registry.npmjs.org/@octokit/graphql/-/graphql-2.1.3.tgz","_integrity":"sha512-XoXJqL2ondwdnMIW3wtqJWEwcBfKk37jO/rYkoxNPEVeLBDGsGO1TCWggrAlq3keGt/O+C/7VepXnukUxwt5vA==","_from":"@octokit/graphql@2.1.3"};
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 323:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
var isStream = module.exports = function (stream) {
|
|||
|
return stream !== null && typeof stream === 'object' && typeof stream.pipe === 'function';
|
|||
|
};
|
|||
|
|
|||
|
isStream.writable = function (stream) {
|
|||
|
return isStream(stream) && stream.writable !== false && typeof stream._write === 'function' && typeof stream._writableState === 'object';
|
|||
|
};
|
|||
|
|
|||
|
isStream.readable = function (stream) {
|
|||
|
return isStream(stream) && stream.readable !== false && typeof stream._read === 'function' && typeof stream._readableState === 'object';
|
|||
|
};
|
|||
|
|
|||
|
isStream.duplex = function (stream) {
|
|||
|
return isStream.writable(stream) && isStream.readable(stream);
|
|||
|
};
|
|||
|
|
|||
|
isStream.transform = function (stream) {
|
|||
|
return isStream.duplex(stream) && typeof stream._transform === 'function' && typeof stream._transformState === 'object';
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 336:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = hasLastPage
|
|||
|
|
|||
|
const deprecate = __webpack_require__(370)
|
|||
|
const getPageLinks = __webpack_require__(577)
|
|||
|
|
|||
|
function hasLastPage (link) {
|
|||
|
deprecate(`octokit.hasLastPage() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`)
|
|||
|
return getPageLinks(link).last
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 348:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
module.exports = validate;
|
|||
|
|
|||
|
const { RequestError } = __webpack_require__(463);
|
|||
|
const get = __webpack_require__(854);
|
|||
|
const set = __webpack_require__(883);
|
|||
|
|
|||
|
function validate(octokit, options) {
|
|||
|
if (!options.request.validate) {
|
|||
|
return;
|
|||
|
}
|
|||
|
const { validate: params } = options.request;
|
|||
|
|
|||
|
Object.keys(params).forEach(parameterName => {
|
|||
|
const parameter = get(params, parameterName);
|
|||
|
|
|||
|
const expectedType = parameter.type;
|
|||
|
let parentParameterName;
|
|||
|
let parentValue;
|
|||
|
let parentParamIsPresent = true;
|
|||
|
let parentParameterIsArray = false;
|
|||
|
|
|||
|
if (/\./.test(parameterName)) {
|
|||
|
parentParameterName = parameterName.replace(/\.[^.]+$/, "");
|
|||
|
parentParameterIsArray = parentParameterName.slice(-2) === "[]";
|
|||
|
if (parentParameterIsArray) {
|
|||
|
parentParameterName = parentParameterName.slice(0, -2);
|
|||
|
}
|
|||
|
parentValue = get(options, parentParameterName);
|
|||
|
parentParamIsPresent =
|
|||
|
parentParameterName === "headers" ||
|
|||
|
(typeof parentValue === "object" && parentValue !== null);
|
|||
|
}
|
|||
|
|
|||
|
const values = parentParameterIsArray
|
|||
|
? (get(options, parentParameterName) || []).map(
|
|||
|
value => value[parameterName.split(/\./).pop()]
|
|||
|
)
|
|||
|
: [get(options, parameterName)];
|
|||
|
|
|||
|
values.forEach((value, i) => {
|
|||
|
const valueIsPresent = typeof value !== "undefined";
|
|||
|
const valueIsNull = value === null;
|
|||
|
const currentParameterName = parentParameterIsArray
|
|||
|
? parameterName.replace(/\[\]/, `[${i}]`)
|
|||
|
: parameterName;
|
|||
|
|
|||
|
if (!parameter.required && !valueIsPresent) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// if the parent parameter is of type object but allows null
|
|||
|
// then the child parameters can be ignored
|
|||
|
if (!parentParamIsPresent) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (parameter.allowNull && valueIsNull) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (!parameter.allowNull && valueIsNull) {
|
|||
|
throw new RequestError(
|
|||
|
`'${currentParameterName}' cannot be null`,
|
|||
|
400,
|
|||
|
{
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
if (parameter.required && !valueIsPresent) {
|
|||
|
throw new RequestError(
|
|||
|
`Empty value for parameter '${currentParameterName}': ${JSON.stringify(
|
|||
|
value
|
|||
|
)}`,
|
|||
|
400,
|
|||
|
{
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
// parse to integer before checking for enum
|
|||
|
// so that string "1" will match enum with number 1
|
|||
|
if (expectedType === "integer") {
|
|||
|
const unparsedValue = value;
|
|||
|
value = parseInt(value, 10);
|
|||
|
if (isNaN(value)) {
|
|||
|
throw new RequestError(
|
|||
|
`Invalid value for parameter '${currentParameterName}': ${JSON.stringify(
|
|||
|
unparsedValue
|
|||
|
)} is NaN`,
|
|||
|
400,
|
|||
|
{
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (parameter.enum && parameter.enum.indexOf(String(value)) === -1) {
|
|||
|
throw new RequestError(
|
|||
|
`Invalid value for parameter '${currentParameterName}': ${JSON.stringify(
|
|||
|
value
|
|||
|
)}`,
|
|||
|
400,
|
|||
|
{
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
if (parameter.validation) {
|
|||
|
const regex = new RegExp(parameter.validation);
|
|||
|
if (!regex.test(value)) {
|
|||
|
throw new RequestError(
|
|||
|
`Invalid value for parameter '${currentParameterName}': ${JSON.stringify(
|
|||
|
value
|
|||
|
)}`,
|
|||
|
400,
|
|||
|
{
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (expectedType === "object" && typeof value === "string") {
|
|||
|
try {
|
|||
|
value = JSON.parse(value);
|
|||
|
} catch (exception) {
|
|||
|
throw new RequestError(
|
|||
|
`JSON parse error of value for parameter '${currentParameterName}': ${JSON.stringify(
|
|||
|
value
|
|||
|
)}`,
|
|||
|
400,
|
|||
|
{
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
set(options, parameter.mapTo || currentParameterName, value);
|
|||
|
});
|
|||
|
});
|
|||
|
|
|||
|
return options;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 349:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = authenticationRequestError;
|
|||
|
|
|||
|
const { RequestError } = __webpack_require__(463);
|
|||
|
|
|||
|
function authenticationRequestError(state, error, options) {
|
|||
|
/* istanbul ignore next */
|
|||
|
if (!error.headers) throw error;
|
|||
|
|
|||
|
const otpRequired = /required/.test(error.headers["x-github-otp"] || "");
|
|||
|
// handle "2FA required" error only
|
|||
|
if (error.status !== 401 || !otpRequired) {
|
|||
|
throw error;
|
|||
|
}
|
|||
|
|
|||
|
if (
|
|||
|
error.status === 401 &&
|
|||
|
otpRequired &&
|
|||
|
error.request &&
|
|||
|
error.request.headers["x-github-otp"]
|
|||
|
) {
|
|||
|
throw new RequestError(
|
|||
|
"Invalid one-time password for two-factor authentication",
|
|||
|
401,
|
|||
|
{
|
|||
|
headers: error.headers,
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
if (typeof state.auth.on2fa !== "function") {
|
|||
|
throw new RequestError(
|
|||
|
"2FA required, but options.on2fa is not a function. See https://github.com/octokit/rest.js#authentication",
|
|||
|
401,
|
|||
|
{
|
|||
|
headers: error.headers,
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
return Promise.resolve()
|
|||
|
.then(() => {
|
|||
|
return state.auth.on2fa();
|
|||
|
})
|
|||
|
.then(oneTimePassword => {
|
|||
|
const newOptions = Object.assign(options, {
|
|||
|
headers: Object.assign(
|
|||
|
{ "x-github-otp": oneTimePassword },
|
|||
|
options.headers
|
|||
|
)
|
|||
|
});
|
|||
|
return state.octokit.request(newOptions);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 357:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("assert");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 363:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = register
|
|||
|
|
|||
|
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(function (callback, name) {
|
|||
|
return register.bind(null, state, name, callback, options)
|
|||
|
}, method)()
|
|||
|
}
|
|||
|
|
|||
|
return Promise.resolve()
|
|||
|
.then(function () {
|
|||
|
if (!state.registry[name]) {
|
|||
|
return method(options)
|
|||
|
}
|
|||
|
|
|||
|
return (state.registry[name]).reduce(function (method, registered) {
|
|||
|
return registered.hook.bind(null, method, options)
|
|||
|
}, method)()
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 368:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = function atob(str) {
|
|||
|
return Buffer.from(str, 'base64').toString('binary')
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 370:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = deprecate
|
|||
|
|
|||
|
const loggedMessages = {}
|
|||
|
|
|||
|
function deprecate (message) {
|
|||
|
if (loggedMessages[message]) {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
console.warn(`DEPRECATED (@octokit/rest): ${message}`)
|
|||
|
loggedMessages[message] = 1
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 372:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = octokitDebug;
|
|||
|
|
|||
|
function octokitDebug(octokit) {
|
|||
|
octokit.hook.wrap("request", (request, options) => {
|
|||
|
octokit.log.debug("request", options);
|
|||
|
const start = Date.now();
|
|||
|
const requestOptions = octokit.request.endpoint.parse(options);
|
|||
|
const path = requestOptions.url.replace(options.baseUrl, "");
|
|||
|
|
|||
|
return request(options)
|
|||
|
.then(response => {
|
|||
|
octokit.log.info(
|
|||
|
`${requestOptions.method} ${path} - ${
|
|||
|
response.status
|
|||
|
} in ${Date.now() - start}ms`
|
|||
|
);
|
|||
|
return response;
|
|||
|
})
|
|||
|
|
|||
|
.catch(error => {
|
|||
|
octokit.log.info(
|
|||
|
`${requestOptions.method} ${path} - ${error.status} in ${Date.now() -
|
|||
|
start}ms`
|
|||
|
);
|
|||
|
throw error;
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 385:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
|||
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|||
|
|
|||
|
var isPlainObject = _interopDefault(__webpack_require__(696));
|
|||
|
var universalUserAgent = __webpack_require__(562);
|
|||
|
|
|||
|
function lowercaseKeys(object) {
|
|||
|
if (!object) {
|
|||
|
return {};
|
|||
|
}
|
|||
|
|
|||
|
return Object.keys(object).reduce((newObj, key) => {
|
|||
|
newObj[key.toLowerCase()] = object[key];
|
|||
|
return newObj;
|
|||
|
}, {});
|
|||
|
}
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
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);
|
|||
|
} // lowercase header names before merging with defaults to avoid duplicates
|
|||
|
|
|||
|
|
|||
|
options.headers = lowercaseKeys(options.headers);
|
|||
|
const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten
|
|||
|
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
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("&");
|
|||
|
}
|
|||
|
|
|||
|
const urlVariableRegex = /\{[^}]+\}/g;
|
|||
|
|
|||
|
function removeNonChars(variableName) {
|
|||
|
return variableName.replace(/^\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), []);
|
|||
|
}
|
|||
|
|
|||
|
function omit(object, keysToOmit) {
|
|||
|
return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => {
|
|||
|
obj[key] = object[key];
|
|||
|
return obj;
|
|||
|
}, {});
|
|||
|
}
|
|||
|
|
|||
|
// Based on https://github.com/bramstein/url-template, licensed under BSD
|
|||
|
// TODO: create separate package.
|
|||
|
//
|
|||
|
// Copyright (c) 2012-2014, Bram Stein
|
|||
|
// All rights reserved.
|
|||
|
// Redistribution and use in source and binary forms, with or without
|
|||
|
// modification, are permitted provided that the following conditions
|
|||
|
// are met:
|
|||
|
// 1. Redistributions of source code must retain the above copyright
|
|||
|
// notice, this list of conditions and the following disclaimer.
|
|||
|
// 2. Redistributions in binary form must reproduce the above copyright
|
|||
|
// notice, this list of conditions and the following disclaimer in the
|
|||
|
// documentation and/or other materials provided with the distribution.
|
|||
|
// 3. The name of the author may not be used to endorse or promote products
|
|||
|
// derived from this software without specific prior written permission.
|
|||
|
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
|
|||
|
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|||
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|||
|
// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|||
|
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|||
|
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|||
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|||
|
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|||
|
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|||
|
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|
|||
|
/* istanbul ignore file */
|
|||
|
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 !== undefined && 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 (value) {
|
|||
|
result.push(encodeValue(operator, value, 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 (value) {
|
|||
|
tmp.push(encodeValue(operator, value));
|
|||
|
});
|
|||
|
} 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 = ["+", "#", ".", "/", ";", "?", "&"];
|
|||
|
return 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);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function parse(options) {
|
|||
|
// https://fetch.spec.whatwg.org/#methods
|
|||
|
let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible
|
|||
|
|
|||
|
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"]); // extract variable names from URL to calculate remaining variables later
|
|||
|
|
|||
|
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 isBinaryRequset = /application\/octet-stream/i.test(headers.accept);
|
|||
|
|
|||
|
if (!isBinaryRequset) {
|
|||
|
if (options.mediaType.format) {
|
|||
|
// e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw
|
|||
|
headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(",");
|
|||
|
}
|
|||
|
|
|||
|
if (options.mediaType.previews.length) {
|
|||
|
const previewsFromAcceptHeader = headers.accept.match(/[\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(",");
|
|||
|
}
|
|||
|
} // for GET/HEAD requests, set URL query parameters from remaining parameters
|
|||
|
// for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters
|
|||
|
|
|||
|
|
|||
|
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;
|
|||
|
} else {
|
|||
|
headers["content-length"] = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
} // default content-type for JSON if body is set
|
|||
|
|
|||
|
|
|||
|
if (!headers["content-type"] && typeof body !== "undefined") {
|
|||
|
headers["content-type"] = "application/json; charset=utf-8";
|
|||
|
} // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.
|
|||
|
// fetch does not allow to set `content-length` header, but we can set body to an empty string
|
|||
|
|
|||
|
|
|||
|
if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
|
|||
|
body = "";
|
|||
|
} // Only return body/request keys if present
|
|||
|
|
|||
|
|
|||
|
return Object.assign({
|
|||
|
method,
|
|||
|
url,
|
|||
|
headers
|
|||
|
}, typeof body !== "undefined" ? {
|
|||
|
body
|
|||
|
} : null, options.request ? {
|
|||
|
request: options.request
|
|||
|
} : null);
|
|||
|
}
|
|||
|
|
|||
|
function endpointWithDefaults(defaults, route, options) {
|
|||
|
return parse(merge(defaults, route, options));
|
|||
|
}
|
|||
|
|
|||
|
function withDefaults(oldDefaults, newDefaults) {
|
|||
|
const DEFAULTS = merge(oldDefaults, newDefaults);
|
|||
|
const endpoint = endpointWithDefaults.bind(null, DEFAULTS);
|
|||
|
return Object.assign(endpoint, {
|
|||
|
DEFAULTS,
|
|||
|
defaults: withDefaults.bind(null, DEFAULTS),
|
|||
|
merge: merge.bind(null, DEFAULTS),
|
|||
|
parse
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
const VERSION = "0.0.0-development";
|
|||
|
|
|||
|
const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`;
|
|||
|
const DEFAULTS = {
|
|||
|
method: "GET",
|
|||
|
baseUrl: "https://api.github.com",
|
|||
|
headers: {
|
|||
|
accept: "application/vnd.github.v3+json",
|
|||
|
"user-agent": userAgent
|
|||
|
},
|
|||
|
mediaType: {
|
|||
|
format: "",
|
|||
|
previews: []
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
const endpoint = withDefaults(null, DEFAULTS);
|
|||
|
|
|||
|
exports.endpoint = endpoint;
|
|||
|
//# sourceMappingURL=index.js.map
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 389:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
const fs = __webpack_require__(747);
|
|||
|
const shebangCommand = __webpack_require__(866);
|
|||
|
|
|||
|
function readShebang(command) {
|
|||
|
// Read the first 150 bytes from the file
|
|||
|
const size = 150;
|
|||
|
let buffer;
|
|||
|
|
|||
|
if (Buffer.alloc) {
|
|||
|
// Node.js v4.5+ / v5.10+
|
|||
|
buffer = Buffer.alloc(size);
|
|||
|
} else {
|
|||
|
// Old Node.js API
|
|||
|
buffer = new Buffer(size);
|
|||
|
buffer.fill(0); // zero-fill
|
|||
|
}
|
|||
|
|
|||
|
let fd;
|
|||
|
|
|||
|
try {
|
|||
|
fd = fs.openSync(command, 'r');
|
|||
|
fs.readSync(fd, buffer, 0, size, 0);
|
|||
|
fs.closeSync(fd);
|
|||
|
} catch (e) { /* Empty */ }
|
|||
|
|
|||
|
// Attempt to extract shebang (null is returned if not a shebang)
|
|||
|
return shebangCommand(buffer.toString());
|
|||
|
}
|
|||
|
|
|||
|
module.exports = readShebang;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 402:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = Octokit;
|
|||
|
|
|||
|
const { request } = __webpack_require__(753);
|
|||
|
const Hook = __webpack_require__(523);
|
|||
|
|
|||
|
const parseClientOptions = __webpack_require__(294);
|
|||
|
|
|||
|
function Octokit(plugins, options) {
|
|||
|
options = options || {};
|
|||
|
const hook = new Hook.Collection();
|
|||
|
const log = Object.assign(
|
|||
|
{
|
|||
|
debug: () => {},
|
|||
|
info: () => {},
|
|||
|
warn: console.warn,
|
|||
|
error: console.error
|
|||
|
},
|
|||
|
options && options.log
|
|||
|
);
|
|||
|
const api = {
|
|||
|
hook,
|
|||
|
log,
|
|||
|
request: request.defaults(parseClientOptions(options, log, hook))
|
|||
|
};
|
|||
|
|
|||
|
plugins.forEach(pluginFunction => pluginFunction(api, options));
|
|||
|
|
|||
|
return api;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 413:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("stream");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 427:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
// Older verions of Node.js might not have `util.getSystemErrorName()`.
|
|||
|
// In that case, fall back to a deprecated internal.
|
|||
|
const util = __webpack_require__(669);
|
|||
|
|
|||
|
let uv;
|
|||
|
|
|||
|
if (typeof util.getSystemErrorName === 'function') {
|
|||
|
module.exports = util.getSystemErrorName;
|
|||
|
} else {
|
|||
|
try {
|
|||
|
uv = process.binding('uv');
|
|||
|
|
|||
|
if (typeof uv.errname !== 'function') {
|
|||
|
throw new TypeError('uv.errname is not a function');
|
|||
|
}
|
|||
|
} catch (err) {
|
|||
|
console.error('execa/lib/errname: unable to establish process.binding(\'uv\')', err);
|
|||
|
uv = null;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = code => errname(uv, code);
|
|||
|
}
|
|||
|
|
|||
|
// Used for testing the fallback behavior
|
|||
|
module.exports.__test__ = errname;
|
|||
|
|
|||
|
function errname(uv, code) {
|
|||
|
if (uv) {
|
|||
|
return uv.errname(code);
|
|||
|
}
|
|||
|
|
|||
|
if (!(code < 0)) {
|
|||
|
throw new Error('err >= 0');
|
|||
|
}
|
|||
|
|
|||
|
return `Unknown system error ${code}`;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 430:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = octokitValidate;
|
|||
|
|
|||
|
const validate = __webpack_require__(348);
|
|||
|
|
|||
|
function octokitValidate(octokit) {
|
|||
|
octokit.hook.before("request", validate.bind(null, octokit));
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 431:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const os = __webpack_require__(87);
|
|||
|
/**
|
|||
|
* Commands
|
|||
|
*
|
|||
|
* Command Format:
|
|||
|
* ##[name key=value;key=value]message
|
|||
|
*
|
|||
|
* Examples:
|
|||
|
* ##[warning]This is the user warning message
|
|||
|
* ##[set-secret name=mypassword]definitelyNotAPassword!
|
|||
|
*/
|
|||
|
function issueCommand(command, properties, message) {
|
|||
|
const cmd = new Command(command, properties, message);
|
|||
|
process.stdout.write(cmd.toString() + os.EOL);
|
|||
|
}
|
|||
|
exports.issueCommand = issueCommand;
|
|||
|
function issue(name, message = '') {
|
|||
|
issueCommand(name, {}, message);
|
|||
|
}
|
|||
|
exports.issue = issue;
|
|||
|
const CMD_STRING = '::';
|
|||
|
class Command {
|
|||
|
constructor(command, properties, message) {
|
|||
|
if (!command) {
|
|||
|
command = 'missing.command';
|
|||
|
}
|
|||
|
this.command = command;
|
|||
|
this.properties = properties;
|
|||
|
this.message = message;
|
|||
|
}
|
|||
|
toString() {
|
|||
|
let cmdStr = CMD_STRING + this.command;
|
|||
|
if (this.properties && Object.keys(this.properties).length > 0) {
|
|||
|
cmdStr += ' ';
|
|||
|
for (const key in this.properties) {
|
|||
|
if (this.properties.hasOwnProperty(key)) {
|
|||
|
const val = this.properties[key];
|
|||
|
if (val) {
|
|||
|
// safely append the val - avoid blowing up when attempting to
|
|||
|
// call .replace() if message is not a string for some reason
|
|||
|
cmdStr += `${key}=${escape(`${val || ''}`)},`;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
cmdStr += CMD_STRING;
|
|||
|
// safely append the message - avoid blowing up when attempting to
|
|||
|
// call .replace() if message is not a string for some reason
|
|||
|
const message = `${this.message || ''}`;
|
|||
|
cmdStr += escapeData(message);
|
|||
|
return cmdStr;
|
|||
|
}
|
|||
|
}
|
|||
|
function escapeData(s) {
|
|||
|
return s.replace(/\r/g, '%0D').replace(/\n/g, '%0A');
|
|||
|
}
|
|||
|
function escape(s) {
|
|||
|
return s
|
|||
|
.replace(/\r/g, '%0D')
|
|||
|
.replace(/\n/g, '%0A')
|
|||
|
.replace(/]/g, '%5D')
|
|||
|
.replace(/;/g, '%3B');
|
|||
|
}
|
|||
|
//# sourceMappingURL=command.js.map
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 453:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
var once = __webpack_require__(969)
|
|||
|
var eos = __webpack_require__(3)
|
|||
|
var fs = __webpack_require__(747) // we only need fs to get the ReadStream and WriteStream prototypes
|
|||
|
|
|||
|
var noop = function () {}
|
|||
|
var ancient = /^v?\.0/.test(process.version)
|
|||
|
|
|||
|
var isFn = function (fn) {
|
|||
|
return typeof fn === 'function'
|
|||
|
}
|
|||
|
|
|||
|
var isFS = function (stream) {
|
|||
|
if (!ancient) return false // newer node version do not need to care about fs is a special way
|
|||
|
if (!fs) return false // browser
|
|||
|
return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)
|
|||
|
}
|
|||
|
|
|||
|
var isRequest = function (stream) {
|
|||
|
return stream.setHeader && isFn(stream.abort)
|
|||
|
}
|
|||
|
|
|||
|
var destroyer = function (stream, reading, writing, callback) {
|
|||
|
callback = once(callback)
|
|||
|
|
|||
|
var closed = false
|
|||
|
stream.on('close', function () {
|
|||
|
closed = true
|
|||
|
})
|
|||
|
|
|||
|
eos(stream, {readable: reading, writable: writing}, function (err) {
|
|||
|
if (err) return callback(err)
|
|||
|
closed = true
|
|||
|
callback()
|
|||
|
})
|
|||
|
|
|||
|
var destroyed = false
|
|||
|
return function (err) {
|
|||
|
if (closed) return
|
|||
|
if (destroyed) return
|
|||
|
destroyed = true
|
|||
|
|
|||
|
if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks
|
|||
|
if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want
|
|||
|
|
|||
|
if (isFn(stream.destroy)) return stream.destroy()
|
|||
|
|
|||
|
callback(err || new Error('stream was destroyed'))
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var call = function (fn) {
|
|||
|
fn()
|
|||
|
}
|
|||
|
|
|||
|
var pipe = function (from, to) {
|
|||
|
return from.pipe(to)
|
|||
|
}
|
|||
|
|
|||
|
var pump = function () {
|
|||
|
var streams = Array.prototype.slice.call(arguments)
|
|||
|
var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop
|
|||
|
|
|||
|
if (Array.isArray(streams[0])) streams = streams[0]
|
|||
|
if (streams.length < 2) throw new Error('pump requires two streams per minimum')
|
|||
|
|
|||
|
var error
|
|||
|
var destroys = streams.map(function (stream, i) {
|
|||
|
var reading = i < streams.length - 1
|
|||
|
var writing = i > 0
|
|||
|
return destroyer(stream, reading, writing, function (err) {
|
|||
|
if (!error) error = err
|
|||
|
if (err) destroys.forEach(call)
|
|||
|
if (reading) return
|
|||
|
destroys.forEach(call)
|
|||
|
callback(error)
|
|||
|
})
|
|||
|
})
|
|||
|
|
|||
|
return streams.reduce(pipe)
|
|||
|
}
|
|||
|
|
|||
|
module.exports = pump
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 454:
|
|||
|
/***/ (function(module, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
|||
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|||
|
|
|||
|
var Stream = _interopDefault(__webpack_require__(413));
|
|||
|
var http = _interopDefault(__webpack_require__(605));
|
|||
|
var Url = _interopDefault(__webpack_require__(835));
|
|||
|
var https = _interopDefault(__webpack_require__(34));
|
|||
|
var zlib = _interopDefault(__webpack_require__(761));
|
|||
|
|
|||
|
// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
|
|||
|
|
|||
|
// fix for "Readable" isn't a named export issue
|
|||
|
const Readable = Stream.Readable;
|
|||
|
|
|||
|
const BUFFER = Symbol('buffer');
|
|||
|
const TYPE = Symbol('type');
|
|||
|
|
|||
|
class Blob {
|
|||
|
constructor() {
|
|||
|
this[TYPE] = '';
|
|||
|
|
|||
|
const blobParts = arguments[0];
|
|||
|
const options = arguments[1];
|
|||
|
|
|||
|
const buffers = [];
|
|||
|
let size = 0;
|
|||
|
|
|||
|
if (blobParts) {
|
|||
|
const a = blobParts;
|
|||
|
const length = Number(a.length);
|
|||
|
for (let i = 0; i < length; i++) {
|
|||
|
const element = a[i];
|
|||
|
let buffer;
|
|||
|
if (element instanceof Buffer) {
|
|||
|
buffer = element;
|
|||
|
} else if (ArrayBuffer.isView(element)) {
|
|||
|
buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
|
|||
|
} else if (element instanceof ArrayBuffer) {
|
|||
|
buffer = Buffer.from(element);
|
|||
|
} else if (element instanceof Blob) {
|
|||
|
buffer = element[BUFFER];
|
|||
|
} else {
|
|||
|
buffer = Buffer.from(typeof element === 'string' ? element : String(element));
|
|||
|
}
|
|||
|
size += buffer.length;
|
|||
|
buffers.push(buffer);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
this[BUFFER] = Buffer.concat(buffers);
|
|||
|
|
|||
|
let type = options && options.type !== undefined && String(options.type).toLowerCase();
|
|||
|
if (type && !/[^\u0020-\u007E]/.test(type)) {
|
|||
|
this[TYPE] = type;
|
|||
|
}
|
|||
|
}
|
|||
|
get size() {
|
|||
|
return this[BUFFER].length;
|
|||
|
}
|
|||
|
get type() {
|
|||
|
return this[TYPE];
|
|||
|
}
|
|||
|
text() {
|
|||
|
return Promise.resolve(this[BUFFER].toString());
|
|||
|
}
|
|||
|
arrayBuffer() {
|
|||
|
const buf = this[BUFFER];
|
|||
|
const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|||
|
return Promise.resolve(ab);
|
|||
|
}
|
|||
|
stream() {
|
|||
|
const readable = new Readable();
|
|||
|
readable._read = function () {};
|
|||
|
readable.push(this[BUFFER]);
|
|||
|
readable.push(null);
|
|||
|
return readable;
|
|||
|
}
|
|||
|
toString() {
|
|||
|
return '[object Blob]';
|
|||
|
}
|
|||
|
slice() {
|
|||
|
const size = this.size;
|
|||
|
|
|||
|
const start = arguments[0];
|
|||
|
const end = arguments[1];
|
|||
|
let relativeStart, relativeEnd;
|
|||
|
if (start === undefined) {
|
|||
|
relativeStart = 0;
|
|||
|
} else if (start < 0) {
|
|||
|
relativeStart = Math.max(size + start, 0);
|
|||
|
} else {
|
|||
|
relativeStart = Math.min(start, size);
|
|||
|
}
|
|||
|
if (end === undefined) {
|
|||
|
relativeEnd = size;
|
|||
|
} else if (end < 0) {
|
|||
|
relativeEnd = Math.max(size + end, 0);
|
|||
|
} else {
|
|||
|
relativeEnd = Math.min(end, size);
|
|||
|
}
|
|||
|
const span = Math.max(relativeEnd - relativeStart, 0);
|
|||
|
|
|||
|
const buffer = this[BUFFER];
|
|||
|
const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
|
|||
|
const blob = new Blob([], { type: arguments[2] });
|
|||
|
blob[BUFFER] = slicedBuffer;
|
|||
|
return blob;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Object.defineProperties(Blob.prototype, {
|
|||
|
size: { enumerable: true },
|
|||
|
type: { enumerable: true },
|
|||
|
slice: { enumerable: true }
|
|||
|
});
|
|||
|
|
|||
|
Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
|
|||
|
value: 'Blob',
|
|||
|
writable: false,
|
|||
|
enumerable: false,
|
|||
|
configurable: true
|
|||
|
});
|
|||
|
|
|||
|
/**
|
|||
|
* fetch-error.js
|
|||
|
*
|
|||
|
* FetchError interface for operational errors
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Create FetchError instance
|
|||
|
*
|
|||
|
* @param String message Error message for human
|
|||
|
* @param String type Error type for machine
|
|||
|
* @param String systemError For Node.js system error
|
|||
|
* @return FetchError
|
|||
|
*/
|
|||
|
function FetchError(message, type, systemError) {
|
|||
|
Error.call(this, message);
|
|||
|
|
|||
|
this.message = message;
|
|||
|
this.type = type;
|
|||
|
|
|||
|
// when err.type is `system`, err.code contains system error code
|
|||
|
if (systemError) {
|
|||
|
this.code = this.errno = systemError.code;
|
|||
|
}
|
|||
|
|
|||
|
// hide custom error implementation details from end-users
|
|||
|
Error.captureStackTrace(this, this.constructor);
|
|||
|
}
|
|||
|
|
|||
|
FetchError.prototype = Object.create(Error.prototype);
|
|||
|
FetchError.prototype.constructor = FetchError;
|
|||
|
FetchError.prototype.name = 'FetchError';
|
|||
|
|
|||
|
let convert;
|
|||
|
try {
|
|||
|
convert = __webpack_require__(18).convert;
|
|||
|
} catch (e) {}
|
|||
|
|
|||
|
const INTERNALS = Symbol('Body internals');
|
|||
|
|
|||
|
// fix an issue where "PassThrough" isn't a named export for node <10
|
|||
|
const PassThrough = Stream.PassThrough;
|
|||
|
|
|||
|
/**
|
|||
|
* Body mixin
|
|||
|
*
|
|||
|
* Ref: https://fetch.spec.whatwg.org/#body
|
|||
|
*
|
|||
|
* @param Stream body Readable stream
|
|||
|
* @param Object opts Response options
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
function Body(body) {
|
|||
|
var _this = this;
|
|||
|
|
|||
|
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|||
|
_ref$size = _ref.size;
|
|||
|
|
|||
|
let size = _ref$size === undefined ? 0 : _ref$size;
|
|||
|
var _ref$timeout = _ref.timeout;
|
|||
|
let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;
|
|||
|
|
|||
|
if (body == null) {
|
|||
|
// body is undefined or null
|
|||
|
body = null;
|
|||
|
} else if (isURLSearchParams(body)) {
|
|||
|
// body is a URLSearchParams
|
|||
|
body = Buffer.from(body.toString());
|
|||
|
} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
|
|||
|
// body is ArrayBuffer
|
|||
|
body = Buffer.from(body);
|
|||
|
} else if (ArrayBuffer.isView(body)) {
|
|||
|
// body is ArrayBufferView
|
|||
|
body = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
|
|||
|
} else if (body instanceof Stream) ; else {
|
|||
|
// none of the above
|
|||
|
// coerce to string then buffer
|
|||
|
body = Buffer.from(String(body));
|
|||
|
}
|
|||
|
this[INTERNALS] = {
|
|||
|
body,
|
|||
|
disturbed: false,
|
|||
|
error: null
|
|||
|
};
|
|||
|
this.size = size;
|
|||
|
this.timeout = timeout;
|
|||
|
|
|||
|
if (body instanceof Stream) {
|
|||
|
body.on('error', function (err) {
|
|||
|
const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
|
|||
|
_this[INTERNALS].error = error;
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Body.prototype = {
|
|||
|
get body() {
|
|||
|
return this[INTERNALS].body;
|
|||
|
},
|
|||
|
|
|||
|
get bodyUsed() {
|
|||
|
return this[INTERNALS].disturbed;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Decode response as ArrayBuffer
|
|||
|
*
|
|||
|
* @return Promise
|
|||
|
*/
|
|||
|
arrayBuffer() {
|
|||
|
return consumeBody.call(this).then(function (buf) {
|
|||
|
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Return raw response as Blob
|
|||
|
*
|
|||
|
* @return Promise
|
|||
|
*/
|
|||
|
blob() {
|
|||
|
let ct = this.headers && this.headers.get('content-type') || '';
|
|||
|
return consumeBody.call(this).then(function (buf) {
|
|||
|
return Object.assign(
|
|||
|
// Prevent copying
|
|||
|
new Blob([], {
|
|||
|
type: ct.toLowerCase()
|
|||
|
}), {
|
|||
|
[BUFFER]: buf
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Decode response as json
|
|||
|
*
|
|||
|
* @return Promise
|
|||
|
*/
|
|||
|
json() {
|
|||
|
var _this2 = this;
|
|||
|
|
|||
|
return consumeBody.call(this).then(function (buffer) {
|
|||
|
try {
|
|||
|
return JSON.parse(buffer.toString());
|
|||
|
} catch (err) {
|
|||
|
return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Decode response as text
|
|||
|
*
|
|||
|
* @return Promise
|
|||
|
*/
|
|||
|
text() {
|
|||
|
return consumeBody.call(this).then(function (buffer) {
|
|||
|
return buffer.toString();
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Decode response as buffer (non-spec api)
|
|||
|
*
|
|||
|
* @return Promise
|
|||
|
*/
|
|||
|
buffer() {
|
|||
|
return consumeBody.call(this);
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Decode response as text, while automatically detecting the encoding and
|
|||
|
* trying to decode to UTF-8 (non-spec api)
|
|||
|
*
|
|||
|
* @return Promise
|
|||
|
*/
|
|||
|
textConverted() {
|
|||
|
var _this3 = this;
|
|||
|
|
|||
|
return consumeBody.call(this).then(function (buffer) {
|
|||
|
return convertBody(buffer, _this3.headers);
|
|||
|
});
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// In browsers, all properties are enumerable.
|
|||
|
Object.defineProperties(Body.prototype, {
|
|||
|
body: { enumerable: true },
|
|||
|
bodyUsed: { enumerable: true },
|
|||
|
arrayBuffer: { enumerable: true },
|
|||
|
blob: { enumerable: true },
|
|||
|
json: { enumerable: true },
|
|||
|
text: { enumerable: true }
|
|||
|
});
|
|||
|
|
|||
|
Body.mixIn = function (proto) {
|
|||
|
for (const name of Object.getOwnPropertyNames(Body.prototype)) {
|
|||
|
// istanbul ignore else: future proof
|
|||
|
if (!(name in proto)) {
|
|||
|
const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
|
|||
|
Object.defineProperty(proto, name, desc);
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
/**
|
|||
|
* Consume and convert an entire Body to a Buffer.
|
|||
|
*
|
|||
|
* Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
|
|||
|
*
|
|||
|
* @return Promise
|
|||
|
*/
|
|||
|
function consumeBody() {
|
|||
|
var _this4 = this;
|
|||
|
|
|||
|
if (this[INTERNALS].disturbed) {
|
|||
|
return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
|
|||
|
}
|
|||
|
|
|||
|
this[INTERNALS].disturbed = true;
|
|||
|
|
|||
|
if (this[INTERNALS].error) {
|
|||
|
return Body.Promise.reject(this[INTERNALS].error);
|
|||
|
}
|
|||
|
|
|||
|
let body = this.body;
|
|||
|
|
|||
|
// body is null
|
|||
|
if (body === null) {
|
|||
|
return Body.Promise.resolve(Buffer.alloc(0));
|
|||
|
}
|
|||
|
|
|||
|
// body is blob
|
|||
|
if (isBlob(body)) {
|
|||
|
body = body.stream();
|
|||
|
}
|
|||
|
|
|||
|
// body is buffer
|
|||
|
if (Buffer.isBuffer(body)) {
|
|||
|
return Body.Promise.resolve(body);
|
|||
|
}
|
|||
|
|
|||
|
// istanbul ignore if: should never happen
|
|||
|
if (!(body instanceof Stream)) {
|
|||
|
return Body.Promise.resolve(Buffer.alloc(0));
|
|||
|
}
|
|||
|
|
|||
|
// body is stream
|
|||
|
// get ready to actually consume the body
|
|||
|
let accum = [];
|
|||
|
let accumBytes = 0;
|
|||
|
let abort = false;
|
|||
|
|
|||
|
return new Body.Promise(function (resolve, reject) {
|
|||
|
let resTimeout;
|
|||
|
|
|||
|
// allow timeout on slow response body
|
|||
|
if (_this4.timeout) {
|
|||
|
resTimeout = setTimeout(function () {
|
|||
|
abort = true;
|
|||
|
reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
|
|||
|
}, _this4.timeout);
|
|||
|
}
|
|||
|
|
|||
|
// handle stream errors
|
|||
|
body.on('error', function (err) {
|
|||
|
if (err.name === 'AbortError') {
|
|||
|
// if the request was aborted, reject with this Error
|
|||
|
abort = true;
|
|||
|
reject(err);
|
|||
|
} else {
|
|||
|
// other errors, such as incorrect content-encoding
|
|||
|
reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
body.on('data', function (chunk) {
|
|||
|
if (abort || chunk === null) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (_this4.size && accumBytes + chunk.length > _this4.size) {
|
|||
|
abort = true;
|
|||
|
reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
accumBytes += chunk.length;
|
|||
|
accum.push(chunk);
|
|||
|
});
|
|||
|
|
|||
|
body.on('end', function () {
|
|||
|
if (abort) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
clearTimeout(resTimeout);
|
|||
|
|
|||
|
try {
|
|||
|
resolve(Buffer.concat(accum, accumBytes));
|
|||
|
} catch (err) {
|
|||
|
// handle streams that have accumulated too much data (issue #414)
|
|||
|
reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Detect buffer encoding and convert to target encoding
|
|||
|
* ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
|
|||
|
*
|
|||
|
* @param Buffer buffer Incoming buffer
|
|||
|
* @param String encoding Target encoding
|
|||
|
* @return String
|
|||
|
*/
|
|||
|
function convertBody(buffer, headers) {
|
|||
|
if (typeof convert !== 'function') {
|
|||
|
throw new Error('The package `encoding` must be installed to use the textConverted() function');
|
|||
|
}
|
|||
|
|
|||
|
const ct = headers.get('content-type');
|
|||
|
let charset = 'utf-8';
|
|||
|
let res, str;
|
|||
|
|
|||
|
// header
|
|||
|
if (ct) {
|
|||
|
res = /charset=([^;]*)/i.exec(ct);
|
|||
|
}
|
|||
|
|
|||
|
// no charset in content type, peek at response body for at most 1024 bytes
|
|||
|
str = buffer.slice(0, 1024).toString();
|
|||
|
|
|||
|
// html5
|
|||
|
if (!res && str) {
|
|||
|
res = /<meta.+?charset=(['"])(.+?)\1/i.exec(str);
|
|||
|
}
|
|||
|
|
|||
|
// html4
|
|||
|
if (!res && str) {
|
|||
|
res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str);
|
|||
|
|
|||
|
if (res) {
|
|||
|
res = /charset=(.*)/i.exec(res.pop());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// xml
|
|||
|
if (!res && str) {
|
|||
|
res = /<\?xml.+?encoding=(['"])(.+?)\1/i.exec(str);
|
|||
|
}
|
|||
|
|
|||
|
// found charset
|
|||
|
if (res) {
|
|||
|
charset = res.pop();
|
|||
|
|
|||
|
// prevent decode issues when sites use incorrect encoding
|
|||
|
// ref: https://hsivonen.fi/encoding-menu/
|
|||
|
if (charset === 'gb2312' || charset === 'gbk') {
|
|||
|
charset = 'gb18030';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// turn raw buffers into a single utf-8 buffer
|
|||
|
return convert(buffer, 'UTF-8', charset).toString();
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Detect a URLSearchParams object
|
|||
|
* ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143
|
|||
|
*
|
|||
|
* @param Object obj Object to detect by type or brand
|
|||
|
* @return String
|
|||
|
*/
|
|||
|
function isURLSearchParams(obj) {
|
|||
|
// Duck-typing as a necessary condition.
|
|||
|
if (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// Brand-checking and more duck-typing as optional condition.
|
|||
|
return obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Check if `obj` is a W3C `Blob` object (which `File` inherits from)
|
|||
|
* @param {*} obj
|
|||
|
* @return {boolean}
|
|||
|
*/
|
|||
|
function isBlob(obj) {
|
|||
|
return typeof obj === 'object' && typeof obj.arrayBuffer === 'function' && typeof obj.type === 'string' && typeof obj.stream === 'function' && typeof obj.constructor === 'function' && typeof obj.constructor.name === 'string' && /^(Blob|File)$/.test(obj.constructor.name) && /^(Blob|File)$/.test(obj[Symbol.toStringTag]);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Clone body given Res/Req instance
|
|||
|
*
|
|||
|
* @param Mixed instance Response or Request instance
|
|||
|
* @return Mixed
|
|||
|
*/
|
|||
|
function clone(instance) {
|
|||
|
let p1, p2;
|
|||
|
let body = instance.body;
|
|||
|
|
|||
|
// don't allow cloning a used body
|
|||
|
if (instance.bodyUsed) {
|
|||
|
throw new Error('cannot clone body after it is used');
|
|||
|
}
|
|||
|
|
|||
|
// check that body is a stream and not form-data object
|
|||
|
// note: we can't clone the form-data object without having it as a dependency
|
|||
|
if (body instanceof Stream && typeof body.getBoundary !== 'function') {
|
|||
|
// tee instance body
|
|||
|
p1 = new PassThrough();
|
|||
|
p2 = new PassThrough();
|
|||
|
body.pipe(p1);
|
|||
|
body.pipe(p2);
|
|||
|
// set instance body to teed body and return the other teed body
|
|||
|
instance[INTERNALS].body = p1;
|
|||
|
body = p2;
|
|||
|
}
|
|||
|
|
|||
|
return body;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Performs the operation "extract a `Content-Type` value from |object|" as
|
|||
|
* specified in the specification:
|
|||
|
* https://fetch.spec.whatwg.org/#concept-bodyinit-extract
|
|||
|
*
|
|||
|
* This function assumes that instance.body is present.
|
|||
|
*
|
|||
|
* @param Mixed instance Any options.body input
|
|||
|
*/
|
|||
|
function extractContentType(body) {
|
|||
|
if (body === null) {
|
|||
|
// body is null
|
|||
|
return null;
|
|||
|
} else if (typeof body === 'string') {
|
|||
|
// body is string
|
|||
|
return 'text/plain;charset=UTF-8';
|
|||
|
} else if (isURLSearchParams(body)) {
|
|||
|
// body is a URLSearchParams
|
|||
|
return 'application/x-www-form-urlencoded;charset=UTF-8';
|
|||
|
} else if (isBlob(body)) {
|
|||
|
// body is blob
|
|||
|
return body.type || null;
|
|||
|
} else if (Buffer.isBuffer(body)) {
|
|||
|
// body is buffer
|
|||
|
return null;
|
|||
|
} else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
|
|||
|
// body is ArrayBuffer
|
|||
|
return null;
|
|||
|
} else if (ArrayBuffer.isView(body)) {
|
|||
|
// body is ArrayBufferView
|
|||
|
return null;
|
|||
|
} else if (typeof body.getBoundary === 'function') {
|
|||
|
// detect form data input from form-data module
|
|||
|
return `multipart/form-data;boundary=${body.getBoundary()}`;
|
|||
|
} else if (body instanceof Stream) {
|
|||
|
// body is stream
|
|||
|
// can't really do much about this
|
|||
|
return null;
|
|||
|
} else {
|
|||
|
// Body constructor defaults other things to string
|
|||
|
return 'text/plain;charset=UTF-8';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The Fetch Standard treats this as if "total bytes" is a property on the body.
|
|||
|
* For us, we have to explicitly get it with a function.
|
|||
|
*
|
|||
|
* ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes
|
|||
|
*
|
|||
|
* @param Body instance Instance of Body
|
|||
|
* @return Number? Number of bytes, or null if not possible
|
|||
|
*/
|
|||
|
function getTotalBytes(instance) {
|
|||
|
const body = instance.body;
|
|||
|
|
|||
|
|
|||
|
if (body === null) {
|
|||
|
// body is null
|
|||
|
return 0;
|
|||
|
} else if (isBlob(body)) {
|
|||
|
return body.size;
|
|||
|
} else if (Buffer.isBuffer(body)) {
|
|||
|
// body is buffer
|
|||
|
return body.length;
|
|||
|
} else if (body && typeof body.getLengthSync === 'function') {
|
|||
|
// detect form data input from form-data module
|
|||
|
if (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x
|
|||
|
body.hasKnownLength && body.hasKnownLength()) {
|
|||
|
// 2.x
|
|||
|
return body.getLengthSync();
|
|||
|
}
|
|||
|
return null;
|
|||
|
} else {
|
|||
|
// body is stream
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Write a Body to a Node.js WritableStream (e.g. http.Request) object.
|
|||
|
*
|
|||
|
* @param Body instance Instance of Body
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
function writeToStream(dest, instance) {
|
|||
|
const body = instance.body;
|
|||
|
|
|||
|
|
|||
|
if (body === null) {
|
|||
|
// body is null
|
|||
|
dest.end();
|
|||
|
} else if (isBlob(body)) {
|
|||
|
body.stream().pipe(dest);
|
|||
|
} else if (Buffer.isBuffer(body)) {
|
|||
|
// body is buffer
|
|||
|
dest.write(body);
|
|||
|
dest.end();
|
|||
|
} else {
|
|||
|
// body is stream
|
|||
|
body.pipe(dest);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// expose Promise
|
|||
|
Body.Promise = global.Promise;
|
|||
|
|
|||
|
/**
|
|||
|
* headers.js
|
|||
|
*
|
|||
|
* Headers class offers convenient helpers
|
|||
|
*/
|
|||
|
|
|||
|
const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/;
|
|||
|
const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/;
|
|||
|
|
|||
|
function validateName(name) {
|
|||
|
name = `${name}`;
|
|||
|
if (invalidTokenRegex.test(name) || name === '') {
|
|||
|
throw new TypeError(`${name} is not a legal HTTP header name`);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function validateValue(value) {
|
|||
|
value = `${value}`;
|
|||
|
if (invalidHeaderCharRegex.test(value)) {
|
|||
|
throw new TypeError(`${value} is not a legal HTTP header value`);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Find the key in the map object given a header name.
|
|||
|
*
|
|||
|
* Returns undefined if not found.
|
|||
|
*
|
|||
|
* @param String name Header name
|
|||
|
* @return String|Undefined
|
|||
|
*/
|
|||
|
function find(map, name) {
|
|||
|
name = name.toLowerCase();
|
|||
|
for (const key in map) {
|
|||
|
if (key.toLowerCase() === name) {
|
|||
|
return key;
|
|||
|
}
|
|||
|
}
|
|||
|
return undefined;
|
|||
|
}
|
|||
|
|
|||
|
const MAP = Symbol('map');
|
|||
|
class Headers {
|
|||
|
/**
|
|||
|
* Headers class
|
|||
|
*
|
|||
|
* @param Object headers Response headers
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
constructor() {
|
|||
|
let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
|
|||
|
|
|||
|
this[MAP] = Object.create(null);
|
|||
|
|
|||
|
if (init instanceof Headers) {
|
|||
|
const rawHeaders = init.raw();
|
|||
|
const headerNames = Object.keys(rawHeaders);
|
|||
|
|
|||
|
for (const headerName of headerNames) {
|
|||
|
for (const value of rawHeaders[headerName]) {
|
|||
|
this.append(headerName, value);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// We don't worry about converting prop to ByteString here as append()
|
|||
|
// will handle it.
|
|||
|
if (init == null) ; else if (typeof init === 'object') {
|
|||
|
const method = init[Symbol.iterator];
|
|||
|
if (method != null) {
|
|||
|
if (typeof method !== 'function') {
|
|||
|
throw new TypeError('Header pairs must be iterable');
|
|||
|
}
|
|||
|
|
|||
|
// sequence<sequence<ByteString>>
|
|||
|
// Note: per spec we have to first exhaust the lists then process them
|
|||
|
const pairs = [];
|
|||
|
for (const pair of init) {
|
|||
|
if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
|
|||
|
throw new TypeError('Each header pair must be iterable');
|
|||
|
}
|
|||
|
pairs.push(Array.from(pair));
|
|||
|
}
|
|||
|
|
|||
|
for (const pair of pairs) {
|
|||
|
if (pair.length !== 2) {
|
|||
|
throw new TypeError('Each header pair must be a name/value tuple');
|
|||
|
}
|
|||
|
this.append(pair[0], pair[1]);
|
|||
|
}
|
|||
|
} else {
|
|||
|
// record<ByteString, ByteString>
|
|||
|
for (const key of Object.keys(init)) {
|
|||
|
const value = init[key];
|
|||
|
this.append(key, value);
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
throw new TypeError('Provided initializer must be an object');
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Return combined header value given name
|
|||
|
*
|
|||
|
* @param String name Header name
|
|||
|
* @return Mixed
|
|||
|
*/
|
|||
|
get(name) {
|
|||
|
name = `${name}`;
|
|||
|
validateName(name);
|
|||
|
const key = find(this[MAP], name);
|
|||
|
if (key === undefined) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
return this[MAP][key].join(', ');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Iterate over all headers
|
|||
|
*
|
|||
|
* @param Function callback Executed for each item with parameters (value, name, thisArg)
|
|||
|
* @param Boolean thisArg `this` context for callback function
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
forEach(callback) {
|
|||
|
let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
|
|||
|
|
|||
|
let pairs = getHeaders(this);
|
|||
|
let i = 0;
|
|||
|
while (i < pairs.length) {
|
|||
|
var _pairs$i = pairs[i];
|
|||
|
const name = _pairs$i[0],
|
|||
|
value = _pairs$i[1];
|
|||
|
|
|||
|
callback.call(thisArg, value, name, this);
|
|||
|
pairs = getHeaders(this);
|
|||
|
i++;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Overwrite header values given name
|
|||
|
*
|
|||
|
* @param String name Header name
|
|||
|
* @param String value Header value
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
set(name, value) {
|
|||
|
name = `${name}`;
|
|||
|
value = `${value}`;
|
|||
|
validateName(name);
|
|||
|
validateValue(value);
|
|||
|
const key = find(this[MAP], name);
|
|||
|
this[MAP][key !== undefined ? key : name] = [value];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Append a value onto existing header
|
|||
|
*
|
|||
|
* @param String name Header name
|
|||
|
* @param String value Header value
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
append(name, value) {
|
|||
|
name = `${name}`;
|
|||
|
value = `${value}`;
|
|||
|
validateName(name);
|
|||
|
validateValue(value);
|
|||
|
const key = find(this[MAP], name);
|
|||
|
if (key !== undefined) {
|
|||
|
this[MAP][key].push(value);
|
|||
|
} else {
|
|||
|
this[MAP][name] = [value];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Check for header name existence
|
|||
|
*
|
|||
|
* @param String name Header name
|
|||
|
* @return Boolean
|
|||
|
*/
|
|||
|
has(name) {
|
|||
|
name = `${name}`;
|
|||
|
validateName(name);
|
|||
|
return find(this[MAP], name) !== undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Delete all header values given name
|
|||
|
*
|
|||
|
* @param String name Header name
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
delete(name) {
|
|||
|
name = `${name}`;
|
|||
|
validateName(name);
|
|||
|
const key = find(this[MAP], name);
|
|||
|
if (key !== undefined) {
|
|||
|
delete this[MAP][key];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Return raw headers (non-spec api)
|
|||
|
*
|
|||
|
* @return Object
|
|||
|
*/
|
|||
|
raw() {
|
|||
|
return this[MAP];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Get an iterator on keys.
|
|||
|
*
|
|||
|
* @return Iterator
|
|||
|
*/
|
|||
|
keys() {
|
|||
|
return createHeadersIterator(this, 'key');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Get an iterator on values.
|
|||
|
*
|
|||
|
* @return Iterator
|
|||
|
*/
|
|||
|
values() {
|
|||
|
return createHeadersIterator(this, 'value');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Get an iterator on entries.
|
|||
|
*
|
|||
|
* This is the default iterator of the Headers object.
|
|||
|
*
|
|||
|
* @return Iterator
|
|||
|
*/
|
|||
|
[Symbol.iterator]() {
|
|||
|
return createHeadersIterator(this, 'key+value');
|
|||
|
}
|
|||
|
}
|
|||
|
Headers.prototype.entries = Headers.prototype[Symbol.iterator];
|
|||
|
|
|||
|
Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
|
|||
|
value: 'Headers',
|
|||
|
writable: false,
|
|||
|
enumerable: false,
|
|||
|
configurable: true
|
|||
|
});
|
|||
|
|
|||
|
Object.defineProperties(Headers.prototype, {
|
|||
|
get: { enumerable: true },
|
|||
|
forEach: { enumerable: true },
|
|||
|
set: { enumerable: true },
|
|||
|
append: { enumerable: true },
|
|||
|
has: { enumerable: true },
|
|||
|
delete: { enumerable: true },
|
|||
|
keys: { enumerable: true },
|
|||
|
values: { enumerable: true },
|
|||
|
entries: { enumerable: true }
|
|||
|
});
|
|||
|
|
|||
|
function getHeaders(headers) {
|
|||
|
let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';
|
|||
|
|
|||
|
const keys = Object.keys(headers[MAP]).sort();
|
|||
|
return keys.map(kind === 'key' ? function (k) {
|
|||
|
return k.toLowerCase();
|
|||
|
} : kind === 'value' ? function (k) {
|
|||
|
return headers[MAP][k].join(', ');
|
|||
|
} : function (k) {
|
|||
|
return [k.toLowerCase(), headers[MAP][k].join(', ')];
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
const INTERNAL = Symbol('internal');
|
|||
|
|
|||
|
function createHeadersIterator(target, kind) {
|
|||
|
const iterator = Object.create(HeadersIteratorPrototype);
|
|||
|
iterator[INTERNAL] = {
|
|||
|
target,
|
|||
|
kind,
|
|||
|
index: 0
|
|||
|
};
|
|||
|
return iterator;
|
|||
|
}
|
|||
|
|
|||
|
const HeadersIteratorPrototype = Object.setPrototypeOf({
|
|||
|
next() {
|
|||
|
// istanbul ignore if
|
|||
|
if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
|
|||
|
throw new TypeError('Value of `this` is not a HeadersIterator');
|
|||
|
}
|
|||
|
|
|||
|
var _INTERNAL = this[INTERNAL];
|
|||
|
const target = _INTERNAL.target,
|
|||
|
kind = _INTERNAL.kind,
|
|||
|
index = _INTERNAL.index;
|
|||
|
|
|||
|
const values = getHeaders(target, kind);
|
|||
|
const len = values.length;
|
|||
|
if (index >= len) {
|
|||
|
return {
|
|||
|
value: undefined,
|
|||
|
done: true
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
this[INTERNAL].index = index + 1;
|
|||
|
|
|||
|
return {
|
|||
|
value: values[index],
|
|||
|
done: false
|
|||
|
};
|
|||
|
}
|
|||
|
}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));
|
|||
|
|
|||
|
Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
|
|||
|
value: 'HeadersIterator',
|
|||
|
writable: false,
|
|||
|
enumerable: false,
|
|||
|
configurable: true
|
|||
|
});
|
|||
|
|
|||
|
/**
|
|||
|
* Export the Headers object in a form that Node.js can consume.
|
|||
|
*
|
|||
|
* @param Headers headers
|
|||
|
* @return Object
|
|||
|
*/
|
|||
|
function exportNodeCompatibleHeaders(headers) {
|
|||
|
const obj = Object.assign({ __proto__: null }, headers[MAP]);
|
|||
|
|
|||
|
// http.request() only supports string as Host header. This hack makes
|
|||
|
// specifying custom Host header possible.
|
|||
|
const hostHeaderKey = find(headers[MAP], 'Host');
|
|||
|
if (hostHeaderKey !== undefined) {
|
|||
|
obj[hostHeaderKey] = obj[hostHeaderKey][0];
|
|||
|
}
|
|||
|
|
|||
|
return obj;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Create a Headers object from an object of headers, ignoring those that do
|
|||
|
* not conform to HTTP grammar productions.
|
|||
|
*
|
|||
|
* @param Object obj Object of headers
|
|||
|
* @return Headers
|
|||
|
*/
|
|||
|
function createHeadersLenient(obj) {
|
|||
|
const headers = new Headers();
|
|||
|
for (const name of Object.keys(obj)) {
|
|||
|
if (invalidTokenRegex.test(name)) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (Array.isArray(obj[name])) {
|
|||
|
for (const val of obj[name]) {
|
|||
|
if (invalidHeaderCharRegex.test(val)) {
|
|||
|
continue;
|
|||
|
}
|
|||
|
if (headers[MAP][name] === undefined) {
|
|||
|
headers[MAP][name] = [val];
|
|||
|
} else {
|
|||
|
headers[MAP][name].push(val);
|
|||
|
}
|
|||
|
}
|
|||
|
} else if (!invalidHeaderCharRegex.test(obj[name])) {
|
|||
|
headers[MAP][name] = [obj[name]];
|
|||
|
}
|
|||
|
}
|
|||
|
return headers;
|
|||
|
}
|
|||
|
|
|||
|
const INTERNALS$1 = Symbol('Response internals');
|
|||
|
|
|||
|
// fix an issue where "STATUS_CODES" aren't a named export for node <10
|
|||
|
const STATUS_CODES = http.STATUS_CODES;
|
|||
|
|
|||
|
/**
|
|||
|
* Response class
|
|||
|
*
|
|||
|
* @param Stream body Readable stream
|
|||
|
* @param Object opts Response options
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
class Response {
|
|||
|
constructor() {
|
|||
|
let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
|
|||
|
let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|||
|
|
|||
|
Body.call(this, body, opts);
|
|||
|
|
|||
|
const status = opts.status || 200;
|
|||
|
const headers = new Headers(opts.headers);
|
|||
|
|
|||
|
if (body != null && !headers.has('Content-Type')) {
|
|||
|
const contentType = extractContentType(body);
|
|||
|
if (contentType) {
|
|||
|
headers.append('Content-Type', contentType);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
this[INTERNALS$1] = {
|
|||
|
url: opts.url,
|
|||
|
status,
|
|||
|
statusText: opts.statusText || STATUS_CODES[status],
|
|||
|
headers,
|
|||
|
counter: opts.counter
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
get url() {
|
|||
|
return this[INTERNALS$1].url || '';
|
|||
|
}
|
|||
|
|
|||
|
get status() {
|
|||
|
return this[INTERNALS$1].status;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Convenience property representing if the request ended normally
|
|||
|
*/
|
|||
|
get ok() {
|
|||
|
return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
|
|||
|
}
|
|||
|
|
|||
|
get redirected() {
|
|||
|
return this[INTERNALS$1].counter > 0;
|
|||
|
}
|
|||
|
|
|||
|
get statusText() {
|
|||
|
return this[INTERNALS$1].statusText;
|
|||
|
}
|
|||
|
|
|||
|
get headers() {
|
|||
|
return this[INTERNALS$1].headers;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Clone this response
|
|||
|
*
|
|||
|
* @return Response
|
|||
|
*/
|
|||
|
clone() {
|
|||
|
return new Response(clone(this), {
|
|||
|
url: this.url,
|
|||
|
status: this.status,
|
|||
|
statusText: this.statusText,
|
|||
|
headers: this.headers,
|
|||
|
ok: this.ok,
|
|||
|
redirected: this.redirected
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Body.mixIn(Response.prototype);
|
|||
|
|
|||
|
Object.defineProperties(Response.prototype, {
|
|||
|
url: { enumerable: true },
|
|||
|
status: { enumerable: true },
|
|||
|
ok: { enumerable: true },
|
|||
|
redirected: { enumerable: true },
|
|||
|
statusText: { enumerable: true },
|
|||
|
headers: { enumerable: true },
|
|||
|
clone: { enumerable: true }
|
|||
|
});
|
|||
|
|
|||
|
Object.defineProperty(Response.prototype, Symbol.toStringTag, {
|
|||
|
value: 'Response',
|
|||
|
writable: false,
|
|||
|
enumerable: false,
|
|||
|
configurable: true
|
|||
|
});
|
|||
|
|
|||
|
const INTERNALS$2 = Symbol('Request internals');
|
|||
|
|
|||
|
// fix an issue where "format", "parse" aren't a named export for node <10
|
|||
|
const parse_url = Url.parse;
|
|||
|
const format_url = Url.format;
|
|||
|
|
|||
|
const streamDestructionSupported = 'destroy' in Stream.Readable.prototype;
|
|||
|
|
|||
|
/**
|
|||
|
* Check if a value is an instance of Request.
|
|||
|
*
|
|||
|
* @param Mixed input
|
|||
|
* @return Boolean
|
|||
|
*/
|
|||
|
function isRequest(input) {
|
|||
|
return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
|
|||
|
}
|
|||
|
|
|||
|
function isAbortSignal(signal) {
|
|||
|
const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
|
|||
|
return !!(proto && proto.constructor.name === 'AbortSignal');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Request class
|
|||
|
*
|
|||
|
* @param Mixed input Url or Request instance
|
|||
|
* @param Object init Custom options
|
|||
|
* @return Void
|
|||
|
*/
|
|||
|
class Request {
|
|||
|
constructor(input) {
|
|||
|
let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|||
|
|
|||
|
let parsedURL;
|
|||
|
|
|||
|
// normalize input
|
|||
|
if (!isRequest(input)) {
|
|||
|
if (input && input.href) {
|
|||
|
// in order to support Node.js' Url objects; though WHATWG's URL objects
|
|||
|
// will fall into this branch also (since their `toString()` will return
|
|||
|
// `href` property anyway)
|
|||
|
parsedURL = parse_url(input.href);
|
|||
|
} else {
|
|||
|
// coerce input to a string before attempting to parse
|
|||
|
parsedURL = parse_url(`${input}`);
|
|||
|
}
|
|||
|
input = {};
|
|||
|
} else {
|
|||
|
parsedURL = parse_url(input.url);
|
|||
|
}
|
|||
|
|
|||
|
let method = init.method || input.method || 'GET';
|
|||
|
method = method.toUpperCase();
|
|||
|
|
|||
|
if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
|
|||
|
throw new TypeError('Request with GET/HEAD method cannot have body');
|
|||
|
}
|
|||
|
|
|||
|
let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;
|
|||
|
|
|||
|
Body.call(this, inputBody, {
|
|||
|
timeout: init.timeout || input.timeout || 0,
|
|||
|
size: init.size || input.size || 0
|
|||
|
});
|
|||
|
|
|||
|
const headers = new Headers(init.headers || input.headers || {});
|
|||
|
|
|||
|
if (inputBody != null && !headers.has('Content-Type')) {
|
|||
|
const contentType = extractContentType(inputBody);
|
|||
|
if (contentType) {
|
|||
|
headers.append('Content-Type', contentType);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
let signal = isRequest(input) ? input.signal : null;
|
|||
|
if ('signal' in init) signal = init.signal;
|
|||
|
|
|||
|
if (signal != null && !isAbortSignal(signal)) {
|
|||
|
throw new TypeError('Expected signal to be an instanceof AbortSignal');
|
|||
|
}
|
|||
|
|
|||
|
this[INTERNALS$2] = {
|
|||
|
method,
|
|||
|
redirect: init.redirect || input.redirect || 'follow',
|
|||
|
headers,
|
|||
|
parsedURL,
|
|||
|
signal
|
|||
|
};
|
|||
|
|
|||
|
// node-fetch-only options
|
|||
|
this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
|
|||
|
this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
|
|||
|
this.counter = init.counter || input.counter || 0;
|
|||
|
this.agent = init.agent || input.agent;
|
|||
|
}
|
|||
|
|
|||
|
get method() {
|
|||
|
return this[INTERNALS$2].method;
|
|||
|
}
|
|||
|
|
|||
|
get url() {
|
|||
|
return format_url(this[INTERNALS$2].parsedURL);
|
|||
|
}
|
|||
|
|
|||
|
get headers() {
|
|||
|
return this[INTERNALS$2].headers;
|
|||
|
}
|
|||
|
|
|||
|
get redirect() {
|
|||
|
return this[INTERNALS$2].redirect;
|
|||
|
}
|
|||
|
|
|||
|
get signal() {
|
|||
|
return this[INTERNALS$2].signal;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Clone this request
|
|||
|
*
|
|||
|
* @return Request
|
|||
|
*/
|
|||
|
clone() {
|
|||
|
return new Request(this);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
Body.mixIn(Request.prototype);
|
|||
|
|
|||
|
Object.defineProperty(Request.prototype, Symbol.toStringTag, {
|
|||
|
value: 'Request',
|
|||
|
writable: false,
|
|||
|
enumerable: false,
|
|||
|
configurable: true
|
|||
|
});
|
|||
|
|
|||
|
Object.defineProperties(Request.prototype, {
|
|||
|
method: { enumerable: true },
|
|||
|
url: { enumerable: true },
|
|||
|
headers: { enumerable: true },
|
|||
|
redirect: { enumerable: true },
|
|||
|
clone: { enumerable: true },
|
|||
|
signal: { enumerable: true }
|
|||
|
});
|
|||
|
|
|||
|
/**
|
|||
|
* Convert a Request to Node.js http request options.
|
|||
|
*
|
|||
|
* @param Request A Request instance
|
|||
|
* @return Object The options object to be passed to http.request
|
|||
|
*/
|
|||
|
function getNodeRequestOptions(request) {
|
|||
|
const parsedURL = request[INTERNALS$2].parsedURL;
|
|||
|
const headers = new Headers(request[INTERNALS$2].headers);
|
|||
|
|
|||
|
// fetch step 1.3
|
|||
|
if (!headers.has('Accept')) {
|
|||
|
headers.set('Accept', '*/*');
|
|||
|
}
|
|||
|
|
|||
|
// Basic fetch
|
|||
|
if (!parsedURL.protocol || !parsedURL.hostname) {
|
|||
|
throw new TypeError('Only absolute URLs are supported');
|
|||
|
}
|
|||
|
|
|||
|
if (!/^https?:$/.test(parsedURL.protocol)) {
|
|||
|
throw new TypeError('Only HTTP(S) protocols are supported');
|
|||
|
}
|
|||
|
|
|||
|
if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {
|
|||
|
throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');
|
|||
|
}
|
|||
|
|
|||
|
// HTTP-network-or-cache fetch steps 2.4-2.7
|
|||
|
let contentLengthValue = null;
|
|||
|
if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
|
|||
|
contentLengthValue = '0';
|
|||
|
}
|
|||
|
if (request.body != null) {
|
|||
|
const totalBytes = getTotalBytes(request);
|
|||
|
if (typeof totalBytes === 'number') {
|
|||
|
contentLengthValue = String(totalBytes);
|
|||
|
}
|
|||
|
}
|
|||
|
if (contentLengthValue) {
|
|||
|
headers.set('Content-Length', contentLengthValue);
|
|||
|
}
|
|||
|
|
|||
|
// HTTP-network-or-cache fetch step 2.11
|
|||
|
if (!headers.has('User-Agent')) {
|
|||
|
headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
|
|||
|
}
|
|||
|
|
|||
|
// HTTP-network-or-cache fetch step 2.15
|
|||
|
if (request.compress && !headers.has('Accept-Encoding')) {
|
|||
|
headers.set('Accept-Encoding', 'gzip,deflate');
|
|||
|
}
|
|||
|
|
|||
|
let agent = request.agent;
|
|||
|
if (typeof agent === 'function') {
|
|||
|
agent = agent(parsedURL);
|
|||
|
}
|
|||
|
|
|||
|
if (!headers.has('Connection') && !agent) {
|
|||
|
headers.set('Connection', 'close');
|
|||
|
}
|
|||
|
|
|||
|
// HTTP-network fetch step 4.2
|
|||
|
// chunked encoding is handled by Node.js
|
|||
|
|
|||
|
return Object.assign({}, parsedURL, {
|
|||
|
method: request.method,
|
|||
|
headers: exportNodeCompatibleHeaders(headers),
|
|||
|
agent
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* abort-error.js
|
|||
|
*
|
|||
|
* AbortError interface for cancelled requests
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Create AbortError instance
|
|||
|
*
|
|||
|
* @param String message Error message for human
|
|||
|
* @return AbortError
|
|||
|
*/
|
|||
|
function AbortError(message) {
|
|||
|
Error.call(this, message);
|
|||
|
|
|||
|
this.type = 'aborted';
|
|||
|
this.message = message;
|
|||
|
|
|||
|
// hide custom error implementation details from end-users
|
|||
|
Error.captureStackTrace(this, this.constructor);
|
|||
|
}
|
|||
|
|
|||
|
AbortError.prototype = Object.create(Error.prototype);
|
|||
|
AbortError.prototype.constructor = AbortError;
|
|||
|
AbortError.prototype.name = 'AbortError';
|
|||
|
|
|||
|
// fix an issue where "PassThrough", "resolve" aren't a named export for node <10
|
|||
|
const PassThrough$1 = Stream.PassThrough;
|
|||
|
const resolve_url = Url.resolve;
|
|||
|
|
|||
|
/**
|
|||
|
* Fetch function
|
|||
|
*
|
|||
|
* @param Mixed url Absolute url or Request instance
|
|||
|
* @param Object opts Fetch options
|
|||
|
* @return Promise
|
|||
|
*/
|
|||
|
function fetch(url, opts) {
|
|||
|
|
|||
|
// allow custom promise
|
|||
|
if (!fetch.Promise) {
|
|||
|
throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
|
|||
|
}
|
|||
|
|
|||
|
Body.Promise = fetch.Promise;
|
|||
|
|
|||
|
// wrap http.request into fetch
|
|||
|
return new fetch.Promise(function (resolve, reject) {
|
|||
|
// build request object
|
|||
|
const request = new Request(url, opts);
|
|||
|
const options = getNodeRequestOptions(request);
|
|||
|
|
|||
|
const send = (options.protocol === 'https:' ? https : http).request;
|
|||
|
const signal = request.signal;
|
|||
|
|
|||
|
let response = null;
|
|||
|
|
|||
|
const abort = function abort() {
|
|||
|
let error = new AbortError('The user aborted a request.');
|
|||
|
reject(error);
|
|||
|
if (request.body && request.body instanceof Stream.Readable) {
|
|||
|
request.body.destroy(error);
|
|||
|
}
|
|||
|
if (!response || !response.body) return;
|
|||
|
response.body.emit('error', error);
|
|||
|
};
|
|||
|
|
|||
|
if (signal && signal.aborted) {
|
|||
|
abort();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
const abortAndFinalize = function abortAndFinalize() {
|
|||
|
abort();
|
|||
|
finalize();
|
|||
|
};
|
|||
|
|
|||
|
// send request
|
|||
|
const req = send(options);
|
|||
|
let reqTimeout;
|
|||
|
|
|||
|
if (signal) {
|
|||
|
signal.addEventListener('abort', abortAndFinalize);
|
|||
|
}
|
|||
|
|
|||
|
function finalize() {
|
|||
|
req.abort();
|
|||
|
if (signal) signal.removeEventListener('abort', abortAndFinalize);
|
|||
|
clearTimeout(reqTimeout);
|
|||
|
}
|
|||
|
|
|||
|
if (request.timeout) {
|
|||
|
req.once('socket', function (socket) {
|
|||
|
reqTimeout = setTimeout(function () {
|
|||
|
reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
|
|||
|
finalize();
|
|||
|
}, request.timeout);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
req.on('error', function (err) {
|
|||
|
reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
|
|||
|
finalize();
|
|||
|
});
|
|||
|
|
|||
|
req.on('response', function (res) {
|
|||
|
clearTimeout(reqTimeout);
|
|||
|
|
|||
|
const headers = createHeadersLenient(res.headers);
|
|||
|
|
|||
|
// HTTP fetch step 5
|
|||
|
if (fetch.isRedirect(res.statusCode)) {
|
|||
|
// HTTP fetch step 5.2
|
|||
|
const location = headers.get('Location');
|
|||
|
|
|||
|
// HTTP fetch step 5.3
|
|||
|
const locationURL = location === null ? null : resolve_url(request.url, location);
|
|||
|
|
|||
|
// HTTP fetch step 5.5
|
|||
|
switch (request.redirect) {
|
|||
|
case 'error':
|
|||
|
reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect'));
|
|||
|
finalize();
|
|||
|
return;
|
|||
|
case 'manual':
|
|||
|
// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
|
|||
|
if (locationURL !== null) {
|
|||
|
// handle corrupted header
|
|||
|
try {
|
|||
|
headers.set('Location', locationURL);
|
|||
|
} catch (err) {
|
|||
|
// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request
|
|||
|
reject(err);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case 'follow':
|
|||
|
// HTTP-redirect fetch step 2
|
|||
|
if (locationURL === null) {
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
// HTTP-redirect fetch step 5
|
|||
|
if (request.counter >= request.follow) {
|
|||
|
reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
|
|||
|
finalize();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// HTTP-redirect fetch step 6 (counter increment)
|
|||
|
// Create a new Request object.
|
|||
|
const requestOpts = {
|
|||
|
headers: new Headers(request.headers),
|
|||
|
follow: request.follow,
|
|||
|
counter: request.counter + 1,
|
|||
|
agent: request.agent,
|
|||
|
compress: request.compress,
|
|||
|
method: request.method,
|
|||
|
body: request.body,
|
|||
|
signal: request.signal,
|
|||
|
timeout: request.timeout
|
|||
|
};
|
|||
|
|
|||
|
// HTTP-redirect fetch step 9
|
|||
|
if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
|
|||
|
reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
|
|||
|
finalize();
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// HTTP-redirect fetch step 11
|
|||
|
if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
|
|||
|
requestOpts.method = 'GET';
|
|||
|
requestOpts.body = undefined;
|
|||
|
requestOpts.headers.delete('content-length');
|
|||
|
}
|
|||
|
|
|||
|
// HTTP-redirect fetch step 15
|
|||
|
resolve(fetch(new Request(locationURL, requestOpts)));
|
|||
|
finalize();
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// prepare response
|
|||
|
res.once('end', function () {
|
|||
|
if (signal) signal.removeEventListener('abort', abortAndFinalize);
|
|||
|
});
|
|||
|
let body = res.pipe(new PassThrough$1());
|
|||
|
|
|||
|
const response_options = {
|
|||
|
url: request.url,
|
|||
|
status: res.statusCode,
|
|||
|
statusText: res.statusMessage,
|
|||
|
headers: headers,
|
|||
|
size: request.size,
|
|||
|
timeout: request.timeout,
|
|||
|
counter: request.counter
|
|||
|
};
|
|||
|
|
|||
|
// HTTP-network fetch step 12.1.1.3
|
|||
|
const codings = headers.get('Content-Encoding');
|
|||
|
|
|||
|
// HTTP-network fetch step 12.1.1.4: handle content codings
|
|||
|
|
|||
|
// in following scenarios we ignore compression support
|
|||
|
// 1. compression support is disabled
|
|||
|
// 2. HEAD request
|
|||
|
// 3. no Content-Encoding header
|
|||
|
// 4. no content response (204)
|
|||
|
// 5. content not modified response (304)
|
|||
|
if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
|
|||
|
response = new Response(body, response_options);
|
|||
|
resolve(response);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// For Node v6+
|
|||
|
// Be less strict when decoding compressed responses, since sometimes
|
|||
|
// servers send slightly invalid responses that are still accepted
|
|||
|
// by common browsers.
|
|||
|
// Always using Z_SYNC_FLUSH is what cURL does.
|
|||
|
const zlibOptions = {
|
|||
|
flush: zlib.Z_SYNC_FLUSH,
|
|||
|
finishFlush: zlib.Z_SYNC_FLUSH
|
|||
|
};
|
|||
|
|
|||
|
// for gzip
|
|||
|
if (codings == 'gzip' || codings == 'x-gzip') {
|
|||
|
body = body.pipe(zlib.createGunzip(zlibOptions));
|
|||
|
response = new Response(body, response_options);
|
|||
|
resolve(response);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// for deflate
|
|||
|
if (codings == 'deflate' || codings == 'x-deflate') {
|
|||
|
// handle the infamous raw deflate response from old servers
|
|||
|
// a hack for old IIS and Apache servers
|
|||
|
const raw = res.pipe(new PassThrough$1());
|
|||
|
raw.once('data', function (chunk) {
|
|||
|
// see http://stackoverflow.com/questions/37519828
|
|||
|
if ((chunk[0] & 0x0F) === 0x08) {
|
|||
|
body = body.pipe(zlib.createInflate());
|
|||
|
} else {
|
|||
|
body = body.pipe(zlib.createInflateRaw());
|
|||
|
}
|
|||
|
response = new Response(body, response_options);
|
|||
|
resolve(response);
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// for br
|
|||
|
if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {
|
|||
|
body = body.pipe(zlib.createBrotliDecompress());
|
|||
|
response = new Response(body, response_options);
|
|||
|
resolve(response);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// otherwise, use response as-is
|
|||
|
response = new Response(body, response_options);
|
|||
|
resolve(response);
|
|||
|
});
|
|||
|
|
|||
|
writeToStream(req, request);
|
|||
|
});
|
|||
|
}
|
|||
|
/**
|
|||
|
* Redirect code matching
|
|||
|
*
|
|||
|
* @param Number code Status code
|
|||
|
* @return Boolean
|
|||
|
*/
|
|||
|
fetch.isRedirect = function (code) {
|
|||
|
return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
|
|||
|
};
|
|||
|
|
|||
|
// expose Promise
|
|||
|
fetch.Promise = global.Promise;
|
|||
|
|
|||
|
module.exports = exports = fetch;
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
exports.default = exports;
|
|||
|
exports.Headers = Headers;
|
|||
|
exports.Request = Request;
|
|||
|
exports.Response = Response;
|
|||
|
exports.FetchError = FetchError;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 462:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
// See http://www.robvanderwoude.com/escapechars.php
|
|||
|
const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g;
|
|||
|
|
|||
|
function escapeCommand(arg) {
|
|||
|
// Escape meta chars
|
|||
|
arg = arg.replace(metaCharsRegExp, '^$1');
|
|||
|
|
|||
|
return arg;
|
|||
|
}
|
|||
|
|
|||
|
function escapeArgument(arg, doubleEscapeMetaChars) {
|
|||
|
// Convert to string
|
|||
|
arg = `${arg}`;
|
|||
|
|
|||
|
// Algorithm below is based on https://qntm.org/cmd
|
|||
|
|
|||
|
// Sequence of backslashes followed by a double quote:
|
|||
|
// double up all the backslashes and escape the double quote
|
|||
|
arg = arg.replace(/(\\*)"/g, '$1$1\\"');
|
|||
|
|
|||
|
// Sequence of backslashes followed by the end of the string
|
|||
|
// (which will become a double quote later):
|
|||
|
// double up all the backslashes
|
|||
|
arg = arg.replace(/(\\*)$/, '$1$1');
|
|||
|
|
|||
|
// All other backslashes occur literally
|
|||
|
|
|||
|
// Quote the whole thing:
|
|||
|
arg = `"${arg}"`;
|
|||
|
|
|||
|
// Escape meta chars
|
|||
|
arg = arg.replace(metaCharsRegExp, '^$1');
|
|||
|
|
|||
|
// Double escape meta chars if necessary
|
|||
|
if (doubleEscapeMetaChars) {
|
|||
|
arg = arg.replace(metaCharsRegExp, '^$1');
|
|||
|
}
|
|||
|
|
|||
|
return arg;
|
|||
|
}
|
|||
|
|
|||
|
module.exports.command = escapeCommand;
|
|||
|
module.exports.argument = escapeArgument;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 463:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
|||
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|||
|
|
|||
|
var deprecation = __webpack_require__(692);
|
|||
|
var once = _interopDefault(__webpack_require__(969));
|
|||
|
|
|||
|
const logOnce = once(deprecation => console.warn(deprecation));
|
|||
|
/**
|
|||
|
* Error with extra properties to help with debugging
|
|||
|
*/
|
|||
|
|
|||
|
class RequestError extends Error {
|
|||
|
constructor(message, statusCode, options) {
|
|||
|
super(message); // Maintains proper stack trace (only available on V8)
|
|||
|
|
|||
|
/* istanbul ignore next */
|
|||
|
|
|||
|
if (Error.captureStackTrace) {
|
|||
|
Error.captureStackTrace(this, this.constructor);
|
|||
|
}
|
|||
|
|
|||
|
this.name = "HttpError";
|
|||
|
this.status = statusCode;
|
|||
|
Object.defineProperty(this, "code", {
|
|||
|
get() {
|
|||
|
logOnce(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`."));
|
|||
|
return statusCode;
|
|||
|
}
|
|||
|
|
|||
|
});
|
|||
|
this.headers = options.headers; // redact request credentials without mutating original request options
|
|||
|
|
|||
|
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 // client_id & client_secret can be passed as URL query parameters to increase rate limit
|
|||
|
// see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications
|
|||
|
.replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended
|
|||
|
// see https://developer.github.com/v3/#oauth2-token-sent-in-a-header
|
|||
|
.replace(/\baccess_token=\w+/g, "access_token=[REDACTED]");
|
|||
|
this.request = requestCopy;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
exports.RequestError = RequestError;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 469:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|||
|
};
|
|||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|||
|
if (mod && mod.__esModule) return mod;
|
|||
|
var result = {};
|
|||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|||
|
result["default"] = mod;
|
|||
|
return result;
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
// Originally pulled from https://github.com/JasonEtco/actions-toolkit/blob/master/src/github.ts
|
|||
|
const graphql_1 = __webpack_require__(503);
|
|||
|
const rest_1 = __importDefault(__webpack_require__(613));
|
|||
|
const Context = __importStar(__webpack_require__(262));
|
|||
|
// We need this in order to extend Octokit
|
|||
|
rest_1.default.prototype = new rest_1.default();
|
|||
|
exports.context = new Context.Context();
|
|||
|
class GitHub extends rest_1.default {
|
|||
|
constructor(token, opts = {}) {
|
|||
|
super(Object.assign(Object.assign({}, opts), { auth: `token ${token}` }));
|
|||
|
this.graphql = graphql_1.defaults({
|
|||
|
headers: { authorization: `token ${token}` }
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
exports.GitHub = GitHub;
|
|||
|
//# sourceMappingURL=github.js.map
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 470:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const command_1 = __webpack_require__(431);
|
|||
|
const os = __webpack_require__(87);
|
|||
|
const path = __webpack_require__(622);
|
|||
|
/**
|
|||
|
* The code to exit an action
|
|||
|
*/
|
|||
|
var ExitCode;
|
|||
|
(function (ExitCode) {
|
|||
|
/**
|
|||
|
* A code indicating that the action was successful
|
|||
|
*/
|
|||
|
ExitCode[ExitCode["Success"] = 0] = "Success";
|
|||
|
/**
|
|||
|
* A code indicating that the action was a failure
|
|||
|
*/
|
|||
|
ExitCode[ExitCode["Failure"] = 1] = "Failure";
|
|||
|
})(ExitCode = exports.ExitCode || (exports.ExitCode = {}));
|
|||
|
//-----------------------------------------------------------------------
|
|||
|
// Variables
|
|||
|
//-----------------------------------------------------------------------
|
|||
|
/**
|
|||
|
* Sets env variable for this action and future actions in the job
|
|||
|
* @param name the name of the variable to set
|
|||
|
* @param val the value of the variable
|
|||
|
*/
|
|||
|
function exportVariable(name, val) {
|
|||
|
process.env[name] = val;
|
|||
|
command_1.issueCommand('set-env', { name }, val);
|
|||
|
}
|
|||
|
exports.exportVariable = exportVariable;
|
|||
|
/**
|
|||
|
* Registers a secret which will get masked from logs
|
|||
|
* @param secret value of the secret
|
|||
|
*/
|
|||
|
function setSecret(secret) {
|
|||
|
command_1.issueCommand('add-mask', {}, secret);
|
|||
|
}
|
|||
|
exports.setSecret = setSecret;
|
|||
|
/**
|
|||
|
* Prepends inputPath to the PATH (for this action and future actions)
|
|||
|
* @param inputPath
|
|||
|
*/
|
|||
|
function addPath(inputPath) {
|
|||
|
command_1.issueCommand('add-path', {}, inputPath);
|
|||
|
process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
|
|||
|
}
|
|||
|
exports.addPath = addPath;
|
|||
|
/**
|
|||
|
* Gets the value of an input. The value is also trimmed.
|
|||
|
*
|
|||
|
* @param name name of the input to get
|
|||
|
* @param options optional. See InputOptions.
|
|||
|
* @returns string
|
|||
|
*/
|
|||
|
function getInput(name, options) {
|
|||
|
const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';
|
|||
|
if (options && options.required && !val) {
|
|||
|
throw new Error(`Input required and not supplied: ${name}`);
|
|||
|
}
|
|||
|
return val.trim();
|
|||
|
}
|
|||
|
exports.getInput = getInput;
|
|||
|
/**
|
|||
|
* Sets the value of an output.
|
|||
|
*
|
|||
|
* @param name name of the output to set
|
|||
|
* @param value value to store
|
|||
|
*/
|
|||
|
function setOutput(name, value) {
|
|||
|
command_1.issueCommand('set-output', { name }, value);
|
|||
|
}
|
|||
|
exports.setOutput = setOutput;
|
|||
|
//-----------------------------------------------------------------------
|
|||
|
// Results
|
|||
|
//-----------------------------------------------------------------------
|
|||
|
/**
|
|||
|
* Sets the action status to failed.
|
|||
|
* When the action exits it will be with an exit code of 1
|
|||
|
* @param message add error issue message
|
|||
|
*/
|
|||
|
function setFailed(message) {
|
|||
|
process.exitCode = ExitCode.Failure;
|
|||
|
error(message);
|
|||
|
}
|
|||
|
exports.setFailed = setFailed;
|
|||
|
//-----------------------------------------------------------------------
|
|||
|
// Logging Commands
|
|||
|
//-----------------------------------------------------------------------
|
|||
|
/**
|
|||
|
* Writes debug message to user log
|
|||
|
* @param message debug message
|
|||
|
*/
|
|||
|
function debug(message) {
|
|||
|
command_1.issueCommand('debug', {}, message);
|
|||
|
}
|
|||
|
exports.debug = debug;
|
|||
|
/**
|
|||
|
* Adds an error issue
|
|||
|
* @param message error issue message
|
|||
|
*/
|
|||
|
function error(message) {
|
|||
|
command_1.issue('error', message);
|
|||
|
}
|
|||
|
exports.error = error;
|
|||
|
/**
|
|||
|
* Adds an warning issue
|
|||
|
* @param message warning issue message
|
|||
|
*/
|
|||
|
function warning(message) {
|
|||
|
command_1.issue('warning', message);
|
|||
|
}
|
|||
|
exports.warning = warning;
|
|||
|
/**
|
|||
|
* Writes info to log with console.log.
|
|||
|
* @param message info message
|
|||
|
*/
|
|||
|
function info(message) {
|
|||
|
process.stdout.write(message + os.EOL);
|
|||
|
}
|
|||
|
exports.info = info;
|
|||
|
/**
|
|||
|
* Begin an output group.
|
|||
|
*
|
|||
|
* Output until the next `groupEnd` will be foldable in this group
|
|||
|
*
|
|||
|
* @param name The name of the output group
|
|||
|
*/
|
|||
|
function startGroup(name) {
|
|||
|
command_1.issue('group', name);
|
|||
|
}
|
|||
|
exports.startGroup = startGroup;
|
|||
|
/**
|
|||
|
* End an output group.
|
|||
|
*/
|
|||
|
function endGroup() {
|
|||
|
command_1.issue('endgroup');
|
|||
|
}
|
|||
|
exports.endGroup = endGroup;
|
|||
|
/**
|
|||
|
* Wrap an asynchronous function call in a group.
|
|||
|
*
|
|||
|
* Returns the same type as the function itself.
|
|||
|
*
|
|||
|
* @param name The name of the group
|
|||
|
* @param fn The function to wrap in the group
|
|||
|
*/
|
|||
|
function group(name, fn) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
startGroup(name);
|
|||
|
let result;
|
|||
|
try {
|
|||
|
result = yield fn();
|
|||
|
}
|
|||
|
finally {
|
|||
|
endGroup();
|
|||
|
}
|
|||
|
return result;
|
|||
|
});
|
|||
|
}
|
|||
|
exports.group = group;
|
|||
|
//# sourceMappingURL=core.js.map
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 471:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = authenticationBeforeRequest;
|
|||
|
|
|||
|
const btoa = __webpack_require__(675);
|
|||
|
const uniq = __webpack_require__(126);
|
|||
|
|
|||
|
function authenticationBeforeRequest(state, options) {
|
|||
|
if (!state.auth.type) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (state.auth.type === "basic") {
|
|||
|
const hash = btoa(`${state.auth.username}:${state.auth.password}`);
|
|||
|
options.headers.authorization = `Basic ${hash}`;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (state.auth.type === "token") {
|
|||
|
options.headers.authorization = `token ${state.auth.token}`;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (state.auth.type === "app") {
|
|||
|
options.headers.authorization = `Bearer ${state.auth.token}`;
|
|||
|
const acceptHeaders = options.headers.accept
|
|||
|
.split(",")
|
|||
|
.concat("application/vnd.github.machine-man-preview+json");
|
|||
|
options.headers.accept = uniq(acceptHeaders)
|
|||
|
.filter(Boolean)
|
|||
|
.join(",");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
options.url += options.url.indexOf("?") === -1 ? "?" : "&";
|
|||
|
|
|||
|
if (state.auth.token) {
|
|||
|
options.url += `access_token=${encodeURIComponent(state.auth.token)}`;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
const key = encodeURIComponent(state.auth.key);
|
|||
|
const secret = encodeURIComponent(state.auth.secret);
|
|||
|
options.url += `client_id=${key}&client_secret=${secret}`;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 489:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
const path = __webpack_require__(622);
|
|||
|
const which = __webpack_require__(814);
|
|||
|
const pathKey = __webpack_require__(39)();
|
|||
|
|
|||
|
function resolveCommandAttempt(parsed, withoutPathExt) {
|
|||
|
const cwd = process.cwd();
|
|||
|
const hasCustomCwd = parsed.options.cwd != null;
|
|||
|
|
|||
|
// If a custom `cwd` was specified, we need to change the process cwd
|
|||
|
// because `which` will do stat calls but does not support a custom cwd
|
|||
|
if (hasCustomCwd) {
|
|||
|
try {
|
|||
|
process.chdir(parsed.options.cwd);
|
|||
|
} catch (err) {
|
|||
|
/* Empty */
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
let resolved;
|
|||
|
|
|||
|
try {
|
|||
|
resolved = which.sync(parsed.command, {
|
|||
|
path: (parsed.options.env || process.env)[pathKey],
|
|||
|
pathExt: withoutPathExt ? path.delimiter : undefined,
|
|||
|
});
|
|||
|
} catch (e) {
|
|||
|
/* Empty */
|
|||
|
} finally {
|
|||
|
process.chdir(cwd);
|
|||
|
}
|
|||
|
|
|||
|
// If we successfully resolved, ensure that an absolute path is returned
|
|||
|
// Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it
|
|||
|
if (resolved) {
|
|||
|
resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);
|
|||
|
}
|
|||
|
|
|||
|
return resolved;
|
|||
|
}
|
|||
|
|
|||
|
function resolveCommand(parsed) {
|
|||
|
return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = resolveCommand;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 500:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = graphql
|
|||
|
|
|||
|
const GraphqlError = __webpack_require__(862)
|
|||
|
|
|||
|
const NON_VARIABLE_OPTIONS = ['method', 'baseUrl', 'url', 'headers', 'request', 'query']
|
|||
|
|
|||
|
function graphql (request, query, options) {
|
|||
|
if (typeof query === 'string') {
|
|||
|
options = Object.assign({ query }, options)
|
|||
|
} else {
|
|||
|
options = query
|
|||
|
}
|
|||
|
|
|||
|
const requestOptions = Object.keys(options).reduce((result, key) => {
|
|||
|
if (NON_VARIABLE_OPTIONS.includes(key)) {
|
|||
|
result[key] = options[key]
|
|||
|
return result
|
|||
|
}
|
|||
|
|
|||
|
if (!result.variables) {
|
|||
|
result.variables = {}
|
|||
|
}
|
|||
|
|
|||
|
result.variables[key] = options[key]
|
|||
|
return result
|
|||
|
}, {})
|
|||
|
|
|||
|
return request(requestOptions)
|
|||
|
.then(response => {
|
|||
|
if (response.data.errors) {
|
|||
|
throw new GraphqlError(requestOptions, response)
|
|||
|
}
|
|||
|
|
|||
|
return response.data.data
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 503:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
const { request } = __webpack_require__(753)
|
|||
|
const getUserAgent = __webpack_require__(46)
|
|||
|
|
|||
|
const version = __webpack_require__(314).version
|
|||
|
const userAgent = `octokit-graphql.js/${version} ${getUserAgent()}`
|
|||
|
|
|||
|
const withDefaults = __webpack_require__(0)
|
|||
|
|
|||
|
module.exports = withDefaults(request, {
|
|||
|
method: 'POST',
|
|||
|
url: '/graphql',
|
|||
|
headers: {
|
|||
|
'user-agent': userAgent
|
|||
|
}
|
|||
|
})
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 510:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = addHook
|
|||
|
|
|||
|
function addHook (state, kind, name, hook) {
|
|||
|
var orig = hook
|
|||
|
if (!state.registry[name]) {
|
|||
|
state.registry[name] = []
|
|||
|
}
|
|||
|
|
|||
|
if (kind === 'before') {
|
|||
|
hook = function (method, options) {
|
|||
|
return Promise.resolve()
|
|||
|
.then(orig.bind(null, options))
|
|||
|
.then(method.bind(null, options))
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (kind === 'after') {
|
|||
|
hook = function (method, options) {
|
|||
|
var result
|
|||
|
return Promise.resolve()
|
|||
|
.then(method.bind(null, options))
|
|||
|
.then(function (result_) {
|
|||
|
result = result_
|
|||
|
return orig(result, options)
|
|||
|
})
|
|||
|
.then(function () {
|
|||
|
return result
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (kind === 'error') {
|
|||
|
hook = function (method, options) {
|
|||
|
return Promise.resolve()
|
|||
|
.then(method.bind(null, options))
|
|||
|
.catch(function (error) {
|
|||
|
return orig(error, options)
|
|||
|
})
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
state.registry[name].push({
|
|||
|
hook: hook,
|
|||
|
orig: orig
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 523:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
var register = __webpack_require__(363)
|
|||
|
var addHook = __webpack_require__(510)
|
|||
|
var removeHook = __webpack_require__(763)
|
|||
|
|
|||
|
// bind with array of arguments: https://stackoverflow.com/a/21792913
|
|||
|
var bind = Function.bind
|
|||
|
var bindable = bind.bind(bind)
|
|||
|
|
|||
|
function bindApi (hook, state, name) {
|
|||
|
var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state])
|
|||
|
hook.api = { remove: removeHookRef }
|
|||
|
hook.remove = removeHookRef
|
|||
|
|
|||
|
;['before', 'error', 'after', 'wrap'].forEach(function (kind) {
|
|||
|
var args = name ? [state, kind, name] : [state, kind]
|
|||
|
hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args)
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
function HookSingular () {
|
|||
|
var singularHookName = 'h'
|
|||
|
var singularHookState = {
|
|||
|
registry: {}
|
|||
|
}
|
|||
|
var singularHook = register.bind(null, singularHookState, singularHookName)
|
|||
|
bindApi(singularHook, singularHookState, singularHookName)
|
|||
|
return singularHook
|
|||
|
}
|
|||
|
|
|||
|
function HookCollection () {
|
|||
|
var state = {
|
|||
|
registry: {}
|
|||
|
}
|
|||
|
|
|||
|
var hook = register.bind(null, state)
|
|||
|
bindApi(hook, state)
|
|||
|
|
|||
|
return hook
|
|||
|
}
|
|||
|
|
|||
|
var collectionHookDeprecationMessageDisplayed = false
|
|||
|
function Hook () {
|
|||
|
if (!collectionHookDeprecationMessageDisplayed) {
|
|||
|
console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4')
|
|||
|
collectionHookDeprecationMessageDisplayed = true
|
|||
|
}
|
|||
|
return HookCollection()
|
|||
|
}
|
|||
|
|
|||
|
Hook.Singular = HookSingular.bind()
|
|||
|
Hook.Collection = HookCollection.bind()
|
|||
|
|
|||
|
module.exports = Hook
|
|||
|
// expose constructors as a named property for TypeScript
|
|||
|
module.exports.Hook = Hook
|
|||
|
module.exports.Singular = Hook.Singular
|
|||
|
module.exports.Collection = Hook.Collection
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 529:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
const factory = __webpack_require__(47);
|
|||
|
|
|||
|
module.exports = factory();
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 536:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = hasFirstPage
|
|||
|
|
|||
|
const deprecate = __webpack_require__(370)
|
|||
|
const getPageLinks = __webpack_require__(577)
|
|||
|
|
|||
|
function hasFirstPage (link) {
|
|||
|
deprecate(`octokit.hasFirstPage() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`)
|
|||
|
return getPageLinks(link).first
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 550:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = getNextPage
|
|||
|
|
|||
|
const getPage = __webpack_require__(265)
|
|||
|
|
|||
|
function getNextPage (octokit, link, headers) {
|
|||
|
return getPage(octokit, link, 'next', headers)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 558:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = hasPreviousPage
|
|||
|
|
|||
|
const deprecate = __webpack_require__(370)
|
|||
|
const getPageLinks = __webpack_require__(577)
|
|||
|
|
|||
|
function hasPreviousPage (link) {
|
|||
|
deprecate(`octokit.hasPreviousPage() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`)
|
|||
|
return getPageLinks(link).prev
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 559:
|
|||
|
/***/ (function(__unusedmodule, exports) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
class GitVersion {
|
|||
|
/**
|
|||
|
* Used for comparing the version of git and git-lfs against the minimum required version
|
|||
|
* @param version the version string, e.g. 1.2 or 1.2.3
|
|||
|
*/
|
|||
|
constructor(version) {
|
|||
|
this.major = NaN;
|
|||
|
this.minor = NaN;
|
|||
|
this.patch = NaN;
|
|||
|
if (version) {
|
|||
|
const match = version.match(/^(\d+)\.(\d+)(\.(\d+))?$/);
|
|||
|
if (match) {
|
|||
|
this.major = Number(match[1]);
|
|||
|
this.minor = Number(match[2]);
|
|||
|
if (match[4]) {
|
|||
|
this.patch = Number(match[4]);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/**
|
|||
|
* Compares the instance against a minimum required version
|
|||
|
* @param minimum Minimum version
|
|||
|
*/
|
|||
|
checkMinimum(minimum) {
|
|||
|
if (!minimum.isValid()) {
|
|||
|
throw new Error('Arg minimum is not a valid version');
|
|||
|
}
|
|||
|
// Major is insufficient
|
|||
|
if (this.major < minimum.major) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// Major is equal
|
|||
|
if (this.major === minimum.major) {
|
|||
|
// Minor is insufficient
|
|||
|
if (this.minor < minimum.minor) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
// Minor is equal
|
|||
|
if (this.minor === minimum.minor) {
|
|||
|
// Patch is insufficient
|
|||
|
if (this.patch && this.patch < (minimum.patch || 0)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
/**
|
|||
|
* Indicates whether the instance was constructed from a valid version string
|
|||
|
*/
|
|||
|
isValid() {
|
|||
|
return !isNaN(this.major);
|
|||
|
}
|
|||
|
/**
|
|||
|
* Returns the version as a string, e.g. 1.2 or 1.2.3
|
|||
|
*/
|
|||
|
toString() {
|
|||
|
let result = '';
|
|||
|
if (this.isValid()) {
|
|||
|
result = `${this.major}.${this.minor}`;
|
|||
|
if (!isNaN(this.patch)) {
|
|||
|
result += `.${this.patch}`;
|
|||
|
}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
exports.GitVersion = GitVersion;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 562:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
|||
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|||
|
|
|||
|
var osName = _interopDefault(__webpack_require__(2));
|
|||
|
|
|||
|
function getUserAgent() {
|
|||
|
try {
|
|||
|
return `Node.js/${process.version.substr(1)} (${osName()}; ${process.arch})`;
|
|||
|
} catch (error) {
|
|||
|
if (/wmic os get Caption/.test(error.message)) {
|
|||
|
return "Windows <version undetectable>";
|
|||
|
}
|
|||
|
|
|||
|
throw error;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.getUserAgent = getUserAgent;
|
|||
|
//# sourceMappingURL=index.js.map
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 563:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = getPreviousPage
|
|||
|
|
|||
|
const getPage = __webpack_require__(265)
|
|||
|
|
|||
|
function getPreviousPage (octokit, link, headers) {
|
|||
|
return getPage(octokit, link, 'prev', headers)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 568:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
const path = __webpack_require__(622);
|
|||
|
const niceTry = __webpack_require__(948);
|
|||
|
const resolveCommand = __webpack_require__(489);
|
|||
|
const escape = __webpack_require__(462);
|
|||
|
const readShebang = __webpack_require__(389);
|
|||
|
const semver = __webpack_require__(280);
|
|||
|
|
|||
|
const isWin = process.platform === 'win32';
|
|||
|
const isExecutableRegExp = /\.(?:com|exe)$/i;
|
|||
|
const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;
|
|||
|
|
|||
|
// `options.shell` is supported in Node ^4.8.0, ^5.7.0 and >= 6.0.0
|
|||
|
const supportsShellOption = niceTry(() => semver.satisfies(process.version, '^4.8.0 || ^5.7.0 || >= 6.0.0', true)) || false;
|
|||
|
|
|||
|
function detectShebang(parsed) {
|
|||
|
parsed.file = resolveCommand(parsed);
|
|||
|
|
|||
|
const shebang = parsed.file && readShebang(parsed.file);
|
|||
|
|
|||
|
if (shebang) {
|
|||
|
parsed.args.unshift(parsed.file);
|
|||
|
parsed.command = shebang;
|
|||
|
|
|||
|
return resolveCommand(parsed);
|
|||
|
}
|
|||
|
|
|||
|
return parsed.file;
|
|||
|
}
|
|||
|
|
|||
|
function parseNonShell(parsed) {
|
|||
|
if (!isWin) {
|
|||
|
return parsed;
|
|||
|
}
|
|||
|
|
|||
|
// Detect & add support for shebangs
|
|||
|
const commandFile = detectShebang(parsed);
|
|||
|
|
|||
|
// We don't need a shell if the command filename is an executable
|
|||
|
const needsShell = !isExecutableRegExp.test(commandFile);
|
|||
|
|
|||
|
// If a shell is required, use cmd.exe and take care of escaping everything correctly
|
|||
|
// Note that `forceShell` is an hidden option used only in tests
|
|||
|
if (parsed.options.forceShell || needsShell) {
|
|||
|
// Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`
|
|||
|
// The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument
|
|||
|
// Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,
|
|||
|
// we need to double escape them
|
|||
|
const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);
|
|||
|
|
|||
|
// Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar)
|
|||
|
// This is necessary otherwise it will always fail with ENOENT in those cases
|
|||
|
parsed.command = path.normalize(parsed.command);
|
|||
|
|
|||
|
// Escape command & arguments
|
|||
|
parsed.command = escape.command(parsed.command);
|
|||
|
parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));
|
|||
|
|
|||
|
const shellCommand = [parsed.command].concat(parsed.args).join(' ');
|
|||
|
|
|||
|
parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
|
|||
|
parsed.command = process.env.comspec || 'cmd.exe';
|
|||
|
parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
|
|||
|
}
|
|||
|
|
|||
|
return parsed;
|
|||
|
}
|
|||
|
|
|||
|
function parseShell(parsed) {
|
|||
|
// If node supports the shell option, there's no need to mimic its behavior
|
|||
|
if (supportsShellOption) {
|
|||
|
return parsed;
|
|||
|
}
|
|||
|
|
|||
|
// Mimic node shell option
|
|||
|
// See https://github.com/nodejs/node/blob/b9f6a2dc059a1062776133f3d4fd848c4da7d150/lib/child_process.js#L335
|
|||
|
const shellCommand = [parsed.command].concat(parsed.args).join(' ');
|
|||
|
|
|||
|
if (isWin) {
|
|||
|
parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe';
|
|||
|
parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`];
|
|||
|
parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped
|
|||
|
} else {
|
|||
|
if (typeof parsed.options.shell === 'string') {
|
|||
|
parsed.command = parsed.options.shell;
|
|||
|
} else if (process.platform === 'android') {
|
|||
|
parsed.command = '/system/bin/sh';
|
|||
|
} else {
|
|||
|
parsed.command = '/bin/sh';
|
|||
|
}
|
|||
|
|
|||
|
parsed.args = ['-c', shellCommand];
|
|||
|
}
|
|||
|
|
|||
|
return parsed;
|
|||
|
}
|
|||
|
|
|||
|
function parse(command, args, options) {
|
|||
|
// Normalize arguments, similar to nodejs
|
|||
|
if (args && !Array.isArray(args)) {
|
|||
|
options = args;
|
|||
|
args = null;
|
|||
|
}
|
|||
|
|
|||
|
args = args ? args.slice(0) : []; // Clone array to avoid changing the original
|
|||
|
options = Object.assign({}, options); // Clone object to avoid changing the original
|
|||
|
|
|||
|
// Build our parsed object
|
|||
|
const parsed = {
|
|||
|
command,
|
|||
|
args,
|
|||
|
options,
|
|||
|
file: undefined,
|
|||
|
original: {
|
|||
|
command,
|
|||
|
args,
|
|||
|
},
|
|||
|
};
|
|||
|
|
|||
|
// Delegate further parsing to shell or non-shell
|
|||
|
return options.shell ? parseShell(parsed) : parseNonShell(parsed);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = parse;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 577:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = getPageLinks
|
|||
|
|
|||
|
function getPageLinks (link) {
|
|||
|
link = link.link || link.headers.link || ''
|
|||
|
|
|||
|
const links = {}
|
|||
|
|
|||
|
// link format:
|
|||
|
// '<https://api.github.com/users/aseemk/followers?page=2>; rel="next", <https://api.github.com/users/aseemk/followers?page=2>; rel="last"'
|
|||
|
link.replace(/<([^>]*)>;\s*rel="([\w]*)"/g, (m, uri, type) => {
|
|||
|
links[type] = uri
|
|||
|
})
|
|||
|
|
|||
|
return links
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 586:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = octokitRestApiEndpoints;
|
|||
|
|
|||
|
const ROUTES = __webpack_require__(705);
|
|||
|
|
|||
|
function octokitRestApiEndpoints(octokit) {
|
|||
|
// Aliasing scopes for backward compatibility
|
|||
|
// See https://github.com/octokit/rest.js/pull/1134
|
|||
|
ROUTES.gitdata = ROUTES.git;
|
|||
|
ROUTES.authorization = ROUTES.oauthAuthorizations;
|
|||
|
ROUTES.pullRequests = ROUTES.pulls;
|
|||
|
|
|||
|
octokit.registerEndpoints(ROUTES);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 605:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("http");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 613:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
const Octokit = __webpack_require__(529);
|
|||
|
|
|||
|
const CORE_PLUGINS = [
|
|||
|
__webpack_require__(372),
|
|||
|
__webpack_require__(19), // deprecated: remove in v17
|
|||
|
__webpack_require__(190),
|
|||
|
__webpack_require__(148),
|
|||
|
__webpack_require__(309),
|
|||
|
__webpack_require__(248),
|
|||
|
__webpack_require__(586),
|
|||
|
__webpack_require__(430),
|
|||
|
|
|||
|
__webpack_require__(850) // deprecated: remove in v17
|
|||
|
];
|
|||
|
|
|||
|
module.exports = Octokit.plugin(CORE_PLUGINS);
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 614:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("events");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 618:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|||
|
if (mod && mod.__esModule) return mod;
|
|||
|
var result = {};
|
|||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|||
|
result["default"] = mod;
|
|||
|
return result;
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const fs = __importStar(__webpack_require__(747));
|
|||
|
function directoryExistsSync(path, required) {
|
|||
|
if (!path) {
|
|||
|
throw new Error("Arg 'path' must not be empty");
|
|||
|
}
|
|||
|
let stats;
|
|||
|
try {
|
|||
|
stats = fs.statSync(path);
|
|||
|
}
|
|||
|
catch (error) {
|
|||
|
if (error.code === 'ENOENT') {
|
|||
|
if (!required) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
throw new Error(`Directory '${path}' does not exist`);
|
|||
|
}
|
|||
|
throw new Error(`Encountered an error when checking whether path '${path}' exists: ${error.message}`);
|
|||
|
}
|
|||
|
if (stats.isDirectory()) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
else if (!required) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
throw new Error(`Directory '${path}' does not exist`);
|
|||
|
}
|
|||
|
exports.directoryExistsSync = directoryExistsSync;
|
|||
|
function existsSync(path) {
|
|||
|
if (!path) {
|
|||
|
throw new Error("Arg 'path' must not be empty");
|
|||
|
}
|
|||
|
try {
|
|||
|
fs.statSync(path);
|
|||
|
}
|
|||
|
catch (error) {
|
|||
|
if (error.code === 'ENOENT') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
throw new Error(`Encountered an error when checking whether path '${path}' exists: ${error.message}`);
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
exports.existsSync = existsSync;
|
|||
|
function fileExistsSync(path) {
|
|||
|
if (!path) {
|
|||
|
throw new Error("Arg 'path' must not be empty");
|
|||
|
}
|
|||
|
let stats;
|
|||
|
try {
|
|||
|
stats = fs.statSync(path);
|
|||
|
}
|
|||
|
catch (error) {
|
|||
|
if (error.code === 'ENOENT') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
throw new Error(`Encountered an error when checking whether path '${path}' exists: ${error.message}`);
|
|||
|
}
|
|||
|
if (!stats.isDirectory()) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
exports.fileExistsSync = fileExistsSync;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 619:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
|||
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|||
|
|
|||
|
var osName = _interopDefault(__webpack_require__(2));
|
|||
|
|
|||
|
function getUserAgent() {
|
|||
|
try {
|
|||
|
return `Node.js/${process.version.substr(1)} (${osName()}; ${process.arch})`;
|
|||
|
} catch (error) {
|
|||
|
if (/wmic os get Caption/.test(error.message)) {
|
|||
|
return "Windows <version undetectable>";
|
|||
|
}
|
|||
|
|
|||
|
throw error;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
exports.getUserAgent = getUserAgent;
|
|||
|
//# sourceMappingURL=index.js.map
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 621:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
const path = __webpack_require__(622);
|
|||
|
const pathKey = __webpack_require__(39);
|
|||
|
|
|||
|
module.exports = opts => {
|
|||
|
opts = Object.assign({
|
|||
|
cwd: process.cwd(),
|
|||
|
path: process.env[pathKey()]
|
|||
|
}, opts);
|
|||
|
|
|||
|
let prev;
|
|||
|
let pth = path.resolve(opts.cwd);
|
|||
|
const ret = [];
|
|||
|
|
|||
|
while (prev !== pth) {
|
|||
|
ret.push(path.join(pth, 'node_modules/.bin'));
|
|||
|
prev = pth;
|
|||
|
pth = path.resolve(pth, '..');
|
|||
|
}
|
|||
|
|
|||
|
// ensure the running `node` binary is used
|
|||
|
ret.push(path.dirname(process.execPath));
|
|||
|
|
|||
|
return ret.concat(opts.path).join(path.delimiter);
|
|||
|
};
|
|||
|
|
|||
|
module.exports.env = opts => {
|
|||
|
opts = Object.assign({
|
|||
|
env: process.env
|
|||
|
}, opts);
|
|||
|
|
|||
|
const env = Object.assign({}, opts.env);
|
|||
|
const path = pathKey({env});
|
|||
|
|
|||
|
opts.path = env[path];
|
|||
|
env[path] = module.exports(opts);
|
|||
|
|
|||
|
return env;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 622:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("path");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 649:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = getLastPage
|
|||
|
|
|||
|
const getPage = __webpack_require__(265)
|
|||
|
|
|||
|
function getLastPage (octokit, link, headers) {
|
|||
|
return getPage(octokit, link, 'last', headers)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 654:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
// This is not the set of all possible signals.
|
|||
|
//
|
|||
|
// It IS, however, the set of all signals that trigger
|
|||
|
// an exit on either Linux or BSD systems. Linux is a
|
|||
|
// superset of the signal names supported on BSD, and
|
|||
|
// the unknown signals just fail to register, so we can
|
|||
|
// catch that easily enough.
|
|||
|
//
|
|||
|
// Don't bother with SIGKILL. It's uncatchable, which
|
|||
|
// means that we can't fire any callbacks anyway.
|
|||
|
//
|
|||
|
// If a user does happen to register a handler on a non-
|
|||
|
// fatal signal like SIGWINCH or something, and then
|
|||
|
// exit, it'll end up firing `process.emit('exit')`, so
|
|||
|
// the handler will be fired anyway.
|
|||
|
//
|
|||
|
// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised
|
|||
|
// artificially, inherently leave the process in a
|
|||
|
// state from which it is not safe to try and enter JS
|
|||
|
// listeners.
|
|||
|
module.exports = [
|
|||
|
'SIGABRT',
|
|||
|
'SIGALRM',
|
|||
|
'SIGHUP',
|
|||
|
'SIGINT',
|
|||
|
'SIGTERM'
|
|||
|
]
|
|||
|
|
|||
|
if (process.platform !== 'win32') {
|
|||
|
module.exports.push(
|
|||
|
'SIGVTALRM',
|
|||
|
'SIGXCPU',
|
|||
|
'SIGXFSZ',
|
|||
|
'SIGUSR2',
|
|||
|
'SIGTRAP',
|
|||
|
'SIGSYS',
|
|||
|
'SIGQUIT',
|
|||
|
'SIGIOT'
|
|||
|
// should detect profiler and enable/disable accordingly.
|
|||
|
// see #21
|
|||
|
// 'SIGPROF'
|
|||
|
)
|
|||
|
}
|
|||
|
|
|||
|
if (process.platform === 'linux') {
|
|||
|
module.exports.push(
|
|||
|
'SIGIO',
|
|||
|
'SIGPOLL',
|
|||
|
'SIGPWR',
|
|||
|
'SIGSTKFLT',
|
|||
|
'SIGUNUSED'
|
|||
|
)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 669:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("util");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 672:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
var _a;
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const assert_1 = __webpack_require__(357);
|
|||
|
const fs = __webpack_require__(747);
|
|||
|
const path = __webpack_require__(622);
|
|||
|
_a = fs.promises, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink;
|
|||
|
exports.IS_WINDOWS = process.platform === 'win32';
|
|||
|
function exists(fsPath) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
try {
|
|||
|
yield exports.stat(fsPath);
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
if (err.code === 'ENOENT') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
throw err;
|
|||
|
}
|
|||
|
return true;
|
|||
|
});
|
|||
|
}
|
|||
|
exports.exists = exists;
|
|||
|
function isDirectory(fsPath, useStat = false) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath);
|
|||
|
return stats.isDirectory();
|
|||
|
});
|
|||
|
}
|
|||
|
exports.isDirectory = isDirectory;
|
|||
|
/**
|
|||
|
* On OSX/Linux, true if path starts with '/'. On Windows, true for paths like:
|
|||
|
* \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases).
|
|||
|
*/
|
|||
|
function isRooted(p) {
|
|||
|
p = normalizeSeparators(p);
|
|||
|
if (!p) {
|
|||
|
throw new Error('isRooted() parameter "p" cannot be empty');
|
|||
|
}
|
|||
|
if (exports.IS_WINDOWS) {
|
|||
|
return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello
|
|||
|
); // e.g. C: or C:\hello
|
|||
|
}
|
|||
|
return p.startsWith('/');
|
|||
|
}
|
|||
|
exports.isRooted = isRooted;
|
|||
|
/**
|
|||
|
* Recursively create a directory at `fsPath`.
|
|||
|
*
|
|||
|
* This implementation is optimistic, meaning it attempts to create the full
|
|||
|
* path first, and backs up the path stack from there.
|
|||
|
*
|
|||
|
* @param fsPath The path to create
|
|||
|
* @param maxDepth The maximum recursion depth
|
|||
|
* @param depth The current recursion depth
|
|||
|
*/
|
|||
|
function mkdirP(fsPath, maxDepth = 1000, depth = 1) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
assert_1.ok(fsPath, 'a path argument must be provided');
|
|||
|
fsPath = path.resolve(fsPath);
|
|||
|
if (depth >= maxDepth)
|
|||
|
return exports.mkdir(fsPath);
|
|||
|
try {
|
|||
|
yield exports.mkdir(fsPath);
|
|||
|
return;
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
switch (err.code) {
|
|||
|
case 'ENOENT': {
|
|||
|
yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1);
|
|||
|
yield exports.mkdir(fsPath);
|
|||
|
return;
|
|||
|
}
|
|||
|
default: {
|
|||
|
let stats;
|
|||
|
try {
|
|||
|
stats = yield exports.stat(fsPath);
|
|||
|
}
|
|||
|
catch (err2) {
|
|||
|
throw err;
|
|||
|
}
|
|||
|
if (!stats.isDirectory())
|
|||
|
throw err;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
exports.mkdirP = mkdirP;
|
|||
|
/**
|
|||
|
* Best effort attempt to determine whether a file exists and is executable.
|
|||
|
* @param filePath file path to check
|
|||
|
* @param extensions additional file extensions to try
|
|||
|
* @return if file exists and is executable, returns the file path. otherwise empty string.
|
|||
|
*/
|
|||
|
function tryGetExecutablePath(filePath, extensions) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
let stats = undefined;
|
|||
|
try {
|
|||
|
// test file exists
|
|||
|
stats = yield exports.stat(filePath);
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
if (err.code !== 'ENOENT') {
|
|||
|
// eslint-disable-next-line no-console
|
|||
|
console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
|
|||
|
}
|
|||
|
}
|
|||
|
if (stats && stats.isFile()) {
|
|||
|
if (exports.IS_WINDOWS) {
|
|||
|
// on Windows, test for valid extension
|
|||
|
const upperExt = path.extname(filePath).toUpperCase();
|
|||
|
if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) {
|
|||
|
return filePath;
|
|||
|
}
|
|||
|
}
|
|||
|
else {
|
|||
|
if (isUnixExecutable(stats)) {
|
|||
|
return filePath;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
// try each extension
|
|||
|
const originalFilePath = filePath;
|
|||
|
for (const extension of extensions) {
|
|||
|
filePath = originalFilePath + extension;
|
|||
|
stats = undefined;
|
|||
|
try {
|
|||
|
stats = yield exports.stat(filePath);
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
if (err.code !== 'ENOENT') {
|
|||
|
// eslint-disable-next-line no-console
|
|||
|
console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`);
|
|||
|
}
|
|||
|
}
|
|||
|
if (stats && stats.isFile()) {
|
|||
|
if (exports.IS_WINDOWS) {
|
|||
|
// preserve the case of the actual file (since an extension was appended)
|
|||
|
try {
|
|||
|
const directory = path.dirname(filePath);
|
|||
|
const upperName = path.basename(filePath).toUpperCase();
|
|||
|
for (const actualName of yield exports.readdir(directory)) {
|
|||
|
if (upperName === actualName.toUpperCase()) {
|
|||
|
filePath = path.join(directory, actualName);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
catch (err) {
|
|||
|
// eslint-disable-next-line no-console
|
|||
|
console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`);
|
|||
|
}
|
|||
|
return filePath;
|
|||
|
}
|
|||
|
else {
|
|||
|
if (isUnixExecutable(stats)) {
|
|||
|
return filePath;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return '';
|
|||
|
});
|
|||
|
}
|
|||
|
exports.tryGetExecutablePath = tryGetExecutablePath;
|
|||
|
function normalizeSeparators(p) {
|
|||
|
p = p || '';
|
|||
|
if (exports.IS_WINDOWS) {
|
|||
|
// convert slashes on Windows
|
|||
|
p = p.replace(/\//g, '\\');
|
|||
|
// remove redundant slashes
|
|||
|
return p.replace(/\\\\+/g, '\\');
|
|||
|
}
|
|||
|
// remove redundant slashes
|
|||
|
return p.replace(/\/\/+/g, '/');
|
|||
|
}
|
|||
|
// on Mac/Linux, test the execute bit
|
|||
|
// R W X R W X R W X
|
|||
|
// 256 128 64 32 16 8 4 2 1
|
|||
|
function isUnixExecutable(stats) {
|
|||
|
return ((stats.mode & 1) > 0 ||
|
|||
|
((stats.mode & 8) > 0 && stats.gid === process.getgid()) ||
|
|||
|
((stats.mode & 64) > 0 && stats.uid === process.getuid()));
|
|||
|
}
|
|||
|
//# sourceMappingURL=io-util.js.map
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 674:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = authenticate;
|
|||
|
|
|||
|
const { Deprecation } = __webpack_require__(692);
|
|||
|
const once = __webpack_require__(969);
|
|||
|
|
|||
|
const deprecateAuthenticate = once((log, deprecation) => log.warn(deprecation));
|
|||
|
|
|||
|
function authenticate(state, options) {
|
|||
|
deprecateAuthenticate(
|
|||
|
state.octokit.log,
|
|||
|
new Deprecation(
|
|||
|
'[@octokit/rest] octokit.authenticate() is deprecated. Use "auth" constructor option instead.'
|
|||
|
)
|
|||
|
);
|
|||
|
|
|||
|
if (!options) {
|
|||
|
state.auth = false;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
switch (options.type) {
|
|||
|
case "basic":
|
|||
|
if (!options.username || !options.password) {
|
|||
|
throw new Error(
|
|||
|
"Basic authentication requires both a username and password to be set"
|
|||
|
);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case "oauth":
|
|||
|
if (!options.token && !(options.key && options.secret)) {
|
|||
|
throw new Error(
|
|||
|
"OAuth2 authentication requires a token or key & secret to be set"
|
|||
|
);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case "token":
|
|||
|
case "app":
|
|||
|
if (!options.token) {
|
|||
|
throw new Error("Token authentication requires a token to be set");
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
throw new Error(
|
|||
|
"Invalid authentication type, must be 'basic', 'oauth', 'token' or 'app'"
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
state.auth = options;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 675:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = function btoa(str) {
|
|||
|
return new Buffer(str).toString('base64')
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 692:
|
|||
|
/***/ (function(__unusedmodule, exports) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
|||
|
class Deprecation extends Error {
|
|||
|
constructor(message) {
|
|||
|
super(message); // Maintains proper stack trace (only available on V8)
|
|||
|
|
|||
|
/* istanbul ignore next */
|
|||
|
|
|||
|
if (Error.captureStackTrace) {
|
|||
|
Error.captureStackTrace(this, this.constructor);
|
|||
|
}
|
|||
|
|
|||
|
this.name = 'Deprecation';
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
exports.Deprecation = Deprecation;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 696:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
/*!
|
|||
|
* isobject <https://github.com/jonschlinkert/isobject>
|
|||
|
*
|
|||
|
* Copyright (c) 2014-2017, Jon Schlinkert.
|
|||
|
* Released under the MIT License.
|
|||
|
*/
|
|||
|
|
|||
|
function isObject(val) {
|
|||
|
return val != null && typeof val === 'object' && Array.isArray(val) === false;
|
|||
|
}
|
|||
|
|
|||
|
/*!
|
|||
|
* is-plain-object <https://github.com/jonschlinkert/is-plain-object>
|
|||
|
*
|
|||
|
* Copyright (c) 2014-2017, Jon Schlinkert.
|
|||
|
* Released under the MIT License.
|
|||
|
*/
|
|||
|
|
|||
|
function isObjectObject(o) {
|
|||
|
return isObject(o) === true
|
|||
|
&& Object.prototype.toString.call(o) === '[object Object]';
|
|||
|
}
|
|||
|
|
|||
|
function isPlainObject(o) {
|
|||
|
var ctor,prot;
|
|||
|
|
|||
|
if (isObjectObject(o) === false) return false;
|
|||
|
|
|||
|
// If has modified constructor
|
|||
|
ctor = o.constructor;
|
|||
|
if (typeof ctor !== 'function') return false;
|
|||
|
|
|||
|
// If has modified prototype
|
|||
|
prot = ctor.prototype;
|
|||
|
if (isObjectObject(prot) === false) return false;
|
|||
|
|
|||
|
// If constructor does not have an Object-specific method
|
|||
|
if (prot.hasOwnProperty('isPrototypeOf') === false) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// Most likely a plain Object
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = isPlainObject;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 697:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
module.exports = (promise, onFinally) => {
|
|||
|
onFinally = onFinally || (() => {});
|
|||
|
|
|||
|
return promise.then(
|
|||
|
val => new Promise(resolve => {
|
|||
|
resolve(onFinally());
|
|||
|
}).then(() => val),
|
|||
|
err => new Promise(resolve => {
|
|||
|
resolve(onFinally());
|
|||
|
}).then(() => {
|
|||
|
throw err;
|
|||
|
})
|
|||
|
);
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 705:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = {"activity":{"checkStarringRepo":{"method":"GET","params":{"owner":{"required":true,"type":"string"},"repo":{"required":true,"type":"string"}},"url":"/user/starred/:owner/:repo"},"deleteRepoSubscription":{"method":"DELETE","params":{"owner":{"required":true,"type":"string"},"repo":{"required":true,"type":"string"}},"url":"/repos/:owner/:repo/subscription"},"deleteThreadSubscription":{"method":"DELETE","params":{"thread_id":{"required":true,"type":"integer"}},"url":"/notifications/threads/:thread_id/subscription"},"getRepoSubscription":{"method":"GET","params":{"owner":{"required":true,"type":"string"},"repo":{"required":true,"type":"string"}},"url":"/repos/:owner/:repo/subscription"},"getThread":{"method":"GET","params":{"thread_id":{"required":true,"type":"integer"}},"url":"/notifications/threads/:thread_id"},"getThreadSubscription":{"method":"GET","params":{"thread_id":{"required":true,"type":"integer"}},"url":"/notifications/threads/:thread_id/subscription"},"listEventsForOrg":{"method":"GET","params":{"org":{"required":true,"type":"string"},"page":{"type":"integer"},"per_page":{"type":"integer"},"username":{"required":true,"type":"string"}},"url":"/users/:username/events/orgs/:org"},"listEventsForUser":{"method":"GET","params":{"page":{"type":"integer"},"per_page":{"type":"integer"},"username":{"required":true,"type":"string"}},"url":"/users/:username/events"},"listFeeds":{"method":"GET","params":{},"url":"/feeds"},"listNotifications":{"method":"GET","params":{"all":{"type":"boolean"},"before":{"type":"string"},"page":{"type":"integer"},"participating":{"type":"boolean"},"per_page":{"type":"integer"},"since":{"type":"string"}},"url":"/notifications"},"listNotificationsForRepo":{"method":"GET","params":{"all":{"type":"boolean"},"before":{"type":"string"},"owner":{"required":true,"type":"string"},"page":{"type":"integer"},"participating":{"type":"boolean"},"per_page":{"type":"integer"},"repo":{"required":true,"type":"string"},"since":{"type":"string"}},"url":"/repos/:owner/:repo/notifications"},"listPublicEvents":{"method":"GET","params":{"page":{"type":"integer"},"per_page":{"type":"integer"}},"url":"/events"},"listPublicEventsForOrg":{"method":"GET","params":{"org":{"required":true,"type":"string"},"page":{"type":"integer"},"per_page":{"type":"integer"}},"url":"/orgs/:org/events"},"listPublicEventsForRepoNetwork":{"method":"GET","params":{"owner":{"required":true,"type":"string"},"page":{"type":"integer"},"per_page":{"type":"integer"},"repo":{"required":true,"type":"string"}},"url":"/networks/:owner/:repo/events"},"listPublicEventsForUser":{"method":"GET","params":{"page":{"type":"integer"},"per_page":{"type":"integer"},"username":{"required":true,"type":"string"}},"url":"/users/:username/events/public"},"listReceivedEventsForUser":{"method":"GET","params":{"page":{"type":"integer"},"per_page":{"type":"integer"},"username":{"required":true,"type":"string"}},"url":"/users/:username/received_events"},"listReceivedPublicEventsForUser":{"method":"GET","params":{"page":{"type":"integer"},"per_page":{"type":"integer"},"username":{"required":true,"type":"string"}},"url":"/users/:username/received_events/public"},"listRepoEvents":{"method":"GET","params":{"owner":{"required":true,"type":"string"},"page":{"type":"integer"},"per_page":{"type":"integer"},"repo":{"required":true,"type":"string"}},"url":"/repos/:owner/:repo/events"},"listReposStarredByAuthenticatedUser":{"method":"GET","params":{"direction":{"enum":["asc","desc"],"type":"string"},"page":{"type":"integer"},"per_page":{"type":"integer"},"sort":{"enum":["created","updated"],"type":"string"}},"url":"/user/starred"},"listReposStarredByUser":{"method":"GET","params":{"direction":{"enum":["asc","desc"],"type":"string"},"page":{"type":"integer"},"per_page":{"type":"integer"},"sort":{"enum":["created","updated"],"type":"string"},"username":{"required":true,"type":"string"}},"url":"/users/:username/starred"},"listReposWatchedByUser":{"method":"GET","params":{"page":{"type":"integer"},"per_page":{"type":"integer"},"username":{"required":true,"type":"string
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 742:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
var fs = __webpack_require__(747)
|
|||
|
var core
|
|||
|
if (process.platform === 'win32' || global.TESTING_WINDOWS) {
|
|||
|
core = __webpack_require__(818)
|
|||
|
} else {
|
|||
|
core = __webpack_require__(197)
|
|||
|
}
|
|||
|
|
|||
|
module.exports = isexe
|
|||
|
isexe.sync = sync
|
|||
|
|
|||
|
function isexe (path, options, cb) {
|
|||
|
if (typeof options === 'function') {
|
|||
|
cb = options
|
|||
|
options = {}
|
|||
|
}
|
|||
|
|
|||
|
if (!cb) {
|
|||
|
if (typeof Promise !== 'function') {
|
|||
|
throw new TypeError('callback not provided')
|
|||
|
}
|
|||
|
|
|||
|
return new Promise(function (resolve, reject) {
|
|||
|
isexe(path, options || {}, function (er, is) {
|
|||
|
if (er) {
|
|||
|
reject(er)
|
|||
|
} else {
|
|||
|
resolve(is)
|
|||
|
}
|
|||
|
})
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
core(path, options || {}, function (er, is) {
|
|||
|
// ignore EACCES because that just means we aren't allowed to run it
|
|||
|
if (er) {
|
|||
|
if (er.code === 'EACCES' || options && options.ignoreErrors) {
|
|||
|
er = null
|
|||
|
is = false
|
|||
|
}
|
|||
|
}
|
|||
|
cb(er, is)
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
function sync (path, options) {
|
|||
|
// my kingdom for a filtered catch
|
|||
|
try {
|
|||
|
return core.sync(path, options || {})
|
|||
|
} catch (er) {
|
|||
|
if (options && options.ignoreErrors || er.code === 'EACCES') {
|
|||
|
return false
|
|||
|
} else {
|
|||
|
throw er
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 747:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("fs");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 753:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|||
|
|
|||
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|||
|
|
|||
|
var endpoint = __webpack_require__(385);
|
|||
|
var universalUserAgent = __webpack_require__(211);
|
|||
|
var isPlainObject = _interopDefault(__webpack_require__(696));
|
|||
|
var nodeFetch = _interopDefault(__webpack_require__(454));
|
|||
|
var requestError = __webpack_require__(463);
|
|||
|
|
|||
|
const VERSION = "0.0.0-development";
|
|||
|
|
|||
|
function getBufferResponse(response) {
|
|||
|
return response.arrayBuffer();
|
|||
|
}
|
|||
|
|
|||
|
function fetchWrapper(requestOptions) {
|
|||
|
if (isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) {
|
|||
|
requestOptions.body = JSON.stringify(requestOptions.body);
|
|||
|
}
|
|||
|
|
|||
|
let headers = {};
|
|||
|
let status;
|
|||
|
let url;
|
|||
|
const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch;
|
|||
|
return fetch(requestOptions.url, Object.assign({
|
|||
|
method: requestOptions.method,
|
|||
|
body: requestOptions.body,
|
|||
|
headers: requestOptions.headers,
|
|||
|
redirect: requestOptions.redirect
|
|||
|
}, requestOptions.request)).then(response => {
|
|||
|
url = response.url;
|
|||
|
status = response.status;
|
|||
|
|
|||
|
for (const keyAndValue of response.headers) {
|
|||
|
headers[keyAndValue[0]] = keyAndValue[1];
|
|||
|
}
|
|||
|
|
|||
|
if (status === 204 || status === 205) {
|
|||
|
return;
|
|||
|
} // GitHub API returns 200 for HEAD requsets
|
|||
|
|
|||
|
|
|||
|
if (requestOptions.method === "HEAD") {
|
|||
|
if (status < 400) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
throw new requestError.RequestError(response.statusText, status, {
|
|||
|
headers,
|
|||
|
request: requestOptions
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (status === 304) {
|
|||
|
throw new requestError.RequestError("Not modified", status, {
|
|||
|
headers,
|
|||
|
request: requestOptions
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (status >= 400) {
|
|||
|
return response.text().then(message => {
|
|||
|
const error = new requestError.RequestError(message, status, {
|
|||
|
headers,
|
|||
|
request: requestOptions
|
|||
|
});
|
|||
|
|
|||
|
try {
|
|||
|
Object.assign(error, JSON.parse(error.message));
|
|||
|
} catch (e) {// ignore, see octokit/rest.js#684
|
|||
|
}
|
|||
|
|
|||
|
throw error;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
const contentType = response.headers.get("content-type");
|
|||
|
|
|||
|
if (/application\/json/.test(contentType)) {
|
|||
|
return response.json();
|
|||
|
}
|
|||
|
|
|||
|
if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) {
|
|||
|
return response.text();
|
|||
|
}
|
|||
|
|
|||
|
return getBufferResponse(response);
|
|||
|
}).then(data => {
|
|||
|
return {
|
|||
|
status,
|
|||
|
url,
|
|||
|
headers,
|
|||
|
data
|
|||
|
};
|
|||
|
}).catch(error => {
|
|||
|
if (error instanceof requestError.RequestError) {
|
|||
|
throw error;
|
|||
|
}
|
|||
|
|
|||
|
throw new requestError.RequestError(error.message, 500, {
|
|||
|
headers,
|
|||
|
request: requestOptions
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function withDefaults(oldEndpoint, newDefaults) {
|
|||
|
const endpoint = oldEndpoint.defaults(newDefaults);
|
|||
|
|
|||
|
const newApi = function (route, parameters) {
|
|||
|
const endpointOptions = endpoint.merge(route, parameters);
|
|||
|
|
|||
|
if (!endpointOptions.request || !endpointOptions.request.hook) {
|
|||
|
return fetchWrapper(endpoint.parse(endpointOptions));
|
|||
|
}
|
|||
|
|
|||
|
const request = (route, parameters) => {
|
|||
|
return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters)));
|
|||
|
};
|
|||
|
|
|||
|
Object.assign(request, {
|
|||
|
endpoint,
|
|||
|
defaults: withDefaults.bind(null, endpoint)
|
|||
|
});
|
|||
|
return endpointOptions.request.hook(request, endpointOptions);
|
|||
|
};
|
|||
|
|
|||
|
return Object.assign(newApi, {
|
|||
|
endpoint,
|
|||
|
defaults: withDefaults.bind(null, endpoint)
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
const request = withDefaults(endpoint.endpoint, {
|
|||
|
headers: {
|
|||
|
"user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}`
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
exports.request = request;
|
|||
|
//# sourceMappingURL=index.js.map
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 761:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("zlib");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 763:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = removeHook
|
|||
|
|
|||
|
function removeHook (state, name, method) {
|
|||
|
if (!state.registry[name]) {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
var index = state.registry[name]
|
|||
|
.map(function (registered) { return registered.orig })
|
|||
|
.indexOf(method)
|
|||
|
|
|||
|
if (index === -1) {
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
state.registry[name].splice(index, 1)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 768:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
module.exports = function (x) {
|
|||
|
var lf = typeof x === 'string' ? '\n' : '\n'.charCodeAt();
|
|||
|
var cr = typeof x === 'string' ? '\r' : '\r'.charCodeAt();
|
|||
|
|
|||
|
if (x[x.length - 1] === lf) {
|
|||
|
x = x.slice(0, x.length - 1);
|
|||
|
}
|
|||
|
|
|||
|
if (x[x.length - 1] === cr) {
|
|||
|
x = x.slice(0, x.length - 1);
|
|||
|
}
|
|||
|
|
|||
|
return x;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 777:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = getFirstPage
|
|||
|
|
|||
|
const getPage = __webpack_require__(265)
|
|||
|
|
|||
|
function getFirstPage (octokit, link, headers) {
|
|||
|
return getPage(octokit, link, 'first', headers)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 807:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = paginate;
|
|||
|
|
|||
|
const iterator = __webpack_require__(8);
|
|||
|
|
|||
|
function paginate(octokit, route, options, mapFn) {
|
|||
|
if (typeof options === "function") {
|
|||
|
mapFn = options;
|
|||
|
options = undefined;
|
|||
|
}
|
|||
|
options = octokit.request.endpoint.merge(route, options);
|
|||
|
return gather(
|
|||
|
octokit,
|
|||
|
[],
|
|||
|
iterator(octokit, options)[Symbol.asyncIterator](),
|
|||
|
mapFn
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
function gather(octokit, results, iterator, mapFn) {
|
|||
|
return iterator.next().then(result => {
|
|||
|
if (result.done) {
|
|||
|
return results;
|
|||
|
}
|
|||
|
|
|||
|
let earlyExit = false;
|
|||
|
function done() {
|
|||
|
earlyExit = true;
|
|||
|
}
|
|||
|
|
|||
|
results = results.concat(
|
|||
|
mapFn ? mapFn(result.value, done) : result.value.data
|
|||
|
);
|
|||
|
|
|||
|
if (earlyExit) {
|
|||
|
return results;
|
|||
|
}
|
|||
|
|
|||
|
return gather(octokit, results, iterator, mapFn);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 814:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = which
|
|||
|
which.sync = whichSync
|
|||
|
|
|||
|
var isWindows = process.platform === 'win32' ||
|
|||
|
process.env.OSTYPE === 'cygwin' ||
|
|||
|
process.env.OSTYPE === 'msys'
|
|||
|
|
|||
|
var path = __webpack_require__(622)
|
|||
|
var COLON = isWindows ? ';' : ':'
|
|||
|
var isexe = __webpack_require__(742)
|
|||
|
|
|||
|
function getNotFoundError (cmd) {
|
|||
|
var er = new Error('not found: ' + cmd)
|
|||
|
er.code = 'ENOENT'
|
|||
|
|
|||
|
return er
|
|||
|
}
|
|||
|
|
|||
|
function getPathInfo (cmd, opt) {
|
|||
|
var colon = opt.colon || COLON
|
|||
|
var pathEnv = opt.path || process.env.PATH || ''
|
|||
|
var pathExt = ['']
|
|||
|
|
|||
|
pathEnv = pathEnv.split(colon)
|
|||
|
|
|||
|
var pathExtExe = ''
|
|||
|
if (isWindows) {
|
|||
|
pathEnv.unshift(process.cwd())
|
|||
|
pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM')
|
|||
|
pathExt = pathExtExe.split(colon)
|
|||
|
|
|||
|
|
|||
|
// Always test the cmd itself first. isexe will check to make sure
|
|||
|
// it's found in the pathExt set.
|
|||
|
if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')
|
|||
|
pathExt.unshift('')
|
|||
|
}
|
|||
|
|
|||
|
// If it has a slash, then we don't bother searching the pathenv.
|
|||
|
// just check the file itself, and that's it.
|
|||
|
if (cmd.match(/\//) || isWindows && cmd.match(/\\/))
|
|||
|
pathEnv = ['']
|
|||
|
|
|||
|
return {
|
|||
|
env: pathEnv,
|
|||
|
ext: pathExt,
|
|||
|
extExe: pathExtExe
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function which (cmd, opt, cb) {
|
|||
|
if (typeof opt === 'function') {
|
|||
|
cb = opt
|
|||
|
opt = {}
|
|||
|
}
|
|||
|
|
|||
|
var info = getPathInfo(cmd, opt)
|
|||
|
var pathEnv = info.env
|
|||
|
var pathExt = info.ext
|
|||
|
var pathExtExe = info.extExe
|
|||
|
var found = []
|
|||
|
|
|||
|
;(function F (i, l) {
|
|||
|
if (i === l) {
|
|||
|
if (opt.all && found.length)
|
|||
|
return cb(null, found)
|
|||
|
else
|
|||
|
return cb(getNotFoundError(cmd))
|
|||
|
}
|
|||
|
|
|||
|
var pathPart = pathEnv[i]
|
|||
|
if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"')
|
|||
|
pathPart = pathPart.slice(1, -1)
|
|||
|
|
|||
|
var p = path.join(pathPart, cmd)
|
|||
|
if (!pathPart && (/^\.[\\\/]/).test(cmd)) {
|
|||
|
p = cmd.slice(0, 2) + p
|
|||
|
}
|
|||
|
;(function E (ii, ll) {
|
|||
|
if (ii === ll) return F(i + 1, l)
|
|||
|
var ext = pathExt[ii]
|
|||
|
isexe(p + ext, { pathExt: pathExtExe }, function (er, is) {
|
|||
|
if (!er && is) {
|
|||
|
if (opt.all)
|
|||
|
found.push(p + ext)
|
|||
|
else
|
|||
|
return cb(null, p + ext)
|
|||
|
}
|
|||
|
return E(ii + 1, ll)
|
|||
|
})
|
|||
|
})(0, pathExt.length)
|
|||
|
})(0, pathEnv.length)
|
|||
|
}
|
|||
|
|
|||
|
function whichSync (cmd, opt) {
|
|||
|
opt = opt || {}
|
|||
|
|
|||
|
var info = getPathInfo(cmd, opt)
|
|||
|
var pathEnv = info.env
|
|||
|
var pathExt = info.ext
|
|||
|
var pathExtExe = info.extExe
|
|||
|
var found = []
|
|||
|
|
|||
|
for (var i = 0, l = pathEnv.length; i < l; i ++) {
|
|||
|
var pathPart = pathEnv[i]
|
|||
|
if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"')
|
|||
|
pathPart = pathPart.slice(1, -1)
|
|||
|
|
|||
|
var p = path.join(pathPart, cmd)
|
|||
|
if (!pathPart && /^\.[\\\/]/.test(cmd)) {
|
|||
|
p = cmd.slice(0, 2) + p
|
|||
|
}
|
|||
|
for (var j = 0, ll = pathExt.length; j < ll; j ++) {
|
|||
|
var cur = p + pathExt[j]
|
|||
|
var is
|
|||
|
try {
|
|||
|
is = isexe.sync(cur, { pathExt: pathExtExe })
|
|||
|
if (is) {
|
|||
|
if (opt.all)
|
|||
|
found.push(cur)
|
|||
|
else
|
|||
|
return cur
|
|||
|
}
|
|||
|
} catch (ex) {}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (opt.all && found.length)
|
|||
|
return found
|
|||
|
|
|||
|
if (opt.nothrow)
|
|||
|
return null
|
|||
|
|
|||
|
throw getNotFoundError(cmd)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 816:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
module.exports = /^#!.*/;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 818:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = isexe
|
|||
|
isexe.sync = sync
|
|||
|
|
|||
|
var fs = __webpack_require__(747)
|
|||
|
|
|||
|
function checkPathExt (path, options) {
|
|||
|
var pathext = options.pathExt !== undefined ?
|
|||
|
options.pathExt : process.env.PATHEXT
|
|||
|
|
|||
|
if (!pathext) {
|
|||
|
return true
|
|||
|
}
|
|||
|
|
|||
|
pathext = pathext.split(';')
|
|||
|
if (pathext.indexOf('') !== -1) {
|
|||
|
return true
|
|||
|
}
|
|||
|
for (var i = 0; i < pathext.length; i++) {
|
|||
|
var p = pathext[i].toLowerCase()
|
|||
|
if (p && path.substr(-p.length).toLowerCase() === p) {
|
|||
|
return true
|
|||
|
}
|
|||
|
}
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
function checkStat (stat, path, options) {
|
|||
|
if (!stat.isSymbolicLink() && !stat.isFile()) {
|
|||
|
return false
|
|||
|
}
|
|||
|
return checkPathExt(path, options)
|
|||
|
}
|
|||
|
|
|||
|
function isexe (path, options, cb) {
|
|||
|
fs.stat(path, function (er, stat) {
|
|||
|
cb(er, er ? false : checkStat(stat, path, options))
|
|||
|
})
|
|||
|
}
|
|||
|
|
|||
|
function sync (path, options) {
|
|||
|
return checkStat(fs.statSync(path), path, options)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 821:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|||
|
if (mod && mod.__esModule) return mod;
|
|||
|
var result = {};
|
|||
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|||
|
result["default"] = mod;
|
|||
|
return result;
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const core = __importStar(__webpack_require__(470));
|
|||
|
const fsHelper = __importStar(__webpack_require__(618));
|
|||
|
const github = __importStar(__webpack_require__(469));
|
|||
|
const path = __importStar(__webpack_require__(622));
|
|||
|
function getInputs() {
|
|||
|
const result = {};
|
|||
|
// GitHub workspace
|
|||
|
let githubWorkspacePath = process.env['GITHUB_WORKSPACE'];
|
|||
|
if (!githubWorkspacePath) {
|
|||
|
throw new Error('GITHUB_WORKSPACE not defined');
|
|||
|
}
|
|||
|
githubWorkspacePath = path.resolve(githubWorkspacePath);
|
|||
|
core.debug(`GITHUB_WORKSPACE = '${githubWorkspacePath}'`);
|
|||
|
fsHelper.directoryExistsSync(githubWorkspacePath, true);
|
|||
|
// Qualified repository
|
|||
|
const qualifiedRepository = core.getInput('repository') ||
|
|||
|
`${github.context.repo.owner}/${github.context.repo.repo}`;
|
|||
|
core.debug(`qualified repository = '${qualifiedRepository}'`);
|
|||
|
const splitRepository = qualifiedRepository.split('/');
|
|||
|
if (splitRepository.length !== 2 ||
|
|||
|
!splitRepository[0] ||
|
|||
|
!splitRepository[1]) {
|
|||
|
throw new Error(`Invalid repository '${qualifiedRepository}'. Expected format {owner}/{repo}.`);
|
|||
|
}
|
|||
|
result.repositoryOwner = splitRepository[0];
|
|||
|
result.repositoryName = splitRepository[1];
|
|||
|
// Repository path
|
|||
|
result.repositoryPath = core.getInput('path') || '.';
|
|||
|
result.repositoryPath = path.resolve(githubWorkspacePath, result.repositoryPath);
|
|||
|
if (!(result.repositoryPath + path.sep).startsWith(githubWorkspacePath + path.sep)) {
|
|||
|
throw new Error(`Repository path '${result.repositoryPath}' is not under '${githubWorkspacePath}'`);
|
|||
|
}
|
|||
|
// Workflow repository?
|
|||
|
const isWorkflowRepository = qualifiedRepository.toUpperCase() ===
|
|||
|
`${github.context.repo.owner}/${github.context.repo.repo}`.toUpperCase();
|
|||
|
// Source branch, source version
|
|||
|
result.ref = core.getInput('ref');
|
|||
|
if (!result.ref) {
|
|||
|
if (isWorkflowRepository) {
|
|||
|
result.ref = github.context.ref;
|
|||
|
result.commit = github.context.sha;
|
|||
|
}
|
|||
|
if (!result.ref && !result.commit) {
|
|||
|
result.ref = 'refs/heads/master';
|
|||
|
}
|
|||
|
}
|
|||
|
// SHA?
|
|||
|
else if (result.ref.match(/^[0-9a-fA-F]{40}$/)) {
|
|||
|
result.commit = result.ref;
|
|||
|
result.ref = '';
|
|||
|
}
|
|||
|
core.debug(`ref = '${result.ref}'`);
|
|||
|
core.debug(`commit = '${result.commit}'`);
|
|||
|
// Clean
|
|||
|
result.clean = (core.getInput('clean') || 'true').toUpperCase() === 'TRUE';
|
|||
|
core.debug(`clean = ${result.clean}`);
|
|||
|
// Submodules
|
|||
|
if (core.getInput('submodules')) {
|
|||
|
throw new Error("The input 'submodules' is not supported in actions/checkout@v2");
|
|||
|
}
|
|||
|
// Fetch depth
|
|||
|
result.fetchDepth = Math.floor(Number(core.getInput('fetch-depth') || '1'));
|
|||
|
if (isNaN(result.fetchDepth) || result.fetchDepth < 0) {
|
|||
|
result.fetchDepth = 0;
|
|||
|
}
|
|||
|
core.debug(`fetch depth = ${result.fetchDepth}`);
|
|||
|
// LFS
|
|||
|
result.lfs = (core.getInput('lfs') || 'false').toUpperCase() === 'TRUE';
|
|||
|
core.debug(`lfs = ${result.lfs}`);
|
|||
|
// Access token
|
|||
|
result.accessToken = core.getInput('token');
|
|||
|
return result;
|
|||
|
}
|
|||
|
exports.getInputs = getInputs;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 835:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = require("url");
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 850:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = paginationMethodsPlugin
|
|||
|
|
|||
|
function paginationMethodsPlugin (octokit) {
|
|||
|
octokit.getFirstPage = __webpack_require__(777).bind(null, octokit)
|
|||
|
octokit.getLastPage = __webpack_require__(649).bind(null, octokit)
|
|||
|
octokit.getNextPage = __webpack_require__(550).bind(null, octokit)
|
|||
|
octokit.getPreviousPage = __webpack_require__(563).bind(null, octokit)
|
|||
|
octokit.hasFirstPage = __webpack_require__(536)
|
|||
|
octokit.hasLastPage = __webpack_require__(336)
|
|||
|
octokit.hasNextPage = __webpack_require__(929)
|
|||
|
octokit.hasPreviousPage = __webpack_require__(558)
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 854:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
/**
|
|||
|
* lodash (Custom Build) <https://lodash.com/>
|
|||
|
* Build: `lodash modularize exports="npm" -o ./`
|
|||
|
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
|
|||
|
* Released under MIT license <https://lodash.com/license>
|
|||
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
*/
|
|||
|
|
|||
|
/** Used as the `TypeError` message for "Functions" methods. */
|
|||
|
var FUNC_ERROR_TEXT = 'Expected a function';
|
|||
|
|
|||
|
/** Used to stand-in for `undefined` hash values. */
|
|||
|
var HASH_UNDEFINED = '__lodash_hash_undefined__';
|
|||
|
|
|||
|
/** Used as references for various `Number` constants. */
|
|||
|
var INFINITY = 1 / 0;
|
|||
|
|
|||
|
/** `Object#toString` result references. */
|
|||
|
var funcTag = '[object Function]',
|
|||
|
genTag = '[object GeneratorFunction]',
|
|||
|
symbolTag = '[object Symbol]';
|
|||
|
|
|||
|
/** Used to match property names within property paths. */
|
|||
|
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
|
|||
|
reIsPlainProp = /^\w*$/,
|
|||
|
reLeadingDot = /^\./,
|
|||
|
rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
|
|||
|
|
|||
|
/**
|
|||
|
* Used to match `RegExp`
|
|||
|
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
|
|||
|
*/
|
|||
|
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
|||
|
|
|||
|
/** Used to match backslashes in property paths. */
|
|||
|
var reEscapeChar = /\\(\\)?/g;
|
|||
|
|
|||
|
/** Used to detect host constructors (Safari). */
|
|||
|
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|||
|
|
|||
|
/** Detect free variable `global` from Node.js. */
|
|||
|
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
|
|||
|
|
|||
|
/** Detect free variable `self`. */
|
|||
|
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
|||
|
|
|||
|
/** Used as a reference to the global object. */
|
|||
|
var root = freeGlobal || freeSelf || Function('return this')();
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the value at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} [object] The object to query.
|
|||
|
* @param {string} key The key of the property to get.
|
|||
|
* @returns {*} Returns the property value.
|
|||
|
*/
|
|||
|
function getValue(object, key) {
|
|||
|
return object == null ? undefined : object[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a host object in IE < 9.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
|
|||
|
*/
|
|||
|
function isHostObject(value) {
|
|||
|
// Many host objects are `Object` objects that can coerce to strings
|
|||
|
// despite having improperly defined `toString` methods.
|
|||
|
var result = false;
|
|||
|
if (value != null && typeof value.toString != 'function') {
|
|||
|
try {
|
|||
|
result = !!(value + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/** Used for built-in method references. */
|
|||
|
var arrayProto = Array.prototype,
|
|||
|
funcProto = Function.prototype,
|
|||
|
objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Used to detect overreaching core-js shims. */
|
|||
|
var coreJsData = root['__core-js_shared__'];
|
|||
|
|
|||
|
/** Used to detect methods masquerading as native. */
|
|||
|
var maskSrcKey = (function() {
|
|||
|
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
|
|||
|
return uid ? ('Symbol(src)_1.' + uid) : '';
|
|||
|
}());
|
|||
|
|
|||
|
/** Used to resolve the decompiled source of functions. */
|
|||
|
var funcToString = funcProto.toString;
|
|||
|
|
|||
|
/** Used to check objects for own properties. */
|
|||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|||
|
|
|||
|
/**
|
|||
|
* Used to resolve the
|
|||
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
|||
|
* of values.
|
|||
|
*/
|
|||
|
var objectToString = objectProto.toString;
|
|||
|
|
|||
|
/** Used to detect if a method is native. */
|
|||
|
var reIsNative = RegExp('^' +
|
|||
|
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
|
|||
|
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
|||
|
);
|
|||
|
|
|||
|
/** Built-in value references. */
|
|||
|
var Symbol = root.Symbol,
|
|||
|
splice = arrayProto.splice;
|
|||
|
|
|||
|
/* Built-in method references that are verified to be native. */
|
|||
|
var Map = getNative(root, 'Map'),
|
|||
|
nativeCreate = getNative(Object, 'create');
|
|||
|
|
|||
|
/** Used to convert symbols to primitives and strings. */
|
|||
|
var symbolProto = Symbol ? Symbol.prototype : undefined,
|
|||
|
symbolToString = symbolProto ? symbolProto.toString : undefined;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a hash object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function Hash(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf Hash
|
|||
|
*/
|
|||
|
function hashClear() {
|
|||
|
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf Hash
|
|||
|
* @param {Object} hash The hash to modify.
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function hashDelete(key) {
|
|||
|
return this.has(key) && delete this.__data__[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the hash value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function hashGet(key) {
|
|||
|
var data = this.__data__;
|
|||
|
if (nativeCreate) {
|
|||
|
var result = data[key];
|
|||
|
return result === HASH_UNDEFINED ? undefined : result;
|
|||
|
}
|
|||
|
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a hash value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function hashHas(key) {
|
|||
|
var data = this.__data__;
|
|||
|
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the hash `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the hash instance.
|
|||
|
*/
|
|||
|
function hashSet(key, value) {
|
|||
|
var data = this.__data__;
|
|||
|
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `Hash`.
|
|||
|
Hash.prototype.clear = hashClear;
|
|||
|
Hash.prototype['delete'] = hashDelete;
|
|||
|
Hash.prototype.get = hashGet;
|
|||
|
Hash.prototype.has = hashHas;
|
|||
|
Hash.prototype.set = hashSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an list cache object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function ListCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf ListCache
|
|||
|
*/
|
|||
|
function listCacheClear() {
|
|||
|
this.__data__ = [];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function listCacheDelete(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var lastIndex = data.length - 1;
|
|||
|
if (index == lastIndex) {
|
|||
|
data.pop();
|
|||
|
} else {
|
|||
|
splice.call(data, index, 1);
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the list cache value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function listCacheGet(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
return index < 0 ? undefined : data[index][1];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a list cache value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function listCacheHas(key) {
|
|||
|
return assocIndexOf(this.__data__, key) > -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the list cache `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the list cache instance.
|
|||
|
*/
|
|||
|
function listCacheSet(key, value) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
data.push([key, value]);
|
|||
|
} else {
|
|||
|
data[index][1] = value;
|
|||
|
}
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `ListCache`.
|
|||
|
ListCache.prototype.clear = listCacheClear;
|
|||
|
ListCache.prototype['delete'] = listCacheDelete;
|
|||
|
ListCache.prototype.get = listCacheGet;
|
|||
|
ListCache.prototype.has = listCacheHas;
|
|||
|
ListCache.prototype.set = listCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a map cache object to store key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function MapCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf MapCache
|
|||
|
*/
|
|||
|
function mapCacheClear() {
|
|||
|
this.__data__ = {
|
|||
|
'hash': new Hash,
|
|||
|
'map': new (Map || ListCache),
|
|||
|
'string': new Hash
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheDelete(key) {
|
|||
|
return getMapData(this, key)['delete'](key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the map value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function mapCacheGet(key) {
|
|||
|
return getMapData(this, key).get(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a map value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheHas(key) {
|
|||
|
return getMapData(this, key).has(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the map `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the map cache instance.
|
|||
|
*/
|
|||
|
function mapCacheSet(key, value) {
|
|||
|
getMapData(this, key).set(key, value);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `MapCache`.
|
|||
|
MapCache.prototype.clear = mapCacheClear;
|
|||
|
MapCache.prototype['delete'] = mapCacheDelete;
|
|||
|
MapCache.prototype.get = mapCacheGet;
|
|||
|
MapCache.prototype.has = mapCacheHas;
|
|||
|
MapCache.prototype.set = mapCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the index at which the `key` is found in `array` of key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @param {*} key The key to search for.
|
|||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|||
|
*/
|
|||
|
function assocIndexOf(array, key) {
|
|||
|
var length = array.length;
|
|||
|
while (length--) {
|
|||
|
if (eq(array[length][0], key)) {
|
|||
|
return length;
|
|||
|
}
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.get` without support for default values.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {Array|string} path The path of the property to get.
|
|||
|
* @returns {*} Returns the resolved value.
|
|||
|
*/
|
|||
|
function baseGet(object, path) {
|
|||
|
path = isKey(path, object) ? [path] : castPath(path);
|
|||
|
|
|||
|
var index = 0,
|
|||
|
length = path.length;
|
|||
|
|
|||
|
while (object != null && index < length) {
|
|||
|
object = object[toKey(path[index++])];
|
|||
|
}
|
|||
|
return (index && index == length) ? object : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isNative` without bad shim checks.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a native function,
|
|||
|
* else `false`.
|
|||
|
*/
|
|||
|
function baseIsNative(value) {
|
|||
|
if (!isObject(value) || isMasked(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
|
|||
|
return pattern.test(toSource(value));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.toString` which doesn't convert nullish
|
|||
|
* values to empty strings.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to process.
|
|||
|
* @returns {string} Returns the string.
|
|||
|
*/
|
|||
|
function baseToString(value) {
|
|||
|
// Exit early for strings to avoid a performance hit in some environments.
|
|||
|
if (typeof value == 'string') {
|
|||
|
return value;
|
|||
|
}
|
|||
|
if (isSymbol(value)) {
|
|||
|
return symbolToString ? symbolToString.call(value) : '';
|
|||
|
}
|
|||
|
var result = (value + '');
|
|||
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Casts `value` to a path array if it's not one.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to inspect.
|
|||
|
* @returns {Array} Returns the cast property path array.
|
|||
|
*/
|
|||
|
function castPath(value) {
|
|||
|
return isArray(value) ? value : stringToPath(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the data for `map`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} map The map to query.
|
|||
|
* @param {string} key The reference key.
|
|||
|
* @returns {*} Returns the map data.
|
|||
|
*/
|
|||
|
function getMapData(map, key) {
|
|||
|
var data = map.__data__;
|
|||
|
return isKeyable(key)
|
|||
|
? data[typeof key == 'string' ? 'string' : 'hash']
|
|||
|
: data.map;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the native function at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {string} key The key of the method to get.
|
|||
|
* @returns {*} Returns the function if it's native, else `undefined`.
|
|||
|
*/
|
|||
|
function getNative(object, key) {
|
|||
|
var value = getValue(object, key);
|
|||
|
return baseIsNative(value) ? value : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a property name and not a property path.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @param {Object} [object] The object to query keys on.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
|
|||
|
*/
|
|||
|
function isKey(value, object) {
|
|||
|
if (isArray(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var type = typeof value;
|
|||
|
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
|
|||
|
value == null || isSymbol(value)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
|
|||
|
(object != null && value in Object(object));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is suitable for use as unique object key.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
|
|||
|
*/
|
|||
|
function isKeyable(value) {
|
|||
|
var type = typeof value;
|
|||
|
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
|
|||
|
? (value !== '__proto__')
|
|||
|
: (value === null);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `func` has its source masked.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to check.
|
|||
|
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
|
|||
|
*/
|
|||
|
function isMasked(func) {
|
|||
|
return !!maskSrcKey && (maskSrcKey in func);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `string` to a property path array.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {string} string The string to convert.
|
|||
|
* @returns {Array} Returns the property path array.
|
|||
|
*/
|
|||
|
var stringToPath = memoize(function(string) {
|
|||
|
string = toString(string);
|
|||
|
|
|||
|
var result = [];
|
|||
|
if (reLeadingDot.test(string)) {
|
|||
|
result.push('');
|
|||
|
}
|
|||
|
string.replace(rePropName, function(match, number, quote, string) {
|
|||
|
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
|
|||
|
});
|
|||
|
return result;
|
|||
|
});
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `value` to a string key if it's not a string or symbol.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to inspect.
|
|||
|
* @returns {string|symbol} Returns the key.
|
|||
|
*/
|
|||
|
function toKey(value) {
|
|||
|
if (typeof value == 'string' || isSymbol(value)) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
var result = (value + '');
|
|||
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `func` to its source code.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to process.
|
|||
|
* @returns {string} Returns the source code.
|
|||
|
*/
|
|||
|
function toSource(func) {
|
|||
|
if (func != null) {
|
|||
|
try {
|
|||
|
return funcToString.call(func);
|
|||
|
} catch (e) {}
|
|||
|
try {
|
|||
|
return (func + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return '';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a function that memoizes the result of `func`. If `resolver` is
|
|||
|
* provided, it determines the cache key for storing the result based on the
|
|||
|
* arguments provided to the memoized function. By default, the first argument
|
|||
|
* provided to the memoized function is used as the map cache key. The `func`
|
|||
|
* is invoked with the `this` binding of the memoized function.
|
|||
|
*
|
|||
|
* **Note:** The cache is exposed as the `cache` property on the memoized
|
|||
|
* function. Its creation may be customized by replacing the `_.memoize.Cache`
|
|||
|
* constructor with one whose instances implement the
|
|||
|
* [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
|
|||
|
* method interface of `delete`, `get`, `has`, and `set`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Function
|
|||
|
* @param {Function} func The function to have its output memoized.
|
|||
|
* @param {Function} [resolver] The function to resolve the cache key.
|
|||
|
* @returns {Function} Returns the new memoized function.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1, 'b': 2 };
|
|||
|
* var other = { 'c': 3, 'd': 4 };
|
|||
|
*
|
|||
|
* var values = _.memoize(_.values);
|
|||
|
* values(object);
|
|||
|
* // => [1, 2]
|
|||
|
*
|
|||
|
* values(other);
|
|||
|
* // => [3, 4]
|
|||
|
*
|
|||
|
* object.a = 2;
|
|||
|
* values(object);
|
|||
|
* // => [1, 2]
|
|||
|
*
|
|||
|
* // Modify the result cache.
|
|||
|
* values.cache.set(object, ['a', 'b']);
|
|||
|
* values(object);
|
|||
|
* // => ['a', 'b']
|
|||
|
*
|
|||
|
* // Replace `_.memoize.Cache`.
|
|||
|
* _.memoize.Cache = WeakMap;
|
|||
|
*/
|
|||
|
function memoize(func, resolver) {
|
|||
|
if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
|
|||
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|||
|
}
|
|||
|
var memoized = function() {
|
|||
|
var args = arguments,
|
|||
|
key = resolver ? resolver.apply(this, args) : args[0],
|
|||
|
cache = memoized.cache;
|
|||
|
|
|||
|
if (cache.has(key)) {
|
|||
|
return cache.get(key);
|
|||
|
}
|
|||
|
var result = func.apply(this, args);
|
|||
|
memoized.cache = cache.set(key, result);
|
|||
|
return result;
|
|||
|
};
|
|||
|
memoized.cache = new (memoize.Cache || MapCache);
|
|||
|
return memoized;
|
|||
|
}
|
|||
|
|
|||
|
// Assign cache to `_.memoize`.
|
|||
|
memoize.Cache = MapCache;
|
|||
|
|
|||
|
/**
|
|||
|
* Performs a
|
|||
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|||
|
* comparison between two values to determine if they are equivalent.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to compare.
|
|||
|
* @param {*} other The other value to compare.
|
|||
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1 };
|
|||
|
* var other = { 'a': 1 };
|
|||
|
*
|
|||
|
* _.eq(object, object);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq(object, other);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq('a', 'a');
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq('a', Object('a'));
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq(NaN, NaN);
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function eq(value, other) {
|
|||
|
return value === other || (value !== value && other !== other);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as an `Array` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isArray([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isArray(document.body.children);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray('abc');
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray(_.noop);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
var isArray = Array.isArray;
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a `Function` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isFunction(_);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isFunction(/abc/);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isFunction(value) {
|
|||
|
// The use of `Object#toString` avoids issues with the `typeof` operator
|
|||
|
// in Safari 8-9 which returns 'object' for typed array and other constructors.
|
|||
|
var tag = isObject(value) ? objectToString.call(value) : '';
|
|||
|
return tag == funcTag || tag == genTag;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is the
|
|||
|
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
|
|||
|
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObject({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(_.noop);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObject(value) {
|
|||
|
var type = typeof value;
|
|||
|
return !!value && (type == 'object' || type == 'function');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is object-like. A value is object-like if it's not `null`
|
|||
|
* and has a `typeof` result of "object".
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObjectLike({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObjectLike([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObjectLike(_.noop);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isObjectLike(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObjectLike(value) {
|
|||
|
return !!value && typeof value == 'object';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a `Symbol` primitive or object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isSymbol(Symbol.iterator);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isSymbol('abc');
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isSymbol(value) {
|
|||
|
return typeof value == 'symbol' ||
|
|||
|
(isObjectLike(value) && objectToString.call(value) == symbolTag);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `value` to a string. An empty string is returned for `null`
|
|||
|
* and `undefined` values. The sign of `-0` is preserved.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to process.
|
|||
|
* @returns {string} Returns the string.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.toString(null);
|
|||
|
* // => ''
|
|||
|
*
|
|||
|
* _.toString(-0);
|
|||
|
* // => '-0'
|
|||
|
*
|
|||
|
* _.toString([1, 2, 3]);
|
|||
|
* // => '1,2,3'
|
|||
|
*/
|
|||
|
function toString(value) {
|
|||
|
return value == null ? '' : baseToString(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the value at `path` of `object`. If the resolved value is
|
|||
|
* `undefined`, the `defaultValue` is returned in its place.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 3.7.0
|
|||
|
* @category Object
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {Array|string} path The path of the property to get.
|
|||
|
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
|
|||
|
* @returns {*} Returns the resolved value.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
|||
|
*
|
|||
|
* _.get(object, 'a[0].b.c');
|
|||
|
* // => 3
|
|||
|
*
|
|||
|
* _.get(object, ['a', '0', 'b', 'c']);
|
|||
|
* // => 3
|
|||
|
*
|
|||
|
* _.get(object, 'a.b.c', 'default');
|
|||
|
* // => 'default'
|
|||
|
*/
|
|||
|
function get(object, path, defaultValue) {
|
|||
|
var result = object == null ? undefined : baseGet(object, path);
|
|||
|
return result === undefined ? defaultValue : result;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = get;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 855:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = registerPlugin;
|
|||
|
|
|||
|
const factory = __webpack_require__(47);
|
|||
|
|
|||
|
function registerPlugin(plugins, pluginFunction) {
|
|||
|
return factory(
|
|||
|
plugins.includes(pluginFunction) ? plugins : plugins.concat(pluginFunction)
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 862:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = class GraphqlError extends Error {
|
|||
|
constructor (request, response) {
|
|||
|
const message = response.data.errors[0].message
|
|||
|
super(message)
|
|||
|
|
|||
|
Object.assign(this, response.data)
|
|||
|
this.name = 'GraphqlError'
|
|||
|
this.request = request
|
|||
|
|
|||
|
// Maintains proper stack trace (only available on V8)
|
|||
|
/* istanbul ignore next */
|
|||
|
if (Error.captureStackTrace) {
|
|||
|
Error.captureStackTrace(this, this.constructor)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 863:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = authenticationBeforeRequest;
|
|||
|
|
|||
|
const btoa = __webpack_require__(675);
|
|||
|
|
|||
|
const withAuthorizationPrefix = __webpack_require__(143);
|
|||
|
|
|||
|
function authenticationBeforeRequest(state, options) {
|
|||
|
if (typeof state.auth === "string") {
|
|||
|
options.headers.authorization = withAuthorizationPrefix(state.auth);
|
|||
|
|
|||
|
// https://developer.github.com/v3/previews/#integrations
|
|||
|
if (
|
|||
|
/^bearer /i.test(state.auth) &&
|
|||
|
!/machine-man/.test(options.headers.accept)
|
|||
|
) {
|
|||
|
const acceptHeaders = options.headers.accept
|
|||
|
.split(",")
|
|||
|
.concat("application/vnd.github.machine-man-preview+json");
|
|||
|
options.headers.accept = acceptHeaders.filter(Boolean).join(",");
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (state.auth.username) {
|
|||
|
const hash = btoa(`${state.auth.username}:${state.auth.password}`);
|
|||
|
options.headers.authorization = `Basic ${hash}`;
|
|||
|
if (state.otp) {
|
|||
|
options.headers["x-github-otp"] = state.otp;
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (state.auth.clientId) {
|
|||
|
// There is a special case for OAuth applications, when `clientId` and `clientSecret` is passed as
|
|||
|
// Basic Authorization instead of query parameters. The only routes where that applies share the same
|
|||
|
// URL though: `/applications/:client_id/tokens/:access_token`.
|
|||
|
//
|
|||
|
// 1. [Check an authorization](https://developer.github.com/v3/oauth_authorizations/#check-an-authorization)
|
|||
|
// 2. [Reset an authorization](https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization)
|
|||
|
// 3. [Revoke an authorization for an application](https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application)
|
|||
|
//
|
|||
|
// We identify by checking the URL. It must merge both "/applications/:client_id/tokens/:access_token"
|
|||
|
// as well as "/applications/123/tokens/token456"
|
|||
|
if (/\/applications\/:?[\w_]+\/tokens\/:?[\w_]+($|\?)/.test(options.url)) {
|
|||
|
const hash = btoa(`${state.auth.clientId}:${state.auth.clientSecret}`);
|
|||
|
options.headers.authorization = `Basic ${hash}`;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
options.url += options.url.indexOf("?") === -1 ? "?" : "&";
|
|||
|
options.url += `client_id=${state.auth.clientId}&client_secret=${state.auth.clientSecret}`;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
return Promise.resolve()
|
|||
|
|
|||
|
.then(() => {
|
|||
|
return state.auth();
|
|||
|
})
|
|||
|
|
|||
|
.then(authorization => {
|
|||
|
options.headers.authorization = withAuthorizationPrefix(authorization);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 866:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var shebangRegex = __webpack_require__(816);
|
|||
|
|
|||
|
module.exports = function (str) {
|
|||
|
var match = str.match(shebangRegex);
|
|||
|
|
|||
|
if (!match) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
var arr = match[0].replace(/#! ?/, '').split(' ');
|
|||
|
var bin = arr[0].split('/').pop();
|
|||
|
var arg = arr[1];
|
|||
|
|
|||
|
return (bin === 'env' ?
|
|||
|
arg :
|
|||
|
bin + (arg ? ' ' + arg : '')
|
|||
|
);
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 881:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
const isWin = process.platform === 'win32';
|
|||
|
|
|||
|
function notFoundError(original, syscall) {
|
|||
|
return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {
|
|||
|
code: 'ENOENT',
|
|||
|
errno: 'ENOENT',
|
|||
|
syscall: `${syscall} ${original.command}`,
|
|||
|
path: original.command,
|
|||
|
spawnargs: original.args,
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function hookChildProcess(cp, parsed) {
|
|||
|
if (!isWin) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
const originalEmit = cp.emit;
|
|||
|
|
|||
|
cp.emit = function (name, arg1) {
|
|||
|
// If emitting "exit" event and exit code is 1, we need to check if
|
|||
|
// the command exists and emit an "error" instead
|
|||
|
// See https://github.com/IndigoUnited/node-cross-spawn/issues/16
|
|||
|
if (name === 'exit') {
|
|||
|
const err = verifyENOENT(arg1, parsed, 'spawn');
|
|||
|
|
|||
|
if (err) {
|
|||
|
return originalEmit.call(cp, 'error', err);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
function verifyENOENT(status, parsed) {
|
|||
|
if (isWin && status === 1 && !parsed.file) {
|
|||
|
return notFoundError(parsed.original, 'spawn');
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
function verifyENOENTSync(status, parsed) {
|
|||
|
if (isWin && status === 1 && !parsed.file) {
|
|||
|
return notFoundError(parsed.original, 'spawnSync');
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = {
|
|||
|
hookChildProcess,
|
|||
|
verifyENOENT,
|
|||
|
verifyENOENTSync,
|
|||
|
notFoundError,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 883:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
/**
|
|||
|
* lodash (Custom Build) <https://lodash.com/>
|
|||
|
* Build: `lodash modularize exports="npm" -o ./`
|
|||
|
* Copyright jQuery Foundation and other contributors <https://jquery.org/>
|
|||
|
* Released under MIT license <https://lodash.com/license>
|
|||
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|||
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|||
|
*/
|
|||
|
|
|||
|
/** Used as the `TypeError` message for "Functions" methods. */
|
|||
|
var FUNC_ERROR_TEXT = 'Expected a function';
|
|||
|
|
|||
|
/** Used to stand-in for `undefined` hash values. */
|
|||
|
var HASH_UNDEFINED = '__lodash_hash_undefined__';
|
|||
|
|
|||
|
/** Used as references for various `Number` constants. */
|
|||
|
var INFINITY = 1 / 0,
|
|||
|
MAX_SAFE_INTEGER = 9007199254740991;
|
|||
|
|
|||
|
/** `Object#toString` result references. */
|
|||
|
var funcTag = '[object Function]',
|
|||
|
genTag = '[object GeneratorFunction]',
|
|||
|
symbolTag = '[object Symbol]';
|
|||
|
|
|||
|
/** Used to match property names within property paths. */
|
|||
|
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
|
|||
|
reIsPlainProp = /^\w*$/,
|
|||
|
reLeadingDot = /^\./,
|
|||
|
rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
|
|||
|
|
|||
|
/**
|
|||
|
* Used to match `RegExp`
|
|||
|
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
|
|||
|
*/
|
|||
|
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
|
|||
|
|
|||
|
/** Used to match backslashes in property paths. */
|
|||
|
var reEscapeChar = /\\(\\)?/g;
|
|||
|
|
|||
|
/** Used to detect host constructors (Safari). */
|
|||
|
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|||
|
|
|||
|
/** Used to detect unsigned integer values. */
|
|||
|
var reIsUint = /^(?:0|[1-9]\d*)$/;
|
|||
|
|
|||
|
/** Detect free variable `global` from Node.js. */
|
|||
|
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
|
|||
|
|
|||
|
/** Detect free variable `self`. */
|
|||
|
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
|
|||
|
|
|||
|
/** Used as a reference to the global object. */
|
|||
|
var root = freeGlobal || freeSelf || Function('return this')();
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the value at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} [object] The object to query.
|
|||
|
* @param {string} key The key of the property to get.
|
|||
|
* @returns {*} Returns the property value.
|
|||
|
*/
|
|||
|
function getValue(object, key) {
|
|||
|
return object == null ? undefined : object[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a host object in IE < 9.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
|
|||
|
*/
|
|||
|
function isHostObject(value) {
|
|||
|
// Many host objects are `Object` objects that can coerce to strings
|
|||
|
// despite having improperly defined `toString` methods.
|
|||
|
var result = false;
|
|||
|
if (value != null && typeof value.toString != 'function') {
|
|||
|
try {
|
|||
|
result = !!(value + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/** Used for built-in method references. */
|
|||
|
var arrayProto = Array.prototype,
|
|||
|
funcProto = Function.prototype,
|
|||
|
objectProto = Object.prototype;
|
|||
|
|
|||
|
/** Used to detect overreaching core-js shims. */
|
|||
|
var coreJsData = root['__core-js_shared__'];
|
|||
|
|
|||
|
/** Used to detect methods masquerading as native. */
|
|||
|
var maskSrcKey = (function() {
|
|||
|
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
|
|||
|
return uid ? ('Symbol(src)_1.' + uid) : '';
|
|||
|
}());
|
|||
|
|
|||
|
/** Used to resolve the decompiled source of functions. */
|
|||
|
var funcToString = funcProto.toString;
|
|||
|
|
|||
|
/** Used to check objects for own properties. */
|
|||
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|||
|
|
|||
|
/**
|
|||
|
* Used to resolve the
|
|||
|
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
|
|||
|
* of values.
|
|||
|
*/
|
|||
|
var objectToString = objectProto.toString;
|
|||
|
|
|||
|
/** Used to detect if a method is native. */
|
|||
|
var reIsNative = RegExp('^' +
|
|||
|
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
|
|||
|
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
|
|||
|
);
|
|||
|
|
|||
|
/** Built-in value references. */
|
|||
|
var Symbol = root.Symbol,
|
|||
|
splice = arrayProto.splice;
|
|||
|
|
|||
|
/* Built-in method references that are verified to be native. */
|
|||
|
var Map = getNative(root, 'Map'),
|
|||
|
nativeCreate = getNative(Object, 'create');
|
|||
|
|
|||
|
/** Used to convert symbols to primitives and strings. */
|
|||
|
var symbolProto = Symbol ? Symbol.prototype : undefined,
|
|||
|
symbolToString = symbolProto ? symbolProto.toString : undefined;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a hash object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function Hash(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf Hash
|
|||
|
*/
|
|||
|
function hashClear() {
|
|||
|
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the hash.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf Hash
|
|||
|
* @param {Object} hash The hash to modify.
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function hashDelete(key) {
|
|||
|
return this.has(key) && delete this.__data__[key];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the hash value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function hashGet(key) {
|
|||
|
var data = this.__data__;
|
|||
|
if (nativeCreate) {
|
|||
|
var result = data[key];
|
|||
|
return result === HASH_UNDEFINED ? undefined : result;
|
|||
|
}
|
|||
|
return hasOwnProperty.call(data, key) ? data[key] : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a hash value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function hashHas(key) {
|
|||
|
var data = this.__data__;
|
|||
|
return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the hash `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf Hash
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the hash instance.
|
|||
|
*/
|
|||
|
function hashSet(key, value) {
|
|||
|
var data = this.__data__;
|
|||
|
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `Hash`.
|
|||
|
Hash.prototype.clear = hashClear;
|
|||
|
Hash.prototype['delete'] = hashDelete;
|
|||
|
Hash.prototype.get = hashGet;
|
|||
|
Hash.prototype.has = hashHas;
|
|||
|
Hash.prototype.set = hashSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates an list cache object.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function ListCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf ListCache
|
|||
|
*/
|
|||
|
function listCacheClear() {
|
|||
|
this.__data__ = [];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the list cache.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function listCacheDelete(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var lastIndex = data.length - 1;
|
|||
|
if (index == lastIndex) {
|
|||
|
data.pop();
|
|||
|
} else {
|
|||
|
splice.call(data, index, 1);
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the list cache value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function listCacheGet(key) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
return index < 0 ? undefined : data[index][1];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a list cache value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function listCacheHas(key) {
|
|||
|
return assocIndexOf(this.__data__, key) > -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the list cache `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf ListCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the list cache instance.
|
|||
|
*/
|
|||
|
function listCacheSet(key, value) {
|
|||
|
var data = this.__data__,
|
|||
|
index = assocIndexOf(data, key);
|
|||
|
|
|||
|
if (index < 0) {
|
|||
|
data.push([key, value]);
|
|||
|
} else {
|
|||
|
data[index][1] = value;
|
|||
|
}
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `ListCache`.
|
|||
|
ListCache.prototype.clear = listCacheClear;
|
|||
|
ListCache.prototype['delete'] = listCacheDelete;
|
|||
|
ListCache.prototype.get = listCacheGet;
|
|||
|
ListCache.prototype.has = listCacheHas;
|
|||
|
ListCache.prototype.set = listCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a map cache object to store key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @constructor
|
|||
|
* @param {Array} [entries] The key-value pairs to cache.
|
|||
|
*/
|
|||
|
function MapCache(entries) {
|
|||
|
var index = -1,
|
|||
|
length = entries ? entries.length : 0;
|
|||
|
|
|||
|
this.clear();
|
|||
|
while (++index < length) {
|
|||
|
var entry = entries[index];
|
|||
|
this.set(entry[0], entry[1]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes all key-value entries from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name clear
|
|||
|
* @memberOf MapCache
|
|||
|
*/
|
|||
|
function mapCacheClear() {
|
|||
|
this.__data__ = {
|
|||
|
'hash': new Hash,
|
|||
|
'map': new (Map || ListCache),
|
|||
|
'string': new Hash
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Removes `key` and its value from the map.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name delete
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to remove.
|
|||
|
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheDelete(key) {
|
|||
|
return getMapData(this, key)['delete'](key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the map value for `key`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name get
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to get.
|
|||
|
* @returns {*} Returns the entry value.
|
|||
|
*/
|
|||
|
function mapCacheGet(key) {
|
|||
|
return getMapData(this, key).get(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if a map value for `key` exists.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name has
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the entry to check.
|
|||
|
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
|||
|
*/
|
|||
|
function mapCacheHas(key) {
|
|||
|
return getMapData(this, key).has(key);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the map `key` to `value`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @name set
|
|||
|
* @memberOf MapCache
|
|||
|
* @param {string} key The key of the value to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns the map cache instance.
|
|||
|
*/
|
|||
|
function mapCacheSet(key, value) {
|
|||
|
getMapData(this, key).set(key, value);
|
|||
|
return this;
|
|||
|
}
|
|||
|
|
|||
|
// Add methods to `MapCache`.
|
|||
|
MapCache.prototype.clear = mapCacheClear;
|
|||
|
MapCache.prototype['delete'] = mapCacheDelete;
|
|||
|
MapCache.prototype.get = mapCacheGet;
|
|||
|
MapCache.prototype.has = mapCacheHas;
|
|||
|
MapCache.prototype.set = mapCacheSet;
|
|||
|
|
|||
|
/**
|
|||
|
* Assigns `value` to `key` of `object` if the existing value is not equivalent
|
|||
|
* using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|||
|
* for equality comparisons.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to modify.
|
|||
|
* @param {string} key The key of the property to assign.
|
|||
|
* @param {*} value The value to assign.
|
|||
|
*/
|
|||
|
function assignValue(object, key, value) {
|
|||
|
var objValue = object[key];
|
|||
|
if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
|
|||
|
(value === undefined && !(key in object))) {
|
|||
|
object[key] = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the index at which the `key` is found in `array` of key-value pairs.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Array} array The array to inspect.
|
|||
|
* @param {*} key The key to search for.
|
|||
|
* @returns {number} Returns the index of the matched value, else `-1`.
|
|||
|
*/
|
|||
|
function assocIndexOf(array, key) {
|
|||
|
var length = array.length;
|
|||
|
while (length--) {
|
|||
|
if (eq(array[length][0], key)) {
|
|||
|
return length;
|
|||
|
}
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.isNative` without bad shim checks.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a native function,
|
|||
|
* else `false`.
|
|||
|
*/
|
|||
|
function baseIsNative(value) {
|
|||
|
if (!isObject(value) || isMasked(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;
|
|||
|
return pattern.test(toSource(value));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.set`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to modify.
|
|||
|
* @param {Array|string} path The path of the property to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @param {Function} [customizer] The function to customize path creation.
|
|||
|
* @returns {Object} Returns `object`.
|
|||
|
*/
|
|||
|
function baseSet(object, path, value, customizer) {
|
|||
|
if (!isObject(object)) {
|
|||
|
return object;
|
|||
|
}
|
|||
|
path = isKey(path, object) ? [path] : castPath(path);
|
|||
|
|
|||
|
var index = -1,
|
|||
|
length = path.length,
|
|||
|
lastIndex = length - 1,
|
|||
|
nested = object;
|
|||
|
|
|||
|
while (nested != null && ++index < length) {
|
|||
|
var key = toKey(path[index]),
|
|||
|
newValue = value;
|
|||
|
|
|||
|
if (index != lastIndex) {
|
|||
|
var objValue = nested[key];
|
|||
|
newValue = customizer ? customizer(objValue, key, nested) : undefined;
|
|||
|
if (newValue === undefined) {
|
|||
|
newValue = isObject(objValue)
|
|||
|
? objValue
|
|||
|
: (isIndex(path[index + 1]) ? [] : {});
|
|||
|
}
|
|||
|
}
|
|||
|
assignValue(nested, key, newValue);
|
|||
|
nested = nested[key];
|
|||
|
}
|
|||
|
return object;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* The base implementation of `_.toString` which doesn't convert nullish
|
|||
|
* values to empty strings.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to process.
|
|||
|
* @returns {string} Returns the string.
|
|||
|
*/
|
|||
|
function baseToString(value) {
|
|||
|
// Exit early for strings to avoid a performance hit in some environments.
|
|||
|
if (typeof value == 'string') {
|
|||
|
return value;
|
|||
|
}
|
|||
|
if (isSymbol(value)) {
|
|||
|
return symbolToString ? symbolToString.call(value) : '';
|
|||
|
}
|
|||
|
var result = (value + '');
|
|||
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Casts `value` to a path array if it's not one.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to inspect.
|
|||
|
* @returns {Array} Returns the cast property path array.
|
|||
|
*/
|
|||
|
function castPath(value) {
|
|||
|
return isArray(value) ? value : stringToPath(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the data for `map`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} map The map to query.
|
|||
|
* @param {string} key The reference key.
|
|||
|
* @returns {*} Returns the map data.
|
|||
|
*/
|
|||
|
function getMapData(map, key) {
|
|||
|
var data = map.__data__;
|
|||
|
return isKeyable(key)
|
|||
|
? data[typeof key == 'string' ? 'string' : 'hash']
|
|||
|
: data.map;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets the native function at `key` of `object`.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Object} object The object to query.
|
|||
|
* @param {string} key The key of the method to get.
|
|||
|
* @returns {*} Returns the function if it's native, else `undefined`.
|
|||
|
*/
|
|||
|
function getNative(object, key) {
|
|||
|
var value = getValue(object, key);
|
|||
|
return baseIsNative(value) ? value : undefined;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a valid array-like index.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
|
|||
|
*/
|
|||
|
function isIndex(value, length) {
|
|||
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|||
|
return !!length &&
|
|||
|
(typeof value == 'number' || reIsUint.test(value)) &&
|
|||
|
(value > -1 && value % 1 == 0 && value < length);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is a property name and not a property path.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @param {Object} [object] The object to query keys on.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
|
|||
|
*/
|
|||
|
function isKey(value, object) {
|
|||
|
if (isArray(value)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var type = typeof value;
|
|||
|
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
|
|||
|
value == null || isSymbol(value)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
|
|||
|
(object != null && value in Object(object));
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is suitable for use as unique object key.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
|
|||
|
*/
|
|||
|
function isKeyable(value) {
|
|||
|
var type = typeof value;
|
|||
|
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
|
|||
|
? (value !== '__proto__')
|
|||
|
: (value === null);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `func` has its source masked.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to check.
|
|||
|
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
|
|||
|
*/
|
|||
|
function isMasked(func) {
|
|||
|
return !!maskSrcKey && (maskSrcKey in func);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `string` to a property path array.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {string} string The string to convert.
|
|||
|
* @returns {Array} Returns the property path array.
|
|||
|
*/
|
|||
|
var stringToPath = memoize(function(string) {
|
|||
|
string = toString(string);
|
|||
|
|
|||
|
var result = [];
|
|||
|
if (reLeadingDot.test(string)) {
|
|||
|
result.push('');
|
|||
|
}
|
|||
|
string.replace(rePropName, function(match, number, quote, string) {
|
|||
|
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
|
|||
|
});
|
|||
|
return result;
|
|||
|
});
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `value` to a string key if it's not a string or symbol.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {*} value The value to inspect.
|
|||
|
* @returns {string|symbol} Returns the key.
|
|||
|
*/
|
|||
|
function toKey(value) {
|
|||
|
if (typeof value == 'string' || isSymbol(value)) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
var result = (value + '');
|
|||
|
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `func` to its source code.
|
|||
|
*
|
|||
|
* @private
|
|||
|
* @param {Function} func The function to process.
|
|||
|
* @returns {string} Returns the source code.
|
|||
|
*/
|
|||
|
function toSource(func) {
|
|||
|
if (func != null) {
|
|||
|
try {
|
|||
|
return funcToString.call(func);
|
|||
|
} catch (e) {}
|
|||
|
try {
|
|||
|
return (func + '');
|
|||
|
} catch (e) {}
|
|||
|
}
|
|||
|
return '';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Creates a function that memoizes the result of `func`. If `resolver` is
|
|||
|
* provided, it determines the cache key for storing the result based on the
|
|||
|
* arguments provided to the memoized function. By default, the first argument
|
|||
|
* provided to the memoized function is used as the map cache key. The `func`
|
|||
|
* is invoked with the `this` binding of the memoized function.
|
|||
|
*
|
|||
|
* **Note:** The cache is exposed as the `cache` property on the memoized
|
|||
|
* function. Its creation may be customized by replacing the `_.memoize.Cache`
|
|||
|
* constructor with one whose instances implement the
|
|||
|
* [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
|
|||
|
* method interface of `delete`, `get`, `has`, and `set`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Function
|
|||
|
* @param {Function} func The function to have its output memoized.
|
|||
|
* @param {Function} [resolver] The function to resolve the cache key.
|
|||
|
* @returns {Function} Returns the new memoized function.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1, 'b': 2 };
|
|||
|
* var other = { 'c': 3, 'd': 4 };
|
|||
|
*
|
|||
|
* var values = _.memoize(_.values);
|
|||
|
* values(object);
|
|||
|
* // => [1, 2]
|
|||
|
*
|
|||
|
* values(other);
|
|||
|
* // => [3, 4]
|
|||
|
*
|
|||
|
* object.a = 2;
|
|||
|
* values(object);
|
|||
|
* // => [1, 2]
|
|||
|
*
|
|||
|
* // Modify the result cache.
|
|||
|
* values.cache.set(object, ['a', 'b']);
|
|||
|
* values(object);
|
|||
|
* // => ['a', 'b']
|
|||
|
*
|
|||
|
* // Replace `_.memoize.Cache`.
|
|||
|
* _.memoize.Cache = WeakMap;
|
|||
|
*/
|
|||
|
function memoize(func, resolver) {
|
|||
|
if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
|
|||
|
throw new TypeError(FUNC_ERROR_TEXT);
|
|||
|
}
|
|||
|
var memoized = function() {
|
|||
|
var args = arguments,
|
|||
|
key = resolver ? resolver.apply(this, args) : args[0],
|
|||
|
cache = memoized.cache;
|
|||
|
|
|||
|
if (cache.has(key)) {
|
|||
|
return cache.get(key);
|
|||
|
}
|
|||
|
var result = func.apply(this, args);
|
|||
|
memoized.cache = cache.set(key, result);
|
|||
|
return result;
|
|||
|
};
|
|||
|
memoized.cache = new (memoize.Cache || MapCache);
|
|||
|
return memoized;
|
|||
|
}
|
|||
|
|
|||
|
// Assign cache to `_.memoize`.
|
|||
|
memoize.Cache = MapCache;
|
|||
|
|
|||
|
/**
|
|||
|
* Performs a
|
|||
|
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
|
|||
|
* comparison between two values to determine if they are equivalent.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to compare.
|
|||
|
* @param {*} other The other value to compare.
|
|||
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': 1 };
|
|||
|
* var other = { 'a': 1 };
|
|||
|
*
|
|||
|
* _.eq(object, object);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq(object, other);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq('a', 'a');
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.eq('a', Object('a'));
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.eq(NaN, NaN);
|
|||
|
* // => true
|
|||
|
*/
|
|||
|
function eq(value, other) {
|
|||
|
return value === other || (value !== value && other !== other);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as an `Array` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isArray([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isArray(document.body.children);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray('abc');
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isArray(_.noop);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
var isArray = Array.isArray;
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a `Function` object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isFunction(_);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isFunction(/abc/);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isFunction(value) {
|
|||
|
// The use of `Object#toString` avoids issues with the `typeof` operator
|
|||
|
// in Safari 8-9 which returns 'object' for typed array and other constructors.
|
|||
|
var tag = isObject(value) ? objectToString.call(value) : '';
|
|||
|
return tag == funcTag || tag == genTag;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is the
|
|||
|
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
|
|||
|
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 0.1.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObject({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(_.noop);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObject(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObject(value) {
|
|||
|
var type = typeof value;
|
|||
|
return !!value && (type == 'object' || type == 'function');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is object-like. A value is object-like if it's not `null`
|
|||
|
* and has a `typeof` result of "object".
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isObjectLike({});
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObjectLike([1, 2, 3]);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isObjectLike(_.noop);
|
|||
|
* // => false
|
|||
|
*
|
|||
|
* _.isObjectLike(null);
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isObjectLike(value) {
|
|||
|
return !!value && typeof value == 'object';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Checks if `value` is classified as a `Symbol` primitive or object.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to check.
|
|||
|
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.isSymbol(Symbol.iterator);
|
|||
|
* // => true
|
|||
|
*
|
|||
|
* _.isSymbol('abc');
|
|||
|
* // => false
|
|||
|
*/
|
|||
|
function isSymbol(value) {
|
|||
|
return typeof value == 'symbol' ||
|
|||
|
(isObjectLike(value) && objectToString.call(value) == symbolTag);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Converts `value` to a string. An empty string is returned for `null`
|
|||
|
* and `undefined` values. The sign of `-0` is preserved.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 4.0.0
|
|||
|
* @category Lang
|
|||
|
* @param {*} value The value to process.
|
|||
|
* @returns {string} Returns the string.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* _.toString(null);
|
|||
|
* // => ''
|
|||
|
*
|
|||
|
* _.toString(-0);
|
|||
|
* // => '-0'
|
|||
|
*
|
|||
|
* _.toString([1, 2, 3]);
|
|||
|
* // => '1,2,3'
|
|||
|
*/
|
|||
|
function toString(value) {
|
|||
|
return value == null ? '' : baseToString(value);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
|
|||
|
* it's created. Arrays are created for missing index properties while objects
|
|||
|
* are created for all other missing properties. Use `_.setWith` to customize
|
|||
|
* `path` creation.
|
|||
|
*
|
|||
|
* **Note:** This method mutates `object`.
|
|||
|
*
|
|||
|
* @static
|
|||
|
* @memberOf _
|
|||
|
* @since 3.7.0
|
|||
|
* @category Object
|
|||
|
* @param {Object} object The object to modify.
|
|||
|
* @param {Array|string} path The path of the property to set.
|
|||
|
* @param {*} value The value to set.
|
|||
|
* @returns {Object} Returns `object`.
|
|||
|
* @example
|
|||
|
*
|
|||
|
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
|
|||
|
*
|
|||
|
* _.set(object, 'a[0].b.c', 4);
|
|||
|
* console.log(object.a[0].b.c);
|
|||
|
* // => 4
|
|||
|
*
|
|||
|
* _.set(object, ['x', '0', 'y', 'z'], 5);
|
|||
|
* console.log(object.x[0].y.z);
|
|||
|
* // => 5
|
|||
|
*/
|
|||
|
function set(object, path, value) {
|
|||
|
return object == null ? object : baseSet(object, path, value);
|
|||
|
}
|
|||
|
|
|||
|
module.exports = set;
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 899:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = registerEndpoints;
|
|||
|
|
|||
|
const { Deprecation } = __webpack_require__(692);
|
|||
|
|
|||
|
function registerEndpoints(octokit, routes) {
|
|||
|
Object.keys(routes).forEach(namespaceName => {
|
|||
|
if (!octokit[namespaceName]) {
|
|||
|
octokit[namespaceName] = {};
|
|||
|
}
|
|||
|
|
|||
|
Object.keys(routes[namespaceName]).forEach(apiName => {
|
|||
|
const apiOptions = routes[namespaceName][apiName];
|
|||
|
|
|||
|
const endpointDefaults = ["method", "url", "headers"].reduce(
|
|||
|
(map, key) => {
|
|||
|
if (typeof apiOptions[key] !== "undefined") {
|
|||
|
map[key] = apiOptions[key];
|
|||
|
}
|
|||
|
|
|||
|
return map;
|
|||
|
},
|
|||
|
{}
|
|||
|
);
|
|||
|
|
|||
|
endpointDefaults.request = {
|
|||
|
validate: apiOptions.params
|
|||
|
};
|
|||
|
|
|||
|
let request = octokit.request.defaults(endpointDefaults);
|
|||
|
|
|||
|
// patch request & endpoint methods to support deprecated parameters.
|
|||
|
// Not the most elegant solution, but we don’t want to move deprecation
|
|||
|
// logic into octokit/endpoint.js as it’s out of scope
|
|||
|
const hasDeprecatedParam = Object.keys(apiOptions.params || {}).find(
|
|||
|
key => apiOptions.params[key].deprecated
|
|||
|
);
|
|||
|
if (hasDeprecatedParam) {
|
|||
|
const patch = patchForDeprecation.bind(null, octokit, apiOptions);
|
|||
|
request = patch(
|
|||
|
octokit.request.defaults(endpointDefaults),
|
|||
|
`.${namespaceName}.${apiName}()`
|
|||
|
);
|
|||
|
request.endpoint = patch(
|
|||
|
request.endpoint,
|
|||
|
`.${namespaceName}.${apiName}.endpoint()`
|
|||
|
);
|
|||
|
request.endpoint.merge = patch(
|
|||
|
request.endpoint.merge,
|
|||
|
`.${namespaceName}.${apiName}.endpoint.merge()`
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
if (apiOptions.deprecated) {
|
|||
|
octokit[namespaceName][apiName] = function deprecatedEndpointMethod() {
|
|||
|
octokit.log.warn(
|
|||
|
new Deprecation(`[@octokit/rest] ${apiOptions.deprecated}`)
|
|||
|
);
|
|||
|
octokit[namespaceName][apiName] = request;
|
|||
|
return request.apply(null, arguments);
|
|||
|
};
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
octokit[namespaceName][apiName] = request;
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function patchForDeprecation(octokit, apiOptions, method, methodName) {
|
|||
|
const patchedMethod = options => {
|
|||
|
options = Object.assign({}, options);
|
|||
|
|
|||
|
Object.keys(options).forEach(key => {
|
|||
|
if (apiOptions.params[key] && apiOptions.params[key].deprecated) {
|
|||
|
const aliasKey = apiOptions.params[key].alias;
|
|||
|
|
|||
|
octokit.log.warn(
|
|||
|
new Deprecation(
|
|||
|
`[@octokit/rest] "${key}" parameter is deprecated for "${methodName}". Use "${aliasKey}" instead`
|
|||
|
)
|
|||
|
);
|
|||
|
|
|||
|
if (!(aliasKey in options)) {
|
|||
|
options[aliasKey] = options[key];
|
|||
|
}
|
|||
|
delete options[key];
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
return method(options);
|
|||
|
};
|
|||
|
Object.keys(method).forEach(key => {
|
|||
|
patchedMethod[key] = method[key];
|
|||
|
});
|
|||
|
|
|||
|
return patchedMethod;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 929:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = hasNextPage
|
|||
|
|
|||
|
const deprecate = __webpack_require__(370)
|
|||
|
const getPageLinks = __webpack_require__(577)
|
|||
|
|
|||
|
function hasNextPage (link) {
|
|||
|
deprecate(`octokit.hasNextPage() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`)
|
|||
|
return getPageLinks(link).next
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 948:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* Tries to execute a function and discards any error that occurs.
|
|||
|
* @param {Function} fn - Function that might or might not throw an error.
|
|||
|
* @returns {?*} Return-value of the function when no error occurred.
|
|||
|
*/
|
|||
|
module.exports = function(fn) {
|
|||
|
|
|||
|
try { return fn() } catch (e) {}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 954:
|
|||
|
/***/ (function(module) {
|
|||
|
|
|||
|
module.exports = validateAuth;
|
|||
|
|
|||
|
function validateAuth(auth) {
|
|||
|
if (typeof auth === "string") {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (typeof auth === "function") {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (auth.username && auth.password) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (auth.clientId && auth.clientSecret) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
throw new Error(`Invalid "auth" option: ${JSON.stringify(auth)}`);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 955:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
const path = __webpack_require__(622);
|
|||
|
const childProcess = __webpack_require__(129);
|
|||
|
const crossSpawn = __webpack_require__(20);
|
|||
|
const stripEof = __webpack_require__(768);
|
|||
|
const npmRunPath = __webpack_require__(621);
|
|||
|
const isStream = __webpack_require__(323);
|
|||
|
const _getStream = __webpack_require__(145);
|
|||
|
const pFinally = __webpack_require__(697);
|
|||
|
const onExit = __webpack_require__(260);
|
|||
|
const errname = __webpack_require__(427);
|
|||
|
const stdio = __webpack_require__(168);
|
|||
|
|
|||
|
const TEN_MEGABYTES = 1000 * 1000 * 10;
|
|||
|
|
|||
|
function handleArgs(cmd, args, opts) {
|
|||
|
let parsed;
|
|||
|
|
|||
|
opts = Object.assign({
|
|||
|
extendEnv: true,
|
|||
|
env: {}
|
|||
|
}, opts);
|
|||
|
|
|||
|
if (opts.extendEnv) {
|
|||
|
opts.env = Object.assign({}, process.env, opts.env);
|
|||
|
}
|
|||
|
|
|||
|
if (opts.__winShell === true) {
|
|||
|
delete opts.__winShell;
|
|||
|
parsed = {
|
|||
|
command: cmd,
|
|||
|
args,
|
|||
|
options: opts,
|
|||
|
file: cmd,
|
|||
|
original: {
|
|||
|
cmd,
|
|||
|
args
|
|||
|
}
|
|||
|
};
|
|||
|
} else {
|
|||
|
parsed = crossSpawn._parse(cmd, args, opts);
|
|||
|
}
|
|||
|
|
|||
|
opts = Object.assign({
|
|||
|
maxBuffer: TEN_MEGABYTES,
|
|||
|
buffer: true,
|
|||
|
stripEof: true,
|
|||
|
preferLocal: true,
|
|||
|
localDir: parsed.options.cwd || process.cwd(),
|
|||
|
encoding: 'utf8',
|
|||
|
reject: true,
|
|||
|
cleanup: true
|
|||
|
}, parsed.options);
|
|||
|
|
|||
|
opts.stdio = stdio(opts);
|
|||
|
|
|||
|
if (opts.preferLocal) {
|
|||
|
opts.env = npmRunPath.env(Object.assign({}, opts, {cwd: opts.localDir}));
|
|||
|
}
|
|||
|
|
|||
|
if (opts.detached) {
|
|||
|
// #115
|
|||
|
opts.cleanup = false;
|
|||
|
}
|
|||
|
|
|||
|
if (process.platform === 'win32' && path.basename(parsed.command) === 'cmd.exe') {
|
|||
|
// #116
|
|||
|
parsed.args.unshift('/q');
|
|||
|
}
|
|||
|
|
|||
|
return {
|
|||
|
cmd: parsed.command,
|
|||
|
args: parsed.args,
|
|||
|
opts,
|
|||
|
parsed
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
function handleInput(spawned, input) {
|
|||
|
if (input === null || input === undefined) {
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (isStream(input)) {
|
|||
|
input.pipe(spawned.stdin);
|
|||
|
} else {
|
|||
|
spawned.stdin.end(input);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function handleOutput(opts, val) {
|
|||
|
if (val && opts.stripEof) {
|
|||
|
val = stripEof(val);
|
|||
|
}
|
|||
|
|
|||
|
return val;
|
|||
|
}
|
|||
|
|
|||
|
function handleShell(fn, cmd, opts) {
|
|||
|
let file = '/bin/sh';
|
|||
|
let args = ['-c', cmd];
|
|||
|
|
|||
|
opts = Object.assign({}, opts);
|
|||
|
|
|||
|
if (process.platform === 'win32') {
|
|||
|
opts.__winShell = true;
|
|||
|
file = process.env.comspec || 'cmd.exe';
|
|||
|
args = ['/s', '/c', `"${cmd}"`];
|
|||
|
opts.windowsVerbatimArguments = true;
|
|||
|
}
|
|||
|
|
|||
|
if (opts.shell) {
|
|||
|
file = opts.shell;
|
|||
|
delete opts.shell;
|
|||
|
}
|
|||
|
|
|||
|
return fn(file, args, opts);
|
|||
|
}
|
|||
|
|
|||
|
function getStream(process, stream, {encoding, buffer, maxBuffer}) {
|
|||
|
if (!process[stream]) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
let ret;
|
|||
|
|
|||
|
if (!buffer) {
|
|||
|
// TODO: Use `ret = util.promisify(stream.finished)(process[stream]);` when targeting Node.js 10
|
|||
|
ret = new Promise((resolve, reject) => {
|
|||
|
process[stream]
|
|||
|
.once('end', resolve)
|
|||
|
.once('error', reject);
|
|||
|
});
|
|||
|
} else if (encoding) {
|
|||
|
ret = _getStream(process[stream], {
|
|||
|
encoding,
|
|||
|
maxBuffer
|
|||
|
});
|
|||
|
} else {
|
|||
|
ret = _getStream.buffer(process[stream], {maxBuffer});
|
|||
|
}
|
|||
|
|
|||
|
return ret.catch(err => {
|
|||
|
err.stream = stream;
|
|||
|
err.message = `${stream} ${err.message}`;
|
|||
|
throw err;
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
function makeError(result, options) {
|
|||
|
const {stdout, stderr} = result;
|
|||
|
|
|||
|
let err = result.error;
|
|||
|
const {code, signal} = result;
|
|||
|
|
|||
|
const {parsed, joinedCmd} = options;
|
|||
|
const timedOut = options.timedOut || false;
|
|||
|
|
|||
|
if (!err) {
|
|||
|
let output = '';
|
|||
|
|
|||
|
if (Array.isArray(parsed.opts.stdio)) {
|
|||
|
if (parsed.opts.stdio[2] !== 'inherit') {
|
|||
|
output += output.length > 0 ? stderr : `\n${stderr}`;
|
|||
|
}
|
|||
|
|
|||
|
if (parsed.opts.stdio[1] !== 'inherit') {
|
|||
|
output += `\n${stdout}`;
|
|||
|
}
|
|||
|
} else if (parsed.opts.stdio !== 'inherit') {
|
|||
|
output = `\n${stderr}${stdout}`;
|
|||
|
}
|
|||
|
|
|||
|
err = new Error(`Command failed: ${joinedCmd}${output}`);
|
|||
|
err.code = code < 0 ? errname(code) : code;
|
|||
|
}
|
|||
|
|
|||
|
err.stdout = stdout;
|
|||
|
err.stderr = stderr;
|
|||
|
err.failed = true;
|
|||
|
err.signal = signal || null;
|
|||
|
err.cmd = joinedCmd;
|
|||
|
err.timedOut = timedOut;
|
|||
|
|
|||
|
return err;
|
|||
|
}
|
|||
|
|
|||
|
function joinCmd(cmd, args) {
|
|||
|
let joinedCmd = cmd;
|
|||
|
|
|||
|
if (Array.isArray(args) && args.length > 0) {
|
|||
|
joinedCmd += ' ' + args.join(' ');
|
|||
|
}
|
|||
|
|
|||
|
return joinedCmd;
|
|||
|
}
|
|||
|
|
|||
|
module.exports = (cmd, args, opts) => {
|
|||
|
const parsed = handleArgs(cmd, args, opts);
|
|||
|
const {encoding, buffer, maxBuffer} = parsed.opts;
|
|||
|
const joinedCmd = joinCmd(cmd, args);
|
|||
|
|
|||
|
let spawned;
|
|||
|
try {
|
|||
|
spawned = childProcess.spawn(parsed.cmd, parsed.args, parsed.opts);
|
|||
|
} catch (err) {
|
|||
|
return Promise.reject(err);
|
|||
|
}
|
|||
|
|
|||
|
let removeExitHandler;
|
|||
|
if (parsed.opts.cleanup) {
|
|||
|
removeExitHandler = onExit(() => {
|
|||
|
spawned.kill();
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
let timeoutId = null;
|
|||
|
let timedOut = false;
|
|||
|
|
|||
|
const cleanup = () => {
|
|||
|
if (timeoutId) {
|
|||
|
clearTimeout(timeoutId);
|
|||
|
timeoutId = null;
|
|||
|
}
|
|||
|
|
|||
|
if (removeExitHandler) {
|
|||
|
removeExitHandler();
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
if (parsed.opts.timeout > 0) {
|
|||
|
timeoutId = setTimeout(() => {
|
|||
|
timeoutId = null;
|
|||
|
timedOut = true;
|
|||
|
spawned.kill(parsed.opts.killSignal);
|
|||
|
}, parsed.opts.timeout);
|
|||
|
}
|
|||
|
|
|||
|
const processDone = new Promise(resolve => {
|
|||
|
spawned.on('exit', (code, signal) => {
|
|||
|
cleanup();
|
|||
|
resolve({code, signal});
|
|||
|
});
|
|||
|
|
|||
|
spawned.on('error', err => {
|
|||
|
cleanup();
|
|||
|
resolve({error: err});
|
|||
|
});
|
|||
|
|
|||
|
if (spawned.stdin) {
|
|||
|
spawned.stdin.on('error', err => {
|
|||
|
cleanup();
|
|||
|
resolve({error: err});
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
function destroy() {
|
|||
|
if (spawned.stdout) {
|
|||
|
spawned.stdout.destroy();
|
|||
|
}
|
|||
|
|
|||
|
if (spawned.stderr) {
|
|||
|
spawned.stderr.destroy();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
const handlePromise = () => pFinally(Promise.all([
|
|||
|
processDone,
|
|||
|
getStream(spawned, 'stdout', {encoding, buffer, maxBuffer}),
|
|||
|
getStream(spawned, 'stderr', {encoding, buffer, maxBuffer})
|
|||
|
]).then(arr => {
|
|||
|
const result = arr[0];
|
|||
|
result.stdout = arr[1];
|
|||
|
result.stderr = arr[2];
|
|||
|
|
|||
|
if (result.error || result.code !== 0 || result.signal !== null) {
|
|||
|
const err = makeError(result, {
|
|||
|
joinedCmd,
|
|||
|
parsed,
|
|||
|
timedOut
|
|||
|
});
|
|||
|
|
|||
|
// TODO: missing some timeout logic for killed
|
|||
|
// https://github.com/nodejs/node/blob/master/lib/child_process.js#L203
|
|||
|
// err.killed = spawned.killed || killed;
|
|||
|
err.killed = err.killed || spawned.killed;
|
|||
|
|
|||
|
if (!parsed.opts.reject) {
|
|||
|
return err;
|
|||
|
}
|
|||
|
|
|||
|
throw err;
|
|||
|
}
|
|||
|
|
|||
|
return {
|
|||
|
stdout: handleOutput(parsed.opts, result.stdout),
|
|||
|
stderr: handleOutput(parsed.opts, result.stderr),
|
|||
|
code: 0,
|
|||
|
failed: false,
|
|||
|
killed: false,
|
|||
|
signal: null,
|
|||
|
cmd: joinedCmd,
|
|||
|
timedOut: false
|
|||
|
};
|
|||
|
}), destroy);
|
|||
|
|
|||
|
crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed);
|
|||
|
|
|||
|
handleInput(spawned, parsed.opts.input);
|
|||
|
|
|||
|
spawned.then = (onfulfilled, onrejected) => handlePromise().then(onfulfilled, onrejected);
|
|||
|
spawned.catch = onrejected => handlePromise().catch(onrejected);
|
|||
|
|
|||
|
return spawned;
|
|||
|
};
|
|||
|
|
|||
|
// TODO: set `stderr: 'ignore'` when that option is implemented
|
|||
|
module.exports.stdout = (...args) => module.exports(...args).then(x => x.stdout);
|
|||
|
|
|||
|
// TODO: set `stdout: 'ignore'` when that option is implemented
|
|||
|
module.exports.stderr = (...args) => module.exports(...args).then(x => x.stderr);
|
|||
|
|
|||
|
module.exports.shell = (cmd, opts) => handleShell(module.exports, cmd, opts);
|
|||
|
|
|||
|
module.exports.sync = (cmd, args, opts) => {
|
|||
|
const parsed = handleArgs(cmd, args, opts);
|
|||
|
const joinedCmd = joinCmd(cmd, args);
|
|||
|
|
|||
|
if (isStream(parsed.opts.input)) {
|
|||
|
throw new TypeError('The `input` option cannot be a stream in sync mode');
|
|||
|
}
|
|||
|
|
|||
|
const result = childProcess.spawnSync(parsed.cmd, parsed.args, parsed.opts);
|
|||
|
result.code = result.status;
|
|||
|
|
|||
|
if (result.error || result.status !== 0 || result.signal !== null) {
|
|||
|
const err = makeError(result, {
|
|||
|
joinedCmd,
|
|||
|
parsed
|
|||
|
});
|
|||
|
|
|||
|
if (!parsed.opts.reject) {
|
|||
|
return err;
|
|||
|
}
|
|||
|
|
|||
|
throw err;
|
|||
|
}
|
|||
|
|
|||
|
return {
|
|||
|
stdout: handleOutput(parsed.opts, result.stdout),
|
|||
|
stderr: handleOutput(parsed.opts, result.stderr),
|
|||
|
code: 0,
|
|||
|
failed: false,
|
|||
|
signal: null,
|
|||
|
cmd: joinedCmd,
|
|||
|
timedOut: false
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
module.exports.shellSync = (cmd, opts) => handleShell(module.exports.sync, cmd, opts);
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 966:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
const {PassThrough} = __webpack_require__(413);
|
|||
|
|
|||
|
module.exports = options => {
|
|||
|
options = Object.assign({}, options);
|
|||
|
|
|||
|
const {array} = options;
|
|||
|
let {encoding} = options;
|
|||
|
const buffer = encoding === 'buffer';
|
|||
|
let objectMode = false;
|
|||
|
|
|||
|
if (array) {
|
|||
|
objectMode = !(encoding || buffer);
|
|||
|
} else {
|
|||
|
encoding = encoding || 'utf8';
|
|||
|
}
|
|||
|
|
|||
|
if (buffer) {
|
|||
|
encoding = null;
|
|||
|
}
|
|||
|
|
|||
|
let len = 0;
|
|||
|
const ret = [];
|
|||
|
const stream = new PassThrough({objectMode});
|
|||
|
|
|||
|
if (encoding) {
|
|||
|
stream.setEncoding(encoding);
|
|||
|
}
|
|||
|
|
|||
|
stream.on('data', chunk => {
|
|||
|
ret.push(chunk);
|
|||
|
|
|||
|
if (objectMode) {
|
|||
|
len = ret.length;
|
|||
|
} else {
|
|||
|
len += chunk.length;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
stream.getBufferedValue = () => {
|
|||
|
if (array) {
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
return buffer ? Buffer.concat(ret, len) : ret.join('');
|
|||
|
};
|
|||
|
|
|||
|
stream.getBufferedLength = () => len;
|
|||
|
|
|||
|
return stream;
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 969:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
var wrappy = __webpack_require__(11)
|
|||
|
module.exports = wrappy(once)
|
|||
|
module.exports.strict = wrappy(onceStrict)
|
|||
|
|
|||
|
once.proto = once(function () {
|
|||
|
Object.defineProperty(Function.prototype, 'once', {
|
|||
|
value: function () {
|
|||
|
return once(this)
|
|||
|
},
|
|||
|
configurable: true
|
|||
|
})
|
|||
|
|
|||
|
Object.defineProperty(Function.prototype, 'onceStrict', {
|
|||
|
value: function () {
|
|||
|
return onceStrict(this)
|
|||
|
},
|
|||
|
configurable: true
|
|||
|
})
|
|||
|
})
|
|||
|
|
|||
|
function once (fn) {
|
|||
|
var f = function () {
|
|||
|
if (f.called) return f.value
|
|||
|
f.called = true
|
|||
|
return f.value = fn.apply(this, arguments)
|
|||
|
}
|
|||
|
f.called = false
|
|||
|
return f
|
|||
|
}
|
|||
|
|
|||
|
function onceStrict (fn) {
|
|||
|
var f = function () {
|
|||
|
if (f.called)
|
|||
|
throw new Error(f.onceError)
|
|||
|
f.called = true
|
|||
|
return f.value = fn.apply(this, arguments)
|
|||
|
}
|
|||
|
var name = fn.name || 'Function wrapped with `once`'
|
|||
|
f.onceError = name + " shouldn't be called more than once"
|
|||
|
f.called = false
|
|||
|
return f
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 986:
|
|||
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|||
|
|
|||
|
"use strict";
|
|||
|
|
|||
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|||
|
});
|
|||
|
};
|
|||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|||
|
const tr = __webpack_require__(9);
|
|||
|
/**
|
|||
|
* Exec a command.
|
|||
|
* Output will be streamed to the live console.
|
|||
|
* Returns promise with return code
|
|||
|
*
|
|||
|
* @param commandLine command to execute (can include additional args). Must be correctly escaped.
|
|||
|
* @param args optional arguments for tool. Escaping is handled by the lib.
|
|||
|
* @param options optional exec options. See ExecOptions
|
|||
|
* @returns Promise<number> exit code
|
|||
|
*/
|
|||
|
function exec(commandLine, args, options) {
|
|||
|
return __awaiter(this, void 0, void 0, function* () {
|
|||
|
const commandArgs = tr.argStringToArray(commandLine);
|
|||
|
if (commandArgs.length === 0) {
|
|||
|
throw new Error(`Parameter 'commandLine' cannot be null or empty.`);
|
|||
|
}
|
|||
|
// Path to tool to execute should be first arg
|
|||
|
const toolPath = commandArgs[0];
|
|||
|
args = commandArgs.slice(1).concat(args || []);
|
|||
|
const runner = new tr.ToolRunner(toolPath, args, options);
|
|||
|
return runner.exec();
|
|||
|
});
|
|||
|
}
|
|||
|
exports.exec = exec;
|
|||
|
//# sourceMappingURL=exec.js.map
|
|||
|
|
|||
|
/***/ }),
|
|||
|
|
|||
|
/***/ 991:
|
|||
|
/***/ (function(module, __unusedexports, __webpack_require__) {
|
|||
|
|
|||
|
module.exports = authenticationRequestError;
|
|||
|
|
|||
|
const { RequestError } = __webpack_require__(463);
|
|||
|
|
|||
|
function authenticationRequestError(state, error, options) {
|
|||
|
if (!error.headers) throw error;
|
|||
|
|
|||
|
const otpRequired = /required/.test(error.headers["x-github-otp"] || "");
|
|||
|
// handle "2FA required" error only
|
|||
|
if (error.status !== 401 || !otpRequired) {
|
|||
|
throw error;
|
|||
|
}
|
|||
|
|
|||
|
if (
|
|||
|
error.status === 401 &&
|
|||
|
otpRequired &&
|
|||
|
error.request &&
|
|||
|
error.request.headers["x-github-otp"]
|
|||
|
) {
|
|||
|
if (state.otp) {
|
|||
|
delete state.otp; // no longer valid, request again
|
|||
|
} else {
|
|||
|
throw new RequestError(
|
|||
|
"Invalid one-time password for two-factor authentication",
|
|||
|
401,
|
|||
|
{
|
|||
|
headers: error.headers,
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (typeof state.auth.on2fa !== "function") {
|
|||
|
throw new RequestError(
|
|||
|
"2FA required, but options.on2fa is not a function. See https://github.com/octokit/rest.js#authentication",
|
|||
|
401,
|
|||
|
{
|
|||
|
headers: error.headers,
|
|||
|
request: options
|
|||
|
}
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
return Promise.resolve()
|
|||
|
.then(() => {
|
|||
|
return state.auth.on2fa();
|
|||
|
})
|
|||
|
.then(oneTimePassword => {
|
|||
|
const newOptions = Object.assign(options, {
|
|||
|
headers: Object.assign(options.headers, {
|
|||
|
"x-github-otp": oneTimePassword
|
|||
|
})
|
|||
|
});
|
|||
|
return state.octokit.request(newOptions).then(response => {
|
|||
|
// If OTP still valid, then persist it for following requests
|
|||
|
state.otp = oneTimePassword;
|
|||
|
return response;
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/***/ })
|
|||
|
|
|||
|
/******/ });
|