UNPKG

@altostra/core

Version:

Core library for shared types and logic

1 lines 3.57 kB
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,i,s){return new(i||(i=Promise))((function(r,n){function o(e){try{l(s.next(e))}catch(e){n(e)}}function a(e){try{l(s.throw(e))}catch(e){n(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,a)}l((s=s.apply(e,t||[])).next())}))};Object.defineProperty(exports,"__esModule",{value:!0}),exports.SettingsManager=void 0;const fs_1=require("fs"),path_1=require("path"),AltoError_1=require("../../common/Errors/AltoError"),FS_1=require("../../common/Utils/FS"),some_1=require("@reactivex/ix-es2015-cjs/iterable/some"),Common_1=require("./Common"),Privates_1=require("./Privates"),Settings_1=require("./Settings"),{readFile:readFile}=fs_1.promises,defaultSettingsOptions={settingsProvider:e=>loadJsonFile(e),persistSettings:saveJsonFile};class SettingsManager{constructor(e,t=(0,Common_1.globalsPath)(),i={}){this._defaults=e,this.globalConfigPath=t;const s=Object.keys(e);validateSettingsKeys(s),this._keys=new Set(s),this._keys.add(Common_1.KEY_ACTIVE_CONFIG),this.defaults=new Settings_1.Settings(this,{type:"default",keys:this._keys,settings:e}),this[Privates_1.SETTINGS_OPTIONS]=Object.assign(Object.assign({},defaultSettingsOptions),i)}get keys(){return this._keys}isOverriddenKey(e,t){return __awaiter(this,void 0,void 0,(function*(){const{overrides:i}=yield this._globalsAndOverrides();return i(e,t)}))}getGlobalSettings(){return __awaiter(this,void 0,void 0,(function*(){return(yield this._globalsAndOverrides()).settings}))}getProjectSettings(e){return __awaiter(this,void 0,void 0,(function*(){e=(0,path_1.join)(null!=e?e:process.cwd(),Common_1.PROJECT_PATH);const[t,{overrides:i,globals:s}]=yield Promise.all([this[Privates_1.SETTINGS_OPTIONS].settingsProvider(e),this._globalsAndOverrides()]),r=Object.assign(Object.create(s),t);return new Settings_1.Settings(this,{type:"project",keys:this._keys,settings:r,overriddenKeys:i,globals:s},e)}))}isConfigurationKey(e){return this.keys.has(e)}_globalsAndOverrides(){return __awaiter(this,void 0,void 0,(function*(){const e=this;return this._globalsAndOverridesP?yield this._globalsAndOverridesP:yield this._globalsAndOverridesP=function(){return __awaiter(this,void 0,void 0,(function*(){const t=yield e[Privates_1.SETTINGS_OPTIONS].settingsProvider(e.globalConfigPath),i=Object.assign(Object.create(e._defaults),t),s=new Settings_1.Settings(e,{type:"global",keys:e._keys,settings:i},e.globalConfigPath);return{settings:s,overrides:(e,t)=>s.isOverride(e,t),globals:i}}))}()}))}}function loadJsonFile(e,t){return __awaiter(this,void 0,void 0,(function*(){try{e=resolveHome(e);const i=yield readFile(e,"utf8"),s=JSON.parse(i);if(t&&!t(s))throw AltoError_1.AltoError.create({message:"Loaded settings data is invalid.",data:s});return s}catch(e){if(e instanceof AltoError_1.AltoError)throw e;return{}}}))}function saveJsonFile(e,t){return __awaiter(this,void 0,void 0,(function*(){e=resolveHome(e),yield(0,FS_1.saveJsonFile)(e,t,{indent:2,createDir:!0})}))}function resolveHome(e){var t;if(!e.startsWith("~/"))return e;const i=null!==(t=process.env.HOME)&&void 0!==t?t:process.env.USERPROFILE;if(void 0===i)throw new AltoError_1.AltoError("Cannot resolve home dir.");return(0,path_1.join)(i,e.substr(2))}function validateSettingsKeys(e){if((0,some_1.some)(e,e=>e===Common_1.KEY_ACTIVE_CONFIG||(0,Privates_1.isNamespace)(e)))throw new AltoError_1.AltoError(`Invalid configuration keys. Configuration cannot have namespaces keys nor '${Common_1.KEY_ACTIVE_CONFIG}' key`)}exports.SettingsManager=SettingsManager;