setup-php 2.36.0 → 2.37.1

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 (50) hide show
  1. package/README.md +15 -12
  2. package/lib/config.js +5 -2
  3. package/lib/config.js.map +1 -1
  4. package/lib/core.d.ts +8 -0
  5. package/lib/core.js +55 -0
  6. package/lib/core.js.map +1 -0
  7. package/lib/extensions.js +9 -8
  8. package/lib/extensions.js.map +1 -1
  9. package/lib/fetch.js +25 -70
  10. package/lib/fetch.js.map +1 -1
  11. package/lib/install.js +3 -3
  12. package/lib/install.js.map +1 -1
  13. package/lib/tools.d.ts +50 -21
  14. package/lib/tools.js +211 -150
  15. package/lib/tools.js.map +1 -1
  16. package/lib/utils.d.ts +3 -0
  17. package/lib/utils.js +62 -26
  18. package/lib/utils.js.map +1 -1
  19. package/package.json +20 -20
  20. package/src/config.ts +5 -2
  21. package/src/configs/brew_extensions +19 -0
  22. package/src/configs/composer-gh-auth-no-op +3 -0
  23. package/src/configs/composer-gh-auth-warn +1 -0
  24. package/src/configs/os_releases.csv +4 -1
  25. package/src/core.ts +112 -0
  26. package/src/extensions.ts +16 -15
  27. package/src/fetch.ts +28 -42
  28. package/src/install.ts +6 -3
  29. package/src/scripts/darwin.sh +12 -6
  30. package/src/scripts/extensions/couchbase.sh +13 -2
  31. package/src/scripts/extensions/firebird.sh +6 -23
  32. package/src/scripts/extensions/gearman.sh +1 -1
  33. package/src/scripts/extensions/http.ps1 +7 -5
  34. package/src/scripts/extensions/phalcon.ps1 +3 -21
  35. package/src/scripts/extensions/phalcon.sh +2 -0
  36. package/src/scripts/extensions/relay.sh +5 -2
  37. package/src/scripts/extensions/source.sh +3 -1
  38. package/src/scripts/extensions/sqlsrv.ps1 +2 -0
  39. package/src/scripts/extensions/sqlsrv.sh +2 -0
  40. package/src/scripts/linux.sh +49 -9
  41. package/src/scripts/tools/add_tools.ps1 +75 -27
  42. package/src/scripts/tools/add_tools.sh +67 -23
  43. package/src/scripts/tools/blackfire.sh +1 -1
  44. package/src/scripts/tools/brew.sh +130 -0
  45. package/src/scripts/tools/grpc_php_plugin.sh +2 -2
  46. package/src/scripts/tools/ppa.sh +5 -1
  47. package/src/scripts/unix.sh +7 -3
  48. package/src/scripts/win32.ps1 +17 -11
  49. package/src/tools.ts +349 -203
  50. package/src/utils.ts +81 -34
package/lib/tools.js CHANGED
@@ -37,6 +37,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.functionRecord = void 0;
40
+ exports.skipGitHubAuthForComposerVersion = skipGitHubAuthForComposerVersion;
41
+ exports.cleanComposerAuthJson = cleanComposerAuthJson;
40
42
  exports.getSemverVersion = getSemverVersion;
41
43
  exports.getLatestVersion = getLatestVersion;
42
44
  exports.getVersion = getVersion;
@@ -64,6 +66,38 @@ const cv = __importStar(require("compare-versions"));
64
66
  const fetch = __importStar(require("./fetch"));
65
67
  const packagist = __importStar(require("./packagist"));
66
68
  const utils = __importStar(require("./utils"));
