setup-php 1.11.2 → 1.11.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +433 -458
  3. package/lib/config.d.ts +3 -0
  4. package/lib/config.js +71 -71
  5. package/lib/config.js.map +1 -1
  6. package/lib/coverage.d.ts +4 -0
  7. package/lib/coverage.js +97 -87
  8. package/lib/coverage.js.map +1 -1
  9. package/lib/extensions.d.ts +4 -0
  10. package/lib/extensions.js +188 -200
  11. package/lib/extensions.js.map +1 -1
  12. package/lib/install.d.ts +2 -0
  13. package/lib/install.js +96 -81
  14. package/lib/install.js.map +1 -1
  15. package/lib/tools.d.ts +18 -0
  16. package/lib/tools.js +306 -386
  17. package/lib/tools.js.map +1 -1
  18. package/lib/utils.d.ts +15 -0
  19. package/lib/utils.js +205 -291
  20. package/lib/utils.js.map +1 -1
  21. package/package.json +66 -56
  22. package/src/config.ts +82 -82
  23. package/src/configs/brew_extensions +28 -0
  24. package/src/configs/php-versions.json +5 -5
  25. package/src/configs/phpunit.json +24 -24
  26. package/src/coverage.ts +146 -146
  27. package/src/extensions.ts +235 -233
  28. package/src/install.ts +104 -104
  29. package/src/scripts/darwin.sh +341 -339
  30. package/src/scripts/ext/gearman.sh +22 -22
  31. package/src/scripts/ext/phalcon.ps1 +55 -55
  32. package/src/scripts/ext/phalcon.sh +70 -70
  33. package/src/scripts/linux.sh +361 -361
  34. package/src/scripts/win32.ps1 +326 -333
  35. package/src/tools.ts +472 -469
  36. package/src/utils.ts +319 -316
  37. package/.eslintrc.json +0 -16
  38. package/.github/CODE_OF_CONDUCT.md +0 -76
  39. package/.github/CONTRIBUTING.md +0 -69
  40. package/.github/FUNDING.yml +0 -7
  41. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -23
  42. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  43. package/.github/PULL_REQUEST_TEMPLATE.md +0 -38
  44. package/.github/SECURITY.md +0 -29
  45. package/.github/workflows/main-workflow.yml +0 -56
  46. package/.github/workflows/node-workflow.yml +0 -47
  47. package/.idea/workspace.xml +0 -113
  48. package/.prettierrc.json +0 -12
  49. package/__tests__/config.test.ts +0 -52
  50. package/__tests__/coverage.test.ts +0 -110
  51. package/__tests__/extensions.test.ts +0 -120
  52. package/__tests__/install.test.ts +0 -181
  53. package/__tests__/tools.test.ts +0 -476
  54. package/__tests__/utils.test.ts +0 -213
  55. package/action.yml +0 -38
  56. package/dist/index.js +0 -2854
  57. package/examples/bedrock.yml +0 -32
  58. package/examples/cakephp-mysql.yml +0 -114
  59. package/examples/cakephp-postgres.yml +0 -112
  60. package/examples/cakephp.yml +0 -92
  61. package/examples/codeigniter.yml +0 -34
  62. package/examples/laravel-mysql.yml +0 -74
  63. package/examples/laravel-postgres.yml +0 -74
  64. package/examples/laravel.yml +0 -42
  65. package/examples/lumen-mysql.yml +0 -74
  66. package/examples/lumen-postgres.yml +0 -74
  67. package/examples/lumen.yml +0 -38
  68. package/examples/phalcon-mysql.yml +0 -74
  69. package/examples/phalcon-postgres.yml +0 -73
  70. package/examples/sage.yml +0 -57
  71. package/examples/slim-framework.yml +0 -34
  72. package/examples/symfony-mysql.yml +0 -56
  73. package/examples/symfony-postgres.yml +0 -54
  74. package/examples/symfony.yml +0 -39
  75. package/examples/yii2-mysql.yml +0 -73
  76. package/examples/yii2-postgres.yml +0 -71
  77. package/examples/zend-framework.yml +0 -36
  78. package/jest.config.js +0 -12
  79. package/lib/sapi.js +0 -64
  80. package/tsconfig.json +0 -18
