const path = require("path"); const fs = require("fs"); const yaml = require("js-yaml"); const Ajv = require("ajv"); const ajv = new Ajv({ allErrors: true }); const configSchema = require("./config-schema.json"); /** * Load a yaml config file from a given path. * * @param path * @return {Object} */ function getConfig(path) { return yaml.safeLoad(fs.readFileSync(path, "utf8")); } /** * Check that a config object is valid. * * @param {Object} config Config object * @param {boolean} warn Should we warn in console for errors * @return {boolean} */ function isConfigValid(config, warn = true) { const validate = ajv.compile(configSchema); const isValidAgainstSchema = validate(config); if (!isValidAgainstSchema && warn) console.warn(validate.errors); let structureIsValid = false; try { structureIsValid = config.frontend.performance.pointerEventsThrottling.some( (item) => item.fromUserCount === 0 ); } catch (e) { if (!e instanceof TypeError) { throw e; } } if (!structureIsValid && warn) console.warn( "At least one item under frontend.performance.pointerEventsThrottling" + "must have fromUserCount set to 0" ); return isValidAgainstSchema && structureIsValid; } /** * Load the default project config * @return {Object} */ function getDefaultConfig() { const defaultConfigPath = path.join(__dirname, "..", "..", "config.default.yml"); return getConfig(defaultConfigPath); } /** * Deep merge of project config * * Objects are merged, not arrays * * @param baseConfig * @param overrideConfig * @return {Object} */ function deepMergeConfigs(baseConfig, overrideConfig) { const out = {}; Object.entries(baseConfig).forEach(([key, val]) => { out[key] = val; if (overrideConfig.hasOwnProperty(key)) { const overrideVal = overrideConfig[key]; if (typeof val === "object" && !Array.isArray(val) && val !== null) { out[key] = deepMergeConfigs(val, overrideVal); } else { out[key] = overrideVal; } } }); return out; } module.exports.getConfig = getConfig; module.exports.getDefaultConfig = getDefaultConfig; module.exports.deepMergeConfigs = deepMergeConfigs; module.exports.isConfigValid = isConfigValid;