@altostra/core
Version:
Core library for shared types and logic
1 lines • 6.26 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0}),exports.mkCache=exports.getWrappedSettingsData=exports.isOwnProperty=exports.isNamespace=exports.NAMESPACE_DELIMITER=exports.isOverridingSetting=exports.SETTINGS_OPTIONS=void 0;const AltoError_1=require("../../common/Errors/AltoError"),from_1=require("@reactivex/ix-es2015-cjs/iterable/from"),filter_1=require("@reactivex/ix-es2015-cjs/iterable/operators/filter"),Utils_1=require("../Utils"),Common_1=require("./Common");function isOverridingSetting(e){return(0,Utils_1.isObject)(e)&&"boolean"==typeof e.$overrides}function isNamespace(e){return"string"==typeof e&&e.startsWith(exports.NAMESPACE_DELIMITER)}function getCurrentNamespace(e){var r;return null!==(r=e[Common_1.KEY_ACTIVE_CONFIG])&&void 0!==r?r:""}function getOverrideValue(e){return isOverridingSetting(e)?e.value:e}exports.SETTINGS_OPTIONS=Symbol("SettingsOptions"),exports.isOverridingSetting=isOverridingSetting,exports.NAMESPACE_DELIMITER="::",exports.isNamespace=isNamespace;const basicWrapperBehavior={setPrototypeOf:()=>!1,isExtensible:()=>!1,defineProperty:()=>!1,deleteProperty:()=>!1,preventExtensions:()=>!1},settingsWrapperStrategy={default:({settings:e,keys:r})=>({wrapper:new Proxy(e,Object.assign(Object.assign({},basicWrapperBehavior),{get(t,s,n){if(s===Common_1.KEY_ACTIVE_CONFIG)return"";if(!r.has(s))return;const o=e[s];if(isOverridingSetting(o))throw new AltoError_1.AltoError("Defaults should not contain overriding properties.");return o},set:(e,r,t,s)=>!1})),isOverride:()=>!1,getSettingType:()=>"default",deleteKey(){throw new AltoError_1.AltoError("Cannot delete default setting.")},getNamespace:()=>"",refreshSettings(){}}),global({settings:e,keys:r}){let t=mkNamespacesCache(e),s=t(getOverrideValue(getCurrentNamespace(e)));return{wrapper:new Proxy(e,Object.assign(Object.assign({},basicWrapperBehavior),{get(t,n,o){if(!r.has(n))return;return getOverrideValue(n===Common_1.KEY_ACTIVE_CONFIG?getCurrentNamespace(e):s[n])},set(n,o,i,a){if(!r.has(o))return!1;if(o===Common_1.KEY_ACTIVE_CONFIG){const r=getOverrideValue(getCurrentNamespace(e)),n=getOverrideValue(i);if(r!==n){if("string"!=typeof n)return!1;s=t(n)}}return function(r){const t=r,n=t===Common_1.KEY_ACTIVE_CONFIG?e:s;if(isOverridingSetting(i))i.$overrides?n[t]=i:n[t]=i.value;else{const e=n[t];isOverridingSetting(e)?e.value=i:n[t]=i}}(o),!0}})),isOverride:(e,r)=>isOverridingSetting(t(e)[r]),getSettingType:r=>{const s=isKeyFromNamespacesChain(r,getOverrideValue(getCurrentNamespace(e)),t);return"global-override"===s?"global-override":s?"global":"default"},deleteKey(r){isOwnProperty(e,r)&&delete e[r]},getNamespace:r=>getSettingNamespace(s,getOverrideValue(getCurrentNamespace(e)).split(exports.NAMESPACE_DELIMITER),r),refreshSettings(n){refreshNamespace(n,e,r),t=mkNamespacesCache(e),s=t(getOverrideValue(getCurrentNamespace(e)))}}},project({settings:e,keys:r,overriddenKeys:t,globals:s}){let n=mkNamespacesCache(e);const o=mkNamespacesCache(s),i=getOverrideValue(getCurrentNamespace(e));let a=n(i),c=o(i);const p=r=>t(getOverrideValue(getCurrentNamespace(e)),r);return{wrapper:new Proxy(e,Object.assign(Object.assign({},basicWrapperBehavior),{get(t,n,o){if(!r.has(n))return;let i;if(n===Common_1.KEY_ACTIVE_CONFIG){i=getCurrentNamespace(p(n)?s:e)}else{const e=n;i=p(e)?c[e]:a[e]}return getOverrideValue(i)},set(t,s,i,g){if(!r.has(s))return!1;if(isOverridingSetting(i))throw new AltoError_1.AltoError("Project settings cannot have overriding settings.");const l=s;if(p(l))throw new AltoError_1.AltoError("Cannot set an overridden value. Set global value instead.");return(l===Common_1.KEY_ACTIVE_CONFIG?e:a)[l]=i,l===Common_1.KEY_ACTIVE_CONFIG&&(a=n(i),c=o(i)),!0}})),isOverride:e=>p(e),getSettingType:r=>{const t=getOverrideValue(getCurrentNamespace(e)),s=isKeyFromNamespacesChain(r,t,n);if("global-override"===s)return"global-override";if(s)return"project";{const e=isKeyFromNamespacesChain(r,t,o);return"global-override"===e?"global-override":e?"global":"default"}},deleteKey(r){isOwnProperty(e,r)&&delete e[r]},getNamespace(r){const{settingsSource:t,nsSource:n}=p(r)?{settingsSource:c,nsSource:s}:{settingsSource:a,nsSource:e};return getSettingNamespace(t,getOverrideValue(getCurrentNamespace(n)).split(exports.NAMESPACE_DELIMITER),r)},refreshSettings(t){refreshNamespace(t,e,r),n=mkNamespacesCache(e);const s=getOverrideValue(getCurrentNamespace(e));a=n(s),c=o(s)}}}};function isOwnProperty(e,r){return Object.prototype.hasOwnProperty.call(e,r)}function getWrappedSettingsData(e){switch(e.type){case"default":return settingsWrapperStrategy.default(e);case"global":return settingsWrapperStrategy.global(e);case"project":return settingsWrapperStrategy.project(e);default:throw new AltoError_1.AltoError("Unexpected error occurred")}}function mkCache(e){const r={};return t=>{let s=r[t];return s||(r[t]=s=e(t,r)),s}}function mkNamespacesCache(e){return mkCache((r,t)=>{const s=r.split(exports.NAMESPACE_DELIMITER);let n=e,o="";if(""===r)return e;for(const e of s){const r=exports.NAMESPACE_DELIMITER+e;o+=r;const s=n;t[o]?n=t[o]:(n=Object.create(s),Object.assign(n,s[r]),s[r]=n,t[o]=n)}return n})}function getSettingNamespace(e,r,t){for(;r.length>0&&!isOwnProperty(e,t);)e=Object.getPrototypeOf(e),r.pop();return r.join(exports.NAMESPACE_DELIMITER)}function getNamespaceObject(e,r){var t,s;const n=e.substr(exports.NAMESPACE_DELIMITER.length).split(exports.NAMESPACE_DELIMITER);if(0===n.length)return r;let o=r[n[0]]=null!==(t=r[n[0]])&&void 0!==t?t:{};for(let e=1;e<n.length;e++)o=o[n[e]]=null!==(s=o[n[e]])&&void 0!==s?s:{};return o}function refreshNamespace(e,r,t){for(const s of t)isOwnProperty(e,s)?r[s]=e[s]:isOwnProperty(r,s)&&delete r[s];for(const e of Object.keys(r))isNamespace(e)&&delete r[e];const s=(0,from_1.from)(Object.keys(e)).pipe((0,filter_1.filter)(isNamespace));for(const n of s){const s=getNamespaceObject(n,r);refreshNamespace(e[n],s,t)}}function isKeyFromNamespacesChain(e,r,t){let s=t(r);do{if(isOverridingSetting(s[e]))return"global-override";if(isOwnProperty(s,e))return!0;if(r){const e=r.lastIndexOf(exports.NAMESPACE_DELIMITER);s=t(r=-1===e?"":r.substr(0,e))}else s=void 0}while(s);return!1}exports.isOwnProperty=isOwnProperty,exports.getWrappedSettingsData=getWrappedSettingsData,exports.mkCache=mkCache;