|
1 | | -const Updater = (os, currentVersion) => { |
| 1 | +const Updater = (os, architectureName, currentVersion) => { |
2 | 2 | /** |
3 | | - * Check whether version b is newer than version a |
4 | | - * @param a Version a |
5 | | - * @param b Version b |
6 | | - * @returns {boolean} True if version b is newer than version a, otherwise false |
| 3 | + * Compare two semantic versions |
| 4 | + * @param ver1 Version 1 |
| 5 | + * @param ver2 Version 2 |
| 6 | + * @returns {number} 1 if ver1 > ver2, -1 if ver1 < ver2, 0 if equal |
7 | 7 | */ |
8 | | - const isNewer = (a, b) => { |
9 | | - const partsA = a.split('.'); |
10 | | - const partsB = b.split('.'); |
11 | | - const numParts = |
12 | | - partsA.length > partsB.length ? partsA.length : partsB.length; |
| 8 | + const semverCompare = (ver1, ver2) => { |
| 9 | + const v1Parts = ver1.slice(1).split('.').map(Number); |
| 10 | + const v2Parts = ver2.slice(1).split('.').map(Number); |
13 | 11 |
|
14 | | - for (let i = 0; i < numParts; i += 1) { |
15 | | - if ((parseInt(partsB[i], 10) || 0) !== (parseInt(partsA[i], 10) || 0)) { |
16 | | - return (parseInt(partsB[i], 10) || 0) > (parseInt(partsA[i], 10) || 0); |
17 | | - } |
| 12 | + for (let i = 0; i < 3; i++) { |
| 13 | + if (v1Parts[i] > v2Parts[i]) return 1; |
| 14 | + if (v1Parts[i] < v2Parts[i]) return -1; |
18 | 15 | } |
19 | | - |
20 | | - return false; |
| 16 | + return 0; |
21 | 17 | }; |
22 | 18 |
|
23 | 19 | /** |
24 | | - * Parse the information inside an external update |
25 | | - * @param update The update data |
26 | | - * @returns {{infoUrl: null, updateUrl: boolean, downloadUrl: null, version: null}} |
| 20 | + * Parse the update data |
| 21 | + * @param data The update data |
| 22 | + * @returns {{updateUrl, infoUrl: *, version: SemVer, updateAvailable: boolean}} The parsed update data |
27 | 23 | */ |
28 | | - const parseUpdate = (update) => { |
29 | | - const platform = update.platforms[os]; |
30 | | - const data = { |
31 | | - updateUrl: false, |
32 | | - downloadUrl: null, |
33 | | - infoUrl: null, |
34 | | - version: null, |
35 | | - }; |
| 24 | + const parseUpdate = (data) => { |
| 25 | + const platform = data.platforms.find( |
| 26 | + (p) => p.platformName.toLowerCase() === os.toLowerCase(), |
| 27 | + ); |
| 28 | + if (!platform) { |
| 29 | + throw new Error(`Platform ${os} not found`); |
| 30 | + } |
36 | 31 |
|
37 | | - if ( |
38 | | - isNewer( |
39 | | - currentVersion, |
40 | | - `${platform.version.majorVersion}.${platform.version.minorVersion}.${platform.version.buildVersion}.${platform.version.revisionVersion}`, |
41 | | - ) |
42 | | - ) { |
43 | | - data.updateAvailable = true; |
| 32 | + // Find the architecture |
| 33 | + const architecture = platform.architectures.find( |
| 34 | + (a) => a.name === architectureName, |
| 35 | + ); |
| 36 | + if (!architecture) { |
| 37 | + throw new Error( |
| 38 | + `Architecture ${architectureName} not found for platform ${os}`, |
| 39 | + ); |
44 | 40 | } |
45 | 41 |
|
46 | | - data.updateUrl = platform.updateUrl; |
47 | | - data.infoUrl = platform.infoUrl; |
48 | | - data.version = `${platform.version.majorVersion}.${platform.version.minorVersion}.${platform.version.buildVersion}.${platform.version.revisionVersion}`; |
| 42 | + // Sort releases by semver in descending order |
| 43 | + const sortedReleases = architecture.releases.sort((a, b) => { |
| 44 | + return semverCompare(b.semver, a.semver); |
| 45 | + }); |
49 | 46 |
|
50 | | - return data; |
| 47 | + return { |
| 48 | + updateUrl: sortedReleases[0].downloadUrl, |
| 49 | + infoUrl: sortedReleases[0].infoUrl, |
| 50 | + version: sortedReleases[0].semver, |
| 51 | + updateAvailable: |
| 52 | + semverCompare(currentVersion, sortedReleases[0].semver) < 0, |
| 53 | + }; |
51 | 54 | }; |
52 | 55 |
|
53 | 56 | return new Promise((resolve, reject) => { |
54 | | - fetch('https://codedead.com/Software/Advanced%20PortChecker/version.json') |
| 57 | + fetch( |
| 58 | + 'https://api.codedead.com/api/v1/applications/47cd7e8f-2744-443c-850e-619df5d5c43f', |
| 59 | + ) |
55 | 60 | .then((res) => { |
56 | 61 | if (!res.ok) { |
57 | 62 | throw Error(res.statusText); |
|
0 commit comments