diff --git a/package.json b/package.json index bd4734ad..04748f8a 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "lint:js": "eslint --ext .js --ext .jsx ." }, "devDependencies": { + "deepmerge": "^1.5.2", "7zip-bin": "^2.0.4", "babel-core": "^6.24.1", "babel-eslint": "^7.2.3", diff --git a/src/common/config/base.json b/src/common/config/base.json new file mode 100644 index 00000000..96283bd6 --- /dev/null +++ b/src/common/config/base.json @@ -0,0 +1,28 @@ +{ + "default": { + "teams": [], + "showTrayIcon": false, + "trayIconTheme": "light", + "minimizeToTray": false, + "version": 1, + "notifications": { + "flashWindow": 0 + }, + "showUnreadBadge": true, + "useSpellChecker": true, + "spellCheckerLocale": "en-US" + }, + "1": { + "teams": [], + "showTrayIcon": false, + "trayIconTheme": "light", + "minimizeToTray": false, + "version": 1, + "notifications": { + "flashWindow": 0 + }, + "showUnreadBadge": true, + "useSpellChecker": true, + "spellCheckerLocale": "en-US" + } +} diff --git a/src/common/config/override.json b/src/common/config/override.json new file mode 100644 index 00000000..0db3279e --- /dev/null +++ b/src/common/config/override.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/src/common/settings.js b/src/common/settings.js index e4aab48a..dbc9cf21 100644 --- a/src/common/settings.js +++ b/src/common/settings.js @@ -1,35 +1,37 @@ 'use strict'; const fs = require('fs'); +let deepmerge = require('deepmerge').default; +if (process.env.TEST) { + deepmerge = require('deepmerge'); // eslint-disable-line +} + const settingsVersion = 1; +const baseConfig = require('./config/base.json'); +const overrideConfig = require('./config/override.json'); function merge(base, target) { return Object.assign({}, base, target); } +function deepMergeArray(dest) { + return dest; +} + function loadDefault(version, spellCheckerLocale) { var ver = version; if (version == null) { ver = settingsVersion; } - switch (ver) { - case 1: - return { - teams: [], - showTrayIcon: false, - trayIconTheme: 'light', - minimizeToTray: false, - version: 1, - notifications: { - flashWindow: 0 // 0 = flash never, 1 = only when idle (after 10 seconds), 2 = always - }, - showUnreadBadge: true, - useSpellChecker: true, - spellCheckerLocale: spellCheckerLocale || 'en-US' - }; - default: - return {}; - } + + const base = baseConfig[ver] || baseConfig.default; + const override = overrideConfig[ver] || {}; + + const defaults = deepmerge(base, override, {clone: true, arrayMerge: deepMergeArray}); + + return Object.assign(defaults, { + spellCheckerLocale: spellCheckerLocale || defaults.spellCheckerLocale || 'en-US' + }); } function upgradeV0toV1(configV0) { @@ -61,15 +63,19 @@ module.exports = { readFileSync(configFile) { var config = JSON.parse(fs.readFileSync(configFile, 'utf8')); - if (config.version === settingsVersion) { + + // need to be able to compare 1 to '1' + if (config.version == settingsVersion) { // eslint-disable-line var defaultConfig = this.loadDefault(); config = merge(defaultConfig, config); } + return config; }, writeFile(configFile, config, callback) { - if (config.version !== settingsVersion) { + // need to be able to compare 1 to '1' + if (config.version != settingsVersion) { // eslint-disable-line throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion); } var data = JSON.stringify(config, null, ' '); @@ -77,7 +83,8 @@ module.exports = { }, writeFileSync(configFile, config) { - if (config.version !== settingsVersion) { + // need to be able to compare 1 to '1' + if (config.version != settingsVersion) { // eslint-disable-line throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion); } var data = JSON.stringify(config, null, ' '); diff --git a/src/package.json b/src/package.json index af65f8c2..f817f732 100644 --- a/src/package.json +++ b/src/package.json @@ -12,6 +12,7 @@ "auto-launch": "^5.0.1", "bootstrap": "^3.3.7", "create-react-class": "^15.5.3", + "deepmerge": "^1.5.2", "electron-context-menu": "^0.9.0", "electron-devtools-installer": "^2.2.0", "electron-is-dev": "^0.1.2", diff --git a/test/modules/environment.js b/test/modules/environment.js index ffe8abc7..4fd19f02 100644 --- a/test/modules/environment.js +++ b/test/modules/environment.js @@ -1,4 +1,5 @@ 'use strict'; +process.env.TEST = 'test'; const chai = require('chai'); chai.should(); diff --git a/test/specs/settings_test.js b/test/specs/settings_test.js index 18cfd7de..8db72848 100644 --- a/test/specs/settings_test.js +++ b/test/specs/settings_test.js @@ -1,4 +1,5 @@ const settings = require('../../src/common/settings'); +const deepmerge = require('deepmerge'); describe('common/settings.js', () => { it('should upgrade v0 config file', () => { @@ -10,4 +11,14 @@ describe('common/settings.js', () => { config.teams[0].url.should.equal(v0Config.url); config.version.should.equal(settings.version); }); + + it('should loadDefault config for version 1', () => { + const baseConfig = require('../../src/common/config/base.json'); + const overrideConfig = require('../../src/common/config/override.json'); + const expectedDefaults = deepmerge( + baseConfig[1], overrideConfig[1] || {}, {clone: true, arrayMerge: settings.deepMergeArray} + ); + const defaultConfig = settings.loadDefault(); + defaultConfig.should.eql(expectedDefaults); + }); });