88 lines
3.2 KiB
JavaScript
88 lines
3.2 KiB
JavaScript
|
|
import DefaultBrowserSettings from './DefaultBrowserSettings.js';
|
||
|
|
/**
|
||
|
|
* Browser settings utility.
|
||
|
|
*/
|
||
|
|
export default class BrowserSettingsFactory {
|
||
|
|
/**
|
||
|
|
* Returns browser settings.
|
||
|
|
*
|
||
|
|
* @param [settings] Browser settings.
|
||
|
|
* @returns Settings.
|
||
|
|
*/
|
||
|
|
static createSettings(settings) {
|
||
|
|
if (settings) {
|
||
|
|
this.validate(DefaultBrowserSettings, settings);
|
||
|
|
}
|
||
|
|
return {
|
||
|
|
...DefaultBrowserSettings,
|
||
|
|
...settings,
|
||
|
|
navigation: {
|
||
|
|
...DefaultBrowserSettings.navigation,
|
||
|
|
...settings?.navigation
|
||
|
|
},
|
||
|
|
navigator: {
|
||
|
|
...DefaultBrowserSettings.navigator,
|
||
|
|
...settings?.navigator
|
||
|
|
},
|
||
|
|
timer: {
|
||
|
|
...DefaultBrowserSettings.timer,
|
||
|
|
...settings?.timer
|
||
|
|
},
|
||
|
|
fetch: {
|
||
|
|
...DefaultBrowserSettings.fetch,
|
||
|
|
...settings?.fetch
|
||
|
|
},
|
||
|
|
module: {
|
||
|
|
...DefaultBrowserSettings.module,
|
||
|
|
...settings?.module
|
||
|
|
},
|
||
|
|
device: {
|
||
|
|
...DefaultBrowserSettings.device,
|
||
|
|
...settings?.device
|
||
|
|
},
|
||
|
|
debug: {
|
||
|
|
...DefaultBrowserSettings.debug,
|
||
|
|
...settings?.debug
|
||
|
|
},
|
||
|
|
viewport: {
|
||
|
|
...DefaultBrowserSettings.viewport,
|
||
|
|
...settings?.viewport
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|
||
|
|
/**
|
||
|
|
* Validates settings.
|
||
|
|
*
|
||
|
|
* @param target Target.
|
||
|
|
* @param source Source.
|
||
|
|
* @param [parentNamespace] Parent namespace.
|
||
|
|
*/
|
||
|
|
static validate(target, source, parentNamespace) {
|
||
|
|
for (const key of Object.keys(source)) {
|
||
|
|
if (target[key] === undefined) {
|
||
|
|
const namespace = parentNamespace ? parentNamespace + '.' + key : key;
|
||
|
|
throw new Error(`Unknown browser setting "${namespace}"`);
|
||
|
|
}
|
||
|
|
if (typeof target[key] === 'object' && !Array.isArray(target[key]) && target[key] !== null) {
|
||
|
|
const namespace = parentNamespace ? parentNamespace + '.' + key : key;
|
||
|
|
if (typeof source[key] !== 'object' || Array.isArray(source[key]) || source[key] === null) {
|
||
|
|
throw new Error(`Browser setting "${namespace}" cannot be null`);
|
||
|
|
}
|
||
|
|
this.validate(target[key], source[key], namespace);
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
if ((typeof target[key] === 'boolean' ||
|
||
|
|
typeof target[key] === 'number' ||
|
||
|
|
typeof target[key] === 'string') &&
|
||
|
|
typeof source[key] !== typeof target[key]) {
|
||
|
|
const isValidPreventTimerLoops = key === 'preventTimerLoops' && typeof source[key] === 'object' && source[key] !== null;
|
||
|
|
if (!isValidPreventTimerLoops) {
|
||
|
|
const namespace = parentNamespace ? parentNamespace + '.' + key : key;
|
||
|
|
throw new Error(`Browser setting "${namespace}" must be of type "${typeof target[key]}"`);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
//# sourceMappingURL=BrowserSettingsFactory.js.map
|