@osaedasia/oresume
Version:
A user-friendly library for generating complete Single Page Applications (SPAs)
2 lines (1 loc) • 1.83 kB
JavaScript
import{Observable as e}from"../infrastructure/observer/Observable.js";import{UrlHash as r}from"@osaedasia/std";import{InvalidUrlParameterError as a}from"../domain/exceptions/Url.js";class t{_parameters;_parameterEntries;_parametersProxy;_observableCache;_writeParamToURL;constructor(e,r){this._observableCache={},this._parameterEntries=Object.entries(e),this._parameters=this._initializeParams(),this._parametersProxy=this._createParamsProxy(),this._writeParamToURL=r??!0}get params(){return this._parametersProxy}initializeSearchParams=()=>{this._parameterEntries.forEach((([e,a])=>{const t=this._getSearchParamValue(e);this._writeParamToURL&&a.required&&r.setParam(e,String(t)),this._getOrCreateObservable(e).state=t}))};_initializeParams(){return this._parameterEntries.reduce(((e,[r,a])=>({...e,[r]:this._normalizeParameterDefinition(a)})),{})}_createParamsProxy(){return new Proxy({},{get:(e,r)=>this._getOrCreateObservable(r)})}_normalizeParameterDefinition(e){return{defaultValue:e.defaultValue,required:e.required??!1,validator:e.validator??(()=>!0)}}_validateParamNameExists(e){if(void 0===this._parameters[e])throw new a(`Invalid URL parameter name: ${e}`);return!0}_getOrCreateObservable(a){if(this._observableCache[a])return this._observableCache[a];const t=this._getSearchParamValue(a),i=new e(t);return this._writeParamToURL&&i.subscribe((e=>{r.setParam(a,String(e))})),this._observableCache[a]=i,i}_getSearchParamValue(e){this._validateParamNameExists(e);const a=this._parameters[e];if(!this._writeParamToURL)return a.defaultValue;const t=r.getParam(e),i=this._parseUrlValue(t,a.defaultValue);return null!==i&&a.validator(i)?i:a.defaultValue}_parseUrlValue(e,r){if(null===e)return null;if("number"==typeof r){const r=Number(e);return isNaN(r)?null:r}return"string"==typeof r?e:null}}export{t as URLHashSearchParams};