mirror of
				https://github.com/shivammathur/setup-php.git
				synced 2025-11-04 00:46:36 +07:00 
			
		
		
		
	
							
								
								
									
										23
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								README.md
									
									
									
									
									
								
							@ -11,6 +11,7 @@
 | 
			
		||||
  <a href="https://codecov.io/gh/shivammathur/setup-php" title="Code coverage"><img alt="Codecov Code Coverage" src="https://codecov.io/gh/shivammathur/setup-php/branch/master/graph/badge.svg"></a>
 | 
			
		||||
  <a href="https://github.com/shivammathur/setup-php/blob/master/LICENSE" title="license"><img alt="LICENSE" src="https://img.shields.io/badge/license-MIT-428f7e.svg"></a>
 | 
			
		||||
  <a href="#tada-php-support" title="PHP Versions Supported"><img alt="PHP Versions Supported" src="https://img.shields.io/badge/php-%3E%3D%205.3-8892BF.svg"></a>
 | 
			
		||||
  <a href="https://twitter.com/setup_php" title="setup-php twitter"><img alt="setup-php twitter" src="https://img.shields.io/badge/twitter-follow-1DA1F2?logo=twitter"></a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
Setup PHP with required extensions, php.ini configuration, code-coverage support and various tools like composer in [GitHub Actions](https://github.com/features/actions "GitHub Actions"). This action gives you a cross platform interface to setup the PHP environment you need to test your application. Refer to [Usage](#memo-usage "How to use this") section and [examples](#examples "Examples of use") to see how to use this.
 | 
			
		||||
@ -179,6 +180,7 @@ with:
 | 
			
		||||
 | 
			
		||||
**Notes**
 | 
			
		||||
- Latest versions of both agent `blackfire-agent` and client `blackfire` are setup when `blackfire` is specified in tools input.
 | 
			
		||||
- If you have a tool in your `composer.json`, do not setup it globally using this action as the two instances of the tool might conflict.
 | 
			
		||||
- Tools which cannot be setup gracefully leave an error message in the logs, the action is not interrupted.
 | 
			
		||||
 | 
			
		||||
## :signal_strength: Coverage Support
 | 
			
		||||
@ -315,7 +317,7 @@ jobs:
 | 
			
		||||
 | 
			
		||||
- This version is currently in development.
 | 
			
		||||
- `PECL` is installed by default with this version on `ubuntu` and `macOS`.
 | 
			
		||||
- Some extensions might not support this version currently.
 | 
			
		||||
- Some user space extensions might not support this version currently.
 | 
			
		||||
- Refer to this [RFC](https://wiki.php.net/rfc/jit "PHP JIT RFC configuration") for configuring `PHP JIT` on this version.
 | 
			
		||||
- Refer to this [list of RFCs](https://wiki.php.net/rfc#php_80 "List of RFCs implemented in PHP8") implemented in this version.
 | 
			
		||||
 | 
			
		||||
@ -364,6 +366,10 @@ jobs:
 | 
			
		||||
        runner: self-hosted # Specify the runner.
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**Notes**
 | 
			
		||||
- Do not setup multiple self-hosted runners on the a single server instance as parallel workflow will conflict with each other.
 | 
			
		||||
- Do not setup self-hosted runners on the side on your development environment or your production server.
 | 
			
		||||
 | 
			
		||||
### Local Testing Setup
 | 
			
		||||
 | 
			
		||||
> Test your `Ubuntu` workflow locally using [`nektos/act`](https://github.com/nektos/act "Project to test GitHub Actions locally").
 | 
			
		||||
@ -609,7 +615,11 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
 | 
			
		||||
 | 
			
		||||
## :sparkling_heart: Support This Project
 | 
			
		||||
 | 
			
		||||
**Thanks for supporting this project**
 | 
			
		||||
- Please star the project and share it. If you blog, please share your experience of using this action.
 | 
			
		||||
- Please consider supporting our work by sponsoring using [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal") or by subscribing on [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon").
 | 
			
		||||
- If you use `setup-php` at your company, please [reach out](mailto:contact@setup-php.com) to sponsor the project.
 | 
			
		||||
 | 
			
		||||
*Huge thanks to the following companies for supporting `setup-php`*
 | 
			
		||||
 | 
			
		||||
<p> 
 | 
			
		||||
  <a href="https://www.jetbrains.com/?from=setup-php">
 | 
			
		||||
@ -621,13 +631,6 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
 | 
			
		||||
  </a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
*If this action helped you*
 | 
			
		||||
 | 
			
		||||
- Sponsor the project by contributing using [Paypal](https://www.paypal.me/shivammathur "Shivam Mathur PayPal") or by subscribing on [Patreon](https://www.patreon.com/shivammathur "Shivam Mathur Patreon").
 | 
			
		||||
- If you have an open-source support program, please [contact](mailto:contact@shivammathur.com) to sponsor this project.
 | 
			
		||||
- This project is also available as part of the [Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-setup-php?utm_source=npm-setup-php&utm_medium=referral&utm_campaign=enterprise&utm_term=repo "Tidelift Subscription for setup-php") to support delivering enterprise-level maintenance.
 | 
			
		||||
- Please star the project and dependencies. If you blog, please share your experience of using this action with the community.
 | 
			
		||||
 | 
			
		||||
## :package: Dependencies
 | 
			
		||||
 | 
			
		||||
- [Node.js dependencies](https://github.com/shivammathur/setup-php/network/dependencies "Node.js dependencies")
 | 
			
		||||
@ -648,4 +651,4 @@ Examples of using `setup-php` with various PHP Frameworks and Packages.
 | 
			
		||||
 | 
			
		||||
- [About GitHub Actions](https://github.com/features/actions "GitHub Actions")
 | 
			
		||||
- [GitHub Actions Syntax](https://help.github.com/en/articles/workflow-syntax-for-github-actions "GitHub Actions Syntax")
 | 
			
		||||
- [Other Awesome Actions](https://github.com/sdras/awesome-actions "List of Awesome GitHub Actions")
 | 
			
		||||
- [Other Awesome Actions](https://github.com/sdras/awesome-actions "List of Awesome GitHub Actions")
 | 
			
		||||
 | 
			
		||||
@ -1,21 +1,5 @@
 | 
			
		||||
import * as httpm from '@actions/http-client';
 | 
			
		||||
import * as tools from '../src/tools';
 | 
			
		||||
 | 
			
		||||
httpm.HttpClient.prototype.get = jest.fn().mockImplementation(() => {
 | 
			
		||||
  return {
 | 
			
		||||
    message: null,
 | 
			
		||||
    readBody: jest.fn().mockImplementation(() => {
 | 
			
		||||
      return JSON.stringify({
 | 
			
		||||
        stable: [{path: '/composer-stable.phar'}],
 | 
			
		||||
        preview: [{path: '/composer-preview.phar'}],
 | 
			
		||||
        snapshot: [{path: '/composer.phar'}],
 | 
			
		||||
        '1': [{path: '/composer-1.phar'}],
 | 
			
		||||
        '2': [{path: '/composer-2.phar'}]
 | 
			
		||||
      });
 | 
			
		||||
    })
 | 
			
		||||
  };
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
describe('Tools tests', () => {
 | 
			
		||||
  it('checking parseToolVersion', async () => {
 | 
			
		||||
    expect(await tools.getToolVersion('latest')).toBe('latest');
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										929
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										929
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							@ -953,13 +953,6 @@ class ExecState extends events.EventEmitter {
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 16:
 | 
			
		||||
/***/ (function(module) {
 | 
			
		||||
 | 
			
		||||
module.exports = require("tls");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 86:
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
@ -1015,278 +1008,6 @@ module.exports = require("os");
 | 
			
		||||
 | 
			
		||||
module.exports = require("child_process");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 141:
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var net = __webpack_require__(631);
 | 
			
		||||
var tls = __webpack_require__(16);
 | 
			
		||||
var http = __webpack_require__(605);
 | 
			
		||||
var https = __webpack_require__(211);
 | 
			
		||||
var events = __webpack_require__(614);
 | 
			
		||||
var assert = __webpack_require__(357);
 | 
			
		||||
var util = __webpack_require__(669);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
exports.httpOverHttp = httpOverHttp;
 | 
			
		||||
exports.httpsOverHttp = httpsOverHttp;
 | 
			
		||||
exports.httpOverHttps = httpOverHttps;
 | 
			
		||||
exports.httpsOverHttps = httpsOverHttps;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function httpOverHttp(options) {
 | 
			
		||||
  var agent = new TunnelingAgent(options);
 | 
			
		||||
  agent.request = http.request;
 | 
			
		||||
  return agent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function httpsOverHttp(options) {
 | 
			
		||||
  var agent = new TunnelingAgent(options);
 | 
			
		||||
  agent.request = http.request;
 | 
			
		||||
  agent.createSocket = createSecureSocket;
 | 
			
		||||
  agent.defaultPort = 443;
 | 
			
		||||
  return agent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function httpOverHttps(options) {
 | 
			
		||||
  var agent = new TunnelingAgent(options);
 | 
			
		||||
  agent.request = https.request;
 | 
			
		||||
  return agent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function httpsOverHttps(options) {
 | 
			
		||||
  var agent = new TunnelingAgent(options);
 | 
			
		||||
  agent.request = https.request;
 | 
			
		||||
  agent.createSocket = createSecureSocket;
 | 
			
		||||
  agent.defaultPort = 443;
 | 
			
		||||
  return agent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function TunnelingAgent(options) {
 | 
			
		||||
  var self = this;
 | 
			
		||||
  self.options = options || {};
 | 
			
		||||
  self.proxyOptions = self.options.proxy || {};
 | 
			
		||||
  self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;
 | 
			
		||||
  self.requests = [];
 | 
			
		||||
  self.sockets = [];
 | 
			
		||||
 | 
			
		||||
  self.on('free', function onFree(socket, host, port, localAddress) {
 | 
			
		||||
    var options = toOptions(host, port, localAddress);
 | 
			
		||||
    for (var i = 0, len = self.requests.length; i < len; ++i) {
 | 
			
		||||
      var pending = self.requests[i];
 | 
			
		||||
      if (pending.host === options.host && pending.port === options.port) {
 | 
			
		||||
        // Detect the request to connect same origin server,
 | 
			
		||||
        // reuse the connection.
 | 
			
		||||
        self.requests.splice(i, 1);
 | 
			
		||||
        pending.request.onSocket(socket);
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    socket.destroy();
 | 
			
		||||
    self.removeSocket(socket);
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
util.inherits(TunnelingAgent, events.EventEmitter);
 | 
			
		||||
 | 
			
		||||
TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) {
 | 
			
		||||
  var self = this;
 | 
			
		||||
  var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress));
 | 
			
		||||
 | 
			
		||||
  if (self.sockets.length >= this.maxSockets) {
 | 
			
		||||
    // We are over limit so we'll add it to the queue.
 | 
			
		||||
    self.requests.push(options);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // If we are under maxSockets create a new one.
 | 
			
		||||
  self.createSocket(options, function(socket) {
 | 
			
		||||
    socket.on('free', onFree);
 | 
			
		||||
    socket.on('close', onCloseOrRemove);
 | 
			
		||||
    socket.on('agentRemove', onCloseOrRemove);
 | 
			
		||||
    req.onSocket(socket);
 | 
			
		||||
 | 
			
		||||
    function onFree() {
 | 
			
		||||
      self.emit('free', socket, options);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function onCloseOrRemove(err) {
 | 
			
		||||
      self.removeSocket(socket);
 | 
			
		||||
      socket.removeListener('free', onFree);
 | 
			
		||||
      socket.removeListener('close', onCloseOrRemove);
 | 
			
		||||
      socket.removeListener('agentRemove', onCloseOrRemove);
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
 | 
			
		||||
  var self = this;
 | 
			
		||||
  var placeholder = {};
 | 
			
		||||
  self.sockets.push(placeholder);
 | 
			
		||||
 | 
			
		||||
  var connectOptions = mergeOptions({}, self.proxyOptions, {
 | 
			
		||||
    method: 'CONNECT',
 | 
			
		||||
    path: options.host + ':' + options.port,
 | 
			
		||||
    agent: false,
 | 
			
		||||
    headers: {
 | 
			
		||||
      host: options.host + ':' + options.port
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
  if (options.localAddress) {
 | 
			
		||||
    connectOptions.localAddress = options.localAddress;
 | 
			
		||||
  }
 | 
			
		||||
  if (connectOptions.proxyAuth) {
 | 
			
		||||
    connectOptions.headers = connectOptions.headers || {};
 | 
			
		||||
    connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
 | 
			
		||||
        new Buffer(connectOptions.proxyAuth).toString('base64');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  debug('making CONNECT request');
 | 
			
		||||
  var connectReq = self.request(connectOptions);
 | 
			
		||||
  connectReq.useChunkedEncodingByDefault = false; // for v0.6
 | 
			
		||||
  connectReq.once('response', onResponse); // for v0.6
 | 
			
		||||
  connectReq.once('upgrade', onUpgrade);   // for v0.6
 | 
			
		||||
  connectReq.once('connect', onConnect);   // for v0.7 or later
 | 
			
		||||
  connectReq.once('error', onError);
 | 
			
		||||
  connectReq.end();
 | 
			
		||||
 | 
			
		||||
  function onResponse(res) {
 | 
			
		||||
    // Very hacky. This is necessary to avoid http-parser leaks.
 | 
			
		||||
    res.upgrade = true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function onUpgrade(res, socket, head) {
 | 
			
		||||
    // Hacky.
 | 
			
		||||
    process.nextTick(function() {
 | 
			
		||||
      onConnect(res, socket, head);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function onConnect(res, socket, head) {
 | 
			
		||||
    connectReq.removeAllListeners();
 | 
			
		||||
    socket.removeAllListeners();
 | 
			
		||||
 | 
			
		||||
    if (res.statusCode !== 200) {
 | 
			
		||||
      debug('tunneling socket could not be established, statusCode=%d',
 | 
			
		||||
        res.statusCode);
 | 
			
		||||
      socket.destroy();
 | 
			
		||||
      var error = new Error('tunneling socket could not be established, ' +
 | 
			
		||||
        'statusCode=' + res.statusCode);
 | 
			
		||||
      error.code = 'ECONNRESET';
 | 
			
		||||
      options.request.emit('error', error);
 | 
			
		||||
      self.removeSocket(placeholder);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    if (head.length > 0) {
 | 
			
		||||
      debug('got illegal response body from proxy');
 | 
			
		||||
      socket.destroy();
 | 
			
		||||
      var error = new Error('got illegal response body from proxy');
 | 
			
		||||
      error.code = 'ECONNRESET';
 | 
			
		||||
      options.request.emit('error', error);
 | 
			
		||||
      self.removeSocket(placeholder);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    debug('tunneling connection has established');
 | 
			
		||||
    self.sockets[self.sockets.indexOf(placeholder)] = socket;
 | 
			
		||||
    return cb(socket);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function onError(cause) {
 | 
			
		||||
    connectReq.removeAllListeners();
 | 
			
		||||
 | 
			
		||||
    debug('tunneling socket could not be established, cause=%s\n',
 | 
			
		||||
          cause.message, cause.stack);
 | 
			
		||||
    var error = new Error('tunneling socket could not be established, ' +
 | 
			
		||||
                          'cause=' + cause.message);
 | 
			
		||||
    error.code = 'ECONNRESET';
 | 
			
		||||
    options.request.emit('error', error);
 | 
			
		||||
    self.removeSocket(placeholder);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
 | 
			
		||||
  var pos = this.sockets.indexOf(socket)
 | 
			
		||||
  if (pos === -1) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  this.sockets.splice(pos, 1);
 | 
			
		||||
 | 
			
		||||
  var pending = this.requests.shift();
 | 
			
		||||
  if (pending) {
 | 
			
		||||
    // If we have pending requests and a socket gets closed a new one
 | 
			
		||||
    // needs to be created to take over in the pool for the one that closed.
 | 
			
		||||
    this.createSocket(pending, function(socket) {
 | 
			
		||||
      pending.request.onSocket(socket);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function createSecureSocket(options, cb) {
 | 
			
		||||
  var self = this;
 | 
			
		||||
  TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
 | 
			
		||||
    var hostHeader = options.request.getHeader('host');
 | 
			
		||||
    var tlsOptions = mergeOptions({}, self.options, {
 | 
			
		||||
      socket: socket,
 | 
			
		||||
      servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // 0 is dummy port for v0.6
 | 
			
		||||
    var secureSocket = tls.connect(0, tlsOptions);
 | 
			
		||||
    self.sockets[self.sockets.indexOf(socket)] = secureSocket;
 | 
			
		||||
    cb(secureSocket);
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function toOptions(host, port, localAddress) {
 | 
			
		||||
  if (typeof host === 'string') { // since v0.10
 | 
			
		||||
    return {
 | 
			
		||||
      host: host,
 | 
			
		||||
      port: port,
 | 
			
		||||
      localAddress: localAddress
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
  return host; // for v0.11 or later
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function mergeOptions(target) {
 | 
			
		||||
  for (var i = 1, len = arguments.length; i < len; ++i) {
 | 
			
		||||
    var overrides = arguments[i];
 | 
			
		||||
    if (typeof overrides === 'object') {
 | 
			
		||||
      var keys = Object.keys(overrides);
 | 
			
		||||
      for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
 | 
			
		||||
        var k = keys[j];
 | 
			
		||||
        if (overrides[k] !== undefined) {
 | 
			
		||||
          target[k] = overrides[k];
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return target;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var debug;
 | 
			
		||||
if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
 | 
			
		||||
  debug = function() {
 | 
			
		||||
    var args = Array.prototype.slice.call(arguments);
 | 
			
		||||
    if (typeof args[0] === 'string') {
 | 
			
		||||
      args[0] = 'TUNNEL: ' + args[0];
 | 
			
		||||
    } else {
 | 
			
		||||
      args.unshift('TUNNEL:');
 | 
			
		||||
    }
 | 
			
		||||
    console.error.apply(console, args);
 | 
			
		||||
  }
 | 
			
		||||
} else {
 | 
			
		||||
  debug = function() {};
 | 
			
		||||
}
 | 
			
		||||
exports.debug = debug; // for test
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 163:
 | 
			
		||||
@ -1604,13 +1325,6 @@ async function customPackage(pkg, type, version, os_version) {
 | 
			
		||||
exports.customPackage = customPackage;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 211:
 | 
			
		||||
/***/ (function(module) {
 | 
			
		||||
 | 
			
		||||
module.exports = require("https");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 357:
 | 
			
		||||
@ -1618,14 +1332,6 @@ module.exports = require("https");
 | 
			
		||||
 | 
			
		||||
module.exports = require("assert");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 413:
 | 
			
		||||
/***/ (function(module, __unusedexports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
module.exports = __webpack_require__(141);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 431:
 | 
			
		||||
@ -1983,7 +1689,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.addTools = exports.addPackage = exports.addDevTools = exports.addArchive = exports.getCleanedToolsList = exports.getComposerUrl = exports.addComposer = exports.getWpCliUrl = exports.getSymfonyUri = exports.getDeployerUrl = exports.getPharUrl = exports.addPhive = exports.getCodeceptionUri = exports.getCodeceptionUriBuilder = exports.getUri = exports.parseTool = exports.getToolVersion = void 0;
 | 
			
		||||
const utils = __importStar(__webpack_require__(163));
 | 
			
		||||
const httpm = __importStar(__webpack_require__(539));
 | 
			
		||||
/**
 | 
			
		||||
 * Function to get tool version
 | 
			
		||||
 *
 | 
			
		||||
@ -2247,19 +1952,13 @@ async function getComposerUrl(version) {
 | 
			
		||||
    const cache_url = 'https://github.com/shivammathur/composer-cache/releases/latest/download/composer-' +
 | 
			
		||||
        version.replace('latest', 'stable') +
 | 
			
		||||
        '.phar,';
 | 
			
		||||
    const getComposerUrlHelper = async function (version) {
 | 
			
		||||
        const client = new httpm.HttpClient('setup-php');
 | 
			
		||||
        const response = await client.get('https://getcomposer.org/versions');
 | 
			
		||||
        const data = JSON.parse(await response.readBody());
 | 
			
		||||
        return cache_url + 'https://getcomposer.org' + data[version][0]['path'];
 | 
			
		||||
    };
 | 
			
		||||
    switch (version) {
 | 
			
		||||
        case 'snapshot':
 | 
			
		||||
            return cache_url + 'https://getcomposer.org/composer.phar';
 | 
			
		||||
        case 'preview':
 | 
			
		||||
        case '1':
 | 
			
		||||
        case '2':
 | 
			
		||||
            return await getComposerUrlHelper(version);
 | 
			
		||||
            return (cache_url + 'https://getcomposer.org/composer-' + version + '.phar');
 | 
			
		||||
        default:
 | 
			
		||||
            return cache_url + 'https://getcomposer.org/composer-stable.phar';
 | 
			
		||||
    }
 | 
			
		||||
@ -2474,552 +2173,6 @@ async function addTools(tools_csv, php_version, os_version) {
 | 
			
		||||
exports.addTools = addTools;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 539:
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
const url = __webpack_require__(835);
 | 
			
		||||
const http = __webpack_require__(605);
 | 
			
		||||
const https = __webpack_require__(211);
 | 
			
		||||
const pm = __webpack_require__(950);
 | 
			
		||||
let tunnel;
 | 
			
		||||
var HttpCodes;
 | 
			
		||||
(function (HttpCodes) {
 | 
			
		||||
    HttpCodes[HttpCodes["OK"] = 200] = "OK";
 | 
			
		||||
    HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices";
 | 
			
		||||
    HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently";
 | 
			
		||||
    HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved";
 | 
			
		||||
    HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther";
 | 
			
		||||
    HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified";
 | 
			
		||||
    HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy";
 | 
			
		||||
    HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy";
 | 
			
		||||
    HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect";
 | 
			
		||||
    HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect";
 | 
			
		||||
    HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest";
 | 
			
		||||
    HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized";
 | 
			
		||||
    HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired";
 | 
			
		||||
    HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden";
 | 
			
		||||
    HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound";
 | 
			
		||||
    HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed";
 | 
			
		||||
    HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable";
 | 
			
		||||
    HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
 | 
			
		||||
    HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";
 | 
			
		||||
    HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";
 | 
			
		||||
    HttpCodes[HttpCodes["Gone"] = 410] = "Gone";
 | 
			
		||||
    HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests";
 | 
			
		||||
    HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";
 | 
			
		||||
    HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";
 | 
			
		||||
    HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";
 | 
			
		||||
    HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable";
 | 
			
		||||
    HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout";
 | 
			
		||||
})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {}));
 | 
			
		||||
var Headers;
 | 
			
		||||
(function (Headers) {
 | 
			
		||||
    Headers["Accept"] = "accept";
 | 
			
		||||
    Headers["ContentType"] = "content-type";
 | 
			
		||||
})(Headers = exports.Headers || (exports.Headers = {}));
 | 
			
		||||
var MediaTypes;
 | 
			
		||||
(function (MediaTypes) {
 | 
			
		||||
    MediaTypes["ApplicationJson"] = "application/json";
 | 
			
		||||
})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {}));
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the proxy URL, depending upon the supplied url and proxy environment variables.
 | 
			
		||||
 * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | 
			
		||||
 */
 | 
			
		||||
function getProxyUrl(serverUrl) {
 | 
			
		||||
    let proxyUrl = pm.getProxyUrl(url.parse(serverUrl));
 | 
			
		||||
    return proxyUrl ? proxyUrl.href : '';
 | 
			
		||||
}
 | 
			
		||||
exports.getProxyUrl = getProxyUrl;
 | 
			
		||||
const HttpRedirectCodes = [
 | 
			
		||||
    HttpCodes.MovedPermanently,
 | 
			
		||||
    HttpCodes.ResourceMoved,
 | 
			
		||||
    HttpCodes.SeeOther,
 | 
			
		||||
    HttpCodes.TemporaryRedirect,
 | 
			
		||||
    HttpCodes.PermanentRedirect
 | 
			
		||||
];
 | 
			
		||||
const HttpResponseRetryCodes = [
 | 
			
		||||
    HttpCodes.BadGateway,
 | 
			
		||||
    HttpCodes.ServiceUnavailable,
 | 
			
		||||
    HttpCodes.GatewayTimeout
 | 
			
		||||
];
 | 
			
		||||
const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];
 | 
			
		||||
const ExponentialBackoffCeiling = 10;
 | 
			
		||||
const ExponentialBackoffTimeSlice = 5;
 | 
			
		||||
class HttpClientResponse {
 | 
			
		||||
    constructor(message) {
 | 
			
		||||
        this.message = message;
 | 
			
		||||
    }
 | 
			
		||||
    readBody() {
 | 
			
		||||
        return new Promise(async (resolve, reject) => {
 | 
			
		||||
            let output = Buffer.alloc(0);
 | 
			
		||||
            this.message.on('data', (chunk) => {
 | 
			
		||||
                output = Buffer.concat([output, chunk]);
 | 
			
		||||
            });
 | 
			
		||||
            this.message.on('end', () => {
 | 
			
		||||
                resolve(output.toString());
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.HttpClientResponse = HttpClientResponse;
 | 
			
		||||
function isHttps(requestUrl) {
 | 
			
		||||
    let parsedUrl = url.parse(requestUrl);
 | 
			
		||||
    return parsedUrl.protocol === 'https:';
 | 
			
		||||
}
 | 
			
		||||
exports.isHttps = isHttps;
 | 
			
		||||
class HttpClient {
 | 
			
		||||
    constructor(userAgent, handlers, requestOptions) {
 | 
			
		||||
        this._ignoreSslError = false;
 | 
			
		||||
        this._allowRedirects = true;
 | 
			
		||||
        this._allowRedirectDowngrade = false;
 | 
			
		||||
        this._maxRedirects = 50;
 | 
			
		||||
        this._allowRetries = false;
 | 
			
		||||
        this._maxRetries = 1;
 | 
			
		||||
        this._keepAlive = false;
 | 
			
		||||
        this._disposed = false;
 | 
			
		||||
        this.userAgent = userAgent;
 | 
			
		||||
        this.handlers = handlers || [];
 | 
			
		||||
        this.requestOptions = requestOptions;
 | 
			
		||||
        if (requestOptions) {
 | 
			
		||||
            if (requestOptions.ignoreSslError != null) {
 | 
			
		||||
                this._ignoreSslError = requestOptions.ignoreSslError;
 | 
			
		||||
            }
 | 
			
		||||
            this._socketTimeout = requestOptions.socketTimeout;
 | 
			
		||||
            if (requestOptions.allowRedirects != null) {
 | 
			
		||||
                this._allowRedirects = requestOptions.allowRedirects;
 | 
			
		||||
            }
 | 
			
		||||
            if (requestOptions.allowRedirectDowngrade != null) {
 | 
			
		||||
                this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;
 | 
			
		||||
            }
 | 
			
		||||
            if (requestOptions.maxRedirects != null) {
 | 
			
		||||
                this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);
 | 
			
		||||
            }
 | 
			
		||||
            if (requestOptions.keepAlive != null) {
 | 
			
		||||
                this._keepAlive = requestOptions.keepAlive;
 | 
			
		||||
            }
 | 
			
		||||
            if (requestOptions.allowRetries != null) {
 | 
			
		||||
                this._allowRetries = requestOptions.allowRetries;
 | 
			
		||||
            }
 | 
			
		||||
            if (requestOptions.maxRetries != null) {
 | 
			
		||||
                this._maxRetries = requestOptions.maxRetries;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    options(requestUrl, additionalHeaders) {
 | 
			
		||||
        return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});
 | 
			
		||||
    }
 | 
			
		||||
    get(requestUrl, additionalHeaders) {
 | 
			
		||||
        return this.request('GET', requestUrl, null, additionalHeaders || {});
 | 
			
		||||
    }
 | 
			
		||||
    del(requestUrl, additionalHeaders) {
 | 
			
		||||
        return this.request('DELETE', requestUrl, null, additionalHeaders || {});
 | 
			
		||||
    }
 | 
			
		||||
    post(requestUrl, data, additionalHeaders) {
 | 
			
		||||
        return this.request('POST', requestUrl, data, additionalHeaders || {});
 | 
			
		||||
    }
 | 
			
		||||
    patch(requestUrl, data, additionalHeaders) {
 | 
			
		||||
        return this.request('PATCH', requestUrl, data, additionalHeaders || {});
 | 
			
		||||
    }
 | 
			
		||||
    put(requestUrl, data, additionalHeaders) {
 | 
			
		||||
        return this.request('PUT', requestUrl, data, additionalHeaders || {});
 | 
			
		||||
    }
 | 
			
		||||
    head(requestUrl, additionalHeaders) {
 | 
			
		||||
        return this.request('HEAD', requestUrl, null, additionalHeaders || {});
 | 
			
		||||
    }
 | 
			
		||||
    sendStream(verb, requestUrl, stream, additionalHeaders) {
 | 
			
		||||
        return this.request(verb, requestUrl, stream, additionalHeaders);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a typed object from an endpoint
 | 
			
		||||
     * Be aware that not found returns a null.  Other errors (4xx, 5xx) reject the promise
 | 
			
		||||
     */
 | 
			
		||||
    async getJson(requestUrl, additionalHeaders = {}) {
 | 
			
		||||
        additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
 | 
			
		||||
        let res = await this.get(requestUrl, additionalHeaders);
 | 
			
		||||
        return this._processResponse(res, this.requestOptions);
 | 
			
		||||
    }
 | 
			
		||||
    async postJson(requestUrl, obj, additionalHeaders = {}) {
 | 
			
		||||
        let data = JSON.stringify(obj, null, 2);
 | 
			
		||||
        additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
 | 
			
		||||
        additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
 | 
			
		||||
        let res = await this.post(requestUrl, data, additionalHeaders);
 | 
			
		||||
        return this._processResponse(res, this.requestOptions);
 | 
			
		||||
    }
 | 
			
		||||
    async putJson(requestUrl, obj, additionalHeaders = {}) {
 | 
			
		||||
        let data = JSON.stringify(obj, null, 2);
 | 
			
		||||
        additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
 | 
			
		||||
        additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
 | 
			
		||||
        let res = await this.put(requestUrl, data, additionalHeaders);
 | 
			
		||||
        return this._processResponse(res, this.requestOptions);
 | 
			
		||||
    }
 | 
			
		||||
    async patchJson(requestUrl, obj, additionalHeaders = {}) {
 | 
			
		||||
        let data = JSON.stringify(obj, null, 2);
 | 
			
		||||
        additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
 | 
			
		||||
        additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
 | 
			
		||||
        let res = await this.patch(requestUrl, data, additionalHeaders);
 | 
			
		||||
        return this._processResponse(res, this.requestOptions);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Makes a raw http request.
 | 
			
		||||
     * All other methods such as get, post, patch, and request ultimately call this.
 | 
			
		||||
     * Prefer get, del, post and patch
 | 
			
		||||
     */
 | 
			
		||||
    async request(verb, requestUrl, data, headers) {
 | 
			
		||||
        if (this._disposed) {
 | 
			
		||||
            throw new Error('Client has already been disposed.');
 | 
			
		||||
        }
 | 
			
		||||
        let parsedUrl = url.parse(requestUrl);
 | 
			
		||||
        let info = this._prepareRequest(verb, parsedUrl, headers);
 | 
			
		||||
        // Only perform retries on reads since writes may not be idempotent.
 | 
			
		||||
        let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1
 | 
			
		||||
            ? this._maxRetries + 1
 | 
			
		||||
            : 1;
 | 
			
		||||
        let numTries = 0;
 | 
			
		||||
        let response;
 | 
			
		||||
        while (numTries < maxTries) {
 | 
			
		||||
            response = await this.requestRaw(info, data);
 | 
			
		||||
            // Check if it's an authentication challenge
 | 
			
		||||
            if (response &&
 | 
			
		||||
                response.message &&
 | 
			
		||||
                response.message.statusCode === HttpCodes.Unauthorized) {
 | 
			
		||||
                let authenticationHandler;
 | 
			
		||||
                for (let i = 0; i < this.handlers.length; i++) {
 | 
			
		||||
                    if (this.handlers[i].canHandleAuthentication(response)) {
 | 
			
		||||
                        authenticationHandler = this.handlers[i];
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (authenticationHandler) {
 | 
			
		||||
                    return authenticationHandler.handleAuthentication(this, info, data);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    // We have received an unauthorized response but have no handlers to handle it.
 | 
			
		||||
                    // Let the response return to the caller.
 | 
			
		||||
                    return response;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            let redirectsRemaining = this._maxRedirects;
 | 
			
		||||
            while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 &&
 | 
			
		||||
                this._allowRedirects &&
 | 
			
		||||
                redirectsRemaining > 0) {
 | 
			
		||||
                const redirectUrl = response.message.headers['location'];
 | 
			
		||||
                if (!redirectUrl) {
 | 
			
		||||
                    // if there's no location to redirect to, we won't
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                let parsedRedirectUrl = url.parse(redirectUrl);
 | 
			
		||||
                if (parsedUrl.protocol == 'https:' &&
 | 
			
		||||
                    parsedUrl.protocol != parsedRedirectUrl.protocol &&
 | 
			
		||||
                    !this._allowRedirectDowngrade) {
 | 
			
		||||
                    throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.');
 | 
			
		||||
                }
 | 
			
		||||
                // we need to finish reading the response before reassigning response
 | 
			
		||||
                // which will leak the open socket.
 | 
			
		||||
                await response.readBody();
 | 
			
		||||
                // strip authorization header if redirected to a different hostname
 | 
			
		||||
                if (parsedRedirectUrl.hostname !== parsedUrl.hostname) {
 | 
			
		||||
                    for (let header in headers) {
 | 
			
		||||
                        // header names are case insensitive
 | 
			
		||||
                        if (header.toLowerCase() === 'authorization') {
 | 
			
		||||
                            delete headers[header];
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                // let's make the request with the new redirectUrl
 | 
			
		||||
                info = this._prepareRequest(verb, parsedRedirectUrl, headers);
 | 
			
		||||
                response = await this.requestRaw(info, data);
 | 
			
		||||
                redirectsRemaining--;
 | 
			
		||||
            }
 | 
			
		||||
            if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) {
 | 
			
		||||
                // If not a retry code, return immediately instead of retrying
 | 
			
		||||
                return response;
 | 
			
		||||
            }
 | 
			
		||||
            numTries += 1;
 | 
			
		||||
            if (numTries < maxTries) {
 | 
			
		||||
                await response.readBody();
 | 
			
		||||
                await this._performExponentialBackoff(numTries);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return response;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Needs to be called if keepAlive is set to true in request options.
 | 
			
		||||
     */
 | 
			
		||||
    dispose() {
 | 
			
		||||
        if (this._agent) {
 | 
			
		||||
            this._agent.destroy();
 | 
			
		||||
        }
 | 
			
		||||
        this._disposed = true;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Raw request.
 | 
			
		||||
     * @param info
 | 
			
		||||
     * @param data
 | 
			
		||||
     */
 | 
			
		||||
    requestRaw(info, data) {
 | 
			
		||||
        return new Promise((resolve, reject) => {
 | 
			
		||||
            let callbackForResult = function (err, res) {
 | 
			
		||||
                if (err) {
 | 
			
		||||
                    reject(err);
 | 
			
		||||
                }
 | 
			
		||||
                resolve(res);
 | 
			
		||||
            };
 | 
			
		||||
            this.requestRawWithCallback(info, data, callbackForResult);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Raw request with callback.
 | 
			
		||||
     * @param info
 | 
			
		||||
     * @param data
 | 
			
		||||
     * @param onResult
 | 
			
		||||
     */
 | 
			
		||||
    requestRawWithCallback(info, data, onResult) {
 | 
			
		||||
        let socket;
 | 
			
		||||
        if (typeof data === 'string') {
 | 
			
		||||
            info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');
 | 
			
		||||
        }
 | 
			
		||||
        let callbackCalled = false;
 | 
			
		||||
        let handleResult = (err, res) => {
 | 
			
		||||
            if (!callbackCalled) {
 | 
			
		||||
                callbackCalled = true;
 | 
			
		||||
                onResult(err, res);
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        let req = info.httpModule.request(info.options, (msg) => {
 | 
			
		||||
            let res = new HttpClientResponse(msg);
 | 
			
		||||
            handleResult(null, res);
 | 
			
		||||
        });
 | 
			
		||||
        req.on('socket', sock => {
 | 
			
		||||
            socket = sock;
 | 
			
		||||
        });
 | 
			
		||||
        // If we ever get disconnected, we want the socket to timeout eventually
 | 
			
		||||
        req.setTimeout(this._socketTimeout || 3 * 60000, () => {
 | 
			
		||||
            if (socket) {
 | 
			
		||||
                socket.end();
 | 
			
		||||
            }
 | 
			
		||||
            handleResult(new Error('Request timeout: ' + info.options.path), null);
 | 
			
		||||
        });
 | 
			
		||||
        req.on('error', function (err) {
 | 
			
		||||
            // err has statusCode property
 | 
			
		||||
            // res should have headers
 | 
			
		||||
            handleResult(err, null);
 | 
			
		||||
        });
 | 
			
		||||
        if (data && typeof data === 'string') {
 | 
			
		||||
            req.write(data, 'utf8');
 | 
			
		||||
        }
 | 
			
		||||
        if (data && typeof data !== 'string') {
 | 
			
		||||
            data.on('close', function () {
 | 
			
		||||
                req.end();
 | 
			
		||||
            });
 | 
			
		||||
            data.pipe(req);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            req.end();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets an http agent. This function is useful when you need an http agent that handles
 | 
			
		||||
     * routing through a proxy server - depending upon the url and proxy environment variables.
 | 
			
		||||
     * @param serverUrl  The server URL where the request will be sent. For example, https://api.github.com
 | 
			
		||||
     */
 | 
			
		||||
    getAgent(serverUrl) {
 | 
			
		||||
        let parsedUrl = url.parse(serverUrl);
 | 
			
		||||
        return this._getAgent(parsedUrl);
 | 
			
		||||
    }
 | 
			
		||||
    _prepareRequest(method, requestUrl, headers) {
 | 
			
		||||
        const info = {};
 | 
			
		||||
        info.parsedUrl = requestUrl;
 | 
			
		||||
        const usingSsl = info.parsedUrl.protocol === 'https:';
 | 
			
		||||
        info.httpModule = usingSsl ? https : http;
 | 
			
		||||
        const defaultPort = usingSsl ? 443 : 80;
 | 
			
		||||
        info.options = {};
 | 
			
		||||
        info.options.host = info.parsedUrl.hostname;
 | 
			
		||||
        info.options.port = info.parsedUrl.port
 | 
			
		||||
            ? parseInt(info.parsedUrl.port)
 | 
			
		||||
            : defaultPort;
 | 
			
		||||
        info.options.path =
 | 
			
		||||
            (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');
 | 
			
		||||
        info.options.method = method;
 | 
			
		||||
        info.options.headers = this._mergeHeaders(headers);
 | 
			
		||||
        if (this.userAgent != null) {
 | 
			
		||||
            info.options.headers['user-agent'] = this.userAgent;
 | 
			
		||||
        }
 | 
			
		||||
        info.options.agent = this._getAgent(info.parsedUrl);
 | 
			
		||||
        // gives handlers an opportunity to participate
 | 
			
		||||
        if (this.handlers) {
 | 
			
		||||
            this.handlers.forEach(handler => {
 | 
			
		||||
                handler.prepareRequest(info.options);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        return info;
 | 
			
		||||
    }
 | 
			
		||||
    _mergeHeaders(headers) {
 | 
			
		||||
        const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});
 | 
			
		||||
        if (this.requestOptions && this.requestOptions.headers) {
 | 
			
		||||
            return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers));
 | 
			
		||||
        }
 | 
			
		||||
        return lowercaseKeys(headers || {});
 | 
			
		||||
    }
 | 
			
		||||
    _getExistingOrDefaultHeader(additionalHeaders, header, _default) {
 | 
			
		||||
        const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {});
 | 
			
		||||
        let clientHeader;
 | 
			
		||||
        if (this.requestOptions && this.requestOptions.headers) {
 | 
			
		||||
            clientHeader = lowercaseKeys(this.requestOptions.headers)[header];
 | 
			
		||||
        }
 | 
			
		||||
        return additionalHeaders[header] || clientHeader || _default;
 | 
			
		||||
    }
 | 
			
		||||
    _getAgent(parsedUrl) {
 | 
			
		||||
        let agent;
 | 
			
		||||
        let proxyUrl = pm.getProxyUrl(parsedUrl);
 | 
			
		||||
        let useProxy = proxyUrl && proxyUrl.hostname;
 | 
			
		||||
        if (this._keepAlive && useProxy) {
 | 
			
		||||
            agent = this._proxyAgent;
 | 
			
		||||
        }
 | 
			
		||||
        if (this._keepAlive && !useProxy) {
 | 
			
		||||
            agent = this._agent;
 | 
			
		||||
        }
 | 
			
		||||
        // if agent is already assigned use that agent.
 | 
			
		||||
        if (!!agent) {
 | 
			
		||||
            return agent;
 | 
			
		||||
        }
 | 
			
		||||
        const usingSsl = parsedUrl.protocol === 'https:';
 | 
			
		||||
        let maxSockets = 100;
 | 
			
		||||
        if (!!this.requestOptions) {
 | 
			
		||||
            maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;
 | 
			
		||||
        }
 | 
			
		||||
        if (useProxy) {
 | 
			
		||||
            // If using proxy, need tunnel
 | 
			
		||||
            if (!tunnel) {
 | 
			
		||||
                tunnel = __webpack_require__(413);
 | 
			
		||||
            }
 | 
			
		||||
            const agentOptions = {
 | 
			
		||||
                maxSockets: maxSockets,
 | 
			
		||||
                keepAlive: this._keepAlive,
 | 
			
		||||
                proxy: {
 | 
			
		||||
                    proxyAuth: proxyUrl.auth,
 | 
			
		||||
                    host: proxyUrl.hostname,
 | 
			
		||||
                    port: proxyUrl.port
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            let tunnelAgent;
 | 
			
		||||
            const overHttps = proxyUrl.protocol === 'https:';
 | 
			
		||||
            if (usingSsl) {
 | 
			
		||||
                tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;
 | 
			
		||||
            }
 | 
			
		||||
            agent = tunnelAgent(agentOptions);
 | 
			
		||||
            this._proxyAgent = agent;
 | 
			
		||||
        }
 | 
			
		||||
        // if reusing agent across request and tunneling agent isn't assigned create a new agent
 | 
			
		||||
        if (this._keepAlive && !agent) {
 | 
			
		||||
            const options = { keepAlive: this._keepAlive, maxSockets: maxSockets };
 | 
			
		||||
            agent = usingSsl ? new https.Agent(options) : new http.Agent(options);
 | 
			
		||||
            this._agent = agent;
 | 
			
		||||
        }
 | 
			
		||||
        // if not using private agent and tunnel agent isn't setup then use global agent
 | 
			
		||||
        if (!agent) {
 | 
			
		||||
            agent = usingSsl ? https.globalAgent : http.globalAgent;
 | 
			
		||||
        }
 | 
			
		||||
        if (usingSsl && this._ignoreSslError) {
 | 
			
		||||
            // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
 | 
			
		||||
            // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
 | 
			
		||||
            // we have to cast it to any and change it directly
 | 
			
		||||
            agent.options = Object.assign(agent.options || {}, {
 | 
			
		||||
                rejectUnauthorized: false
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        return agent;
 | 
			
		||||
    }
 | 
			
		||||
    _performExponentialBackoff(retryNumber) {
 | 
			
		||||
        retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);
 | 
			
		||||
        const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);
 | 
			
		||||
        return new Promise(resolve => setTimeout(() => resolve(), ms));
 | 
			
		||||
    }
 | 
			
		||||
    static dateTimeDeserializer(key, value) {
 | 
			
		||||
        if (typeof value === 'string') {
 | 
			
		||||
            let a = new Date(value);
 | 
			
		||||
            if (!isNaN(a.valueOf())) {
 | 
			
		||||
                return a;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    async _processResponse(res, options) {
 | 
			
		||||
        return new Promise(async (resolve, reject) => {
 | 
			
		||||
            const statusCode = res.message.statusCode;
 | 
			
		||||
            const response = {
 | 
			
		||||
                statusCode: statusCode,
 | 
			
		||||
                result: null,
 | 
			
		||||
                headers: {}
 | 
			
		||||
            };
 | 
			
		||||
            // not found leads to null obj returned
 | 
			
		||||
            if (statusCode == HttpCodes.NotFound) {
 | 
			
		||||
                resolve(response);
 | 
			
		||||
            }
 | 
			
		||||
            let obj;
 | 
			
		||||
            let contents;
 | 
			
		||||
            // get the result from the body
 | 
			
		||||
            try {
 | 
			
		||||
                contents = await res.readBody();
 | 
			
		||||
                if (contents && contents.length > 0) {
 | 
			
		||||
                    if (options && options.deserializeDates) {
 | 
			
		||||
                        obj = JSON.parse(contents, HttpClient.dateTimeDeserializer);
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        obj = JSON.parse(contents);
 | 
			
		||||
                    }
 | 
			
		||||
                    response.result = obj;
 | 
			
		||||
                }
 | 
			
		||||
                response.headers = res.message.headers;
 | 
			
		||||
            }
 | 
			
		||||
            catch (err) {
 | 
			
		||||
                // Invalid resource (contents not json);  leaving result obj null
 | 
			
		||||
            }
 | 
			
		||||
            // note that 3xx redirects are handled by the http layer.
 | 
			
		||||
            if (statusCode > 299) {
 | 
			
		||||
                let msg;
 | 
			
		||||
                // if exception/error in body, attempt to get better error
 | 
			
		||||
                if (obj && obj.message) {
 | 
			
		||||
                    msg = obj.message;
 | 
			
		||||
                }
 | 
			
		||||
                else if (contents && contents.length > 0) {
 | 
			
		||||
                    // it may be the case that the exception is in the body message as string
 | 
			
		||||
                    msg = contents;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    msg = 'Failed request: (' + statusCode + ')';
 | 
			
		||||
                }
 | 
			
		||||
                let err = new Error(msg);
 | 
			
		||||
                // attach statusCode and body obj (if available) to the error object
 | 
			
		||||
                err['statusCode'] = statusCode;
 | 
			
		||||
                if (response.result) {
 | 
			
		||||
                    err['result'] = response.result;
 | 
			
		||||
                }
 | 
			
		||||
                reject(err);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                resolve(response);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.HttpClient = HttpClient;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 605:
 | 
			
		||||
/***/ (function(module) {
 | 
			
		||||
 | 
			
		||||
module.exports = require("http");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 614:
 | 
			
		||||
@ -3036,13 +2189,6 @@ module.exports = require("path");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 631:
 | 
			
		||||
/***/ (function(module) {
 | 
			
		||||
 | 
			
		||||
module.exports = require("net");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 635:
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
@ -3597,13 +2743,6 @@ module.exports = require("fs");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 835:
 | 
			
		||||
/***/ (function(module) {
 | 
			
		||||
 | 
			
		||||
module.exports = require("url");
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 911:
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
@ -3895,72 +3034,6 @@ async function addExtension(extension_csv, version, os_version, no_step = false)
 | 
			
		||||
exports.addExtension = addExtension;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 950:
 | 
			
		||||
/***/ (function(__unusedmodule, exports, __webpack_require__) {
 | 
			
		||||
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
const url = __webpack_require__(835);
 | 
			
		||||
function getProxyUrl(reqUrl) {
 | 
			
		||||
    let usingSsl = reqUrl.protocol === 'https:';
 | 
			
		||||
    let proxyUrl;
 | 
			
		||||
    if (checkBypass(reqUrl)) {
 | 
			
		||||
        return proxyUrl;
 | 
			
		||||
    }
 | 
			
		||||
    let proxyVar;
 | 
			
		||||
    if (usingSsl) {
 | 
			
		||||
        proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY'];
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY'];
 | 
			
		||||
    }
 | 
			
		||||
    if (proxyVar) {
 | 
			
		||||
        proxyUrl = url.parse(proxyVar);
 | 
			
		||||
    }
 | 
			
		||||
    return proxyUrl;
 | 
			
		||||
}
 | 
			
		||||
exports.getProxyUrl = getProxyUrl;
 | 
			
		||||
function checkBypass(reqUrl) {
 | 
			
		||||
    if (!reqUrl.hostname) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || '';
 | 
			
		||||
    if (!noProxy) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    // Determine the request port
 | 
			
		||||
    let reqPort;
 | 
			
		||||
    if (reqUrl.port) {
 | 
			
		||||
        reqPort = Number(reqUrl.port);
 | 
			
		||||
    }
 | 
			
		||||
    else if (reqUrl.protocol === 'http:') {
 | 
			
		||||
        reqPort = 80;
 | 
			
		||||
    }
 | 
			
		||||
    else if (reqUrl.protocol === 'https:') {
 | 
			
		||||
        reqPort = 443;
 | 
			
		||||
    }
 | 
			
		||||
    // Format the request hostname and hostname with port
 | 
			
		||||
    let upperReqHosts = [reqUrl.hostname.toUpperCase()];
 | 
			
		||||
    if (typeof reqPort === 'number') {
 | 
			
		||||
        upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);
 | 
			
		||||
    }
 | 
			
		||||
    // Compare request host against noproxy
 | 
			
		||||
    for (let upperNoProxyItem of noProxy
 | 
			
		||||
        .split(',')
 | 
			
		||||
        .map(x => x.trim().toUpperCase())
 | 
			
		||||
        .filter(x => x)) {
 | 
			
		||||
        if (upperReqHosts.some(x => x === upperNoProxyItem)) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
exports.checkBypass = checkBypass;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***/ }),
 | 
			
		||||
 | 
			
		||||
/***/ 986:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1359
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1359
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										19
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								package.json
									
									
									
									
									
								
							@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "setup-php",
 | 
			
		||||
  "version": "2.4.2",
 | 
			
		||||
  "version": "2.4.3",
 | 
			
		||||
  "private": false,
 | 
			
		||||
  "description": "Setup PHP for use with GitHub Actions",
 | 
			
		||||
  "main": "dist/index.js",
 | 
			
		||||
@ -26,26 +26,25 @@
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@actions/core": "^1.2.4",
 | 
			
		||||
    "@actions/exec": "^1.0.4",
 | 
			
		||||
    "@actions/http-client": "^1.0.8",
 | 
			
		||||
    "@actions/io": "^1.0.2",
 | 
			
		||||
    "fs": "0.0.1-security"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/jest": "^26.0.9",
 | 
			
		||||
    "@types/node": "^14.0.27",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^3.8.0",
 | 
			
		||||
    "@typescript-eslint/parser": "^3.8.0",
 | 
			
		||||
    "@types/jest": "^26.0.10",
 | 
			
		||||
    "@types/node": "^14.6.0",
 | 
			
		||||
    "@typescript-eslint/eslint-plugin": "^3.9.1",
 | 
			
		||||
    "@typescript-eslint/parser": "^3.9.1",
 | 
			
		||||
    "@zeit/ncc": "^0.22.3",
 | 
			
		||||
    "eslint": "^7.6.0",
 | 
			
		||||
    "eslint": "^7.7.0",
 | 
			
		||||
    "eslint-config-prettier": "^6.11.0",
 | 
			
		||||
    "eslint-plugin-import": "^2.22.0",
 | 
			
		||||
    "eslint-plugin-jest": "^23.20.0",
 | 
			
		||||
    "eslint-plugin-prettier": "^3.1.4",
 | 
			
		||||
    "husky": "^4.2.5",
 | 
			
		||||
    "jest": "^26.2.2",
 | 
			
		||||
    "jest-circus": "^26.2.2",
 | 
			
		||||
    "jest": "^26.4.0",
 | 
			
		||||
    "jest-circus": "^26.4.0",
 | 
			
		||||
    "prettier": "^2.0.5",
 | 
			
		||||
    "ts-jest": "^26.1.4",
 | 
			
		||||
    "ts-jest": "^26.2.0",
 | 
			
		||||
    "typescript": "^3.9.7"
 | 
			
		||||
  },
 | 
			
		||||
  "husky": {
 | 
			
		||||
 | 
			
		||||
@ -166,13 +166,12 @@ add_tool() {
 | 
			
		||||
  if [ ! -e "$tool_path" ]; then
 | 
			
		||||
    rm -rf "$tool_path"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  if [ "$tool" = "composer" ]; then
 | 
			
		||||
    IFS="," read -r -a urls <<< "$url"
 | 
			
		||||
    status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
 | 
			
		||||
    status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
 | 
			
		||||
    status_code=$(sudo curl -f -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
 | 
			
		||||
    status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
 | 
			
		||||
  else
 | 
			
		||||
    status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
 | 
			
		||||
    status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
 | 
			
		||||
  fi
 | 
			
		||||
  if [ "$status_code" = "200" ]; then
 | 
			
		||||
    sudo chmod a+x "$tool_path"
 | 
			
		||||
 | 
			
		||||
@ -124,6 +124,7 @@ delete_extension() {
 | 
			
		||||
  sudo sed -i "/$extension/d" "$pecl_file"
 | 
			
		||||
  sudo rm -rf "$scan_dir"/*"$extension"* >/dev/null 2>&1
 | 
			
		||||
  sudo rm -rf "$ext_dir"/"$extension".so >/dev/null 2>&1
 | 
			
		||||
  [ "$runner" = "self-hosted" ] && $apt_remove "php-$extension"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Function to disable and delete extensions.
 | 
			
		||||
@ -263,10 +264,10 @@ add_tool() {
 | 
			
		||||
  fi
 | 
			
		||||
  if [ "$tool" = "composer" ]; then
 | 
			
		||||
    IFS="," read -r -a urls <<< "$url"
 | 
			
		||||
    status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
 | 
			
		||||
    status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
 | 
			
		||||
    status_code=$(sudo curl -f -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[0]}") ||
 | 
			
		||||
    status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "${urls[1]}")
 | 
			
		||||
  else
 | 
			
		||||
    status_code=$(sudo curl -s -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
 | 
			
		||||
    status_code=$(sudo curl -w "%{http_code}" -o "$tool_path" "${curl_opts[@]}" "$url")
 | 
			
		||||
  fi
 | 
			
		||||
  if [ "$status_code" = "200" ]; then
 | 
			
		||||
    sudo chmod a+x "$tool_path"
 | 
			
		||||
@ -397,6 +398,7 @@ old_versions="5.[3-5]"
 | 
			
		||||
debconf_fix="DEBIAN_FRONTEND=noninteractive"
 | 
			
		||||
github="https://github.com/shivammathur"
 | 
			
		||||
apt_install="sudo $debconf_fix apt-fast install -y"
 | 
			
		||||
apt_remove="sudo $debconf_fix apt-fast remove -y"
 | 
			
		||||
tool_path_dir="/usr/local/bin"
 | 
			
		||||
curl_opts=(-sL)
 | 
			
		||||
existing_version=$(php-config --version 2>/dev/null | cut -c 1-3)
 | 
			
		||||
@ -444,5 +446,6 @@ scan_dir=$(php --ini | grep additional | sed -e "s|.*: s*||")
 | 
			
		||||
ini_file=$(php --ini | grep "Loaded Configuration" | sed -e "s|.*:s*||" | sed "s/ //g")
 | 
			
		||||
pecl_file="$scan_dir"/99-pecl.ini
 | 
			
		||||
echo '' | sudo tee "$pecl_file" >/dev/null 2>&1
 | 
			
		||||
sudo rm -rf /usr/local/bin/phpunit >/dev/null 2>&1
 | 
			
		||||
sudo chmod 777 "$ini_file" "$pecl_file" "$tool_path_dir"
 | 
			
		||||
add_log "$tick" "PHP" "$status PHP $semver"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										14
									
								
								src/tools.ts
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/tools.ts
									
									
									
									
									
								
							@ -1,6 +1,4 @@
 | 
			
		||||
import * as utils from './utils';
 | 
			
		||||
import * as httpm from '@actions/http-client';
 | 
			
		||||
import {IHttpClientResponse as hcr} from '@actions/http-client/interfaces';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function to get tool version
 | 
			
		||||
@ -307,21 +305,15 @@ export async function getComposerUrl(version: string): Promise<string> {
 | 
			
		||||
    'https://github.com/shivammathur/composer-cache/releases/latest/download/composer-' +
 | 
			
		||||
    version.replace('latest', 'stable') +
 | 
			
		||||
    '.phar,';
 | 
			
		||||
  const getComposerUrlHelper = async function (
 | 
			
		||||
    version: string
 | 
			
		||||
  ): Promise<string> {
 | 
			
		||||
    const client: httpm.HttpClient = new httpm.HttpClient('setup-php');
 | 
			
		||||
    const response: hcr = await client.get('https://getcomposer.org/versions');
 | 
			
		||||
    const data = JSON.parse(await response.readBody());
 | 
			
		||||
    return cache_url + 'https://getcomposer.org' + data[version][0]['path'];
 | 
			
		||||
  };
 | 
			
		||||
  switch (version) {
 | 
			
		||||
    case 'snapshot':
 | 
			
		||||
      return cache_url + 'https://getcomposer.org/composer.phar';
 | 
			
		||||
    case 'preview':
 | 
			
		||||
    case '1':
 | 
			
		||||
    case '2':
 | 
			
		||||
      return await getComposerUrlHelper(version);
 | 
			
		||||
      return (
 | 
			
		||||
        cache_url + 'https://getcomposer.org/composer-' + version + '.phar'
 | 
			
		||||
      );
 | 
			
		||||
    default:
 | 
			
		||||
      return cache_url + 'https://getcomposer.org/composer-stable.phar';
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user