Skip to content

Commit 4d3cfaa

Browse files
committed
Fixed support for php-cs-fixer
Added fetch_latest to tools.json. When fetch_latest is true for a tool it will fetch the release.atom for the tool and parse that to get the latest release. Bumped lib version to ES2020 in tsconfig.json for string.matchAll.
1 parent c8b7165 commit 4d3cfaa

File tree

6 files changed

+94
-10
lines changed

6 files changed

+94
-10
lines changed

__tests__/tools.test.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,31 @@ import * as utils from '../src/utils';
33

44
interface IData {
55
tool: string;
6-
version: string;
6+
version?: string;
77
domain?: string;
88
extension?: string;
99
os_version?: string;
1010
php_version?: string;
1111
release?: string;
1212
repository?: string;
1313
type?: string;
14+
fetch_latest?: string;
1415
version_parameter?: string;
1516
version_prefix?: string;
1617
}
1718

1819
function getData(data: IData): Record<string, string> {
1920
return {
2021
tool: data.tool,
21-
version: data.version,
22+
version: data.version || '',
2223
domain: data.domain || 'https://example.com',
2324
extension: data.extension || '.phar',
2425
os_version: data.os_version || 'linux',
2526
php_version: data.php_version || '7.4',
2627
release: data.release || [data.tool, data.version].join(':'),
2728
repository: data.repository || '',
2829
type: data.type || 'phar',
30+
fetch_latest: data.fetch_latest || 'false',
2931
version_parameter: data.version_parameter || '-V',
3032
version_prefix: data.version_prefix || '',
3133
github: 'https://github.com',
@@ -38,7 +40,13 @@ jest
3840
.spyOn(utils, 'fetch')
3941
.mockImplementation(
4042
async (url: string, token?: string): Promise<Record<string, string>> => {
41-
if (!token || token === 'valid_token') {
43+
if (url.includes('atom') && !url.includes('no-release')) {
44+
return {
45+
data: '"releases/tag/1.2.3", "releases/tag/3.2.1", "releases/tag/2.3.1"'
46+
};
47+
} else if (url.includes('no-release')) {
48+
return {data: ''};
49+
} else if (!token || token === 'valid_token') {
4250
return {data: `[{"ref": "refs/tags/1.2.3", "url": "${url}"}]`};
4351
} else if (token === 'beta_token') {
4452
return {data: `[{"ref": "refs/tags/1.2.3-beta1", "url": "${url}"}]`};
@@ -64,6 +72,26 @@ describe('Tools tests', () => {
6472
).toBe(version);
6573
});
6674

75+
it.each`
76+
tool | fetch_latest | version
77+
${'tool'} | ${'true'} | ${'3.2.1'}
78+
${'tool-no-release'} | ${'true'} | ${'latest'}
79+
${'tool'} | ${'false'} | ${'latest'}
80+
`(
81+
'checking getLatestVersion: $tool, $fetch_latest, $version',
82+
async ({tool, fetch_latest, version}) => {
83+
expect(
84+
await tools.getLatestVersion(
85+
getData({
86+
tool: tool,
87+
repository: 'user/' + tool,
88+
fetch_latest: fetch_latest
89+
})
90+
)
91+
).toBe(version);
92+
}
93+
);
94+
6795
it.each`
6896
version | tool | type | expected
6997
${'latest'} | ${'tool'} | ${'phar'} | ${'latest'}
@@ -353,7 +381,7 @@ describe('Tools tests', () => {
353381
'add_tool https://github.com/staabm/annotate-pull-request-from-checkstyle/releases/latest/download/cs2pr cs2pr "-V"',
354382
'add_composertool flex flex symfony/',
355383
'add_grpc_php_plugin latest',
356-
'add_tool https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/latest/download/php-cs-fixer.phar php-cs-fixer "-V"',
384+
'add_tool https://github.com/FriendsOfPHP/PHP-CS-Fixer/releases/download/v3.2.1/php-cs-fixer.phar php-cs-fixer "-V"',
357385
'add_composertool phplint phplint overtrue/',
358386
'add_tool https://github.com/phpstan/phpstan/releases/latest/download/phpstan.phar phpstan "-V"',
359387
'add_tool https://phar.phpunit.de/phpunit.phar phpunit "--version"',

dist/index.js

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
493493
return result;
494494
};
495495
Object.defineProperty(exports, "__esModule", ({ value: true }));
496-
exports.addTools = exports.functionRecord = exports.getData = exports.addWPCLI = exports.addSymfony = exports.addPHPUnitTools = exports.addPhive = exports.addPhing = exports.addPECL = exports.addDevTools = exports.addDeployer = exports.addComposer = exports.addBlackfirePlayer = exports.addPackage = exports.addArchive = exports.getPharUrl = exports.getUrl = exports.filterList = exports.getRelease = exports.getVersion = exports.getSemverVersion = void 0;
496+
exports.addTools = exports.functionRecord = exports.getData = exports.addWPCLI = exports.addSymfony = exports.addPHPUnitTools = exports.addPhive = exports.addPhing = exports.addPECL = exports.addDevTools = exports.addDeployer = exports.addComposer = exports.addBlackfirePlayer = exports.addPackage = exports.addArchive = exports.getPharUrl = exports.getUrl = exports.filterList = exports.getRelease = exports.getVersion = exports.getLatestVersion = exports.getSemverVersion = void 0;
497497
const utils = __importStar(__nccwpck_require__(918));
498498
async function getSemverVersion(data) {
499499
var _a;
@@ -513,6 +513,19 @@ async function getSemverVersion(data) {
513513
}
514514
}
515515
exports.getSemverVersion = getSemverVersion;
516+
async function getLatestVersion(data) {
517+
if (!data['version'] && data['fetch_latest'] === 'false') {
518+
return 'latest';
519+
}
520+
const resp = await utils.fetch(`${data['github']}/${data['repository']}/releases.atom`);
521+
const releases = [
522+
...resp['data'].matchAll(/releases\/tag\/([a-zA-Z]*)?(\d+.\d+.\d+)"/g)
523+
].map(match => match[2]);
524+
return (releases
525+
.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))
526+
.pop() || 'latest');
527+
}
528+
exports.getLatestVersion = getLatestVersion;
516529
async function getVersion(version, data) {
517530
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-]+)*))?$/;
518531
const composer_regex = /^composer:(stable|preview|snapshot|[1|2])$/;
@@ -747,7 +760,7 @@ async function addWPCLI(data) {
747760
}
748761
exports.addWPCLI = addWPCLI;
749762
async function getData(release, php_version, os_version) {
750-
var _a, _b, _c;
763+
var _a, _b, _c, _d;
751764
const json_file = await utils.readFile('tools.json', 'src/configs');
752765
const json_objects = JSON.parse(json_file);
753766
release = release.replace(/\s+/g, '');
@@ -783,10 +796,13 @@ async function getData(release, php_version, os_version) {
783796
data['php_version'] = php_version;
784797
data['prefix'] = data['github'] === data['domain'] ? 'releases' : '';
785798
data['verb'] = data['github'] === data['domain'] ? 'download' : '';
799+
(_c = data['fetch_latest']) !== null && _c !== void 0 ? _c : (data['fetch_latest'] = 'false');
786800
data['version_parameter'] = JSON.stringify(data['version_parameter']) || '';
787-
(_c = data['version_prefix']) !== null && _c !== void 0 ? _c : (data['version_prefix'] = '');
801+
(_d = data['version_prefix']) !== null && _d !== void 0 ? _d : (data['version_prefix'] = '');
788802
data['release'] = await getRelease(release, data);
789-
data['version'] = version ? await getVersion(version, data) : 'latest';
803+
data['version'] = version
804+
? await getVersion(version, data)
805+
: await getLatestVersion(data);
790806
return data;
791807
}
792808
exports.getData = getData;

src/configs/tools.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"repository": "FriendsOfPHP/PHP-CS-Fixer",
3737
"extension": ".phar",
3838
"domain": "https://github.com",
39+
"fetch_latest": "true",
3940
"version_prefix": "v",
4041
"version_parameter": "-V"
4142
},

src/configs/tools_schema.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"alias": "tool_alias",
1111
"domain": "https://example.com",
1212
"extension": ".ext",
13+
"fetch_latest": "true",
1314
"function": "function_name",
1415
"repository": "user/tool",
1516
"type": "phar, composer, custom-package or custom-function",
@@ -47,6 +48,16 @@
4748
".ext"
4849
]
4950
},
51+
"fetch_latest": {
52+
"$id": "#/items/properties/fetch_latest",
53+
"type": "string",
54+
"title": "The fetch_latest schema",
55+
"description": "Fetch the latest version from GitHub releases.",
56+
"enum": [
57+
"true",
58+
"false"
59+
]
60+
},
5061
"function": {
5162
"$id": "#/items/properties/function",
5263
"type": "string",

src/tools.ts

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,31 @@ export async function getSemverVersion(data: RS): Promise<string> {
3131
}
3232
}
3333

34+
/**
35+
* Function to get latest version from releases.atom
36+
*
37+
* @param data
38+
*/
39+
export async function getLatestVersion(data: RS): Promise<string> {
40+
if (!data['version'] && data['fetch_latest'] === 'false') {
41+
return 'latest';
42+
}
43+
const resp: Record<string, string> = await utils.fetch(
44+
`${data['github']}/${data['repository']}/releases.atom`
45+
);
46+
const releases: string[] = [
47+
...resp['data'].matchAll(/releases\/tag\/([a-zA-Z]*)?(\d+.\d+.\d+)"/g)
48+
].map(match => match[2]);
49+
50+
return (
51+
releases
52+
.sort((a: string, b: string) =>
53+
a.localeCompare(b, undefined, {numeric: true})
54+
)
55+
.pop() || 'latest'
56+
);
57+
}
58+
3459
/**
3560
* Function to get tool version
3661
*
@@ -423,10 +448,13 @@ export async function getData(
423448
data['php_version'] = php_version;
424449
data['prefix'] = data['github'] === data['domain'] ? 'releases' : '';
425450
data['verb'] = data['github'] === data['domain'] ? 'download' : '';
451+
data['fetch_latest'] ??= 'false';
426452
data['version_parameter'] = JSON.stringify(data['version_parameter']) || '';
427453
data['version_prefix'] ??= '';
428454
data['release'] = await getRelease(release, data);
429-
data['version'] = version ? await getVersion(version, data) : 'latest';
455+
data['version'] = version
456+
? await getVersion(version, data)
457+
: await getLatestVersion(data);
430458
return data;
431459
}
432460

tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"compilerOptions": {
33
"esModuleInterop": true,
44
"lib": [
5-
"ES2019"
5+
"ES2020"
66
],
77
"module": "commonjs",
88
"moduleResolution": "node",

0 commit comments

Comments
 (0)