u2a 3.4.20 → 3.5.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.
- package/package.json +4 -2
- package/src/commands/configure.js +125 -0
- package/src/index.js +8 -0
- package/src/utils/config.js +6 -0
- package/src/utils/logger.js +16 -2
- package/src/utils/postinstall.js +120 -0
- package/src/utils/settings.js +111 -0
- package/src/utils/versionCheck.js +35 -16
package/package.json
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "u2a",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.1",
|
|
4
4
|
"description": "URL to App - Turn any URL into a desktop application",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"u2a": "src/index.js"
|
|
8
8
|
},
|
|
9
9
|
"scripts": {
|
|
10
|
-
"start": "node src/index.js"
|
|
10
|
+
"start": "node src/index.js",
|
|
11
|
+
"debug": "set DEBUG=1 && node src/index.js",
|
|
12
|
+
"postinstall": "node src/utils/postinstall.js"
|
|
11
13
|
},
|
|
12
14
|
"keywords": [
|
|
13
15
|
"cli",
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
const Logger = require('../utils/logger');
|
|
2
|
+
const chalk = require('chalk');
|
|
3
|
+
const { initSettings, getSetting, setSetting, resetSetting, DEFAULT_SETTINGS } = require('../utils/settings');
|
|
4
|
+
const inquirer = require('inquirer');
|
|
5
|
+
|
|
6
|
+
const logger = new Logger('configure');
|
|
7
|
+
|
|
8
|
+
function configureReports(action) {
|
|
9
|
+
try {
|
|
10
|
+
if (action === 'status') {
|
|
11
|
+
const status = getSetting('send_anon_reports');
|
|
12
|
+
logger.info(`Anonymous reports are currently ${status ? chalk.green('enabled') : chalk.yellow('disabled')}`);
|
|
13
|
+
logger.info(`Default setting is: ${DEFAULT_SETTINGS.send_anon_reports ? chalk.green('enabled') : chalk.yellow('disabled')}`);
|
|
14
|
+
return;
|
|
15
|
+
} else if (action === 'enable') {
|
|
16
|
+
setSetting('send_anon_reports', true);
|
|
17
|
+
logger.info(chalk.green('Anonymous reports have been enabled'));
|
|
18
|
+
} else if (action === 'disable') {
|
|
19
|
+
setSetting('send_anon_reports', false);
|
|
20
|
+
logger.info(chalk.yellow('Anonymous reports have been disabled'));
|
|
21
|
+
} else if (action === 'reset') {
|
|
22
|
+
resetSetting('send_anon_reports');
|
|
23
|
+
logger.info(`Anonymous reports have been resetted to: ${DEFAULT_SETTINGS.send_anon_reports ? chalk.green('enabled') : chalk.yellow('disabled')}`);
|
|
24
|
+
} else {
|
|
25
|
+
logger.error(`Invalid action: ${action}`);
|
|
26
|
+
logger.info('Available actions: status, enable, disable, reset');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
} catch (err) {
|
|
30
|
+
logger.error(`Error configuring reports`, err.message);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function configureVersionCheck(action) {
|
|
35
|
+
try {
|
|
36
|
+
if (action === 'status') {
|
|
37
|
+
const status = getSetting('version_check');
|
|
38
|
+
logger.info(`Version check is currently ${status ? chalk.green('enabled') : chalk.yellow('disabled')}`);
|
|
39
|
+
logger.info(`Default setting is: ${DEFAULT_SETTINGS.version_check ? chalk.green('enabled') : chalk.yellow('disabled')}`);
|
|
40
|
+
return;
|
|
41
|
+
} else if (action === 'enable') {
|
|
42
|
+
setSetting('version_check', true);
|
|
43
|
+
logger.info(chalk.green('Version check has been enabled'));
|
|
44
|
+
} else if (action === 'disable') {
|
|
45
|
+
setSetting('version_check', false);
|
|
46
|
+
logger.info(chalk.yellow('Version check has been disabled'));
|
|
47
|
+
} else if (action === 'reset') {
|
|
48
|
+
resetSetting('version_check');
|
|
49
|
+
logger.info(`Version check has been resetted to: ${DEFAULT_SETTINGS.send_anon_reports ? chalk.green('enabled') : chalk.yellow('disabled')}`);
|
|
50
|
+
} else {
|
|
51
|
+
logger.error(`Invalid action: ${action}`);
|
|
52
|
+
logger.info('Available actions: status, enable, disable, reset');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
} catch (err) {
|
|
56
|
+
logger.error(`Error configuring version check`, err.message);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function resetSettings(action) {
|
|
61
|
+
try {
|
|
62
|
+
if (action === 'reset') {
|
|
63
|
+
const answer = await inquirer.prompt([
|
|
64
|
+
{
|
|
65
|
+
type: 'confirm',
|
|
66
|
+
name: 'confirm',
|
|
67
|
+
message: `Are you sure you want to reset all settings to default?`,
|
|
68
|
+
default: false
|
|
69
|
+
}
|
|
70
|
+
]);
|
|
71
|
+
|
|
72
|
+
if (!answer.confirm) {
|
|
73
|
+
logger.info('Operation canceled');
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
initSettings(true);
|
|
78
|
+
logger.info(chalk.green('All settings have been reset'));
|
|
79
|
+
return;
|
|
80
|
+
} else {
|
|
81
|
+
logger.error(`Invalid action: ${action}`);
|
|
82
|
+
logger.info('Available actions: reset');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
} catch (err) {
|
|
86
|
+
logger.error(`Error resetting settings`, err.message);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function configure(category, action) {
|
|
91
|
+
if (!category || !action) {
|
|
92
|
+
logger.error('Missing category or action');
|
|
93
|
+
logger.info('Usage: u2a configure [category] [action]');
|
|
94
|
+
logger.info('Available categories:');
|
|
95
|
+
logger.info(' reports - Configure anonymous usage reports');
|
|
96
|
+
logger.info(' settings - Resets settings (only reset action)');
|
|
97
|
+
logger.info(' vcheck - Configure automatic version check');
|
|
98
|
+
logger.info('Available actions:');
|
|
99
|
+
logger.info(' status - Check current status');
|
|
100
|
+
logger.info(' enable - Enable specified category');
|
|
101
|
+
logger.info(' disable - Disable specified category');
|
|
102
|
+
logger.info(' reset - Resets specified category to default');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
switch (category) {
|
|
107
|
+
case 'reports':
|
|
108
|
+
configureReports(action);
|
|
109
|
+
break;
|
|
110
|
+
case 'vcheck':
|
|
111
|
+
configureVersionCheck(action);
|
|
112
|
+
break;
|
|
113
|
+
case 'settings':
|
|
114
|
+
await resetSettings(action);
|
|
115
|
+
break;
|
|
116
|
+
default:
|
|
117
|
+
logger.error(`Unknown configuration category: ${category}`);
|
|
118
|
+
logger.info('Available categories: reports, vcheck, settings');
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
module.exports = {
|
|
124
|
+
configure
|
|
125
|
+
};
|
package/src/index.js
CHANGED
|
@@ -11,6 +11,7 @@ const { program } = require('commander');
|
|
|
11
11
|
const { createApp } = require('./commands/create');
|
|
12
12
|
const { listApps } = require('./commands/list');
|
|
13
13
|
const { removeApp } = require('./commands/remove');
|
|
14
|
+
const { configure } = require('./commands/configure');
|
|
14
15
|
const { version } = require('../package.json');
|
|
15
16
|
const { setupConfig } = require('./utils/config');
|
|
16
17
|
const { checkNotRoot } = require('./utils/noroot');
|
|
@@ -50,6 +51,13 @@ setupConfig();
|
|
|
50
51
|
.description('Remove an existing application')
|
|
51
52
|
.action(removeApp);
|
|
52
53
|
|
|
54
|
+
program
|
|
55
|
+
.command('configure [category] [action]')
|
|
56
|
+
.description('Configure application settings')
|
|
57
|
+
.action((category, action) => {
|
|
58
|
+
configure(category, action);
|
|
59
|
+
});
|
|
60
|
+
|
|
53
61
|
program.on('command:*', () => {
|
|
54
62
|
console.error(`\nInvalid command: ${program.args.join(' ')}`);
|
|
55
63
|
console.log(`\nUse --help to see the list of available commands.`);
|
package/src/utils/config.js
CHANGED
|
@@ -6,6 +6,7 @@ const CONFIG_DIR = path.join(os.homedir(), '.u2a');
|
|
|
6
6
|
const APPS_DIR = path.join(CONFIG_DIR, 'apps');
|
|
7
7
|
const LOGS_DIR = path.join(CONFIG_DIR, 'logs');
|
|
8
8
|
const DB_PATH = path.join(CONFIG_DIR, 'db.json');
|
|
9
|
+
const SETTINGS_PATH = path.join(CONFIG_DIR, 'settings.json');
|
|
9
10
|
|
|
10
11
|
function setupConfig() {
|
|
11
12
|
if (!fs.existsSync(CONFIG_DIR)) {
|
|
@@ -20,6 +21,9 @@ function setupConfig() {
|
|
|
20
21
|
if (!fs.existsSync(DB_PATH)) {
|
|
21
22
|
fs.writeFileSync(DB_PATH, JSON.stringify({}, null, 2));
|
|
22
23
|
}
|
|
24
|
+
if (!fs.existsSync(SETTINGS_PATH)) {
|
|
25
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify({}, null, 2));
|
|
26
|
+
}
|
|
23
27
|
}
|
|
24
28
|
|
|
25
29
|
function readDB() {
|
|
@@ -41,6 +45,8 @@ module.exports = {
|
|
|
41
45
|
CONFIG_DIR,
|
|
42
46
|
APPS_DIR,
|
|
43
47
|
LOGS_DIR,
|
|
48
|
+
DB_PATH,
|
|
49
|
+
SETTINGS_PATH,
|
|
44
50
|
setupConfig,
|
|
45
51
|
readDB,
|
|
46
52
|
writeDB,
|
package/src/utils/logger.js
CHANGED
|
@@ -3,6 +3,18 @@ const path = require('path');
|
|
|
3
3
|
const chalk = require('chalk');
|
|
4
4
|
const { LOGS_DIR } = require('./config');
|
|
5
5
|
|
|
6
|
+
/*
|
|
7
|
+
To use:
|
|
8
|
+
const Logger = require('./logger');
|
|
9
|
+
const logger = new Logger('name');
|
|
10
|
+
|
|
11
|
+
//then
|
|
12
|
+
logger.info('information');
|
|
13
|
+
logger.warn('warning');
|
|
14
|
+
logger.error('error message', 'error');
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
|
|
6
18
|
class Logger {
|
|
7
19
|
constructor(component) {
|
|
8
20
|
this.component = component;
|
|
@@ -50,8 +62,10 @@ class Logger {
|
|
|
50
62
|
}
|
|
51
63
|
}
|
|
52
64
|
|
|
53
|
-
debug(message) {
|
|
54
|
-
|
|
65
|
+
debug(message, msg2 = '') {
|
|
66
|
+
// i added msg2 cuz some parts of the code are using it, idk why
|
|
67
|
+
const formattedMessage = this._format('DEBUG', `${message}${msg2 ? ' ' + msg2 : ''}`);
|
|
68
|
+
|
|
55
69
|
if (process.env.DEBUG) {
|
|
56
70
|
console.log(chalk.gray(formattedMessage));
|
|
57
71
|
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
const axios = require('axios');
|
|
4
|
+
const Logger = require('./logger');
|
|
5
|
+
const { setupConfig, CONFIG_DIR } = require('./config');
|
|
6
|
+
const { initSettings, getSetting } = require('./settings');
|
|
7
|
+
|
|
8
|
+
setupConfig(); // builds ~/.u2a/*
|
|
9
|
+
|
|
10
|
+
const logger = new Logger('postinstall');
|
|
11
|
+
const postinstallJsonPath = path.join(CONFIG_DIR, 'postinstall.json');
|
|
12
|
+
let isUpgrade = false;
|
|
13
|
+
let currentVersion = '0.0.0'; //0.0.0 for new installations
|
|
14
|
+
let sendAnonReports = true; // u2a configure reports disable to disable
|
|
15
|
+
|
|
16
|
+
const formatVersionLine = (label, version) => {
|
|
17
|
+
// calculates how many spaces we need after the version to have a correct formatting
|
|
18
|
+
const baseLength = `; ${label}: `.length + version.length;
|
|
19
|
+
const spaceCount = Math.max(0, 30 - baseLength);
|
|
20
|
+
const spaces = ' '.repeat(spaceCount);
|
|
21
|
+
|
|
22
|
+
return `; ${label}: ${version}${spaces};`;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
async function run() {
|
|
26
|
+
//check if postinstall.json exists (exists -> update, doesnt -> new install)
|
|
27
|
+
if (fs.existsSync(postinstallJsonPath)) {
|
|
28
|
+
try {
|
|
29
|
+
const postinstallData = JSON.parse(fs.readFileSync(postinstallJsonPath, 'utf8'));
|
|
30
|
+
currentVersion = postinstallData.version || '';
|
|
31
|
+
isUpgrade = true;
|
|
32
|
+
|
|
33
|
+
let newVersion = '';
|
|
34
|
+
try {
|
|
35
|
+
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
|
|
36
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
37
|
+
newVersion = packageJson.version || '';
|
|
38
|
+
} catch (err) {
|
|
39
|
+
logger.error(`Error reading package.json for display`, err.message);
|
|
40
|
+
newVersion = 'unknown';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
logger.info(';=============================;');
|
|
44
|
+
logger.info('; u2a has been updated! ;');
|
|
45
|
+
logger.info('; Successfully migrated from ;');
|
|
46
|
+
logger.info(formatVersionLine('Old version', currentVersion));
|
|
47
|
+
logger.info(formatVersionLine('New version', newVersion));
|
|
48
|
+
logger.info(';=============================;');
|
|
49
|
+
|
|
50
|
+
initSettings();
|
|
51
|
+
} catch (err) {
|
|
52
|
+
logger.error(`Error reading postinstall.json`, err.message);
|
|
53
|
+
isUpgrade = false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const sendAnonReports = getSetting('send_anon_reports');
|
|
58
|
+
|
|
59
|
+
// shows this cool message if it isnt an upgrade
|
|
60
|
+
if (!isUpgrade) {
|
|
61
|
+
logger.info(';=============================;');
|
|
62
|
+
logger.info('; Welcome to u2a ! ;');
|
|
63
|
+
logger.info('; Thanks for downloading this ;');
|
|
64
|
+
logger.info('; tool ! ;');
|
|
65
|
+
logger.info('; ;');
|
|
66
|
+
logger.info('; Create a local webapp with ;');
|
|
67
|
+
logger.info('; \'u2a create <url/domain>\' ;');
|
|
68
|
+
logger.info('; ;');
|
|
69
|
+
logger.info('; Check docs.urltoapp.xyz for ;');
|
|
70
|
+
logger.info('; more detailed usage. ;');
|
|
71
|
+
logger.info('; ;');
|
|
72
|
+
logger.info('; Note: Anonymous installs ;');
|
|
73
|
+
logger.info('; reports are enabled by ;');
|
|
74
|
+
logger.info('; default. To disable: ;');
|
|
75
|
+
logger.info('; \'u2a configure reports ;');
|
|
76
|
+
logger.info('; disable\' ;');
|
|
77
|
+
logger.info(';=============================;');
|
|
78
|
+
|
|
79
|
+
initSettings(true);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
|
|
83
|
+
let newVersion = '';
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
87
|
+
newVersion = packageJson.version || '';
|
|
88
|
+
} catch (err) {
|
|
89
|
+
logger.error(`Error reading package.json`, err.message);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (sendAnonReports) {
|
|
93
|
+
try {
|
|
94
|
+
|
|
95
|
+
const params = new URLSearchParams({
|
|
96
|
+
previousVersion: currentVersion,
|
|
97
|
+
newVersion: newVersion
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
// backend here https://github.com/url2app/urltoapp.xyz/blob/main/api/v1/api/reports.php
|
|
101
|
+
await axios.get(`https://urltoapp.xyz/api/v1/reports?${params.toString()}`);
|
|
102
|
+
logger.debug('Anonymous usage report sent');
|
|
103
|
+
} catch (err) {
|
|
104
|
+
logger.debug(`Failed to send anonymous report: ${err.message}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
try {
|
|
109
|
+
fs.writeFileSync(postinstallJsonPath, JSON.stringify({
|
|
110
|
+
version: newVersion,
|
|
111
|
+
installed_at: new Date().toISOString()
|
|
112
|
+
}, null, 2));
|
|
113
|
+
} catch (err) {
|
|
114
|
+
logger.error(`Error updating postinstall.json`, err.message);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
run().catch(err => {
|
|
119
|
+
logger.error(`Unexpected error`, err.message);
|
|
120
|
+
});
|
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
// reset is DANGEROUS ! resets all settings
|
|
13
|
+
function initSettings(reset = false) {
|
|
14
|
+
try {
|
|
15
|
+
let currentSettings = {};
|
|
16
|
+
|
|
17
|
+
if (!reset && fs.existsSync(SETTINGS_PATH)) {
|
|
18
|
+
try {
|
|
19
|
+
currentSettings = JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf8'));
|
|
20
|
+
logger.debug('Existing settings loaded');
|
|
21
|
+
} catch (err) {
|
|
22
|
+
logger.debug(`Error reading existing settings.json, will reinitialize`, err.message);
|
|
23
|
+
currentSettings = {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (reset) {
|
|
28
|
+
logger.debug('Resetting all settings to default values');
|
|
29
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify({ ...DEFAULT_SETTINGS }, null, 2));
|
|
30
|
+
return { ...DEFAULT_SETTINGS };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const mergedSettings = {};
|
|
34
|
+
|
|
35
|
+
Object.keys(DEFAULT_SETTINGS).forEach(key => {
|
|
36
|
+
mergedSettings[key] = currentSettings[key] !== undefined
|
|
37
|
+
? currentSettings[key]
|
|
38
|
+
: DEFAULT_SETTINGS[key];
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
Object.keys(currentSettings).forEach(key => {
|
|
42
|
+
if (mergedSettings[key] === undefined) {
|
|
43
|
+
mergedSettings[key] = currentSettings[key];
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(mergedSettings, null, 2));
|
|
48
|
+
logger.debug('Settings initialized successfully');
|
|
49
|
+
|
|
50
|
+
return mergedSettings;
|
|
51
|
+
} catch (err) {
|
|
52
|
+
logger.debug(`Error initializing settings.json`, err.message);
|
|
53
|
+
return { ...DEFAULT_SETTINGS };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function getSettings() {
|
|
58
|
+
try {
|
|
59
|
+
if (fs.existsSync(SETTINGS_PATH)) {
|
|
60
|
+
return JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf8'));
|
|
61
|
+
}
|
|
62
|
+
return {};
|
|
63
|
+
} catch (err) {
|
|
64
|
+
logger.debug(`Error reading settings.json`, err.message);
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
function saveSettings(settings) {
|
|
71
|
+
try {
|
|
72
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2));
|
|
73
|
+
logger.debug('Settings saved successfully');
|
|
74
|
+
} catch (err) {
|
|
75
|
+
logger.debug(`Error writing settings.json`, err.message);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
function getSetting(key, defaultValue = null) {
|
|
81
|
+
const settings = getSettings();
|
|
82
|
+
return settings[key] !== undefined ? settings[key] : defaultValue;
|
|
83
|
+
}
|
|
84
|
+
//use : setSetting('version_check', true);
|
|
85
|
+
function setSetting(key, value) {
|
|
86
|
+
const settings = getSettings();
|
|
87
|
+
settings[key] = value;
|
|
88
|
+
saveSettings(settings);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function resetSetting(key) {
|
|
92
|
+
if (!(key in DEFAULT_SETTINGS)) {
|
|
93
|
+
logger.debug(`resetSetting: "${key}" is not a valid default setting key`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const settings = getSettings();
|
|
98
|
+
settings[key] = DEFAULT_SETTINGS[key];
|
|
99
|
+
saveSettings(settings);
|
|
100
|
+
logger.debug(`Setting "${key}" reset to default value`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
module.exports = {
|
|
105
|
+
initSettings,
|
|
106
|
+
getSettings,
|
|
107
|
+
saveSettings,
|
|
108
|
+
getSetting,
|
|
109
|
+
setSetting,
|
|
110
|
+
resetSetting
|
|
111
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const axios = require('axios');
|
|
2
2
|
const { version } = require('../../package.json');
|
|
3
3
|
const Logger = require('./logger');
|
|
4
|
+
const { getSetting } = require('./settings');
|
|
4
5
|
|
|
5
6
|
const logger = new Logger('version-check');
|
|
6
7
|
|
|
@@ -12,7 +13,23 @@ const UPDATE_TYPES = {
|
|
|
12
13
|
FEATURE: 'feature'
|
|
13
14
|
};
|
|
14
15
|
|
|
15
|
-
async function checkVersion(silent = false) {
|
|
16
|
+
async function checkVersion(silent = false, forceCheck = false) {
|
|
17
|
+
//check if version check is enabled in settings
|
|
18
|
+
const versionCheckEnabled = getSetting('version_check');
|
|
19
|
+
|
|
20
|
+
//if version check is disabled and not forcing skip the check (btw idk why i made forcecheck)
|
|
21
|
+
if (!versionCheckEnabled && !forceCheck) {
|
|
22
|
+
logger.debug('Version check is disabled in settings');
|
|
23
|
+
return {
|
|
24
|
+
current: version,
|
|
25
|
+
latest: null,
|
|
26
|
+
needsUpdate: false,
|
|
27
|
+
updateType: UPDATE_TYPES.NONE,
|
|
28
|
+
skipped: true,
|
|
29
|
+
reason: 'version_check disabled in settings'
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
16
33
|
try {
|
|
17
34
|
logger.debug('Started version check');
|
|
18
35
|
const response = await axios.get('https://urltoapp.xyz/api/v1/getlastest', {
|
|
@@ -21,7 +38,7 @@ async function checkVersion(silent = false) {
|
|
|
21
38
|
|
|
22
39
|
const latestVersion = response.data.trim();
|
|
23
40
|
logger.debug(`Version retrieved: ${latestVersion}`);
|
|
24
|
-
|
|
41
|
+
|
|
25
42
|
const versionComparison = compareVersions(version, latestVersion);
|
|
26
43
|
const updateType = getUpdateType(version, latestVersion);
|
|
27
44
|
const needsUpdate = versionComparison < 0;
|
|
@@ -29,22 +46,22 @@ async function checkVersion(silent = false) {
|
|
|
29
46
|
if (!silent && needsUpdate) {
|
|
30
47
|
logger.debug(`New update available: ${latestVersion} (${updateType})`);
|
|
31
48
|
console.log('');
|
|
32
|
-
|
|
49
|
+
|
|
33
50
|
const updateMessages = {
|
|
34
51
|
[UPDATE_TYPES.SECURITY]: `CRITICAL: Security update (${latestVersion}) available!`,
|
|
35
52
|
[UPDATE_TYPES.CORE]: `IMPORTANT: Core update (${latestVersion}) available!`,
|
|
36
53
|
[UPDATE_TYPES.FEATURE]: `NEW: Feature update (${latestVersion}) available!`
|
|
37
54
|
};
|
|
38
|
-
|
|
55
|
+
|
|
39
56
|
if (updateType === UPDATE_TYPES.SECURITY) {
|
|
40
57
|
logger.error(updateMessages[UPDATE_TYPES.SECURITY]); //using .error cuz im lazy to do other variations, sorry ! :)
|
|
41
58
|
} else {
|
|
42
59
|
logger.warn(updateMessages[updateType] || `A new update (${latestVersion}) is available!`);
|
|
43
60
|
}
|
|
44
|
-
|
|
61
|
+
|
|
45
62
|
logger.warn(`Current version: ${version}`);
|
|
46
63
|
logger.warn(`Update u2a with: npm install -g u2a@${latestVersion}`);
|
|
47
|
-
|
|
64
|
+
|
|
48
65
|
if (updateType === UPDATE_TYPES.SECURITY) {
|
|
49
66
|
logger.error('This update fixes SECURITY VULNERABILITIES and should be installed immediately!');
|
|
50
67
|
}
|
|
@@ -55,15 +72,18 @@ async function checkVersion(silent = false) {
|
|
|
55
72
|
latest: latestVersion,
|
|
56
73
|
needsUpdate,
|
|
57
74
|
updateType,
|
|
58
|
-
updateDetails: needsUpdate ? getUpdateDetails(version, latestVersion) : null
|
|
75
|
+
updateDetails: needsUpdate ? getUpdateDetails(version, latestVersion) : null,
|
|
76
|
+
skipped: false
|
|
59
77
|
};
|
|
60
78
|
} catch (error) {
|
|
79
|
+
logger.debug(`Version check failed: ${error.message}`);
|
|
61
80
|
return {
|
|
62
81
|
current: version,
|
|
63
82
|
latest: null,
|
|
64
83
|
needsUpdate: false,
|
|
65
84
|
updateType: UPDATE_TYPES.NONE,
|
|
66
|
-
error: error.message
|
|
85
|
+
error: error.message,
|
|
86
|
+
skipped: false
|
|
67
87
|
};
|
|
68
88
|
}
|
|
69
89
|
}
|
|
@@ -71,15 +91,15 @@ async function checkVersion(silent = false) {
|
|
|
71
91
|
function compareVersions(v1, v2) {
|
|
72
92
|
const parts1 = v1.split('.').map(Number);
|
|
73
93
|
const parts2 = v2.split('.').map(Number);
|
|
74
|
-
|
|
94
|
+
|
|
75
95
|
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
76
96
|
const part1 = parts1[i] || 0;
|
|
77
97
|
const part2 = parts2[i] || 0;
|
|
78
|
-
|
|
98
|
+
|
|
79
99
|
if (part1 < part2) return -1;
|
|
80
100
|
if (part1 > part2) return 1;
|
|
81
101
|
}
|
|
82
|
-
|
|
102
|
+
|
|
83
103
|
return 0;
|
|
84
104
|
}
|
|
85
105
|
|
|
@@ -87,10 +107,10 @@ function getUpdateType(currentVersion, latestVersion) {
|
|
|
87
107
|
if (currentVersion === latestVersion) {
|
|
88
108
|
return UPDATE_TYPES.NONE;
|
|
89
109
|
}
|
|
90
|
-
|
|
110
|
+
|
|
91
111
|
const current = currentVersion.split('.').map(Number);
|
|
92
112
|
const latest = latestVersion.split('.').map(Number);
|
|
93
|
-
|
|
113
|
+
|
|
94
114
|
/*
|
|
95
115
|
a.b.c format where:
|
|
96
116
|
a: security version
|
|
@@ -106,15 +126,14 @@ function getUpdateType(currentVersion, latestVersion) {
|
|
|
106
126
|
} else if (latest[2] > current[2]) {
|
|
107
127
|
return UPDATE_TYPES.FEATURE;
|
|
108
128
|
}
|
|
109
|
-
|
|
129
|
+
|
|
110
130
|
return UPDATE_TYPES.NONE; //current is newer or same
|
|
111
131
|
}
|
|
112
132
|
|
|
113
|
-
|
|
114
133
|
function getUpdateDetails(currentVersion, latestVersion) {
|
|
115
134
|
const current = currentVersion.split('.').map(Number);
|
|
116
135
|
const latest = latestVersion.split('.').map(Number);
|
|
117
|
-
|
|
136
|
+
|
|
118
137
|
return {
|
|
119
138
|
securityChanges: latest[0] - current[0],
|
|
120
139
|
coreChanges: latest[1] - current[1],
|