@openmrs/esm-config 3.1.15-pre.680 → 3.1.15-pre.693

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- System.register(["@openmrs/esm-state","single-spa"],(function(e,t){var n={},r={};return{setters:[function(e){n.createGlobalStore=e.createGlobalStore,n.getGlobalStore=e.getGlobalStore},function(e){r.navigateToUrl=e.navigateToUrl}],execute:function(){e((()=>{var e={712:(e,t,n)=>{var r=n(823),o=n(773)((function(e,t){return r(e.length,(function(){return e.apply(t,arguments)}))}));e.exports=o},122:(e,t,n)=>{var r=n(918),o=n(764)((function(e){return null!=e&&"function"==typeof e.clone?e.clone():r(e,[],[],!0)}));e.exports=o},823:e=>{e.exports=function(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,i){return t.apply(this,arguments)};case 6:return function(e,n,r,o,i,s){return t.apply(this,arguments)};case 7:return function(e,n,r,o,i,s,a){return t.apply(this,arguments)};case 8:return function(e,n,r,o,i,s,a,c){return t.apply(this,arguments)};case 9:return function(e,n,r,o,i,s,a,c,u){return t.apply(this,arguments)};case 10:return function(e,n,r,o,i,s,a,c,u,f){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}},918:(e,t,n)=>{var r=n(259),o=n(704);e.exports=function e(t,n,i,s){var a=function(r){for(var o=n.length,a=0;a<o;){if(t===n[a])return i[a];a+=1}for(var c in n[a+1]=t,i[a+1]=r,t)r[c]=s?e(t[c],n,i,!0):t[c];return r};switch(o(t)){case"Object":return a({});case"Array":return a([]);case"Date":return new Date(t.valueOf());case"RegExp":return r(t);default:return t}}},259:e=>{e.exports=function(e){return new RegExp(e.source,(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.sticky?"y":"")+(e.unicode?"u":""))}},764:(e,t,n)=>{var r=n(230);e.exports=function(e){return function t(n){return 0===arguments.length||r(n)?t:e.apply(this,arguments)}}},773:(e,t,n)=>{var r=n(764),o=n(230);e.exports=function(e){return function t(n,i){switch(arguments.length){case 0:return t;case 1:return o(n)?t:r((function(t){return e(n,t)}));default:return o(n)&&o(i)?t:o(n)?r((function(t){return e(t,i)})):o(i)?r((function(t){return e(n,t)})):e(n,i)}}}},138:(e,t,n)=>{var r=n(764),o=n(773),i=n(230);e.exports=function(e){return function t(n,s,a){switch(arguments.length){case 0:return t;case 1:return i(n)?t:o((function(t,r){return e(n,t,r)}));case 2:return i(n)&&i(s)?t:i(n)?o((function(t,n){return e(t,s,n)})):i(s)?o((function(t,r){return e(n,t,r)})):r((function(t){return e(n,s,t)}));default:return i(n)&&i(s)&&i(a)?t:i(n)&&i(s)?o((function(t,n){return e(t,n,a)})):i(n)&&i(a)?o((function(t,n){return e(t,s,n)})):i(s)&&i(a)?o((function(t,r){return e(n,t,r)})):i(n)?r((function(t){return e(t,s,a)})):i(s)?r((function(t){return e(n,t,a)})):i(a)?r((function(t){return e(n,s,t)})):e(n,s,a)}}}},673:e=>{e.exports=function(e,t){return Object.prototype.hasOwnProperty.call(t,e)}},726:e=>{e.exports=Array.isArray||function(e){return null!=e&&e.length>=0&&"[object Array]"===Object.prototype.toString.call(e)}},534:(e,t,n)=>{var r=n(764),o=n(726),i=n(468),s=r((function(e){return!!o(e)||!!e&&"object"==typeof e&&!i(e)&&(1===e.nodeType?!!e.length:0===e.length||e.length>0&&e.hasOwnProperty(0)&&e.hasOwnProperty(e.length-1))}));e.exports=s},78:e=>{e.exports=function(e){return"[object Object]"===Object.prototype.toString.call(e)}},230:e=>{e.exports=function(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}},468:e=>{e.exports=function(e){return"[object String]"===Object.prototype.toString.call(e)}},623:(e,t,n)=>{var r=n(534),o=n(782),i=n(712);function s(e,t,n){for(var r=n.next();!r.done;){if((t=e["@@transducer/step"](t,r.value))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r=n.next()}return e["@@transducer/result"](t)}function a(e,t,n,r){return e["@@transducer/result"](n[r](i(e["@@transducer/step"],e),t))}var c="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";e.exports=function(e,t,n){if("function"==typeof e&&(e=o(e)),r(n))return function(e,t,n){for(var r=0,o=n.length;r<o;){if((t=e["@@transducer/step"](t,n[r]))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r+=1}return e["@@transducer/result"](t)}(e,t,n);if("function"==typeof n["fantasy-land/reduce"])return a(e,t,n,"fantasy-land/reduce");if(null!=n[c])return s(e,t,n[c]());if("function"==typeof n.next)return s(e,t,n);if("function"==typeof n.reduce)return a(e,t,n,"reduce");throw new TypeError("reduce: list must be array or iterable")}},782:e=>{var t=function(){function e(e){this.f=e}return e.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},e.prototype["@@transducer/result"]=function(e){return e},e.prototype["@@transducer/step"]=function(e,t){return this.f(e,t)},e}();e.exports=function(e){return new t(e)}},317:(e,t,n)=>{var r=n(773),o=n(937),i=r((function(e,t){return o((function(e,t,n){return n}),e,t)}));e.exports=i},937:(e,t,n)=>{var r=n(138),o=n(78),i=n(145),s=r((function e(t,n,r){return i((function(n,r,i){return o(r)&&o(i)?e(t,r,i):t(n,r,i)}),n,r)}));e.exports=s},145:(e,t,n)=>{var r=n(138),o=n(673),i=r((function(e,t,n){var r,i={};for(r in t)o(r,t)&&(i[r]=o(r,n)?e(r,t[r],n[r]):t[r]);for(r in n)o(r,n)&&!o(r,i)&&(i[r]=n[r]);return i}));e.exports=i},61:(e,t,n)=>{var r=n(138)(n(623));e.exports=r},704:(e,t,n)=>{var r=n(764)((function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)}));e.exports=r},685:e=>{"use strict";e.exports=n},645:e=>{"use strict";e.exports=r}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return(()=>{"use strict";o.r(i),o.d(i,{Type:()=>c,configExtensionStore:()=>x,configInternalStore:()=>m,defineConfigSchema:()=>I,getConfig:()=>P,getConfigStore:()=>j,getExtensionConfigStore:()=>_,getExtensionSlotsConfigStore:()=>$,implementerToolsConfigStore:()=>w,inRange:()=>ne,interpolateString:()=>ee,interpolateUrl:()=>Z,isUrl:()=>oe,isUrlWithTemplateParameters:()=>re,navigate:()=>te,processConfig:()=>N,provide:()=>D,temporaryConfigStore:()=>O,validator:()=>u,validators:()=>ie});var e=o(317),t=o.n(e),n=o(61),r=o.n(n),s=o(122),a=o.n(s);let c;function u(e,t){return n=>{if(!e(n))return t}}!function(e){e.Array="Array",e.Boolean="Boolean",e.ConceptUuid="ConceptUuid",e.Number="Number",e.Object="Object",e.String="String",e.UUID="UUID"}(c||(c={}));const f=u((e=>Array.isArray(e)),"must be an array"),l=u((e=>"boolean"==typeof e),"must be a boolean"),d=u((e=>"number"==typeof e),"must be a number"),p=u((e=>"string"==typeof e),"must be a string"),g=u((e=>"object"==typeof e&&!Array.isArray(e)&&null!==e),"must be an object (not an array or null)"),y=u((e=>/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)||/^[0-9a-f]{36}$/i.test(e)),"must be a valid UUID or a 36-character hexadecimal string");var b=o(685);const v={providedConfigs:[],schemas:{},devDefaultsAreOn:S()},m=(0,b.createGlobalStore)("config-internal",v);let h=S();function S(){try{return JSON.parse(localStorage.getItem("openmrs:configAreDevDefaultsOn")||"false")}catch(e){return!1}}m.subscribe((e=>{var t;e.devDefaultsAreOn!=h&&(t=e.devDefaultsAreOn,localStorage.setItem("openmrs:configAreDevDefaultsOn",JSON.stringify(t)),h=e.devDefaultsAreOn)}));const O=(0,b.createGlobalStore)("temporary-config",{config:function(){try{return JSON.parse(localStorage.getItem("openmrs:temporaryConfig")||"{}")}catch(e){return{}}}()});O.subscribe((e=>{var t;t=e.config,localStorage.setItem("openmrs:temporaryConfig",JSON.stringify(t))}));const x=(0,b.createGlobalStore)("config-extensions",{mountedExtensions:[]});function j(e){return(0,b.getGlobalStore)(`config-module-${e}`,{config:null,loaded:!1})}function $(e){return(0,b.getGlobalStore)(`config-extension-slots-${e}`,{extensionSlotConfigs:{},loaded:!1})}function _(e,t,n){return(0,b.getGlobalStore)(`config-extension-${e}-${t}-${n}`,{config:null,loaded:!1})}const w=(0,b.createGlobalStore)("config-implementer-tools",{config:{}});function A(e){for(let t of Object.keys(e.schemas)){const e=J(t);j(t).setState({loaded:!0,config:e})}}function k(e){const t=function(){const e=q(M()),t=Object.keys(e).reduce(((t,n)=>{var r,o;return null!==(r=e[n])&&void 0!==r&&r.extensions&&(t[n]=null===(o=e[n])||void 0===o?void 0:o.extensions),t}),{});return function(e){for(let[t,n]of Object.entries(e))for(let[e,r]of Object.entries(n))B(r,t,e)}(t),t}();for(let[e,n]of Object.entries(t))$(e).setState({loaded:!0,extensionSlotConfigs:n})}function U(e){const t=function(){const e=m.getState();let t=T(a()(e.schemas));const n=[...e.providedConfigs.map((e=>[e.config,e.source])),[O.getState().config,"temporary config"]];for(let[e,r]of n)t=q([t,G(e,r)]);return t}();w.setState({config:t})}function C(e,t){for(let e of t.mountedExtensions){const t=_(e.slotModuleName,e.slotName,e.extensionId),n=E(e.slotModuleName,e.extensionModuleName,e.slotName,e.extensionId);t.setState({loaded:!0,config:n})}}function I(e,t){R(e,t);const n=m.getState();m.setState({schemas:{...n.schemas,[e]:t}})}function D(e,t="provided"){const n=m.getState();m.setState({providedConfigs:[...n.providedConfigs,{source:t,config:e}]})}function P(e){return new Promise((t=>{const n=j(e);function r(e){e.loaded&&e.config&&(t(e.config),o&&o())}r(n.getState());const o=n.subscribe(r)}))}function N(e,t,n){return F(e,t,n),K(e,t)}function E(e,t,n,r){var o,i,s,a;const c=W(e,M()),u=null!==(o=null==c||null===(i=c.extensions)||void 0===i||null===(s=i[n])||void 0===s||null===(a=s.configure)||void 0===a?void 0:a[r])&&void 0!==o?o:{},f=q([W(t,M()),u]),l=m.getState().schemas[t];F(l,f,t);const d=K(l,f);return delete d.extensions,d}function T(e){return e.hasOwnProperty("_default")?{...e,_value:e._default,_source:"default"}:V(e)?Object.keys(e).reduce(((t,n)=>(t[n]=T(e[n]),t)),{}):{}}function G(e,t){return V(e)?Object.keys(e).reduce(((n,r)=>(n[r]=G(e[r],t),n)),{}):{_value:e,_source:t}}function B(e,t,n){const r=`Extension slot config '${t}.extensions.${n}`,o=Object.keys(e).filter((e=>!["add","remove","order","configure"].includes(e)));o.length&&console.error(r+`' contains invalid keys '${o.join("', '")}'`),e.add&&(Array.isArray(e.add)&&e.add.every((e=>"string"==typeof e))||console.error(r+".add' is invalid. Must be an array of strings (extension IDs)")),e.remove&&(Array.isArray(e.remove)&&e.remove.every((e=>"string"==typeof e))||console.error(r+".remove' is invalid. Must be an array of strings (extension IDs)")),e.order&&(Array.isArray(e.order)&&e.order.every((e=>"string"==typeof e))||console.error(r+".order' is invalid. Must be an array of strings (extension IDs)")),e.configure&&(V(e.configure)||console.error(r+".configure' is invalid. Must be an object with extension IDs for keys"))}function M(){return[...m.getState().providedConfigs.map((e=>e.config)),O.getState().config]}function R(e,t,n=""){const r="Please verify that you are running the latest version and, if so, alert the maintainer.";for(const o of Object.keys(t).filter((e=>!e.startsWith("_")))){const i=n+(n&&".")+o,s=t[o];if(!V(s)){console.error(`${e} has bad config schema definition for key '${i}'. ${r}`);continue}s.hasOwnProperty("_default")||R(e,s,i);const a=s._elements;if(Q(a)&&R(e,a,i+"._elements"),s._validators)for(let t of s._validators)"function"!=typeof t&&console.error(`${e} has invalid validator for key '${i}' ${r}.\n\nIf you're the maintainer: validators must be functions that return either undefined or an error string. Received ${t}.`);const u=s._type;u&&!Object.values(c).includes(u)&&console.error(`${e} has invalid type for key '${i}' ${r}.\n\nIf you're the maintainer: the allowed types are ${Object.values(c).join(", ")}. Received '${u}'`),Object.keys(s).every((e=>["_description","_validators","_elements","_type"].includes(e)))&&!n.includes("._elements")&&console.error(`${e} has bad config schema definition for key '${i}'. ${r}.\n\nIf you're the maintainer: all config elements must have a default. Received ${JSON.stringify(s)}`),a&&u&&![c.Array,c.Object].includes(u)&&console.error(`${e} has bad config schema definition for key '${i}'. ${r}.\n\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. Received ${JSON.stringify(u)}`)}}function J(e){const t=m.getState();if(!t.schemas.hasOwnProperty(e))throw Error("No config schema has been defined for "+e);const n=t.schemas[e],r=W(e,M());F(n,r,e);const o=K(n,r);return delete o.extensions,o}function W(e,t){return q(t.map((({[e]:t})=>t)).filter((e=>!!e)))}function q(e){return r()(t())({},e)}A(m.getState()),m.subscribe(A),O.subscribe((()=>A(m.getState()))),U(m.getState()),m.subscribe(U),O.subscribe((()=>U(m.getState()))),k(m.getState()),m.subscribe(k),O.subscribe((()=>k(m.getState()))),C(m.getState(),x.getState()),m.subscribe((e=>C(0,x.getState()))),x.subscribe((e=>C(m.getState(),e))),O.subscribe((()=>C(m.getState(),x.getState())));const F=(e,t,n="")=>{for(const r of Object.keys(t)){const o=t[r],i=n+"."+r,s=e[r];e.hasOwnProperty(r)?(z(i,s._type,o),H(i,s._validators,o),V(o)?s._type===c.Object?L(s,o,i):s.hasOwnProperty("_default")||F(s,o,i):s._type===c.Array&&X(s,o,i)):"extensions"!==r&&console.error(`Unknown config key '${i}' provided. Ignoring.`)}};function L(e,t,n){if(e._elements)for(const r of Object.keys(t)){const o=t[r];F(e._elements,o,`${n}.${r}`)}}function X(e,t,n){if(Q(e._elements))for(let r=0;r<t.length;r++)F(e._elements,t[r],`${n}[${r}]`);for(let i=0;i<t.length;i++){var r,o;z(`${n}[${i}]`,null===(r=e._elements)||void 0===r?void 0:r._type,t[i]),H(`${n}[${i}]`,null===(o=e._elements)||void 0===o?void 0:o._validators,t[i])}}function z(e,t,n){t&&H(e,[{Array:f,Boolean:l,ConceptUuid:y,Number:d,Object:g,String:p,UUID:y}[t]],n)}function H(e,t,n){if(t)try{for(let r of t){const t=r(n);if("string"==typeof t){const r="object"==typeof n?JSON.stringify(n):n;console.error(`Invalid configuration value ${r} for ${e}: ${t}`)}}}catch(t){console.error(`Skipping invalid validator at "${e}".`)}}const K=(e,t)=>{const n=a()(t),r=m.getState().devDefaultsAreOn;if(!e)return n;for(const t of Object.keys(e)){const o=n[t],i=e[t];if(i&&i.hasOwnProperty("_default")){if(!n.hasOwnProperty(t)){const e=i._devDefault||i._default;n[t]=r?e:i._default}const e=i._elements;if(o&&Q(e))if(i._type===c.Array){const r=o.map((t=>K(e,t)));n[t]=r}else if(i._type===c.Object)for(let t of Object.keys(o))o[t]=K(e,o[t])}else if(V(i)){const e=n.hasOwnProperty(t)?o:{};V(e)&&(n[t]=K(i,e))}}return n};function Q(e){return!!e&&Object.keys(e).filter((e=>!["_default","_validators"].includes(e))).length>0}function V(e){return"object"==typeof e&&!Array.isArray(e)&&null!==e}var Y=o(645);function Z(e){const t=window.getOpenmrsSpaBase().replace(/\/$/,"");return ee(e,{openmrsBase:window.openmrsBase,openmrsSpaBase:t}).replace(/^\/\//,"/")}function ee(e,t){return Object.keys(t).reduce(((e,n)=>e.split("${"+n+"}").join(t[n])),e)}function te({to:e}){const t=window.getOpenmrsSpaBase().replace(/\/$/,""),n=Z(e);n.startsWith(t)?(0,Y.navigateToUrl)(n):window.location.assign(n)}const ne=(e,t)=>u((n=>e<=n&&n<=t),`must be between ${e} and ${t}`),re=e=>{const t=e.concat(["openmrsBase","openmrsSpaBase"]);return u((e=>{if(!e||"string"!=typeof e)return!1;const n=/\${(.*?)}/g;let r=n.exec(e);for(;r;){if(!t.includes(r[1]))return!1;r=n.exec(e)}return!0}),"should be a URL or path. The allowed template parameters are "+t.map((e=>"${"+e+"}")).join(", "))},oe=re([]),ie={inRange:ne,isUrl:oe,isUrlWithTemplateParameters:re}})(),i})())}}}));
1
+ System.register(["@openmrs/esm-state","single-spa"],(function(e,t){var n={},r={};return{setters:[function(e){n.createGlobalStore=e.createGlobalStore,n.getGlobalStore=e.getGlobalStore},function(e){r.navigateToUrl=e.navigateToUrl}],execute:function(){e((()=>{var e={712:(e,t,n)=>{var r=n(823),o=n(773)((function(e,t){return r(e.length,(function(){return e.apply(t,arguments)}))}));e.exports=o},122:(e,t,n)=>{var r=n(918),o=n(764)((function(e){return null!=e&&"function"==typeof e.clone?e.clone():r(e,[],[],!0)}));e.exports=o},823:e=>{e.exports=function(e,t){switch(e){case 0:return function(){return t.apply(this,arguments)};case 1:return function(e){return t.apply(this,arguments)};case 2:return function(e,n){return t.apply(this,arguments)};case 3:return function(e,n,r){return t.apply(this,arguments)};case 4:return function(e,n,r,o){return t.apply(this,arguments)};case 5:return function(e,n,r,o,i){return t.apply(this,arguments)};case 6:return function(e,n,r,o,i,s){return t.apply(this,arguments)};case 7:return function(e,n,r,o,i,s,a){return t.apply(this,arguments)};case 8:return function(e,n,r,o,i,s,a,u){return t.apply(this,arguments)};case 9:return function(e,n,r,o,i,s,a,u,c){return t.apply(this,arguments)};case 10:return function(e,n,r,o,i,s,a,u,c,f){return t.apply(this,arguments)};default:throw new Error("First argument to _arity must be a non-negative integer no greater than ten")}}},918:(e,t,n)=>{var r=n(259),o=n(704);e.exports=function e(t,n,i,s){var a=function(r){for(var o=n.length,a=0;a<o;){if(t===n[a])return i[a];a+=1}for(var u in n[a+1]=t,i[a+1]=r,t)r[u]=s?e(t[u],n,i,!0):t[u];return r};switch(o(t)){case"Object":return a({});case"Array":return a([]);case"Date":return new Date(t.valueOf());case"RegExp":return r(t);default:return t}}},259:e=>{e.exports=function(e){return new RegExp(e.source,(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.sticky?"y":"")+(e.unicode?"u":""))}},764:(e,t,n)=>{var r=n(230);e.exports=function(e){return function t(n){return 0===arguments.length||r(n)?t:e.apply(this,arguments)}}},773:(e,t,n)=>{var r=n(764),o=n(230);e.exports=function(e){return function t(n,i){switch(arguments.length){case 0:return t;case 1:return o(n)?t:r((function(t){return e(n,t)}));default:return o(n)&&o(i)?t:o(n)?r((function(t){return e(t,i)})):o(i)?r((function(t){return e(n,t)})):e(n,i)}}}},138:(e,t,n)=>{var r=n(764),o=n(773),i=n(230);e.exports=function(e){return function t(n,s,a){switch(arguments.length){case 0:return t;case 1:return i(n)?t:o((function(t,r){return e(n,t,r)}));case 2:return i(n)&&i(s)?t:i(n)?o((function(t,n){return e(t,s,n)})):i(s)?o((function(t,r){return e(n,t,r)})):r((function(t){return e(n,s,t)}));default:return i(n)&&i(s)&&i(a)?t:i(n)&&i(s)?o((function(t,n){return e(t,n,a)})):i(n)&&i(a)?o((function(t,n){return e(t,s,n)})):i(s)&&i(a)?o((function(t,r){return e(n,t,r)})):i(n)?r((function(t){return e(t,s,a)})):i(s)?r((function(t){return e(n,t,a)})):i(a)?r((function(t){return e(n,s,t)})):e(n,s,a)}}}},673:e=>{e.exports=function(e,t){return Object.prototype.hasOwnProperty.call(t,e)}},726:e=>{e.exports=Array.isArray||function(e){return null!=e&&e.length>=0&&"[object Array]"===Object.prototype.toString.call(e)}},534:(e,t,n)=>{var r=n(764),o=n(726),i=n(468),s=r((function(e){return!!o(e)||!!e&&"object"==typeof e&&!i(e)&&(1===e.nodeType?!!e.length:0===e.length||e.length>0&&e.hasOwnProperty(0)&&e.hasOwnProperty(e.length-1))}));e.exports=s},78:e=>{e.exports=function(e){return"[object Object]"===Object.prototype.toString.call(e)}},230:e=>{e.exports=function(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}},468:e=>{e.exports=function(e){return"[object String]"===Object.prototype.toString.call(e)}},623:(e,t,n)=>{var r=n(534),o=n(782),i=n(712);function s(e,t,n){for(var r=n.next();!r.done;){if((t=e["@@transducer/step"](t,r.value))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r=n.next()}return e["@@transducer/result"](t)}function a(e,t,n,r){return e["@@transducer/result"](n[r](i(e["@@transducer/step"],e),t))}var u="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator";e.exports=function(e,t,n){if("function"==typeof e&&(e=o(e)),r(n))return function(e,t,n){for(var r=0,o=n.length;r<o;){if((t=e["@@transducer/step"](t,n[r]))&&t["@@transducer/reduced"]){t=t["@@transducer/value"];break}r+=1}return e["@@transducer/result"](t)}(e,t,n);if("function"==typeof n["fantasy-land/reduce"])return a(e,t,n,"fantasy-land/reduce");if(null!=n[u])return s(e,t,n[u]());if("function"==typeof n.next)return s(e,t,n);if("function"==typeof n.reduce)return a(e,t,n,"reduce");throw new TypeError("reduce: list must be array or iterable")}},782:e=>{var t=function(){function e(e){this.f=e}return e.prototype["@@transducer/init"]=function(){throw new Error("init not implemented on XWrap")},e.prototype["@@transducer/result"]=function(e){return e},e.prototype["@@transducer/step"]=function(e,t){return this.f(e,t)},e}();e.exports=function(e){return new t(e)}},317:(e,t,n)=>{var r=n(773),o=n(937),i=r((function(e,t){return o((function(e,t,n){return n}),e,t)}));e.exports=i},937:(e,t,n)=>{var r=n(138),o=n(78),i=n(145),s=r((function e(t,n,r){return i((function(n,r,i){return o(r)&&o(i)?e(t,r,i):t(n,r,i)}),n,r)}));e.exports=s},145:(e,t,n)=>{var r=n(138),o=n(673),i=r((function(e,t,n){var r,i={};for(r in t)o(r,t)&&(i[r]=o(r,n)?e(r,t[r],n[r]):t[r]);for(r in n)o(r,n)&&!o(r,i)&&(i[r]=n[r]);return i}));e.exports=i},61:(e,t,n)=>{var r=n(138)(n(623));e.exports=r},704:(e,t,n)=>{var r=n(764)((function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)}));e.exports=r},685:e=>{"use strict";e.exports=n},645:e=>{"use strict";e.exports=r}},t={};function o(n){var r=t[n];if(void 0!==r)return r.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,o),i.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};return(()=>{"use strict";o.r(i),o.d(i,{Type:()=>u,configExtensionStore:()=>x,configInternalStore:()=>m,defineConfigSchema:()=>D,getConfig:()=>P,getConfigStore:()=>j,getExtensionConfigStore:()=>_,getExtensionSlotsConfigStore:()=>$,implementerToolsConfigStore:()=>w,inRange:()=>ne,interpolateString:()=>ee,interpolateUrl:()=>Z,isUrl:()=>oe,isUrlWithTemplateParameters:()=>re,navigate:()=>te,processConfig:()=>N,provide:()=>I,temporaryConfigStore:()=>O,validator:()=>c,validators:()=>ie});var e=o(317),t=o.n(e),n=o(61),r=o.n(n),s=o(122),a=o.n(s);let u;function c(e,t){return n=>{if(!e(n))return t}}!function(e){e.Array="Array",e.Boolean="Boolean",e.ConceptUuid="ConceptUuid",e.Number="Number",e.Object="Object",e.String="String",e.UUID="UUID"}(u||(u={}));const f=c((e=>Array.isArray(e)),"must be an array"),l=c((e=>"boolean"==typeof e),"must be a boolean"),d=c((e=>"number"==typeof e),"must be a number"),p=c((e=>"string"==typeof e),"must be a string"),g=c((e=>"object"==typeof e&&!Array.isArray(e)&&null!==e),"must be an object (not an array or null)"),y=c((e=>/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)||/^[0-9a-f]{36}$/i.test(e)),"must be a valid UUID or a 36-character hexadecimal string");var v=o(685);const b={providedConfigs:[],schemas:{},devDefaultsAreOn:S()},m=(0,v.createGlobalStore)("config-internal",b);let h=S();function S(){try{return JSON.parse(localStorage.getItem("openmrs:configAreDevDefaultsOn")||"false")}catch(e){return!1}}m.subscribe((e=>{var t;e.devDefaultsAreOn!=h&&(t=e.devDefaultsAreOn,localStorage.setItem("openmrs:configAreDevDefaultsOn",JSON.stringify(t)),h=e.devDefaultsAreOn)}));const O=(0,v.createGlobalStore)("temporary-config",{config:function(){try{return JSON.parse(localStorage.getItem("openmrs:temporaryConfig")||"{}")}catch(e){return{}}}()});O.subscribe((e=>{var t;t=e.config,localStorage.setItem("openmrs:temporaryConfig",JSON.stringify(t))}));const x=(0,v.createGlobalStore)("config-extensions",{mountedExtensions:[]});function j(e){return(0,v.getGlobalStore)(`config-module-${e}`,{config:null,loaded:!1})}function $(e){return(0,v.getGlobalStore)(`config-extension-slots-${e}`,{extensionSlotConfigs:{},loaded:!1})}function _(e,t,n){return(0,v.getGlobalStore)(`config-extension-${e}-${t}-${n}`,{config:null,loaded:!1})}const w=(0,v.createGlobalStore)("config-implementer-tools",{config:{}});function A(e,t){for(let n of Object.keys(e.schemas)){const r=J(n,e,t);j(n).setState({loaded:!0,config:r})}}function k(e,t){const n=function(e,t){const n=q(M(e,t)),r=Object.keys(n).reduce(((e,t)=>{var r,o;return null!==(r=n[t])&&void 0!==r&&r.extensions&&(e[t]=null===(o=n[t])||void 0===o?void 0:o.extensions),e}),{});return function(e){for(let[t,n]of Object.entries(e))for(let[e,r]of Object.entries(n))B(r,t,e)}(r),r}(e,t);for(let[e,t]of Object.entries(n))$(e).setState({loaded:!0,extensionSlotConfigs:t})}function U(e,t){const n=function(e,t){let n=T(a()(e.schemas));const r=[...e.providedConfigs.map((e=>[e.config,e.source])),[t.config,"temporary config"]];for(let[e,t]of r)n=q([n,G(e,t)]);return n}(e,t);w.setState({config:n})}function C(e,t,n){for(let r of t.mountedExtensions){const t=_(r.slotModuleName,r.slotName,r.extensionId),o=E(r.slotModuleName,r.extensionModuleName,r.slotName,r.extensionId,e,n);t.setState({loaded:!0,config:o})}}function D(e,t){R(e,t);const n=m.getState();m.setState({schemas:{...n.schemas,[e]:t}})}function I(e,t="provided"){const n=m.getState();m.setState({providedConfigs:[...n.providedConfigs,{source:t,config:e}]})}function P(e){return new Promise((t=>{const n=j(e);function r(e){e.loaded&&e.config&&(t(e.config),o&&o())}r(n.getState());const o=n.subscribe(r)}))}function N(e,t,n,r=!1){return F(e,t,n),K(e,t,r)}function E(e,t,n,r,o,i){var s,a,u,c;const f=M(o,i),l=W(e,f),d=null!==(s=null==l||null===(a=l.extensions)||void 0===a||null===(u=a[n])||void 0===u||null===(c=u.configure)||void 0===c?void 0:c[r])&&void 0!==s?s:{},p=q([W(t,f),d]),g=o.schemas[t];F(g,p,t);const y=K(g,p,o.devDefaultsAreOn);return delete y.extensions,y}function T(e){return e.hasOwnProperty("_default")?{...e,_value:e._default,_source:"default"}:V(e)?Object.keys(e).reduce(((t,n)=>(t[n]=T(e[n]),t)),{}):{}}function G(e,t){return V(e)?Object.keys(e).reduce(((n,r)=>(n[r]=G(e[r],t),n)),{}):{_value:e,_source:t}}function B(e,t,n){const r=`Extension slot config '${t}.extensions.${n}`,o=Object.keys(e).filter((e=>!["add","remove","order","configure"].includes(e)));o.length&&console.error(r+`' contains invalid keys '${o.join("', '")}'`),e.add&&(Array.isArray(e.add)&&e.add.every((e=>"string"==typeof e))||console.error(r+".add' is invalid. Must be an array of strings (extension IDs)")),e.remove&&(Array.isArray(e.remove)&&e.remove.every((e=>"string"==typeof e))||console.error(r+".remove' is invalid. Must be an array of strings (extension IDs)")),e.order&&(Array.isArray(e.order)&&e.order.every((e=>"string"==typeof e))||console.error(r+".order' is invalid. Must be an array of strings (extension IDs)")),e.configure&&(V(e.configure)||console.error(r+".configure' is invalid. Must be an object with extension IDs for keys"))}function M(e,t){return[...e.providedConfigs.map((e=>e.config)),t.config]}function R(e,t,n=""){const r="Please verify that you are running the latest version and, if so, alert the maintainer.";for(const o of Object.keys(t).filter((e=>!e.startsWith("_")))){const i=n+(n&&".")+o,s=t[o];if(!V(s)){console.error(`${e} has bad config schema definition for key '${i}'. ${r}`);continue}s.hasOwnProperty("_default")||R(e,s,i);const a=s._elements;if(Q(a)&&R(e,a,i+"._elements"),s._validators)for(let t of s._validators)"function"!=typeof t&&console.error(`${e} has invalid validator for key '${i}' ${r}.\n\nIf you're the maintainer: validators must be functions that return either undefined or an error string. Received ${t}.`);const c=s._type;c&&!Object.values(u).includes(c)&&console.error(`${e} has invalid type for key '${i}' ${r}.\n\nIf you're the maintainer: the allowed types are ${Object.values(u).join(", ")}. Received '${c}'`),Object.keys(s).every((e=>["_description","_validators","_elements","_type"].includes(e)))&&!n.includes("._elements")&&console.error(`${e} has bad config schema definition for key '${i}'. ${r}.\n\nIf you're the maintainer: all config elements must have a default. Received ${JSON.stringify(s)}`),a&&c&&![u.Array,u.Object].includes(c)&&console.error(`${e} has bad config schema definition for key '${i}'. ${r}.\n\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. Received ${JSON.stringify(c)}`)}}function J(e,t,n){if(!t.schemas.hasOwnProperty(e))throw Error("No config schema has been defined for "+e);const r=t.schemas[e],o=W(e,M(t,n));F(r,o,e);const i=K(r,o,t.devDefaultsAreOn);return delete i.extensions,i}function W(e,t){return q(t.map((({[e]:t})=>t)).filter((e=>!!e)))}function q(e){return r()(t())({},e)}A(m.getState(),O.getState()),m.subscribe((e=>A(e,O.getState()))),O.subscribe((e=>A(m.getState(),e))),U(m.getState(),O.getState()),m.subscribe((e=>U(e,O.getState()))),O.subscribe((e=>U(m.getState(),e))),k(m.getState(),O.getState()),m.subscribe((e=>k(e,O.getState()))),O.subscribe((e=>k(m.getState(),e))),C(m.getState(),x.getState(),O.getState()),m.subscribe((e=>C(e,x.getState(),O.getState()))),x.subscribe((e=>C(m.getState(),e,O.getState()))),O.subscribe((e=>C(m.getState(),x.getState(),e)));const F=(e,t,n="")=>{for(const r of Object.keys(t)){const o=t[r],i=n+"."+r,s=e[r];e.hasOwnProperty(r)?(z(i,s._type,o),H(i,s._validators,o),V(o)?s._type===u.Object?L(s,o,i):s.hasOwnProperty("_default")||F(s,o,i):s._type===u.Array&&X(s,o,i)):"extensions"!==r&&console.error(`Unknown config key '${i}' provided. Ignoring.`)}};function L(e,t,n){if(e._elements)for(const r of Object.keys(t)){const o=t[r];F(e._elements,o,`${n}.${r}`)}}function X(e,t,n){if(Q(e._elements))for(let r=0;r<t.length;r++)F(e._elements,t[r],`${n}[${r}]`);for(let i=0;i<t.length;i++){var r,o;z(`${n}[${i}]`,null===(r=e._elements)||void 0===r?void 0:r._type,t[i]),H(`${n}[${i}]`,null===(o=e._elements)||void 0===o?void 0:o._validators,t[i])}}function z(e,t,n){t&&H(e,[{Array:f,Boolean:l,ConceptUuid:y,Number:d,Object:g,String:p,UUID:y}[t]],n)}function H(e,t,n){if(t)try{for(let r of t){const t=r(n);if("string"==typeof t){const r="object"==typeof n?JSON.stringify(n):n;console.error(`Invalid configuration value ${r} for ${e}: ${t}`)}}}catch(t){console.error(`Skipping invalid validator at "${e}".`)}}const K=(e,t,n)=>{const r=a()(t);if(!e)return r;for(const t of Object.keys(e)){const o=r[t],i=e[t];if(i&&i.hasOwnProperty("_default")){if(!r.hasOwnProperty(t)){const e=i._devDefault||i._default;r[t]=n?e:i._default}const e=i._elements;if(o&&Q(e))if(i._type===u.Array){const i=o.map((t=>K(e,t,n)));r[t]=i}else if(i._type===u.Object)for(let t of Object.keys(o))o[t]=K(e,o[t],n)}else if(V(i)){const e=r.hasOwnProperty(t)?o:{};V(e)&&(r[t]=K(i,e,n))}}return r};function Q(e){return!!e&&Object.keys(e).filter((e=>!["_default","_validators"].includes(e))).length>0}function V(e){return"object"==typeof e&&!Array.isArray(e)&&null!==e}var Y=o(645);function Z(e){const t=window.getOpenmrsSpaBase().replace(/\/$/,"");return ee(e,{openmrsBase:window.openmrsBase,openmrsSpaBase:t}).replace(/^\/\//,"/")}function ee(e,t){return Object.keys(t).reduce(((e,n)=>e.split("${"+n+"}").join(t[n])),e)}function te({to:e}){const t=window.getOpenmrsSpaBase().replace(/\/$/,""),n=Z(e);n.startsWith(t)?(0,Y.navigateToUrl)(n):window.location.assign(n)}const ne=(e,t)=>c((n=>e<=n&&n<=t),`must be between ${e} and ${t}`),re=e=>{const t=e.concat(["openmrsBase","openmrsSpaBase"]);return c((e=>{if(!e||"string"!=typeof e)return!1;const n=/\${(.*?)}/g;let r=n.exec(e);for(;r;){if(!t.includes(r[1]))return!1;r=n.exec(e)}return!0}),"should be a URL or path. The allowed template parameters are "+t.map((e=>"${"+e+"}")).join(", "))},oe=re([]),ie={inRange:ne,isUrl:oe,isUrlWithTemplateParameters:re}})(),i})())}}}));
2
2
  //# sourceMappingURL=openmrs-esm-module-config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openmrs-esm-module-config.js","mappings":"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","sources":["webpack://@openmrs/esm-config/../../../node_modules/ramda/src/bind.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/clone.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_arity.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_clone.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_cloneRegExp.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_curry1.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_curry2.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_curry3.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_has.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isArray.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isArrayLike.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isObject.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isPlaceholder.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isString.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_reduce.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_xwrap.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/mergeDeepRight.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/mergeDeepWithKey.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/mergeWithKey.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/reduce.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/type.js","webpack://@openmrs/esm-config/external system \"@openmrs/esm-state\"","webpack://@openmrs/esm-config/external system \"single-spa\"","webpack://@openmrs/esm-config/webpack/bootstrap","webpack://@openmrs/esm-config/webpack/runtime/compat get default export","webpack://@openmrs/esm-config/webpack/runtime/define property getters","webpack://@openmrs/esm-config/webpack/runtime/hasOwnProperty shorthand","webpack://@openmrs/esm-config/webpack/runtime/make namespace object","webpack://@openmrs/esm-config/./src/types.ts","webpack://@openmrs/esm-config/./src/validators/validator.ts","webpack://@openmrs/esm-config/./src/validators/type-validators.ts","webpack://@openmrs/esm-config/./src/module-config/state.ts","webpack://@openmrs/esm-config/./src/module-config/module-config.ts","webpack://@openmrs/esm-config/./src/navigation/interpolate-string.ts","webpack://@openmrs/esm-config/./src/navigation/navigate.ts","webpack://@openmrs/esm-config/./src/validators/validators.ts"],"sourcesContent":["var _arity = /*#__PURE__*/require('./internal/_arity');\n\nvar _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\n/**\n * Creates a function that is bound to a context.\n * Note: `R.bind` does not provide the additional argument-binding capabilities of\n * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\n *\n * @func\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @category Object\n * @sig (* -> *) -> {*} -> (* -> *)\n * @param {Function} fn The function to bind to context\n * @param {Object} thisObj The context to bind `fn` to\n * @return {Function} A function that will execute in the context of `thisObj`.\n * @see R.partial\n * @example\n *\n * const log = R.bind(console.log, console);\n * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}\n * // logs {a: 2}\n * @symb R.bind(f, o)(a, b) = f.call(o, a, b)\n */\n\n\nvar bind = /*#__PURE__*/_curry2(function bind(fn, thisObj) {\n return _arity(fn.length, function () {\n return fn.apply(thisObj, arguments);\n });\n});\nmodule.exports = bind;","var _clone = /*#__PURE__*/require('./internal/_clone');\n\nvar _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\n/**\n * Creates a deep copy of the value which may contain (nested) `Array`s and\n * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are\n * assigned by reference rather than copied\n *\n * Dispatches to a `clone` method if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {*} -> {*}\n * @param {*} value The object or array to clone\n * @return {*} A deeply cloned copy of `val`\n * @example\n *\n * const objects = [{}, {}, {}];\n * const objectsClone = R.clone(objects);\n * objects === objectsClone; //=> false\n * objects[0] === objectsClone[0]; //=> false\n */\n\n\nvar clone = /*#__PURE__*/_curry1(function clone(value) {\n return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], [], true);\n});\nmodule.exports = clone;","function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0:\n return function () {\n return fn.apply(this, arguments);\n };\n case 1:\n return function (a0) {\n return fn.apply(this, arguments);\n };\n case 2:\n return function (a0, a1) {\n return fn.apply(this, arguments);\n };\n case 3:\n return function (a0, a1, a2) {\n return fn.apply(this, arguments);\n };\n case 4:\n return function (a0, a1, a2, a3) {\n return fn.apply(this, arguments);\n };\n case 5:\n return function (a0, a1, a2, a3, a4) {\n return fn.apply(this, arguments);\n };\n case 6:\n return function (a0, a1, a2, a3, a4, a5) {\n return fn.apply(this, arguments);\n };\n case 7:\n return function (a0, a1, a2, a3, a4, a5, a6) {\n return fn.apply(this, arguments);\n };\n case 8:\n return function (a0, a1, a2, a3, a4, a5, a6, a7) {\n return fn.apply(this, arguments);\n };\n case 9:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {\n return fn.apply(this, arguments);\n };\n case 10:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n return fn.apply(this, arguments);\n };\n default:\n throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n}\nmodule.exports = _arity;","var _cloneRegExp = /*#__PURE__*/require('./_cloneRegExp');\n\nvar type = /*#__PURE__*/require('../type');\n\n/**\n * Copies an object.\n *\n * @private\n * @param {*} value The value to be copied\n * @param {Array} refFrom Array containing the source references\n * @param {Array} refTo Array containing the copied source references\n * @param {Boolean} deep Whether or not to perform deep cloning.\n * @return {*} The copied value.\n */\n\n\nfunction _clone(value, refFrom, refTo, deep) {\n var copy = function copy(copiedValue) {\n var len = refFrom.length;\n var idx = 0;\n while (idx < len) {\n if (value === refFrom[idx]) {\n return refTo[idx];\n }\n idx += 1;\n }\n refFrom[idx + 1] = value;\n refTo[idx + 1] = copiedValue;\n for (var key in value) {\n copiedValue[key] = deep ? _clone(value[key], refFrom, refTo, true) : value[key];\n }\n return copiedValue;\n };\n switch (type(value)) {\n case 'Object':\n return copy({});\n case 'Array':\n return copy([]);\n case 'Date':\n return new Date(value.valueOf());\n case 'RegExp':\n return _cloneRegExp(value);\n default:\n return value;\n }\n}\nmodule.exports = _clone;","function _cloneRegExp(pattern) {\n return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : ''));\n}\nmodule.exports = _cloneRegExp;","var _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}\nmodule.exports = _curry1;","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}\nmodule.exports = _curry2;","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _curry2 = /*#__PURE__*/require('./_curry2');\n\nvar _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _curry1(function (_c) {\n return fn(a, b, _c);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {\n return fn(_a, _b, c);\n }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b, c);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b, c);\n }) : _isPlaceholder(c) ? _curry1(function (_c) {\n return fn(a, b, _c);\n }) : fn(a, b, c);\n }\n };\n}\nmodule.exports = _curry3;","function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\nmodule.exports = _has;","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nmodule.exports = Array.isArray || function _isArray(val) {\n return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';\n};","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _isArray = /*#__PURE__*/require('./_isArray');\n\nvar _isString = /*#__PURE__*/require('./_isString');\n\n/**\n * Tests whether or not an object is similar to an array.\n *\n * @private\n * @category Type\n * @category List\n * @sig * -> Boolean\n * @param {*} x The object to test.\n * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.\n * @example\n *\n * _isArrayLike([]); //=> true\n * _isArrayLike(true); //=> false\n * _isArrayLike({}); //=> false\n * _isArrayLike({length: 10}); //=> false\n * _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true\n */\n\n\nvar _isArrayLike = /*#__PURE__*/_curry1(function isArrayLike(x) {\n if (_isArray(x)) {\n return true;\n }\n if (!x) {\n return false;\n }\n if (typeof x !== 'object') {\n return false;\n }\n if (_isString(x)) {\n return false;\n }\n if (x.nodeType === 1) {\n return !!x.length;\n }\n if (x.length === 0) {\n return true;\n }\n if (x.length > 0) {\n return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);\n }\n return false;\n});\nmodule.exports = _isArrayLike;","function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n}\nmodule.exports = _isObject;","function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}\nmodule.exports = _isPlaceholder;","function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n}\nmodule.exports = _isString;","var _isArrayLike = /*#__PURE__*/require('./_isArrayLike');\n\nvar _xwrap = /*#__PURE__*/require('./_xwrap');\n\nvar bind = /*#__PURE__*/require('../bind');\n\nfunction _arrayReduce(xf, acc, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n acc = xf['@@transducer/step'](acc, list[idx]);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n idx += 1;\n }\n return xf['@@transducer/result'](acc);\n}\n\nfunction _iterableReduce(xf, acc, iter) {\n var step = iter.next();\n while (!step.done) {\n acc = xf['@@transducer/step'](acc, step.value);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n step = iter.next();\n }\n return xf['@@transducer/result'](acc);\n}\n\nfunction _methodReduce(xf, acc, obj, methodName) {\n return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));\n}\n\nvar symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';\n\nfunction _reduce(fn, acc, list) {\n if (typeof fn === 'function') {\n fn = _xwrap(fn);\n }\n if (_isArrayLike(list)) {\n return _arrayReduce(fn, acc, list);\n }\n if (typeof list['fantasy-land/reduce'] === 'function') {\n return _methodReduce(fn, acc, list, 'fantasy-land/reduce');\n }\n if (list[symIterator] != null) {\n return _iterableReduce(fn, acc, list[symIterator]());\n }\n if (typeof list.next === 'function') {\n return _iterableReduce(fn, acc, list);\n }\n if (typeof list.reduce === 'function') {\n return _methodReduce(fn, acc, list, 'reduce');\n }\n\n throw new TypeError('reduce: list must be array or iterable');\n}\nmodule.exports = _reduce;","var XWrap = /*#__PURE__*/function () {\n function XWrap(fn) {\n this.f = fn;\n }\n XWrap.prototype['@@transducer/init'] = function () {\n throw new Error('init not implemented on XWrap');\n };\n XWrap.prototype['@@transducer/result'] = function (acc) {\n return acc;\n };\n XWrap.prototype['@@transducer/step'] = function (acc, x) {\n return this.f(acc, x);\n };\n\n return XWrap;\n}();\n\nfunction _xwrap(fn) {\n return new XWrap(fn);\n}\nmodule.exports = _xwrap;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar mergeDeepWithKey = /*#__PURE__*/require('./mergeDeepWithKey');\n\n/**\n * Creates a new object with the own properties of the first object merged with\n * the own properties of the second object. If a key exists in both objects:\n * - and both values are objects, the two values will be recursively merged\n * - otherwise the value from the second object will be used.\n *\n * @func\n * @memberOf R\n * @since v0.24.0\n * @category Object\n * @sig {a} -> {a} -> {a}\n * @param {Object} lObj\n * @param {Object} rObj\n * @return {Object}\n * @see R.merge, R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey\n * @example\n *\n * R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},\n * { age: 40, contact: { email: 'baa@example.com' }});\n * //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}\n */\n\n\nvar mergeDeepRight = /*#__PURE__*/_curry2(function mergeDeepRight(lObj, rObj) {\n return mergeDeepWithKey(function (k, lVal, rVal) {\n return rVal;\n }, lObj, rObj);\n});\nmodule.exports = mergeDeepRight;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar _isObject = /*#__PURE__*/require('./internal/_isObject');\n\nvar mergeWithKey = /*#__PURE__*/require('./mergeWithKey');\n\n/**\n * Creates a new object with the own properties of the two provided objects.\n * If a key exists in both objects:\n * - and both associated values are also objects then the values will be\n * recursively merged.\n * - otherwise the provided function is applied to the key and associated values\n * using the resulting value as the new value associated with the key.\n * If a key only exists in one object, the value will be associated with the key\n * of the resulting object.\n *\n * @func\n * @memberOf R\n * @since v0.24.0\n * @category Object\n * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} lObj\n * @param {Object} rObj\n * @return {Object}\n * @see R.mergeWithKey, R.mergeDeepWith\n * @example\n *\n * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r\n * R.mergeDeepWithKey(concatValues,\n * { a: true, c: { thing: 'foo', values: [10, 20] }},\n * { b: true, c: { thing: 'bar', values: [15, 35] }});\n * //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }}\n */\n\n\nvar mergeDeepWithKey = /*#__PURE__*/_curry3(function mergeDeepWithKey(fn, lObj, rObj) {\n return mergeWithKey(function (k, lVal, rVal) {\n if (_isObject(lVal) && _isObject(rVal)) {\n return mergeDeepWithKey(fn, lVal, rVal);\n } else {\n return fn(k, lVal, rVal);\n }\n }, lObj, rObj);\n});\nmodule.exports = mergeDeepWithKey;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar _has = /*#__PURE__*/require('./internal/_has');\n\n/**\n * Creates a new object with the own properties of the two provided objects. If\n * a key exists in both objects, the provided function is applied to the key\n * and the values associated with the key in each object, with the result being\n * used as the value associated with the key in the returned object.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category Object\n * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} l\n * @param {Object} r\n * @return {Object}\n * @see R.mergeDeepWithKey, R.merge, R.mergeWith\n * @example\n *\n * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r\n * R.mergeWithKey(concatValues,\n * { a: true, thing: 'foo', values: [10, 20] },\n * { b: true, thing: 'bar', values: [15, 35] });\n * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }\n * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }\n */\n\n\nvar mergeWithKey = /*#__PURE__*/_curry3(function mergeWithKey(fn, l, r) {\n var result = {};\n var k;\n\n for (k in l) {\n if (_has(k, l)) {\n result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];\n }\n }\n\n for (k in r) {\n if (_has(k, r) && !_has(k, result)) {\n result[k] = r[k];\n }\n }\n\n return result;\n});\nmodule.exports = mergeWithKey;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar _reduce = /*#__PURE__*/require('./internal/_reduce');\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * The iterator function receives two values: *(acc, value)*. It may use\n * [`R.reduced`](#reduced) to shortcut the iteration.\n *\n * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function\n * is *(value, acc)*.\n *\n * Note: `R.reduce` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description\n *\n * Dispatches to the `reduce` method of the third argument, if present. When\n * doing so, it is up to the user to handle the [`R.reduced`](#reduced)\n * shortcuting, as this is not implemented by `reduce`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.reduced, R.addIndex, R.reduceRight\n * @example\n *\n * R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10\n * // - -10\n * // / \\ / \\\n * // - 4 -6 4\n * // / \\ / \\\n * // - 3 ==> -3 3\n * // / \\ / \\\n * // - 2 -1 2\n * // / \\ / \\\n * // 0 1 0 1\n *\n * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d)\n */\n\n\nvar reduce = /*#__PURE__*/_curry3(_reduce);\nmodule.exports = reduce;","var _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig (* -> {*}) -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n * R.type(() => {}); //=> \"Function\"\n * R.type(undefined); //=> \"Undefined\"\n */\n\n\nvar type = /*#__PURE__*/_curry1(function type(val) {\n return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);\n});\nmodule.exports = type;","module.exports = __WEBPACK_EXTERNAL_MODULE__685__;","module.exports = __WEBPACK_EXTERNAL_MODULE__645__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export enum Type {\n Array = \"Array\",\n Boolean = \"Boolean\",\n ConceptUuid = \"ConceptUuid\",\n Number = \"Number\",\n Object = \"Object\",\n String = \"String\",\n UUID = \"UUID\",\n}\n\n// Full-powered typing for Config and Schema trees depends on being able to\n// have types like `string not \"_default\"`. There is an experimental PR\n// for this feature, https://github.com/microsoft/TypeScript/pull/29317\n// But it is not likely to be merged any time terribly soon. (Nov 11, 2020)\nexport interface ConfigSchema {\n [key: string]: ConfigSchema | ConfigValue;\n _type?: Type;\n _validators?: Array<Validator>;\n _elements?: ConfigSchema;\n}\n\nexport interface Config extends Object {\n [moduleName: string]: { [key: string]: any };\n}\n\nexport interface ConfigObject extends Object {\n [key: string]: any;\n}\n\nexport type ConfigValue =\n | string\n | number\n | boolean\n | void\n | Array<any>\n | object;\n\nexport interface ExtensionSlotConfig {\n add?: Array<string>;\n remove?: Array<string>;\n order?: Array<string>;\n configure?: ExtensionSlotConfigureValueObject;\n}\n\nexport interface ExtensionSlotConfigureValueObject {\n [key: string]: object;\n}\n\nexport interface ExtensionSlotConfigObject {\n add?: Array<string>;\n remove?: Array<string>;\n order?: Array<string>;\n}\n\nexport type ProvidedConfig = {\n source: string;\n config: Config;\n};\n\nexport type ValidatorFunction = (value: any) => boolean;\n\nexport type Validator = (value: any) => void | string;\n","import { Validator, ValidatorFunction } from \"../types\";\n\nexport function validator(\n validationFunction: ValidatorFunction,\n message: string\n): Validator {\n return (value) => {\n if (!validationFunction(value)) {\n return message;\n }\n };\n}\n","import { validator } from \"./validator\";\n\nexport const isArray = validator(\n (val) => Array.isArray(val),\n \"must be an array\"\n);\n\nexport const isBoolean = validator(\n (val) => typeof val === \"boolean\",\n \"must be a boolean\"\n);\n\nexport const isNumber = validator(\n (val) => typeof val === \"number\",\n \"must be a number\"\n);\n\nexport const isString = validator(\n (val) => typeof val === \"string\",\n \"must be a string\"\n);\n\nexport const isObject = validator(\n (val) => typeof val === \"object\" && !Array.isArray(val) && val !== null,\n \"must be an object (not an array or null)\"\n);\n\nexport const isUuid = validator(\n (val) =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n val\n ) || /^[0-9a-f]{36}$/i.test(val),\n \"must be a valid UUID or a 36-character hexadecimal string\"\n);\n","import { createGlobalStore, getGlobalStore } from \"@openmrs/esm-state\";\nimport {\n Config,\n ConfigObject,\n ConfigSchema,\n ExtensionSlotConfigObject,\n ProvidedConfig,\n} from \"../types\";\n\n/**\n * Internal store\n * A store of the inputs and internal state\n * @internal\n */\nexport interface ConfigInternalStore {\n /** Configs added using the `provide` function */\n providedConfigs: Array<ProvidedConfig>;\n /** An object with module names for keys and schemas for values */\n schemas: Record<string, ConfigSchema>;\n /** Whether to use dev defaults or not */\n devDefaultsAreOn: boolean;\n}\n\nconst configInternalStoreInitialValue = {\n providedConfigs: [],\n schemas: {},\n devDefaultsAreOn: getAreDevDefaultsOn(),\n};\n\n/**\n * @internal\n */\nexport const configInternalStore = createGlobalStore<ConfigInternalStore>(\n \"config-internal\",\n configInternalStoreInitialValue\n);\n\nlet lastValueOfDevDefaultsAreOn = getAreDevDefaultsOn();\nconfigInternalStore.subscribe((state) => {\n if (state.devDefaultsAreOn != lastValueOfDevDefaultsAreOn) {\n setAreDevDefaultsOn(state.devDefaultsAreOn);\n lastValueOfDevDefaultsAreOn = state.devDefaultsAreOn;\n }\n});\n\nfunction setAreDevDefaultsOn(value: boolean) {\n localStorage.setItem(\"openmrs:configAreDevDefaultsOn\", JSON.stringify(value));\n}\n\nfunction getAreDevDefaultsOn(): boolean {\n try {\n return JSON.parse(\n localStorage.getItem(\"openmrs:configAreDevDefaultsOn\") || \"false\"\n );\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Temporary config\n * LocalStorage-based config used by the implementer tools\n * @internal\n */\nexport interface TemporaryConfigStore {\n config: Config;\n}\n\nexport const temporaryConfigStore = createGlobalStore<TemporaryConfigStore>(\n \"temporary-config\",\n { config: getTemporaryConfig() }\n);\n\ntemporaryConfigStore.subscribe((state) => {\n setTemporaryConfig(state.config);\n});\n\nfunction setTemporaryConfig(value: Config) {\n localStorage.setItem(\"openmrs:temporaryConfig\", JSON.stringify(value));\n}\n\nfunction getTemporaryConfig(): Config {\n try {\n return JSON.parse(localStorage.getItem(\"openmrs:temporaryConfig\") || \"{}\");\n } catch (e) {\n return {};\n }\n}\n\n/**\n * Config-side extension store\n * Just what esm-config needs to know about extension state. This\n * is to avoid having esm-config depend on esm-extensions, which would\n * create a circular dependency.\n * @internal\n */\nexport interface ConfigExtensionStore {\n mountedExtensions: Array<ConfigExtensionStoreElement>;\n}\n\n/**\n * @internal\n */\nexport interface ConfigExtensionStoreElement {\n slotModuleName: string;\n extensionModuleName: string;\n slotName: string;\n extensionId: string;\n}\n\n/**\n * @internal\n */\nexport const configExtensionStore = createGlobalStore<ConfigExtensionStore>(\n \"config-extensions\",\n { mountedExtensions: [] }\n);\n\n/**\n * Output configs\n *\n * Each module has its own stores for its config and its extension slots' configs.\n */\nexport interface ConfigStore {\n config: ConfigObject | null;\n loaded: boolean;\n}\n\nfunction initializeConfigStore() {\n return {\n config: null,\n loaded: false,\n };\n}\n\nexport function getConfigStore(moduleName: string) {\n // We use a store for each module's config, named `config-${moduleName}`\n return getGlobalStore<ConfigStore>(\n `config-module-${moduleName}`,\n initializeConfigStore()\n );\n}\n\nexport interface ExtensionSlotConfigsStore {\n /** Configs for each extension slot in the module, indexed by slot name */\n extensionSlotConfigs: Record<string, ExtensionSlotConfigObject>;\n loaded: boolean;\n}\n\nfunction initializeExtensionSlotConfigsStore() {\n return {\n extensionSlotConfigs: {},\n loaded: false,\n };\n}\n\nexport function getExtensionSlotsConfigStore(moduleName: string) {\n // Each module gets one store for the configs of all the slots it contains\n return getGlobalStore<ExtensionSlotConfigsStore>(\n `config-extension-slots-${moduleName}`,\n initializeExtensionSlotConfigsStore()\n );\n}\n\n// A store for each mounted extension's config\nexport function getExtensionConfigStore(\n extensionSlotModuleName: string,\n attachedExtensionSlotName: string,\n extensionId: string\n) {\n return getGlobalStore<ConfigStore>(\n `config-extension-${extensionSlotModuleName}-${attachedExtensionSlotName}-${extensionId}`,\n initializeConfigStore()\n );\n}\n\n// A store of the implementer tools output config\nexport interface ImplementerToolsConfigStore {\n config: Config;\n}\n\nexport const implementerToolsConfigStore =\n createGlobalStore<ImplementerToolsConfigStore>(\"config-implementer-tools\", {\n config: {},\n });\n","import { clone, reduce, mergeDeepRight } from \"ramda\";\nimport {\n Config,\n ConfigObject,\n ConfigSchema,\n ExtensionSlotConfig,\n ExtensionSlotConfigObject,\n Type,\n} from \"../types\";\nimport {\n isArray,\n isBoolean,\n isUuid,\n isNumber,\n isObject,\n isString,\n} from \"../validators/type-validators\";\nimport {\n ConfigExtensionStore,\n ConfigInternalStore,\n configInternalStore,\n ConfigStore,\n configExtensionStore,\n getConfigStore,\n getExtensionConfigStore,\n getExtensionSlotsConfigStore,\n implementerToolsConfigStore,\n temporaryConfigStore,\n} from \"./state\";\nimport type {} from \"@openmrs/esm-globals\";\n\n/**\n * Store setup\n *\n *\n * Set up stores and subscriptions so that inputs get processed appropriately.\n *\n * There are *input* stores and *output* stores. The *input* stores\n * are configInternalStore, temporaryConfigStore, and configExtensionStore. The\n * output stores are set in the `compute...` functions. They are the module\n * config stores, the extension slot config stores (by module), the extension\n * config stores, and the implementer tools config store.\n *\n * This code sets up the subscriptions so that when an input store changes,\n * the correct set of output stores are updated.\n *\n * NB: You will notice that none of the `compute...` functions below explicitly\n * take `temporaryConfigStore` state as an input. They do make use of\n * `temporaryConfigStore`, however it is obtained in `getProvidedConfigs`.\n * It would probably be better to make the functions pure.\n */\ncomputeModuleConfig(configInternalStore.getState());\nconfigInternalStore.subscribe(computeModuleConfig);\ntemporaryConfigStore.subscribe(() =>\n computeModuleConfig(configInternalStore.getState())\n);\n\ncomputeImplementerToolsConfig(configInternalStore.getState());\nconfigInternalStore.subscribe(computeImplementerToolsConfig);\ntemporaryConfigStore.subscribe(() =>\n computeImplementerToolsConfig(configInternalStore.getState())\n);\n\ncomputeExtensionSlotConfigs(configInternalStore.getState());\nconfigInternalStore.subscribe(computeExtensionSlotConfigs);\ntemporaryConfigStore.subscribe(() =>\n computeExtensionSlotConfigs(configInternalStore.getState())\n);\n\ncomputeExtensionConfigs(\n configInternalStore.getState(),\n configExtensionStore.getState()\n);\nconfigInternalStore.subscribe((configState) =>\n computeExtensionConfigs(configState, configExtensionStore.getState())\n);\nconfigExtensionStore.subscribe((extensionState) =>\n computeExtensionConfigs(configInternalStore.getState(), extensionState)\n);\ntemporaryConfigStore.subscribe(() =>\n computeExtensionConfigs(\n configInternalStore.getState(),\n configExtensionStore.getState()\n )\n);\n\nfunction computeModuleConfig(state: ConfigInternalStore) {\n for (let moduleName of Object.keys(state.schemas)) {\n const config = getConfigForModule(moduleName);\n const moduleStore = getConfigStore(moduleName);\n moduleStore.setState({ loaded: true, config });\n }\n}\n\nfunction computeExtensionSlotConfigs(state: ConfigInternalStore) {\n const slotConfigsByModule = getExtensionSlotConfigs();\n for (let [moduleName, extensionSlotConfigs] of Object.entries(\n slotConfigsByModule\n )) {\n const moduleStore = getExtensionSlotsConfigStore(moduleName);\n moduleStore.setState({ loaded: true, extensionSlotConfigs });\n }\n}\n\nfunction computeImplementerToolsConfig(state: ConfigInternalStore) {\n const config = getImplementerToolsConfig();\n implementerToolsConfigStore.setState({ config });\n}\n\nfunction computeExtensionConfigs(\n configState: ConfigInternalStore,\n extensionState: ConfigExtensionStore\n) {\n for (let extension of extensionState.mountedExtensions) {\n const extensionStore = getExtensionConfigStore(\n extension.slotModuleName,\n extension.slotName,\n extension.extensionId\n );\n const config = getExtensionConfig(\n extension.slotModuleName,\n extension.extensionModuleName,\n extension.slotName,\n extension.extensionId\n );\n extensionStore.setState({ loaded: true, config });\n }\n}\n\n/*\n * API\n *\n */\n\nexport function defineConfigSchema(moduleName: string, schema: ConfigSchema) {\n validateConfigSchema(moduleName, schema);\n const state = configInternalStore.getState();\n configInternalStore.setState({\n schemas: { ...state.schemas, [moduleName]: schema },\n });\n}\n\nexport function provide(config: Config, sourceName = \"provided\") {\n const state = configInternalStore.getState();\n configInternalStore.setState({\n providedConfigs: [...state.providedConfigs, { source: sourceName, config }],\n });\n}\n\n/**\n * A promise-based way to access the config as soon as it is fully loaded\n * from the import-map. If it is already loaded, resolves the config in its\n * present state.\n *\n * In general you should use the Unistore-based API provided by\n * `getConfigStore`, which allows creating a subscription so that you always\n * have the latest config. If using React, just use `useConfig`.\n *\n * This is a useful function if you need to get the config in the course\n * of the execution of a function.\n *\n * @param moduleName The name of the module for which to look up the config\n */\nexport function getConfig(moduleName: string): Promise<Config> {\n return new Promise<Config>((resolve) => {\n const store = getConfigStore(moduleName);\n function update(state: ConfigStore) {\n if (state.loaded && state.config) {\n resolve(state.config);\n unsubscribe && unsubscribe();\n }\n }\n update(store.getState());\n const unsubscribe = store.subscribe(update);\n });\n}\n\n/**\n * Validate and interpolate defaults for `providedConfig` according to `schema`\n *\n * @param schema a configuration schema\n * @param providedConfig an object of config values (without the top-level module name)\n * @param keyPathContext a dot-deparated string which helps the user figure out where\n * the provided config came from\n */\nexport function processConfig(\n schema: ConfigSchema,\n providedConfig: ConfigObject,\n keyPathContext: string\n) {\n validateConfig(schema, providedConfig, keyPathContext);\n const config = setDefaults(schema, providedConfig);\n return config;\n}\n\n/*\n * Helper functions\n *\n */\n\n/**\n * Returns the configuration for an extension. This configuration is specific\n * to the slot in which it is mounted, and its ID within that slot.\n *\n * The schema for that configuration is the schema for the module in which the\n * extension is defined.\n *\n * @param slotModuleName The name of the module which defines the extension slot\n * @param extensionModuleName The name of the module which defines the extension (and therefore the config schema)\n * @param slotName The name of the extension slot where the extension is mounted\n * @param extensionId The ID of the extension in its slot\n */\nfunction getExtensionConfig(\n slotModuleName: string,\n extensionModuleName: string,\n slotName: string,\n extensionId: string\n) {\n const slotModuleConfig = mergeConfigsFor(\n slotModuleName,\n getProvidedConfigs()\n );\n const configOverride =\n slotModuleConfig?.extensions?.[slotName]?.configure?.[extensionId] ?? {};\n const extensionModuleConfig = mergeConfigsFor(\n extensionModuleName,\n getProvidedConfigs()\n );\n const extensionConfig = mergeConfigs([extensionModuleConfig, configOverride]);\n const schema = configInternalStore.getState().schemas[extensionModuleName]; // TODO: validate that a schema exists for the module\n validateConfig(schema, extensionConfig, extensionModuleName);\n const config = setDefaults(schema, extensionConfig);\n delete config.extensions;\n return config;\n}\n\nfunction getImplementerToolsConfig(): Record<string, Config> {\n const state = configInternalStore.getState();\n let result = getSchemaWithValuesAndSources(clone(state.schemas));\n const configsAndSources = [\n ...state.providedConfigs.map((c) => [c.config, c.source]),\n [temporaryConfigStore.getState().config, \"temporary config\"],\n ] as Array<[Config, string]>;\n for (let [config, source] of configsAndSources) {\n result = mergeConfigs([result, createValuesAndSourcesTree(config, source)]);\n }\n return result;\n}\n\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty(\"_default\")) {\n return { ...schema, _value: schema._default, _source: \"default\" };\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce((obj, key) => {\n obj[key] = getSchemaWithValuesAndSources(schema[key]);\n return obj;\n }, {});\n } else {\n // Schema is bad; error will have been logged during schema validation\n return {};\n }\n}\n\nfunction createValuesAndSourcesTree(config: ConfigObject, source: string) {\n if (isOrdinaryObject(config)) {\n return Object.keys(config).reduce((obj, key) => {\n obj[key] = createValuesAndSourcesTree(config[key], source);\n return obj;\n }, {});\n } else {\n return { _value: config, _source: source };\n }\n}\n\nfunction getExtensionSlotConfigs(): Record<\n string,\n Record<string, ExtensionSlotConfigObject>\n> {\n const allConfigs = mergeConfigs(getProvidedConfigs());\n const slotConfigPerModule: Record<\n string,\n Record<string, ExtensionSlotConfig>\n > = Object.keys(allConfigs).reduce((obj, key) => {\n if (allConfigs[key]?.extensions) {\n obj[key] = allConfigs[key]?.extensions;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n return slotConfigPerModule;\n}\n\nfunction validateAllExtensionSlotConfigs(\n slotConfigPerModule: Record<string, Record<string, ExtensionSlotConfig>>\n) {\n for (let [moduleName, configBySlotName] of Object.entries(\n slotConfigPerModule\n )) {\n for (let [slotName, config] of Object.entries(configBySlotName)) {\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n }\n}\n\nfunction validateExtensionSlotConfig(\n config: ExtensionSlotConfig,\n moduleName: string,\n slotName: string\n): void {\n const errorPrefix = `Extension slot config '${moduleName}.extensions.${slotName}`;\n const invalidKeys = Object.keys(config).filter(\n (k) => ![\"add\", \"remove\", \"order\", \"configure\"].includes(k)\n );\n if (invalidKeys.length) {\n console.error(\n errorPrefix + `' contains invalid keys '${invalidKeys.join(\"', '\")}'`\n );\n }\n if (config.add) {\n if (\n !Array.isArray(config.add) ||\n !config.add.every((n) => typeof n === \"string\")\n ) {\n console.error(\n errorPrefix +\n `.add' is invalid. Must be an array of strings (extension IDs)`\n );\n }\n }\n if (config.remove) {\n if (\n !Array.isArray(config.remove) ||\n !config.remove.every((n) => typeof n === \"string\")\n ) {\n console.error(\n errorPrefix +\n `.remove' is invalid. Must be an array of strings (extension IDs)`\n );\n }\n }\n if (config.order) {\n if (\n !Array.isArray(config.order) ||\n !config.order.every((n) => typeof n === \"string\")\n ) {\n console.error(\n errorPrefix +\n `.order' is invalid. Must be an array of strings (extension IDs)`\n );\n }\n }\n if (config.configure) {\n if (!isOrdinaryObject(config.configure)) {\n console.error(\n errorPrefix +\n `.configure' is invalid. Must be an object with extension IDs for keys`\n );\n }\n }\n}\n\nfunction getProvidedConfigs(): Array<Config> {\n const state = configInternalStore.getState();\n return [\n ...state.providedConfigs.map((c) => c.config),\n temporaryConfigStore.getState().config,\n ];\n}\n\nfunction validateConfigSchema(\n moduleName: string,\n schema: ConfigSchema,\n keyPath = \"\"\n) {\n const updateMessage = `Please verify that you are running the latest version and, if so, alert the maintainer.`;\n\n for (const key of Object.keys(schema).filter((k) => !k.startsWith(\"_\"))) {\n const thisKeyPath = keyPath + (keyPath && \".\") + key;\n const schemaPart = schema[key] as ConfigSchema;\n\n if (!isOrdinaryObject(schemaPart)) {\n console.error(\n `${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}`\n );\n continue;\n }\n\n if (!schemaPart.hasOwnProperty(\"_default\")) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n\n const elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + \"._elements\");\n }\n\n if (schemaPart._validators) {\n for (let validator of schemaPart._validators) {\n if (typeof validator !== \"function\") {\n console.error(\n `${moduleName} has invalid validator for key '${thisKeyPath}' ${updateMessage}.` +\n `\\n\\nIf you're the maintainer: validators must be functions that return either ` +\n `undefined or an error string. Received ${validator}.`\n );\n }\n }\n }\n\n const valueType = schemaPart._type;\n if (valueType && !Object.values(Type).includes(valueType)) {\n console.error(\n `${moduleName} has invalid type for key '${thisKeyPath}' ${updateMessage}.` +\n `\\n\\nIf you're the maintainer: the allowed types are ${Object.values(\n Type\n ).join(\", \")}. ` +\n `Received '${valueType}'`\n );\n }\n\n if (\n Object.keys(schemaPart).every((k) =>\n [\"_description\", \"_validators\", \"_elements\", \"_type\"].includes(k)\n ) &&\n !keyPath.includes(\"._elements\")\n ) {\n console.error(\n `${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` +\n `\\n\\nIf you're the maintainer: all config elements must have a default. ` +\n `Received ${JSON.stringify(schemaPart)}`\n );\n }\n\n if (\n elements &&\n valueType &&\n ![Type.Array, Type.Object].includes(valueType)\n ) {\n console.error(\n `${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` +\n `\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. ` +\n `Received ${JSON.stringify(valueType)}`\n );\n }\n }\n}\n\nfunction getConfigForModule(moduleName: string): ConfigObject {\n const state = configInternalStore.getState();\n if (!state.schemas.hasOwnProperty(moduleName)) {\n throw Error(\"No config schema has been defined for \" + moduleName);\n }\n\n const schema = state.schemas[moduleName];\n const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs());\n validateConfig(schema, inputConfig, moduleName);\n const config = setDefaults(schema, inputConfig);\n delete config.extensions;\n return config;\n}\n\nfunction mergeConfigsFor(\n moduleName: string,\n allConfigs: Array<Config>\n): ConfigObject {\n const allConfigsForModule = allConfigs\n .map(({ [moduleName]: c }) => c)\n .filter((c) => !!c);\n\n return mergeConfigs(allConfigsForModule);\n}\n\nfunction mergeConfigs(configs: Array<Config>) {\n const mergeDeepAll = reduce(mergeDeepRight);\n return mergeDeepAll({}, configs) as Config;\n}\n\n// Recursively check the provided config tree to make sure that all\n// of the provided properties exist in the schema. Run validators\n// where present in the schema.\nconst validateConfig = (\n schema: ConfigSchema,\n config: ConfigObject,\n keyPath = \"\"\n) => {\n for (const key of Object.keys(config)) {\n const value = config[key];\n const thisKeyPath = keyPath + \".\" + key;\n const schemaPart = schema[key] as ConfigSchema;\n\n if (!schema.hasOwnProperty(key)) {\n if (key !== \"extensions\") {\n console.error(\n `Unknown config key '${thisKeyPath}' provided. Ignoring.`\n );\n }\n\n continue;\n }\n\n checkType(thisKeyPath, schemaPart._type, value);\n runValidators(thisKeyPath, schemaPart._validators, value);\n\n if (isOrdinaryObject(value)) {\n // structurally validate only if there's elements specified\n // or there's a `_default` value, which indicates a freeform object\n if (schemaPart._type === Type.Object) {\n validateDictionary(schemaPart, value, thisKeyPath);\n } else if (!schemaPart.hasOwnProperty(\"_default\")) {\n // recurse to validate nested object structure\n validateConfig(schemaPart, value, thisKeyPath);\n }\n } else {\n if (schemaPart._type === Type.Array) {\n validateArray(schemaPart, value, thisKeyPath);\n }\n }\n }\n};\n\nfunction validateDictionary(\n dictionarySchema: ConfigSchema,\n config: ConfigObject,\n keyPath: string\n) {\n if (dictionarySchema._elements) {\n for (const key of Object.keys(config)) {\n const value = config[key];\n validateConfig(dictionarySchema._elements, value, `${keyPath}.${key}`);\n }\n }\n}\n\nfunction validateArray(\n arraySchema: ConfigSchema,\n value: ConfigObject,\n keyPath: string\n) {\n // if there is an array element object schema, verify that elements match it\n if (hasObjectSchema(arraySchema._elements)) {\n for (let i = 0; i < value.length; i++) {\n validateConfig(arraySchema._elements, value[i], `${keyPath}[${i}]`);\n }\n }\n\n for (let i = 0; i < value.length; i++) {\n checkType(`${keyPath}[${i}]`, arraySchema._elements?._type, value[i]);\n runValidators(\n `${keyPath}[${i}]`,\n arraySchema._elements?._validators,\n value[i]\n );\n }\n}\n\nfunction checkType(keyPath: string, _type: Type | undefined, value: any) {\n if (_type) {\n const validator: Record<string, Function> = {\n Array: isArray,\n Boolean: isBoolean,\n ConceptUuid: isUuid,\n Number: isNumber,\n Object: isObject,\n String: isString,\n UUID: isUuid,\n };\n runValidators(keyPath, [validator[_type]], value);\n }\n}\n\nfunction runValidators(\n keyPath: string,\n validators: Array<Function> | undefined,\n value: any\n) {\n if (validators) {\n try {\n for (let validator of validators) {\n const validatorResult = validator(value);\n\n if (typeof validatorResult === \"string\") {\n const valueString =\n typeof value === \"object\" ? JSON.stringify(value) : value;\n console.error(\n `Invalid configuration value ${valueString} for ${keyPath}: ${validatorResult}`\n );\n }\n }\n } catch (e) {\n console.error(`Skipping invalid validator at \"${keyPath}\".`);\n }\n }\n}\n\n// Recursively fill in the config with values from the schema.\nconst setDefaults = (schema: ConfigSchema, inputConfig: Config) => {\n const config = clone(inputConfig);\n const devDefaultsAreOn = configInternalStore.getState().devDefaultsAreOn;\n\n if (!schema) {\n return config;\n }\n\n for (const key of Object.keys(schema)) {\n const configPart = config[key];\n const schemaPart = schema[key] as ConfigSchema;\n\n // The `schemaPart &&` clause of this `if` statement will only fail\n // if the schema is very invalid. It is there to prevent the app from\n // crashing completely, though it will produce unexpected behavior.\n // If this happens, there should be legible errors in the console from\n // the schema validator.\n if (schemaPart && schemaPart.hasOwnProperty(\"_default\")) {\n // We assume that schemaPart defines a config value, since it has\n // a property `_default`.\n if (!config.hasOwnProperty(key)) {\n const devDefault = schemaPart[\"_devDefault\"] || schemaPart[\"_default\"];\n\n (config[key] as any) = devDefaultsAreOn\n ? devDefault\n : schemaPart[\"_default\"];\n }\n\n // We also check if it is an object or array with object elements, in which case we recurse\n const elements = schemaPart._elements;\n\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === Type.Array) {\n const configWithDefaults = configPart.map((conf: Config) =>\n setDefaults(elements, conf)\n );\n config[key] = configWithDefaults;\n } else if (schemaPart._type === Type.Object) {\n for (let objectKey of Object.keys(configPart)) {\n configPart[objectKey] = setDefaults(\n elements,\n configPart[objectKey]\n );\n }\n }\n }\n } else if (isOrdinaryObject(schemaPart)) {\n // Since schemaPart has no property \"_default\", if it's an ordinary object\n // (unlike, importantly, the validators array), we assume it is a parent config property.\n // We recurse to config[key] and schema[key]. Default config[key] to {}.\n const selectedConfigPart = config.hasOwnProperty(key) ? configPart : {};\n\n if (isOrdinaryObject(selectedConfigPart)) {\n config[key] = setDefaults(schemaPart, selectedConfigPart);\n }\n }\n }\n\n return config;\n};\n\nfunction hasObjectSchema(\n elementsSchema: Object | undefined\n): elementsSchema is ConfigSchema {\n return (\n !!elementsSchema &&\n Object.keys(elementsSchema).filter(\n (e) => ![\"_default\", \"_validators\"].includes(e)\n ).length > 0\n );\n}\n\nfunction isOrdinaryObject(value) {\n return typeof value === \"object\" && !Array.isArray(value) && value !== null;\n}\n","function trimTrailingSlash(str: string) {\n return str.replace(/\\/$/, \"\");\n}\n\n/**\n * @internal\n * Interpolates a string with openmrsBase and openmrsSpaBase\n *\n * @param template A string to interpolate\n */\nexport function interpolateUrl(template: string): string {\n const openmrsSpaBase = trimTrailingSlash(window.getOpenmrsSpaBase());\n return interpolateString(template, {\n openmrsBase: window.openmrsBase,\n openmrsSpaBase: openmrsSpaBase,\n }).replace(/^\\/\\//, \"/\"); // remove extra initial slash if present\n}\n\n/**\n * Interpolates values of `params` into the `template` string.\n *\n * Useful for additional template parameters in URLs.\n *\n * Example usage:\n * ```js\n * navigate({\n * to: interpolateString(\n * config.links.patientChart,\n * { patientUuid: patient.uuid }\n * )\n * });\n * ```\n *\n * @param template With optional params wrapped in `${ }`\n * @param params Values to interpolate into the string template\n * @category Navigation\n */\nexport function interpolateString(template: string, params: object): string {\n const names = Object.keys(params);\n return names.reduce(\n (prev, curr) => prev.split(\"${\" + curr + \"}\").join(params[curr]),\n template\n );\n}\n","import { navigateToUrl } from \"single-spa\";\nimport { interpolateUrl } from \"./interpolate-string\";\nimport type {} from \"@openmrs/esm-globals\";\n\nfunction trimTrailingSlash(str: string) {\n return str.replace(/\\/$/, \"\");\n}\n\nexport interface NavigateOptions {\n to: string;\n}\n\n/**\n * Calls `location.assign` for non-SPA paths and [navigateToUrl](https://single-spa.js.org/docs/api/#navigatetourl) for SPA paths\n *\n * Example usage:\n * ```js\n * const config = getConfig();\n * const submitHandler = () => {\n * navigate({ to: config.links.submitSuccess });\n * };\n * ```\n *\n * @param to The target path or URL. Supports templating with 'openmrsBase' and 'openmrsSpaBase'.\n * For example, `${openmrsSpaBase}/home` will resolve to `/openmrs/spa/home`\n * for implementations using the standard OpenMRS and SPA base paths.\n * @category Navigation\n */\nexport function navigate({ to }: NavigateOptions): void {\n const openmrsSpaBase = trimTrailingSlash(window.getOpenmrsSpaBase());\n const target = interpolateUrl(to);\n const isSpaPath = target.startsWith(openmrsSpaBase);\n\n if (isSpaPath) {\n navigateToUrl(target);\n } else {\n window.location.assign(target);\n }\n}\n","import { validator } from \"./validator\";\n\n/**\n * Verifies that the value is between the provided minimum and maximum\n *\n * @param min Minimum acceptable value\n * @param max Maximum acceptable value\n */\nexport const inRange = (min: number, max: number) => {\n return validator(\n (val) => min <= val && val <= max,\n `must be between ${min} and ${max}`\n );\n};\n\n/**\n * Verifies that a string contains only the default URL template\n * parameters, plus any specified in `allowedTemplateParameters`.\n *\n * @param allowedTemplateParameters To be added to `openmrsBase` and `openmrsSpaBase`\n * @category Navigation\n */\nexport const isUrlWithTemplateParameters = (\n allowedTemplateParameters: string[]\n) => {\n const allowedParams = allowedTemplateParameters.concat([\n \"openmrsBase\",\n \"openmrsSpaBase\",\n ]);\n return validator((val) => {\n if (!val || typeof val != \"string\") {\n return false;\n }\n\n const rx = /\\${(.*?)}/g;\n let match = rx.exec(val);\n\n while (match) {\n if (!allowedParams.includes(match[1])) {\n return false;\n }\n\n match = rx.exec(val);\n }\n\n return true;\n }, \"should be a URL or path. The allowed template parameters are \" + allowedParams.map((p) => \"${\" + p + \"}\").join(\", \"));\n};\n\n/**\n * Verifies that a string contains only the default URL template parameters.\n *\n * @category Navigation\n */\nexport const isUrl = isUrlWithTemplateParameters([]);\n\nexport const validators = {\n inRange,\n isUrl,\n isUrlWithTemplateParameters,\n};\n"],"names":["_arity","bind","_curry2","fn","thisObj","length","apply","arguments","module","exports","_clone","clone","_curry1","value","n","this","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","Error","_cloneRegExp","type","refFrom","refTo","deep","copy","copiedValue","len","idx","key","Date","valueOf","pattern","RegExp","source","global","ignoreCase","multiline","sticky","unicode","_isPlaceholder","f1","a","f2","b","_b","_a","f3","c","_c","prop","obj","Object","prototype","hasOwnProperty","call","Array","isArray","val","toString","_isArray","_isString","_isArrayLike","x","nodeType","_xwrap","_iterableReduce","xf","acc","iter","step","next","done","_methodReduce","methodName","symIterator","Symbol","iterator","list","_arrayReduce","reduce","TypeError","XWrap","f","mergeDeepWithKey","mergeDeepRight","lObj","rObj","k","lVal","rVal","_curry3","_isObject","mergeWithKey","_has","l","r","result","undefined","slice","__WEBPACK_EXTERNAL_MODULE__685__","__WEBPACK_EXTERNAL_MODULE__645__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","definition","o","defineProperty","enumerable","get","toStringTag","Type","validator","validationFunction","message","isBoolean","isNumber","isString","isObject","isUuid","test","configInternalStoreInitialValue","providedConfigs","schemas","devDefaultsAreOn","getAreDevDefaultsOn","configInternalStore","createGlobalStore","lastValueOfDevDefaultsAreOn","JSON","parse","localStorage","getItem","e","subscribe","state","setItem","stringify","temporaryConfigStore","config","getTemporaryConfig","configExtensionStore","mountedExtensions","getConfigStore","moduleName","getGlobalStore","loaded","getExtensionSlotsConfigStore","extensionSlotConfigs","getExtensionConfigStore","extensionSlotModuleName","attachedExtensionSlotName","extensionId","implementerToolsConfigStore","computeModuleConfig","keys","getConfigForModule","setState","computeExtensionSlotConfigs","slotConfigsByModule","allConfigs","mergeConfigs","getProvidedConfigs","slotConfigPerModule","extensions","configBySlotName","entries","slotName","validateExtensionSlotConfig","validateAllExtensionSlotConfigs","getExtensionSlotConfigs","computeImplementerToolsConfig","getState","getSchemaWithValuesAndSources","configsAndSources","map","createValuesAndSourcesTree","getImplementerToolsConfig","computeExtensionConfigs","configState","extensionState","extension","extensionStore","slotModuleName","getExtensionConfig","extensionModuleName","defineConfigSchema","schema","validateConfigSchema","provide","sourceName","getConfig","Promise","resolve","store","update","unsubscribe","processConfig","providedConfig","keyPathContext","validateConfig","setDefaults","slotModuleConfig","mergeConfigsFor","configOverride","configure","extensionConfig","_value","_default","_source","isOrdinaryObject","errorPrefix","invalidKeys","filter","includes","console","error","join","add","every","remove","order","keyPath","updateMessage","startsWith","thisKeyPath","schemaPart","elements","_elements","hasObjectSchema","_validators","valueType","_type","values","inputConfig","configs","mergeDeepAll","checkType","runValidators","validateDictionary","validateArray","dictionarySchema","arraySchema","i","Boolean","ConceptUuid","Number","String","UUID","validators","validatorResult","valueString","configPart","devDefault","configWithDefaults","conf","objectKey","selectedConfigPart","elementsSchema","interpolateUrl","template","openmrsSpaBase","window","getOpenmrsSpaBase","replace","interpolateString","openmrsBase","params","prev","curr","split","navigate","to","target","navigateToUrl","location","assign","inRange","min","max","isUrlWithTemplateParameters","allowedTemplateParameters","allowedParams","concat","rx","match","exec","p","isUrl"],"sourceRoot":""}
1
+ {"version":3,"file":"openmrs-esm-module-config.js","mappings":"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","sources":["webpack://@openmrs/esm-config/../../../node_modules/ramda/src/bind.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/clone.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_arity.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_clone.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_cloneRegExp.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_curry1.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_curry2.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_curry3.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_has.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isArray.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isArrayLike.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isObject.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isPlaceholder.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_isString.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_reduce.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/internal/_xwrap.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/mergeDeepRight.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/mergeDeepWithKey.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/mergeWithKey.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/reduce.js","webpack://@openmrs/esm-config/../../../node_modules/ramda/src/type.js","webpack://@openmrs/esm-config/external system \"@openmrs/esm-state\"","webpack://@openmrs/esm-config/external system \"single-spa\"","webpack://@openmrs/esm-config/webpack/bootstrap","webpack://@openmrs/esm-config/webpack/runtime/compat get default export","webpack://@openmrs/esm-config/webpack/runtime/define property getters","webpack://@openmrs/esm-config/webpack/runtime/hasOwnProperty shorthand","webpack://@openmrs/esm-config/webpack/runtime/make namespace object","webpack://@openmrs/esm-config/./src/types.ts","webpack://@openmrs/esm-config/./src/validators/validator.ts","webpack://@openmrs/esm-config/./src/validators/type-validators.ts","webpack://@openmrs/esm-config/./src/module-config/state.ts","webpack://@openmrs/esm-config/./src/module-config/module-config.ts","webpack://@openmrs/esm-config/./src/navigation/interpolate-string.ts","webpack://@openmrs/esm-config/./src/navigation/navigate.ts","webpack://@openmrs/esm-config/./src/validators/validators.ts"],"sourcesContent":["var _arity = /*#__PURE__*/require('./internal/_arity');\n\nvar _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\n/**\n * Creates a function that is bound to a context.\n * Note: `R.bind` does not provide the additional argument-binding capabilities of\n * [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind).\n *\n * @func\n * @memberOf R\n * @since v0.6.0\n * @category Function\n * @category Object\n * @sig (* -> *) -> {*} -> (* -> *)\n * @param {Function} fn The function to bind to context\n * @param {Object} thisObj The context to bind `fn` to\n * @return {Function} A function that will execute in the context of `thisObj`.\n * @see R.partial\n * @example\n *\n * const log = R.bind(console.log, console);\n * R.pipe(R.assoc('a', 2), R.tap(log), R.assoc('a', 3))({a: 1}); //=> {a: 3}\n * // logs {a: 2}\n * @symb R.bind(f, o)(a, b) = f.call(o, a, b)\n */\n\n\nvar bind = /*#__PURE__*/_curry2(function bind(fn, thisObj) {\n return _arity(fn.length, function () {\n return fn.apply(thisObj, arguments);\n });\n});\nmodule.exports = bind;","var _clone = /*#__PURE__*/require('./internal/_clone');\n\nvar _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\n/**\n * Creates a deep copy of the value which may contain (nested) `Array`s and\n * `Object`s, `Number`s, `String`s, `Boolean`s and `Date`s. `Function`s are\n * assigned by reference rather than copied\n *\n * Dispatches to a `clone` method if present.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category Object\n * @sig {*} -> {*}\n * @param {*} value The object or array to clone\n * @return {*} A deeply cloned copy of `val`\n * @example\n *\n * const objects = [{}, {}, {}];\n * const objectsClone = R.clone(objects);\n * objects === objectsClone; //=> false\n * objects[0] === objectsClone[0]; //=> false\n */\n\n\nvar clone = /*#__PURE__*/_curry1(function clone(value) {\n return value != null && typeof value.clone === 'function' ? value.clone() : _clone(value, [], [], true);\n});\nmodule.exports = clone;","function _arity(n, fn) {\n /* eslint-disable no-unused-vars */\n switch (n) {\n case 0:\n return function () {\n return fn.apply(this, arguments);\n };\n case 1:\n return function (a0) {\n return fn.apply(this, arguments);\n };\n case 2:\n return function (a0, a1) {\n return fn.apply(this, arguments);\n };\n case 3:\n return function (a0, a1, a2) {\n return fn.apply(this, arguments);\n };\n case 4:\n return function (a0, a1, a2, a3) {\n return fn.apply(this, arguments);\n };\n case 5:\n return function (a0, a1, a2, a3, a4) {\n return fn.apply(this, arguments);\n };\n case 6:\n return function (a0, a1, a2, a3, a4, a5) {\n return fn.apply(this, arguments);\n };\n case 7:\n return function (a0, a1, a2, a3, a4, a5, a6) {\n return fn.apply(this, arguments);\n };\n case 8:\n return function (a0, a1, a2, a3, a4, a5, a6, a7) {\n return fn.apply(this, arguments);\n };\n case 9:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8) {\n return fn.apply(this, arguments);\n };\n case 10:\n return function (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) {\n return fn.apply(this, arguments);\n };\n default:\n throw new Error('First argument to _arity must be a non-negative integer no greater than ten');\n }\n}\nmodule.exports = _arity;","var _cloneRegExp = /*#__PURE__*/require('./_cloneRegExp');\n\nvar type = /*#__PURE__*/require('../type');\n\n/**\n * Copies an object.\n *\n * @private\n * @param {*} value The value to be copied\n * @param {Array} refFrom Array containing the source references\n * @param {Array} refTo Array containing the copied source references\n * @param {Boolean} deep Whether or not to perform deep cloning.\n * @return {*} The copied value.\n */\n\n\nfunction _clone(value, refFrom, refTo, deep) {\n var copy = function copy(copiedValue) {\n var len = refFrom.length;\n var idx = 0;\n while (idx < len) {\n if (value === refFrom[idx]) {\n return refTo[idx];\n }\n idx += 1;\n }\n refFrom[idx + 1] = value;\n refTo[idx + 1] = copiedValue;\n for (var key in value) {\n copiedValue[key] = deep ? _clone(value[key], refFrom, refTo, true) : value[key];\n }\n return copiedValue;\n };\n switch (type(value)) {\n case 'Object':\n return copy({});\n case 'Array':\n return copy([]);\n case 'Date':\n return new Date(value.valueOf());\n case 'RegExp':\n return _cloneRegExp(value);\n default:\n return value;\n }\n}\nmodule.exports = _clone;","function _cloneRegExp(pattern) {\n return new RegExp(pattern.source, (pattern.global ? 'g' : '') + (pattern.ignoreCase ? 'i' : '') + (pattern.multiline ? 'm' : '') + (pattern.sticky ? 'y' : '') + (pattern.unicode ? 'u' : ''));\n}\nmodule.exports = _cloneRegExp;","var _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal one-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry1(fn) {\n return function f1(a) {\n if (arguments.length === 0 || _isPlaceholder(a)) {\n return f1;\n } else {\n return fn.apply(this, arguments);\n }\n };\n}\nmodule.exports = _curry1;","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal two-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry2(fn) {\n return function f2(a, b) {\n switch (arguments.length) {\n case 0:\n return f2;\n case 1:\n return _isPlaceholder(a) ? f2 : _curry1(function (_b) {\n return fn(a, _b);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f2 : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b);\n }) : fn(a, b);\n }\n };\n}\nmodule.exports = _curry2;","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _curry2 = /*#__PURE__*/require('./_curry2');\n\nvar _isPlaceholder = /*#__PURE__*/require('./_isPlaceholder');\n\n/**\n * Optimized internal three-arity curry function.\n *\n * @private\n * @category Function\n * @param {Function} fn The function to curry.\n * @return {Function} The curried function.\n */\n\n\nfunction _curry3(fn) {\n return function f3(a, b, c) {\n switch (arguments.length) {\n case 0:\n return f3;\n case 1:\n return _isPlaceholder(a) ? f3 : _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n });\n case 2:\n return _isPlaceholder(a) && _isPlaceholder(b) ? f3 : _isPlaceholder(a) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _curry1(function (_c) {\n return fn(a, b, _c);\n });\n default:\n return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c) ? f3 : _isPlaceholder(a) && _isPlaceholder(b) ? _curry2(function (_a, _b) {\n return fn(_a, _b, c);\n }) : _isPlaceholder(a) && _isPlaceholder(c) ? _curry2(function (_a, _c) {\n return fn(_a, b, _c);\n }) : _isPlaceholder(b) && _isPlaceholder(c) ? _curry2(function (_b, _c) {\n return fn(a, _b, _c);\n }) : _isPlaceholder(a) ? _curry1(function (_a) {\n return fn(_a, b, c);\n }) : _isPlaceholder(b) ? _curry1(function (_b) {\n return fn(a, _b, c);\n }) : _isPlaceholder(c) ? _curry1(function (_c) {\n return fn(a, b, _c);\n }) : fn(a, b, c);\n }\n };\n}\nmodule.exports = _curry3;","function _has(prop, obj) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\nmodule.exports = _has;","/**\n * Tests whether or not an object is an array.\n *\n * @private\n * @param {*} val The object to test.\n * @return {Boolean} `true` if `val` is an array, `false` otherwise.\n * @example\n *\n * _isArray([]); //=> true\n * _isArray(null); //=> false\n * _isArray({}); //=> false\n */\nmodule.exports = Array.isArray || function _isArray(val) {\n return val != null && val.length >= 0 && Object.prototype.toString.call(val) === '[object Array]';\n};","var _curry1 = /*#__PURE__*/require('./_curry1');\n\nvar _isArray = /*#__PURE__*/require('./_isArray');\n\nvar _isString = /*#__PURE__*/require('./_isString');\n\n/**\n * Tests whether or not an object is similar to an array.\n *\n * @private\n * @category Type\n * @category List\n * @sig * -> Boolean\n * @param {*} x The object to test.\n * @return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.\n * @example\n *\n * _isArrayLike([]); //=> true\n * _isArrayLike(true); //=> false\n * _isArrayLike({}); //=> false\n * _isArrayLike({length: 10}); //=> false\n * _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true\n */\n\n\nvar _isArrayLike = /*#__PURE__*/_curry1(function isArrayLike(x) {\n if (_isArray(x)) {\n return true;\n }\n if (!x) {\n return false;\n }\n if (typeof x !== 'object') {\n return false;\n }\n if (_isString(x)) {\n return false;\n }\n if (x.nodeType === 1) {\n return !!x.length;\n }\n if (x.length === 0) {\n return true;\n }\n if (x.length > 0) {\n return x.hasOwnProperty(0) && x.hasOwnProperty(x.length - 1);\n }\n return false;\n});\nmodule.exports = _isArrayLike;","function _isObject(x) {\n return Object.prototype.toString.call(x) === '[object Object]';\n}\nmodule.exports = _isObject;","function _isPlaceholder(a) {\n return a != null && typeof a === 'object' && a['@@functional/placeholder'] === true;\n}\nmodule.exports = _isPlaceholder;","function _isString(x) {\n return Object.prototype.toString.call(x) === '[object String]';\n}\nmodule.exports = _isString;","var _isArrayLike = /*#__PURE__*/require('./_isArrayLike');\n\nvar _xwrap = /*#__PURE__*/require('./_xwrap');\n\nvar bind = /*#__PURE__*/require('../bind');\n\nfunction _arrayReduce(xf, acc, list) {\n var idx = 0;\n var len = list.length;\n while (idx < len) {\n acc = xf['@@transducer/step'](acc, list[idx]);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n idx += 1;\n }\n return xf['@@transducer/result'](acc);\n}\n\nfunction _iterableReduce(xf, acc, iter) {\n var step = iter.next();\n while (!step.done) {\n acc = xf['@@transducer/step'](acc, step.value);\n if (acc && acc['@@transducer/reduced']) {\n acc = acc['@@transducer/value'];\n break;\n }\n step = iter.next();\n }\n return xf['@@transducer/result'](acc);\n}\n\nfunction _methodReduce(xf, acc, obj, methodName) {\n return xf['@@transducer/result'](obj[methodName](bind(xf['@@transducer/step'], xf), acc));\n}\n\nvar symIterator = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator';\n\nfunction _reduce(fn, acc, list) {\n if (typeof fn === 'function') {\n fn = _xwrap(fn);\n }\n if (_isArrayLike(list)) {\n return _arrayReduce(fn, acc, list);\n }\n if (typeof list['fantasy-land/reduce'] === 'function') {\n return _methodReduce(fn, acc, list, 'fantasy-land/reduce');\n }\n if (list[symIterator] != null) {\n return _iterableReduce(fn, acc, list[symIterator]());\n }\n if (typeof list.next === 'function') {\n return _iterableReduce(fn, acc, list);\n }\n if (typeof list.reduce === 'function') {\n return _methodReduce(fn, acc, list, 'reduce');\n }\n\n throw new TypeError('reduce: list must be array or iterable');\n}\nmodule.exports = _reduce;","var XWrap = /*#__PURE__*/function () {\n function XWrap(fn) {\n this.f = fn;\n }\n XWrap.prototype['@@transducer/init'] = function () {\n throw new Error('init not implemented on XWrap');\n };\n XWrap.prototype['@@transducer/result'] = function (acc) {\n return acc;\n };\n XWrap.prototype['@@transducer/step'] = function (acc, x) {\n return this.f(acc, x);\n };\n\n return XWrap;\n}();\n\nfunction _xwrap(fn) {\n return new XWrap(fn);\n}\nmodule.exports = _xwrap;","var _curry2 = /*#__PURE__*/require('./internal/_curry2');\n\nvar mergeDeepWithKey = /*#__PURE__*/require('./mergeDeepWithKey');\n\n/**\n * Creates a new object with the own properties of the first object merged with\n * the own properties of the second object. If a key exists in both objects:\n * - and both values are objects, the two values will be recursively merged\n * - otherwise the value from the second object will be used.\n *\n * @func\n * @memberOf R\n * @since v0.24.0\n * @category Object\n * @sig {a} -> {a} -> {a}\n * @param {Object} lObj\n * @param {Object} rObj\n * @return {Object}\n * @see R.merge, R.mergeDeepLeft, R.mergeDeepWith, R.mergeDeepWithKey\n * @example\n *\n * R.mergeDeepRight({ name: 'fred', age: 10, contact: { email: 'moo@example.com' }},\n * { age: 40, contact: { email: 'baa@example.com' }});\n * //=> { name: 'fred', age: 40, contact: { email: 'baa@example.com' }}\n */\n\n\nvar mergeDeepRight = /*#__PURE__*/_curry2(function mergeDeepRight(lObj, rObj) {\n return mergeDeepWithKey(function (k, lVal, rVal) {\n return rVal;\n }, lObj, rObj);\n});\nmodule.exports = mergeDeepRight;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar _isObject = /*#__PURE__*/require('./internal/_isObject');\n\nvar mergeWithKey = /*#__PURE__*/require('./mergeWithKey');\n\n/**\n * Creates a new object with the own properties of the two provided objects.\n * If a key exists in both objects:\n * - and both associated values are also objects then the values will be\n * recursively merged.\n * - otherwise the provided function is applied to the key and associated values\n * using the resulting value as the new value associated with the key.\n * If a key only exists in one object, the value will be associated with the key\n * of the resulting object.\n *\n * @func\n * @memberOf R\n * @since v0.24.0\n * @category Object\n * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} lObj\n * @param {Object} rObj\n * @return {Object}\n * @see R.mergeWithKey, R.mergeDeepWith\n * @example\n *\n * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r\n * R.mergeDeepWithKey(concatValues,\n * { a: true, c: { thing: 'foo', values: [10, 20] }},\n * { b: true, c: { thing: 'bar', values: [15, 35] }});\n * //=> { a: true, b: true, c: { thing: 'bar', values: [10, 20, 15, 35] }}\n */\n\n\nvar mergeDeepWithKey = /*#__PURE__*/_curry3(function mergeDeepWithKey(fn, lObj, rObj) {\n return mergeWithKey(function (k, lVal, rVal) {\n if (_isObject(lVal) && _isObject(rVal)) {\n return mergeDeepWithKey(fn, lVal, rVal);\n } else {\n return fn(k, lVal, rVal);\n }\n }, lObj, rObj);\n});\nmodule.exports = mergeDeepWithKey;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar _has = /*#__PURE__*/require('./internal/_has');\n\n/**\n * Creates a new object with the own properties of the two provided objects. If\n * a key exists in both objects, the provided function is applied to the key\n * and the values associated with the key in each object, with the result being\n * used as the value associated with the key in the returned object.\n *\n * @func\n * @memberOf R\n * @since v0.19.0\n * @category Object\n * @sig ((String, a, a) -> a) -> {a} -> {a} -> {a}\n * @param {Function} fn\n * @param {Object} l\n * @param {Object} r\n * @return {Object}\n * @see R.mergeDeepWithKey, R.merge, R.mergeWith\n * @example\n *\n * let concatValues = (k, l, r) => k == 'values' ? R.concat(l, r) : r\n * R.mergeWithKey(concatValues,\n * { a: true, thing: 'foo', values: [10, 20] },\n * { b: true, thing: 'bar', values: [15, 35] });\n * //=> { a: true, b: true, thing: 'bar', values: [10, 20, 15, 35] }\n * @symb R.mergeWithKey(f, { x: 1, y: 2 }, { y: 5, z: 3 }) = { x: 1, y: f('y', 2, 5), z: 3 }\n */\n\n\nvar mergeWithKey = /*#__PURE__*/_curry3(function mergeWithKey(fn, l, r) {\n var result = {};\n var k;\n\n for (k in l) {\n if (_has(k, l)) {\n result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];\n }\n }\n\n for (k in r) {\n if (_has(k, r) && !_has(k, result)) {\n result[k] = r[k];\n }\n }\n\n return result;\n});\nmodule.exports = mergeWithKey;","var _curry3 = /*#__PURE__*/require('./internal/_curry3');\n\nvar _reduce = /*#__PURE__*/require('./internal/_reduce');\n\n/**\n * Returns a single item by iterating through the list, successively calling\n * the iterator function and passing it an accumulator value and the current\n * value from the array, and then passing the result to the next call.\n *\n * The iterator function receives two values: *(acc, value)*. It may use\n * [`R.reduced`](#reduced) to shortcut the iteration.\n *\n * The arguments' order of [`reduceRight`](#reduceRight)'s iterator function\n * is *(value, acc)*.\n *\n * Note: `R.reduce` does not skip deleted or unassigned indices (sparse\n * arrays), unlike the native `Array.prototype.reduce` method. For more details\n * on this behavior, see:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#Description\n *\n * Dispatches to the `reduce` method of the third argument, if present. When\n * doing so, it is up to the user to handle the [`R.reduced`](#reduced)\n * shortcuting, as this is not implemented by `reduce`.\n *\n * @func\n * @memberOf R\n * @since v0.1.0\n * @category List\n * @sig ((a, b) -> a) -> a -> [b] -> a\n * @param {Function} fn The iterator function. Receives two values, the accumulator and the\n * current element from the array.\n * @param {*} acc The accumulator value.\n * @param {Array} list The list to iterate over.\n * @return {*} The final, accumulated value.\n * @see R.reduced, R.addIndex, R.reduceRight\n * @example\n *\n * R.reduce(R.subtract, 0, [1, 2, 3, 4]) // => ((((0 - 1) - 2) - 3) - 4) = -10\n * // - -10\n * // / \\ / \\\n * // - 4 -6 4\n * // / \\ / \\\n * // - 3 ==> -3 3\n * // / \\ / \\\n * // - 2 -1 2\n * // / \\ / \\\n * // 0 1 0 1\n *\n * @symb R.reduce(f, a, [b, c, d]) = f(f(f(a, b), c), d)\n */\n\n\nvar reduce = /*#__PURE__*/_curry3(_reduce);\nmodule.exports = reduce;","var _curry1 = /*#__PURE__*/require('./internal/_curry1');\n\n/**\n * Gives a single-word string description of the (native) type of a value,\n * returning such answers as 'Object', 'Number', 'Array', or 'Null'. Does not\n * attempt to distinguish user Object types any further, reporting them all as\n * 'Object'.\n *\n * @func\n * @memberOf R\n * @since v0.8.0\n * @category Type\n * @sig (* -> {*}) -> String\n * @param {*} val The value to test\n * @return {String}\n * @example\n *\n * R.type({}); //=> \"Object\"\n * R.type(1); //=> \"Number\"\n * R.type(false); //=> \"Boolean\"\n * R.type('s'); //=> \"String\"\n * R.type(null); //=> \"Null\"\n * R.type([]); //=> \"Array\"\n * R.type(/[A-z]/); //=> \"RegExp\"\n * R.type(() => {}); //=> \"Function\"\n * R.type(undefined); //=> \"Undefined\"\n */\n\n\nvar type = /*#__PURE__*/_curry1(function type(val) {\n return val === null ? 'Null' : val === undefined ? 'Undefined' : Object.prototype.toString.call(val).slice(8, -1);\n});\nmodule.exports = type;","module.exports = __WEBPACK_EXTERNAL_MODULE__685__;","module.exports = __WEBPACK_EXTERNAL_MODULE__645__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export enum Type {\n Array = \"Array\",\n Boolean = \"Boolean\",\n ConceptUuid = \"ConceptUuid\",\n Number = \"Number\",\n Object = \"Object\",\n String = \"String\",\n UUID = \"UUID\",\n}\n\n// Full-powered typing for Config and Schema trees depends on being able to\n// have types like `string not \"_default\"`. There is an experimental PR\n// for this feature, https://github.com/microsoft/TypeScript/pull/29317\n// But it is not likely to be merged any time terribly soon. (Nov 11, 2020)\nexport interface ConfigSchema {\n [key: string]: ConfigSchema | ConfigValue;\n _type?: Type;\n _validators?: Array<Validator>;\n _elements?: ConfigSchema;\n}\n\nexport interface Config extends Object {\n [moduleName: string]: { [key: string]: any };\n}\n\nexport interface ConfigObject extends Object {\n [key: string]: any;\n}\n\nexport type ConfigValue =\n | string\n | number\n | boolean\n | void\n | Array<any>\n | object;\n\nexport interface ExtensionSlotConfig {\n add?: Array<string>;\n remove?: Array<string>;\n order?: Array<string>;\n configure?: ExtensionSlotConfigureValueObject;\n}\n\nexport interface ExtensionSlotConfigureValueObject {\n [key: string]: object;\n}\n\nexport interface ExtensionSlotConfigObject {\n add?: Array<string>;\n remove?: Array<string>;\n order?: Array<string>;\n}\n\nexport type ProvidedConfig = {\n source: string;\n config: Config;\n};\n\nexport type ValidatorFunction = (value: any) => boolean;\n\nexport type Validator = (value: any) => void | string;\n","import { Validator, ValidatorFunction } from \"../types\";\n\nexport function validator(\n validationFunction: ValidatorFunction,\n message: string\n): Validator {\n return (value) => {\n if (!validationFunction(value)) {\n return message;\n }\n };\n}\n","import { validator } from \"./validator\";\n\nexport const isArray = validator(\n (val) => Array.isArray(val),\n \"must be an array\"\n);\n\nexport const isBoolean = validator(\n (val) => typeof val === \"boolean\",\n \"must be a boolean\"\n);\n\nexport const isNumber = validator(\n (val) => typeof val === \"number\",\n \"must be a number\"\n);\n\nexport const isString = validator(\n (val) => typeof val === \"string\",\n \"must be a string\"\n);\n\nexport const isObject = validator(\n (val) => typeof val === \"object\" && !Array.isArray(val) && val !== null,\n \"must be an object (not an array or null)\"\n);\n\nexport const isUuid = validator(\n (val) =>\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n val\n ) || /^[0-9a-f]{36}$/i.test(val),\n \"must be a valid UUID or a 36-character hexadecimal string\"\n);\n","import { createGlobalStore, getGlobalStore } from \"@openmrs/esm-state\";\nimport {\n Config,\n ConfigObject,\n ConfigSchema,\n ExtensionSlotConfigObject,\n ProvidedConfig,\n} from \"../types\";\n\n/**\n * Internal store\n * A store of the inputs and internal state\n * @internal\n */\nexport interface ConfigInternalStore {\n /** Configs added using the `provide` function */\n providedConfigs: Array<ProvidedConfig>;\n /** An object with module names for keys and schemas for values */\n schemas: Record<string, ConfigSchema>;\n /** Whether to use dev defaults or not */\n devDefaultsAreOn: boolean;\n}\n\nconst configInternalStoreInitialValue = {\n providedConfigs: [],\n schemas: {},\n devDefaultsAreOn: getAreDevDefaultsOn(),\n};\n\n/**\n * @internal\n */\nexport const configInternalStore = createGlobalStore<ConfigInternalStore>(\n \"config-internal\",\n configInternalStoreInitialValue\n);\n\nlet lastValueOfDevDefaultsAreOn = getAreDevDefaultsOn();\nconfigInternalStore.subscribe((state) => {\n if (state.devDefaultsAreOn != lastValueOfDevDefaultsAreOn) {\n setAreDevDefaultsOn(state.devDefaultsAreOn);\n lastValueOfDevDefaultsAreOn = state.devDefaultsAreOn;\n }\n});\n\nfunction setAreDevDefaultsOn(value: boolean) {\n localStorage.setItem(\"openmrs:configAreDevDefaultsOn\", JSON.stringify(value));\n}\n\nfunction getAreDevDefaultsOn(): boolean {\n try {\n return JSON.parse(\n localStorage.getItem(\"openmrs:configAreDevDefaultsOn\") || \"false\"\n );\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Temporary config\n * LocalStorage-based config used by the implementer tools\n * @internal\n */\nexport interface TemporaryConfigStore {\n config: Config;\n}\n\nexport const temporaryConfigStore = createGlobalStore<TemporaryConfigStore>(\n \"temporary-config\",\n { config: getTemporaryConfig() }\n);\n\ntemporaryConfigStore.subscribe((state) => {\n setTemporaryConfig(state.config);\n});\n\nfunction setTemporaryConfig(value: Config) {\n localStorage.setItem(\"openmrs:temporaryConfig\", JSON.stringify(value));\n}\n\nfunction getTemporaryConfig(): Config {\n try {\n return JSON.parse(localStorage.getItem(\"openmrs:temporaryConfig\") || \"{}\");\n } catch (e) {\n return {};\n }\n}\n\n/**\n * Config-side extension store\n * Just what esm-config needs to know about extension state. This\n * is to avoid having esm-config depend on esm-extensions, which would\n * create a circular dependency.\n * @internal\n */\nexport interface ConfigExtensionStore {\n mountedExtensions: Array<ConfigExtensionStoreElement>;\n}\n\n/**\n * @internal\n */\nexport interface ConfigExtensionStoreElement {\n slotModuleName: string;\n extensionModuleName: string;\n slotName: string;\n extensionId: string;\n}\n\n/**\n * @internal\n */\nexport const configExtensionStore = createGlobalStore<ConfigExtensionStore>(\n \"config-extensions\",\n { mountedExtensions: [] }\n);\n\n/**\n * Output configs\n *\n * Each module has its own stores for its config and its extension slots' configs.\n */\nexport interface ConfigStore {\n config: ConfigObject | null;\n loaded: boolean;\n}\n\nfunction initializeConfigStore() {\n return {\n config: null,\n loaded: false,\n };\n}\n\nexport function getConfigStore(moduleName: string) {\n // We use a store for each module's config, named `config-${moduleName}`\n return getGlobalStore<ConfigStore>(\n `config-module-${moduleName}`,\n initializeConfigStore()\n );\n}\n\nexport interface ExtensionSlotConfigsStore {\n /** Configs for each extension slot in the module, indexed by slot name */\n extensionSlotConfigs: Record<string, ExtensionSlotConfigObject>;\n loaded: boolean;\n}\n\nfunction initializeExtensionSlotConfigsStore() {\n return {\n extensionSlotConfigs: {},\n loaded: false,\n };\n}\n\nexport function getExtensionSlotsConfigStore(moduleName: string) {\n // Each module gets one store for the configs of all the slots it contains\n return getGlobalStore<ExtensionSlotConfigsStore>(\n `config-extension-slots-${moduleName}`,\n initializeExtensionSlotConfigsStore()\n );\n}\n\n// A store for each mounted extension's config\nexport function getExtensionConfigStore(\n extensionSlotModuleName: string,\n attachedExtensionSlotName: string,\n extensionId: string\n) {\n return getGlobalStore<ConfigStore>(\n `config-extension-${extensionSlotModuleName}-${attachedExtensionSlotName}-${extensionId}`,\n initializeConfigStore()\n );\n}\n\n// A store of the implementer tools output config\nexport interface ImplementerToolsConfigStore {\n config: Config;\n}\n\nexport const implementerToolsConfigStore =\n createGlobalStore<ImplementerToolsConfigStore>(\"config-implementer-tools\", {\n config: {},\n });\n","import { clone, reduce, mergeDeepRight } from \"ramda\";\nimport {\n Config,\n ConfigObject,\n ConfigSchema,\n ExtensionSlotConfig,\n ExtensionSlotConfigObject,\n Type,\n} from \"../types\";\nimport {\n isArray,\n isBoolean,\n isUuid,\n isNumber,\n isObject,\n isString,\n} from \"../validators/type-validators\";\nimport {\n ConfigExtensionStore,\n ConfigInternalStore,\n configInternalStore,\n ConfigStore,\n configExtensionStore,\n getConfigStore,\n getExtensionConfigStore,\n getExtensionSlotsConfigStore,\n implementerToolsConfigStore,\n temporaryConfigStore,\n} from \"./state\";\nimport type {} from \"@openmrs/esm-globals\";\nimport { TemporaryConfigStore } from \"..\";\n\n/**\n * Store setup\n *\n *\n * Set up stores and subscriptions so that inputs get processed appropriately.\n *\n * There are *input* stores and *output* stores. The *input* stores\n * are configInternalStore, temporaryConfigStore, and configExtensionStore. The\n * output stores are set in the `compute...` functions. They are the module\n * config stores, the extension slot config stores (by module), the extension\n * config stores, and the implementer tools config store.\n *\n * This code sets up the subscriptions so that when an input store changes,\n * the correct set of output stores are updated.\n *\n * All `compute...` functions except `computeExtensionConfigs` are pure\n * (or are supposed to be). `computeExtensionConfigs` calls `getGlobalStore`,\n * which creates stores.\n */\ncomputeModuleConfig(\n configInternalStore.getState(),\n temporaryConfigStore.getState()\n);\nconfigInternalStore.subscribe((configState) =>\n computeModuleConfig(configState, temporaryConfigStore.getState())\n);\ntemporaryConfigStore.subscribe((tempConfigState) =>\n computeModuleConfig(configInternalStore.getState(), tempConfigState)\n);\n\ncomputeImplementerToolsConfig(\n configInternalStore.getState(),\n temporaryConfigStore.getState()\n);\nconfigInternalStore.subscribe((configState) =>\n computeImplementerToolsConfig(configState, temporaryConfigStore.getState())\n);\ntemporaryConfigStore.subscribe((tempConfigState) =>\n computeImplementerToolsConfig(configInternalStore.getState(), tempConfigState)\n);\n\ncomputeExtensionSlotConfigs(\n configInternalStore.getState(),\n temporaryConfigStore.getState()\n);\nconfigInternalStore.subscribe((configState) =>\n computeExtensionSlotConfigs(configState, temporaryConfigStore.getState())\n);\ntemporaryConfigStore.subscribe((tempConfigState) =>\n computeExtensionSlotConfigs(configInternalStore.getState(), tempConfigState)\n);\n\ncomputeExtensionConfigs(\n configInternalStore.getState(),\n configExtensionStore.getState(),\n temporaryConfigStore.getState()\n);\nconfigInternalStore.subscribe((configState) =>\n computeExtensionConfigs(\n configState,\n configExtensionStore.getState(),\n temporaryConfigStore.getState()\n )\n);\nconfigExtensionStore.subscribe((extensionState) =>\n computeExtensionConfigs(\n configInternalStore.getState(),\n extensionState,\n temporaryConfigStore.getState()\n )\n);\ntemporaryConfigStore.subscribe((tempConfigState) =>\n computeExtensionConfigs(\n configInternalStore.getState(),\n configExtensionStore.getState(),\n tempConfigState\n )\n);\n\nfunction computeModuleConfig(\n state: ConfigInternalStore,\n tempState: TemporaryConfigStore\n) {\n for (let moduleName of Object.keys(state.schemas)) {\n const config = getConfigForModule(moduleName, state, tempState);\n const moduleStore = getConfigStore(moduleName);\n moduleStore.setState({ loaded: true, config });\n }\n}\n\nfunction computeExtensionSlotConfigs(\n state: ConfigInternalStore,\n tempState: TemporaryConfigStore\n) {\n const slotConfigsByModule = getExtensionSlotConfigs(state, tempState);\n for (let [moduleName, extensionSlotConfigs] of Object.entries(\n slotConfigsByModule\n )) {\n const moduleStore = getExtensionSlotsConfigStore(moduleName);\n moduleStore.setState({ loaded: true, extensionSlotConfigs });\n }\n}\n\nfunction computeImplementerToolsConfig(\n state: ConfigInternalStore,\n tempConfigState: TemporaryConfigStore\n) {\n const config = getImplementerToolsConfig(state, tempConfigState);\n implementerToolsConfigStore.setState({ config });\n}\n\nfunction computeExtensionConfigs(\n configState: ConfigInternalStore,\n extensionState: ConfigExtensionStore,\n tempConfigState: TemporaryConfigStore\n) {\n for (let extension of extensionState.mountedExtensions) {\n const extensionStore = getExtensionConfigStore(\n extension.slotModuleName,\n extension.slotName,\n extension.extensionId\n );\n const config = getExtensionConfig(\n extension.slotModuleName,\n extension.extensionModuleName,\n extension.slotName,\n extension.extensionId,\n configState,\n tempConfigState\n );\n extensionStore.setState({ loaded: true, config });\n }\n}\n\n/*\n * API\n *\n */\n\nexport function defineConfigSchema(moduleName: string, schema: ConfigSchema) {\n validateConfigSchema(moduleName, schema);\n const state = configInternalStore.getState();\n configInternalStore.setState({\n schemas: { ...state.schemas, [moduleName]: schema },\n });\n}\n\nexport function provide(config: Config, sourceName = \"provided\") {\n const state = configInternalStore.getState();\n configInternalStore.setState({\n providedConfigs: [...state.providedConfigs, { source: sourceName, config }],\n });\n}\n\n/**\n * A promise-based way to access the config as soon as it is fully loaded.\n * If it is already loaded, resolves the config in its present state.\n *\n * In general you should use the Unistore-based API provided by\n * `getConfigStore`, which allows creating a subscription so that you always\n * have the latest config. If using React, just use `useConfig`.\n *\n * This is a useful function if you need to get the config in the course\n * of the execution of a function.\n *\n * @param moduleName The name of the module for which to look up the config\n */\nexport function getConfig(moduleName: string): Promise<Config> {\n return new Promise<Config>((resolve) => {\n const store = getConfigStore(moduleName);\n function update(state: ConfigStore) {\n if (state.loaded && state.config) {\n resolve(state.config);\n unsubscribe && unsubscribe();\n }\n }\n update(store.getState());\n const unsubscribe = store.subscribe(update);\n });\n}\n\n/**\n * Validate and interpolate defaults for `providedConfig` according to `schema`\n *\n * @param schema a configuration schema\n * @param providedConfig an object of config values (without the top-level module name)\n * @param keyPathContext a dot-deparated string which helps the user figure out where\n * the provided config came from\n */\nexport function processConfig(\n schema: ConfigSchema,\n providedConfig: ConfigObject,\n keyPathContext: string,\n devDefaultsAreOn: boolean = false\n) {\n validateConfig(schema, providedConfig, keyPathContext);\n const config = setDefaults(schema, providedConfig, devDefaultsAreOn);\n return config;\n}\n\n/*\n * Helper functions\n *\n */\n\n/**\n * Returns the configuration for an extension. This configuration is specific\n * to the slot in which it is mounted, and its ID within that slot.\n *\n * The schema for that configuration is the schema for the module in which the\n * extension is defined.\n *\n * @param slotModuleName The name of the module which defines the extension slot\n * @param extensionModuleName The name of the module which defines the extension (and therefore the config schema)\n * @param slotName The name of the extension slot where the extension is mounted\n * @param extensionId The ID of the extension in its slot\n */\nfunction getExtensionConfig(\n slotModuleName: string,\n extensionModuleName: string,\n slotName: string,\n extensionId: string,\n configState: ConfigInternalStore,\n tempConfigState: TemporaryConfigStore\n) {\n const providedConfigs = getProvidedConfigs(configState, tempConfigState);\n const slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);\n const configOverride =\n slotModuleConfig?.extensions?.[slotName]?.configure?.[extensionId] ?? {};\n const extensionModuleConfig = mergeConfigsFor(\n extensionModuleName,\n providedConfigs\n );\n const extensionConfig = mergeConfigs([extensionModuleConfig, configOverride]);\n const schema = configState.schemas[extensionModuleName]; // TODO: validate that a schema exists for the module\n validateConfig(schema, extensionConfig, extensionModuleName);\n const config = setDefaults(\n schema,\n extensionConfig,\n configState.devDefaultsAreOn\n );\n delete config.extensions;\n return config;\n}\n\nfunction getImplementerToolsConfig(\n configState: ConfigInternalStore,\n tempConfigState: TemporaryConfigStore\n): Record<string, Config> {\n let result = getSchemaWithValuesAndSources(clone(configState.schemas));\n const configsAndSources = [\n ...configState.providedConfigs.map((c) => [c.config, c.source]),\n [tempConfigState.config, \"temporary config\"],\n ] as Array<[Config, string]>;\n for (let [config, source] of configsAndSources) {\n result = mergeConfigs([result, createValuesAndSourcesTree(config, source)]);\n }\n return result;\n}\n\nfunction getSchemaWithValuesAndSources(schema) {\n if (schema.hasOwnProperty(\"_default\")) {\n return { ...schema, _value: schema._default, _source: \"default\" };\n } else if (isOrdinaryObject(schema)) {\n return Object.keys(schema).reduce((obj, key) => {\n obj[key] = getSchemaWithValuesAndSources(schema[key]);\n return obj;\n }, {});\n } else {\n // Schema is bad; error will have been logged during schema validation\n return {};\n }\n}\n\nfunction createValuesAndSourcesTree(config: ConfigObject, source: string) {\n if (isOrdinaryObject(config)) {\n return Object.keys(config).reduce((obj, key) => {\n obj[key] = createValuesAndSourcesTree(config[key], source);\n return obj;\n }, {});\n } else {\n return { _value: config, _source: source };\n }\n}\n\nfunction getExtensionSlotConfigs(\n configState: ConfigInternalStore,\n tempConfigState: TemporaryConfigStore\n): Record<string, Record<string, ExtensionSlotConfigObject>> {\n const allConfigs = mergeConfigs(\n getProvidedConfigs(configState, tempConfigState)\n );\n const slotConfigPerModule: Record<\n string,\n Record<string, ExtensionSlotConfig>\n > = Object.keys(allConfigs).reduce((obj, key) => {\n if (allConfigs[key]?.extensions) {\n obj[key] = allConfigs[key]?.extensions;\n }\n return obj;\n }, {});\n validateAllExtensionSlotConfigs(slotConfigPerModule);\n return slotConfigPerModule;\n}\n\nfunction validateAllExtensionSlotConfigs(\n slotConfigPerModule: Record<string, Record<string, ExtensionSlotConfig>>\n) {\n for (let [moduleName, configBySlotName] of Object.entries(\n slotConfigPerModule\n )) {\n for (let [slotName, config] of Object.entries(configBySlotName)) {\n validateExtensionSlotConfig(config, moduleName, slotName);\n }\n }\n}\n\nfunction validateExtensionSlotConfig(\n config: ExtensionSlotConfig,\n moduleName: string,\n slotName: string\n): void {\n const errorPrefix = `Extension slot config '${moduleName}.extensions.${slotName}`;\n const invalidKeys = Object.keys(config).filter(\n (k) => ![\"add\", \"remove\", \"order\", \"configure\"].includes(k)\n );\n if (invalidKeys.length) {\n console.error(\n errorPrefix + `' contains invalid keys '${invalidKeys.join(\"', '\")}'`\n );\n }\n if (config.add) {\n if (\n !Array.isArray(config.add) ||\n !config.add.every((n) => typeof n === \"string\")\n ) {\n console.error(\n errorPrefix +\n `.add' is invalid. Must be an array of strings (extension IDs)`\n );\n }\n }\n if (config.remove) {\n if (\n !Array.isArray(config.remove) ||\n !config.remove.every((n) => typeof n === \"string\")\n ) {\n console.error(\n errorPrefix +\n `.remove' is invalid. Must be an array of strings (extension IDs)`\n );\n }\n }\n if (config.order) {\n if (\n !Array.isArray(config.order) ||\n !config.order.every((n) => typeof n === \"string\")\n ) {\n console.error(\n errorPrefix +\n `.order' is invalid. Must be an array of strings (extension IDs)`\n );\n }\n }\n if (config.configure) {\n if (!isOrdinaryObject(config.configure)) {\n console.error(\n errorPrefix +\n `.configure' is invalid. Must be an object with extension IDs for keys`\n );\n }\n }\n}\n\nfunction getProvidedConfigs(\n configState: ConfigInternalStore,\n tempConfigState: TemporaryConfigStore\n): Array<Config> {\n return [\n ...configState.providedConfigs.map((c) => c.config),\n tempConfigState.config,\n ];\n}\n\nfunction validateConfigSchema(\n moduleName: string,\n schema: ConfigSchema,\n keyPath = \"\"\n) {\n const updateMessage = `Please verify that you are running the latest version and, if so, alert the maintainer.`;\n\n for (const key of Object.keys(schema).filter((k) => !k.startsWith(\"_\"))) {\n const thisKeyPath = keyPath + (keyPath && \".\") + key;\n const schemaPart = schema[key] as ConfigSchema;\n\n if (!isOrdinaryObject(schemaPart)) {\n console.error(\n `${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}`\n );\n continue;\n }\n\n if (!schemaPart.hasOwnProperty(\"_default\")) {\n // recurse for nested config keys\n validateConfigSchema(moduleName, schemaPart, thisKeyPath);\n }\n\n const elements = schemaPart._elements;\n if (hasObjectSchema(elements)) {\n validateConfigSchema(moduleName, elements, thisKeyPath + \"._elements\");\n }\n\n if (schemaPart._validators) {\n for (let validator of schemaPart._validators) {\n if (typeof validator !== \"function\") {\n console.error(\n `${moduleName} has invalid validator for key '${thisKeyPath}' ${updateMessage}.` +\n `\\n\\nIf you're the maintainer: validators must be functions that return either ` +\n `undefined or an error string. Received ${validator}.`\n );\n }\n }\n }\n\n const valueType = schemaPart._type;\n if (valueType && !Object.values(Type).includes(valueType)) {\n console.error(\n `${moduleName} has invalid type for key '${thisKeyPath}' ${updateMessage}.` +\n `\\n\\nIf you're the maintainer: the allowed types are ${Object.values(\n Type\n ).join(\", \")}. ` +\n `Received '${valueType}'`\n );\n }\n\n if (\n Object.keys(schemaPart).every((k) =>\n [\"_description\", \"_validators\", \"_elements\", \"_type\"].includes(k)\n ) &&\n !keyPath.includes(\"._elements\")\n ) {\n console.error(\n `${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` +\n `\\n\\nIf you're the maintainer: all config elements must have a default. ` +\n `Received ${JSON.stringify(schemaPart)}`\n );\n }\n\n if (\n elements &&\n valueType &&\n ![Type.Array, Type.Object].includes(valueType)\n ) {\n console.error(\n `${moduleName} has bad config schema definition for key '${thisKeyPath}'. ${updateMessage}.` +\n `\\n\\nIf you're the maintainer: the 'elements' key only works with '_type' equal to 'Array' or 'Object'. ` +\n `Received ${JSON.stringify(valueType)}`\n );\n }\n }\n}\n\nfunction getConfigForModule(\n moduleName: string,\n configState: ConfigInternalStore,\n tempConfigState: TemporaryConfigStore\n): ConfigObject {\n if (!configState.schemas.hasOwnProperty(moduleName)) {\n throw Error(\"No config schema has been defined for \" + moduleName);\n }\n\n const schema = configState.schemas[moduleName];\n const inputConfig = mergeConfigsFor(\n moduleName,\n getProvidedConfigs(configState, tempConfigState)\n );\n validateConfig(schema, inputConfig, moduleName);\n const config = setDefaults(schema, inputConfig, configState.devDefaultsAreOn);\n delete config.extensions;\n return config;\n}\n\nfunction mergeConfigsFor(\n moduleName: string,\n allConfigs: Array<Config>\n): ConfigObject {\n const allConfigsForModule = allConfigs\n .map(({ [moduleName]: c }) => c)\n .filter((c) => !!c);\n\n return mergeConfigs(allConfigsForModule);\n}\n\nfunction mergeConfigs(configs: Array<Config>) {\n const mergeDeepAll = reduce(mergeDeepRight);\n return mergeDeepAll({}, configs) as Config;\n}\n\n// Recursively check the provided config tree to make sure that all\n// of the provided properties exist in the schema. Run validators\n// where present in the schema.\nconst validateConfig = (\n schema: ConfigSchema,\n config: ConfigObject,\n keyPath = \"\"\n) => {\n for (const key of Object.keys(config)) {\n const value = config[key];\n const thisKeyPath = keyPath + \".\" + key;\n const schemaPart = schema[key] as ConfigSchema;\n\n if (!schema.hasOwnProperty(key)) {\n if (key !== \"extensions\") {\n console.error(\n `Unknown config key '${thisKeyPath}' provided. Ignoring.`\n );\n }\n\n continue;\n }\n\n checkType(thisKeyPath, schemaPart._type, value);\n runValidators(thisKeyPath, schemaPart._validators, value);\n\n if (isOrdinaryObject(value)) {\n // structurally validate only if there's elements specified\n // or there's a `_default` value, which indicates a freeform object\n if (schemaPart._type === Type.Object) {\n validateDictionary(schemaPart, value, thisKeyPath);\n } else if (!schemaPart.hasOwnProperty(\"_default\")) {\n // recurse to validate nested object structure\n validateConfig(schemaPart, value, thisKeyPath);\n }\n } else {\n if (schemaPart._type === Type.Array) {\n validateArray(schemaPart, value, thisKeyPath);\n }\n }\n }\n};\n\nfunction validateDictionary(\n dictionarySchema: ConfigSchema,\n config: ConfigObject,\n keyPath: string\n) {\n if (dictionarySchema._elements) {\n for (const key of Object.keys(config)) {\n const value = config[key];\n validateConfig(dictionarySchema._elements, value, `${keyPath}.${key}`);\n }\n }\n}\n\nfunction validateArray(\n arraySchema: ConfigSchema,\n value: ConfigObject,\n keyPath: string\n) {\n // if there is an array element object schema, verify that elements match it\n if (hasObjectSchema(arraySchema._elements)) {\n for (let i = 0; i < value.length; i++) {\n validateConfig(arraySchema._elements, value[i], `${keyPath}[${i}]`);\n }\n }\n\n for (let i = 0; i < value.length; i++) {\n checkType(`${keyPath}[${i}]`, arraySchema._elements?._type, value[i]);\n runValidators(\n `${keyPath}[${i}]`,\n arraySchema._elements?._validators,\n value[i]\n );\n }\n}\n\nfunction checkType(keyPath: string, _type: Type | undefined, value: any) {\n if (_type) {\n const validator: Record<string, Function> = {\n Array: isArray,\n Boolean: isBoolean,\n ConceptUuid: isUuid,\n Number: isNumber,\n Object: isObject,\n String: isString,\n UUID: isUuid,\n };\n runValidators(keyPath, [validator[_type]], value);\n }\n}\n\nfunction runValidators(\n keyPath: string,\n validators: Array<Function> | undefined,\n value: any\n) {\n if (validators) {\n try {\n for (let validator of validators) {\n const validatorResult = validator(value);\n\n if (typeof validatorResult === \"string\") {\n const valueString =\n typeof value === \"object\" ? JSON.stringify(value) : value;\n console.error(\n `Invalid configuration value ${valueString} for ${keyPath}: ${validatorResult}`\n );\n }\n }\n } catch (e) {\n console.error(`Skipping invalid validator at \"${keyPath}\".`);\n }\n }\n}\n\n// Recursively fill in the config with values from the schema.\nconst setDefaults = (\n schema: ConfigSchema,\n inputConfig: Config,\n devDefaultsAreOn: boolean\n) => {\n const config = clone(inputConfig);\n\n if (!schema) {\n return config;\n }\n\n for (const key of Object.keys(schema)) {\n const configPart = config[key];\n const schemaPart = schema[key] as ConfigSchema;\n\n // The `schemaPart &&` clause of this `if` statement will only fail\n // if the schema is very invalid. It is there to prevent the app from\n // crashing completely, though it will produce unexpected behavior.\n // If this happens, there should be legible errors in the console from\n // the schema validator.\n if (schemaPart && schemaPart.hasOwnProperty(\"_default\")) {\n // We assume that schemaPart defines a config value, since it has\n // a property `_default`.\n if (!config.hasOwnProperty(key)) {\n const devDefault = schemaPart[\"_devDefault\"] || schemaPart[\"_default\"];\n\n (config[key] as any) = devDefaultsAreOn\n ? devDefault\n : schemaPart[\"_default\"];\n }\n\n // We also check if it is an object or array with object elements, in which case we recurse\n const elements = schemaPart._elements;\n\n if (configPart && hasObjectSchema(elements)) {\n if (schemaPart._type === Type.Array) {\n const configWithDefaults = configPart.map((conf: Config) =>\n setDefaults(elements, conf, devDefaultsAreOn)\n );\n config[key] = configWithDefaults;\n } else if (schemaPart._type === Type.Object) {\n for (let objectKey of Object.keys(configPart)) {\n configPart[objectKey] = setDefaults(\n elements,\n configPart[objectKey],\n devDefaultsAreOn\n );\n }\n }\n }\n } else if (isOrdinaryObject(schemaPart)) {\n // Since schemaPart has no property \"_default\", if it's an ordinary object\n // (unlike, importantly, the validators array), we assume it is a parent config property.\n // We recurse to config[key] and schema[key]. Default config[key] to {}.\n const selectedConfigPart = config.hasOwnProperty(key) ? configPart : {};\n\n if (isOrdinaryObject(selectedConfigPart)) {\n config[key] = setDefaults(\n schemaPart,\n selectedConfigPart,\n devDefaultsAreOn\n );\n }\n }\n }\n\n return config;\n};\n\nfunction hasObjectSchema(\n elementsSchema: Object | undefined\n): elementsSchema is ConfigSchema {\n return (\n !!elementsSchema &&\n Object.keys(elementsSchema).filter(\n (e) => ![\"_default\", \"_validators\"].includes(e)\n ).length > 0\n );\n}\n\nfunction isOrdinaryObject(value) {\n return typeof value === \"object\" && !Array.isArray(value) && value !== null;\n}\n","function trimTrailingSlash(str: string) {\n return str.replace(/\\/$/, \"\");\n}\n\n/**\n * @internal\n * Interpolates a string with openmrsBase and openmrsSpaBase\n *\n * @param template A string to interpolate\n */\nexport function interpolateUrl(template: string): string {\n const openmrsSpaBase = trimTrailingSlash(window.getOpenmrsSpaBase());\n return interpolateString(template, {\n openmrsBase: window.openmrsBase,\n openmrsSpaBase: openmrsSpaBase,\n }).replace(/^\\/\\//, \"/\"); // remove extra initial slash if present\n}\n\n/**\n * Interpolates values of `params` into the `template` string.\n *\n * Useful for additional template parameters in URLs.\n *\n * Example usage:\n * ```js\n * navigate({\n * to: interpolateString(\n * config.links.patientChart,\n * { patientUuid: patient.uuid }\n * )\n * });\n * ```\n *\n * @param template With optional params wrapped in `${ }`\n * @param params Values to interpolate into the string template\n * @category Navigation\n */\nexport function interpolateString(template: string, params: object): string {\n const names = Object.keys(params);\n return names.reduce(\n (prev, curr) => prev.split(\"${\" + curr + \"}\").join(params[curr]),\n template\n );\n}\n","import { navigateToUrl } from \"single-spa\";\nimport { interpolateUrl } from \"./interpolate-string\";\nimport type {} from \"@openmrs/esm-globals\";\n\nfunction trimTrailingSlash(str: string) {\n return str.replace(/\\/$/, \"\");\n}\n\nexport interface NavigateOptions {\n to: string;\n}\n\n/**\n * Calls `location.assign` for non-SPA paths and [navigateToUrl](https://single-spa.js.org/docs/api/#navigatetourl) for SPA paths\n *\n * Example usage:\n * ```js\n * const config = getConfig();\n * const submitHandler = () => {\n * navigate({ to: config.links.submitSuccess });\n * };\n * ```\n *\n * @param to The target path or URL. Supports templating with 'openmrsBase' and 'openmrsSpaBase'.\n * For example, `${openmrsSpaBase}/home` will resolve to `/openmrs/spa/home`\n * for implementations using the standard OpenMRS and SPA base paths.\n * @category Navigation\n */\nexport function navigate({ to }: NavigateOptions): void {\n const openmrsSpaBase = trimTrailingSlash(window.getOpenmrsSpaBase());\n const target = interpolateUrl(to);\n const isSpaPath = target.startsWith(openmrsSpaBase);\n\n if (isSpaPath) {\n navigateToUrl(target);\n } else {\n window.location.assign(target);\n }\n}\n","import { validator } from \"./validator\";\n\n/**\n * Verifies that the value is between the provided minimum and maximum\n *\n * @param min Minimum acceptable value\n * @param max Maximum acceptable value\n */\nexport const inRange = (min: number, max: number) => {\n return validator(\n (val) => min <= val && val <= max,\n `must be between ${min} and ${max}`\n );\n};\n\n/**\n * Verifies that a string contains only the default URL template\n * parameters, plus any specified in `allowedTemplateParameters`.\n *\n * @param allowedTemplateParameters To be added to `openmrsBase` and `openmrsSpaBase`\n * @category Navigation\n */\nexport const isUrlWithTemplateParameters = (\n allowedTemplateParameters: string[]\n) => {\n const allowedParams = allowedTemplateParameters.concat([\n \"openmrsBase\",\n \"openmrsSpaBase\",\n ]);\n return validator((val) => {\n if (!val || typeof val != \"string\") {\n return false;\n }\n\n const rx = /\\${(.*?)}/g;\n let match = rx.exec(val);\n\n while (match) {\n if (!allowedParams.includes(match[1])) {\n return false;\n }\n\n match = rx.exec(val);\n }\n\n return true;\n }, \"should be a URL or path. The allowed template parameters are \" + allowedParams.map((p) => \"${\" + p + \"}\").join(\", \"));\n};\n\n/**\n * Verifies that a string contains only the default URL template parameters.\n *\n * @category Navigation\n */\nexport const isUrl = isUrlWithTemplateParameters([]);\n\nexport const validators = {\n inRange,\n isUrl,\n isUrlWithTemplateParameters,\n};\n"],"names":["_arity","bind","_curry2","fn","thisObj","length","apply","arguments","module","exports","_clone","clone","_curry1","value","n","this","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","Error","_cloneRegExp","type","refFrom","refTo","deep","copy","copiedValue","len","idx","key","Date","valueOf","pattern","RegExp","source","global","ignoreCase","multiline","sticky","unicode","_isPlaceholder","f1","a","f2","b","_b","_a","f3","c","_c","prop","obj","Object","prototype","hasOwnProperty","call","Array","isArray","val","toString","_isArray","_isString","_isArrayLike","x","nodeType","_xwrap","_iterableReduce","xf","acc","iter","step","next","done","_methodReduce","methodName","symIterator","Symbol","iterator","list","_arrayReduce","reduce","TypeError","XWrap","f","mergeDeepWithKey","mergeDeepRight","lObj","rObj","k","lVal","rVal","_curry3","_isObject","mergeWithKey","_has","l","r","result","undefined","slice","__WEBPACK_EXTERNAL_MODULE__685__","__WEBPACK_EXTERNAL_MODULE__645__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","d","definition","o","defineProperty","enumerable","get","toStringTag","Type","validator","validationFunction","message","isBoolean","isNumber","isString","isObject","isUuid","test","configInternalStoreInitialValue","providedConfigs","schemas","devDefaultsAreOn","getAreDevDefaultsOn","configInternalStore","createGlobalStore","lastValueOfDevDefaultsAreOn","JSON","parse","localStorage","getItem","e","subscribe","state","setItem","stringify","temporaryConfigStore","config","getTemporaryConfig","configExtensionStore","mountedExtensions","getConfigStore","moduleName","getGlobalStore","loaded","getExtensionSlotsConfigStore","extensionSlotConfigs","getExtensionConfigStore","extensionSlotModuleName","attachedExtensionSlotName","extensionId","implementerToolsConfigStore","computeModuleConfig","tempState","keys","getConfigForModule","setState","computeExtensionSlotConfigs","slotConfigsByModule","configState","tempConfigState","allConfigs","mergeConfigs","getProvidedConfigs","slotConfigPerModule","extensions","configBySlotName","entries","slotName","validateExtensionSlotConfig","validateAllExtensionSlotConfigs","getExtensionSlotConfigs","computeImplementerToolsConfig","getSchemaWithValuesAndSources","configsAndSources","map","createValuesAndSourcesTree","getImplementerToolsConfig","computeExtensionConfigs","extensionState","extension","extensionStore","slotModuleName","getExtensionConfig","extensionModuleName","defineConfigSchema","schema","validateConfigSchema","getState","provide","sourceName","getConfig","Promise","resolve","store","update","unsubscribe","processConfig","providedConfig","keyPathContext","validateConfig","setDefaults","slotModuleConfig","mergeConfigsFor","configOverride","configure","extensionConfig","_value","_default","_source","isOrdinaryObject","errorPrefix","invalidKeys","filter","includes","console","error","join","add","every","remove","order","keyPath","updateMessage","startsWith","thisKeyPath","schemaPart","elements","_elements","hasObjectSchema","_validators","valueType","_type","values","inputConfig","configs","mergeDeepAll","checkType","runValidators","validateDictionary","validateArray","dictionarySchema","arraySchema","i","Boolean","ConceptUuid","Number","String","UUID","validators","validatorResult","valueString","configPart","devDefault","configWithDefaults","conf","objectKey","selectedConfigPart","elementsSchema","interpolateUrl","template","openmrsSpaBase","window","getOpenmrsSpaBase","replace","interpolateString","openmrsBase","params","prev","curr","split","navigate","to","target","navigateToUrl","location","assign","inRange","min","max","isUrlWithTemplateParameters","allowedTemplateParameters","allowedParams","concat","rx","match","exec","p","isUrl"],"sourceRoot":""}
package/docs/API.md CHANGED
@@ -297,7 +297,7 @@ ___
297
297
 
298
298
  #### Defined in
299
299
 
300
- [packages/framework/esm-config/src/module-config/module-config.ts:135](https://github.com/openmrs/openmrs-esm-core/blob/master/packages/framework/esm-config/src/module-config/module-config.ts#L135)
300
+ [packages/framework/esm-config/src/module-config/module-config.ts:172](https://github.com/openmrs/openmrs-esm-core/blob/master/packages/framework/esm-config/src/module-config/module-config.ts#L172)
301
301
 
302
302
  ___
303
303
 
@@ -305,9 +305,8 @@ ___
305
305
 
306
306
  ▸ **getConfig**(`moduleName`): `Promise`<[`Config`](interfaces/Config.md)\>
307
307
 
308
- A promise-based way to access the config as soon as it is fully loaded
309
- from the import-map. If it is already loaded, resolves the config in its
310
- present state.
308
+ A promise-based way to access the config as soon as it is fully loaded.
309
+ If it is already loaded, resolves the config in its present state.
311
310
 
312
311
  In general you should use the Unistore-based API provided by
313
312
  `getConfigStore`, which allows creating a subscription so that you always
@@ -328,7 +327,7 @@ of the execution of a function.
328
327
 
329
328
  #### Defined in
330
329
 
331
- [packages/framework/esm-config/src/module-config/module-config.ts:164](https://github.com/openmrs/openmrs-esm-core/blob/master/packages/framework/esm-config/src/module-config/module-config.ts#L164)
330
+ [packages/framework/esm-config/src/module-config/module-config.ts:200](https://github.com/openmrs/openmrs-esm-core/blob/master/packages/framework/esm-config/src/module-config/module-config.ts#L200)
332
331
 
333
332
  ___
334
333
 
@@ -419,17 +418,18 @@ ___
419
418
 
420
419
  ### processConfig
421
420
 
422
- ▸ **processConfig**(`schema`, `providedConfig`, `keyPathContext`): [`Config`](interfaces/Config.md)
421
+ ▸ **processConfig**(`schema`, `providedConfig`, `keyPathContext`, `devDefaultsAreOn?`): [`Config`](interfaces/Config.md)
423
422
 
424
423
  Validate and interpolate defaults for `providedConfig` according to `schema`
425
424
 
426
425
  #### Parameters
427
426
 
428
- | Name | Type | Description |
429
- | :------ | :------ | :------ |
430
- | `schema` | [`ConfigSchema`](interfaces/ConfigSchema.md) | a configuration schema |
431
- | `providedConfig` | [`ConfigObject`](interfaces/ConfigObject.md) | an object of config values (without the top-level module name) |
432
- | `keyPathContext` | `string` | a dot-deparated string which helps the user figure out where the provided config came from |
427
+ | Name | Type | Default value | Description |
428
+ | :------ | :------ | :------ | :------ |
429
+ | `schema` | [`ConfigSchema`](interfaces/ConfigSchema.md) | `undefined` | a configuration schema |
430
+ | `providedConfig` | [`ConfigObject`](interfaces/ConfigObject.md) | `undefined` | an object of config values (without the top-level module name) |
431
+ | `keyPathContext` | `string` | `undefined` | a dot-deparated string which helps the user figure out where the provided config came from |
432
+ | `devDefaultsAreOn` | `boolean` | `false` | - |
433
433
 
434
434
  #### Returns
435
435
 
@@ -437,7 +437,7 @@ Validate and interpolate defaults for `providedConfig` according to `schema`
437
437
 
438
438
  #### Defined in
439
439
 
440
- [packages/framework/esm-config/src/module-config/module-config.ts:186](https://github.com/openmrs/openmrs-esm-core/blob/master/packages/framework/esm-config/src/module-config/module-config.ts#L186)
440
+ [packages/framework/esm-config/src/module-config/module-config.ts:222](https://github.com/openmrs/openmrs-esm-core/blob/master/packages/framework/esm-config/src/module-config/module-config.ts#L222)
441
441
 
442
442
  ___
443
443
 
@@ -458,7 +458,7 @@ ___
458
458
 
459
459
  #### Defined in
460
460
 
461
- [packages/framework/esm-config/src/module-config/module-config.ts:143](https://github.com/openmrs/openmrs-esm-core/blob/master/packages/framework/esm-config/src/module-config/module-config.ts#L143)
461
+ [packages/framework/esm-config/src/module-config/module-config.ts:180](https://github.com/openmrs/openmrs-esm-core/blob/master/packages/framework/esm-config/src/module-config/module-config.ts#L180)
462
462
 
463
463
  ___
464
464
 
@@ -41,7 +41,7 @@ Object.constructor
41
41
 
42
42
  #### Defined in
43
43
 
44
- node_modules/typescript/lib/lib.es5.d.ts:122
44
+ node_modules/typescript/lib/lib.es5.d.ts:124
45
45
 
46
46
  ## Methods
47
47
 
@@ -67,7 +67,7 @@ Object.hasOwnProperty
67
67
 
68
68
  #### Defined in
69
69
 
70
- node_modules/typescript/lib/lib.es5.d.ts:137
70
+ node_modules/typescript/lib/lib.es5.d.ts:139
71
71
 
72
72
  ___
73
73
 
@@ -93,7 +93,7 @@ Object.isPrototypeOf
93
93
 
94
94
  #### Defined in
95
95
 
96
- node_modules/typescript/lib/lib.es5.d.ts:143
96
+ node_modules/typescript/lib/lib.es5.d.ts:145
97
97
 
98
98
  ___
99
99
 
@@ -119,7 +119,7 @@ Object.propertyIsEnumerable
119
119
 
120
120
  #### Defined in
121
121
 
122
- node_modules/typescript/lib/lib.es5.d.ts:149
122
+ node_modules/typescript/lib/lib.es5.d.ts:151
123
123
 
124
124
  ___
125
125
 
@@ -139,7 +139,7 @@ Object.toLocaleString
139
139
 
140
140
  #### Defined in
141
141
 
142
- node_modules/typescript/lib/lib.es5.d.ts:128
142
+ node_modules/typescript/lib/lib.es5.d.ts:130
143
143
 
144
144
  ___
145
145
 
@@ -159,7 +159,7 @@ Object.toString
159
159
 
160
160
  #### Defined in
161
161
 
162
- node_modules/typescript/lib/lib.es5.d.ts:125
162
+ node_modules/typescript/lib/lib.es5.d.ts:127
163
163
 
164
164
  ___
165
165
 
@@ -179,4 +179,4 @@ Object.valueOf
179
179
 
180
180
  #### Defined in
181
181
 
182
- node_modules/typescript/lib/lib.es5.d.ts:131
182
+ node_modules/typescript/lib/lib.es5.d.ts:133
@@ -41,7 +41,7 @@ Object.constructor
41
41
 
42
42
  #### Defined in
43
43
 
44
- node_modules/typescript/lib/lib.es5.d.ts:122
44
+ node_modules/typescript/lib/lib.es5.d.ts:124
45
45
 
46
46
  ## Methods
47
47
 
@@ -67,7 +67,7 @@ Object.hasOwnProperty
67
67
 
68
68
  #### Defined in
69
69
 
70
- node_modules/typescript/lib/lib.es5.d.ts:137
70
+ node_modules/typescript/lib/lib.es5.d.ts:139
71
71
 
72
72
  ___
73
73
 
@@ -93,7 +93,7 @@ Object.isPrototypeOf
93
93
 
94
94
  #### Defined in
95
95
 
96
- node_modules/typescript/lib/lib.es5.d.ts:143
96
+ node_modules/typescript/lib/lib.es5.d.ts:145
97
97
 
98
98
  ___
99
99
 
@@ -119,7 +119,7 @@ Object.propertyIsEnumerable
119
119
 
120
120
  #### Defined in
121
121
 
122
- node_modules/typescript/lib/lib.es5.d.ts:149
122
+ node_modules/typescript/lib/lib.es5.d.ts:151
123
123
 
124
124
  ___
125
125
 
@@ -139,7 +139,7 @@ Object.toLocaleString
139
139
 
140
140
  #### Defined in
141
141
 
142
- node_modules/typescript/lib/lib.es5.d.ts:128
142
+ node_modules/typescript/lib/lib.es5.d.ts:130
143
143
 
144
144
  ___
145
145
 
@@ -159,7 +159,7 @@ Object.toString
159
159
 
160
160
  #### Defined in
161
161
 
162
- node_modules/typescript/lib/lib.es5.d.ts:125
162
+ node_modules/typescript/lib/lib.es5.d.ts:127
163
163
 
164
164
  ___
165
165
 
@@ -179,4 +179,4 @@ Object.valueOf
179
179
 
180
180
  #### Defined in
181
181
 
182
- node_modules/typescript/lib/lib.es5.d.ts:131
182
+ node_modules/typescript/lib/lib.es5.d.ts:133
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmrs/esm-config",
3
- "version": "3.1.15-pre.680",
3
+ "version": "3.1.15-pre.693",
4
4
  "license": "MPL-2.0",
5
5
  "description": "A configuration library for the OpenMRS Single-Spa framework.",
6
6
  "browser": "dist/openmrs-esm-module-config.js",
@@ -10,7 +10,7 @@
10
10
  "document": "../../../document.sh esm-config",
11
11
  "test": "jest --config jest.config.js --passWithNoTests",
12
12
  "build": "webpack --mode=production",
13
- "analyze": "webpack --mode=production --env.analyze=true",
13
+ "analyze": "webpack --mode=production --env analyze=true",
14
14
  "typescript": "tsc",
15
15
  "lint": "eslint src --ext ts,tsx"
16
16
  },
@@ -46,12 +46,12 @@
46
46
  "systemjs": "6.x"
47
47
  },
48
48
  "devDependencies": {
49
- "@openmrs/esm-globals": "^3.1.15-pre.680",
50
- "@openmrs/esm-state": "^3.1.15-pre.680",
49
+ "@openmrs/esm-globals": "^3.1.15-pre.693",
50
+ "@openmrs/esm-state": "^3.1.15-pre.693",
51
51
  "@types/ramda": "^0.26.44",
52
52
  "@types/systemjs": "^6.1.0",
53
53
  "babel-plugin-ramda": "^2.0.0",
54
54
  "single-spa": "^5.9.2"
55
55
  },
56
- "gitHead": "95a95eb24777bba5f4c7bf5f3b0bbf82c59102ed"
56
+ "gitHead": "4348b79bf1c23aea131af938164ef9dbfd4e68d7"
57
57
  }
@@ -28,6 +28,7 @@ import {
28
28
  temporaryConfigStore,
29
29
  } from "./state";
30
30
  import type {} from "@openmrs/esm-globals";
31
+ import { TemporaryConfigStore } from "..";
31
32
 
32
33
  /**
33
34
  * Store setup
@@ -44,56 +45,86 @@ import type {} from "@openmrs/esm-globals";
44
45
  * This code sets up the subscriptions so that when an input store changes,
45
46
  * the correct set of output stores are updated.
46
47
  *
47
- * NB: You will notice that none of the `compute...` functions below explicitly
48
- * take `temporaryConfigStore` state as an input. They do make use of
49
- * `temporaryConfigStore`, however it is obtained in `getProvidedConfigs`.
50
- * It would probably be better to make the functions pure.
48
+ * All `compute...` functions except `computeExtensionConfigs` are pure
49
+ * (or are supposed to be). `computeExtensionConfigs` calls `getGlobalStore`,
50
+ * which creates stores.
51
51
  */
52
- computeModuleConfig(configInternalStore.getState());
53
- configInternalStore.subscribe(computeModuleConfig);
54
- temporaryConfigStore.subscribe(() =>
55
- computeModuleConfig(configInternalStore.getState())
52
+ computeModuleConfig(
53
+ configInternalStore.getState(),
54
+ temporaryConfigStore.getState()
55
+ );
56
+ configInternalStore.subscribe((configState) =>
57
+ computeModuleConfig(configState, temporaryConfigStore.getState())
58
+ );
59
+ temporaryConfigStore.subscribe((tempConfigState) =>
60
+ computeModuleConfig(configInternalStore.getState(), tempConfigState)
56
61
  );
57
62
 
58
- computeImplementerToolsConfig(configInternalStore.getState());
59
- configInternalStore.subscribe(computeImplementerToolsConfig);
60
- temporaryConfigStore.subscribe(() =>
61
- computeImplementerToolsConfig(configInternalStore.getState())
63
+ computeImplementerToolsConfig(
64
+ configInternalStore.getState(),
65
+ temporaryConfigStore.getState()
66
+ );
67
+ configInternalStore.subscribe((configState) =>
68
+ computeImplementerToolsConfig(configState, temporaryConfigStore.getState())
69
+ );
70
+ temporaryConfigStore.subscribe((tempConfigState) =>
71
+ computeImplementerToolsConfig(configInternalStore.getState(), tempConfigState)
62
72
  );
63
73
 
64
- computeExtensionSlotConfigs(configInternalStore.getState());
65
- configInternalStore.subscribe(computeExtensionSlotConfigs);
66
- temporaryConfigStore.subscribe(() =>
67
- computeExtensionSlotConfigs(configInternalStore.getState())
74
+ computeExtensionSlotConfigs(
75
+ configInternalStore.getState(),
76
+ temporaryConfigStore.getState()
77
+ );
78
+ configInternalStore.subscribe((configState) =>
79
+ computeExtensionSlotConfigs(configState, temporaryConfigStore.getState())
80
+ );
81
+ temporaryConfigStore.subscribe((tempConfigState) =>
82
+ computeExtensionSlotConfigs(configInternalStore.getState(), tempConfigState)
68
83
  );
69
84
 
70
85
  computeExtensionConfigs(
71
86
  configInternalStore.getState(),
72
- configExtensionStore.getState()
87
+ configExtensionStore.getState(),
88
+ temporaryConfigStore.getState()
73
89
  );
74
90
  configInternalStore.subscribe((configState) =>
75
- computeExtensionConfigs(configState, configExtensionStore.getState())
91
+ computeExtensionConfigs(
92
+ configState,
93
+ configExtensionStore.getState(),
94
+ temporaryConfigStore.getState()
95
+ )
76
96
  );
77
97
  configExtensionStore.subscribe((extensionState) =>
78
- computeExtensionConfigs(configInternalStore.getState(), extensionState)
98
+ computeExtensionConfigs(
99
+ configInternalStore.getState(),
100
+ extensionState,
101
+ temporaryConfigStore.getState()
102
+ )
79
103
  );
80
- temporaryConfigStore.subscribe(() =>
104
+ temporaryConfigStore.subscribe((tempConfigState) =>
81
105
  computeExtensionConfigs(
82
106
  configInternalStore.getState(),
83
- configExtensionStore.getState()
107
+ configExtensionStore.getState(),
108
+ tempConfigState
84
109
  )
85
110
  );
86
111
 
87
- function computeModuleConfig(state: ConfigInternalStore) {
112
+ function computeModuleConfig(
113
+ state: ConfigInternalStore,
114
+ tempState: TemporaryConfigStore
115
+ ) {
88
116
  for (let moduleName of Object.keys(state.schemas)) {
89
- const config = getConfigForModule(moduleName);
117
+ const config = getConfigForModule(moduleName, state, tempState);
90
118
  const moduleStore = getConfigStore(moduleName);
91
119
  moduleStore.setState({ loaded: true, config });
92
120
  }
93
121
  }
94
122
 
95
- function computeExtensionSlotConfigs(state: ConfigInternalStore) {
96
- const slotConfigsByModule = getExtensionSlotConfigs();
123
+ function computeExtensionSlotConfigs(
124
+ state: ConfigInternalStore,
125
+ tempState: TemporaryConfigStore
126
+ ) {
127
+ const slotConfigsByModule = getExtensionSlotConfigs(state, tempState);
97
128
  for (let [moduleName, extensionSlotConfigs] of Object.entries(
98
129
  slotConfigsByModule
99
130
  )) {
@@ -102,14 +133,18 @@ function computeExtensionSlotConfigs(state: ConfigInternalStore) {
102
133
  }
103
134
  }
104
135
 
105
- function computeImplementerToolsConfig(state: ConfigInternalStore) {
106
- const config = getImplementerToolsConfig();
136
+ function computeImplementerToolsConfig(
137
+ state: ConfigInternalStore,
138
+ tempConfigState: TemporaryConfigStore
139
+ ) {
140
+ const config = getImplementerToolsConfig(state, tempConfigState);
107
141
  implementerToolsConfigStore.setState({ config });
108
142
  }
109
143
 
110
144
  function computeExtensionConfigs(
111
145
  configState: ConfigInternalStore,
112
- extensionState: ConfigExtensionStore
146
+ extensionState: ConfigExtensionStore,
147
+ tempConfigState: TemporaryConfigStore
113
148
  ) {
114
149
  for (let extension of extensionState.mountedExtensions) {
115
150
  const extensionStore = getExtensionConfigStore(
@@ -121,7 +156,9 @@ function computeExtensionConfigs(
121
156
  extension.slotModuleName,
122
157
  extension.extensionModuleName,
123
158
  extension.slotName,
124
- extension.extensionId
159
+ extension.extensionId,
160
+ configState,
161
+ tempConfigState
125
162
  );
126
163
  extensionStore.setState({ loaded: true, config });
127
164
  }
@@ -148,9 +185,8 @@ export function provide(config: Config, sourceName = "provided") {
148
185
  }
149
186
 
150
187
  /**
151
- * A promise-based way to access the config as soon as it is fully loaded
152
- * from the import-map. If it is already loaded, resolves the config in its
153
- * present state.
188
+ * A promise-based way to access the config as soon as it is fully loaded.
189
+ * If it is already loaded, resolves the config in its present state.
154
190
  *
155
191
  * In general you should use the Unistore-based API provided by
156
192
  * `getConfigStore`, which allows creating a subscription so that you always
@@ -186,10 +222,11 @@ export function getConfig(moduleName: string): Promise<Config> {
186
222
  export function processConfig(
187
223
  schema: ConfigSchema,
188
224
  providedConfig: ConfigObject,
189
- keyPathContext: string
225
+ keyPathContext: string,
226
+ devDefaultsAreOn: boolean = false
190
227
  ) {
191
228
  validateConfig(schema, providedConfig, keyPathContext);
192
- const config = setDefaults(schema, providedConfig);
229
+ const config = setDefaults(schema, providedConfig, devDefaultsAreOn);
193
230
  return config;
194
231
  }
195
232
 
@@ -214,32 +251,38 @@ function getExtensionConfig(
214
251
  slotModuleName: string,
215
252
  extensionModuleName: string,
216
253
  slotName: string,
217
- extensionId: string
254
+ extensionId: string,
255
+ configState: ConfigInternalStore,
256
+ tempConfigState: TemporaryConfigStore
218
257
  ) {
219
- const slotModuleConfig = mergeConfigsFor(
220
- slotModuleName,
221
- getProvidedConfigs()
222
- );
258
+ const providedConfigs = getProvidedConfigs(configState, tempConfigState);
259
+ const slotModuleConfig = mergeConfigsFor(slotModuleName, providedConfigs);
223
260
  const configOverride =
224
261
  slotModuleConfig?.extensions?.[slotName]?.configure?.[extensionId] ?? {};
225
262
  const extensionModuleConfig = mergeConfigsFor(
226
263
  extensionModuleName,
227
- getProvidedConfigs()
264
+ providedConfigs
228
265
  );
229
266
  const extensionConfig = mergeConfigs([extensionModuleConfig, configOverride]);
230
- const schema = configInternalStore.getState().schemas[extensionModuleName]; // TODO: validate that a schema exists for the module
267
+ const schema = configState.schemas[extensionModuleName]; // TODO: validate that a schema exists for the module
231
268
  validateConfig(schema, extensionConfig, extensionModuleName);
232
- const config = setDefaults(schema, extensionConfig);
269
+ const config = setDefaults(
270
+ schema,
271
+ extensionConfig,
272
+ configState.devDefaultsAreOn
273
+ );
233
274
  delete config.extensions;
234
275
  return config;
235
276
  }
236
277
 
237
- function getImplementerToolsConfig(): Record<string, Config> {
238
- const state = configInternalStore.getState();
239
- let result = getSchemaWithValuesAndSources(clone(state.schemas));
278
+ function getImplementerToolsConfig(
279
+ configState: ConfigInternalStore,
280
+ tempConfigState: TemporaryConfigStore
281
+ ): Record<string, Config> {
282
+ let result = getSchemaWithValuesAndSources(clone(configState.schemas));
240
283
  const configsAndSources = [
241
- ...state.providedConfigs.map((c) => [c.config, c.source]),
242
- [temporaryConfigStore.getState().config, "temporary config"],
284
+ ...configState.providedConfigs.map((c) => [c.config, c.source]),
285
+ [tempConfigState.config, "temporary config"],
243
286
  ] as Array<[Config, string]>;
244
287
  for (let [config, source] of configsAndSources) {
245
288
  result = mergeConfigs([result, createValuesAndSourcesTree(config, source)]);
@@ -272,11 +315,13 @@ function createValuesAndSourcesTree(config: ConfigObject, source: string) {
272
315
  }
273
316
  }
274
317
 
275
- function getExtensionSlotConfigs(): Record<
276
- string,
277
- Record<string, ExtensionSlotConfigObject>
278
- > {
279
- const allConfigs = mergeConfigs(getProvidedConfigs());
318
+ function getExtensionSlotConfigs(
319
+ configState: ConfigInternalStore,
320
+ tempConfigState: TemporaryConfigStore
321
+ ): Record<string, Record<string, ExtensionSlotConfigObject>> {
322
+ const allConfigs = mergeConfigs(
323
+ getProvidedConfigs(configState, tempConfigState)
324
+ );
280
325
  const slotConfigPerModule: Record<
281
326
  string,
282
327
  Record<string, ExtensionSlotConfig>
@@ -359,11 +404,13 @@ function validateExtensionSlotConfig(
359
404
  }
360
405
  }
361
406
 
362
- function getProvidedConfigs(): Array<Config> {
363
- const state = configInternalStore.getState();
407
+ function getProvidedConfigs(
408
+ configState: ConfigInternalStore,
409
+ tempConfigState: TemporaryConfigStore
410
+ ): Array<Config> {
364
411
  return [
365
- ...state.providedConfigs.map((c) => c.config),
366
- temporaryConfigStore.getState().config,
412
+ ...configState.providedConfigs.map((c) => c.config),
413
+ tempConfigState.config,
367
414
  ];
368
415
  }
369
416
 
@@ -445,16 +492,22 @@ function validateConfigSchema(
445
492
  }
446
493
  }
447
494
 
448
- function getConfigForModule(moduleName: string): ConfigObject {
449
- const state = configInternalStore.getState();
450
- if (!state.schemas.hasOwnProperty(moduleName)) {
495
+ function getConfigForModule(
496
+ moduleName: string,
497
+ configState: ConfigInternalStore,
498
+ tempConfigState: TemporaryConfigStore
499
+ ): ConfigObject {
500
+ if (!configState.schemas.hasOwnProperty(moduleName)) {
451
501
  throw Error("No config schema has been defined for " + moduleName);
452
502
  }
453
503
 
454
- const schema = state.schemas[moduleName];
455
- const inputConfig = mergeConfigsFor(moduleName, getProvidedConfigs());
504
+ const schema = configState.schemas[moduleName];
505
+ const inputConfig = mergeConfigsFor(
506
+ moduleName,
507
+ getProvidedConfigs(configState, tempConfigState)
508
+ );
456
509
  validateConfig(schema, inputConfig, moduleName);
457
- const config = setDefaults(schema, inputConfig);
510
+ const config = setDefaults(schema, inputConfig, configState.devDefaultsAreOn);
458
511
  delete config.extensions;
459
512
  return config;
460
513
  }
@@ -593,9 +646,12 @@ function runValidators(
593
646
  }
594
647
 
595
648
  // Recursively fill in the config with values from the schema.
596
- const setDefaults = (schema: ConfigSchema, inputConfig: Config) => {
649
+ const setDefaults = (
650
+ schema: ConfigSchema,
651
+ inputConfig: Config,
652
+ devDefaultsAreOn: boolean
653
+ ) => {
597
654
  const config = clone(inputConfig);
598
- const devDefaultsAreOn = configInternalStore.getState().devDefaultsAreOn;
599
655
 
600
656
  if (!schema) {
601
657
  return config;
@@ -627,14 +683,15 @@ const setDefaults = (schema: ConfigSchema, inputConfig: Config) => {
627
683
  if (configPart && hasObjectSchema(elements)) {
628
684
  if (schemaPart._type === Type.Array) {
629
685
  const configWithDefaults = configPart.map((conf: Config) =>
630
- setDefaults(elements, conf)
686
+ setDefaults(elements, conf, devDefaultsAreOn)
631
687
  );
632
688
  config[key] = configWithDefaults;
633
689
  } else if (schemaPart._type === Type.Object) {
634
690
  for (let objectKey of Object.keys(configPart)) {
635
691
  configPart[objectKey] = setDefaults(
636
692
  elements,
637
- configPart[objectKey]
693
+ configPart[objectKey],
694
+ devDefaultsAreOn
638
695
  );
639
696
  }
640
697
  }
@@ -646,7 +703,11 @@ const setDefaults = (schema: ConfigSchema, inputConfig: Config) => {
646
703
  const selectedConfigPart = config.hasOwnProperty(key) ? configPart : {};
647
704
 
648
705
  if (isOrdinaryObject(selectedConfigPart)) {
649
- config[key] = setDefaults(schemaPart, selectedConfigPart);
706
+ config[key] = setDefaults(
707
+ schemaPart,
708
+ selectedConfigPart,
709
+ devDefaultsAreOn
710
+ );
650
711
  }
651
712
  }
652
713
  }