diff --git a/modules/config/config-inquirer.js b/modules/config/config-inquirer.js index a7a4a88..aad0734 100644 --- a/modules/config/config-inquirer.js +++ b/modules/config/config-inquirer.js @@ -7,10 +7,7 @@ const auth = require('../../src/util/auth'); const br = require('os').EOL; const Joi = require('joi'); -let defaults; -(async () => { - defaults = await require('../defaults').setup({}); -})(); +const defaults = require('../defaults').getDefaults(); exports.addKey = function(current, filepath, callback) { if (!filepath) { diff --git a/modules/defaults.js b/modules/defaults.js index fd97874..796ab2f 100644 --- a/modules/defaults.js +++ b/modules/defaults.js @@ -3,85 +3,85 @@ const path = require('path'); const Joi = require('joi'); const globals = require('../src/global'); +const storageJoi = Joi.object({ + albumArtDirectory: Joi.string().default(path.join(__dirname, '../image-cache')), + dbDirectory: Joi.string().default(path.join(__dirname, '../save/db')), + logsDirectory: Joi.string().default(path.join(__dirname, '../save/logs')), + syncConfigDirectory: Joi.string().default(path.join(__dirname, '../save/sync')), +}); + +const scanOptions = Joi.object({ + skipImg: Joi.boolean().default(false), + scanInterval: Joi.number().default(24), + saveInterval: Joi.number().default(250), + pause: Joi.number().default(0), + bootScanDelay: Joi.number().default(3), + maxConcurrentTasks: Joi.number().integer().min(1).default(1) +}); + +const schema = Joi.object({ + autoboot: Joi.boolean().optional(), + address: Joi.string().ip({ cidr: 'forbidden' }).default('0.0.0.0'), + port: Joi.number().default(3000), + newWebApp: Joi.boolean().default(false), + supportedAudioFiles: Joi.object().pattern( + Joi.string(), Joi.boolean() + ).default({ + "mp3": true, "flac": true, "wav": true, + "ogg": true, "aac": true, "m4a": true, + "opus": true, "m3u": false + }), + scanOptions: scanOptions.default(scanOptions.validate({}).value), + noUpload: Joi.boolean().default(false), + writeLogs: Joi.boolean().default(false), + storage: storageJoi.default(storageJoi.validate({}).value), + webAppDirectory: Joi.string().default(path.join(__dirname, '../public')), + ddns: Joi.object({ + iniFile: Joi.string().default(path.join(__dirname, `../frp/frps.ini`)), + email: Joi.string().allow('').optional(), + password: Joi.string().allow('').optional(), + tested: Joi.boolean().optional(), + token: Joi.string().optional(), + url: Joi.string().optional(), + }), + transcode: Joi.object({ + enabled: Joi.boolean().default(false), + ffmpegDirectory: Joi.string().default(path.join(__dirname, '../bin/ffmpeg')), + defaultCodec: Joi.string().valid('mp3', 'opus', 'aac').default('opus'), + defaultBitrate: Joi.string().valid('64k', '128k', '192k', '96k').default('96k') + }).optional(), + secret: Joi.string().optional(), + folders: Joi.object().pattern( + Joi.string(), + Joi.object({ + root: Joi.string().required() + }) + ).default({}), + users: Joi.object().pattern( + Joi.string(), + Joi.object({ + password: Joi.string().required(), + guest: Joi.boolean().default(false), + admin: Joi.boolean().default(false), + salt: Joi.string().required(), + vpaths: Joi.array().items(Joi.string()), + 'lastfm-user': Joi.string().optional(), + 'lastfm-password': Joi.string().optional(), + }) + ).default({}), + ssl: Joi.object({ + key: Joi.string().allow('').optional(), + cert: Joi.string().allow('').optional() + }).optional(), + federation: Joi.object({ + folder: Joi.string().allow('').optional() + }).optional() +}); + + exports.setup = async configFile => { globals.setConfigFile(configFile); const config = JSON.parse(await fs.readFile(configFile, 'utf8')) - - const storageJoi = Joi.object({ - albumArtDirectory: Joi.string().default(path.join(__dirname, '../image-cache')), - dbDirectory: Joi.string().default(path.join(__dirname, '../save/db')), - logsDirectory: Joi.string().default(path.join(__dirname, '../save/logs')), - syncConfigDirectory: Joi.string().default(path.join(__dirname, '../save/sync')), - }); - - const scanOptions = Joi.object({ - skipImg: Joi.boolean().default(false), - scanInterval: Joi.number().default(24), - saveInterval: Joi.number().default(250), - pause: Joi.number().default(0), - bootScanDelay: Joi.number().default(3), - maxConcurrentTasks: Joi.number().integer().min(1).default(1) - }); - - const schema = Joi.object({ - autoboot: Joi.boolean().optional(), - address: Joi.string().ip({ cidr: 'forbidden' }).default('0.0.0.0'), - port: Joi.number().default(3000), - newWebApp: Joi.boolean().default(false), - supportedAudioFiles: Joi.object().pattern( - Joi.string(), Joi.boolean() - ).default({ - "mp3": true, "flac": true, "wav": true, - "ogg": true, "aac": true, "m4a": true, - "opus": true, "m3u": false - }), - scanOptions: scanOptions.default(scanOptions.validate({}).value), - noUpload: Joi.boolean().default(false), - writeLogs: Joi.boolean().default(false), - storage: storageJoi.default(storageJoi.validate({}).value), - webAppDirectory: Joi.string().default(path.join(__dirname, '../public')), - ddns: Joi.object({ - iniFile: Joi.string().default(path.join(__dirname, `../frp/frps.ini`)), - email: Joi.string().allow('').optional(), - password: Joi.string().allow('').optional(), - tested: Joi.boolean().optional(), - token: Joi.string().optional(), - url: Joi.string().optional(), - }), - transcode: Joi.object({ - enabled: Joi.boolean().default(false), - ffmpegDirectory: Joi.string().default(path.join(__dirname, '../bin/ffmpeg')), - defaultCodec: Joi.string().valid('mp3', 'opus', 'aac').default('opus'), - defaultBitrate: Joi.string().valid('64k', '128k', '192k', '96k').default('96k') - }).optional(), - secret: Joi.string().optional(), - folders: Joi.object().pattern( - Joi.string(), - Joi.object({ - root: Joi.string().required() - }) - ).default({}), - users: Joi.object().pattern( - Joi.string(), - Joi.object({ - password: Joi.string().required(), - guest: Joi.boolean().default(false), - admin: Joi.boolean().default(false), - salt: Joi.string().required(), - vpaths: Joi.array().items(Joi.string()), - 'lastfm-user': Joi.string().optional(), - 'lastfm-password': Joi.string().optional(), - }) - ).default({}), - ssl: Joi.object({ - key: Joi.string().allow('').optional(), - cert: Joi.string().allow('').optional() - }).optional(), - federation: Joi.object({ - folder: Joi.string().allow('').optional() - }).optional() - }); - const program = await schema.validateAsync(config, { allowUnknown: true }); // Verify paths are real @@ -101,3 +101,8 @@ exports.setup = async configFile => { return program; } + +exports.getDefaults = async () => { + const { value, error } = schema.validate({}); + return value; +}