u2a 3.5.2 → 3.5.3
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.
- package/.github/workflows/npm-publish.yml +22 -33
- package/package.json +1 -2
- package/src/commands/configure.js +154 -124
- package/src/utils/appGenerator.js +349 -349
- package/src/utils/builder.js +125 -125
- package/src/utils/logger.js +5 -1
- package/src/utils/noroot.js +41 -41
- package/src/utils/osIntegration.js +187 -187
- package/src/utils/postinstall.js +119 -119
- package/src/utils/sanitize.js +20 -20
- package/src/utils/securexec.js +12 -12
- package/src/utils/settings.js +112 -110
- package/src/utils/versionCheck.js +149 -149
package/src/utils/securexec.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
const { execSync } = require('child_process');
|
|
2
|
-
const { sanitizeCommand } = require('./sanitize');
|
|
3
|
-
|
|
4
|
-
function secureExec(command, options = {}) {
|
|
5
|
-
const sanitizedCommand = sanitizeCommand(command);
|
|
6
|
-
const result = execSync(sanitizedCommand, options);
|
|
7
|
-
|
|
8
|
-
return result;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
module.exports = {
|
|
12
|
-
secureExec
|
|
1
|
+
const { execSync } = require('child_process');
|
|
2
|
+
const { sanitizeCommand } = require('./sanitize');
|
|
3
|
+
|
|
4
|
+
function secureExec(command, options = {}) {
|
|
5
|
+
const sanitizedCommand = sanitizeCommand(command);
|
|
6
|
+
const result = execSync(sanitizedCommand, options);
|
|
7
|
+
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
secureExec
|
|
13
13
|
}
|
package/src/utils/settings.js
CHANGED
|
@@ -1,111 +1,113 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const { SETTINGS_PATH } = require('./config');
|
|
3
|
-
const Logger = require('./logger');
|
|
4
|
-
|
|
5
|
-
const logger = new Logger('settings');
|
|
6
|
-
|
|
7
|
-
const DEFAULT_SETTINGS = {
|
|
8
|
-
send_anon_reports: true,
|
|
9
|
-
version_check: true
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
logger.debug(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
logger.debug(
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const { SETTINGS_PATH } = require('./config');
|
|
3
|
+
const Logger = require('./logger');
|
|
4
|
+
|
|
5
|
+
const logger = new Logger('settings');
|
|
6
|
+
|
|
7
|
+
const DEFAULT_SETTINGS = {
|
|
8
|
+
send_anon_reports: true,
|
|
9
|
+
version_check: true,
|
|
10
|
+
always_show_debug: false,
|
|
11
|
+
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// reset is DANGEROUS ! resets all settings
|
|
15
|
+
function initSettings(reset = false) {
|
|
16
|
+
try {
|
|
17
|
+
let currentSettings = {};
|
|
18
|
+
|
|
19
|
+
if (!reset && fs.existsSync(SETTINGS_PATH)) {
|
|
20
|
+
try {
|
|
21
|
+
currentSettings = JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf8'));
|
|
22
|
+
logger.debug('Existing settings loaded');
|
|
23
|
+
} catch (err) {
|
|
24
|
+
logger.debug(`Error reading existing settings.json, will reinitialize`, err.message);
|
|
25
|
+
currentSettings = {};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (reset) {
|
|
30
|
+
logger.debug('Resetting all settings to default values');
|
|
31
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify({ ...DEFAULT_SETTINGS }, null, 2));
|
|
32
|
+
return { ...DEFAULT_SETTINGS };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const mergedSettings = {};
|
|
36
|
+
|
|
37
|
+
Object.keys(DEFAULT_SETTINGS).forEach(key => {
|
|
38
|
+
mergedSettings[key] = currentSettings[key] !== undefined
|
|
39
|
+
? currentSettings[key]
|
|
40
|
+
: DEFAULT_SETTINGS[key];
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
Object.keys(currentSettings).forEach(key => {
|
|
44
|
+
if (mergedSettings[key] === undefined) {
|
|
45
|
+
mergedSettings[key] = currentSettings[key];
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(mergedSettings, null, 2));
|
|
50
|
+
logger.debug('Settings initialized successfully');
|
|
51
|
+
|
|
52
|
+
return mergedSettings;
|
|
53
|
+
} catch (err) {
|
|
54
|
+
logger.debug(`Error initializing settings.json`, err.message);
|
|
55
|
+
return { ...DEFAULT_SETTINGS };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function getSettings() {
|
|
60
|
+
try {
|
|
61
|
+
if (fs.existsSync(SETTINGS_PATH)) {
|
|
62
|
+
return JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf8'));
|
|
63
|
+
}
|
|
64
|
+
return {};
|
|
65
|
+
} catch (err) {
|
|
66
|
+
logger.debug(`Error reading settings.json`, err.message);
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
function saveSettings(settings) {
|
|
73
|
+
try {
|
|
74
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2));
|
|
75
|
+
logger.debug('Settings saved successfully');
|
|
76
|
+
} catch (err) {
|
|
77
|
+
logger.debug(`Error writing settings.json`, err.message);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
function getSetting(key, defaultValue = null) {
|
|
83
|
+
const settings = getSettings();
|
|
84
|
+
return settings[key] !== undefined ? settings[key] : defaultValue;
|
|
85
|
+
}
|
|
86
|
+
//use : setSetting('version_check', true);
|
|
87
|
+
function setSetting(key, value) {
|
|
88
|
+
const settings = getSettings();
|
|
89
|
+
settings[key] = value;
|
|
90
|
+
saveSettings(settings);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function resetSetting(key) {
|
|
94
|
+
if (!(key in DEFAULT_SETTINGS)) {
|
|
95
|
+
logger.debug(`resetSetting: "${key}" is not a valid default setting key`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const settings = getSettings();
|
|
100
|
+
settings[key] = DEFAULT_SETTINGS[key];
|
|
101
|
+
saveSettings(settings);
|
|
102
|
+
logger.debug(`Setting "${key}" reset to default value`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
module.exports = {
|
|
107
|
+
initSettings,
|
|
108
|
+
getSettings,
|
|
109
|
+
saveSettings,
|
|
110
|
+
getSetting,
|
|
111
|
+
setSetting,
|
|
112
|
+
resetSetting
|
|
111
113
|
};
|
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
const axios = require('axios');
|
|
2
|
-
const { version } = require('../../package.json');
|
|
3
|
-
const Logger = require('./logger');
|
|
4
|
-
const { getSetting } = require('./settings');
|
|
5
|
-
const chalk = require('chalk');
|
|
6
|
-
|
|
7
|
-
const logger = new Logger('version-check');
|
|
8
|
-
|
|
9
|
-
// types of updates based on pattern arount lines 90 of this file
|
|
10
|
-
const UPDATE_TYPES = {
|
|
11
|
-
NONE: 'none',
|
|
12
|
-
SECURITY: 'security',
|
|
13
|
-
CORE: 'core',
|
|
14
|
-
FEATURE: 'feature'
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
async function checkVersion(silent = false, forceCheck = false) {
|
|
18
|
-
//check if version check is enabled in settings
|
|
19
|
-
const versionCheckEnabled = getSetting('version_check');
|
|
20
|
-
|
|
21
|
-
//if version check is disabled and not forcing skip the check (btw idk why i made forcecheck)
|
|
22
|
-
if (!versionCheckEnabled && !forceCheck) {
|
|
23
|
-
logger.debug('Version check is disabled in settings');
|
|
24
|
-
return {
|
|
25
|
-
current: version,
|
|
26
|
-
latest: null,
|
|
27
|
-
needsUpdate: false,
|
|
28
|
-
updateType: UPDATE_TYPES.NONE,
|
|
29
|
-
skipped: true,
|
|
30
|
-
reason: 'version_check disabled in settings'
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
logger.debug('Started version check');
|
|
36
|
-
const response = await axios.get('https://urltoapp.xyz/api/v1/getlastest', {
|
|
37
|
-
timeout: 1000
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const latestVersion = response.data.trim();
|
|
41
|
-
logger.debug(`Version retrieved: ${latestVersion}`);
|
|
42
|
-
|
|
43
|
-
const versionComparison = compareVersions(version, latestVersion);
|
|
44
|
-
const updateType = getUpdateType(version, latestVersion);
|
|
45
|
-
const needsUpdate = versionComparison < 0;
|
|
46
|
-
|
|
47
|
-
if (!silent && needsUpdate) {
|
|
48
|
-
logger.debug(`New update available: ${latestVersion} (${updateType})`);
|
|
49
|
-
console.log('');
|
|
50
|
-
|
|
51
|
-
const updateMessages = {
|
|
52
|
-
[UPDATE_TYPES.SECURITY]: `CRITICAL: Security update (${latestVersion}) available!`,
|
|
53
|
-
[UPDATE_TYPES.CORE]: `IMPORTANT: Core update (${latestVersion}) available!`,
|
|
54
|
-
[UPDATE_TYPES.FEATURE]: `NEW: Feature update (${latestVersion}) available!`
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
if (updateType === UPDATE_TYPES.SECURITY) {
|
|
58
|
-
logger.error(updateMessages[UPDATE_TYPES.SECURITY]); //using .error cuz im lazy to do other variations, sorry ! :)
|
|
59
|
-
} else {
|
|
60
|
-
logger.warn(updateMessages[updateType] || `A new update (${latestVersion}) is available!`);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
logger.warn(`Current version: ${version}`);
|
|
64
|
-
logger.warn(`Update u2a with: ${chalk.underline(`npm install -g u2a@${latestVersion}`)}`);
|
|
65
|
-
|
|
66
|
-
if (updateType === UPDATE_TYPES.SECURITY) {
|
|
67
|
-
logger.error('This update fixes SECURITY VULNERABILITIES and should be installed immediately!');
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
current: version,
|
|
73
|
-
latest: latestVersion,
|
|
74
|
-
needsUpdate,
|
|
75
|
-
updateType,
|
|
76
|
-
updateDetails: needsUpdate ? getUpdateDetails(version, latestVersion) : null,
|
|
77
|
-
skipped: false
|
|
78
|
-
};
|
|
79
|
-
} catch (error) {
|
|
80
|
-
logger.debug(`Version check failed: ${error.message}`);
|
|
81
|
-
return {
|
|
82
|
-
current: version,
|
|
83
|
-
latest: null,
|
|
84
|
-
needsUpdate: false,
|
|
85
|
-
updateType: UPDATE_TYPES.NONE,
|
|
86
|
-
error: error.message,
|
|
87
|
-
skipped: false
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function compareVersions(v1, v2) {
|
|
93
|
-
const parts1 = v1.split('.').map(Number);
|
|
94
|
-
const parts2 = v2.split('.').map(Number);
|
|
95
|
-
|
|
96
|
-
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
97
|
-
const part1 = parts1[i] || 0;
|
|
98
|
-
const part2 = parts2[i] || 0;
|
|
99
|
-
|
|
100
|
-
if (part1 < part2) return -1;
|
|
101
|
-
if (part1 > part2) return 1;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return 0;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function getUpdateType(currentVersion, latestVersion) {
|
|
108
|
-
if (currentVersion === latestVersion) {
|
|
109
|
-
return UPDATE_TYPES.NONE;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const current = currentVersion.split('.').map(Number);
|
|
113
|
-
const latest = latestVersion.split('.').map(Number);
|
|
114
|
-
|
|
115
|
-
/*
|
|
116
|
-
a.b.c format where:
|
|
117
|
-
a: security version
|
|
118
|
-
b: core version
|
|
119
|
-
c: feature version
|
|
120
|
-
eg, 3.4.18 -> security version: 3, core version: 4, feature version: 18
|
|
121
|
-
*/
|
|
122
|
-
|
|
123
|
-
if (latest[0] > current[0]) {
|
|
124
|
-
return UPDATE_TYPES.SECURITY;
|
|
125
|
-
} else if (latest[1] > current[1]) {
|
|
126
|
-
return UPDATE_TYPES.CORE;
|
|
127
|
-
} else if (latest[2] > current[2]) {
|
|
128
|
-
return UPDATE_TYPES.FEATURE;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return UPDATE_TYPES.NONE; //current is newer or same
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
function getUpdateDetails(currentVersion, latestVersion) {
|
|
135
|
-
const current = currentVersion.split('.').map(Number);
|
|
136
|
-
const latest = latestVersion.split('.').map(Number);
|
|
137
|
-
|
|
138
|
-
return {
|
|
139
|
-
securityChanges: latest[0] - current[0],
|
|
140
|
-
coreChanges: latest[1] - current[1],
|
|
141
|
-
featureChanges: latest[2] - current[2],
|
|
142
|
-
fromVersion: currentVersion,
|
|
143
|
-
toVersion: latestVersion
|
|
144
|
-
}; //hard maths up here
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
module.exports = {
|
|
148
|
-
checkVersion,
|
|
149
|
-
UPDATE_TYPES
|
|
1
|
+
const axios = require('axios');
|
|
2
|
+
const { version } = require('../../package.json');
|
|
3
|
+
const Logger = require('./logger');
|
|
4
|
+
const { getSetting } = require('./settings');
|
|
5
|
+
const chalk = require('chalk');
|
|
6
|
+
|
|
7
|
+
const logger = new Logger('version-check');
|
|
8
|
+
|
|
9
|
+
// types of updates based on pattern arount lines 90 of this file
|
|
10
|
+
const UPDATE_TYPES = {
|
|
11
|
+
NONE: 'none',
|
|
12
|
+
SECURITY: 'security',
|
|
13
|
+
CORE: 'core',
|
|
14
|
+
FEATURE: 'feature'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
async function checkVersion(silent = false, forceCheck = false) {
|
|
18
|
+
//check if version check is enabled in settings
|
|
19
|
+
const versionCheckEnabled = getSetting('version_check');
|
|
20
|
+
|
|
21
|
+
//if version check is disabled and not forcing skip the check (btw idk why i made forcecheck)
|
|
22
|
+
if (!versionCheckEnabled && !forceCheck) {
|
|
23
|
+
logger.debug('Version check is disabled in settings');
|
|
24
|
+
return {
|
|
25
|
+
current: version,
|
|
26
|
+
latest: null,
|
|
27
|
+
needsUpdate: false,
|
|
28
|
+
updateType: UPDATE_TYPES.NONE,
|
|
29
|
+
skipped: true,
|
|
30
|
+
reason: 'version_check disabled in settings'
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
logger.debug('Started version check');
|
|
36
|
+
const response = await axios.get('https://urltoapp.xyz/api/v1/getlastest', {
|
|
37
|
+
timeout: 1000
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const latestVersion = response.data.trim();
|
|
41
|
+
logger.debug(`Version retrieved: ${latestVersion}`);
|
|
42
|
+
|
|
43
|
+
const versionComparison = compareVersions(version, latestVersion);
|
|
44
|
+
const updateType = getUpdateType(version, latestVersion);
|
|
45
|
+
const needsUpdate = versionComparison < 0;
|
|
46
|
+
|
|
47
|
+
if (!silent && needsUpdate) {
|
|
48
|
+
logger.debug(`New update available: ${latestVersion} (${updateType})`);
|
|
49
|
+
console.log('');
|
|
50
|
+
|
|
51
|
+
const updateMessages = {
|
|
52
|
+
[UPDATE_TYPES.SECURITY]: `CRITICAL: Security update (${latestVersion}) available!`,
|
|
53
|
+
[UPDATE_TYPES.CORE]: `IMPORTANT: Core update (${latestVersion}) available!`,
|
|
54
|
+
[UPDATE_TYPES.FEATURE]: `NEW: Feature update (${latestVersion}) available!`
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
if (updateType === UPDATE_TYPES.SECURITY) {
|
|
58
|
+
logger.error(updateMessages[UPDATE_TYPES.SECURITY]); //using .error cuz im lazy to do other variations, sorry ! :)
|
|
59
|
+
} else {
|
|
60
|
+
logger.warn(updateMessages[updateType] || `A new update (${latestVersion}) is available!`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
logger.warn(`Current version: ${version}`);
|
|
64
|
+
logger.warn(`Update u2a with: ${chalk.underline(`npm install -g u2a@${latestVersion}`)}`);
|
|
65
|
+
|
|
66
|
+
if (updateType === UPDATE_TYPES.SECURITY) {
|
|
67
|
+
logger.error('This update fixes SECURITY VULNERABILITIES and should be installed immediately!');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
current: version,
|
|
73
|
+
latest: latestVersion,
|
|
74
|
+
needsUpdate,
|
|
75
|
+
updateType,
|
|
76
|
+
updateDetails: needsUpdate ? getUpdateDetails(version, latestVersion) : null,
|
|
77
|
+
skipped: false
|
|
78
|
+
};
|
|
79
|
+
} catch (error) {
|
|
80
|
+
logger.debug(`Version check failed: ${error.message}`);
|
|
81
|
+
return {
|
|
82
|
+
current: version,
|
|
83
|
+
latest: null,
|
|
84
|
+
needsUpdate: false,
|
|
85
|
+
updateType: UPDATE_TYPES.NONE,
|
|
86
|
+
error: error.message,
|
|
87
|
+
skipped: false
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function compareVersions(v1, v2) {
|
|
93
|
+
const parts1 = v1.split('.').map(Number);
|
|
94
|
+
const parts2 = v2.split('.').map(Number);
|
|
95
|
+
|
|
96
|
+
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
97
|
+
const part1 = parts1[i] || 0;
|
|
98
|
+
const part2 = parts2[i] || 0;
|
|
99
|
+
|
|
100
|
+
if (part1 < part2) return -1;
|
|
101
|
+
if (part1 > part2) return 1;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function getUpdateType(currentVersion, latestVersion) {
|
|
108
|
+
if (currentVersion === latestVersion) {
|
|
109
|
+
return UPDATE_TYPES.NONE;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const current = currentVersion.split('.').map(Number);
|
|
113
|
+
const latest = latestVersion.split('.').map(Number);
|
|
114
|
+
|
|
115
|
+
/*
|
|
116
|
+
a.b.c format where:
|
|
117
|
+
a: security version
|
|
118
|
+
b: core version
|
|
119
|
+
c: feature version
|
|
120
|
+
eg, 3.4.18 -> security version: 3, core version: 4, feature version: 18
|
|
121
|
+
*/
|
|
122
|
+
|
|
123
|
+
if (latest[0] > current[0]) {
|
|
124
|
+
return UPDATE_TYPES.SECURITY;
|
|
125
|
+
} else if (latest[1] > current[1]) {
|
|
126
|
+
return UPDATE_TYPES.CORE;
|
|
127
|
+
} else if (latest[2] > current[2]) {
|
|
128
|
+
return UPDATE_TYPES.FEATURE;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return UPDATE_TYPES.NONE; //current is newer or same
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function getUpdateDetails(currentVersion, latestVersion) {
|
|
135
|
+
const current = currentVersion.split('.').map(Number);
|
|
136
|
+
const latest = latestVersion.split('.').map(Number);
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
securityChanges: latest[0] - current[0],
|
|
140
|
+
coreChanges: latest[1] - current[1],
|
|
141
|
+
featureChanges: latest[2] - current[2],
|
|
142
|
+
fromVersion: currentVersion,
|
|
143
|
+
toVersion: latestVersion
|
|
144
|
+
}; //hard maths up here
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
module.exports = {
|
|
148
|
+
checkVersion,
|
|
149
|
+
UPDATE_TYPES
|
|
150
150
|
};
|