/** * Clean install configuration built from user input. * User input comes from either UI answers or headless CLI flags. */ class Config { constructor({ directory, modules, ides, skipPrompts, verbose, actionType, coreConfig, moduleConfigs, quickUpdate, channelOptions, setOverrides, noBadge, badgeOwner, badgeRepo, }) { this.directory = directory; this.modules = Object.freeze([...modules]); this.ides = Object.freeze([...ides]); this.skipPrompts = skipPrompts; this.verbose = verbose; this.actionType = actionType; this.coreConfig = coreConfig; this.moduleConfigs = moduleConfigs; this._quickUpdate = quickUpdate; // channelOptions carry a Map + Set; don't deep-freeze. this.channelOptions = channelOptions || null; // Parsed `--set .=` overrides, applied as a TOML // patch AFTER the install finishes. Shape: { moduleCode: { key: value } }. // Intentionally NOT integrated with the prompt/template/schema flow; see // `tools/installer/set-overrides.js` for the rationale and tradeoffs. this.setOverrides = setOverrides || {}; this.noBadge = noBadge || false; this.badgeOwner = badgeOwner || null; this.badgeRepo = badgeRepo || null; Object.freeze(this); } /** * Build a clean install config from raw user input. * @param {Object} userInput - UI answers or CLI flags * @returns {Config} */ static build(userInput) { const modules = [...(userInput.modules || [])]; if (userInput.installCore && !modules.includes('core')) { modules.unshift('core'); } return new Config({ directory: userInput.directory, modules, ides: userInput.skipIde ? [] : [...(userInput.ides || [])], skipPrompts: userInput.skipPrompts || false, verbose: userInput.verbose || false, actionType: userInput.actionType, coreConfig: userInput.coreConfig || {}, moduleConfigs: userInput.moduleConfigs || null, quickUpdate: userInput._quickUpdate || false, channelOptions: userInput.channelOptions || null, setOverrides: userInput.setOverrides || {}, noBadge: userInput.noBadge || false, badgeOwner: userInput.badgeOwner || null, badgeRepo: userInput.badgeRepo || null, }); } hasCoreConfig() { return this.coreConfig && Object.keys(this.coreConfig).length > 0; } isQuickUpdate() { return this._quickUpdate; } } module.exports = { Config };