Switched to nconf and removed dynamic config
This commit is contained in:
parent
98f7bfc775
commit
de4941b799
|
@ -18,4 +18,4 @@ db.sqlite
|
|||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
settings.json
|
||||
config.json
|
|
@ -1,222 +0,0 @@
|
|||
const argv = require('minimist')(process.argv.slice(2));
|
||||
|
||||
const { coalesce } = require('./src/utils/helpers');
|
||||
|
||||
const readSettingsFile = (file) => {
|
||||
try {
|
||||
// eslint-disable-next-line global-require, import/no-dynamic-require
|
||||
return require(file);
|
||||
} catch (e) {
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
||||
const settings = readSettingsFile('./settings.json');
|
||||
|
||||
const fields = [
|
||||
// Webapp settings
|
||||
{
|
||||
local: 'webroot',
|
||||
env: 'WEB_ROOT',
|
||||
default: '',
|
||||
type: 'string',
|
||||
},
|
||||
{
|
||||
local: 'webapp_port',
|
||||
env: 'WEB_PORT',
|
||||
default: '8088',
|
||||
type: 'number',
|
||||
},
|
||||
{
|
||||
local: 'autoJoin',
|
||||
env: 'AUTOJOIN_ENABLED',
|
||||
default: false,
|
||||
type: 'boolean',
|
||||
},
|
||||
{
|
||||
local: 'autoJoinServer',
|
||||
env: 'AUTOJOIN_SERVERURL',
|
||||
default: '',
|
||||
type: 'string',
|
||||
},
|
||||
{
|
||||
local: 'autoJoinRoom',
|
||||
env: 'AUTOJOIN_ROOM',
|
||||
default: '',
|
||||
type: 'string',
|
||||
},
|
||||
{
|
||||
local: 'autoJoinPassword',
|
||||
env: 'AUTOJOIN_PASSWORD',
|
||||
default: '',
|
||||
type: 'string',
|
||||
},
|
||||
{
|
||||
local: 'authentication',
|
||||
env: 'AUTHENTICATION',
|
||||
default: {
|
||||
mechanism: 'none',
|
||||
},
|
||||
type: 'object',
|
||||
},
|
||||
{
|
||||
local: 'customServer',
|
||||
env: 'CUSTOM_SERVER',
|
||||
default: null,
|
||||
type: 'object',
|
||||
},
|
||||
{
|
||||
local: 'servers',
|
||||
env: 'SERVERS',
|
||||
default: [],
|
||||
type: 'array',
|
||||
},
|
||||
{
|
||||
local: 'autoplay',
|
||||
env: 'AUTOPLAY',
|
||||
default: true,
|
||||
type: 'boolean',
|
||||
},
|
||||
{
|
||||
local: 'slPlayerQuality',
|
||||
env: 'SLPLAYERQUALITY',
|
||||
default: null,
|
||||
type: 'number',
|
||||
// null is allowed because null quality indicates Original
|
||||
nullable: true,
|
||||
},
|
||||
{
|
||||
local: 'slPlayerForceTranscode',
|
||||
env: 'SLPLAYERFORCETRANSCODE',
|
||||
default: false,
|
||||
type: 'boolean',
|
||||
},
|
||||
{
|
||||
local: 'fetchConfig',
|
||||
env: 'FETCH_CONFIG',
|
||||
default: false,
|
||||
type: 'boolean',
|
||||
},
|
||||
];
|
||||
|
||||
// Returns the parsed setting or default value if wrong type or unable to be parsed
|
||||
const parseSetting = (value, setting) => {
|
||||
if (setting.type === 'array') {
|
||||
// If setting is array. (Have to treat arrays differently since typeof array is 'object')
|
||||
if (Array.isArray(value)) {
|
||||
return value;
|
||||
} if (typeof value === 'string') {
|
||||
// If setting is string, we have a chance to parse it and it might become an array
|
||||
try {
|
||||
const parsed = JSON.parse(value);
|
||||
if (Array.isArray(parsed)) {
|
||||
// Success, we parsed and got an array
|
||||
return parsed;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e.message);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// If setting is not array
|
||||
// eslint-disable-next-line valid-typeof
|
||||
if (typeof value === setting.type) {
|
||||
return value;
|
||||
} if (typeof value === 'string') {
|
||||
// If setting is string, we have a chance to parse it and it might become an array
|
||||
try {
|
||||
const parsed = JSON.parse(value);
|
||||
// eslint-disable-next-line valid-typeof
|
||||
if (typeof parsed === setting.type) {
|
||||
return parsed;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (value !== undefined) {
|
||||
console.error(
|
||||
`Error parsing [${setting.local}]: Reverting to default. Value: '${value}'`,
|
||||
);
|
||||
}
|
||||
|
||||
return setting.default;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
readSettings() {
|
||||
// Load and export our settings in preference of Args -> ENV -> Settings file -> Default
|
||||
const output = {};
|
||||
// eslint-disable-next-line no-plusplus
|
||||
for (let i = 0; i < fields.length; i++) {
|
||||
const setting = fields[i];
|
||||
// console.log('Processing setting', setting);
|
||||
// console.log(`Args: '${argv[setting.env]}'; '${argv[setting.local]}'`);
|
||||
// console.log(`ENV: '${process.env[setting.env]}'; '${process.env[setting.local]}'`);
|
||||
// console.log(`Settings: '${settings[setting.local]}'; '${setting.default}'`);
|
||||
const value = coalesce(
|
||||
argv[setting.env],
|
||||
argv[setting.local],
|
||||
process.env[setting.env],
|
||||
process.env[setting.local],
|
||||
settings[setting.env],
|
||||
settings[setting.local],
|
||||
setting.default,
|
||||
);
|
||||
output[setting.local] = parseSetting(value, setting);
|
||||
|
||||
// Backwards compatibilty for PORT ENV setting
|
||||
if (setting.local === 'webapp_port' && output[setting.local] === 8088) {
|
||||
const port = argv.PORT || process.env.PORT || settings.PORT;
|
||||
if (port && port !== 8088) {
|
||||
console.log(`Please change 'PORT' to 'WEB_PORT'. Setting WEB_PORT to '${port}'`);
|
||||
output[setting.local] = port;
|
||||
}
|
||||
}
|
||||
|
||||
// Remove trailing slashes, if they exist
|
||||
if (
|
||||
(setting.local === 'webroot')
|
||||
&& output[setting.local].endsWith('/')
|
||||
) {
|
||||
console.log(
|
||||
`${setting.local}/${setting.env} should not end in '/'. Removing trailing slash(es) for you.`,
|
||||
);
|
||||
output[setting.local] = output[setting.local].replace(/\/+$/, '');
|
||||
console.log('- Done.');
|
||||
}
|
||||
// Add leading slash, if not provided
|
||||
if (
|
||||
setting.local === 'webroot'
|
||||
&& output[setting.local].length > 1
|
||||
&& !output[setting.local].startsWith('/')
|
||||
) {
|
||||
console.log(
|
||||
`${setting.local}/${setting.env} should always start with '/'. Adding the leading slash for you.`,
|
||||
);
|
||||
// Make sure it starts with one leading slash
|
||||
output[setting.local] = `/${output[setting.local]}`;
|
||||
console.log('- Done.');
|
||||
}
|
||||
// Make sure 'webroot' and 'serverroot' aren't set to '/'. Revert to default if they do.
|
||||
if (
|
||||
(setting.local === 'webroot' || setting.local === 'serverroot')
|
||||
&& output[setting.local] === '/'
|
||||
) {
|
||||
console.log(
|
||||
`${setting.local}/${setting.env} cannot be set to '/'. Reverting to default: '${setting.default}'`,
|
||||
);
|
||||
output[setting.local] = setting.default;
|
||||
console.log('- Done.');
|
||||
}
|
||||
process.env[setting.env] = typeof output[setting.local] === 'object'
|
||||
? JSON.stringify(output[setting.local])
|
||||
: output[setting.local];
|
||||
}
|
||||
|
||||
// console.log('Our settings are', output)
|
||||
return output;
|
||||
},
|
||||
};
|
|
@ -0,0 +1,50 @@
|
|||
const defaults = {
|
||||
port: 8088,
|
||||
base_url: '/',
|
||||
|
||||
servers: [
|
||||
{
|
||||
name: 'SyncLounge AU1',
|
||||
location: 'Sydney, Australia',
|
||||
url: 'https://v3au1.synclounge.tv/slserver',
|
||||
image: 'flags/au.png',
|
||||
},
|
||||
{
|
||||
name: 'SyncLounge EU1',
|
||||
location: 'Amsterdam, Netherlands',
|
||||
url: 'https://v2eu1.synclounge.tv/server',
|
||||
image: 'flags/eu.png',
|
||||
},
|
||||
{
|
||||
name: 'SyncLounge US1',
|
||||
location: 'Miami, United States',
|
||||
url: 'https://v2us1.synclounge.tv/server',
|
||||
image: 'flags/us.png',
|
||||
},
|
||||
{
|
||||
name: 'SyncLounge US2',
|
||||
location: 'Miami, United States',
|
||||
url: 'https://v3us1.synclounge.tv/slserver',
|
||||
image: 'flags/us.png',
|
||||
},
|
||||
{
|
||||
name: 'SyncLounge US3',
|
||||
location: 'Miami, United States',
|
||||
url: 'https://v3us2.synclounge.tv/slserver',
|
||||
image: 'flags/us.png',
|
||||
},
|
||||
],
|
||||
|
||||
authentication: {
|
||||
mechanism: 'none',
|
||||
},
|
||||
|
||||
default_slplayer_autoplay: true,
|
||||
default_slplayer_force_transcode: false,
|
||||
default_slplayer_volume: 1,
|
||||
default_client_poll_interval: 1000,
|
||||
default_sync_flexability: 3000,
|
||||
default_sync_mode: 'cleanseek',
|
||||
};
|
||||
|
||||
module.exports = defaults;
|
|
@ -0,0 +1,33 @@
|
|||
const nconf = require('nconf');
|
||||
const defaults = require('./defaults');
|
||||
|
||||
nconf
|
||||
.argv({
|
||||
separator: '__',
|
||||
parseValues: true,
|
||||
})
|
||||
.env({
|
||||
separator: '__',
|
||||
lowerCase: true,
|
||||
parseValues: true,
|
||||
whitelist: Object.keys(defaults).concat([
|
||||
'autojoin__server',
|
||||
'autojoin__room',
|
||||
'autojoin__password',
|
||||
'authentication__mechanism',
|
||||
'authentication__type',
|
||||
'authentication__authorized',
|
||||
|
||||
'custom_server__name',
|
||||
'custom_server__location',
|
||||
'custom_server__url',
|
||||
'custom_server__image',
|
||||
|
||||
'default_slplayer_quality',
|
||||
]),
|
||||
})
|
||||
.file({ file: 'config.json' });
|
||||
|
||||
nconf.defaults(defaults);
|
||||
|
||||
module.exports = nconf;
|
|
@ -1908,6 +1908,7 @@
|
|||
"version": "1.3.7",
|
||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
|
||||
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"mime-types": "~2.1.24",
|
||||
"negotiator": "0.6.2"
|
||||
|
@ -2091,7 +2092,8 @@
|
|||
"array-flatten": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
|
||||
"dev": true
|
||||
},
|
||||
"array-includes": {
|
||||
"version": "3.1.1",
|
||||
|
@ -2488,6 +2490,7 @@
|
|||
"version": "1.19.0",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
|
||||
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bytes": "3.1.0",
|
||||
"content-type": "~1.0.4",
|
||||
|
@ -2744,7 +2747,8 @@
|
|||
"bytes": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
|
||||
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
|
||||
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
|
||||
"dev": true
|
||||
},
|
||||
"cacache": {
|
||||
"version": "12.0.4",
|
||||
|
@ -3263,6 +3267,12 @@
|
|||
"q": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
|
||||
"dev": true
|
||||
},
|
||||
"collection-visit": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
|
||||
|
@ -3446,6 +3456,7 @@
|
|||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
|
||||
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"safe-buffer": "5.1.2"
|
||||
}
|
||||
|
@ -3453,7 +3464,8 @@
|
|||
"content-type": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
|
||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
|
||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
|
||||
"dev": true
|
||||
},
|
||||
"convert-source-map": {
|
||||
"version": "1.7.0",
|
||||
|
@ -3467,12 +3479,14 @@
|
|||
"cookie": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
|
||||
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
|
||||
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
|
||||
"dev": true
|
||||
},
|
||||
"cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
|
||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
|
||||
"dev": true
|
||||
},
|
||||
"copy-concurrently": {
|
||||
"version": "1.0.5",
|
||||
|
@ -3615,15 +3629,6 @@
|
|||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
||||
"dev": true
|
||||
},
|
||||
"cors": {
|
||||
"version": "2.8.5",
|
||||
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
|
||||
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
|
||||
"requires": {
|
||||
"object-assign": "^4",
|
||||
"vary": "^1"
|
||||
}
|
||||
},
|
||||
"cosmiconfig": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
|
||||
|
@ -3959,6 +3964,7 @@
|
|||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
|
@ -4234,7 +4240,8 @@
|
|||
"depd": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
|
||||
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
|
||||
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
|
||||
"dev": true
|
||||
},
|
||||
"des.js": {
|
||||
"version": "1.0.1",
|
||||
|
@ -4249,7 +4256,8 @@
|
|||
"destroy": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
|
||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
|
||||
"dev": true
|
||||
},
|
||||
"detect-browser": {
|
||||
"version": "5.1.1",
|
||||
|
@ -4450,7 +4458,8 @@
|
|||
"ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
|
||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
|
||||
"dev": true
|
||||
},
|
||||
"ejs": {
|
||||
"version": "2.7.4",
|
||||
|
@ -4508,7 +4517,8 @@
|
|||
"encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
|
||||
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
|
||||
"dev": true
|
||||
},
|
||||
"end-of-stream": {
|
||||
"version": "1.4.4",
|
||||
|
@ -4687,7 +4697,8 @@
|
|||
"escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
|
||||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
|
||||
"dev": true
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
|
@ -5167,7 +5178,8 @@
|
|||
"etag": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
|
||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
|
||||
"dev": true
|
||||
},
|
||||
"event-pubsub": {
|
||||
"version": "4.3.0",
|
||||
|
@ -5260,6 +5272,7 @@
|
|||
"version": "4.17.1",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
|
||||
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"accepts": "~1.3.7",
|
||||
"array-flatten": "1.1.1",
|
||||
|
@ -5539,6 +5552,7 @@
|
|||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
|
||||
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"encodeurl": "~1.0.2",
|
||||
|
@ -5645,7 +5659,8 @@
|
|||
"forwarded": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
||||
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
|
||||
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
|
||||
"dev": true
|
||||
},
|
||||
"fragment-cache": {
|
||||
"version": "0.2.1",
|
||||
|
@ -5659,7 +5674,8 @@
|
|||
"fresh": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
||||
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
|
||||
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
|
||||
"dev": true
|
||||
},
|
||||
"from2": {
|
||||
"version": "2.3.0",
|
||||
|
@ -6230,6 +6246,7 @@
|
|||
"version": "1.7.2",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
|
||||
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"depd": "~1.1.2",
|
||||
"inherits": "2.0.3",
|
||||
|
@ -6294,6 +6311,7 @@
|
|||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"safer-buffer": ">= 2.1.2 < 3"
|
||||
}
|
||||
|
@ -6406,7 +6424,14 @@
|
|||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
|
||||
"dev": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
|
||||
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
|
||||
"dev": true
|
||||
},
|
||||
"inquirer": {
|
||||
"version": "7.2.0",
|
||||
|
@ -6552,6 +6577,12 @@
|
|||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"invert-kv": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
|
||||
"integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
|
||||
"dev": true
|
||||
},
|
||||
"ip": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
|
||||
|
@ -6567,7 +6598,8 @@
|
|||
"ipaddr.js": {
|
||||
"version": "1.9.1",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
||||
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
|
||||
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
|
||||
"dev": true
|
||||
},
|
||||
"is-absolute-url": {
|
||||
"version": "2.1.0",
|
||||
|
@ -7060,6 +7092,15 @@
|
|||
"launch-editor": "^2.2.1"
|
||||
}
|
||||
},
|
||||
"lcid": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
|
||||
"integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"invert-kv": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"leven": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
|
||||
|
@ -7341,7 +7382,8 @@
|
|||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
|
||||
"dev": true
|
||||
},
|
||||
"memory-fs": {
|
||||
"version": "0.4.1",
|
||||
|
@ -7356,7 +7398,8 @@
|
|||
"merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
|
||||
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
|
||||
"dev": true
|
||||
},
|
||||
"merge-source-map": {
|
||||
"version": "1.1.0",
|
||||
|
@ -7390,7 +7433,8 @@
|
|||
"methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
|
||||
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
|
||||
"dev": true
|
||||
},
|
||||
"micromatch": {
|
||||
"version": "3.1.10",
|
||||
|
@ -7434,17 +7478,20 @@
|
|||
"mime": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
|
||||
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
|
||||
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
|
||||
"dev": true
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.44.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
|
||||
"integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
|
||||
"integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
|
||||
"dev": true
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.27",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
|
||||
"integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"mime-db": "1.44.0"
|
||||
}
|
||||
|
@ -7516,7 +7563,8 @@
|
|||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
|
||||
"dev": true
|
||||
},
|
||||
"minipass": {
|
||||
"version": "3.1.3",
|
||||
|
@ -7627,7 +7675,8 @@
|
|||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
||||
"dev": true
|
||||
},
|
||||
"multicast-dns": {
|
||||
"version": "6.2.3",
|
||||
|
@ -7687,10 +7736,114 @@
|
|||
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
|
||||
"dev": true
|
||||
},
|
||||
"nconf": {
|
||||
"version": "0.10.0",
|
||||
"resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz",
|
||||
"integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"async": "^1.4.0",
|
||||
"ini": "^1.3.0",
|
||||
"secure-keys": "^1.0.0",
|
||||
"yargs": "^3.19.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"dev": true
|
||||
},
|
||||
"async": {
|
||||
"version": "1.5.2",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
||||
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
|
||||
"dev": true
|
||||
},
|
||||
"camelcase": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
|
||||
"integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
|
||||
"dev": true
|
||||
},
|
||||
"cliui": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
|
||||
"integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"string-width": "^1.0.1",
|
||||
"strip-ansi": "^3.0.1",
|
||||
"wrap-ansi": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"is-fullwidth-code-point": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
|
||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"string-width": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
"strip-ansi": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"wrap-ansi": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
|
||||
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"string-width": "^1.0.1",
|
||||
"strip-ansi": "^3.0.1"
|
||||
}
|
||||
},
|
||||
"y18n": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
|
||||
"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
|
||||
"dev": true
|
||||
},
|
||||
"yargs": {
|
||||
"version": "3.32.0",
|
||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
|
||||
"integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"camelcase": "^2.0.1",
|
||||
"cliui": "^3.0.3",
|
||||
"decamelize": "^1.1.1",
|
||||
"os-locale": "^1.4.0",
|
||||
"string-width": "^1.0.1",
|
||||
"window-size": "^0.1.4",
|
||||
"y18n": "^3.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"negotiator": {
|
||||
"version": "0.6.2",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
|
||||
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
|
||||
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
|
||||
"dev": true
|
||||
},
|
||||
"neo-async": {
|
||||
"version": "2.6.1",
|
||||
|
@ -7829,6 +7982,12 @@
|
|||
"integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
|
||||
"dev": true
|
||||
},
|
||||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
|
||||
"dev": true
|
||||
},
|
||||
"oauth-sign": {
|
||||
"version": "0.9.0",
|
||||
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
|
||||
|
@ -7838,7 +7997,8 @@
|
|||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
|
||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
|
||||
"dev": true
|
||||
},
|
||||
"object-component": {
|
||||
"version": "0.0.3",
|
||||
|
@ -7978,6 +8138,7 @@
|
|||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ee-first": "1.1.1"
|
||||
}
|
||||
|
@ -8084,6 +8245,15 @@
|
|||
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
|
||||
"dev": true
|
||||
},
|
||||
"os-locale": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
|
||||
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"lcid": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"os-tmpdir": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
|
||||
|
@ -8243,7 +8413,8 @@
|
|||
"parseurl": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
|
||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
|
||||
"dev": true
|
||||
},
|
||||
"pascalcase": {
|
||||
"version": "0.1.1",
|
||||
|
@ -8296,7 +8467,8 @@
|
|||
"path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
|
||||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
|
||||
"dev": true
|
||||
},
|
||||
"path-type": {
|
||||
"version": "3.0.0",
|
||||
|
@ -9060,6 +9232,7 @@
|
|||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
|
||||
"integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"forwarded": "~0.1.2",
|
||||
"ipaddr.js": "1.9.1"
|
||||
|
@ -9153,7 +9326,8 @@
|
|||
"qs": {
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
|
||||
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
|
||||
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
|
||||
"dev": true
|
||||
},
|
||||
"query-string": {
|
||||
"version": "4.3.4",
|
||||
|
@ -9205,12 +9379,14 @@
|
|||
"range-parser": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
|
||||
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
|
||||
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
|
||||
"dev": true
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
|
||||
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bytes": "3.1.0",
|
||||
"http-errors": "1.7.2",
|
||||
|
@ -9692,7 +9868,8 @@
|
|||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
|
||||
"dev": true
|
||||
},
|
||||
"safe-regex": {
|
||||
"version": "1.1.0",
|
||||
|
@ -9706,7 +9883,8 @@
|
|||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
||||
"dev": true
|
||||
},
|
||||
"sass": {
|
||||
"version": "1.26.9",
|
||||
|
@ -9755,6 +9933,12 @@
|
|||
"ajv-keywords": "^3.4.1"
|
||||
}
|
||||
},
|
||||
"secure-keys": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz",
|
||||
"integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=",
|
||||
"dev": true
|
||||
},
|
||||
"select": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
|
||||
|
@ -9786,6 +9970,7 @@
|
|||
"version": "0.17.1",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
|
||||
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
|
@ -9805,7 +9990,8 @@
|
|||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -9857,6 +10043,7 @@
|
|||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
|
||||
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
|
@ -9902,7 +10089,8 @@
|
|||
"setprototypeof": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
|
||||
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
|
||||
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
|
||||
"dev": true
|
||||
},
|
||||
"sha.js": {
|
||||
"version": "2.4.11",
|
||||
|
@ -10482,7 +10670,8 @@
|
|||
"statuses": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
|
||||
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
|
||||
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
|
||||
"dev": true
|
||||
},
|
||||
"stream-browserify": {
|
||||
"version": "2.0.2",
|
||||
|
@ -10939,7 +11128,8 @@
|
|||
"toidentifier": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
|
||||
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
|
||||
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
|
||||
"dev": true
|
||||
},
|
||||
"toposort": {
|
||||
"version": "1.0.7",
|
||||
|
@ -11038,6 +11228,7 @@
|
|||
"version": "1.6.18",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
|
||||
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "~2.1.24"
|
||||
|
@ -11152,7 +11343,8 @@
|
|||
"unpipe": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
|
||||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
|
||||
"dev": true
|
||||
},
|
||||
"unquote": {
|
||||
"version": "1.1.1",
|
||||
|
@ -11322,7 +11514,8 @@
|
|||
"utils-merge": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
|
||||
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
|
||||
"dev": true
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.4.0",
|
||||
|
@ -11355,7 +11548,8 @@
|
|||
"vary": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
|
||||
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
|
||||
"dev": true
|
||||
},
|
||||
"vendors": {
|
||||
"version": "1.0.4",
|
||||
|
@ -12249,6 +12443,12 @@
|
|||
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
|
||||
"dev": true
|
||||
},
|
||||
"window-size": {
|
||||
"version": "0.1.4",
|
||||
"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
|
||||
"integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
|
||||
"dev": true
|
||||
},
|
||||
"word-wrap": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
|
||||
|
|
|
@ -7,15 +7,10 @@
|
|||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build",
|
||||
"lint": "vue-cli-service lint",
|
||||
"server": "node server.js",
|
||||
"start": "node server.js"
|
||||
"lint": "vue-cli-service lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"core-js": "^3.6.5",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^4.17.1",
|
||||
"minimist": "^1.2.5",
|
||||
"vue": "^2.6.11",
|
||||
"vue-router": "^3.3.4",
|
||||
"vuetify": "^2.3.2",
|
||||
|
@ -40,6 +35,7 @@
|
|||
"git-rev-sync": "^2.0.0",
|
||||
"humanize-duration": "^3.23.1",
|
||||
"lodash-es": "^4.17.15",
|
||||
"nconf": "^0.10.0",
|
||||
"sass": "^1.26.9",
|
||||
"sass-loader": "^8.0.2",
|
||||
"shaka-player": "^2.5.13",
|
||||
|
|
23
src/App.vue
23
src/App.vue
|
@ -110,19 +110,8 @@
|
|||
style="height: 100%"
|
||||
fluid
|
||||
>
|
||||
<v-alert
|
||||
v-if="GET_CONFIGURATION_FETCHED_ERROR"
|
||||
width="100%"
|
||||
:dismissible="true"
|
||||
type="error"
|
||||
class="mt-0 mb-0"
|
||||
>
|
||||
Failed to fetch config: {{ GET_CONFIGURATION_FETCHED_ERROR }}
|
||||
</v-alert>
|
||||
|
||||
<v-container
|
||||
v-if="((GET_CONFIG.fetchConfig && !GET_CONFIGURATION_FETCHED)
|
||||
|| !IS_DONE_FETCHING_DEVICES) && $route.matched.some((record) => record.meta.protected)"
|
||||
v-if="!IS_DONE_FETCHING_DEVICES && $route.matched.some((record) => record.meta.protected)"
|
||||
fill-height
|
||||
>
|
||||
<v-row
|
||||
|
@ -212,8 +201,6 @@ export default {
|
|||
'GET_UP_NEXT_POST_PLAY_DATA',
|
||||
'getLogos',
|
||||
'GET_CONFIG',
|
||||
'GET_CONFIGURATION_FETCHED',
|
||||
'GET_CONFIGURATION_FETCHED_ERROR',
|
||||
'GET_ACTIVE_METADATA',
|
||||
'GET_SNACKBAR_MESSAGE',
|
||||
'GET_SNACKBAR_OPEN',
|
||||
|
@ -280,7 +267,7 @@ export default {
|
|||
// TODO: investigate passwords and invites. Is there really a point of a password if the invite link contains it?
|
||||
// One alternative is to prompt for a password always instead, but maybe we don't need passwords at all
|
||||
if (this.GET_ROOM) {
|
||||
if (this.GET_CONFIG.autoJoin) {
|
||||
if (this.GET_CONFIG.autojoin) {
|
||||
// If autojoin, just link to main site
|
||||
return window.location.origin;
|
||||
}
|
||||
|
@ -330,10 +317,7 @@ export default {
|
|||
},
|
||||
|
||||
async created() {
|
||||
if (this.GET_CONFIG.fetchConfig) {
|
||||
await this.FETCH_CONFIG();
|
||||
}
|
||||
|
||||
console.log(process.env);
|
||||
if (this.IS_AUTHENTICATED) {
|
||||
// Kick off a bunch of requests that we need for later
|
||||
await this.FETCH_PLEX_USER();
|
||||
|
@ -346,7 +330,6 @@ export default {
|
|||
'SET_LEFT_SIDEBAR_OPEN',
|
||||
'SET_RIGHT_SIDEBAR_OPEN',
|
||||
'TOGGLE_RIGHT_SIDEBAR_OPEN',
|
||||
'FETCH_CONFIG',
|
||||
'DISPLAY_NOTIFICATION',
|
||||
]),
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ Vue.use(Router);
|
|||
|
||||
// ==================== Router registration ====================
|
||||
export default new Router({
|
||||
base: process.env.webroot,
|
||||
base: process.env.BASE_URL,
|
||||
mode: 'hash',
|
||||
routes: [
|
||||
{
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import axios from 'axios';
|
||||
|
||||
export default {
|
||||
SET_LEFT_SIDEBAR_OPEN: ({ commit }, open) => {
|
||||
commit('SET_LEFT_SIDEBAR_OPEN', open);
|
||||
|
@ -17,18 +15,6 @@ export default {
|
|||
commit('SET_MANUAL_SYNC_QUEUED', true);
|
||||
},
|
||||
|
||||
FETCH_CONFIG: async ({ commit }) => {
|
||||
const url = window.location.origin + window.location.pathname.replace(/\/+$/, '');
|
||||
try {
|
||||
const { data } = await axios.get(`${url}/config`);
|
||||
commit('SET_CONFIG', data);
|
||||
} catch (e) {
|
||||
commit('SET_CONFIGURATION_FETCH_ERROR', e);
|
||||
}
|
||||
|
||||
commit('SET_CONFIGURATION_FETCHED', true);
|
||||
},
|
||||
|
||||
DISPLAY_NOTIFICATION: ({ commit }, message) => {
|
||||
commit('SET_SNACKBAR_MESSAGE', message);
|
||||
commit('SET_SNACKBAR_OPEN', true);
|
||||
|
|
|
@ -1,29 +1,38 @@
|
|||
const { coalesce } = require('@/utils/helpers');
|
||||
import coalesce from '@/utils/coalesce';
|
||||
|
||||
// Use stored value if not null, othewise fallback to config, then default values
|
||||
export default {
|
||||
GET_AUTOPLAY: (state, getters, rootState, rootGetters) => coalesce(state.autoplay,
|
||||
rootGetters.GET_CONFIG.autoplay),
|
||||
rootGetters.GET_CONFIG.default_slplayer_autoplay),
|
||||
|
||||
GET_CLIENTPOLLINTERVAL: (state) => state.clientPollInterval,
|
||||
GET_CLIENTPOLLINTERVAL: (state, getters, rootState, rootGetters) => coalesce(
|
||||
state.clientPollInterval,
|
||||
rootGetters.GET_CONFIG.default_client_poll_interval,
|
||||
),
|
||||
|
||||
GET_SYNCMODE: (state) => state.syncMode,
|
||||
GET_SYNCMODE: (state, getters, rootState, rootGetters) => coalesce(
|
||||
state.syncMode,
|
||||
rootGetters.GET_CONFIG.default_sync_mode,
|
||||
),
|
||||
|
||||
GET_SYNCFLEXIBILITY: (state) => state.syncFlexibility,
|
||||
|
||||
GET_CUSTOMSERVER: (state, getters, rootState, rootGetters) => coalesce(state.customServer,
|
||||
rootGetters.GET_CONFIG.customServer),
|
||||
GET_SYNCFLEXIBILITY: (state, getters, rootState, rootGetters) => coalesce(
|
||||
state.syncFlexibility,
|
||||
rootGetters.GET_CONFIG.default_sync_flexability,
|
||||
),
|
||||
|
||||
GET_SLPLAYERQUALITY: (state, getters, rootState, rootGetters) => coalesce(
|
||||
state.slPlayerQuality,
|
||||
rootGetters.GET_CONFIG.slPlayerQuality,
|
||||
rootGetters.GET_CONFIG.default_slplayer_quality,
|
||||
) || null,
|
||||
|
||||
GET_SLPLAYERVOLUME: (state) => state.slPlayerVolume,
|
||||
GET_SLPLAYERVOLUME: (state, getters, rootState, rootGetters) => coalesce(
|
||||
state.slPlayerVolume,
|
||||
rootGetters.GET_CONFIG.default_slplayer_volume,
|
||||
),
|
||||
|
||||
GET_SLPLAYERFORCETRANSCODE: (state, getters, rootState, rootGetters) => coalesce(
|
||||
state.slPlayerForceTranscode,
|
||||
rootGetters.GET_CONFIG.slPlayerForceTranscode,
|
||||
rootGetters.GET_CONFIG.default_slplayer_force_transcode,
|
||||
),
|
||||
|
||||
GET_HIDEUSERNAME: (state) => state.hideUsername,
|
||||
|
|
|
@ -3,18 +3,12 @@ import guid from '@/utils/guid';
|
|||
// All of these settings are stored in localStorage and are persistent across reloads
|
||||
const state = () => ({
|
||||
autoplay: null,
|
||||
clientPollInterval: 1000,
|
||||
syncMode: 'cleanseek',
|
||||
syncFlexibility: 3000,
|
||||
customServer: {
|
||||
name: 'Custom Server',
|
||||
location: 'Anywhere!',
|
||||
url: 'custom',
|
||||
image: 'synclounge-white.png',
|
||||
},
|
||||
clientPollInterval: null,
|
||||
syncMode: null,
|
||||
syncFlexibility: null,
|
||||
customServerUserInputtedUrl: 'http://',
|
||||
slPlayerQuality: null,
|
||||
slPlayerVolume: 1,
|
||||
slPlayerVolume: null,
|
||||
slPlayerForceTranscode: null,
|
||||
hideUsername: false,
|
||||
altUsername: null,
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
// Custom Servers list settings
|
||||
const defaultSyncloungeServers = [
|
||||
{
|
||||
name: 'SyncLounge AU1',
|
||||
location: 'Sydney, Australia',
|
||||
url: 'https://v3au1.synclounge.tv/slserver',
|
||||
image: 'flags/au.png',
|
||||
},
|
||||
{
|
||||
name: 'SyncLounge EU1',
|
||||
location: 'Amsterdam, Netherlands',
|
||||
url: 'https://v2eu1.synclounge.tv/server',
|
||||
image: 'flags/eu.png',
|
||||
},
|
||||
{
|
||||
name: 'SyncLounge US1',
|
||||
location: 'Miami, United States',
|
||||
url: 'https://v2us1.synclounge.tv/server',
|
||||
image: 'flags/us.png',
|
||||
},
|
||||
{
|
||||
name: 'SyncLounge US2',
|
||||
location: 'Miami, United States',
|
||||
url: 'https://v3us1.synclounge.tv/slserver',
|
||||
image: 'flags/us.png',
|
||||
},
|
||||
{
|
||||
name: 'SyncLounge US3',
|
||||
location: 'Miami, United States',
|
||||
url: 'https://v3us2.synclounge.tv/slserver',
|
||||
image: 'flags/us.png',
|
||||
},
|
||||
];
|
||||
|
||||
export default defaultSyncloungeServers;
|
|
@ -1,5 +1,3 @@
|
|||
import defaultSyncloungeServers from './defaultservers';
|
||||
|
||||
const loadToNumber = (load) => {
|
||||
switch (load) {
|
||||
case 'low':
|
||||
|
@ -29,22 +27,10 @@ export default {
|
|||
GET_HOST_USER: (state, getters) => getters.GET_USERS.find((u) => u.role === 'host'),
|
||||
AM_I_HOST: (state, getters) => getters.GET_ME && getters.GET_ME.role === 'host',
|
||||
|
||||
GET_SYNCLOUNGE_SERVERS: (state, getters, rootState, rootGetters) => {
|
||||
if (rootGetters.GET_CONFIG.servers && rootGetters.GET_CONFIG.servers.length > 0) {
|
||||
if (rootGetters.GET_CONFIG.customServer) {
|
||||
console.error(
|
||||
"'customServer' setting provided with 'servers' setting. Ignoring 'customServer' setting.",
|
||||
);
|
||||
}
|
||||
return rootGetters.GET_CONFIG.servers;
|
||||
}
|
||||
|
||||
if (rootGetters.GET_CONFIG.customServer) {
|
||||
return defaultSyncloungeServers.concat([rootGetters.GET_CONFIG.customServer]);
|
||||
}
|
||||
|
||||
return defaultSyncloungeServers.concat([rootGetters['settings/GET_CUSTOMSERVER']]);
|
||||
},
|
||||
GET_SYNCLOUNGE_SERVERS: (state, getters, rootState, rootGetters) => (
|
||||
rootGetters.GET_CONFIG.customServer
|
||||
? rootGetters.GET_CONFIG.servers.concat([rootGetters.GET_CONFIG.customServer])
|
||||
: rootGetters.GET_CONFIG.servers),
|
||||
|
||||
GET_SERVERS_HEALTH: (state) => state.serversHealth,
|
||||
|
||||
|
|
|
@ -15,18 +15,6 @@ export default {
|
|||
state.upNextPostPlayData = data;
|
||||
},
|
||||
|
||||
SET_CONFIG: (state, data) => {
|
||||
state.configuration = data;
|
||||
},
|
||||
|
||||
SET_CONFIGURATION_FETCHED: (state, fetched) => {
|
||||
state.configurationFetcehd = fetched;
|
||||
},
|
||||
|
||||
SET_CONFIGURATION_FETCH_ERROR: (state, error) => {
|
||||
state.configurationFetchError = error;
|
||||
},
|
||||
|
||||
SET_ACTIVE_METADATA: (state, metadata) => {
|
||||
state.activeMetadata = metadata;
|
||||
},
|
||||
|
|
|
@ -4,8 +4,6 @@ const state = () => ({
|
|||
background: null,
|
||||
upNextCache: {},
|
||||
configuration: JSON.parse(process.env.VUE_APP_CONFIGURATION),
|
||||
configurationFetched: false,
|
||||
configurationFetchError: false,
|
||||
|
||||
isLeftSidebarOpen: false,
|
||||
isRightSidebarOpen: false,
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
const coalesce = (...arr) => arr.find((element) => element !== null && element !== undefined);
|
||||
|
||||
export default coalesce;
|
|
@ -1,3 +0,0 @@
|
|||
module.exports = {
|
||||
coalesce: (...arr) => arr.find((element) => element !== null && element !== undefined),
|
||||
};
|
|
@ -1,11 +1,11 @@
|
|||
const path = require('path');
|
||||
const git = require('git-rev-sync');
|
||||
|
||||
const { readSettings } = require('./SettingsHelper');
|
||||
const config = require('./config');
|
||||
|
||||
const settings = readSettings();
|
||||
console.log(config.get());
|
||||
|
||||
process.env.VUE_APP_CONFIGURATION = JSON.stringify(settings);
|
||||
process.env.VUE_APP_CONFIGURATION = JSON.stringify(config.get());
|
||||
process.env.VUE_APP_VERSION = require('./package.json').version;
|
||||
|
||||
try {
|
||||
|
@ -13,11 +13,11 @@ try {
|
|||
process.env.VUE_APP_GIT_DATE = git.date().toISOString();
|
||||
} catch (e) {
|
||||
// Sometimes on CI stuff they build with .git being present
|
||||
process.env.VUE_APP_GIT_DATE = new Date().toISOString();
|
||||
process.env.VUE_APP_GIT_DATE = Date.now().toISOString();
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
publicPath: settings.webroot,
|
||||
publicPath: config.get('baseurl'),
|
||||
lintOnSave: process.env.NODE_ENV !== 'production',
|
||||
productionSourceMap: false,
|
||||
transpileDependencies: ['vuetify'],
|
||||
|
|
52
webapp.js
52
webapp.js
|
@ -1,52 +0,0 @@
|
|||
/* eslint-disable no-param-reassign */
|
||||
// ABOUT
|
||||
// Runs the SyncLounge Web App - handles serving the static web content and link shortening services
|
||||
// Port defaults to 8088
|
||||
|
||||
const express = require('express');
|
||||
const path = require('path');
|
||||
const cors = require('cors');
|
||||
|
||||
const { readSettings } = require('./SettingsHelper');
|
||||
|
||||
const settings = readSettings();
|
||||
|
||||
const app = express();
|
||||
const router = express.Router();
|
||||
|
||||
// Setup our web app
|
||||
app.use(cors());
|
||||
|
||||
app.use(settings.webroot, router);
|
||||
|
||||
router.use('/', express.static(path.join(__dirname, 'dist')));
|
||||
|
||||
// Config handling
|
||||
router.get('/config', (req, res) => {
|
||||
res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
|
||||
res.header('Expires', '-1');
|
||||
res.header('Pragma', 'no-cache');
|
||||
res.send(settings);
|
||||
});
|
||||
|
||||
// Catch anything else and redirect to the base URL
|
||||
router.get('*', (req, res) => {
|
||||
console.log('Catch all:', req.url);
|
||||
return res.redirect(`${settings.webroot}/`);
|
||||
});
|
||||
|
||||
app.listen(settings.webapp_port, () => {
|
||||
console.log('SyncLounge WebApp successfully started on port ', settings.webapp_port);
|
||||
});
|
||||
|
||||
console.log('Running with base URL: ', settings.webroot);
|
||||
|
||||
if (settings.authentication && settings.authentication.mechanism !== 'none') {
|
||||
console.log('Authentication:', settings.authentication);
|
||||
}
|
||||
|
||||
if (settings.servers) {
|
||||
console.log('Servers List:', settings.servers);
|
||||
} else if (settings.custom_server) {
|
||||
console.log('Custom Server List:', settings.custom_server);
|
||||
}
|
Loading…
Reference in New Issue