if (!window.NexT) window.NexT = {}; (function() { const className = 'next-config'; const staticConfig = {}; let variableConfig = {}; const parse = text => JSON.parse(text || '{}'); const update = name => { const targetEle = document.querySelector(`.${className}[data-name="${name}"]`); if (!targetEle) return; const parsedConfig = parse(targetEle.text); if (name === 'main') { Object.assign(staticConfig, parsedConfig); } else { variableConfig[name] = parsedConfig; } }; update('main'); window.CONFIG = new Proxy({}, { get(overrideConfig, name) { let existing; if (name in staticConfig) { existing = staticConfig[name]; } else { if (!(name in variableConfig)) update(name); existing = variableConfig[name]; } // For unset override and mixable existing if (!(name in overrideConfig) && typeof existing === 'object') { // Get ready to mix. overrideConfig[name] = {}; } if (name in overrideConfig) { const override = overrideConfig[name]; // When mixable if (typeof override === 'object' && typeof existing === 'object') { // Mix, proxy changes to the override. return new Proxy({ ...existing, ...override }, { set(target, prop, value) { target[prop] = value; override[prop] = value; return true; } }); } return override; } // Only when not mixable and override hasn't been set. return existing; } }); document.addEventListener('pjax:success', () => { variableConfig = {}; }); })();