69
+ function skipGitHubAuthForComposerVersion(version) {
70
+ if (!/^\d+\.\d+\.\d+(?:-[\w-]+)?$/.test(version)) {
71
+ return false;
72
+ }
73
+ return fs_1.default
74
+ .readFileSync(path_1.default.join(__dirname, '../src/configs/composer-gh-auth-no-op'), 'utf8')
75
+ .trim()
76
+ .split(/\r?\n/)
77
+ .some(range => {
78
+ const [min, max] = range.trim().split(/\s+/);
79
+ return (cv.compareVersions(version, min) >= 0 &&
80
+ cv.compareVersions(version, max) < 0);
81
+ });
82
+ }
83
+ function cleanComposerAuthJson() {
84
+ try {
85
+ const auth_json = process.env['COMPOSER_AUTH_JSON'] || '';
86
+ if (!auth_json.includes('github-oauth'))
87
+ return;
88
+ const auth = JSON.parse(auth_json);
89
+ delete auth['github-oauth'];
90
+ if (!Object.keys(auth).length) {
91
+ delete process.env['COMPOSER_AUTH_JSON'];
92
+ }
93
+ else {
94
+ process.env['COMPOSER_AUTH_JSON'] = JSON.stringify(auth);
95
+ }
96
+ }
97
+ catch {
98
+ return;
99
+ }
100
+ }
67
101
  async function getSemverVersion(data) {
68
102
  const fixSemver = (t) => {
69
103
  if (/^\d+\.\d+\.\d+(-|$)/.test(t))
@@ -77,11 +111,11 @@ async function getSemverVersion(data) {
77
111
  (await utils.readEnv('COMPOSER_TOKEN'));
78
112
  const response = await fetch.fetch(url, github_token);
79
113
  if (response.error || response.data === '[]') {
80
- data['error'] = response.error ?? `No version found with prefix ${search}.`;
81
- return data['version'];
114
+ data.error = response.error ?? `No version found with prefix ${search}.`;
115
+ return data.version;
82
116
  }
83
117
  else {
84
- const refs = JSON.parse(response['data']);
118
+ const refs = JSON.parse(response.data);
85
119
  const tags = refs
86
120
  .map((i) => (i.ref?.split('/').pop() ?? '').replace(/^v(?=\d)/, ''))
87
121
  .filter((t) => t.length > 0);
@@ -91,7 +125,7 @@ async function getSemverVersion(data) {
91
125
  fixedToOriginal.set(f, t);
92
126
  return f;
93
127
  });
94
- fixed.sort((a, b) => {
128
+ const sorted = fixed.toSorted((a, b) => {
95
129
  try {
96
130
  return cv.compareVersions(b, a);
97
131
  }
@@ -99,49 +133,51 @@ async function getSemverVersion(data) {
99
133
  return b.localeCompare(a, 'en', { numeric: true, sensitivity: 'base' });
100
134
  }
101
135
  });
102
- return fixedToOriginal.get(fixed[0]) ?? fixed[0];
136
+ return fixedToOriginal.get(sorted[0]) ?? sorted[0];
103
137
  }
104
138
  }
105
139
  async function getLatestVersion(data) {
106
- if (!data['version'] && data['fetch_latest'] === 'false') {
140
+ if (!data.version && data.fetch_latest === 'false') {
107
141
  return 'latest';
108
142
  }
109
- const resp = await fetch.fetch(`${data['github']}/${data['repository']}/releases.atom`);
110
- if (resp['data']) {
143
+ if (data.fetch_latest === 'true' && !data.repository) {
144
+ return 'latest';
145
+ }
146
+ const resp = await fetch.fetch(`${data.github}/${data.repository}/releases.atom`);
147
+ if (resp.data) {
111
148
  const releases = [
112
- ...resp['data'].matchAll(/releases\/tag\/([a-zA-Z]*)?(\d+.\d+.\d+)"/g)
149
+ ...resp.data.matchAll(/releases\/tag\/([a-zA-Z]*)?(\d+\.\d+\.\d+)"/g)
113
150
  ].map(match => match[2]);
114
- return (releases
115
- .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))
116
- .pop() || 'latest');
151
+ const sorted = releases.toSorted((a, b) => a.localeCompare(b, undefined, { numeric: true }));
152
+ return sorted.at(-1) || 'latest';
117
153
  }
118
154
  return 'latest';
119
155
  }
120
156
  async function getVersion(version, data) {
121
157
  const semver_regex = /^(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-]+)*))?$/;
122
- const composer_regex = /^composer:(stable|preview|snapshot|[1|2])$/;
158
+ const composer_regex = /^composer:(stable|preview|snapshot|[12])$/;
123
159
  const constraint_regex = /[><=^~]+.*/;
124
160
  const major_minor_regex = /^\d+(\.\d+)?$/;
125
- data['version'] = version.replace(/v?(\d)/, '$1').replace(/\.x/, '');
161
+ data.version = version.replace(/v?(\d)/, '$1').replace(/\.x/, '');
126
162
  switch (true) {
127
- case composer_regex.test(data['release']):
128
- case semver_regex.test(data['version']):
129
- case constraint_regex.test(data['version']) && data['type'] === 'composer':
130
- return data['version'];
131
- case major_minor_regex.test(data['version']) && data['type'] === 'composer':
132
- data['release'] = `${data['tool']}:${data['version']}.*`;
133
- return `${data['version']}.*`;
134
- case data['repository'] && major_minor_regex.test(data['version']):
163
+ case composer_regex.test(data.release):
164
+ case semver_regex.test(data.version):
165
+ case constraint_regex.test(data.version) && data.type === 'composer':
166
+ return data.version;
167
+ case major_minor_regex.test(data.version) && data.type === 'composer':
168
+ data.release = `${data.tool}:${data.version}.*`;
169
+ return `${data.version}.*`;
170
+ case !!data.repository && major_minor_regex.test(data.version):
135
171
  return await getSemverVersion(data);
136
172
  default:
137
- return data['version'].replace(/[><=^~]*/, '');
173
+ return data.version.replace(/[^a-zA-Z0-9_.:@+,/-]/g, '');
138
174
  }
139
175
  }
140
176
  async function getRelease(release, data) {
141
177
  release = release.includes('/') ? release.split('/')[1] : release;
142
178
  return release.includes(':')
143
- ? [data['tool'], release.split(':')[1]].join(':')
144
- : data['tool'];
179
+ ? [data.tool, release.split(':')[1]].join(':')
180
+ : data.tool;
145
181
  }
146
182
  async function filterList(tools_list) {
147
183
  const regex_any = /^composer($|:.*)/;
@@ -153,104 +189,108 @@ async function filterList(tools_list) {
153
189
  case matches[0] == undefined:
154
190
  break;
155
191
  default:
156
- composer = matches[matches.length - 1].replace(/v(\d\S*)/, '$1');
192
+ composer = matches.at(-1).replace(/v(\d\S*)/, '$1');
157
193
  break;
158
194
  }
159
195
  tools_list.unshift(composer);
160
196
  return tools_list;
161
197
  }
162
198
  async function getUrl(data) {
163
- if ((data['version'] ?? 'latest') === 'latest') {
199
+ const version = data.version ?? 'latest';
200
+ if (version === 'latest' || version === '') {
164
201
  return [
165
- data['domain'],
166
- data['repository'],
167
- data['prefix'],
168
- data['version'],
169
- data['verb'],
170
- data['tool'] + data['extension']
202
+ data.domain,
203
+ data.repository,
204
+ data.prefix,
205
+ 'latest',
206
+ data.verb,
207
+ data.tool + data.extension
171
208
  ]
172
209
  .filter(Boolean)
173
210
  .join('/');
174
211
  }
175
212
  else {
176
213
  return [
177
- data['domain'],
178
- data['repository'],
179
- data['prefix'],
180
- data['verb'],
181
- data['version_prefix'] + data['version'],
182
- data['tool'] + data['extension']
214
+ data.domain,
215
+ data.repository,
216
+ data.prefix,
217
+ data.verb,
218
+ data.version_prefix + data.version,
219
+ data.tool + data.extension
183
220
  ]
184
221
  .filter(Boolean)
185
222
  .join('/');
186
223
  }
187
224
  }
188
225
  async function getPharUrl(data) {
189
- if (data['version'] === 'latest') {
190
- return data['domain'] + '/' + data['tool'] + '.phar';
226
+ if (data.version === 'latest') {
227
+ return data.domain + '/' + data.tool + '.phar';
191
228
  }
192
229
  else {
193
- return (data['domain'] +
230
+ return (data.domain +
194
231
  '/' +
195
- data['tool'] +
232
+ data.tool +
196
233
  '-' +
197
- data['version_prefix'] +
198
- data['version'] +
234
+ data.version_prefix +
235
+ data.version +
199
236
  '.phar');
200
237
  }
201
238
  }
202
239
  async function addArchive(data) {
203
- return ((await utils.getCommand(data['os'], 'tool')) +
204
- (await utils.joins(data['url'], data['tool'], data['version_parameter'])));
240
+ return ((await utils.getCommand(data.os, 'tool')) +
241
+ (await utils.joins(data.url, data.tool, data.version_parameter)));
205
242
  }
206
243
  async function addPackage(data) {
207
- const command = await utils.getCommand(data['os'], 'composer_tool');
208
- const parts = data['repository'].split('/');
209
- const args = await utils.joins(parts[1], data['release'], parts[0] + '/', data['scope']);
244
+ const command = await utils.getCommand(data.os, 'composer_tool');
245
+ const parts = data.repository.split('/');
246
+ const args = [parts[1], data.release, parts[0] + '/', data.scope]
247
+ .map(a => utils.safeArg(a, data.os))
248
+ .join(' ');
210
249
  return command + args;
211
250
  }
212
251
  async function addBlackfirePlayer(data) {
213
- switch (data['os']) {
252
+ switch (data.os) {
214
253
  case 'win32':
215
- return await utils.addLog('$cross', data['tool'], data['tool'] + ' is not a windows tool', 'win32');
254
+ return await utils.addLog('$cross', data.tool, data.tool + ' is not a windows tool', 'win32');
216
255
  default:
217
- if (data['version'] == 'latest') {
218
- if (/5\.[5-6]|7\.0/.test(data['php_version'])) {
219
- data['version'] = '1.9.3';
256
+ if (data.version == 'latest') {
257
+ if (/5\.[5-6]|7\.0/.test(data.php_version)) {
258
+ data.version = '1.9.3';
220
259
  }
221
- else if (/7\.[1-4]|8\.0/.test(data['php_version'])) {
222
- data['version'] = '1.22.0';
260
+ else if (/7\.[1-4]|8\.0/.test(data.php_version)) {
261
+ data.version = '1.22.0';
223
262
  }
224
263
  }
225
- data['url'] = await getPharUrl(data);
264
+ data.url = await getPharUrl(data);
226
265
  return addArchive(data);
227
266
  }
228
267
  }
229
268
  async function addCastor(data) {
230
- data['tool'] = 'castor.' + data['os'].replace('win32', 'windows') + '-amd64';
231
- data['url'] = await getUrl(data);
232
- data['tool'] = 'castor';
233
- data['version_parameter'] = fs_1.default.existsSync('castor.php')
234
- ? data['version_parameter']
269
+ data.tool = 'castor.' + data.os.replace('win32', 'windows') + '-amd64';
270
+ data.url = await getUrl(data);
271
+ data.tool = 'castor';
272
+ data.version_parameter = fs_1.default.existsSync('castor.php')
273
+ ? data.version_parameter
235
274
  : '';
236
275
  return await addArchive(data);
237
276
  }
238
277
  async function addComposer(data) {
239
- const channel = data['version'].replace('latest', 'stable');
240
- const github = data['github'];
241
- const getcomposer = data['domain'];
278
+ const channel = data.version.replace('latest', 'stable');
279
+ const github = data.github;
280
+ const getcomposer = data.domain;
242
281
  const cds = 'https://dl.cloudsmith.io';
243
282
  const spc = 'https://artifacts.setup-php.com';
244
- const filename = `composer-${data['php_version']}-${channel}.phar`;
283
+ const filename = `composer-${data.php_version}-${channel}.phar`;
245
284
  const releases_url = `${github}/shivammathur/composer-cache/releases/latest/download/${filename}`;
246
285
  const cds_url = `${cds}/public/shivammathur/composer-cache/raw/files/${filename}`;
247
286
  const spc_url = `${spc}/composer/${filename}`;
248
287
  const lts_url = `${getcomposer}/download/latest-2.2.x/composer.phar`;
249
- const is_lts = /^5\.[3-6]$|^7\.[0-1]$/.test(data['php_version']);
288
+ const is_lts = /^5\.[3-6]$|^7\.[0-1]$/.test(data.php_version);
250
289
  const channel_source_url = `${getcomposer}/composer-${channel}.phar`;
251
290
  const version_source_url = `${getcomposer}/download/${channel}/composer.phar`;
252
291
  let cache_url = `${releases_url},${spc_url},${cds_url}`;
253
292
  let source_url = `${getcomposer}/composer.phar`;
293
+ let skip_composer_github_auth = '';
254
294
  switch (true) {
255
295
  case /^snapshot$/.test(channel):
256
296
  source_url = is_lts ? lts_url : source_url;
@@ -261,106 +301,108 @@ async function addComposer(data) {
261
301
  case /^1$/.test(channel):
262
302
  source_url = channel_source_url;
263
303
  break;
264
- case /^\d+\.\d+\.\d+[\w-]*$/.test(data['version']):
265
- cache_url = `${github}/${data['repository']}/releases/download/${data['version']}/composer.phar`;
304
+ case /^\d+\.\d+\.\d+(?:-[\w-]+)?$/.test(data.version):
305
+ if (skipGitHubAuthForComposerVersion(data.version)) {
306
+ cleanComposerAuthJson();
307
+ skip_composer_github_auth = ' true';
308
+ }
309
+ cache_url = `${github}/${data.repository}/releases/download/${data.version}/composer.phar`;
266
310
  source_url = version_source_url;
267
311
  break;
268
312
  default:
269
313
  source_url = is_lts ? lts_url : channel_source_url;
270
314
  }
271
315
  const use_cache = (await utils.readEnv('NO_TOOLS_CACHE')) !== 'true';
272
- data['url'] = use_cache ? `${cache_url},${source_url}` : source_url;
273
- data['version_parameter'] = data['version'];
316
+ data.url = use_cache ? `${cache_url},${source_url}` : source_url;
317
+ data.version_parameter = data.version + skip_composer_github_auth;
274
318
  return await addArchive(data);
275
319
  }
276
320
  async function addDeployer(data) {
277
- if (data['version'] === 'latest') {
278
- data['url'] = data['domain'] + '/deployer.phar';
321
+ if (data.version === 'latest') {
322
+ data.url = data.domain + '/deployer.phar';
279
323
  }
280
324
  else {
281
325
  const manifest = await fetch.fetch('https://deployer.org/manifest.json');
282
326
  const version_data = JSON.parse(manifest.data);
283
327
  const version_key = Object.keys(version_data).find((key) => {
284
- return version_data[key]['version'] === data['version'];
328
+ return version_data[key].version === data.version;
285
329
  });
286
330
  if (version_key) {
287
- data['url'] = version_data[version_key]['url'];
331
+ data.url = version_data[version_key].url;
288
332
  }
289
333
  else {
290
- return await utils.addLog('$cross', 'deployer', 'Version missing in deployer manifest', data['os']);
334
+ return await utils.addLog('$cross', 'deployer', 'Version missing in deployer manifest', data.os);
291
335
  }
292
336
  }
293
337
  return await addArchive(data);
294
338
  }
295
339
  async function addDevTools(data) {
296
- switch (data['os']) {
340
+ switch (data.os) {
297
341
  case 'linux':
298
342
  case 'darwin':
299
- return 'add_devtools ' + data['tool'];
343
+ return 'add_devtools ' + data.tool;
300
344
  case 'win32':
301
- return await utils.addLog('$tick', data['tool'], data['tool'] + ' is not a windows tool', 'win32');
345
+ return await utils.addLog('$tick', data.tool, data.tool + ' is not a windows tool', 'win32');
302
346
  default:
303
- return await utils.log('Platform ' + data['os'] + ' is not supported', data['os'], 'error');
347
+ return await utils.log('Platform ' + data.os + ' is not supported', data.os, 'error');
304
348
  }
305
349
  }
306
350
  async function addPECL(data) {
307
- return await utils.getCommand(data['os'], 'pecl');
351
+ return await utils.getCommand(data.os, 'pecl');
308
352
  }
309
353
  async function addPhing(data) {
310
- data['url'] =
311
- data['domain'] + '/get/phing-' + data['version'] + data['extension'];
312
- if (data['version'] != 'latest') {
313
- [data['prefix'], data['verb']] = ['releases', 'download'];
314
- data['domain'] = data['github'];
315
- data['extension'] = '-' + data['version'] + data['extension'];
316
- data['url'] += ',' + (await getUrl(data));
354
+ data.url = data.domain + '/get/phing-' + data.version + data.extension;
355
+ if (data.version != 'latest') {
356
+ [data.prefix, data.verb] = ['releases', 'download'];
357
+ data.domain = data.github;
358
+ data.extension = '-' + data.version + data.extension;
359
+ data.url += ',' + (await getUrl(data));
317
360
  }
318
361
  return await addArchive(data);
319
362
  }
320
363
  async function addPhive(data) {
321
364
  switch (true) {
322
- case /5\.[3-5]/.test(data['php_version']):
323
- return await utils.addLog('$cross', 'phive', 'Phive is not supported on PHP ' + data['php_version'], data['os']);
324
- case /5\.6|7\.0/.test(data['php_version']):
325
- data['version'] = '0.12.1';
365
+ case /5\.[3-5]/.test(data.php_version):
366
+ return await utils.addLog('$cross', 'phive', 'Phive is not supported on PHP ' + data.php_version, data.os);
367
+ case /5\.6|7\.0/.test(data.php_version):
368
+ data.version = '0.12.1';
326
369
  break;
327
- case /7\.1/.test(data['php_version']):
328
- data['version'] = '0.13.5';
370
+ case /7\.1/.test(data.php_version):
371
+ data.version = '0.13.5';
329
372
  break;
330
- case /7\.2/.test(data['php_version']):
331
- data['version'] = '0.14.5';
373
+ case /7\.2/.test(data.php_version):
374
+ data.version = '0.14.5';
332
375
  break;
333
- case /7\.3|7\.4/.test(data['php_version']):
334
- data['version'] = '0.15.3';
376
+ case /7\.3|7\.4/.test(data.php_version):
377
+ data.version = '0.15.3';
335
378
  break;
336
- case /^latest$/.test(data['version']):
337
- data['version'] = await getLatestVersion(data);
379
+ case /^latest$/.test(data.version):
380
+ data.version = await getLatestVersion(data);
338
381
  break;
339
382
  }
340
- data['extension'] = '-' + data['version'] + data['extension'];
341
- data['url'] = await getUrl(data);
383
+ data.extension = '-' + data.version + data.extension;
384
+ data.url = await getUrl(data);
342
385
  return await addArchive(data);
343
386
  }
344
387
  async function addPHPUnitTools(data) {
345
- if (data['version'] === 'latest') {
346
- data['version'] =
347
- (await packagist.search(data['packagist'], data['php_version'])) ??
348
- 'latest';
388
+ if (data.version === 'latest') {
389
+ data.version =
390
+ (await packagist.search(data.packagist, data.php_version)) ?? 'latest';
349
391
  }
350
- data['url'] = await getPharUrl(data);
351
- if (data['url'].match(/-\d+/)) {
352
- data['url'] += ',' + data['url'].replace(/-(\d+)\.\d+\.\d+/, '-$1');
392
+ data.url = await getPharUrl(data);
393
+ if (data.url.match(/-\d+/)) {
394
+ data.url += ',' + data.url.replace(/-(\d+)\.\d+\.\d+/, '-$1');
353
395
  }
354
396
  return await addArchive(data);
355
397
  }
356
398
  async function addWPCLI(data) {
357
- if (data['version'] === 'latest') {
358
- data['uri'] = 'wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true';
359
- data['url'] = [data['domain'], data['uri']].join('/');
399
+ if (data.version === 'latest') {
400
+ data.uri = 'wp-cli/builds/blob/gh-pages/phar/wp-cli.phar?raw=true';
401
+ data.url = [data.domain, data.uri].join('/');
360
402
  }
361
403
  else {
362
- data['extension'] = '-' + data['version'] + data['extension'];
363
- data['url'] = await getUrl(data);
404
+ data.extension = '-' + data.version + data.extension;
405
+ data.url = await getUrl(data);
364
406
  }
365
407
  return await addArchive(data);
366
408
  }
@@ -372,44 +414,59 @@ async function getData(release, php_version, os) {
372
414
  const parts = release.split(':');
373
415
  const tool = parts[0];
374
416
  const version = parts[1];
375
- let data;
376
- if (Object.keys(json_objects).includes(tool)) {
377
- data = json_objects[tool];
378
- data['tool'] = tool;
417
+ let config;
418
+ if (Object.hasOwn(json_objects, tool)) {
419
+ config = { ...json_objects[tool], tool };
379
420
  }
380
421
  else {
381
422
  const key = Object.keys(json_objects).find((key) => {
382
- return json_objects[key]['alias'] == tool;
423
+ return json_objects[key].alias == tool;
383
424
  });
384
425
  if (key) {
385
- data = json_objects[key];
386
- data['tool'] = key;
426
+ config = { ...json_objects[key], tool: key };
387
427
  }
388
- else {
389
- data = {
428
+ else if (tool.includes('/')) {
429
+ config = {
390
430
  tool: tool.split('/')[1],
391
431
  repository: tool,
392
432
  type: 'composer'
393
433
  };
394
- data = !tool.includes('/') ? { tool: tool } : data;
434
+ }
435
+ else {
436
+ config = { tool };
395
437
  }
396
438
  }
397
- data['github'] = 'https://github.com';
398
- data['domain'] ??= data['github'];
399
- data['extension'] ??= '.phar';
400
- data['os'] = os;
401
- data['php_version'] = php_version;
402
- data['packagist'] ??= data['repository'];
403
- data['prefix'] = data['github'] === data['domain'] ? 'releases' : '';
404
- data['verb'] = data['github'] === data['domain'] ? 'download' : '';
405
- data['fetch_latest'] ??= 'false';
406
- data['scope'] ??= 'global';
407
- data['version_parameter'] = JSON.stringify(data['version_parameter']) || '';
408
- data['version_prefix'] ??= '';
409
- data['release'] = await getRelease(release, data);
410
- data['version'] = version
439
+ const github = 'https://github.com';
440
+ const domain = config.domain ?? github;
441
+ const data = {
442
+ tool: config.tool,
443
+ version: '',
444
+ url: '',
445
+ os,
446
+ php_version,
447
+ github,
448
+ domain,
449
+ extension: config.extension ?? '.phar',
450
+ repository: config.repository ?? '',
451
+ prefix: domain === github ? 'releases' : '',
452
+ verb: domain === github ? 'download' : '',
453
+ fetch_latest: config.fetch_latest ?? 'false',
454
+ scope: config.scope ?? 'global',
455
+ version_parameter: config.version_parameter != null
456
+ ? JSON.stringify(config.version_parameter)
457
+ : '',
458
+ version_prefix: config.version_prefix ?? '',
459
+ release: '',
460
+ packagist: config.packagist ?? config.repository ?? '',
461
+ type: config.type,
462
+ function: config.function,
463
+ alias: config.alias
464
+ };
465
+ data.release = await getRelease(release, data);
466
+ data.version = version
411
467
  ? await getVersion(version, data)
412
468
  : await getLatestVersion(data);
469
+ data.url = await getUrl(data);
413
470
  return data;
414
471
  }
415
472
  exports.functionRecord = {
@@ -438,26 +495,30 @@ async function addTools(tools_csv, php_version, os) {
438
495
  const data = await getData(release, php_version, os);
439
496
  script += '\n';
440
497
  switch (true) {
441
- case data['error'] !== undefined:
442
- script += await utils.addLog('$cross', data['tool'], data['error'], data['os']);
498
+ case data.error !== undefined:
499
+ script += await utils.addLog('$cross', data.tool, data.error, data.os);
443
500
  break;
444
- case 'phar' === data['type']:
445
- data['url'] = await getUrl(data);
501
+ case 'phar' === data.type:
446
502
  script += await addArchive(data);
447
503
  break;
448
- case 'composer' === data['type']:
504
+ case 'composer' === data.type:
449
505
  script += await addPackage(data);
450
506
  break;
451
- case 'custom-package' === data['type']:
452
- script += await utils.customPackage(data['tool'].split('-')[0], 'tools', data['version'], data['os']);
507
+ case 'custom-package' === data.type:
508
+ script += await utils.customPackage(data.tool.split('-')[0], 'tools', data.version, data.os);
453
509
  break;
454
- case 'custom-function' === data['type']:
455
- script += await exports.functionRecord[data['function']](data);
510
+ case 'custom-function' === data.type:
511
+ if (!data.function) {
512
+ script += await utils.addLog('$cross', data.tool, data.tool + ' has no function defined. Please report this issue.', data.os);
513
+ }
514
+ else {
515
+ script += await exports.functionRecord[data.function](data);
516
+ }
456
517
  break;
457
- case /^none$/.test(data['tool']):
518
+ case /^none$/.test(data.tool):
458
519
  break;
459
520
  default:
460
- script += await utils.addLog('$cross', data['tool'], 'Tool ' + data['tool'] + ' is not supported', data['os']);
521
+ script += await utils.addLog('$cross', data.tool, 'Tool ' + data.tool + ' is not supported', data.os);
461
522
  break;
462
523
  }
463
524
  });