neiam /action-setup-beam
action-setup-beam
public · Issues · Pulls · Labels · Forks · Compare · Actions queued
⭐
Log in to mark this repository.
set installed versions as outputs
1148b8f · Chris Dosé · 2020-07-26 06:24
Files changed
modified
dist/index.js
+796
−1475
@@ -19,7 +19,13 @@ module.exports =
| 19 | 19 | /******/ }; |
| 20 | 20 | /******/ |
| 21 | 21 | /******/ // Execute the module function |
| 22 | −/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | |
| 22 | +/******/ var threw = true; | |
| 23 | +/******/ try { | |
| 24 | +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | |
| 25 | +/******/ threw = false; | |
| 26 | +/******/ } finally { | |
| 27 | +/******/ if(threw) delete installedModules[moduleId]; | |
| 28 | +/******/ } | |
| 23 | 29 | /******/ |
| 24 | 30 | /******/ // Flag the module as loaded |
| 25 | 31 | /******/ module.l = true; |
@@ -47,605 +53,578 @@ module.exports =
| 47 | 53 | /***/ (function(__unusedmodule, exports, __webpack_require__) { |
| 48 | 54 | |
| 49 | 55 | "use strict"; |
| 50 | − | |
| 51 | −var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | |
| 52 | − function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | |
| 53 | − return new (P || (P = Promise))(function (resolve, reject) { | |
| 54 | − function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| 55 | − function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| 56 | − function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | |
| 57 | − step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| 58 | − }); | |
| 59 | −}; | |
| 60 | −var __importStar = (this && this.__importStar) || function (mod) { | |
| 61 | − if (mod && mod.__esModule) return mod; | |
| 62 | − var result = {}; | |
| 63 | − if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | |
| 64 | − result["default"] = mod; | |
| 65 | − return result; | |
| 66 | −}; | |
| 67 | −Object.defineProperty(exports, "__esModule", { value: true }); | |
| 68 | −const os = __importStar(__webpack_require__(87)); | |
| 69 | −const events = __importStar(__webpack_require__(614)); | |
| 70 | −const child = __importStar(__webpack_require__(129)); | |
| 71 | −const path = __importStar(__webpack_require__(622)); | |
| 72 | −const io = __importStar(__webpack_require__(194)); | |
| 73 | −const ioUtil = __importStar(__webpack_require__(408)); | |
| 74 | −/* eslint-disable @typescript-eslint/unbound-method */ | |
| 75 | −const IS_WINDOWS = process.platform === 'win32'; | |
| 76 | −/* | |
| 77 | − * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way. | |
| 78 | − */ | |
| 79 | −class ToolRunner extends events.EventEmitter { | |
| 80 | − constructor(toolPath, args, options) { | |
| 81 | − super(); | |
| 82 | − if (!toolPath) { | |
| 83 | − throw new Error("Parameter 'toolPath' cannot be null or empty."); | |
| 84 | − } | |
| 85 | − this.toolPath = toolPath; | |
| 86 | − this.args = args || []; | |
| 87 | − this.options = options || {}; | |
| 88 | − } | |
| 89 | − _debug(message) { | |
| 90 | − if (this.options.listeners && this.options.listeners.debug) { | |
| 91 | − this.options.listeners.debug(message); | |
| 92 | − } | |
| 93 | − } | |
| 94 | − _getCommandString(options, noPrefix) { | |
| 95 | − const toolPath = this._getSpawnFileName(); | |
| 96 | − const args = this._getSpawnArgs(options); | |
| 97 | − let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool | |
| 98 | − if (IS_WINDOWS) { | |
| 99 | − // Windows + cmd file | |
| 100 | − if (this._isCmdFile()) { | |
| 101 | − cmd += toolPath; | |
| 102 | − for (const a of args) { | |
| 103 | − cmd += ` ${a}`; | |
| 104 | − } | |
| 105 | − } | |
| 106 | − // Windows + verbatim | |
| 107 | − else if (options.windowsVerbatimArguments) { | |
| 108 | − cmd += `"${toolPath}"`; | |
| 109 | − for (const a of args) { | |
| 110 | − cmd += ` ${a}`; | |
| 111 | − } | |
| 112 | − } | |
| 113 | − // Windows (regular) | |
| 114 | − else { | |
| 115 | − cmd += this._windowsQuoteCmdArg(toolPath); | |
| 116 | − for (const a of args) { | |
| 117 | − cmd += ` ${this._windowsQuoteCmdArg(a)}`; | |
| 118 | − } | |
| 119 | − } | |
| 120 | − } | |
| 121 | − else { | |
| 122 | − // OSX/Linux - this can likely be improved with some form of quoting. | |
| 123 | − // creating processes on Unix is fundamentally different than Windows. | |
| 124 | − // on Unix, execvp() takes an arg array. | |
| 125 | − cmd += toolPath; | |
| 126 | − for (const a of args) { | |
| 127 | − cmd += ` ${a}`; | |
| 128 | − } | |
| 129 | − } | |
| 130 | − return cmd; | |
| 131 | − } | |
| 132 | − _processLineBuffer(data, strBuffer, onLine) { | |
| 133 | − try { | |
| 134 | − let s = strBuffer + data.toString(); | |
| 135 | − let n = s.indexOf(os.EOL); | |
| 136 | − while (n > -1) { | |
| 137 | − const line = s.substring(0, n); | |
| 138 | − onLine(line); | |
| 139 | − // the rest of the string ... | |
| 140 | − s = s.substring(n + os.EOL.length); | |
| 141 | − n = s.indexOf(os.EOL); | |
| 142 | − } | |
| 143 | − strBuffer = s; | |
| 144 | − } | |
| 145 | − catch (err) { | |
| 146 | − // streaming lines to console is best effort. Don't fail a build. | |
| 147 | − this._debug(`error processing line. Failed with error ${err}`); | |
| 148 | − } | |
| 149 | − } | |
| 150 | − _getSpawnFileName() { | |
| 151 | − if (IS_WINDOWS) { | |
| 152 | − if (this._isCmdFile()) { | |
| 153 | − return process.env['COMSPEC'] || 'cmd.exe'; | |
| 154 | − } | |
| 155 | − } | |
| 156 | − return this.toolPath; | |
| 157 | − } | |
| 158 | − _getSpawnArgs(options) { | |
| 159 | − if (IS_WINDOWS) { | |
| 160 | − if (this._isCmdFile()) { | |
| 161 | − let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; | |
| 162 | − for (const a of this.args) { | |
| 163 | − argline += ' '; | |
| 164 | − argline += options.windowsVerbatimArguments | |
| 165 | − ? a | |
| 166 | − : this._windowsQuoteCmdArg(a); | |
| 167 | − } | |
| 168 | − argline += '"'; | |
| 169 | − return [argline]; | |
| 170 | − } | |
| 171 | − } | |
| 172 | − return this.args; | |
| 173 | − } | |
| 174 | − _endsWith(str, end) { | |
| 175 | − return str.endsWith(end); | |
| 176 | − } | |
| 177 | − _isCmdFile() { | |
| 178 | − const upperToolPath = this.toolPath.toUpperCase(); | |
| 179 | − return (this._endsWith(upperToolPath, '.CMD') || | |
| 180 | − this._endsWith(upperToolPath, '.BAT')); | |
| 181 | − } | |
| 182 | − _windowsQuoteCmdArg(arg) { | |
| 183 | − // for .exe, apply the normal quoting rules that libuv applies | |
| 184 | − if (!this._isCmdFile()) { | |
| 185 | − return this._uvQuoteCmdArg(arg); | |
| 186 | − } | |
| 187 | − // otherwise apply quoting rules specific to the cmd.exe command line parser. | |
| 188 | − // the libuv rules are generic and are not designed specifically for cmd.exe | |
| 189 | − // command line parser. | |
| 190 | − // | |
| 191 | − // for a detailed description of the cmd.exe command line parser, refer to | |
| 192 | − // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912 | |
| 193 | − // need quotes for empty arg | |
| 194 | − if (!arg) { | |
| 195 | − return '""'; | |
| 196 | − } | |
| 197 | − // determine whether the arg needs to be quoted | |
| 198 | − const cmdSpecialChars = [ | |
| 199 | − ' ', | |
| 200 | − '\t', | |
| 201 | − '&', | |
| 202 | − '(', | |
| 203 | − ')', | |
| 204 | − '[', | |
| 205 | − ']', | |
| 206 | − '{', | |
| 207 | − '}', | |
| 208 | − '^', | |
| 209 | − '=', | |
| 210 | − ';', | |
| 211 | − '!', | |
| 212 | − "'", | |
| 213 | − '+', | |
| 214 | − ',', | |
| 215 | − '`', | |
| 216 | − '~', | |
| 217 | − '|', | |
| 218 | − '<', | |
| 219 | − '>', | |
| 220 | − '"' | |
| 221 | − ]; | |
| 222 | − let needsQuotes = false; | |
| 223 | − for (const char of arg) { | |
| 224 | − if (cmdSpecialChars.some(x => x === char)) { | |
| 225 | − needsQuotes = true; | |
| 226 | − break; | |
| 227 | − } | |
| 228 | − } | |
| 229 | − // short-circuit if quotes not needed | |
| 230 | − if (!needsQuotes) { | |
| 231 | − return arg; | |
| 232 | − } | |
| 233 | − // the following quoting rules are very similar to the rules that by libuv applies. | |
| 234 | − // | |
| 235 | − // 1) wrap the string in quotes | |
| 236 | − // | |
| 237 | − // 2) double-up quotes - i.e. " => "" | |
| 238 | − // | |
| 239 | − // this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately | |
| 240 | − // doesn't work well with a cmd.exe command line. | |
| 241 | − // | |
| 242 | − // note, replacing " with "" also works well if the arg is passed to a downstream .NET console app. | |
| 243 | − // for example, the command line: | |
| 244 | − // foo.exe "myarg:""my val""" | |
| 245 | − // is parsed by a .NET console app into an arg array: | |
| 246 | − // [ "myarg:\"my val\"" ] | |
| 247 | − // which is the same end result when applying libuv quoting rules. although the actual | |
| 248 | − // command line from libuv quoting rules would look like: | |
| 249 | − // foo.exe "myarg:\"my val\"" | |
| 250 | − // | |
| 251 | − // 3) double-up slashes that precede a quote, | |
| 252 | − // e.g. hello \world => "hello \world" | |
| 253 | − // hello\"world => "hello\\""world" | |
| 254 | − // hello\\"world => "hello\\\\""world" | |
| 255 | − // hello world\ => "hello world\\" | |
| 256 | − // | |
| 257 | − // technically this is not required for a cmd.exe command line, or the batch argument parser. | |
| 258 | − // the reasons for including this as a .cmd quoting rule are: | |
| 259 | − // | |
| 260 | − // a) this is optimized for the scenario where the argument is passed from the .cmd file to an | |
| 261 | − // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule. | |
| 262 | − // | |
| 263 | − // b) it's what we've been doing previously (by deferring to node default behavior) and we | |
| 264 | − // haven't heard any complaints about that aspect. | |
| 265 | − // | |
| 266 | − // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be | |
| 267 | − // escaped when used on the command line directly - even though within a .cmd file % can be escaped | |
| 268 | − // by using %%. | |
| 269 | − // | |
| 270 | − // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts | |
| 271 | − // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing. | |
| 272 | − // | |
| 273 | − // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would | |
| 274 | − // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the | |
| 275 | − // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args | |
| 276 | − // to an external program. | |
| 277 | − // | |
| 278 | − // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file. | |
| 279 | − // % can be escaped within a .cmd file. | |
| 280 | − let reverse = '"'; | |
| 281 | − let quoteHit = true; | |
| 282 | − for (let i = arg.length; i > 0; i--) { | |
| 283 | − // walk the string in reverse | |
| 284 | − reverse += arg[i - 1]; | |
| 285 | − if (quoteHit && arg[i - 1] === '\\') { | |
| 286 | − reverse += '\\'; // double the slash | |
| 287 | − } | |
| 288 | − else if (arg[i - 1] === '"') { | |
| 289 | − quoteHit = true; | |
| 290 | − reverse += '"'; // double the quote | |
| 291 | − } | |
| 292 | − else { | |
| 293 | − quoteHit = false; | |
| 294 | − } | |
| 295 | − } | |
| 296 | − reverse += '"'; | |
| 297 | − return reverse | |
| 298 | − .split('') | |
| 299 | − .reverse() | |
| 300 | − .join(''); | |
| 301 | − } | |
| 302 | − _uvQuoteCmdArg(arg) { | |
| 303 | − // Tool runner wraps child_process.spawn() and needs to apply the same quoting as | |
| 304 | − // Node in certain cases where the undocumented spawn option windowsVerbatimArguments | |
| 305 | − // is used. | |
| 306 | − // | |
| 307 | − // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV, | |
| 308 | − // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details), | |
| 309 | − // pasting copyright notice from Node within this function: | |
| 310 | − // | |
| 311 | − // Copyright Joyent, Inc. and other Node contributors. All rights reserved. | |
| 312 | − // | |
| 313 | − // Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 314 | − // of this software and associated documentation files (the "Software"), to | |
| 315 | − // deal in the Software without restriction, including without limitation the | |
| 316 | − // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |
| 317 | − // sell copies of the Software, and to permit persons to whom the Software is | |
| 318 | − // furnished to do so, subject to the following conditions: | |
| 319 | − // | |
| 320 | − // The above copyright notice and this permission notice shall be included in | |
| 321 | − // all copies or substantial portions of the Software. | |
| 322 | − // | |
| 323 | − // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 324 | − // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 325 | − // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 326 | − // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 327 | − // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| 328 | − // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
| 329 | − // IN THE SOFTWARE. | |
| 330 | − if (!arg) { | |
| 331 | − // Need double quotation for empty argument | |
| 332 | − return '""'; | |
| 333 | − } | |
| 334 | − if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) { | |
| 335 | − // No quotation needed | |
| 336 | − return arg; | |
| 337 | − } | |
| 338 | − if (!arg.includes('"') && !arg.includes('\\')) { | |
| 339 | − // No embedded double quotes or backslashes, so I can just wrap | |
| 340 | − // quote marks around the whole thing. | |
| 341 | − return `"${arg}"`; | |
| 342 | − } | |
| 343 | − // Expected input/output: | |
| 344 | − // input : hello"world | |
| 345 | − // output: "hello\"world" | |
| 346 | − // input : hello""world | |
| 347 | − // output: "hello\"\"world" | |
| 348 | − // input : hello\world | |
| 349 | − // output: hello\world | |
| 350 | − // input : hello\\world | |
| 351 | − // output: hello\\world | |
| 352 | − // input : hello\"world | |
| 353 | − // output: "hello\\\"world" | |
| 354 | − // input : hello\\"world | |
| 355 | − // output: "hello\\\\\"world" | |
| 356 | − // input : hello world\ | |
| 357 | − // output: "hello world\\" - note the comment in libuv actually reads "hello world\" | |
| 358 | − // but it appears the comment is wrong, it should be "hello world\\" | |
| 359 | − let reverse = '"'; | |
| 360 | − let quoteHit = true; | |
| 361 | − for (let i = arg.length; i > 0; i--) { | |
| 362 | − // walk the string in reverse | |
| 363 | − reverse += arg[i - 1]; | |
| 364 | − if (quoteHit && arg[i - 1] === '\\') { | |
| 365 | − reverse += '\\'; | |
| 366 | − } | |
| 367 | − else if (arg[i - 1] === '"') { | |
| 368 | − quoteHit = true; | |
| 369 | − reverse += '\\'; | |
| 370 | − } | |
| 371 | − else { | |
| 372 | − quoteHit = false; | |
| 373 | − } | |
| 374 | − } | |
| 375 | − reverse += '"'; | |
| 376 | − return reverse | |
| 377 | − .split('') | |
| 378 | − .reverse() | |
| 379 | − .join(''); | |
| 380 | − } | |
| 381 | − _cloneExecOptions(options) { | |
| 382 | − options = options || {}; | |
| 383 | − const result = { | |
| 384 | − cwd: options.cwd || process.cwd(), | |
| 385 | − env: options.env || process.env, | |
| 386 | − silent: options.silent || false, | |
| 387 | − windowsVerbatimArguments: options.windowsVerbatimArguments || false, | |
| 388 | − failOnStdErr: options.failOnStdErr || false, | |
| 389 | − ignoreReturnCode: options.ignoreReturnCode || false, | |
| 390 | − delay: options.delay || 10000 | |
| 391 | − }; | |
| 392 | − result.outStream = options.outStream || process.stdout; | |
| 393 | − result.errStream = options.errStream || process.stderr; | |
| 394 | − return result; | |
| 395 | − } | |
| 396 | − _getSpawnOptions(options, toolPath) { | |
| 397 | − options = options || {}; | |
| 398 | − const result = {}; | |
| 399 | − result.cwd = options.cwd; | |
| 400 | − result.env = options.env; | |
| 401 | − result['windowsVerbatimArguments'] = | |
| 402 | − options.windowsVerbatimArguments || this._isCmdFile(); | |
| 403 | − if (options.windowsVerbatimArguments) { | |
| 404 | − result.argv0 = `"${toolPath}"`; | |
| 405 | − } | |
| 406 | − return result; | |
| 407 | − } | |
| 408 | − /** | |
| 409 | − * Exec a tool. | |
| 410 | − * Output will be streamed to the live console. | |
| 411 | − * Returns promise with return code | |
| 412 | − * | |
| 413 | − * @param tool path to tool to exec | |
| 414 | − * @param options optional exec options. See ExecOptions | |
| 415 | − * @returns number | |
| 416 | − */ | |
| 417 | − exec() { | |
| 418 | − return __awaiter(this, void 0, void 0, function* () { | |
| 419 | − // root the tool path if it is unrooted and contains relative pathing | |
| 420 | − if (!ioUtil.isRooted(this.toolPath) && | |
| 421 | − (this.toolPath.includes('/') || | |
| 422 | − (IS_WINDOWS && this.toolPath.includes('\\')))) { | |
| 423 | − // prefer options.cwd if it is specified, however options.cwd may also need to be rooted | |
| 424 | − this.toolPath = path.resolve(process.cwd(), this.options.cwd || process.cwd(), this.toolPath); | |
| 425 | − } | |
| 426 | − // if the tool is only a file name, then resolve it from the PATH | |
| 427 | − // otherwise verify it exists (add extension on Windows if necessary) | |
| 428 | − this.toolPath = yield io.which(this.toolPath, true); | |
| 429 | − return new Promise((resolve, reject) => { | |
| 430 | − this._debug(`exec tool: ${this.toolPath}`); | |
| 431 | − this._debug('arguments:'); | |
| 432 | − for (const arg of this.args) { | |
| 433 | − this._debug(` ${arg}`); | |
| 434 | − } | |
| 435 | − const optionsNonNull = this._cloneExecOptions(this.options); | |
| 436 | − if (!optionsNonNull.silent && optionsNonNull.outStream) { | |
| 437 | − optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); | |
| 438 | − } | |
| 439 | − const state = new ExecState(optionsNonNull, this.toolPath); | |
| 440 | − state.on('debug', (message) => { | |
| 441 | − this._debug(message); | |
| 442 | − }); | |
| 443 | − const fileName = this._getSpawnFileName(); | |
| 444 | − const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); | |
| 445 | − const stdbuffer = ''; | |
| 446 | − if (cp.stdout) { | |
| 447 | − cp.stdout.on('data', (data) => { | |
| 448 | − if (this.options.listeners && this.options.listeners.stdout) { | |
| 449 | − this.options.listeners.stdout(data); | |
| 450 | − } | |
| 451 | − if (!optionsNonNull.silent && optionsNonNull.outStream) { | |
| 452 | − optionsNonNull.outStream.write(data); | |
| 453 | − } | |
| 454 | − this._processLineBuffer(data, stdbuffer, (line) => { | |
| 455 | − if (this.options.listeners && this.options.listeners.stdline) { | |
| 456 | − this.options.listeners.stdline(line); | |
| 457 | − } | |
| 458 | − }); | |
| 459 | − }); | |
| 460 | − } | |
| 461 | − const errbuffer = ''; | |
| 462 | − if (cp.stderr) { | |
| 463 | − cp.stderr.on('data', (data) => { | |
| 464 | − state.processStderr = true; | |
| 465 | − if (this.options.listeners && this.options.listeners.stderr) { | |
| 466 | − this.options.listeners.stderr(data); | |
| 467 | − } | |
| 468 | − if (!optionsNonNull.silent && | |
| 469 | − optionsNonNull.errStream && | |
| 470 | − optionsNonNull.outStream) { | |
| 471 | − const s = optionsNonNull.failOnStdErr | |
| 472 | − ? optionsNonNull.errStream | |
| 473 | − : optionsNonNull.outStream; | |
| 474 | − s.write(data); | |
| 475 | − } | |
| 476 | − this._processLineBuffer(data, errbuffer, (line) => { | |
| 477 | − if (this.options.listeners && this.options.listeners.errline) { | |
| 478 | − this.options.listeners.errline(line); | |
| 479 | − } | |
| 480 | − }); | |
| 481 | − }); | |
| 482 | − } | |
| 483 | − cp.on('error', (err) => { | |
| 484 | − state.processError = err.message; | |
| 485 | − state.processExited = true; | |
| 486 | − state.processClosed = true; | |
| 487 | − state.CheckComplete(); | |
| 488 | − }); | |
| 489 | − cp.on('exit', (code) => { | |
| 490 | − state.processExitCode = code; | |
| 491 | − state.processExited = true; | |
| 492 | − this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); | |
| 493 | − state.CheckComplete(); | |
| 494 | − }); | |
| 495 | − cp.on('close', (code) => { | |
| 496 | − state.processExitCode = code; | |
| 497 | − state.processExited = true; | |
| 498 | − state.processClosed = true; | |
| 499 | − this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); | |
| 500 | − state.CheckComplete(); | |
| 501 | − }); | |
| 502 | − state.on('done', (error, exitCode) => { | |
| 503 | − if (stdbuffer.length > 0) { | |
| 504 | − this.emit('stdline', stdbuffer); | |
| 505 | − } | |
| 506 | − if (errbuffer.length > 0) { | |
| 507 | − this.emit('errline', errbuffer); | |
| 508 | − } | |
| 509 | − cp.removeAllListeners(); | |
| 510 | − if (error) { | |
| 511 | − reject(error); | |
| 512 | − } | |
| 513 | − else { | |
| 514 | − resolve(exitCode); | |
| 515 | − } | |
| 516 | − }); | |
| 517 | − if (this.options.input) { | |
| 518 | − if (!cp.stdin) { | |
| 519 | − throw new Error('child process missing stdin'); | |
| 520 | − } | |
| 521 | − cp.stdin.end(this.options.input); | |
| 522 | − } | |
| 523 | − }); | |
| 524 | − }); | |
| 525 | − } | |
| 526 | −} | |
| 527 | −exports.ToolRunner = ToolRunner; | |
| 528 | −/** | |
| 529 | − * Convert an arg string to an array of args. Handles escaping | |
| 530 | − * | |
| 531 | − * @param argString string of arguments | |
| 532 | − * @returns string[] array of arguments | |
| 533 | − */ | |
| 534 | −function argStringToArray(argString) { | |
| 535 | − const args = []; | |
| 536 | − let inQuotes = false; | |
| 537 | − let escaped = false; | |
| 538 | − let arg = ''; | |
| 539 | − function append(c) { | |
| 540 | − // we only escape double quotes. | |
| 541 | − if (escaped && c !== '"') { | |
| 542 | − arg += '\\'; | |
| 543 | − } | |
| 544 | − arg += c; | |
| 545 | − escaped = false; | |
| 546 | − } | |
| 547 | − for (let i = 0; i < argString.length; i++) { | |
| 548 | − const c = argString.charAt(i); | |
| 549 | − if (c === '"') { | |
| 550 | − if (!escaped) { | |
| 551 | − inQuotes = !inQuotes; | |
| 552 | − } | |
| 553 | − else { | |
| 554 | − append(c); | |
| 555 | − } | |
| 556 | − continue; | |
| 557 | − } | |
| 558 | − if (c === '\\' && escaped) { | |
| 559 | − append(c); | |
| 560 | − continue; | |
| 561 | − } | |
| 562 | − if (c === '\\' && inQuotes) { | |
| 563 | − escaped = true; | |
| 564 | − continue; | |
| 565 | − } | |
| 566 | − if (c === ' ' && !inQuotes) { | |
| 567 | − if (arg.length > 0) { | |
| 568 | − args.push(arg); | |
| 569 | − arg = ''; | |
| 570 | − } | |
| 571 | − continue; | |
| 572 | − } | |
| 573 | − append(c); | |
| 574 | − } | |
| 575 | − if (arg.length > 0) { | |
| 576 | − args.push(arg.trim()); | |
| 577 | − } | |
| 578 | − return args; | |
| 579 | −} | |
| 580 | −exports.argStringToArray = argStringToArray; | |
| 581 | −class ExecState extends events.EventEmitter { | |
| 582 | − constructor(options, toolPath) { | |
| 583 | − super(); | |
| 584 | − this.processClosed = false; // tracks whether the process has exited and stdio is closed | |
| 585 | − this.processError = ''; | |
| 586 | − this.processExitCode = 0; | |
| 587 | − this.processExited = false; // tracks whether the process has exited | |
| 588 | − this.processStderr = false; // tracks whether stderr was written to | |
| 589 | − this.delay = 10000; // 10 seconds | |
| 590 | − this.done = false; | |
| 591 | − this.timeout = null; | |
| 592 | − if (!toolPath) { | |
| 593 | − throw new Error('toolPath must not be empty'); | |
| 594 | − } | |
| 595 | − this.options = options; | |
| 596 | − this.toolPath = toolPath; | |
| 597 | − if (options.delay) { | |
| 598 | − this.delay = options.delay; | |
| 599 | − } | |
| 600 | − } | |
| 601 | − CheckComplete() { | |
| 602 | − if (this.done) { | |
| 603 | − return; | |
| 604 | − } | |
| 605 | − if (this.processClosed) { | |
| 606 | − this._setResult(); | |
| 607 | − } | |
| 608 | − else if (this.processExited) { | |
| 609 | − this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this); | |
| 610 | − } | |
| 611 | − } | |
| 612 | − _debug(message) { | |
| 613 | − this.emit('debug', message); | |
| 614 | − } | |
| 615 | − _setResult() { | |
| 616 | − // determine whether there is an error | |
| 617 | − let error; | |
| 618 | − if (this.processExited) { | |
| 619 | − if (this.processError) { | |
| 620 | − 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}`); | |
| 621 | − } | |
| 622 | − else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { | |
| 623 | − error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); | |
| 624 | − } | |
| 625 | − else if (this.processStderr && this.options.failOnStdErr) { | |
| 626 | − error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); | |
| 627 | − } | |
| 628 | − } | |
| 629 | − // clear the timeout | |
| 630 | − if (this.timeout) { | |
| 631 | − clearTimeout(this.timeout); | |
| 632 | − this.timeout = null; | |
| 633 | − } | |
| 634 | − this.done = true; | |
| 635 | − this.emit('done', error, this.processExitCode); | |
| 636 | − } | |
| 637 | − static HandleTimeout(state) { | |
| 638 | − if (state.done) { | |
| 639 | − return; | |
| 640 | − } | |
| 641 | − if (!state.processClosed && state.processExited) { | |
| 642 | − const message = `The STDIO streams did not close within ${state.delay / | |
| 643 | − 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.`; | |
| 644 | − state._debug(message); | |
| 645 | − } | |
| 646 | − state._setResult(); | |
| 647 | − } | |
| 648 | −} | |
| 56 | + | |
| 57 | +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | |
| 58 | + return new (P || (P = Promise))(function (resolve, reject) { | |
| 59 | + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| 60 | + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| 61 | + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | |
| 62 | + step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| 63 | + }); | |
| 64 | +}; | |
| 65 | +Object.defineProperty(exports, "__esModule", { value: true }); | |
| 66 | +const os = __webpack_require__(87); | |
| 67 | +const events = __webpack_require__(614); | |
| 68 | +const child = __webpack_require__(129); | |
| 69 | +/* eslint-disable @typescript-eslint/unbound-method */ | |
| 70 | +const IS_WINDOWS = process.platform === 'win32'; | |
| 71 | +/* | |
| 72 | + * Class for running command line tools. Handles quoting and arg parsing in a platform agnostic way. | |
| 73 | + */ | |
| 74 | +class ToolRunner extends events.EventEmitter { | |
| 75 | + constructor(toolPath, args, options) { | |
| 76 | + super(); | |
| 77 | + if (!toolPath) { | |
| 78 | + throw new Error("Parameter 'toolPath' cannot be null or empty."); | |
| 79 | + } | |
| 80 | + this.toolPath = toolPath; | |
| 81 | + this.args = args || []; | |
| 82 | + this.options = options || {}; | |
| 83 | + } | |
| 84 | + _debug(message) { | |
| 85 | + if (this.options.listeners && this.options.listeners.debug) { | |
| 86 | + this.options.listeners.debug(message); | |
| 87 | + } | |
| 88 | + } | |
| 89 | + _getCommandString(options, noPrefix) { | |
| 90 | + const toolPath = this._getSpawnFileName(); | |
| 91 | + const args = this._getSpawnArgs(options); | |
| 92 | + let cmd = noPrefix ? '' : '[command]'; // omit prefix when piped to a second tool | |
| 93 | + if (IS_WINDOWS) { | |
| 94 | + // Windows + cmd file | |
| 95 | + if (this._isCmdFile()) { | |
| 96 | + cmd += toolPath; | |
| 97 | + for (const a of args) { | |
| 98 | + cmd += ` ${a}`; | |
| 99 | + } | |
| 100 | + } | |
| 101 | + // Windows + verbatim | |
| 102 | + else if (options.windowsVerbatimArguments) { | |
| 103 | + cmd += `"${toolPath}"`; | |
| 104 | + for (const a of args) { | |
| 105 | + cmd += ` ${a}`; | |
| 106 | + } | |
| 107 | + } | |
| 108 | + // Windows (regular) | |
| 109 | + else { | |
| 110 | + cmd += this._windowsQuoteCmdArg(toolPath); | |
| 111 | + for (const a of args) { | |
| 112 | + cmd += ` ${this._windowsQuoteCmdArg(a)}`; | |
| 113 | + } | |
| 114 | + } | |
| 115 | + } | |
| 116 | + else { | |
| 117 | + // OSX/Linux - this can likely be improved with some form of quoting. | |
| 118 | + // creating processes on Unix is fundamentally different than Windows. | |
| 119 | + // on Unix, execvp() takes an arg array. | |
| 120 | + cmd += toolPath; | |
| 121 | + for (const a of args) { | |
| 122 | + cmd += ` ${a}`; | |
| 123 | + } | |
| 124 | + } | |
| 125 | + return cmd; | |
| 126 | + } | |
| 127 | + _processLineBuffer(data, strBuffer, onLine) { | |
| 128 | + try { | |
| 129 | + let s = strBuffer + data.toString(); | |
| 130 | + let n = s.indexOf(os.EOL); | |
| 131 | + while (n > -1) { | |
| 132 | + const line = s.substring(0, n); | |
| 133 | + onLine(line); | |
| 134 | + // the rest of the string ... | |
| 135 | + s = s.substring(n + os.EOL.length); | |
| 136 | + n = s.indexOf(os.EOL); | |
| 137 | + } | |
| 138 | + strBuffer = s; | |
| 139 | + } | |
| 140 | + catch (err) { | |
| 141 | + // streaming lines to console is best effort. Don't fail a build. | |
| 142 | + this._debug(`error processing line. Failed with error ${err}`); | |
| 143 | + } | |
| 144 | + } | |
| 145 | + _getSpawnFileName() { | |
| 146 | + if (IS_WINDOWS) { | |
| 147 | + if (this._isCmdFile()) { | |
| 148 | + return process.env['COMSPEC'] || 'cmd.exe'; | |
| 149 | + } | |
| 150 | + } | |
| 151 | + return this.toolPath; | |
| 152 | + } | |
| 153 | + _getSpawnArgs(options) { | |
| 154 | + if (IS_WINDOWS) { | |
| 155 | + if (this._isCmdFile()) { | |
| 156 | + let argline = `/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`; | |
| 157 | + for (const a of this.args) { | |
| 158 | + argline += ' '; | |
| 159 | + argline += options.windowsVerbatimArguments | |
| 160 | + ? a | |
| 161 | + : this._windowsQuoteCmdArg(a); | |
| 162 | + } | |
| 163 | + argline += '"'; | |
| 164 | + return [argline]; | |
| 165 | + } | |
| 166 | + } | |
| 167 | + return this.args; | |
| 168 | + } | |
| 169 | + _endsWith(str, end) { | |
| 170 | + return str.endsWith(end); | |
| 171 | + } | |
| 172 | + _isCmdFile() { | |
| 173 | + const upperToolPath = this.toolPath.toUpperCase(); | |
| 174 | + return (this._endsWith(upperToolPath, '.CMD') || | |
| 175 | + this._endsWith(upperToolPath, '.BAT')); | |
| 176 | + } | |
| 177 | + _windowsQuoteCmdArg(arg) { | |
| 178 | + // for .exe, apply the normal quoting rules that libuv applies | |
| 179 | + if (!this._isCmdFile()) { | |
| 180 | + return this._uvQuoteCmdArg(arg); | |
| 181 | + } | |
| 182 | + // otherwise apply quoting rules specific to the cmd.exe command line parser. | |
| 183 | + // the libuv rules are generic and are not designed specifically for cmd.exe | |
| 184 | + // command line parser. | |
| 185 | + // | |
| 186 | + // for a detailed description of the cmd.exe command line parser, refer to | |
| 187 | + // http://stackoverflow.com/questions/4094699/how-does-the-windows-command-interpreter-cmd-exe-parse-scripts/7970912#7970912 | |
| 188 | + // need quotes for empty arg | |
| 189 | + if (!arg) { | |
| 190 | + return '""'; | |
| 191 | + } | |
| 192 | + // determine whether the arg needs to be quoted | |
| 193 | + const cmdSpecialChars = [ | |
| 194 | + ' ', | |
| 195 | + '\t', | |
| 196 | + '&', | |
| 197 | + '(', | |
| 198 | + ')', | |
| 199 | + '[', | |
| 200 | + ']', | |
| 201 | + '{', | |
| 202 | + '}', | |
| 203 | + '^', | |
| 204 | + '=', | |
| 205 | + ';', | |
| 206 | + '!', | |
| 207 | + "'", | |
| 208 | + '+', | |
| 209 | + ',', | |
| 210 | + '`', | |
| 211 | + '~', | |
| 212 | + '|', | |
| 213 | + '<', | |
| 214 | + '>', | |
| 215 | + '"' | |
| 216 | + ]; | |
| 217 | + let needsQuotes = false; | |
| 218 | + for (const char of arg) { | |
| 219 | + if (cmdSpecialChars.some(x => x === char)) { | |
| 220 | + needsQuotes = true; | |
| 221 | + break; | |
| 222 | + } | |
| 223 | + } | |
| 224 | + // short-circuit if quotes not needed | |
| 225 | + if (!needsQuotes) { | |
| 226 | + return arg; | |
| 227 | + } | |
| 228 | + // the following quoting rules are very similar to the rules that by libuv applies. | |
| 229 | + // | |
| 230 | + // 1) wrap the string in quotes | |
| 231 | + // | |
| 232 | + // 2) double-up quotes - i.e. " => "" | |
| 233 | + // | |
| 234 | + // this is different from the libuv quoting rules. libuv replaces " with \", which unfortunately | |
| 235 | + // doesn't work well with a cmd.exe command line. | |
| 236 | + // | |
| 237 | + // note, replacing " with "" also works well if the arg is passed to a downstream .NET console app. | |
| 238 | + // for example, the command line: | |
| 239 | + // foo.exe "myarg:""my val""" | |
| 240 | + // is parsed by a .NET console app into an arg array: | |
| 241 | + // [ "myarg:\"my val\"" ] | |
| 242 | + // which is the same end result when applying libuv quoting rules. although the actual | |
| 243 | + // command line from libuv quoting rules would look like: | |
| 244 | + // foo.exe "myarg:\"my val\"" | |
| 245 | + // | |
| 246 | + // 3) double-up slashes that preceed a quote, | |
| 247 | + // e.g. hello \world => "hello \world" | |
| 248 | + // hello\"world => "hello\\""world" | |
| 249 | + // hello\\"world => "hello\\\\""world" | |
| 250 | + // hello world\ => "hello world\\" | |
| 251 | + // | |
| 252 | + // technically this is not required for a cmd.exe command line, or the batch argument parser. | |
| 253 | + // the reasons for including this as a .cmd quoting rule are: | |
| 254 | + // | |
| 255 | + // a) this is optimized for the scenario where the argument is passed from the .cmd file to an | |
| 256 | + // external program. many programs (e.g. .NET console apps) rely on the slash-doubling rule. | |
| 257 | + // | |
| 258 | + // b) it's what we've been doing previously (by deferring to node default behavior) and we | |
| 259 | + // haven't heard any complaints about that aspect. | |
| 260 | + // | |
| 261 | + // note, a weakness of the quoting rules chosen here, is that % is not escaped. in fact, % cannot be | |
| 262 | + // escaped when used on the command line directly - even though within a .cmd file % can be escaped | |
| 263 | + // by using %%. | |
| 264 | + // | |
| 265 | + // the saving grace is, on the command line, %var% is left as-is if var is not defined. this contrasts | |
| 266 | + // the line parsing rules within a .cmd file, where if var is not defined it is replaced with nothing. | |
| 267 | + // | |
| 268 | + // one option that was explored was replacing % with ^% - i.e. %var% => ^%var^%. this hack would | |
| 269 | + // often work, since it is unlikely that var^ would exist, and the ^ character is removed when the | |
| 270 | + // variable is used. the problem, however, is that ^ is not removed when %* is used to pass the args | |
| 271 | + // to an external program. | |
| 272 | + // | |
| 273 | + // an unexplored potential solution for the % escaping problem, is to create a wrapper .cmd file. | |
| 274 | + // % can be escaped within a .cmd file. | |
| 275 | + let reverse = '"'; | |
| 276 | + let quoteHit = true; | |
| 277 | + for (let i = arg.length; i > 0; i--) { | |
| 278 | + // walk the string in reverse | |
| 279 | + reverse += arg[i - 1]; | |
| 280 | + if (quoteHit && arg[i - 1] === '\\') { | |
| 281 | + reverse += '\\'; // double the slash | |
| 282 | + } | |
| 283 | + else if (arg[i - 1] === '"') { | |
| 284 | + quoteHit = true; | |
| 285 | + reverse += '"'; // double the quote | |
| 286 | + } | |
| 287 | + else { | |
| 288 | + quoteHit = false; | |
| 289 | + } | |
| 290 | + } | |
| 291 | + reverse += '"'; | |
| 292 | + return reverse | |
| 293 | + .split('') | |
| 294 | + .reverse() | |
| 295 | + .join(''); | |
| 296 | + } | |
| 297 | + _uvQuoteCmdArg(arg) { | |
| 298 | + // Tool runner wraps child_process.spawn() and needs to apply the same quoting as | |
| 299 | + // Node in certain cases where the undocumented spawn option windowsVerbatimArguments | |
| 300 | + // is used. | |
| 301 | + // | |
| 302 | + // Since this function is a port of quote_cmd_arg from Node 4.x (technically, lib UV, | |
| 303 | + // see https://github.com/nodejs/node/blob/v4.x/deps/uv/src/win/process.c for details), | |
| 304 | + // pasting copyright notice from Node within this function: | |
| 305 | + // | |
| 306 | + // Copyright Joyent, Inc. and other Node contributors. All rights reserved. | |
| 307 | + // | |
| 308 | + // Permission is hereby granted, free of charge, to any person obtaining a copy | |
| 309 | + // of this software and associated documentation files (the "Software"), to | |
| 310 | + // deal in the Software without restriction, including without limitation the | |
| 311 | + // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | |
| 312 | + // sell copies of the Software, and to permit persons to whom the Software is | |
| 313 | + // furnished to do so, subject to the following conditions: | |
| 314 | + // | |
| 315 | + // The above copyright notice and this permission notice shall be included in | |
| 316 | + // all copies or substantial portions of the Software. | |
| 317 | + // | |
| 318 | + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| 319 | + // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| 320 | + // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| 321 | + // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| 322 | + // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
| 323 | + // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
| 324 | + // IN THE SOFTWARE. | |
| 325 | + if (!arg) { | |
| 326 | + // Need double quotation for empty argument | |
| 327 | + return '""'; | |
| 328 | + } | |
| 329 | + if (!arg.includes(' ') && !arg.includes('\t') && !arg.includes('"')) { | |
| 330 | + // No quotation needed | |
| 331 | + return arg; | |
| 332 | + } | |
| 333 | + if (!arg.includes('"') && !arg.includes('\\')) { | |
| 334 | + // No embedded double quotes or backslashes, so I can just wrap | |
| 335 | + // quote marks around the whole thing. | |
| 336 | + return `"${arg}"`; | |
| 337 | + } | |
| 338 | + // Expected input/output: | |
| 339 | + // input : hello"world | |
| 340 | + // output: "hello\"world" | |
| 341 | + // input : hello""world | |
| 342 | + // output: "hello\"\"world" | |
| 343 | + // input : hello\world | |
| 344 | + // output: hello\world | |
| 345 | + // input : hello\\world | |
| 346 | + // output: hello\\world | |
| 347 | + // input : hello\"world | |
| 348 | + // output: "hello\\\"world" | |
| 349 | + // input : hello\\"world | |
| 350 | + // output: "hello\\\\\"world" | |
| 351 | + // input : hello world\ | |
| 352 | + // output: "hello world\\" - note the comment in libuv actually reads "hello world\" | |
| 353 | + // but it appears the comment is wrong, it should be "hello world\\" | |
| 354 | + let reverse = '"'; | |
| 355 | + let quoteHit = true; | |
| 356 | + for (let i = arg.length; i > 0; i--) { | |
| 357 | + // walk the string in reverse | |
| 358 | + reverse += arg[i - 1]; | |
| 359 | + if (quoteHit && arg[i - 1] === '\\') { | |
| 360 | + reverse += '\\'; | |
| 361 | + } | |
| 362 | + else if (arg[i - 1] === '"') { | |
| 363 | + quoteHit = true; | |
| 364 | + reverse += '\\'; | |
| 365 | + } | |
| 366 | + else { | |
| 367 | + quoteHit = false; | |
| 368 | + } | |
| 369 | + } | |
| 370 | + reverse += '"'; | |
| 371 | + return reverse | |
| 372 | + .split('') | |
| 373 | + .reverse() | |
| 374 | + .join(''); | |
| 375 | + } | |
| 376 | + _cloneExecOptions(options) { | |
| 377 | + options = options || {}; | |
| 378 | + const result = { | |
| 379 | + cwd: options.cwd || process.cwd(), | |
| 380 | + env: options.env || process.env, | |
| 381 | + silent: options.silent || false, | |
| 382 | + windowsVerbatimArguments: options.windowsVerbatimArguments || false, | |
| 383 | + failOnStdErr: options.failOnStdErr || false, | |
| 384 | + ignoreReturnCode: options.ignoreReturnCode || false, | |
| 385 | + delay: options.delay || 10000 | |
| 386 | + }; | |
| 387 | + result.outStream = options.outStream || process.stdout; | |
| 388 | + result.errStream = options.errStream || process.stderr; | |
| 389 | + return result; | |
| 390 | + } | |
| 391 | + _getSpawnOptions(options, toolPath) { | |
| 392 | + options = options || {}; | |
| 393 | + const result = {}; | |
| 394 | + result.cwd = options.cwd; | |
| 395 | + result.env = options.env; | |
| 396 | + result['windowsVerbatimArguments'] = | |
| 397 | + options.windowsVerbatimArguments || this._isCmdFile(); | |
| 398 | + if (options.windowsVerbatimArguments) { | |
| 399 | + result.argv0 = `"${toolPath}"`; | |
| 400 | + } | |
| 401 | + return result; | |
| 402 | + } | |
| 403 | + /** | |
| 404 | + * Exec a tool. | |
| 405 | + * Output will be streamed to the live console. | |
| 406 | + * Returns promise with return code | |
| 407 | + * | |
| 408 | + * @param tool path to tool to exec | |
| 409 | + * @param options optional exec options. See ExecOptions | |
| 410 | + * @returns number | |
| 411 | + */ | |
| 412 | + exec() { | |
| 413 | + return __awaiter(this, void 0, void 0, function* () { | |
| 414 | + return new Promise((resolve, reject) => { | |
| 415 | + this._debug(`exec tool: ${this.toolPath}`); | |
| 416 | + this._debug('arguments:'); | |
| 417 | + for (const arg of this.args) { | |
| 418 | + this._debug(` ${arg}`); | |
| 419 | + } | |
| 420 | + const optionsNonNull = this._cloneExecOptions(this.options); | |
| 421 | + if (!optionsNonNull.silent && optionsNonNull.outStream) { | |
| 422 | + optionsNonNull.outStream.write(this._getCommandString(optionsNonNull) + os.EOL); | |
| 423 | + } | |
| 424 | + const state = new ExecState(optionsNonNull, this.toolPath); | |
| 425 | + state.on('debug', (message) => { | |
| 426 | + this._debug(message); | |
| 427 | + }); | |
| 428 | + const fileName = this._getSpawnFileName(); | |
| 429 | + const cp = child.spawn(fileName, this._getSpawnArgs(optionsNonNull), this._getSpawnOptions(this.options, fileName)); | |
| 430 | + const stdbuffer = ''; | |
| 431 | + if (cp.stdout) { | |
| 432 | + cp.stdout.on('data', (data) => { | |
| 433 | + if (this.options.listeners && this.options.listeners.stdout) { | |
| 434 | + this.options.listeners.stdout(data); | |
| 435 | + } | |
| 436 | + if (!optionsNonNull.silent && optionsNonNull.outStream) { | |
| 437 | + optionsNonNull.outStream.write(data); | |
| 438 | + } | |
| 439 | + this._processLineBuffer(data, stdbuffer, (line) => { | |
| 440 | + if (this.options.listeners && this.options.listeners.stdline) { | |
| 441 | + this.options.listeners.stdline(line); | |
| 442 | + } | |
| 443 | + }); | |
| 444 | + }); | |
| 445 | + } | |
| 446 | + const errbuffer = ''; | |
| 447 | + if (cp.stderr) { | |
| 448 | + cp.stderr.on('data', (data) => { | |
| 449 | + state.processStderr = true; | |
| 450 | + if (this.options.listeners && this.options.listeners.stderr) { | |
| 451 | + this.options.listeners.stderr(data); | |
| 452 | + } | |
| 453 | + if (!optionsNonNull.silent && | |
| 454 | + optionsNonNull.errStream && | |
| 455 | + optionsNonNull.outStream) { | |
| 456 | + const s = optionsNonNull.failOnStdErr | |
| 457 | + ? optionsNonNull.errStream | |
| 458 | + : optionsNonNull.outStream; | |
| 459 | + s.write(data); | |
| 460 | + } | |
| 461 | + this._processLineBuffer(data, errbuffer, (line) => { | |
| 462 | + if (this.options.listeners && this.options.listeners.errline) { | |
| 463 | + this.options.listeners.errline(line); | |
| 464 | + } | |
| 465 | + }); | |
| 466 | + }); | |
| 467 | + } | |
| 468 | + cp.on('error', (err) => { | |
| 469 | + state.processError = err.message; | |
| 470 | + state.processExited = true; | |
| 471 | + state.processClosed = true; | |
| 472 | + state.CheckComplete(); | |
| 473 | + }); | |
| 474 | + cp.on('exit', (code) => { | |
| 475 | + state.processExitCode = code; | |
| 476 | + state.processExited = true; | |
| 477 | + this._debug(`Exit code ${code} received from tool '${this.toolPath}'`); | |
| 478 | + state.CheckComplete(); | |
| 479 | + }); | |
| 480 | + cp.on('close', (code) => { | |
| 481 | + state.processExitCode = code; | |
| 482 | + state.processExited = true; | |
| 483 | + state.processClosed = true; | |
| 484 | + this._debug(`STDIO streams have closed for tool '${this.toolPath}'`); | |
| 485 | + state.CheckComplete(); | |
| 486 | + }); | |
| 487 | + state.on('done', (error, exitCode) => { | |
| 488 | + if (stdbuffer.length > 0) { | |
| 489 | + this.emit('stdline', stdbuffer); | |
| 490 | + } | |
| 491 | + if (errbuffer.length > 0) { | |
| 492 | + this.emit('errline', errbuffer); | |
| 493 | + } | |
| 494 | + cp.removeAllListeners(); | |
| 495 | + if (error) { | |
| 496 | + reject(error); | |
| 497 | + } | |
| 498 | + else { | |
| 499 | + resolve(exitCode); | |
| 500 | + } | |
| 501 | + }); | |
| 502 | + }); | |
| 503 | + }); | |
| 504 | + } | |
| 505 | +} | |
| 506 | +exports.ToolRunner = ToolRunner; | |
| 507 | +/** | |
| 508 | + * Convert an arg string to an array of args. Handles escaping | |
| 509 | + * | |
| 510 | + * @param argString string of arguments | |
| 511 | + * @returns string[] array of arguments | |
| 512 | + */ | |
| 513 | +function argStringToArray(argString) { | |
| 514 | + const args = []; | |
| 515 | + let inQuotes = false; | |
| 516 | + let escaped = false; | |
| 517 | + let arg = ''; | |
| 518 | + function append(c) { | |
| 519 | + // we only escape double quotes. | |
| 520 | + if (escaped && c !== '"') { | |
| 521 | + arg += '\\'; | |
| 522 | + } | |
| 523 | + arg += c; | |
| 524 | + escaped = false; | |
| 525 | + } | |
| 526 | + for (let i = 0; i < argString.length; i++) { | |
| 527 | + const c = argString.charAt(i); | |
| 528 | + if (c === '"') { | |
| 529 | + if (!escaped) { | |
| 530 | + inQuotes = !inQuotes; | |
| 531 | + } | |
| 532 | + else { | |
| 533 | + append(c); | |
| 534 | + } | |
| 535 | + continue; | |
| 536 | + } | |
| 537 | + if (c === '\\' && escaped) { | |
| 538 | + append(c); | |
| 539 | + continue; | |
| 540 | + } | |
| 541 | + if (c === '\\' && inQuotes) { | |
| 542 | + escaped = true; | |
| 543 | + continue; | |
| 544 | + } | |
| 545 | + if (c === ' ' && !inQuotes) { | |
| 546 | + if (arg.length > 0) { | |
| 547 | + args.push(arg); | |
| 548 | + arg = ''; | |
| 549 | + } | |
| 550 | + continue; | |
| 551 | + } | |
| 552 | + append(c); | |
| 553 | + } | |
| 554 | + if (arg.length > 0) { | |
| 555 | + args.push(arg.trim()); | |
| 556 | + } | |
| 557 | + return args; | |
| 558 | +} | |
| 559 | +exports.argStringToArray = argStringToArray; | |
| 560 | +class ExecState extends events.EventEmitter { | |
| 561 | + constructor(options, toolPath) { | |
| 562 | + super(); | |
| 563 | + this.processClosed = false; // tracks whether the process has exited and stdio is closed | |
| 564 | + this.processError = ''; | |
| 565 | + this.processExitCode = 0; | |
| 566 | + this.processExited = false; // tracks whether the process has exited | |
| 567 | + this.processStderr = false; // tracks whether stderr was written to | |
| 568 | + this.delay = 10000; // 10 seconds | |
| 569 | + this.done = false; | |
| 570 | + this.timeout = null; | |
| 571 | + if (!toolPath) { | |
| 572 | + throw new Error('toolPath must not be empty'); | |
| 573 | + } | |
| 574 | + this.options = options; | |
| 575 | + this.toolPath = toolPath; | |
| 576 | + if (options.delay) { | |
| 577 | + this.delay = options.delay; | |
| 578 | + } | |
| 579 | + } | |
| 580 | + CheckComplete() { | |
| 581 | + if (this.done) { | |
| 582 | + return; | |
| 583 | + } | |
| 584 | + if (this.processClosed) { | |
| 585 | + this._setResult(); | |
| 586 | + } | |
| 587 | + else if (this.processExited) { | |
| 588 | + this.timeout = setTimeout(ExecState.HandleTimeout, this.delay, this); | |
| 589 | + } | |
| 590 | + } | |
| 591 | + _debug(message) { | |
| 592 | + this.emit('debug', message); | |
| 593 | + } | |
| 594 | + _setResult() { | |
| 595 | + // determine whether there is an error | |
| 596 | + let error; | |
| 597 | + if (this.processExited) { | |
| 598 | + if (this.processError) { | |
| 599 | + 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}`); | |
| 600 | + } | |
| 601 | + else if (this.processExitCode !== 0 && !this.options.ignoreReturnCode) { | |
| 602 | + error = new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`); | |
| 603 | + } | |
| 604 | + else if (this.processStderr && this.options.failOnStdErr) { | |
| 605 | + error = new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`); | |
| 606 | + } | |
| 607 | + } | |
| 608 | + // clear the timeout | |
| 609 | + if (this.timeout) { | |
| 610 | + clearTimeout(this.timeout); | |
| 611 | + this.timeout = null; | |
| 612 | + } | |
| 613 | + this.done = true; | |
| 614 | + this.emit('done', error, this.processExitCode); | |
| 615 | + } | |
| 616 | + static HandleTimeout(state) { | |
| 617 | + if (state.done) { | |
| 618 | + return; | |
| 619 | + } | |
| 620 | + if (!state.processClosed && state.processExited) { | |
| 621 | + const message = `The STDIO streams did not close within ${state.delay / | |
| 622 | + 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.`; | |
| 623 | + state._debug(message); | |
| 624 | + } | |
| 625 | + state._setResult(); | |
| 626 | + } | |
| 627 | +} | |
| 649 | 628 | //# sourceMappingURL=toolrunner.js.map |
| 650 | 629 | |
| 651 | 630 | /***/ }), |
@@ -664,303 +643,6 @@ module.exports = require("child_process");
| 664 | 643 | |
| 665 | 644 | /***/ }), |
| 666 | 645 | |
| 667 | −/***/ 194: | |
| 668 | −/***/ (function(__unusedmodule, exports, __webpack_require__) { | |
| 669 | − | |
| 670 | −"use strict"; | |
| 671 | − | |
| 672 | −var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | |
| 673 | − function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | |
| 674 | − return new (P || (P = Promise))(function (resolve, reject) { | |
| 675 | − function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| 676 | − function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| 677 | − function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | |
| 678 | − step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| 679 | − }); | |
| 680 | −}; | |
| 681 | −Object.defineProperty(exports, "__esModule", { value: true }); | |
| 682 | −const childProcess = __webpack_require__(129); | |
| 683 | −const path = __webpack_require__(622); | |
| 684 | −const util_1 = __webpack_require__(669); | |
| 685 | −const ioUtil = __webpack_require__(408); | |
| 686 | −const exec = util_1.promisify(childProcess.exec); | |
| 687 | −/** | |
| 688 | − * Copies a file or folder. | |
| 689 | − * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js | |
| 690 | − * | |
| 691 | − * @param source source path | |
| 692 | − * @param dest destination path | |
| 693 | − * @param options optional. See CopyOptions. | |
| 694 | − */ | |
| 695 | −function cp(source, dest, options = {}) { | |
| 696 | − return __awaiter(this, void 0, void 0, function* () { | |
| 697 | − const { force, recursive } = readCopyOptions(options); | |
| 698 | − const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; | |
| 699 | − // Dest is an existing file, but not forcing | |
| 700 | − if (destStat && destStat.isFile() && !force) { | |
| 701 | − return; | |
| 702 | − } | |
| 703 | − // If dest is an existing directory, should copy inside. | |
| 704 | − const newDest = destStat && destStat.isDirectory() | |
| 705 | − ? path.join(dest, path.basename(source)) | |
| 706 | − : dest; | |
| 707 | − if (!(yield ioUtil.exists(source))) { | |
| 708 | − throw new Error(`no such file or directory: ${source}`); | |
| 709 | − } | |
| 710 | − const sourceStat = yield ioUtil.stat(source); | |
| 711 | − if (sourceStat.isDirectory()) { | |
| 712 | − if (!recursive) { | |
| 713 | − throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); | |
| 714 | − } | |
| 715 | − else { | |
| 716 | − yield cpDirRecursive(source, newDest, 0, force); | |
| 717 | − } | |
| 718 | − } | |
| 719 | − else { | |
| 720 | − if (path.relative(source, newDest) === '') { | |
| 721 | − // a file cannot be copied to itself | |
| 722 | − throw new Error(`'${newDest}' and '${source}' are the same file`); | |
| 723 | − } | |
| 724 | − yield copyFile(source, newDest, force); | |
| 725 | − } | |
| 726 | − }); | |
| 727 | −} | |
| 728 | −exports.cp = cp; | |
| 729 | −/** | |
| 730 | − * Moves a path. | |
| 731 | − * | |
| 732 | − * @param source source path | |
| 733 | − * @param dest destination path | |
| 734 | − * @param options optional. See MoveOptions. | |
| 735 | − */ | |
| 736 | −function mv(source, dest, options = {}) { | |
| 737 | − return __awaiter(this, void 0, void 0, function* () { | |
| 738 | − if (yield ioUtil.exists(dest)) { | |
| 739 | − let destExists = true; | |
| 740 | − if (yield ioUtil.isDirectory(dest)) { | |
| 741 | − // If dest is directory copy src into dest | |
| 742 | − dest = path.join(dest, path.basename(source)); | |
| 743 | − destExists = yield ioUtil.exists(dest); | |
| 744 | − } | |
| 745 | − if (destExists) { | |
| 746 | − if (options.force == null || options.force) { | |
| 747 | − yield rmRF(dest); | |
| 748 | − } | |
| 749 | − else { | |
| 750 | − throw new Error('Destination already exists'); | |
| 751 | − } | |
| 752 | − } | |
| 753 | − } | |
| 754 | − yield mkdirP(path.dirname(dest)); | |
| 755 | − yield ioUtil.rename(source, dest); | |
| 756 | − }); | |
| 757 | −} | |
| 758 | −exports.mv = mv; | |
| 759 | −/** | |
| 760 | − * Remove a path recursively with force | |
| 761 | − * | |
| 762 | − * @param inputPath path to remove | |
| 763 | − */ | |
| 764 | −function rmRF(inputPath) { | |
| 765 | − return __awaiter(this, void 0, void 0, function* () { | |
| 766 | − if (ioUtil.IS_WINDOWS) { | |
| 767 | − // Node doesn't provide a delete operation, only an unlink function. This means that if the file is being used by another | |
| 768 | − // program (e.g. antivirus), it won't be deleted. To address this, we shell out the work to rd/del. | |
| 769 | − try { | |
| 770 | − if (yield ioUtil.isDirectory(inputPath, true)) { | |
| 771 | − yield exec(`rd /s /q "${inputPath}"`); | |
| 772 | − } | |
| 773 | − else { | |
| 774 | − yield exec(`del /f /a "${inputPath}"`); | |
| 775 | − } | |
| 776 | − } | |
| 777 | − catch (err) { | |
| 778 | − // if you try to delete a file that doesn't exist, desired result is achieved | |
| 779 | − // other errors are valid | |
| 780 | − if (err.code !== 'ENOENT') | |
| 781 | − throw err; | |
| 782 | − } | |
| 783 | − // Shelling out fails to remove a symlink folder with missing source, this unlink catches that | |
| 784 | − try { | |
| 785 | − yield ioUtil.unlink(inputPath); | |
| 786 | − } | |
| 787 | − catch (err) { | |
| 788 | − // if you try to delete a file that doesn't exist, desired result is achieved | |
| 789 | − // other errors are valid | |
| 790 | − if (err.code !== 'ENOENT') | |
| 791 | − throw err; | |
| 792 | − } | |
| 793 | − } | |
| 794 | − else { | |
| 795 | − let isDir = false; | |
| 796 | − try { | |
| 797 | − isDir = yield ioUtil.isDirectory(inputPath); | |
| 798 | − } | |
| 799 | − catch (err) { | |
| 800 | − // if you try to delete a file that doesn't exist, desired result is achieved | |
| 801 | − // other errors are valid | |
| 802 | − if (err.code !== 'ENOENT') | |
| 803 | − throw err; | |
| 804 | − return; | |
| 805 | − } | |
| 806 | − if (isDir) { | |
| 807 | − yield exec(`rm -rf "${inputPath}"`); | |
| 808 | − } | |
| 809 | − else { | |
| 810 | − yield ioUtil.unlink(inputPath); | |
| 811 | − } | |
| 812 | − } | |
| 813 | − }); | |
| 814 | −} | |
| 815 | −exports.rmRF = rmRF; | |
| 816 | −/** | |
| 817 | − * Make a directory. Creates the full path with folders in between | |
| 818 | − * Will throw if it fails | |
| 819 | − * | |
| 820 | − * @param fsPath path to create | |
| 821 | − * @returns Promise<void> | |
| 822 | − */ | |
| 823 | −function mkdirP(fsPath) { | |
| 824 | − return __awaiter(this, void 0, void 0, function* () { | |
| 825 | − yield ioUtil.mkdirP(fsPath); | |
| 826 | − }); | |
| 827 | −} | |
| 828 | −exports.mkdirP = mkdirP; | |
| 829 | −/** | |
| 830 | − * Returns path of a tool had the tool actually been invoked. Resolves via paths. | |
| 831 | − * If you check and the tool does not exist, it will throw. | |
| 832 | − * | |
| 833 | − * @param tool name of the tool | |
| 834 | − * @param check whether to check if tool exists | |
| 835 | − * @returns Promise<string> path to tool | |
| 836 | − */ | |
| 837 | −function which(tool, check) { | |
| 838 | − return __awaiter(this, void 0, void 0, function* () { | |
| 839 | − if (!tool) { | |
| 840 | − throw new Error("parameter 'tool' is required"); | |
| 841 | − } | |
| 842 | − // recursive when check=true | |
| 843 | − if (check) { | |
| 844 | − const result = yield which(tool, false); | |
| 845 | − if (!result) { | |
| 846 | − if (ioUtil.IS_WINDOWS) { | |
| 847 | − 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.`); | |
| 848 | − } | |
| 849 | − else { | |
| 850 | − 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.`); | |
| 851 | − } | |
| 852 | − } | |
| 853 | − } | |
| 854 | − try { | |
| 855 | − // build the list of extensions to try | |
| 856 | − const extensions = []; | |
| 857 | − if (ioUtil.IS_WINDOWS && process.env.PATHEXT) { | |
| 858 | − for (const extension of process.env.PATHEXT.split(path.delimiter)) { | |
| 859 | − if (extension) { | |
| 860 | − extensions.push(extension); | |
| 861 | − } | |
| 862 | − } | |
| 863 | − } | |
| 864 | − // if it's rooted, return it if exists. otherwise return empty. | |
| 865 | − if (ioUtil.isRooted(tool)) { | |
| 866 | − const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); | |
| 867 | − if (filePath) { | |
| 868 | − return filePath; | |
| 869 | − } | |
| 870 | − return ''; | |
| 871 | − } | |
| 872 | − // if any path separators, return empty | |
| 873 | − if (tool.includes('/') || (ioUtil.IS_WINDOWS && tool.includes('\\'))) { | |
| 874 | − return ''; | |
| 875 | − } | |
| 876 | − // build the list of directories | |
| 877 | − // | |
| 878 | − // Note, technically "where" checks the current directory on Windows. From a toolkit perspective, | |
| 879 | − // it feels like we should not do this. Checking the current directory seems like more of a use | |
| 880 | − // case of a shell, and the which() function exposed by the toolkit should strive for consistency | |
| 881 | − // across platforms. | |
| 882 | − const directories = []; | |
| 883 | − if (process.env.PATH) { | |
| 884 | − for (const p of process.env.PATH.split(path.delimiter)) { | |
| 885 | − if (p) { | |
| 886 | − directories.push(p); | |
| 887 | − } | |
| 888 | − } | |
| 889 | − } | |
| 890 | − // return the first match | |
| 891 | − for (const directory of directories) { | |
| 892 | − const filePath = yield ioUtil.tryGetExecutablePath(directory + path.sep + tool, extensions); | |
| 893 | − if (filePath) { | |
| 894 | − return filePath; | |
| 895 | − } | |
| 896 | − } | |
| 897 | − return ''; | |
| 898 | − } | |
| 899 | − catch (err) { | |
| 900 | − throw new Error(`which failed with message ${err.message}`); | |
| 901 | − } | |
| 902 | − }); | |
| 903 | −} | |
| 904 | −exports.which = which; | |
| 905 | −function readCopyOptions(options) { | |
| 906 | − const force = options.force == null ? true : options.force; | |
| 907 | − const recursive = Boolean(options.recursive); | |
| 908 | − return { force, recursive }; | |
| 909 | −} | |
| 910 | −function cpDirRecursive(sourceDir, destDir, currentDepth, force) { | |
| 911 | − return __awaiter(this, void 0, void 0, function* () { | |
| 912 | − // Ensure there is not a run away recursive copy | |
| 913 | − if (currentDepth >= 255) | |
| 914 | − return; | |
| 915 | − currentDepth++; | |
| 916 | − yield mkdirP(destDir); | |
| 917 | − const files = yield ioUtil.readdir(sourceDir); | |
| 918 | − for (const fileName of files) { | |
| 919 | − const srcFile = `${sourceDir}/${fileName}`; | |
| 920 | − const destFile = `${destDir}/${fileName}`; | |
| 921 | − const srcFileStat = yield ioUtil.lstat(srcFile); | |
| 922 | − if (srcFileStat.isDirectory()) { | |
| 923 | − // Recurse | |
| 924 | − yield cpDirRecursive(srcFile, destFile, currentDepth, force); | |
| 925 | − } | |
| 926 | − else { | |
| 927 | − yield copyFile(srcFile, destFile, force); | |
| 928 | − } | |
| 929 | − } | |
| 930 | − // Change the mode for the newly created directory | |
| 931 | − yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); | |
| 932 | − }); | |
| 933 | −} | |
| 934 | −// Buffered file copy | |
| 935 | −function copyFile(srcFile, destFile, force) { | |
| 936 | − return __awaiter(this, void 0, void 0, function* () { | |
| 937 | − if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { | |
| 938 | − // unlink/re-link it | |
| 939 | − try { | |
| 940 | − yield ioUtil.lstat(destFile); | |
| 941 | − yield ioUtil.unlink(destFile); | |
| 942 | − } | |
| 943 | − catch (e) { | |
| 944 | − // Try to override file permission | |
| 945 | − if (e.code === 'EPERM') { | |
| 946 | − yield ioUtil.chmod(destFile, '0666'); | |
| 947 | − yield ioUtil.unlink(destFile); | |
| 948 | − } | |
| 949 | − // other errors = it doesn't exist, no work to do | |
| 950 | − } | |
| 951 | − // Copy over symlink | |
| 952 | − const symlinkFull = yield ioUtil.readlink(srcFile); | |
| 953 | − yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null); | |
| 954 | − } | |
| 955 | − else if (!(yield ioUtil.exists(destFile)) || force) { | |
| 956 | − yield ioUtil.copyFile(srcFile, destFile); | |
| 957 | − } | |
| 958 | − }); | |
| 959 | −} | |
| 960 | −//# sourceMappingURL=io.js.map | |
| 961 | − | |
| 962 | −/***/ }), | |
| 963 | − | |
| 964 | 646 | /***/ 211: |
| 965 | 647 | /***/ (function(module) { |
| 966 | 648 |
@@ -2569,312 +2251,77 @@ function coerce (version, options) {
| 2569 | 2251 | } |
| 2570 | 2252 | |
| 2571 | 2253 | |
| 2572 | −/***/ }), | |
| 2573 | − | |
| 2574 | −/***/ 357: | |
| 2575 | −/***/ (function(module) { | |
| 2576 | − | |
| 2577 | −module.exports = require("assert"); | |
| 2578 | − | |
| 2579 | −/***/ }), | |
| 2580 | − | |
| 2581 | −/***/ 408: | |
| 2582 | −/***/ (function(__unusedmodule, exports, __webpack_require__) { | |
| 2583 | − | |
| 2584 | −"use strict"; | |
| 2585 | − | |
| 2586 | −var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | |
| 2587 | − function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | |
| 2588 | − return new (P || (P = Promise))(function (resolve, reject) { | |
| 2589 | − function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| 2590 | − function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| 2591 | − function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | |
| 2592 | − step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| 2593 | − }); | |
| 2594 | −}; | |
| 2595 | −var _a; | |
| 2596 | −Object.defineProperty(exports, "__esModule", { value: true }); | |
| 2597 | −const assert_1 = __webpack_require__(357); | |
| 2598 | −const fs = __webpack_require__(747); | |
| 2599 | −const path = __webpack_require__(622); | |
| 2600 | −_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; | |
| 2601 | −exports.IS_WINDOWS = process.platform === 'win32'; | |
| 2602 | −function exists(fsPath) { | |
| 2603 | − return __awaiter(this, void 0, void 0, function* () { | |
| 2604 | − try { | |
| 2605 | − yield exports.stat(fsPath); | |
| 2606 | − } | |
| 2607 | − catch (err) { | |
| 2608 | − if (err.code === 'ENOENT') { | |
| 2609 | − return false; | |
| 2610 | − } | |
| 2611 | − throw err; | |
| 2612 | − } | |
| 2613 | − return true; | |
| 2614 | − }); | |
| 2615 | −} | |
| 2616 | −exports.exists = exists; | |
| 2617 | −function isDirectory(fsPath, useStat = false) { | |
| 2618 | − return __awaiter(this, void 0, void 0, function* () { | |
| 2619 | − const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); | |
| 2620 | − return stats.isDirectory(); | |
| 2621 | − }); | |
| 2622 | −} | |
| 2623 | −exports.isDirectory = isDirectory; | |
| 2624 | −/** | |
| 2625 | − * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: | |
| 2626 | − * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). | |
| 2627 | − */ | |
| 2628 | −function isRooted(p) { | |
| 2629 | − p = normalizeSeparators(p); | |
| 2630 | − if (!p) { | |
| 2631 | − throw new Error('isRooted() parameter "p" cannot be empty'); | |
| 2632 | − } | |
| 2633 | − if (exports.IS_WINDOWS) { | |
| 2634 | − return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello | |
| 2635 | − ); // e.g. C: or C:\hello | |
| 2636 | − } | |
| 2637 | − return p.startsWith('/'); | |
| 2638 | −} | |
| 2639 | −exports.isRooted = isRooted; | |
| 2640 | −/** | |
| 2641 | − * Recursively create a directory at `fsPath`. | |
| 2642 | − * | |
| 2643 | − * This implementation is optimistic, meaning it attempts to create the full | |
| 2644 | − * path first, and backs up the path stack from there. | |
| 2645 | − * | |
| 2646 | − * @param fsPath The path to create | |
| 2647 | − * @param maxDepth The maximum recursion depth | |
| 2648 | − * @param depth The current recursion depth | |
| 2649 | − */ | |
| 2650 | −function mkdirP(fsPath, maxDepth = 1000, depth = 1) { | |
| 2651 | − return __awaiter(this, void 0, void 0, function* () { | |
| 2652 | − assert_1.ok(fsPath, 'a path argument must be provided'); | |
| 2653 | − fsPath = path.resolve(fsPath); | |
| 2654 | − if (depth >= maxDepth) | |
| 2655 | − return exports.mkdir(fsPath); | |
| 2656 | − try { | |
| 2657 | − yield exports.mkdir(fsPath); | |
| 2658 | − return; | |
| 2659 | − } | |
| 2660 | − catch (err) { | |
| 2661 | − switch (err.code) { | |
| 2662 | − case 'ENOENT': { | |
| 2663 | − yield mkdirP(path.dirname(fsPath), maxDepth, depth + 1); | |
| 2664 | − yield exports.mkdir(fsPath); | |
| 2665 | − return; | |
| 2666 | − } | |
| 2667 | − default: { | |
| 2668 | − let stats; | |
| 2669 | − try { | |
| 2670 | − stats = yield exports.stat(fsPath); | |
| 2671 | − } | |
| 2672 | − catch (err2) { | |
| 2673 | − throw err; | |
| 2674 | − } | |
| 2675 | − if (!stats.isDirectory()) | |
| 2676 | − throw err; | |
| 2677 | − } | |
| 2678 | − } | |
| 2679 | − } | |
| 2680 | − }); | |
| 2681 | −} | |
| 2682 | −exports.mkdirP = mkdirP; | |
| 2683 | −/** | |
| 2684 | − * Best effort attempt to determine whether a file exists and is executable. | |
| 2685 | − * @param filePath file path to check | |
| 2686 | − * @param extensions additional file extensions to try | |
| 2687 | − * @return if file exists and is executable, returns the file path. otherwise empty string. | |
| 2688 | − */ | |
| 2689 | −function tryGetExecutablePath(filePath, extensions) { | |
| 2690 | − return __awaiter(this, void 0, void 0, function* () { | |
| 2691 | − let stats = undefined; | |
| 2692 | − try { | |
| 2693 | − // test file exists | |
| 2694 | − stats = yield exports.stat(filePath); | |
| 2695 | − } | |
| 2696 | − catch (err) { | |
| 2697 | − if (err.code !== 'ENOENT') { | |
| 2698 | − // eslint-disable-next-line no-console | |
| 2699 | − console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); | |
| 2700 | − } | |
| 2701 | − } | |
| 2702 | − if (stats && stats.isFile()) { | |
| 2703 | − if (exports.IS_WINDOWS) { | |
| 2704 | − // on Windows, test for valid extension | |
| 2705 | − const upperExt = path.extname(filePath).toUpperCase(); | |
| 2706 | − if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { | |
| 2707 | − return filePath; | |
| 2708 | − } | |
| 2709 | − } | |
| 2710 | − else { | |
| 2711 | − if (isUnixExecutable(stats)) { | |
| 2712 | − return filePath; | |
| 2713 | − } | |
| 2714 | − } | |
| 2715 | − } | |
| 2716 | − // try each extension | |
| 2717 | − const originalFilePath = filePath; | |
| 2718 | − for (const extension of extensions) { | |
| 2719 | − filePath = originalFilePath + extension; | |
| 2720 | − stats = undefined; | |
| 2721 | − try { | |
| 2722 | − stats = yield exports.stat(filePath); | |
| 2723 | − } | |
| 2724 | − catch (err) { | |
| 2725 | − if (err.code !== 'ENOENT') { | |
| 2726 | − // eslint-disable-next-line no-console | |
| 2727 | − console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); | |
| 2728 | − } | |
| 2729 | − } | |
| 2730 | − if (stats && stats.isFile()) { | |
| 2731 | − if (exports.IS_WINDOWS) { | |
| 2732 | − // preserve the case of the actual file (since an extension was appended) | |
| 2733 | − try { | |
| 2734 | − const directory = path.dirname(filePath); | |
| 2735 | − const upperName = path.basename(filePath).toUpperCase(); | |
| 2736 | − for (const actualName of yield exports.readdir(directory)) { | |
| 2737 | − if (upperName === actualName.toUpperCase()) { | |
| 2738 | − filePath = path.join(directory, actualName); | |
| 2739 | − break; | |
| 2740 | − } | |
| 2741 | − } | |
| 2742 | − } | |
| 2743 | − catch (err) { | |
| 2744 | − // eslint-disable-next-line no-console | |
| 2745 | − console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); | |
| 2746 | − } | |
| 2747 | − return filePath; | |
| 2748 | − } | |
| 2749 | − else { | |
| 2750 | − if (isUnixExecutable(stats)) { | |
| 2751 | − return filePath; | |
| 2752 | − } | |
| 2753 | − } | |
| 2754 | − } | |
| 2755 | − } | |
| 2756 | − return ''; | |
| 2757 | − }); | |
| 2758 | −} | |
| 2759 | −exports.tryGetExecutablePath = tryGetExecutablePath; | |
| 2760 | −function normalizeSeparators(p) { | |
| 2761 | − p = p || ''; | |
| 2762 | − if (exports.IS_WINDOWS) { | |
| 2763 | − // convert slashes on Windows | |
| 2764 | − p = p.replace(/\//g, '\\'); | |
| 2765 | − // remove redundant slashes | |
| 2766 | − return p.replace(/\\\\+/g, '\\'); | |
| 2767 | − } | |
| 2768 | − // remove redundant slashes | |
| 2769 | − return p.replace(/\/\/+/g, '/'); | |
| 2770 | −} | |
| 2771 | −// on Mac/Linux, test the execute bit | |
| 2772 | −// R W X R W X R W X | |
| 2773 | −// 256 128 64 32 16 8 4 2 1 | |
| 2774 | −function isUnixExecutable(stats) { | |
| 2775 | − return ((stats.mode & 1) > 0 || | |
| 2776 | − ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || | |
| 2777 | − ((stats.mode & 64) > 0 && stats.uid === process.getuid())); | |
| 2778 | −} | |
| 2779 | −//# sourceMappingURL=io-util.js.map | |
| 2780 | − | |
| 2781 | 2254 | /***/ }), |
| 2782 | 2255 | |
| 2783 | 2256 | /***/ 431: |
| 2784 | 2257 | /***/ (function(__unusedmodule, exports, __webpack_require__) { |
| 2785 | 2258 | |
| 2786 | 2259 | "use strict"; |
| 2787 | − | |
| 2788 | −var __importStar = (this && this.__importStar) || function (mod) { | |
| 2789 | − if (mod && mod.__esModule) return mod; | |
| 2790 | − var result = {}; | |
| 2791 | − if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | |
| 2792 | − result["default"] = mod; | |
| 2793 | − return result; | |
| 2794 | −}; | |
| 2795 | −Object.defineProperty(exports, "__esModule", { value: true }); | |
| 2796 | −const os = __importStar(__webpack_require__(87)); | |
| 2797 | −/** | |
| 2798 | − * Commands | |
| 2799 | − * | |
| 2800 | − * Command Format: | |
| 2801 | − * ::name key=value,key=value::message | |
| 2802 | − * | |
| 2803 | − * Examples: | |
| 2804 | − * ::warning::This is the message | |
| 2805 | − * ::set-env name=MY_VAR::some value | |
| 2806 | − */ | |
| 2807 | −function issueCommand(command, properties, message) { | |
| 2808 | − const cmd = new Command(command, properties, message); | |
| 2809 | − process.stdout.write(cmd.toString() + os.EOL); | |
| 2810 | −} | |
| 2811 | −exports.issueCommand = issueCommand; | |
| 2812 | −function issue(name, message = '') { | |
| 2813 | − issueCommand(name, {}, message); | |
| 2814 | −} | |
| 2815 | −exports.issue = issue; | |
| 2816 | −const CMD_STRING = '::'; | |
| 2817 | −class Command { | |
| 2818 | − constructor(command, properties, message) { | |
| 2819 | − if (!command) { | |
| 2820 | − command = 'missing.command'; | |
| 2821 | − } | |
| 2822 | − this.command = command; | |
| 2823 | − this.properties = properties; | |
| 2824 | − this.message = message; | |
| 2825 | − } | |
| 2826 | − toString() { | |
| 2827 | − let cmdStr = CMD_STRING + this.command; | |
| 2828 | − if (this.properties && Object.keys(this.properties).length > 0) { | |
| 2829 | − cmdStr += ' '; | |
| 2830 | − let first = true; | |
| 2831 | − for (const key in this.properties) { | |
| 2832 | − if (this.properties.hasOwnProperty(key)) { | |
| 2833 | − const val = this.properties[key]; | |
| 2834 | − if (val) { | |
| 2835 | − if (first) { | |
| 2836 | − first = false; | |
| 2837 | − } | |
| 2838 | − else { | |
| 2839 | − cmdStr += ','; | |
| 2840 | − } | |
| 2841 | − cmdStr += `${key}=${escapeProperty(val)}`; | |
| 2842 | − } | |
| 2843 | − } | |
| 2844 | − } | |
| 2845 | − } | |
| 2846 | − cmdStr += `${CMD_STRING}${escapeData(this.message)}`; | |
| 2847 | − return cmdStr; | |
| 2848 | − } | |
| 2849 | −} | |
| 2850 | −/** | |
| 2851 | − * Sanitizes an input into a string so it can be passed into issueCommand safely | |
| 2852 | − * @param input input to sanitize into a string | |
| 2853 | − */ | |
| 2854 | −function toCommandValue(input) { | |
| 2855 | − if (input === null || input === undefined) { | |
| 2856 | − return ''; | |
| 2857 | − } | |
| 2858 | − else if (typeof input === 'string' || input instanceof String) { | |
| 2859 | − return input; | |
| 2860 | − } | |
| 2861 | − return JSON.stringify(input); | |
| 2862 | −} | |
| 2863 | −exports.toCommandValue = toCommandValue; | |
| 2864 | −function escapeData(s) { | |
| 2865 | − return toCommandValue(s) | |
| 2866 | − .replace(/%/g, '%25') | |
| 2867 | − .replace(/\r/g, '%0D') | |
| 2868 | − .replace(/\n/g, '%0A'); | |
| 2869 | −} | |
| 2870 | −function escapeProperty(s) { | |
| 2871 | − return toCommandValue(s) | |
| 2872 | − .replace(/%/g, '%25') | |
| 2873 | − .replace(/\r/g, '%0D') | |
| 2874 | − .replace(/\n/g, '%0A') | |
| 2875 | − .replace(/:/g, '%3A') | |
| 2876 | − .replace(/,/g, '%2C'); | |
| 2877 | −} | |
| 2260 | + | |
| 2261 | +Object.defineProperty(exports, "__esModule", { value: true }); | |
| 2262 | +const os = __webpack_require__(87); | |
| 2263 | +/** | |
| 2264 | + * Commands | |
| 2265 | + * | |
| 2266 | + * Command Format: | |
| 2267 | + * ##[name key=value;key=value]message | |
| 2268 | + * | |
| 2269 | + * Examples: | |
| 2270 | + * ##[warning]This is the user warning message | |
| 2271 | + * ##[set-secret name=mypassword]definatelyNotAPassword! | |
| 2272 | + */ | |
| 2273 | +function issueCommand(command, properties, message) { | |
| 2274 | + const cmd = new Command(command, properties, message); | |
| 2275 | + process.stdout.write(cmd.toString() + os.EOL); | |
| 2276 | +} | |
| 2277 | +exports.issueCommand = issueCommand; | |
| 2278 | +function issue(name, message) { | |
| 2279 | + issueCommand(name, {}, message); | |
| 2280 | +} | |
| 2281 | +exports.issue = issue; | |
| 2282 | +const CMD_PREFIX = '##['; | |
| 2283 | +class Command { | |
| 2284 | + constructor(command, properties, message) { | |
| 2285 | + if (!command) { | |
| 2286 | + command = 'missing.command'; | |
| 2287 | + } | |
| 2288 | + this.command = command; | |
| 2289 | + this.properties = properties; | |
| 2290 | + this.message = message; | |
| 2291 | + } | |
| 2292 | + toString() { | |
| 2293 | + let cmdStr = CMD_PREFIX + this.command; | |
| 2294 | + if (this.properties && Object.keys(this.properties).length > 0) { | |
| 2295 | + cmdStr += ' '; | |
| 2296 | + for (const key in this.properties) { | |
| 2297 | + if (this.properties.hasOwnProperty(key)) { | |
| 2298 | + const val = this.properties[key]; | |
| 2299 | + if (val) { | |
| 2300 | + // safely append the val - avoid blowing up when attempting to | |
| 2301 | + // call .replace() if message is not a string for some reason | |
| 2302 | + cmdStr += `${key}=${escape(`${val || ''}`)};`; | |
| 2303 | + } | |
| 2304 | + } | |
| 2305 | + } | |
| 2306 | + } | |
| 2307 | + cmdStr += ']'; | |
| 2308 | + // safely append the message - avoid blowing up when attempting to | |
| 2309 | + // call .replace() if message is not a string for some reason | |
| 2310 | + const message = `${this.message || ''}`; | |
| 2311 | + cmdStr += escapeData(message); | |
| 2312 | + return cmdStr; | |
| 2313 | + } | |
| 2314 | +} | |
| 2315 | +function escapeData(s) { | |
| 2316 | + return s.replace(/\r/g, '%0D').replace(/\n/g, '%0A'); | |
| 2317 | +} | |
| 2318 | +function escape(s) { | |
| 2319 | + return s | |
| 2320 | + .replace(/\r/g, '%0D') | |
| 2321 | + .replace(/\n/g, '%0A') | |
| 2322 | + .replace(/]/g, '%5D') | |
| 2323 | + .replace(/;/g, '%3B'); | |
| 2324 | +} | |
| 2878 | 2325 | //# sourceMappingURL=command.js.map |
| 2879 | 2326 | |
| 2880 | 2327 | /***/ }), |
@@ -2924,227 +2371,121 @@ async function installOTP(version) {
| 2924 | 2371 | /***/ (function(__unusedmodule, exports, __webpack_require__) { |
| 2925 | 2372 | |
| 2926 | 2373 | "use strict"; |
| 2927 | − | |
| 2928 | −var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | |
| 2929 | − function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | |
| 2930 | − return new (P || (P = Promise))(function (resolve, reject) { | |
| 2931 | − function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| 2932 | − function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| 2933 | − function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | |
| 2934 | − step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| 2935 | − }); | |
| 2936 | −}; | |
| 2937 | −var __importStar = (this && this.__importStar) || function (mod) { | |
| 2938 | − if (mod && mod.__esModule) return mod; | |
| 2939 | − var result = {}; | |
| 2940 | − if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | |
| 2941 | − result["default"] = mod; | |
| 2942 | − return result; | |
| 2943 | −}; | |
| 2944 | −Object.defineProperty(exports, "__esModule", { value: true }); | |
| 2945 | −const command_1 = __webpack_require__(431); | |
| 2946 | −const os = __importStar(__webpack_require__(87)); | |
| 2947 | −const path = __importStar(__webpack_require__(622)); | |
| 2948 | −/** | |
| 2949 | − * The code to exit an action | |
| 2950 | − */ | |
| 2951 | −var ExitCode; | |
| 2952 | −(function (ExitCode) { | |
| 2953 | − /** | |
| 2954 | − * A code indicating that the action was successful | |
| 2955 | − */ | |
| 2956 | − ExitCode[ExitCode["Success"] = 0] = "Success"; | |
| 2957 | − /** | |
| 2958 | − * A code indicating that the action was a failure | |
| 2959 | − */ | |
| 2960 | − ExitCode[ExitCode["Failure"] = 1] = "Failure"; | |
| 2961 | −})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); | |
| 2962 | −//----------------------------------------------------------------------- | |
| 2963 | −// Variables | |
| 2964 | −//----------------------------------------------------------------------- | |
| 2965 | −/** | |
| 2966 | − * Sets env variable for this action and future actions in the job | |
| 2967 | − * @param name the name of the variable to set | |
| 2968 | − * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify | |
| 2969 | − */ | |
| 2970 | −// eslint-disable-next-line @typescript-eslint/no-explicit-any | |
| 2971 | −function exportVariable(name, val) { | |
| 2972 | − const convertedVal = command_1.toCommandValue(val); | |
| 2973 | − process.env[name] = convertedVal; | |
| 2974 | − command_1.issueCommand('set-env', { name }, convertedVal); | |
| 2975 | −} | |
| 2976 | −exports.exportVariable = exportVariable; | |
| 2977 | −/** | |
| 2978 | − * Registers a secret which will get masked from logs | |
| 2979 | − * @param secret value of the secret | |
| 2980 | − */ | |
| 2981 | −function setSecret(secret) { | |
| 2982 | − command_1.issueCommand('add-mask', {}, secret); | |
| 2983 | −} | |
| 2984 | −exports.setSecret = setSecret; | |
| 2985 | −/** | |
| 2986 | − * Prepends inputPath to the PATH (for this action and future actions) | |
| 2987 | − * @param inputPath | |
| 2988 | − */ | |
| 2989 | −function addPath(inputPath) { | |
| 2990 | − command_1.issueCommand('add-path', {}, inputPath); | |
| 2991 | − process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; | |
| 2992 | −} | |
| 2993 | −exports.addPath = addPath; | |
| 2994 | −/** | |
| 2995 | − * Gets the value of an input. The value is also trimmed. | |
| 2996 | − * | |
| 2997 | − * @param name name of the input to get | |
| 2998 | − * @param options optional. See InputOptions. | |
| 2999 | − * @returns string | |
| 3000 | − */ | |
| 3001 | −function getInput(name, options) { | |
| 3002 | − const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; | |
| 3003 | − if (options && options.required && !val) { | |
| 3004 | − throw new Error(`Input required and not supplied: ${name}`); | |
| 3005 | − } | |
| 3006 | − return val.trim(); | |
| 3007 | −} | |
| 3008 | −exports.getInput = getInput; | |
| 3009 | −/** | |
| 3010 | − * Sets the value of an output. | |
| 3011 | − * | |
| 3012 | − * @param name name of the output to set | |
| 3013 | − * @param value value to store. Non-string values will be converted to a string via JSON.stringify | |
| 3014 | − */ | |
| 3015 | −// eslint-disable-next-line @typescript-eslint/no-explicit-any | |
| 3016 | −function setOutput(name, value) { | |
| 3017 | − command_1.issueCommand('set-output', { name }, value); | |
| 3018 | −} | |
| 3019 | −exports.setOutput = setOutput; | |
| 3020 | −/** | |
| 3021 | − * Enables or disables the echoing of commands into stdout for the rest of the step. | |
| 3022 | − * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. | |
| 3023 | − * | |
| 3024 | − */ | |
| 3025 | −function setCommandEcho(enabled) { | |
| 3026 | − command_1.issue('echo', enabled ? 'on' : 'off'); | |
| 3027 | −} | |
| 3028 | −exports.setCommandEcho = setCommandEcho; | |
| 3029 | −//----------------------------------------------------------------------- | |
| 3030 | −// Results | |
| 3031 | −//----------------------------------------------------------------------- | |
| 3032 | −/** | |
| 3033 | − * Sets the action status to failed. | |
| 3034 | − * When the action exits it will be with an exit code of 1 | |
| 3035 | − * @param message add error issue message | |
| 3036 | − */ | |
| 3037 | −function setFailed(message) { | |
| 3038 | − process.exitCode = ExitCode.Failure; | |
| 3039 | − error(message); | |
| 3040 | −} | |
| 3041 | −exports.setFailed = setFailed; | |
| 3042 | −//----------------------------------------------------------------------- | |
| 3043 | −// Logging Commands | |
| 3044 | −//----------------------------------------------------------------------- | |
| 3045 | −/** | |
| 3046 | − * Gets whether Actions Step Debug is on or not | |
| 3047 | − */ | |
| 3048 | −function isDebug() { | |
| 3049 | − return process.env['RUNNER_DEBUG'] === '1'; | |
| 3050 | −} | |
| 3051 | −exports.isDebug = isDebug; | |
| 3052 | −/** | |
| 3053 | − * Writes debug message to user log | |
| 3054 | − * @param message debug message | |
| 3055 | − */ | |
| 3056 | −function debug(message) { | |
| 3057 | − command_1.issueCommand('debug', {}, message); | |
| 3058 | −} | |
| 3059 | −exports.debug = debug; | |
| 3060 | −/** | |
| 3061 | − * Adds an error issue | |
| 3062 | − * @param message error issue message. Errors will be converted to string via toString() | |
| 3063 | − */ | |
| 3064 | −function error(message) { | |
| 3065 | − command_1.issue('error', message instanceof Error ? message.toString() : message); | |
| 3066 | −} | |
| 3067 | −exports.error = error; | |
| 3068 | −/** | |
| 3069 | − * Adds an warning issue | |
| 3070 | − * @param message warning issue message. Errors will be converted to string via toString() | |
| 3071 | − */ | |
| 3072 | −function warning(message) { | |
| 3073 | − command_1.issue('warning', message instanceof Error ? message.toString() : message); | |
| 3074 | −} | |
| 3075 | −exports.warning = warning; | |
| 3076 | −/** | |
| 3077 | − * Writes info to log with console.log. | |
| 3078 | − * @param message info message | |
| 3079 | − */ | |
| 3080 | −function info(message) { | |
| 3081 | − process.stdout.write(message + os.EOL); | |
| 3082 | −} | |
| 3083 | −exports.info = info; | |
| 3084 | −/** | |
| 3085 | − * Begin an output group. | |
| 3086 | − * | |
| 3087 | − * Output until the next `groupEnd` will be foldable in this group | |
| 3088 | − * | |
| 3089 | − * @param name The name of the output group | |
| 3090 | − */ | |
| 3091 | −function startGroup(name) { | |
| 3092 | − command_1.issue('group', name); | |
| 3093 | −} | |
| 3094 | −exports.startGroup = startGroup; | |
| 3095 | −/** | |
| 3096 | − * End an output group. | |
| 3097 | − */ | |
| 3098 | −function endGroup() { | |
| 3099 | − command_1.issue('endgroup'); | |
| 3100 | −} | |
| 3101 | −exports.endGroup = endGroup; | |
| 3102 | −/** | |
| 3103 | − * Wrap an asynchronous function call in a group. | |
| 3104 | − * | |
| 3105 | − * Returns the same type as the function itself. | |
| 3106 | − * | |
| 3107 | − * @param name The name of the group | |
| 3108 | − * @param fn The function to wrap in the group | |
| 3109 | − */ | |
| 3110 | −function group(name, fn) { | |
| 3111 | − return __awaiter(this, void 0, void 0, function* () { | |
| 3112 | − startGroup(name); | |
| 3113 | − let result; | |
| 3114 | − try { | |
| 3115 | − result = yield fn(); | |
| 3116 | − } | |
| 3117 | − finally { | |
| 3118 | − endGroup(); | |
| 3119 | − } | |
| 3120 | − return result; | |
| 3121 | − }); | |
| 3122 | −} | |
| 3123 | −exports.group = group; | |
| 3124 | −//----------------------------------------------------------------------- | |
| 3125 | −// Wrapper action state | |
| 3126 | −//----------------------------------------------------------------------- | |
| 3127 | −/** | |
| 3128 | − * Saves state for current action, the state can only be retrieved by this action's post job execution. | |
| 3129 | − * | |
| 3130 | − * @param name name of the state to store | |
| 3131 | − * @param value value to store. Non-string values will be converted to a string via JSON.stringify | |
| 3132 | − */ | |
| 3133 | −// eslint-disable-next-line @typescript-eslint/no-explicit-any | |
| 3134 | −function saveState(name, value) { | |
| 3135 | − command_1.issueCommand('save-state', { name }, value); | |
| 3136 | −} | |
| 3137 | −exports.saveState = saveState; | |
| 3138 | −/** | |
| 3139 | − * Gets the value of an state set by this action's main execution. | |
| 3140 | − * | |
| 3141 | − * @param name name of the state to get | |
| 3142 | − * @returns string | |
| 3143 | − */ | |
| 3144 | −function getState(name) { | |
| 3145 | − return process.env[`STATE_${name}`] || ''; | |
| 3146 | −} | |
| 3147 | −exports.getState = getState; | |
| 2374 | + | |
| 2375 | +Object.defineProperty(exports, "__esModule", { value: true }); | |
| 2376 | +const command_1 = __webpack_require__(431); | |
| 2377 | +const path = __webpack_require__(622); | |
| 2378 | +/** | |
| 2379 | + * The code to exit an action | |
| 2380 | + */ | |
| 2381 | +var ExitCode; | |
| 2382 | +(function (ExitCode) { | |
| 2383 | + /** | |
| 2384 | + * A code indicating that the action was successful | |
| 2385 | + */ | |
| 2386 | + ExitCode[ExitCode["Success"] = 0] = "Success"; | |
| 2387 | + /** | |
| 2388 | + * A code indicating that the action was a failure | |
| 2389 | + */ | |
| 2390 | + ExitCode[ExitCode["Failure"] = 1] = "Failure"; | |
| 2391 | +})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); | |
| 2392 | +//----------------------------------------------------------------------- | |
| 2393 | +// Variables | |
| 2394 | +//----------------------------------------------------------------------- | |
| 2395 | +/** | |
| 2396 | + * sets env variable for this action and future actions in the job | |
| 2397 | + * @param name the name of the variable to set | |
| 2398 | + * @param val the value of the variable | |
| 2399 | + */ | |
| 2400 | +function exportVariable(name, val) { | |
| 2401 | + process.env[name] = val; | |
| 2402 | + command_1.issueCommand('set-env', { name }, val); | |
| 2403 | +} | |
| 2404 | +exports.exportVariable = exportVariable; | |
| 2405 | +/** | |
| 2406 | + * exports the variable and registers a secret which will get masked from logs | |
| 2407 | + * @param name the name of the variable to set | |
| 2408 | + * @param val value of the secret | |
| 2409 | + */ | |
| 2410 | +function exportSecret(name, val) { | |
| 2411 | + exportVariable(name, val); | |
| 2412 | + command_1.issueCommand('set-secret', {}, val); | |
| 2413 | +} | |
| 2414 | +exports.exportSecret = exportSecret; | |
| 2415 | +/** | |
| 2416 | + * Prepends inputPath to the PATH (for this action and future actions) | |
| 2417 | + * @param inputPath | |
| 2418 | + */ | |
| 2419 | +function addPath(inputPath) { | |
| 2420 | + command_1.issueCommand('add-path', {}, inputPath); | |
| 2421 | + process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; | |
| 2422 | +} | |
| 2423 | +exports.addPath = addPath; | |
| 2424 | +/** | |
| 2425 | + * Gets the value of an input. The value is also trimmed. | |
| 2426 | + * | |
| 2427 | + * @param name name of the input to get | |
| 2428 | + * @param options optional. See InputOptions. | |
| 2429 | + * @returns string | |
| 2430 | + */ | |
| 2431 | +function getInput(name, options) { | |
| 2432 | + const val = process.env[`INPUT_${name.replace(' ', '_').toUpperCase()}`] || ''; | |
| 2433 | + if (options && options.required && !val) { | |
| 2434 | + throw new Error(`Input required and not supplied: ${name}`); | |
| 2435 | + } | |
| 2436 | + return val.trim(); | |
| 2437 | +} | |
| 2438 | +exports.getInput = getInput; | |
| 2439 | +/** | |
| 2440 | + * Sets the value of an output. | |
| 2441 | + * | |
| 2442 | + * @param name name of the output to set | |
| 2443 | + * @param value value to store | |
| 2444 | + */ | |
| 2445 | +function setOutput(name, value) { | |
| 2446 | + command_1.issueCommand('set-output', { name }, value); | |
| 2447 | +} | |
| 2448 | +exports.setOutput = setOutput; | |
| 2449 | +//----------------------------------------------------------------------- | |
| 2450 | +// Results | |
| 2451 | +//----------------------------------------------------------------------- | |
| 2452 | +/** | |
| 2453 | + * Sets the action status to failed. | |
| 2454 | + * When the action exits it will be with an exit code of 1 | |
| 2455 | + * @param message add error issue message | |
| 2456 | + */ | |
| 2457 | +function setFailed(message) { | |
| 2458 | + process.exitCode = ExitCode.Failure; | |
| 2459 | + error(message); | |
| 2460 | +} | |
| 2461 | +exports.setFailed = setFailed; | |
| 2462 | +//----------------------------------------------------------------------- | |
| 2463 | +// Logging Commands | |
| 2464 | +//----------------------------------------------------------------------- | |
| 2465 | +/** | |
| 2466 | + * Writes debug message to user log | |
| 2467 | + * @param message debug message | |
| 2468 | + */ | |
| 2469 | +function debug(message) { | |
| 2470 | + command_1.issueCommand('debug', {}, message); | |
| 2471 | +} | |
| 2472 | +exports.debug = debug; | |
| 2473 | +/** | |
| 2474 | + * Adds an error issue | |
| 2475 | + * @param message error issue message | |
| 2476 | + */ | |
| 2477 | +function error(message) { | |
| 2478 | + command_1.issue('error', message); | |
| 2479 | +} | |
| 2480 | +exports.error = error; | |
| 2481 | +/** | |
| 2482 | + * Adds an warning issue | |
| 2483 | + * @param message warning issue message | |
| 2484 | + */ | |
| 2485 | +function warning(message) { | |
| 2486 | + command_1.issue('warning', message); | |
| 2487 | +} | |
| 2488 | +exports.warning = warning; | |
| 3148 | 2489 | //# sourceMappingURL=core.js.map |
| 3149 | 2490 | |
| 3150 | 2491 | /***/ }), |
@@ -3163,67 +2504,45 @@ module.exports = require("path");
| 3163 | 2504 | |
| 3164 | 2505 | /***/ }), |
| 3165 | 2506 | |
| 3166 | −/***/ 669: | |
| 3167 | −/***/ (function(module) { | |
| 3168 | − | |
| 3169 | −module.exports = require("util"); | |
| 3170 | − | |
| 3171 | −/***/ }), | |
| 3172 | − | |
| 3173 | −/***/ 747: | |
| 3174 | −/***/ (function(module) { | |
| 3175 | − | |
| 3176 | −module.exports = require("fs"); | |
| 3177 | − | |
| 3178 | −/***/ }), | |
| 3179 | − | |
| 3180 | 2507 | /***/ 917: |
| 3181 | 2508 | /***/ (function(__unusedmodule, exports, __webpack_require__) { |
| 3182 | 2509 | |
| 3183 | 2510 | "use strict"; |
| 3184 | − | |
| 3185 | −var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | |
| 3186 | − function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | |
| 3187 | − return new (P || (P = Promise))(function (resolve, reject) { | |
| 3188 | − function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| 3189 | − function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| 3190 | − function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | |
| 3191 | − step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| 3192 | − }); | |
| 3193 | −}; | |
| 3194 | −var __importStar = (this && this.__importStar) || function (mod) { | |
| 3195 | − if (mod && mod.__esModule) return mod; | |
| 3196 | − var result = {}; | |
| 3197 | − if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; | |
| 3198 | − result["default"] = mod; | |
| 3199 | − return result; | |
| 3200 | −}; | |
| 3201 | −Object.defineProperty(exports, "__esModule", { value: true }); | |
| 3202 | −const tr = __importStar(__webpack_require__(9)); | |
| 3203 | −/** | |
| 3204 | − * Exec a command. | |
| 3205 | − * Output will be streamed to the live console. | |
| 3206 | − * Returns promise with return code | |
| 3207 | − * | |
| 3208 | − * @param commandLine command to execute (can include additional args). Must be correctly escaped. | |
| 3209 | − * @param args optional arguments for tool. Escaping is handled by the lib. | |
| 3210 | − * @param options optional exec options. See ExecOptions | |
| 3211 | − * @returns Promise<number> exit code | |
| 3212 | − */ | |
| 3213 | −function exec(commandLine, args, options) { | |
| 3214 | − return __awaiter(this, void 0, void 0, function* () { | |
| 3215 | − const commandArgs = tr.argStringToArray(commandLine); | |
| 3216 | − if (commandArgs.length === 0) { | |
| 3217 | − throw new Error(`Parameter 'commandLine' cannot be null or empty.`); | |
| 3218 | − } | |
| 3219 | − // Path to tool to execute should be first arg | |
| 3220 | − const toolPath = commandArgs[0]; | |
| 3221 | − args = commandArgs.slice(1).concat(args || []); | |
| 3222 | − const runner = new tr.ToolRunner(toolPath, args, options); | |
| 3223 | − return runner.exec(); | |
| 3224 | − }); | |
| 3225 | −} | |
| 3226 | −exports.exec = exec; | |
| 2511 | + | |
| 2512 | +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | |
| 2513 | + return new (P || (P = Promise))(function (resolve, reject) { | |
| 2514 | + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | |
| 2515 | + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | |
| 2516 | + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } | |
| 2517 | + step((generator = generator.apply(thisArg, _arguments || [])).next()); | |
| 2518 | + }); | |
| 2519 | +}; | |
| 2520 | +Object.defineProperty(exports, "__esModule", { value: true }); | |
| 2521 | +const tr = __webpack_require__(9); | |
| 2522 | +/** | |
| 2523 | + * Exec a command. | |
| 2524 | + * Output will be streamed to the live console. | |
| 2525 | + * Returns promise with return code | |
| 2526 | + * | |
| 2527 | + * @param commandLine command to execute (can include additional args). Must be correctly escaped. | |
| 2528 | + * @param args optional arguments for tool. Escaping is handled by the lib. | |
| 2529 | + * @param options optional exec options. See ExecOptions | |
| 2530 | + * @returns Promise<number> exit code | |
| 2531 | + */ | |
| 2532 | +function exec(commandLine, args, options) { | |
| 2533 | + return __awaiter(this, void 0, void 0, function* () { | |
| 2534 | + const commandArgs = tr.argStringToArray(commandLine); | |
| 2535 | + if (commandArgs.length === 0) { | |
| 2536 | + throw new Error(`Parameter 'commandLine' cannot be null or empty.`); | |
| 2537 | + } | |
| 2538 | + // Path to tool to execute should be first arg | |
| 2539 | + const toolPath = commandArgs[0]; | |
| 2540 | + args = commandArgs.slice(1).concat(args || []); | |
| 2541 | + const runner = new tr.ToolRunner(toolPath, args, options); | |
| 2542 | + return runner.exec(); | |
| 2543 | + }); | |
| 2544 | +} | |
| 2545 | +exports.exec = exec; | |
| 3227 | 2546 | //# sourceMappingURL=exec.js.map |
| 3228 | 2547 | |
| 3229 | 2548 | /***/ }), |
@@ -3273,6 +2592,8 @@ async function main() {
| 3273 | 2592 | |
| 3274 | 2593 | const matchersPath = __webpack_require__.ab + ".github" |
| 3275 | 2594 | console.log(`##[add-matcher]${path.join(matchersPath, 'elixir.json')}`) |
| 2595 | + console.log(`::set-output name=otp-version::${otpVersion}`) | |
| 2596 | + console.log(`::set-output name=elixir-version::${elixirVersion}`) | |
| 3276 | 2597 | } |
| 3277 | 2598 | |
| 3278 | 2599 | function checkPlatform() { |
modified
src/setup-elixir.js
+2
−0
@@ -40,6 +40,8 @@ async function main() {
| 40 | 40 | |
| 41 | 41 | const matchersPath = path.join(__dirname, '..', '.github') |
| 42 | 42 | console.log(`##[add-matcher]${path.join(matchersPath, 'elixir.json')}`) |
| 43 | + console.log(`::set-output name=otp-version::${otpVersion}`) | |
| 44 | + console.log(`::set-output name=elixir-version::${elixirVersion}`) | |
| 43 | 45 | } |
| 44 | 46 | |
| 45 | 47 | function checkPlatform() { |
modified
yarn.lock
+320
−0
@@ -29,11 +29,321 @@
| 29 | 29 | typed-rest-client "^1.4.0" |
| 30 | 30 | uuid "^3.3.2" |
| 31 | 31 | |
| 32 | +"@babel/code-frame@^7.0.0": | |
| 33 | + version "7.10.4" | |
| 34 | + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" | |
| 35 | + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== | |
| 36 | + dependencies: | |
| 37 | + "@babel/highlight" "^7.10.4" | |
| 38 | + | |
| 39 | +"@babel/helper-validator-identifier@^7.10.4": | |
| 40 | + version "7.10.4" | |
| 41 | + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" | |
| 42 | + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== | |
| 43 | + | |
| 44 | +"@babel/highlight@^7.10.4": | |
| 45 | + version "7.10.4" | |
| 46 | + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" | |
| 47 | + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== | |
| 48 | + dependencies: | |
| 49 | + "@babel/helper-validator-identifier" "^7.10.4" | |
| 50 | + chalk "^2.0.0" | |
| 51 | + js-tokens "^4.0.0" | |
| 52 | + | |
| 53 | +"@types/color-name@^1.1.1": | |
| 54 | + version "1.1.1" | |
| 55 | + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" | |
| 56 | + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== | |
| 57 | + | |
| 58 | +"@types/parse-json@^4.0.0": | |
| 59 | + version "4.0.0" | |
| 60 | + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" | |
| 61 | + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== | |
| 62 | + | |
| 63 | +"@zeit/ncc@^0.22.1": | |
| 64 | + version "0.22.3" | |
| 65 | + resolved "https://registry.yarnpkg.com/@zeit/ncc/-/ncc-0.22.3.tgz#fca6b86b4454ce7a7e1e7e755165ec06457f16cd" | |
| 66 | + integrity sha512-jnCLpLXWuw/PAiJiVbLjA8WBC0IJQbFeUwF4I9M+23MvIxTxk5pD4Q8byQBSPmHQjz5aBoA7AKAElQxMpjrCLQ== | |
| 67 | + | |
| 68 | +ansi-styles@^3.2.1: | |
| 69 | + version "3.2.1" | |
| 70 | + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" | |
| 71 | + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== | |
| 72 | + dependencies: | |
| 73 | + color-convert "^1.9.0" | |
| 74 | + | |
| 75 | +ansi-styles@^4.1.0: | |
| 76 | + version "4.2.1" | |
| 77 | + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" | |
| 78 | + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== | |
| 79 | + dependencies: | |
| 80 | + "@types/color-name" "^1.1.1" | |
| 81 | + color-convert "^2.0.1" | |
| 82 | + | |
| 83 | +callsites@^3.0.0: | |
| 84 | + version "3.1.0" | |
| 85 | + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" | |
| 86 | + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== | |
| 87 | + | |
| 88 | +chalk@^2.0.0: | |
| 89 | + version "2.4.2" | |
| 90 | + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" | |
| 91 | + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== | |
| 92 | + dependencies: | |
| 93 | + ansi-styles "^3.2.1" | |
| 94 | + escape-string-regexp "^1.0.5" | |
| 95 | + supports-color "^5.3.0" | |
| 96 | + | |
| 97 | +chalk@^4.0.0: | |
| 98 | + version "4.1.0" | |
| 99 | + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" | |
| 100 | + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== | |
| 101 | + dependencies: | |
| 102 | + ansi-styles "^4.1.0" | |
| 103 | + supports-color "^7.1.0" | |
| 104 | + | |
| 105 | +ci-info@^2.0.0: | |
| 106 | + version "2.0.0" | |
| 107 | + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" | |
| 108 | + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== | |
| 109 | + | |
| 110 | +color-convert@^1.9.0: | |
| 111 | + version "1.9.3" | |
| 112 | + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" | |
| 113 | + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== | |
| 114 | + dependencies: | |
| 115 | + color-name "1.1.3" | |
| 116 | + | |
| 117 | +color-convert@^2.0.1: | |
| 118 | + version "2.0.1" | |
| 119 | + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" | |
| 120 | + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== | |
| 121 | + dependencies: | |
| 122 | + color-name "~1.1.4" | |
| 123 | + | |
| 124 | +color-name@1.1.3: | |
| 125 | + version "1.1.3" | |
| 126 | + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" | |
| 127 | + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= | |
| 128 | + | |
| 129 | +color-name@~1.1.4: | |
| 130 | + version "1.1.4" | |
| 131 | + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" | |
| 132 | + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== | |
| 133 | + | |
| 134 | +compare-versions@^3.6.0: | |
| 135 | + version "3.6.0" | |
| 136 | + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" | |
| 137 | + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== | |
| 138 | + | |
| 139 | +cosmiconfig@^6.0.0: | |
| 140 | + version "6.0.0" | |
| 141 | + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" | |
| 142 | + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== | |
| 143 | + dependencies: | |
| 144 | + "@types/parse-json" "^4.0.0" | |
| 145 | + import-fresh "^3.1.0" | |
| 146 | + parse-json "^5.0.0" | |
| 147 | + path-type "^4.0.0" | |
| 148 | + yaml "^1.7.2" | |
| 149 | + | |
| 150 | +error-ex@^1.3.1: | |
| 151 | + version "1.3.2" | |
| 152 | + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" | |
| 153 | + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== | |
| 154 | + dependencies: | |
| 155 | + is-arrayish "^0.2.1" | |
| 156 | + | |
| 157 | +escape-string-regexp@^1.0.5: | |
| 158 | + version "1.0.5" | |
| 159 | + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" | |
| 160 | + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= | |
| 161 | + | |
| 162 | +find-up@^4.0.0: | |
| 163 | + version "4.1.0" | |
| 164 | + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" | |
| 165 | + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== | |
| 166 | + dependencies: | |
| 167 | + locate-path "^5.0.0" | |
| 168 | + path-exists "^4.0.0" | |
| 169 | + | |
| 170 | +find-versions@^3.2.0: | |
| 171 | + version "3.2.0" | |
| 172 | + resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" | |
| 173 | + integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww== | |
| 174 | + dependencies: | |
| 175 | + semver-regex "^2.0.0" | |
| 176 | + | |
| 177 | +has-flag@^3.0.0: | |
| 178 | + version "3.0.0" | |
| 179 | + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" | |
| 180 | + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= | |
| 181 | + | |
| 182 | +has-flag@^4.0.0: | |
| 183 | + version "4.0.0" | |
| 184 | + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" | |
| 185 | + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== | |
| 186 | + | |
| 187 | +husky@^4.2.5: | |
| 188 | + version "4.2.5" | |
| 189 | + resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" | |
| 190 | + integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== | |
| 191 | + dependencies: | |
| 192 | + chalk "^4.0.0" | |
| 193 | + ci-info "^2.0.0" | |
| 194 | + compare-versions "^3.6.0" | |
| 195 | + cosmiconfig "^6.0.0" | |
| 196 | + find-versions "^3.2.0" | |
| 197 | + opencollective-postinstall "^2.0.2" | |
| 198 | + pkg-dir "^4.2.0" | |
| 199 | + please-upgrade-node "^3.2.0" | |
| 200 | + slash "^3.0.0" | |
| 201 | + which-pm-runs "^1.0.0" | |
| 202 | + | |
| 203 | +import-fresh@^3.1.0: | |
| 204 | + version "3.2.1" | |
| 205 | + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" | |
| 206 | + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== | |
| 207 | + dependencies: | |
| 208 | + parent-module "^1.0.0" | |
| 209 | + resolve-from "^4.0.0" | |
| 210 | + | |
| 211 | +is-arrayish@^0.2.1: | |
| 212 | + version "0.2.1" | |
| 213 | + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" | |
| 214 | + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= | |
| 215 | + | |
| 216 | +js-tokens@^4.0.0: | |
| 217 | + version "4.0.0" | |
| 218 | + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" | |
| 219 | + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== | |
| 220 | + | |
| 221 | +json-parse-better-errors@^1.0.1: | |
| 222 | + version "1.0.2" | |
| 223 | + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" | |
| 224 | + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== | |
| 225 | + | |
| 226 | +lines-and-columns@^1.1.6: | |
| 227 | + version "1.1.6" | |
| 228 | + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" | |
| 229 | + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= | |
| 230 | + | |
| 231 | +locate-path@^5.0.0: | |
| 232 | + version "5.0.0" | |
| 233 | + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" | |
| 234 | + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== | |
| 235 | + dependencies: | |
| 236 | + p-locate "^4.1.0" | |
| 237 | + | |
| 238 | +opencollective-postinstall@^2.0.2: | |
| 239 | + version "2.0.3" | |
| 240 | + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" | |
| 241 | + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== | |
| 242 | + | |
| 243 | +p-limit@^2.2.0: | |
| 244 | + version "2.3.0" | |
| 245 | + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" | |
| 246 | + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== | |
| 247 | + dependencies: | |
| 248 | + p-try "^2.0.0" | |
| 249 | + | |
| 250 | +p-locate@^4.1.0: | |
| 251 | + version "4.1.0" | |
| 252 | + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" | |
| 253 | + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== | |
| 254 | + dependencies: | |
| 255 | + p-limit "^2.2.0" | |
| 256 | + | |
| 257 | +p-try@^2.0.0: | |
| 258 | + version "2.2.0" | |
| 259 | + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" | |
| 260 | + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== | |
| 261 | + | |
| 262 | +parent-module@^1.0.0: | |
| 263 | + version "1.0.1" | |
| 264 | + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" | |
| 265 | + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== | |
| 266 | + dependencies: | |
| 267 | + callsites "^3.0.0" | |
| 268 | + | |
| 269 | +parse-json@^5.0.0: | |
| 270 | + version "5.0.1" | |
| 271 | + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.1.tgz#7cfe35c1ccd641bce3981467e6c2ece61b3b3878" | |
| 272 | + integrity sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ== | |
| 273 | + dependencies: | |
| 274 | + "@babel/code-frame" "^7.0.0" | |
| 275 | + error-ex "^1.3.1" | |
| 276 | + json-parse-better-errors "^1.0.1" | |
| 277 | + lines-and-columns "^1.1.6" | |
| 278 | + | |
| 279 | +path-exists@^4.0.0: | |
| 280 | + version "4.0.0" | |
| 281 | + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" | |
| 282 | + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== | |
| 283 | + | |
| 284 | +path-type@^4.0.0: | |
| 285 | + version "4.0.0" | |
| 286 | + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" | |
| 287 | + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== | |
| 288 | + | |
| 289 | +pkg-dir@^4.2.0: | |
| 290 | + version "4.2.0" | |
| 291 | + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" | |
| 292 | + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== | |
| 293 | + dependencies: | |
| 294 | + find-up "^4.0.0" | |
| 295 | + | |
| 296 | +please-upgrade-node@^3.2.0: | |
| 297 | + version "3.2.0" | |
| 298 | + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" | |
| 299 | + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== | |
| 300 | + dependencies: | |
| 301 | + semver-compare "^1.0.0" | |
| 302 | + | |
| 303 | +prettier@^2.0.5: | |
| 304 | + version "2.0.5" | |
| 305 | + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" | |
| 306 | + integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== | |
| 307 | + | |
| 308 | +resolve-from@^4.0.0: | |
| 309 | + version "4.0.0" | |
| 310 | + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" | |
| 311 | + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== | |
| 312 | + | |
| 313 | +semver-compare@^1.0.0: | |
| 314 | + version "1.0.0" | |
| 315 | + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" | |
| 316 | + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= | |
| 317 | + | |
| 318 | +semver-regex@^2.0.0: | |
| 319 | + version "2.0.0" | |
| 320 | + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" | |
| 321 | + integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== | |
| 322 | + | |
| 32 | 323 | semver@^6.1.0, semver@^6.3.0: |
| 33 | 324 | version "6.3.0" |
| 34 | 325 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" |
| 35 | 326 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== |
| 36 | 327 | |
| 328 | +slash@^3.0.0: | |
| 329 | + version "3.0.0" | |
| 330 | + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" | |
| 331 | + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== | |
| 332 | + | |
| 333 | +supports-color@^5.3.0: | |
| 334 | + version "5.5.0" | |
| 335 | + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" | |
| 336 | + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== | |
| 337 | + dependencies: | |
| 338 | + has-flag "^3.0.0" | |
| 339 | + | |
| 340 | +supports-color@^7.1.0: | |
| 341 | + version "7.1.0" | |
| 342 | + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" | |
| 343 | + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== | |
| 344 | + dependencies: | |
| 345 | + has-flag "^4.0.0" | |
| 346 | + | |
| 37 | 347 | tunnel@0.0.4: |
| 38 | 348 | version "0.0.4" |
| 39 | 349 | resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.4.tgz#2d3785a158c174c9a16dc2c046ec5fc5f1742213" |
@@ -56,3 +366,13 @@ uuid@^3.3.2:
| 56 | 366 | version "3.3.3" |
| 57 | 367 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.3.tgz#4568f0216e78760ee1dbf3a4d2cf53e224112866" |
| 58 | 368 | integrity sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ== |
| 369 | + | |
| 370 | +which-pm-runs@^1.0.0: | |
| 371 | + version "1.0.0" | |
| 372 | + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" | |
| 373 | + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= | |
| 374 | + | |
| 375 | +yaml@^1.7.2: | |
| 376 | + version "1.10.0" | |
| 377 | + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" | |
| 378 | + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== |
Parents: ceecbf3