package/src/tools.ts CHANGED
@@ -1,469 +1,472 @@
1
- import * as utils from './utils';
2
-
3
- /**
4
- * Function to get command to setup tools
5
- *
6
- * @param os_version
7
- * @param suffix
8
- */
9
- export async function getCommand(
10
- os_version: string,
11
- suffix: string
12
- ): Promise<string> {
13
- switch (os_version) {
14
- case 'linux':
15
- case 'darwin':
16
- return 'add_' + suffix + ' ';
17
- case 'win32':
18
- return 'Add-' + suffix.charAt(0).toUpperCase() + suffix.slice(1) + ' ';
19
- default:
20
- return await utils.log(
21
- 'Platform ' + os_version + ' is not supported',
22
- os_version,
23
- 'error'
24
- );
25
- }
26
- }
27
-
28
- /**
29
- * Function to get tool version
30
- *
31
- * @param version
32
- */
33
- export async function getToolVersion(version: string): Promise<string> {
34
- // semver_regex - https://semver.org/
35
- const semver_regex =
36
- /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
37
- const composer_regex = /^stable$|^preview$|^snapshot$|^[1|2]$/;
38
- version = version.replace(/[><=^]*/, '').replace(/^v(\d)/, '$1');
39
- switch (true) {
40
- case composer_regex.test(version):
41
- case semver_regex.test(version):
42
- return version;
43
- default:
44
- return 'latest';
45
- }
46
- }
47
-
48
- /**
49
- * Function to parse tool:version
50
- *
51
- * @param release
52
- */
53
- export async function parseTool(
54
- release: string
55
- ): Promise<{name: string; version: string}> {
56
- const parts: string[] = release.split(':');
57
- const tool: string = parts[0];
58
- const version: string | undefined = parts[1];
59
- switch (version) {
60
- case undefined:
61
- return {
62
- name: tool,
63
- version: 'latest'
64
- };
65
- default:
66
- return {
67
- name: tool,
68
- version: await getToolVersion(parts[1])
69
- };
70
- }
71
- }
72
-
73
- /**
74
- * Function to get the url of tool with the given version
75
- *
76
- * @param tool
77
- * @param extension
78
- * @param version
79
- * @param prefix
80
- * @param version_prefix
81
- * @param verb
82
- */
83
- export async function getUri(
84
- tool: string,
85
- extension: string,
86
- version: string,
87
- prefix: string,
88
- version_prefix: string,
89
- verb: string
90
- ): Promise<string> {
91
- switch (version) {
92
- case 'latest':
93
- return [prefix, version, verb, tool + extension]
94
- .filter(Boolean)
95
- .join('/');
96
- default:
97
- return [prefix, verb, version_prefix + version, tool + extension]
98
- .filter(Boolean)
99
- .join('/');
100
- }
101
- }
102
-
103
- /**
104
- * Helper function to get script to setup phive
105
- *
106
- * @param version
107
- * @param php_version
108
- * @param os_version
109
- */
110
- export async function addPhive(
111
- version: string,
112
- php_version: string,
113
- os_version: string
114
- ): Promise<string> {
115
- switch (true) {
116
- case /5\.6|7\.0/.test(php_version):
117
- version = version.replace('latest', '0.12.1');
118
- break;
119
- case /7\.1/.test(php_version):
120
- version = version.replace('latest', '0.13.5');
121
- break;
122
- }
123
- switch (version) {
124
- case 'latest':
125
- return (
126
- (await getCommand(os_version, 'tool')) +
127
- 'https://phar.io/releases/phive.phar phive'
128
- );
129
- default:
130
- return (
131
- (await getCommand(os_version, 'tool')) +
132
- 'https://github.com/phar-io/phive/releases/download/' +
133
- version +
134
- '/phive-' +
135
- version +
136
- '.phar phive'
137
- );
138
- }
139
- }
140
-
141
- /**
142
- * Function to get the phar url in domain/tool-version.phar format
143
- *
144
- * @param domain
145
- * @param tool
146
- * @param prefix
147
- * @param version
148
- */
149
- export async function getPharUrl(
150
- domain: string,
151
- tool: string,
152
- prefix: string,
153
- version: string
154
- ): Promise<string> {
155
- switch (version) {
156
- case 'latest':
157
- return domain + '/' + tool + '.phar';
158
- default:
159
- return domain + '/' + tool + '-' + prefix + version + '.phar';
160
- }
161
- }
162
-
163
- /**
164
- * Function to get the Deployer url
165
- *
166
- * @param version
167
- */
168
- export async function getDeployerUrl(version: string): Promise<string> {
169
- const deployer = 'https://deployer.org';
170
- switch (version) {
171
- case 'latest':
172
- return deployer + '/deployer.phar';
173
- default:
174
- return deployer + '/releases/v' + version + '/deployer.phar';
175
- }
176
- }
177
-
178
- /**
179
- * Function to get the Deployer url
180
- *
181
- * @param version
182
- * @param os_version
183
- */
184
- export async function getSymfonyUri(
185
- version: string,
186
- os_version: string
187
- ): Promise<string> {
188
- let filename = '';
189
- switch (os_version) {
190
- case 'linux':
191
- case 'darwin':
192
- filename = 'symfony_' + os_version + '_amd64';
193
- break;
194
- case 'win32':
195
- filename = 'symfony_windows_amd64.exe';
196
- break;
197
- default:
198
- return await utils.log(
199
- 'Platform ' + os_version + ' is not supported',
200
- os_version,
201
- 'error'
202
- );
203
- }
204
- switch (version) {
205
- case 'latest':
206
- return 'releases/latest/download/' + filename;
207
- default:
208
- return 'releases/download/v' + version + '/' + filename;
209
- }
210
- }
211
-
212
- /**
213
- * Function to add/move composer in the tools list
214
- *
215
- * @param tools_list
216
- */
217
- export async function addComposer(tools_list: string[]): Promise<string[]> {
218
- const regex_any = /^composer($|:.*)/;
219
- const regex_valid =
220
- /^composer:?($|preview$|snapshot$|v?[1-2]$|v?\d+\.\d+\.\d+[\w-]*$)/;
221
- const regex_composer1_tools =
222
- /hirak|prestissimo|narrowspark|composer-prefetcher/;
223
- const matches: string[] = tools_list.filter(tool => regex_valid.test(tool));
224
- let composer = 'composer';
225
- tools_list = tools_list.filter(tool => !regex_any.test(tool));
226
- switch (true) {
227
- case regex_composer1_tools.test(tools_list.join(' ')):
228
- composer = 'composer:1';
229
- break;
230
- case matches[0] == undefined:
231
- break;
232
- default:
233
- composer = matches[matches.length - 1].replace(/v(\d\S*)/, '$1');
234
- break;
235
- }
236
- tools_list.unshift(composer);
237
- return tools_list;
238
- }
239
-
240
- /**
241
- * Function to get composer URL for a given version
242
- *
243
- * @param version
244
- */
245
- export async function getComposerUrl(version: string): Promise<string> {
246
- let cache_url = `https://github.com/shivammathur/composer-cache/releases/latest/download/composer-${version.replace(
247
- 'latest',
248
- 'stable'
249
- )}.phar`;
250
- switch (true) {
251
- case /^snapshot$/.test(version):
252
- return `${cache_url},https://getcomposer.org/composer.phar`;
253
- case /^preview$|^[1-2]$/.test(version):
254
- return `${cache_url},https://getcomposer.org/composer-${version}.phar`;
255
- case /^\d+\.\d+\.\d+[\w-]*$/.test(version):
256
- cache_url = `https://github.com/composer/composer/releases/download/${version}/composer.phar`;
257
- return `${cache_url},https://getcomposer.org/composer-${version}.phar`;
258
- default:
259
- return `${cache_url},https://getcomposer.org/composer-stable.phar`;
260
- }
261
- }
262
-
263
- /**
264
- * Function to get Tools list after cleanup
265
- *
266
- * @param tools_csv
267
- */
268
- export async function getCleanedToolsList(
269
- tools_csv: string
270
- ): Promise<string[]> {
271
- let tools_list: string[] = await utils.CSVArray(tools_csv);
272
- tools_list = await addComposer(tools_list);
273
- tools_list = tools_list
274
- .map(function (extension: string) {
275
- return extension
276
- .trim()
277
- .replace(
278
- /codeception\/|hirak\/|robmorgan\/|narrowspark\/automatic-/,
279
- ''
280
- );
281
- })
282
- .filter(Boolean);
283
- return [...new Set(tools_list)];
284
- }
285
-
286
- /**
287
- * Helper function to get script to setup a tool using a phar url
288
- *
289
- * @param tool
290
- * @param url
291
- * @param os_version
292
- */
293
- export async function addArchive(
294
- tool: string,
295
- url: string,
296
- os_version: string
297
- ): Promise<string> {
298
- return (await getCommand(os_version, 'tool')) + url + ' ' + tool;
299
- }
300
-
301
- /**
302
- * Function to get the script to setup php-config and phpize
303
- *
304
- * @param tool
305
- * @param os_version
306
- */
307
- export async function addDevTools(
308
- tool: string,
309
- os_version: string
310
- ): Promise<string> {
311
- switch (os_version) {
312
- case 'linux':
313
- return (
314
- 'add_devtools' +
315
- '\n' +
316
- (await utils.addLog('$tick', tool, 'Added', 'linux'))
317
- );
318
- case 'darwin':
319
- return await utils.addLog('$tick', tool, 'Added', 'darwin');
320
- case 'win32':
321
- return await utils.addLog(
322
- '$cross',
323
- tool,
324
- tool + ' is not a windows tool',
325
- 'win32'
326
- );
327
- default:
328
- return await utils.log(
329
- 'Platform ' + os_version + ' is not supported',
330
- os_version,
331
- 'error'
332
- );
333
- }
334
- }
335
-
336
- /**
337
- * Helper function to get script to setup a tool using composer
338
- *
339
- * @param tool
340
- * @param release
341
- * @param prefix
342
- * @param os_version
343
- */
344
- export async function addPackage(
345
- tool: string,
346
- release: string,
347
- prefix: string,
348
- os_version: string
349
- ): Promise<string> {
350
- const tool_command = await getCommand(os_version, 'composertool');
351
- return tool_command + tool + ' ' + release + ' ' + prefix;
352
- }
353
-
354
- /**
355
- * Setup tools
356
- *
357
- * @param tools_csv
358
- * @param php_version
359
- * @param os_version
360
- */
361
- export async function addTools(
362
- tools_csv: string,
363
- php_version: string,
364
- os_version: string
365
- ): Promise<string> {
366
- let script = '\n' + (await utils.stepLog('Setup Tools', os_version));
367
- const tools_list: Array<string> = await getCleanedToolsList(tools_csv);
368
- await utils.asyncForEach(tools_list, async function (release: string) {
369
- const tool_data: {name: string; version: string} = await parseTool(release);
370
- const tool: string = tool_data.name;
371
- const version: string = tool_data.version;
372
- const github = 'https://github.com/';
373
- let uri: string = await getUri(
374
- tool,
375
- '.phar',
376
- version,
377
- 'releases',
378
- '',
379
- 'download'
380
- );
381
- script += '\n';
382
- let url = '';
383
- switch (tool) {
384
- case 'cs2pr':
385
- uri = await getUri(tool, '', version, 'releases', '', 'download');
386
- url = github + 'staabm/annotate-pull-request-from-checkstyle/' + uri;
387
- script += await addArchive(tool, url, os_version);
388
- break;
389
- case 'php-cs-fixer':
390
- uri = await getUri(tool, '.phar', version, 'releases', 'v', 'download');
391
- url = github + 'FriendsOfPHP/PHP-CS-Fixer/' + uri;
392
- script += await addArchive(tool, url, os_version);
393
- break;
394
- case 'phpcs':
395
- case 'phpcbf':
396
- url = github + 'squizlabs/PHP_CodeSniffer/' + uri;
397
- script += await addArchive(tool, url, os_version);
398
- break;
399
- case 'phive':
400
- script += await addPhive(version, php_version, os_version);
401
- break;
402
- case 'phpstan':
403
- url = github + 'phpstan/phpstan/' + uri;
404
- script += await addArchive(tool, url, os_version);
405
- break;
406
- case 'phpmd':
407
- url = github + 'phpmd/phpmd/' + uri;
408
- script += await addArchive(tool, url, os_version);
409
- break;
410
- case 'psalm':
411
- url = github + 'vimeo/psalm/' + uri;
412
- script += await addArchive(tool, url, os_version);
413
- break;
414
- case 'composer':
415
- url = await getComposerUrl(version);
416
- script += await addArchive('composer', url, os_version);
417
- break;
418
- case 'codeception':
419
- script += await addPackage(tool, release, 'codeception/', os_version);
420
- break;
421
- case 'phpcpd':
422
- case 'phpunit':
423
- url = await getPharUrl('https://phar.phpunit.de', tool, '', version);
424
- script += await addArchive(tool, url, os_version);
425
- break;
426
- case 'deployer':
427
- url = await getDeployerUrl(version);
428
- script += await addArchive(tool, url, os_version);
429
- break;
430
- case 'phinx':
431
- script += await addPackage(tool, release, 'robmorgan/', os_version);
432
- break;
433
- case 'prestissimo':
434
- script += await addPackage(tool, release, 'hirak/', os_version);
435
- break;
436
- case 'composer-prefetcher':
437
- script += await addPackage(
438
- tool,
439
- release,
440
- 'narrowspark/automatic-',
441
- os_version
442
- );
443
- break;
444
- case 'pecl':
445
- script += await getCommand(os_version, 'pecl');
446
- break;
447
- case 'php-config':
448
- case 'phpize':
449
- script += await addDevTools(tool, os_version);
450
- break;
451
- case 'symfony':
452
- case 'symfony-cli':
453
- uri = await getSymfonyUri(version, os_version);
454
- url = github + 'symfony/cli/' + uri;
455
- script += await addArchive('symfony', url, os_version);
456
- break;
457
- default:
458
- script += await utils.addLog(
459
- '$cross',
460
- tool,
461
- 'Tool ' + tool + ' is not supported',
462
- os_version
463
- );
464
- break;
465
- }
466
- });
467
-
468
- return script;
469
- }
1
+ import * as utils from './utils';
2
+
3
+ /**
4
+ * Function to get command to setup tools
5
+ *
6
+ * @param os_version
7
+ * @param suffix
8
+ */
9
+ export async function getCommand(
10
+ os_version: string,
11
+ suffix: string
12
+ ): Promise<string> {
13
+ switch (os_version) {
14
+ case 'linux':
15
+ case 'darwin':
16
+ return 'add_' + suffix + ' ';
17
+ case 'win32':
18
+ return 'Add-' + suffix.charAt(0).toUpperCase() + suffix.slice(1) + ' ';
19
+ default:
20
+ return await utils.log(
21
+ 'Platform ' + os_version + ' is not supported',
22
+ os_version,
23
+ 'error'
24
+ );
25
+ }
26
+ }
27
+
28
+ /**
29
+ * Function to get tool version
30
+ *
31
+ * @param version
32
+ */
33
+ export async function getToolVersion(version: string): Promise<string> {
34
+ // semver_regex - https://semver.org/
35
+ const semver_regex =
36
+ /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
37
+ const composer_regex = /^stable$|^preview$|^snapshot$|^[1|2]$/;
38
+ version = version.replace(/[><=^]*/, '').replace(/^v(\d)/, '$1');
39
+ switch (true) {
40
+ case composer_regex.test(version):
41
+ case semver_regex.test(version):
42
+ return version;
43
+ default:
44
+ return 'latest';
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Function to parse tool:version
50
+ *
51
+ * @param release
52
+ */
53
+ export async function parseTool(
54
+ release: string
55
+ ): Promise<{name: string; version: string}> {
56
+ const parts: string[] = release.split(':');
57
+ const tool: string = parts[0];
58
+ const version: string | undefined = parts[1];
59
+ switch (version) {
60
+ case undefined:
61
+ return {
62
+ name: tool,
63
+ version: 'latest'
64
+ };
65
+ default:
66
+ return {
67
+ name: tool,
68
+ version: await getToolVersion(parts[1])
69
+ };
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Function to get the url of tool with the given version
75
+ *
76
+ * @param tool
77
+ * @param extension
78
+ * @param version
79
+ * @param prefix
80
+ * @param version_prefix
81
+ * @param verb
82
+ */
83
+ export async function getUri(
84
+ tool: string,
85
+ extension: string,
86
+ version: string,
87
+ prefix: string,
88
+ version_prefix: string,
89
+ verb: string
90
+ ): Promise<string> {
91
+ switch (version) {
92
+ case 'latest':
93
+ return [prefix, version, verb, tool + extension]
94
+ .filter(Boolean)
95
+ .join('/');
96
+ default:
97
+ return [prefix, verb, version_prefix + version, tool + extension]
98
+ .filter(Boolean)
99
+ .join('/');
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Helper function to get script to setup phive
105
+ *
106
+ * @param version
107
+ * @param php_version
108
+ * @param os_version
109
+ */
110
+ export async function addPhive(
111
+ version: string,
112
+ php_version: string,
113
+ os_version: string
114
+ ): Promise<string> {
115
+ switch (true) {
116
+ case /5\.6|7\.0/.test(php_version):
117
+ version = version.replace('latest', '0.12.1');
118
+ break;
119
+ case /7\.1/.test(php_version):
120
+ version = version.replace('latest', '0.13.5');
121
+ break;
122
+ case /7\.2/.test(php_version):
123
+ version = version.replace('latest', '0.14.5');
124
+ break;
125
+ }
126
+ switch (version) {
127
+ case 'latest':
128
+ return (
129
+ (await getCommand(os_version, 'tool')) +
130
+ 'https://phar.io/releases/phive.phar phive'
131
+ );
132
+ default:
133
+ return (
134
+ (await getCommand(os_version, 'tool')) +
135
+ 'https://github.com/phar-io/phive/releases/download/' +
136
+ version +
137
+ '/phive-' +
138
+ version +
139
+ '.phar phive'
140
+ );
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Function to get the phar url in domain/tool-version.phar format
146
+ *
147
+ * @param domain
148
+ * @param tool
149
+ * @param prefix
150
+ * @param version
151
+ */
152
+ export async function getPharUrl(
153
+ domain: string,
154
+ tool: string,
155
+ prefix: string,
156
+ version: string
157
+ ): Promise<string> {
158
+ switch (version) {
159
+ case 'latest':
160
+ return domain + '/' + tool + '.phar';
161
+ default:
162
+ return domain + '/' + tool + '-' + prefix + version + '.phar';
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Function to get the Deployer url
168
+ *
169
+ * @param version
170
+ */
171
+ export async function getDeployerUrl(version: string): Promise<string> {
172
+ const deployer = 'https://deployer.org';
173
+ switch (version) {
174
+ case 'latest':
175
+ return deployer + '/deployer.phar';
176
+ default:
177
+ return deployer + '/releases/v' + version + '/deployer.phar';
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Function to get the Deployer url
183
+ *
184
+ * @param version
185
+ * @param os_version
186
+ */
187
+ export async function getSymfonyUri(
188
+ version: string,
189
+ os_version: string
190
+ ): Promise<string> {
191
+ let filename = '';
192
+ switch (os_version) {
193
+ case 'linux':
194
+ case 'darwin':
195
+ filename = 'symfony_' + os_version + '_amd64';
196
+ break;
197
+ case 'win32':
198
+ filename = 'symfony_windows_amd64.exe';
199
+ break;
200
+ default:
201
+ return await utils.log(
202
+ 'Platform ' + os_version + ' is not supported',
203
+ os_version,
204
+ 'error'
205
+ );
206
+ }
207
+ switch (version) {
208
+ case 'latest':
209
+ return 'releases/latest/download/' + filename;
210
+ default:
211
+ return 'releases/download/v' + version + '/' + filename;
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Function to add/move composer in the tools list
217
+ *
218
+ * @param tools_list
219
+ */
220
+ export async function addComposer(tools_list: string[]): Promise<string[]> {
221
+ const regex_any = /^composer($|:.*)/;
222
+ const regex_valid =
223
+ /^composer:?($|preview$|snapshot$|v?[1-2]$|v?\d+\.\d+\.\d+[\w-]*$)/;
224
+ const regex_composer1_tools =
225
+ /hirak|prestissimo|narrowspark|composer-prefetcher/;
226
+ const matches: string[] = tools_list.filter(tool => regex_valid.test(tool));
227
+ let composer = 'composer';
228
+ tools_list = tools_list.filter(tool => !regex_any.test(tool));
229
+ switch (true) {
230
+ case regex_composer1_tools.test(tools_list.join(' ')):
231
+ composer = 'composer:1';
232
+ break;
233
+ case matches[0] == undefined:
234
+ break;
235
+ default:
236
+ composer = matches[matches.length - 1].replace(/v(\d\S*)/, '$1');
237
+ break;
238
+ }
239
+ tools_list.unshift(composer);
240
+ return tools_list;
241
+ }
242
+
243
+ /**
244
+ * Function to get composer URL for a given version
245
+ *
246
+ * @param version
247
+ */
248
+ export async function getComposerUrl(version: string): Promise<string> {
249
+ let cache_url = `https://github.com/shivammathur/composer-cache/releases/latest/download/composer-${version.replace(
250
+ 'latest',
251
+ 'stable'
252
+ )}.phar`;
253
+ switch (true) {
254
+ case /^snapshot$/.test(version):
255
+ return `${cache_url},https://getcomposer.org/composer.phar`;
256
+ case /^preview$|^[1-2]$/.test(version):
257
+ return `${cache_url},https://getcomposer.org/composer-${version}.phar`;
258
+ case /^\d+\.\d+\.\d+[\w-]*$/.test(version):
259
+ cache_url = `https://github.com/composer/composer/releases/download/${version}/composer.phar`;
260
+ return `${cache_url},https://getcomposer.org/composer-${version}.phar`;
261
+ default:
262
+ return `${cache_url},https://getcomposer.org/composer-stable.phar`;
263
+ }
264
+ }
265
+
266
+ /**
267
+ * Function to get Tools list after cleanup
268
+ *
269
+ * @param tools_csv
270
+ */
271
+ export async function getCleanedToolsList(
272
+ tools_csv: string
273
+ ): Promise<string[]> {
274
+ let tools_list: string[] = await utils.CSVArray(tools_csv);
275
+ tools_list = await addComposer(tools_list);
276
+ tools_list = tools_list
277
+ .map(function (extension: string) {
278
+ return extension
279
+ .trim()
280
+ .replace(
281
+ /codeception\/|hirak\/|robmorgan\/|narrowspark\/automatic-/,
282
+ ''
283
+ );
284
+ })
285
+ .filter(Boolean);
286
+ return [...new Set(tools_list)];
287
+ }
288
+
289
+ /**
290
+ * Helper function to get script to setup a tool using a phar url
291
+ *
292
+ * @param tool
293
+ * @param url
294
+ * @param os_version
295
+ */
296
+ export async function addArchive(
297
+ tool: string,
298
+ url: string,
299
+ os_version: string
300
+ ): Promise<string> {
301
+ return (await getCommand(os_version, 'tool')) + url + ' ' + tool;
302
+ }
303
+
304
+ /**
305
+ * Function to get the script to setup php-config and phpize
306
+ *
307
+ * @param tool
308
+ * @param os_version
309
+ */
310
+ export async function addDevTools(
311
+ tool: string,
312
+ os_version: string
313
+ ): Promise<string> {
314
+ switch (os_version) {
315
+ case 'linux':
316
+ return (
317
+ 'add_devtools' +
318
+ '\n' +
319
+ (await utils.addLog('$tick', tool, 'Added', 'linux'))
320
+ );
321
+ case 'darwin':
322
+ return await utils.addLog('$tick', tool, 'Added', 'darwin');
323
+ case 'win32':
324
+ return await utils.addLog(
325
+ '$cross',
326
+ tool,
327
+ tool + ' is not a windows tool',
328
+ 'win32'
329
+ );
330
+ default:
331
+ return await utils.log(
332
+ 'Platform ' + os_version + ' is not supported',
333
+ os_version,
334
+ 'error'
335
+ );
336
+ }
337
+ }
338
+
339
+ /**
340
+ * Helper function to get script to setup a tool using composer
341
+ *
342
+ * @param tool
343
+ * @param release
344
+ * @param prefix
345
+ * @param os_version
346
+ */
347
+ export async function addPackage(
348
+ tool: string,
349
+ release: string,
350
+ prefix: string,
351
+ os_version: string
352
+ ): Promise<string> {
353
+ const tool_command = await getCommand(os_version, 'composertool');
354
+ return tool_command + tool + ' ' + release + ' ' + prefix;
355
+ }
356
+
357
+ /**
358
+ * Setup tools
359
+ *
360
+ * @param tools_csv
361
+ * @param php_version
362
+ * @param os_version
363
+ */
364
+ export async function addTools(
365
+ tools_csv: string,
366
+ php_version: string,
367
+ os_version: string
368
+ ): Promise<string> {
369
+ let script = '\n' + (await utils.stepLog('Setup Tools', os_version));
370
+ const tools_list: Array<string> = await getCleanedToolsList(tools_csv);
371
+ await utils.asyncForEach(tools_list, async function (release: string) {
372
+ const tool_data: {name: string; version: string} = await parseTool(release);
373
+ const tool: string = tool_data.name;
374
+ const version: string = tool_data.version;
375
+ const github = 'https://github.com/';
376
+ let uri: string = await getUri(
377
+ tool,
378
+ '.phar',
379
+ version,
380
+ 'releases',
381
+ '',
382
+ 'download'
383
+ );
384
+ script += '\n';
385
+ let url = '';
386
+ switch (tool) {
387
+ case 'cs2pr':
388
+ uri = await getUri(tool, '', version, 'releases', '', 'download');
389
+ url = github + 'staabm/annotate-pull-request-from-checkstyle/' + uri;
390
+ script += await addArchive(tool, url, os_version);
391
+ break;
392
+ case 'php-cs-fixer':
393
+ uri = await getUri(tool, '.phar', version, 'releases', 'v', 'download');
394
+ url = github + 'FriendsOfPHP/PHP-CS-Fixer/' + uri;
395
+ script += await addArchive(tool, url, os_version);
396
+ break;
397
+ case 'phpcs':
398
+ case 'phpcbf':
399
+ url = github + 'squizlabs/PHP_CodeSniffer/' + uri;
400
+ script += await addArchive(tool, url, os_version);
401
+ break;
402
+ case 'phive':
403
+ script += await addPhive(version, php_version, os_version);
404
+ break;
405
+ case 'phpstan':
406
+ url = github + 'phpstan/phpstan/' + uri;
407
+ script += await addArchive(tool, url, os_version);
408
+ break;
409
+ case 'phpmd':
410
+ url = github + 'phpmd/phpmd/' + uri;
411
+ script += await addArchive(tool, url, os_version);
412
+ break;
413
+ case 'psalm':
414
+ url = github + 'vimeo/psalm/' + uri;
415
+ script += await addArchive(tool, url, os_version);
416
+ break;
417
+ case 'composer':
418
+ url = await getComposerUrl(version);
419
+ script += await addArchive('composer', url, os_version);
420
+ break;
421
+ case 'codeception':
422
+ script += await addPackage(tool, release, 'codeception/', os_version);
423
+ break;
424
+ case 'phpcpd':
425
+ case 'phpunit':
426
+ url = await getPharUrl('https://phar.phpunit.de', tool, '', version);
427
+ script += await addArchive(tool, url, os_version);
428
+ break;
429
+ case 'deployer':
430
+ url = await getDeployerUrl(version);
431
+ script += await addArchive(tool, url, os_version);
432
+ break;
433
+ case 'phinx':
434
+ script += await addPackage(tool, release, 'robmorgan/', os_version);
435
+ break;
436
+ case 'prestissimo':
437
+ script += await addPackage(tool, release, 'hirak/', os_version);
438
+ break;
439
+ case 'composer-prefetcher':
440
+ script += await addPackage(
441
+ tool,
442
+ release,
443
+ 'narrowspark/automatic-',
444
+ os_version
445
+ );
446
+ break;
447
+ case 'pecl':
448
+ script += await getCommand(os_version, 'pecl');
449
+ break;
450
+ case 'php-config':
451
+ case 'phpize':
452
+ script += await addDevTools(tool, os_version);
453
+ break;
454
+ case 'symfony':
455
+ case 'symfony-cli':
456
+ uri = await getSymfonyUri(version, os_version);
457
+ url = github + 'symfony/cli/' + uri;
458
+ script += await addArchive('symfony', url, os_version);
459
+ break;
460
+ default:
461
+ script += await utils.addLog(
462
+ '$cross',
463
+ tool,
464
+ 'Tool ' + tool + ' is not supported',
465
+ os_version
466
+ );
467
+ break;
468
+ }
469
+ });
470
+
471
+ return script;
472
+ }