peryl 1.4.49 → 1.4.50
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.
- package/dist/hash.d.ts +2 -2
- package/dist/hash.js +7 -7
- package/dist/hash.js.map +1 -1
- package/dist/umd/hash.js +1 -1
- package/dist/umd/hash.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +1 -1
- package/src/hash.ts +9 -9
package/dist/umd/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///./src/hsml.ts","webpack:///external \"IncrementalDOM\"","webpack:///./src/hsml-idom.ts","webpack:///./src/validators.ts","webpack:///./src/events.ts","webpack:///./src/hsml-html.ts","webpack:///./src/debounce.ts","webpack:///./src/dom.ts","webpack:///./src/encode.ts","webpack:///./src/form.ts","webpack:///./src/hash.ts","webpack:///./src/history.ts","webpack:///./src/hsml-app.ts","webpack:///./src/hsml-dom.ts","webpack:///./src/hsml-h.ts","webpack:///./src/hsml-svac-ctrl.ts","webpack:///./src/hsml-svac-html.ts","webpack:///./src/hsml-widget.ts","webpack:///./src/http.ts","webpack:///./src/load.ts","webpack:///./src/objpaths.ts","webpack:///./src/router.ts","webpack:///./src/settings.ts","webpack:///./src/signal.ts","webpack:///./src/template.ts","webpack:///./src/tmpl.ts","webpack:///./src/index.ts"],"names":["root","factory","exports","module","require","define","amd","a","i","window","__WEBPACK_EXTERNAL_MODULE__1__","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","NBSP","hsml","hml","handler","ctx","constructor","Array","hmlTag","console","error","head","attrsObj","hasAttrs","hFnc","hObj","children","htc","Function","String","Boolean","Number","Date","refSplit","split","ref","dotSplit","hashSplit","tag","id","classes","slice","attrs","_id","length","_classes","_ref","_hObj","skip","open","fnc","forEach","jml","close","hsmlTag","text","toLocaleString","toString","ds","obj","hsmls","sep","reduce","push","splice","HsmlIDomHandler","props","attrClasses","concat","map","undefined","filter","attrData","JSON","stringify","attrOn","e","actionCb","attr","unshift","join","idom","elementOpen","_key","_skip","refs","currentElement","mount","elementClose","toHsml","this","hsml2idom","node","hsmlEl","patch","data","hsmlFr","hmls","hsmls2idom","emailRegex","phoneRgex","pscRgex","rodneCisloRgex","Validator","opts","msgs","str","err","v","sto","strToObj","objCheck","format","ots","objToStr","tpl","tmpl","keys","k","replace","RegExp","super","required","options","indexOf","invalid_option","option","min","max","regexp","test","invalid_format","not_in_range","isNaN","strict","num","toFixed","decimals","dateToLocaleString","date","dateToLocaleDateString","toLocaleDateString","dateToIsoString","toISOString","dateToIsoDateString","toDateString","iso","dateToStr","dateOnly","getFullYear","getMonth","getDate","dt","parse","getTime","b","invalid_value","validators","field","validator","res","validate","valid","_cb","_cbs","_ctx","ev","cb","wrap","evt","off","on","HsmlHtmlHandler","onHtml","pretty","indent","_depth","_onHtml","_pretty","_indent","attrStyles","style","toLowerCase","type","args","escapeHtml","html","_mkIndent","_pairTags","render","pairTag","count","hsml2html","hsmls2html","htmls","escapeHtmlRegExp","exec","esc","escHtml","idx","lastIdx","index","charCodeAt","substring","debounce","func","delay","timeout","clearTimeout","setTimeout","apply","target","propertyKey","descriptor","method","selector","element","qsa","document","querySelectorAll","querySelector","elements","appendChild","oldElement","newElement","parentElement","replaceChild","removeChild","firstChild","trim","wrapMap","legend","area","param","thead","tr","col","td","body","_default","optgroup","tbody","tfoot","colgroup","caption","th","match","el","createElement","innerHTML","attributes","setAttribute","j","lastChild","Element","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","ownerDocument","item","event","listener","useCapture","addEventListener","srcElement","removeEventListener","prefix","params","size","valueLength","val","arguments","callee","encodeURIComponent","paramsLength","parameter","decodeURIComponent","path","Base64","u","f","_utf8_encode","_keyStr","charAt","fromCharCode","_utf8_decode","c1","c2","_element","getElementById","_onChange","locale","_validator","callback","_decimals","_dragSensitivity","setDecimals","step","onMouseWheel","cursor","initialY","pageY","getValue","onMouseMove","diffY","newValue","setValue","onMouseUp","checked","remove","opt","add","_elements","files","_formEntries","onsubmit","preventDefault","_onSubmit","entry","entries","getName","errors","values","submit","hashJsonEncoder","hashJsonDecoder","hashUrlEncoder","hashUrlDecoder","dpath","dquery","query","append","URLSearchParams","pathStr","queryStr","emitWritten","_encode","_decode","_emitWritten","encode","decode","read","onhashchange","written","_writtenDataJson","alert","location","hash","encodeURI","history","back","forward","delta","go","state","title","url","pushState","replaceState","log","HAppAction","schedule","requestAnimationFrame","unschedule","cancelAnimationFrame","handle","HApp","view","dispatcher","dispatch","debug","t0","performance","now","update","t1","action","nodeName","els","formInputData","names","formData","app","umount","dom","updateDom","_onUpdate","_mount","_umount","hasAttribute","removeAttribute","aNodes","_updateSched","onUpdate","toHtml","outerHTML","_init","then","hsmls2idomPatch","iel","sel","multiple","from","selectedOptions","tel","bel","HsmlDomHandler","dataset","classList","_current","createTextNode","hsml2dom","elems","second","third","result","isArray","component","ctrl","HCtrl","extAction","_count","appAction","appActions","_extAction","_actions","innerText","_ctrls","cNodes","actions","notifications","nodesDeleted","nodes","nodeType","actionHtml","mountHtml","hsmls2htmls","HWidget","w","widget","mounted","onMount","onUmount","wNodes","propertyIsEnumerable","encodeUrlQuery","key_value_pairs","pair","substr","HttpResponse","xhr","_xhr","getAllResponseHeaders","header","getResponseHeader","response","responseType","getHeader","responseText","responseXML","authBasic","login","password","req","headers","btoa","HttpRequest","_method","_headers","_async","_noCache","xhrs","x","abort","_url","_query","middleware","_timeout","_responseType","onProgress","_onProgress","onResponse","_onResponse","onError","_onError","async","noCache","contentType","_send","Promise","rej","XMLHttpRequest","onprogress","loaded","total","lengthComputable","upload","setRequestHeader","ontimeout","onabort","onerror","payload","send","onload","status","respone","onreadystatechange","readyState","FormData","Blob","post","put","del","onRequest","http","delete","script","charset","src","completed","getElementsByTagName","namespace","lib","urls","reverse","callbackTmp","img","Image","link","rel","href","objValuePaths","valPaths","paths","Emitter","_callbacks","fn","callbacks","Route","_params","_pathParse","_regex","sensitive","_","slash","capture","optional","Router","_routes","_onHashChange","attachEvent","default","route","force","navigate","start","emit","events","Events","_slots","_emit","onConnect","_onConnect","onDisconnect","_onDisconnect","slot","templateOrId","template","re","strings","lastIndex","template_cache","form","hsmlapp","hsmldom","hsmlh","hsmlhtml","hsmlidom","hsmlsvacctrl","hsmlsvachtml","hsmlsvac","hsmlwidget","load","objpaths","router","settings","signal"],"mappings":"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","file":"index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"IncrementalDOM\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"IncrementalDOM\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"IncrementalDOM\")) : factory(root[\"IncrementalDOM\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__1__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 30);\n","\nexport type HHead = keyof HTMLElementTagNameMap | string; // \"tag#id.class1.class2~handler\"\n\nexport type HAttrClasses = Array<string | [string, boolean]>;\n\nexport type HAttrStyles = { [key: string]: string };\n\nexport type HAttrData = {\n [key: string]:\n | string\n | String\n | number\n | Number\n | boolean\n | Boolean\n | Date\n | Array<any>\n | Object;\n};\n\nexport type HAttrOnAction = string;\n\nexport type HAttrOnDataFnc = (e: Event) => any;\n\nexport type HAttrOnData =\n | string\n | String\n | number\n | Number\n | boolean\n | Boolean\n | Date\n | Array<any>\n | Object\n | HAttrOnDataFnc\n | null;\n\nexport type HAttrOnCb = [keyof HTMLElementEventMap, EventListener];\n\nexport type HAttrOnAct = [\n keyof HTMLElementEventMap,\n HAttrOnAction,\n HAttrOnData?\n];\n\nexport type HAttrOn = HAttrOnCb | HAttrOnAct | Array<HAttrOnCb | HAttrOnAct>;\n\nexport interface HAttrs {\n readonly _id?: string;\n readonly _classes?: string[];\n readonly _ref?: string;\n readonly _key?: string;\n readonly _skip?: boolean;\n readonly _hObj?: HObj;\n readonly classes?: HAttrClasses;\n readonly styles?: HAttrStyles;\n readonly data?: HAttrData;\n readonly on?: HAttrOn;\n readonly [key: string]:\n | string\n | String\n | string[]\n | String[]\n | number\n | Number\n | boolean\n | Boolean\n | Date\n | HAttrClasses\n | HAttrStyles\n // | HsmlAttrData\n | HAttrOn\n | EventListener\n | HObj\n | undefined;\n}\n\nexport type HFnc = (e: Element) => boolean | void;\n\nexport interface HObj {\n toHsml?(): HElement;\n}\n\nexport interface HElements extends Array<HElement> {}\n\nexport type HChildren =\n | HElements\n | HFnc\n | HObj\n | string\n | String\n | boolean\n | Boolean\n | number\n | Number\n | Date\n | undefined\n | null;\n\nexport type HTagNoAttr = [HHead, HChildren?];\nexport type HTagAttr = [HHead, HAttrs, HChildren?];\n\nexport type HTag = HTagNoAttr | HTagAttr;\n\nexport type HElement =\n | HFnc\n | HObj\n | HTag\n | string\n | String\n | boolean\n | Boolean\n | number\n | Number\n | Date\n | undefined\n | null;\n\nexport interface HHandlerCtx extends HObj {\n refs: { [name: string]: Element };\n actionCb(action: HAttrOnAction, data: HAttrOnData, e: Event): void;\n}\n\nexport interface HHandler<C extends HHandlerCtx> {\n open(tag: HHead, attrs: HAttrs, children: HElements, ctx?: C): boolean;\n close(tag: HHead, children: HElements, ctx?: C): void;\n text(text: string, ctx?: C): void;\n fnc(fnc: HFnc, ctx?: C): void;\n obj(obj: HObj, ctx?: C): void;\n}\n\nexport const NBSP = \"\\u00a0 \";\n\nexport function hsml<C extends HHandlerCtx>(hml: HElement,\n handler: HHandler<C>,\n ctx?: C): void {\n // console.log(\"hsml\", hsml);\n if (hml === undefined || hml === null) {\n return;\n }\n switch (hml.constructor) {\n case Array:\n // const tag = hml as HTag;\n // if (\n // (\n // tag.length === 1 &&\n // tag[0].constructor === String\n // ) ||\n // (\n // tag.length === 2 &&\n // (\n // tag[0].constructor === String &&\n // (tag[1]!.constructor === Array || tag[1]!.constructor === Function)\n // ) ||\n // (\n // tag[0].constructor === String &&\n // tag[1]!.constructor === Object\n // )\n // ) ||\n // (\n // tag.length === 3 &&\n // tag[0].constructor === String &&\n // tag[1].constructor === Object &&\n // tag[2]!.constructor === Array\n // )\n // ) {\n // hsmlTag(hml as HTag, handler, ctx);\n // } else {\n // console.error(\"hsml parse error:\", hml);\n // // console.error(\"hsml parse error:\", JSON.stringify(hml, null, 4));\n // // throw Error(`hsml parse error: ${JSON.stringify(hml)}`);\n // }\n hsmlTag(hml as HTag, handler, ctx);\n break;\n case Function:\n handler.fnc(hml as HFnc, ctx);\n break;\n case String:\n handler.text(hml as string, ctx);\n break;\n case Boolean:\n handler.text(\"\" + hml, ctx);\n break;\n case Number:\n const n = hml as number;\n const ns = n.toLocaleString ? n.toLocaleString() : n.toString();\n handler.text(ns, ctx);\n break;\n case Date:\n const d = hml as Date;\n const ds = d.toLocaleString ? d.toLocaleString() : d.toString();\n handler.text(ds, ctx);\n break;\n default: // HObj\n handler.obj(hml as HObj, ctx);\n }\n\n function hsmlTag(hmlTag: HTag, handler: HHandler<C>, ctx?: C): void {\n // console.log(\"hsml tag\", hmlTag);\n\n if (typeof hmlTag[0] !== \"string\") {\n console.error(\"HSML tag head not string:\", hmlTag);\n return;\n }\n\n const head = hmlTag[0] as HHead;\n const attrsObj = hmlTag[1] as any;\n const hasAttrs = attrsObj && attrsObj.constructor === Object;\n const childIdx = hasAttrs ? 2 : 1;\n\n let children: HElements = [];\n let hFnc: HFnc | undefined;\n let hObj: HObj | undefined;\n\n const htc = hmlTag[childIdx];\n switch (htc != null && htc.constructor) { // switch ((typeof htc !== \"undefined\" || htc !== null) && htc.constructor) {\n case Array:\n children = htc as HElements;\n break;\n case Function:\n hFnc = htc as HFnc;\n break;\n case String:\n case Boolean:\n case Number:\n case Date:\n children = [htc as string | boolean | number | Date];\n break;\n default: // HObj\n hObj = htc as HObj;\n break;\n }\n\n const refSplit = head.split(\"~\");\n const ref = refSplit[1];\n const dotSplit = refSplit[0].split(\".\");\n const hashSplit = dotSplit[0].split(\"#\");\n const tag = hashSplit[0] || \"div\";\n const id = hashSplit[1];\n const classes = dotSplit.slice(1);\n\n let attrs: HAttrs;\n if (hasAttrs) {\n attrs = attrsObj as HAttrs;\n } else {\n attrs = {} as HAttrs;\n }\n\n if (id) {\n (attrs as any)._id = id;\n }\n if (classes.length) {\n (attrs as any)._classes = classes;\n }\n if (ref) {\n (attrs as any)._ref = ref;\n }\n if (hObj) {\n (attrs as any)._hObj = hObj;\n }\n\n const skip = handler.open(tag, attrs, children, ctx);\n\n if (hFnc) {\n handler.fnc(hFnc, ctx);\n }\n\n if (!skip) {\n children.forEach(jml => hsml(jml, handler, ctx));\n }\n\n handler.close(tag, children, ctx);\n }\n}\n\nexport function hjoin(hsmls: HElements, sep: string | HElement): HElements {\n const r = hsmls.reduce<HElements>(\n (p, c) => (p.push(c, sep), p),\n [] as HElements\n );\n r.splice(-1);\n return r;\n}\n\n// Test\n\n// const hsmls: Hsmls = [\n// \"text\",\n// [\"tag\", [\n// \"d\",\n// [\"\"]\n// ]],\n// [\"taga\", { attr: \"attr\", classes: [\"class\"] }, [\n// \"text\",\n// 123,\n// true\n// ]]\n// ];\n\n// const hml: Hsml = [\"xxx\", {}, [\n// \"types\", \" \", 1235.456, \" \", new Date(), \" \",\n// ...hsmls,\n// [\"t\", [\"t\", \"a\", \"\"]],\n// [\"t\", {}, [\"t\", \"a\", \"\"]],\n// [\"t\"]\n// ]];\n\n// console.log(hsmls, hml);\n\n// const hml1: Hsml = [\"div\", null, [\n// [\"span\", null, [\n// [\"a\",\n// {\n// href: \"https://gitlab.com/peter-rybar/diasheet\",\n// title: \"GitLab\",\n// target: \"_blank\"\n// },\n// [[\"i.fa.fa-gitlab\"]]\n// ]\n// ]],\n// [\"span\"]\n// ]];\n// console.log(hml1);\n\n// const hml2: Hsml = [\"div\", [\n// [\"h2\", [\"title\"]],\n// [\"div.w3-card-12\", [\n// [\"header.w3-container w3-light-grey\", [\n// [\"h3\", [\"Account: \", \"User\"]]\n// ]],\n// [\"div.w3-container.w3-light-grey\", [\n// [\"p\", [\"Balance: 4 DCT\"]],\n// [\"br\"]\n// ]],\n// [\"h4\", [\"Your account spending\"]],\n// [\"div#piechart\"],\n// [\"h4\", [\"Your account balance\"]],\n// [\"div#linechart\"],\n// [\"button.w3-button.w3-block.w3-dark-grey\", [\"Refresh\"]]\n// ]],\n// [\"br\"]\n// ]];\n// console.log(hml2);\n\n// TEST\n\n// import { hsmls2htmls } from \"./hsml-html\";\n// import { HDispatch } from \"./hsml-app\";\n\n// const dispatch: HDispatch = (type: string, data?: any, event?: Event): void => {\n// console.log(\"action:\", type, data, event);\n// };\n\n// const data = { attr: \"action-data\" };\n\n// const hmls: HElements = [\n// [\"button\", { on: [\"click\", \"action\", data] }, \"send\"],\n// [\"h1\", \"aaa\"],\n// [\"input\",\n// {\n// type: \"text\",\n// on: [\n// [\"mouseover\", \"hover-action\", data],\n// [\"change\", \"click-action\", e => (e.target as HTMLInputElement).value],\n// [\"click\", e => dispatch(\"action\", data, e)],\n// ],\n// click: e => dispatch(\"action\", data, e)\n// }\n// ],\n// [\"button\",\n// {\n// on: [\"click\", e => dispatch(\"action\", data, e)],\n// click: e => dispatch(\"action\", data, e)\n// },\n// [\"Send\"]\n// ]\n// ];\n\n// console.log(hsmls2htmls(hmls, true).join(\"\"));\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1__;","import {\n hsml,\n HElement,\n HElements,\n HHead,\n HAttrs,\n HAttrClasses,\n HAttrData,\n HAttrStyles,\n HAttrOn,\n HAttrOnCb,\n HAttrOnAct,\n HAttrOnAction,\n HAttrOnData,\n HFnc,\n HObj,\n HHandler,\n HHandlerCtx\n} from \"./hsml\";\nimport * as idom from \"incremental-dom\";\n\n// function setBoolAttrProp(el: any, attr: string, value: any) {\n// // console.log(\"idom.attributes\", attr, value, typeof value, el);\n// if (typeof value === \"string\") {\n// let b;\n// switch (value) {\n// case \"true\":\n// case \"1\":\n// case \"on\":\n// case \"yes\":\n// b = true;\n// break;\n// default:\n// b = false;\n// }\n// if (b) {\n// el.setAttribute(attr, value);\n// } else {\n// el.removeAttribute(attr);\n// }\n// el[attr] = b;\n// } else if (typeof value === \"boolean\") {\n// if (value) {\n// el.setAttribute(attr, \"\");\n// } else {\n// el.removeAttribute(attr);\n// }\n// el[attr] = value;\n// } else {\n// if (value) {\n// el.setAttribute(attr, value ? value : \"\");\n// } else {\n// el.removeAttribute(attr);\n// }\n// }\n// }\n\n// const boolAttrProps = [\n// \"readonly\",\n// \"disabled\",\n// \"checked\",\n// \"value\"\n// ];\n\n// boolAttrProps.forEach(a => idom.attributes[a] = setBoolAttrProp);\n\nclass HsmlIDomHandler implements HHandler<HHandlerCtx> {\n\n open(tag: HHead, attrs: HAttrs, children: HElements, ctx?: HHandlerCtx): boolean {\n const props: any[] = [];\n let id = attrs._id;\n let classes: string[] = attrs._classes ? attrs._classes : [];\n let ref = attrs._ref;\n let hObj: any = attrs._hObj;\n for (const a in attrs) {\n if (attrs.hasOwnProperty(a)) {\n switch (a) {\n case \"_id\":\n case \"_classes\":\n case \"_ref\":\n case \"_key\":\n case \"_skip\":\n case \"_hObj\":\n break;\n case \"id\":\n id = attrs[a] as string;\n break;\n case \"classes\":\n const attrClasses = attrs[a] as HAttrClasses;\n classes = classes.concat(attrClasses\n ? attrClasses\n .map(c =>\n c.constructor === String\n ? c as string\n : (c[1] ? c[0] as string : undefined))\n .filter((c): c is string => c !== undefined)\n : [] as string[]);\n break;\n case \"class\":\n classes = classes.concat((attrs[a] as string).split(\" \"));\n break;\n case \"data\":\n const attrData = attrs[a] as HAttrData;\n for (const d in attrData) {\n if (attrData.hasOwnProperty(d)) {\n if (attrData[d].constructor === String) {\n props.push(\"data-\" + d, attrData[d]);\n } else {\n props.push(\"data-\" + d, JSON.stringify(attrData[d]));\n }\n }\n }\n break;\n case \"styles\":\n props.push(\"style\", attrs[a] as HAttrStyles);\n break;\n case \"on\":\n const attrOn = attrs[a] as HAttrOn;\n if (typeof attrOn[0] === \"string\") {\n if (typeof attrOn[1] === \"function\") {\n props.push(\"on\" + attrOn[0], attrOn[1]);\n } else {\n props.push(\"on\" + attrOn[0], (e: Event) => {\n ctx && ctx.actionCb &&\n typeof ctx.actionCb === \"function\" &&\n ctx.actionCb(attrOn[1] as HAttrOnAction,\n attrOn[2] as HAttrOnData,\n e);\n });\n }\n } else {\n (attrOn as Array<HAttrOnCb | HAttrOnAct>)\n .forEach(attr => {\n if (typeof attr[1] === \"function\") {\n props.push(\"on\" + attr[0], attr[1]);\n } else {\n props.push(\"on\" + attr[0], (e: Event) => {\n ctx && ctx.actionCb &&\n typeof ctx.actionCb === \"function\" &&\n ctx.actionCb(attr[1] as HAttrOnAction,\n attr[2] as HAttrOnData,\n e);\n });\n }\n });\n }\n break;\n default:\n // http://google.github.io/incremental-dom/#attributes-and-properties\n switch (typeof attrs[a]) {\n case \"function\":\n props.push(\"on\" + a, attrs[a]);\n break;\n case \"object\":\n // console.log(\"---\", a, typeof attrs[a], attrs[a]);\n // console.log(\"---String \", attrs[a] instanceof String);\n // console.log(\"---Boolean\", attrs[a] instanceof Boolean);\n // console.log(\"---Number \", attrs[a] instanceof Number);\n props.push(a, attrs[a]);\n break;\n // case \"boolean\":\n // if (boolAttrProps.includes(a)) {\n // props.push(a, attrs[a]);\n // } else {\n // attrs[a] && props.push(a, a);\n // }\n // break;\n case \"boolean\":\n attrs[a] && props.push(a, a);\n break;\n default:\n props.push(a, attrs[a]);\n break;\n }\n }\n }\n }\n if (classes.length) {\n props.unshift(\"class\", classes.join(\" \"));\n }\n if (id) {\n props.unshift(\"id\", id);\n }\n idom.elementOpen(tag, attrs._key, undefined, ...props);\n if (attrs._skip) {\n idom.skip();\n }\n if (ctx && ref) {\n ctx.refs[ref] = idom.currentElement();\n }\n if (hObj && hObj.mount && hObj.mount.constructor === Function) {\n hObj.mount(idom.currentElement());\n idom.skip();\n }\n return attrs._skip ? true : false;\n }\n\n close(tag: HHead, children: HElements, ctx?: HHandlerCtx): void {\n idom.elementClose(tag);\n }\n\n text(text: string, ctx?: HHandlerCtx): void {\n idom.text(text);\n }\n\n fnc(fnc: HFnc, ctx?: HHandlerCtx): void {\n const skip = fnc(idom.currentElement());\n skip && idom.skip();\n }\n\n obj(obj: HObj, ctx?: HHandlerCtx): void {\n if (\"toHsml\" in obj) {\n obj.toHsml && hsml(obj.toHsml(), this, obj as HHandlerCtx);\n } else {\n this.text(\"\" + obj, ctx);\n }\n }\n\n}\n\nfunction hsml2idom(hml: HElement, ctx?: HHandlerCtx): void {\n hsml(hml, new HsmlIDomHandler(), ctx);\n}\n\nfunction hsmls2idom(hmls: HElements, ctx?: HHandlerCtx): void {\n for (const hml of hmls) {\n if (hml === undefined || hml === null) {\n continue;\n }\n if (hml.constructor === String) {\n idom.text(hml as string);\n } else if (\"toHsml\" in (hml as any)) {\n const obj = hml as HHandlerCtx;\n obj.toHsml && hsml2idom(obj.toHsml(), obj);\n } else {\n hsml2idom(hml as HElement, ctx);\n }\n }\n}\n\nexport function hsml2idomPatch(node: Element, hsmlEl: HElement, ctx?: HHandlerCtx): void {\n idom.patch(node,\n (data?: HElement) => (data && hsml2idom(data, ctx)), hsmlEl);\n}\n\nexport function hsmls2idomPatch(node: Element, hsmlFr: HElements, ctx?: HHandlerCtx): void {\n idom.patch(node,\n (data?: HElements) => (data && hsmls2idom(data, ctx)), hsmlFr);\n}\n","const requiredMsg = \"required\";\nconst notInRangeMsg = \"not_in_range\";\nconst invalidFormatMsg = \"invalid_format\";\nconst invalidOptionMsg = \"invalid_option\";\nconst invalidValueMsg = \"invalid_value\";\n\n// name@doamin.net\nexport const emailRegex = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n\n// +421901123456 or +421 901 123 456 or +421-901-123-456 or 901123456 or 901 123 456 or 901-123-456\nexport const phoneRgex = /^(((00)([- ]?)|\\+)(\\d{1,3})([- ]?))?((\\d{3})([- ]?))((\\d{3})([- ]?))(\\d{3})$/;\n\n// 123 45 or 12345\nexport const pscRgex = /^\\d{3} ?\\d{2}$/;\n\n// 450115/8346\nexport const rodneCisloRgex = /^\\s*(\\d\\d)(\\d\\d)(\\d\\d)[ /]*(\\d\\d\\d)(\\d?)\\s*$/;\n\nexport abstract class Validator<TYPE, OPTS, MSGS> {\n\n readonly opts: OPTS;\n readonly msgs: MSGS;\n\n readonly str: string | null = null;\n readonly err: string | null = null;\n readonly obj: TYPE | null = null;\n\n constructor(opts?: OPTS, msgs?: MSGS) {\n this.opts = opts || {} as OPTS;\n this.msgs = msgs || {} as MSGS;\n }\n\n protected abstract strToObj(str?: string | null): { obj: TYPE | null, err: string };\n\n protected abstract objCheck(obj?: TYPE | null): string;\n\n protected abstract objToStr(obj?: TYPE | null,\n format?: string): { str: string, err: string };\n\n validate(value?: string | TYPE): { str?: string | null, obj?: TYPE | null, err: string } {\n if (typeof value === \"string\" || value === undefined || value === null) {\n const v = value as string | null | undefined;\n (this.str as any) = v;\n const sto = this.strToObj(v);\n (this.obj as any) = sto.obj;\n if (sto.err) {\n (this.err as any) = sto.err;\n return {\n str: (v === undefined || v === null) ? \"\" : v,\n obj: sto.obj,\n err: sto.err };\n }\n const err = this.objCheck(sto.obj);\n (this.err as any) = err;\n return {\n str: (v === undefined || v === null) ? \"\" : v,\n obj: sto.obj,\n err\n };\n } else {\n (this.str as any) = (value === undefined || value === null) ? null : (\"\" + value);\n const err = this.objCheck(value);\n (this.err as any) = err;\n return {\n str: this.str,\n obj: value,\n err\n };\n }\n }\n\n format(obj?: TYPE | null, format?: string): { str: string, err: string } {\n // const err = this.objCheck(obj);\n const ots = this.objToStr(obj, format);\n return {\n str: (ots.str === undefined || ots.str === null) ? \"\" : ots.str,\n // err: ots.err ? ots.err : err\n err: ots.err\n };\n }\n\n}\n\nexport function tpl(tmpl: string, data: { [k: string]: any }): string {\n return Object.keys(data)\n .map(k => [k, data[k]])\n .reduce((t, d) =>\n t.replace(new RegExp(`\\\\{\\\\{${d[0]}\\\\}\\\\}`, \"g\"), String(d[1])), tmpl);\n}\n\nexport interface ValidatorDataOpts {\n data?: { [key: string]: any };\n}\n\nexport interface SelectValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n options?: string[];\n}\n\nexport interface SelectValidatorMsgs {\n required?: string;\n invalid_option?: string;\n}\n\nexport class SelectValidator\n extends Validator<string, SelectValidatorOpts, SelectValidatorMsgs> {\n\n constructor(opts?: SelectValidatorOpts, msgs?: SelectValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: string | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n options: (\"options\" in opts)\n ? opts.options!.join(\", \")\n : \"\"\n })\n : requiredMsg\n };\n }\n }\n return {\n obj: str === undefined ? null : str,\n err: \"\"\n };\n }\n\n protected objCheck(obj?: string | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"options\" in opts) {\n if (obj && opts.options!.indexOf(obj) === -1) {\n return msgs.invalid_option\n ? tpl(msgs.invalid_option,\n {\n ...opts.data,\n option: obj === null ? \"\" : obj,\n options: (\"options\" in opts)\n ? opts.options!.join(\", \")\n : \"\"\n })\n : invalidOptionMsg;\n }\n }\n return \"\";\n }\n\n protected objToStr(obj?: string | null,\n format?: string): { str: string, err: string } {\n return { str: obj || \"\", err: \"\" };\n }\n\n}\n\nexport interface StringValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: number;\n max?: number;\n regexp?: RegExp;\n}\n\nexport interface StringValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nexport class StringValidator\n extends Validator<string, StringValidatorOpts, StringValidatorMsgs> {\n\n constructor(opts?: StringValidatorOpts, msgs?: StringValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: string | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min || \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max || \"\")) : \"\",\n regexp: (\"regexp\" in opts)\n ? (\"\" + (opts.regexp || \"\"))\n : \"\"\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n if (\"regexp\" in opts) {\n if (!opts.regexp!.test(str)) {\n return {\n obj: null,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n regexp: (\"regexp\" in opts)\n ? (\"\" + (opts.regexp || \"\"))\n : \"\"\n })\n : invalidFormatMsg\n };\n }\n }\n return { obj: str , err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: string | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (obj.length > opts.max!) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (obj.length < opts.min!) {\n err = true;\n }\n }\n if ((\"min\" in opts) && (\"max\" in opts)) {\n if (obj.length > opts.max! && obj.length < opts.min!) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min || \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max || \"\")) : \"\",\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: string | null,\n format?: string): { str: string, err: string } {\n return { str: obj || \"\", err: \"\" };\n }\n\n}\n\nexport interface NumberValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: number;\n max?: number;\n strict?: boolean;\n decimals?: number;\n}\n\nexport interface NumberValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nexport class NumberValidator\n extends Validator<number, NumberValidatorOpts, NumberValidatorMsgs> {\n\n constructor(opts?: NumberValidatorOpts, msgs?: NumberValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: number | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min || \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max || \"\")) : \"\",\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n const n = Number(str);\n let err: boolean = false;\n if (isNaN(n)) {\n err = true;\n }\n if (opts.strict && (str !== this.objToStr(n).str)) {\n err = true;\n }\n if (err) {\n const num = isNaN(n) ? 1234.45 : n;\n return {\n obj: isNaN(n) ? null : n,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n num: this.objToStr(num).str || \"\"\n })\n : invalidFormatMsg\n };\n }\n return { obj: n, err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: number | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (obj > opts.max!) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (obj < opts.min!) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min || \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max || \"\")) : \"\",\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: number | null,\n format?: string): { str: string, err: string } {\n let str;\n if (obj === undefined || obj === null) {\n str = \"\";\n } else {\n if (\"decimals\" in this.opts) {\n str = obj.toFixed(this.opts.decimals);\n } else {\n str = String(obj);\n }\n }\n return {\n str,\n err: \"\"\n };\n }\n\n}\n\nexport interface DateValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: Date;\n max?: Date;\n dateOnly?: boolean;\n iso?: boolean;\n // strict?: boolean;\n\n}\n\nexport interface DateValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nconst dateToLocaleString = (date: Date) => date.toLocaleString();\nconst dateToLocaleDateString = (date: Date) => date.toLocaleDateString();\n\nconst dateToIsoString = (date: Date) => date.toISOString();\nconst dateToIsoDateString = (date: Date) => new Date(date.toDateString()).toISOString();\n\nexport class DateValidator\n extends Validator<Date, DateValidatorOpts, DateValidatorMsgs> {\n\n dateToStr: (date: Date) => string;\n\n constructor(opts?: DateValidatorOpts, msgs?: DateValidatorMsgs) {\n super(opts, msgs);\n if (opts?.iso) {\n this.dateToStr = opts?.dateOnly ? dateToIsoDateString : dateToIsoString;\n } else {\n this.dateToStr = opts?.dateOnly ? dateToLocaleDateString : dateToLocaleString;\n }\n if (opts?.dateOnly && opts?.min) {\n opts.min = new Date(opts.min.getFullYear(), opts.min.getMonth(), opts.min.getDate());\n }\n if (opts?.dateOnly && opts?.max) {\n opts.max = new Date(opts.max.getFullYear(), opts.max.getMonth(), opts.max.getDate() + 1);\n }\n }\n\n protected strToObj(str?: string | null): { obj: Date | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts && opts.min) ? this.dateToStr(opts.min) : \"\",\n max: (\"max\" in opts && opts.max) ? this.dateToStr(opts.max) : \"\"\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n const dt = Date.parse(str);\n let d = new Date(dt);\n if (opts.dateOnly) {\n d = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n let err: boolean = false;\n if (isNaN(dt)) {\n err = true;\n }\n // if (opts.strict && (str !== this.objToStr(d).str)) {\n // err = true;\n // }\n if (err) {\n const date = isNaN(dt) ? new Date() : d;\n return {\n obj: isNaN(dt) ? null : d,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n date: this.objToStr(date).str || \"\"\n })\n : invalidFormatMsg\n };\n }\n return { obj: d, err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: Date | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (opts.max && obj.getTime() > opts.max.getTime()) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (opts.min && obj < opts.min) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts && opts.min) ? this.dateToStr(opts.min) : \"\",\n max: (\"max\" in opts && opts.max) ? this.dateToStr(opts.max) : \"\"\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: Date | null,\n format?: string): { str: string, err: string } {\n return {\n str: (obj === undefined || obj === null) ? \"\" : this.dateToStr(obj),\n err: \"\"\n };\n }\n\n}\n\nexport interface BooleanValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n value?: boolean;\n}\n\nexport interface BooleanValidatorMsgs {\n required?: string;\n invalid_value?: string;\n}\n\nexport class BooleanValidator\n extends Validator<boolean, BooleanValidatorOpts, BooleanValidatorMsgs> {\n\n constructor(opts?: BooleanValidatorOpts, msgs?: BooleanValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: boolean | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data\n })\n : requiredMsg\n };\n }\n }\n let b;\n switch (str) {\n case \"true\":\n case \"1\":\n case \"on\":\n case \"yes\":\n b = true;\n break;\n default:\n b = false;\n }\n return { obj: b, err: \"\" };\n }\n\n protected objCheck(obj?: boolean | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err = false;\n if (\"value\" in opts) {\n if (obj !== opts.value) {\n err = true;\n }\n }\n if (err) {\n return msgs.invalid_value\n ? tpl(msgs.invalid_value,\n {\n ...opts.data,\n value: (\"value\" in opts) ? (\"\" + (opts.value || \"\")) : \"\",\n })\n : invalidValueMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: boolean | null,\n format?: string): { str: string, err: string } {\n return {\n str: (obj === undefined || obj === null) ? \"\" : (\"\" + obj),\n err: \"\"\n };\n }\n\n}\n\ntype FormValidators<TYPE> = { [key in keyof TYPE]: Validator<any, any, any> };\n\nexport type Str<TYPE> = { [key in keyof TYPE]: string };\nexport type Obj<TYPE> = { [key in keyof TYPE]: any };\nexport type Err<TYPE> = { [key in keyof TYPE]: string };\n\nexport interface FormValidatorData<TYPE> {\n str: Str<TYPE>;\n obj: Obj<TYPE>;\n err: Err<TYPE>;\n valid: boolean;\n}\n\nexport class FormValidator<TYPE extends { [key: string]: any }> {\n\n readonly validators: FormValidators<TYPE> = {} as FormValidators<TYPE>;\n\n readonly str?: Str<TYPE>;\n readonly obj?: Obj<TYPE>;\n readonly err?: Err<TYPE>;\n\n readonly valid?: boolean;\n\n addValidator(field: keyof TYPE, validator: Validator<any, any, any>): this {\n this.validators[field] = validator;\n return this;\n }\n\n validate(data: { [key in keyof TYPE]?: string }): this {\n const res = Object.keys(this.validators)\n .reduce(\n (a, k) => {\n const v = (data as any)[k];\n const r = (this.validators as any)[k].validate(v);\n (a.str as any)[k] = r.str;\n (a.obj as any)[k] = r.obj;\n (a.err as any)[k] = r.err;\n r.err && (a.valid = false);\n return a;\n },\n { str: {}, obj: {}, err: {}, valid: true });\n (this.str as any) = res.str;\n (this.obj as any) = res.obj;\n (this.err as any) = res.err;\n (this.valid as any) = res.valid;\n return this;\n }\n\n format(data: { [key in keyof TYPE]: any }): this {\n const res = Object.keys(this.validators)\n .reduce(\n (a, k) => {\n const v = (data as any)[k];\n const r = (this.validators as any)[k].format(v);\n (a.str as any)[k] = r.str;\n (a.obj as any)[k] = v;\n (a.err as any)[k] = r.err;\n r.err && (a.valid = false);\n return a;\n },\n { str: {}, obj: {}, err: {}, valid: true });\n (this.str as any) = res.str;\n (this.obj as any) = res.obj;\n (this.err as any) = res.err;\n (this.valid as any) = res.valid;\n return this;\n }\n\n data(): FormValidatorData<TYPE> {\n return {\n str: this.str!,\n obj: this.obj!,\n err: this.err!,\n valid: this.valid!\n };\n }\n\n}\n\n\n// TEST\n\n// const sv = new StringValidator(\n// {\n// required: true,\n// min: 3,\n// max: 5,\n// // regexp: /^[0123]+$/\n// data: {\n// xxx: \"xXx\"\n// }\n// },\n// {\n// required: \"required {{min}} {{max}} {{regexp}}\",\n// invalid_format: \"invalid_format {{regexp}}\",\n// not_in_range: \"not_in_range {{min}} {{max}} | data.xxx={{xxx}}\"\n// });\n\n// [\n// \"x1234\",\n// \"x1234y\",\n// \"xy\"\n// ].forEach(v => {\n// console.log();\n// console.log(v);\n// const r = sv.validate(v);\n// console.log(r);\n// if (r.obj) {\n// const f = sv.format(r.obj);\n// console.log(f);\n// }\n// });\n\n// console.log();\n\n// const nv = new NumberValidator(\n// {\n// required: true,\n// min: 3,\n// max: 500000,\n// decimals: 2,\n// strict: true\n// },\n// {\n// required: \"required {{min}} {{max}}\",\n// invalid_format: \"invalid_format {{num}}\",\n// not_in_range: \"not_in_range {{min}} {{max}}\"\n// });\n\n// console.log(nv.format(undefined));\n// console.log(nv.format(12345.6789));\n\n// console.log(nv.validate(\"12345.6789\"));\n// console.log(nv.validate(\"12345,6789\"));\n// console.log(nv.validate(\"12,345.6789\"));\n\n// const dv = new DateValidator(\n// {\n// required: false,\n// // min: new Date(),\n// max: new Date(),\n// clearTime: false\n// // strict: true\n// },\n// {\n// required: \"required {{min}} {{max}}\",\n// invalid_format: \"invalid_format {{date}}\",\n// not_in_range: \"not_in_range {{min}} {{max}}\"\n// });\n\n// console.log(dv.opts);\n\n// console.log(dv.format(undefined));\n\n// console.log(dv.format(new Date));\n\n// console.log(dv.validate(\"9/17/2020, 10:46:07 AM\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"9/17/2020\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"2020-09-17T08:46:07.000Z\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"\"));\n// console.log(dv.format(dv.obj).str);\n\n// console.log(new Date().toString());\n// console.log(new Date().toDateString());\n// console.log(new Date().toTimeString());\n// console.log(new Date().toLocaleString());\n// console.log(new Date().toLocaleDateString());\n// console.log(new Date().toLocaleTimeString());\n// console.log();\n// console.log(new Date(Date.parse(new Date().toString())));\n// console.log(new Date(Date.parse(new Date().toDateString())));\n// console.log(new Date(Date.parse(new Date().toTimeString())));\n// console.log(new Date(Date.parse(new Date().toLocaleString())));\n// console.log(new Date(Date.parse(new Date().toLocaleDateString())));\n// console.log(new Date(Date.parse(new Date().toLocaleTimeString())));\n\n// const formData = { str: \"123a\", num: \"123456.789\", date: \"9/17/2020, 10:46:07 AM\" };\n// const formData = { str: \"\", num: \"\", date: \"\" };\n// const formData = { str: undefined, num: undefined, date: undefined };\n\n// const fv = new FormValidator<typeof formData>()\n// .addValidator(\"str\", sv)\n// .addValidator(\"num\", nv)\n// .addValidator(\"date\", dv)\n// .validate(formData);\n\n// console.log(fv.data());\n\n// fv.format(fv.obj!);\n// console.log(fv);\n\n// const ovData = { str: \"123a\", num: \"123.45\", date: \"02.01.2019 12:12\" };\n\n// const ov = new ObjectValidator<typeof ovData>()\n// .addValidator(\"str\", sv)\n// .addValidator(\"num\", nv)\n// // .addValidator(\"date\", dv)\n// .validate(ovData);\n\n// // console.log(ov);\n\n// ov.format(ov.obj!);\n// console.log(ov);\n\n// console.log();\n\n// interface ReportFormData {\n// spz: string;\n// tachometer: string;\n// dateCreated: string;\n// user: {\n// // name: string[];\n// email: string;\n// };\n// }\n\n// const dov = new ObjectValidator<ReportFormData>()\n// .addValidator(\"spz\", new StringValidator({ required: true }))\n// .addValidator(\"tachometer\", new NumberValidator({ required: true, min: 1 } ))\n// .addValidator(\"dateCreated\", new StringValidator({ required: true }))\n// .addValidator(\"user\", new ObjectValidator<ReportFormData[\"user\"]>()\n// .addValidator(\"email\", new StringValidator({ required: true}))\n// // .addValidator(\"name\", { })\n// // new ArrayValidator({\n// // required: true,\n// // validator: new StringValidator({ required: true })\n// // })\n// );\n\n// dov.validate(\n// {\n// spz: \"dasdas\",\n// tachometer: \"111222\",\n// // dateCreated: \"10.02.2019\",\n// user: {\n// // email: \"dsafasdf\",\n// }\n// },\n// {\n// dateCreated: \"01.03.2011\",\n// spz: \"32ds9f0f\",\n// tachometer: \"3213214214\",\n// user: {\n// email: \"sadmaskdmk2@dsadsamkl.com\"\n// }\n// });\n\n// const avn = new ArrayValidator<number>(new NumberValidator());\n// const rn = avn.validate([345, 123]);\n// console.log(rn);\n\n\n// interface D {\n// a: number;\n// b?: string;\n// }\n\n// const av = new ArrayValidator<T>(new ObjectValidator<T>()\n// .addValidator(\"a\", new NumberValidator())\n// .addValidator(\"b\", new StringValidator({ required: true }))\n// );\n\n// const d: D[] = [\n// { a: 123, b: \"text\" },\n// // { a: 5.6, b: \"\" },\n// { a: 5.6 }\n// ];\n\n// const r = av.validate(d);\n// console.log(r);\n\n// const ro = new ObjectValidator<T>()\n// .addValidator(\"a\", new NumberValidator())\n// .addValidator(\"b\", new StringValidator({ required: true }))\n// .validate({\n// a: \"5.6\",\n// b: undefined\n// // b: \"text\"\n// });\n// console.log(\"---\", ro);\n\n// const v = new StringValidator({ required: true });\n// const str = undefined;\n// const sr = v.validate(str!);\n// console.log(sr);\n\n// const v = new StringValidator({ required: true, min: 8 });\n// const str = \"\";\n// const sr = v.format(str);\n// console.log(sr, v);\n","export type Callback<Ctx, E, Data> = (data: Data, e: E, ctx?: Ctx) => void;\n\nexport class Events<Evt extends { [e: string]: any } = any, Ctx = undefined> {\n\n private _ctx?: Ctx;\n private _cb: Array<Function> = [];\n private _cbs: { [e: string]: Array<Function> } = {};\n\n constructor(ctx?: Ctx) {\n ctx && (this._ctx = ctx);\n }\n\n emit<E extends keyof Evt>(e: E, data?: Evt[E]): this {\n if (e in this._cbs) {\n for (let i = 0, l = this._cbs[e as string].length; i < l; i++) {\n this._cbs[e as string][i](data, e, this._ctx);\n }\n }\n for (let i = 0, l = this._cb.length; i < l; i++) {\n this._cb[i](data, e, this._ctx);\n }\n return this;\n }\n\n on<E extends keyof Evt>(ev: E, cb: Callback<Ctx, E, Evt[E]>): this {\n const e = ev as string;\n if (!(e in this._cbs)) {\n this._cbs[e] = [];\n }\n if (this._cbs[e].indexOf(cb) === -1) {\n this._cbs[e].push(cb);\n }\n return this;\n }\n\n any<E extends keyof Evt>(cb: Callback<Ctx, E, Evt[E]>): this {\n this._cb.push(cb);\n return this;\n }\n\n once<E extends keyof Evt>(ev: E, cb: Callback<Ctx, E, Evt[E]>): this {\n const e = ev;\n const wrap = (d: Evt[E], evt: E, c?: Ctx) => {\n this.off(e, wrap);\n cb(d, evt, c);\n };\n this.on(ev, wrap);\n return this;\n }\n\n off<E extends keyof Evt>(e?: E, cb?: Callback<Ctx, E, Evt[E]>): this {\n if (e === undefined) {\n if (cb) {\n this._cb = this._cb.filter(c => c !== cb);\n } else {\n this._cb.length = 0;\n }\n }\n if (e && e in this._cbs) {\n if (cb) {\n this._cbs[e as string].splice(this._cbs[e as string].indexOf(cb), 1);\n } else {\n this._cbs[e as string].length = 0;\n delete this._cbs[e as string];\n }\n }\n return this;\n }\n\n}\n\n\n// Test\n\n// type Evts = {\n// s: string;\n// s1: string;\n// s2: string;\n// s3: string;\n// sx1: string;\n// sx2: string;\n// n: number;\n// o: { x: string };\n// };\n\n// const e = new Events<Evts, string>(\"ctx\");\n\n// e.any((data, e, ctx) => console.log(\"any:\", data, e, ctx));\n\n// e.emit(\"s\", \"data-eee1\");\n// e.emit(\"s\", \"data-eee1\");\n// e.on(\"s\", (data, e, ctx) => console.log(data, ctx, e));\n// e.emit(\"s\", \"data-eee2\");\n// e.off(\"s\");\n// e.emit(\"s\", \"data-eee3\");\n\n// e.off();\n\n// e.emit(\"s\", \"data-not-emitted\");\n\n\n// e.emit(\"o\", { x: \"obj-1\" });\n// e.once(\"o\", (data, ctx, e) => console.log(data, ctx, e));\n// e.emit(\"o\", { x: \"obj-2\" });\n// e.emit(\"o\", { x: \"obj-3\" });\n\n// e.emit(\"s1\", \"data-all-s1\");\n// e.emit(\"s2\", \"data-all-s2\");\n// e.emit(\"s3\", \"data-all-s3\");\n\n// e.emit(\"sx1\", \"data-ex1\");\n// e.emit(\"sx2\", \"data-ex2\");\n","import {\n hsml,\n HElement,\n HElements,\n HHead,\n HAttrs,\n HAttrClasses,\n HAttrData,\n HAttrStyles,\n HFnc,\n HObj,\n HHandler,\n HHandlerCtx\n} from \"./hsml\";\n\nclass HsmlHtmlHandler implements HHandler<HHandlerCtx> {\n\n private static _pairTags = [\n \"script\", \"iframe\",\n \"html\", \"head\", \"body\", \"title\", \"div\",\n \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"p\", \"a\", \"pre\", \"blockquote\", \"i\", \"b\", \"em\", \"strong\", \"tt\", \"cite\",\n \"ol\", \"ul\", \"li\", \"dl\", \"dt\", \"dd\", \"table\", \"tr\", \"td\",\n \"textarea\", \"select\", \"option\"];\n\n private _onHtml: (html: string) => void;\n private _pretty: boolean;\n private _indent: string;\n private _depth: number = 0;\n\n constructor(onHtml: (html: string) => void,\n pretty: boolean = false,\n indent: string = \" \") {\n this._onHtml = onHtml;\n this._pretty = pretty;\n this._indent = indent;\n }\n\n open(tag: HHead, attrs: HAttrs, children: HElements, ctx?: HHandlerCtx): boolean {\n const props: any[] = [];\n let id = attrs._id;\n let classes: string[] = attrs._classes ? attrs._classes : [];\n let hObj: any = attrs._hObj;\n for (const a in attrs) {\n if (attrs.hasOwnProperty(a)) {\n switch (a) {\n case \"_id\":\n case \"_classes\":\n case \"_ref\":\n case \"_key\":\n case \"_skip\":\n case \"_hObj\":\n break;\n case \"id\":\n id = attrs[a] as string;\n break;\n case \"classes\":\n const attrClasses = attrs[a] as HAttrClasses;\n classes = classes.concat(attrClasses\n ? attrClasses\n .map(c =>\n c.constructor === String\n ? c as string\n : (c[1] ? c[0] as string : undefined))\n .filter((c): c is string => c !== undefined)\n : [] as string[]);\n break;\n case \"class\":\n classes = classes.concat((attrs[a] as string).split(\" \"));\n break;\n case \"data\":\n const attrData = attrs[a] as HAttrData;\n for (const d in attrData) {\n if (attrData.hasOwnProperty(d)) {\n if (attrData[d].constructor === String) {\n props.push([\"data-\" + d, attrData[d]]);\n } else {\n props.push([\"data-\" + d, JSON.stringify(attrData[d])]);\n }\n }\n }\n break;\n case \"styles\":\n const attrStyles = attrs[a] as HAttrStyles;\n let style = \"\";\n for (const d in attrStyles) {\n if (attrStyles.hasOwnProperty(d)) {\n const dd = d.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n style += dd + \":\" + attrStyles[d] + \";\";\n }\n }\n props.push([\"style\", style]);\n break;\n case \"styles\":\n break;\n case \"on\":\n break;\n default:\n if (typeof attrs[a] === \"function\") {\n // ignore\n } else if (typeof attrs[a] === \"boolean\") {\n attrs[a] && props.push([a, \"\"]);\n } else {\n props.push([a, attrs[a]]);\n }\n }\n }\n }\n if (classes.length) {\n props.unshift([\"class\", classes.join(\" \")]);\n }\n if (id) {\n props.unshift([\"id\", id]);\n }\n if (hObj && \"type\" in hObj) {\n props.unshift([\"hObj\", hObj.type]);\n }\n const args = props.map(p => `${p[0]}=\"${escapeHtml(p[1])}\"`).join(\" \");\n let html = \"\";\n if (this._pretty) {\n html += this._mkIndent(this._depth);\n this._depth++;\n }\n const pairTag = (children.length || HsmlHtmlHandler._pairTags.indexOf(tag) !== -1);\n html += \"<\" + tag + (args ? \" \" + args : \"\") + (pairTag ? \">\" : \"/>\");\n if (this._pretty) {\n html += \"\\n\";\n }\n this._onHtml(html);\n if (hObj && \"render\" in hObj && hObj.render.constructor === Function) {\n const hsmls = hObj.render() as HElements;\n for (const hml of hsmls) {\n if (hml === undefined || hml === null) {\n continue;\n }\n if (hml.constructor === String) {\n this._onHtml(hml + (this._pretty ? \"\\n\" : \"\"));\n } else if (\"toHsml\" in (hml as any)) {\n const obj = hml as HObj;\n obj.toHsml && hsml(obj.toHsml(), this);\n } else {\n hsml(hml as HElement, this);\n }\n }\n }\n return false;\n }\n\n close(tag: HHead, children: HElements, ctx?: HHandlerCtx): void {\n let html = \"\";\n const pairTag = (children.length || HsmlHtmlHandler._pairTags.indexOf(tag) !== -1);\n if (this._pretty) {\n this._depth--;\n if (pairTag) {\n html += this._mkIndent(this._depth);\n }\n }\n if (pairTag) {\n html += \"</\" + tag + \">\";\n if (this._pretty) {\n html += \"\\n\";\n }\n this._onHtml(html);\n }\n }\n\n text(text: string, ctx?: HHandlerCtx): void {\n let html = \"\";\n if (this._pretty) {\n html += this._mkIndent(this._depth);\n }\n html += (text as any) instanceof String\n ? text\n : escapeHtml(text);\n if (this._pretty) {\n html += \"\\n\";\n }\n this._onHtml(html);\n }\n\n fnc(fnc: HFnc, ctx?: HHandlerCtx): void {\n }\n\n obj(obj: HObj, ctx?: HHandlerCtx): void {\n if (\"toHsml\" in obj) {\n obj.toHsml && hsml(obj.toHsml(), this, obj as HHandlerCtx);\n } else {\n this.text(\"\" + obj, ctx);\n }\n }\n\n private _mkIndent(count: number): string {\n let indent = \"\";\n for (let i = 0; i < count; i++) {\n indent += this._indent;\n }\n return indent;\n }\n\n}\n\nexport function hsml2html(hsmlEl: HElement, onHtml: (html: string) => void, pretty = false): void {\n const handler = new HsmlHtmlHandler(onHtml, pretty);\n hsml(hsmlEl, handler);\n}\n\nexport function hsmls2html(hsmls: HElements, onHtml: (html: string) => void, pretty = false): void {\n for (const hml of hsmls) {\n if (hml === undefined || hml === null) {\n continue;\n }\n if (hml.constructor === String) {\n onHtml(hml + (pretty ? \"\\n\" : \"\"));\n } else if (\"toHsml\" in (hml as any)) {\n const obj = hml as HObj;\n obj.toHsml && hsml2html(obj.toHsml(), onHtml, pretty);\n } else {\n hsml2html(hml as HElement, onHtml, pretty);\n }\n }\n}\n\nexport function hsml2htmls(hsml: HElement, pretty = false): string[] {\n const htmls: string[] = [];\n hsml2html(hsml, html => htmls.push(html), pretty);\n return htmls;\n}\n\nexport function hsmls2htmls(hsmls: HElements, pretty = false): string[] {\n const htmls: string[] = [];\n hsmls2html(hsmls, html => htmls.push(html), pretty);\n return htmls;\n}\n\nconst escapeHtmlRegExp = /[\"'&<>]/;\n\n// TODO: check performance\n// const escapeHTML = (html: string) => html.replace(/[&<>'\"]/g,\n// tag => (({\n// '&': '&',\n// '<': '<',\n// '>': '>',\n// \"'\": ''',\n// '\"': '"'\n// } as any)[tag]));\n\nfunction escapeHtml(html: string): string {\n const str = \"\" + html;\n const m = escapeHtmlRegExp.exec(str);\n if (!m) {\n return str;\n }\n let esc;\n let escHtml = \"\";\n let idx = 0;\n let lastIdx = 0;\n for (idx = m.index; idx < str.length; idx++) {\n switch (str.charCodeAt(idx)) {\n case 34: // \"\n esc = \""\";\n break;\n case 38: // &\n esc = \"&\";\n break;\n case 39: // '\n esc = \"'\";\n break;\n case 60: // <\n esc = \"<\";\n break;\n case 62: // >\n esc = \">\";\n break;\n default:\n continue;\n }\n if (lastIdx !== idx) {\n escHtml += str.substring(lastIdx, idx);\n }\n lastIdx = idx + 1;\n escHtml += esc;\n }\n return lastIdx !== idx\n ? escHtml + str.substring(lastIdx, idx)\n : escHtml;\n}\n\n// Test\n\n// const hsmls: HElements = [\n// \"text\",\n// [\"tag\", [\n// \"d\",\n// [\"\"]\n// ]],\n// [\"taga\",\n// {\n// attr: \"escape html attr entities: \\\" ' & < >\",\n// classes: [\"class\"]\n// },\n// [\n// \"text\",\n// \"escape html entities: \\\" ' & < >\",\n// new String(\"escape html entities: \\\" ' & < >\"),\n// 123,\n// true\n// ]\n// ]\n// ];\n\n// const hml: HElement = [\"xxx\", {}, [\n// \"types\", \" \", 1235.456, \" \", new Date(), \" \",\n// ...hsmls,\n// [\"t\", [\"t\", \"a\", \"\"]],\n// [\"t\", {}, [\"t\", \"a\", \"\"]],\n// [\"a\", { href: \"url\", onclick: \"return confirm('Confirm please')\" }, \"link\"]\n// ]];\n\n// console.log(hsmls, hml);\n\n// const html = hsml2htmls(hml, true);\n// console.log(html.join(\"\"));\n","\ntype Fnc = (...args: any[]) => void;\n\nexport function debounce<F extends Fnc>(func: F, delay = 300) {\n type Args = F extends (...args: infer P) => void ? P : never;\n let timeout: number;\n return function (this: any, ...args: Args) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, delay);\n };\n}\n\n// Decorator\nexport function Debounce(delay = 300) {\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const method = descriptor.value;\n descriptor.value = debounce(method, delay);\n return descriptor;\n };\n}\n\n\n// TEST\n\n// const d = debounce(\n// function (this: any, x: string, y: number) {\n// console.log(\"debounce\", x, y);\n// },\n// 300);\n// d(\"peter\", 3);\n\n// const o = {\n// x: \"o.x\",\n// m: function (y: number) {\n// console.log(\"o.m\", this.x, y);\n// },\n// d: ({} as any)\n// };\n// o.d = debounce(o.m, 300);\n// o.d(\"test\");\n\n// class O {\n// x: string = \"O.x\";\n\n// @Debounce(300)\n// m(y: string) {\n// console.log(\"O.m\", this.x, y);\n// }\n// }\n// const obj = new O();\n// // obj.m = debounce(obj.m, 300); // decorator equivalent\n// obj.m(\"m(p)\");\n\n// setTimeout(() => obj.m(\"m(p) 200\"), 200);\n// setTimeout(() => obj.m(\"m(p) 1200\"), 1200);\n// setTimeout(() => obj.m(\"m(p) 1400\"), 1400);\n// setTimeout(() => obj.m(\"m(p) 2200\"), 2200);\n// setTimeout(() => obj.m(\"m(p) 2400\"), 2400);\n","\nexport function selectAll(selector: string, element?: HTMLElement): HTMLElement[] {\n const e = element || document;\n const qsa = e.querySelectorAll(selector);\n const a: HTMLElement[] = [];\n for (let i = 0; i < qsa.length; i++) {\n a.push(qsa[i] as HTMLElement);\n }\n return a;\n}\n\nexport function select(selector: string, element?: HTMLElement): HTMLElement | null {\n const e = element || document;\n return e.querySelector(selector);\n}\n\nexport function append(element: HTMLElement, ...elements: HTMLElement[]): void {\n elements.forEach(e => element.appendChild(e));\n}\n\nexport function replace(oldElement: HTMLElement, newElement: HTMLElement): void {\n oldElement.parentElement &&\n oldElement.parentElement.replaceChild(newElement, oldElement);\n}\n\nexport function remove(element: HTMLElement): void {\n element.parentElement && element.parentElement.removeChild(element);\n}\n\nexport function empty(element: HTMLElement) {\n while (element.firstChild /*.hasChildNodes()*/) {\n element.removeChild(element.firstChild);\n }\n}\n\n\nexport function html(html: string): HTMLElement {\n html = html.trim();\n // const t = document.createElement(\"template\") as HTMLTemplateElement;\n // if (\"content\" in t) {\n // t.innerHTML = html;\n // return t.content.cloneNode(true) as HTMLElement;\n // } else {\n let wrapMap: any = {\n option: [1, \"<select multiple='multiple'>\", \"</select>\"],\n legend: [1, \"<fieldset>\", \"</fieldset>\"],\n area: [1, \"<map>\", \"</map>\"],\n param: [1, \"<object>\", \"</object>\"],\n thead: [1, \"<table>\", \"</table>\"],\n tr: [2, \"<table><tbody>\", \"</tbody></table>\"],\n col: [2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\"],\n td: [3, \"<table><tbody><tr>\", \"</tr></tbody></table>\"],\n body: [0, \"\", \"\"],\n _default: [1, \"<div>\", \"</div>\"]\n };\n wrapMap.optgroup = wrapMap.option;\n wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n wrapMap.th = wrapMap.td;\n const match = /<\\s*\\w.*?>/g.exec(html);\n let el: HTMLElement = document.createElement(\"div\");\n if (match != null) {\n const tag = match[0].replace(/</g, \"\").replace(/>/g, \"\").split(\" \")[0];\n if (tag.toLowerCase() === \"body\") {\n const body = document.createElement(\"body\");\n // keeping the attributes\n el.innerHTML = html.replace(/<body/g, \"<div\").replace(/<\\/body>/g, \"</div>\");\n const attrs = (el.firstChild as Element).attributes;\n body.innerHTML = html;\n for (let i = 0; i < attrs.length; i++) {\n body.setAttribute(attrs[i].name, attrs[i].value);\n }\n return body;\n } else {\n const map = wrapMap[tag] || wrapMap._default;\n html = map[1] + html + map[2];\n el.innerHTML = html;\n // Descend through wrappers to the right content\n let j = map[0] + 1;\n while (j--) {\n el = el.lastChild as HTMLElement;\n }\n }\n } else {\n el.innerHTML = html;\n el = el.lastChild as HTMLElement;\n }\n return el;\n // }\n}\n\n\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n (Element.prototype as any).matchesSelector ||\n (Element.prototype as any).mozMatchesSelector ||\n (Element.prototype as any).msMatchesSelector ||\n (Element.prototype as any).oMatchesSelector ||\n (Element.prototype as any).webkitMatchesSelector ||\n function(this: any, s: string) {\n const matches = (this.document || this.ownerDocument).querySelectorAll(s);\n let i = matches.length;\n while (--i >= 0 && matches.item(i) !== this) {}\n return i > -1;\n };\n}\n\nexport function addEventListener(element: HTMLElement,\n selector: string,\n event: string,\n listener: (target: HTMLElement, evt: Event) => void,\n useCapture: boolean = false) {\n element.addEventListener(\n event,\n function (e: Event) {\n const evt: Event = e || window.event;\n const target = (evt.target || e.srcElement) as HTMLElement;\n if (target && target.matches(selector)) {\n listener(target, evt);\n }\n },\n useCapture);\n}\n\nexport function removeEventListener(element: HTMLElement,\n event: string,\n listener: (evt: Event) => void,\n useCapture: boolean = false) {\n element.removeEventListener(event, listener, useCapture);\n}\n\n\nexport interface Widget {\n mount(element: HTMLElement): this;\n umount(): this;\n}\n","\nexport class UrlEncodedData {\n\n static encode(data: any, prefix = \"\"): string {\n let str: string;\n if (typeof data !== \"object\") {\n str = data;\n } else {\n const params: string[] = [];\n let size = 0;\n for (let key in data) {\n if (data.hasOwnProperty(key)) {\n let value = data[key];\n if (!(value instanceof Array)) {\n value = [value];\n }\n const valueLength = value.length;\n for (let i = 0; i < valueLength; i++) {\n const val = value[i];\n if ((typeof val === \"object\") && (val != null)) {\n params[size++] = arguments.callee(val, prefix + key + \".\");\n } else { // list\n params[size] = encodeURIComponent(prefix + key);\n if (val != null) {\n params[size] += \"=\" + encodeURIComponent(val);\n }\n size++;\n }\n }\n }\n }\n str = params.join(\"&\");\n }\n return str;\n }\n\n static decode(str: string): any {\n const data: any = {};\n if (str) {\n const params = str.split(\"&\");\n const paramsLength = params.length;\n for (let j = 0; j < paramsLength; j++) {\n const parameter = params[j].split(\"=\");\n const key = decodeURIComponent(parameter[0]);\n if (parameter.length > 1) {\n const value = decodeURIComponent(parameter[1]);\n const path = key.split(\".\");\n const size = path.length;\n let obj = data;\n for (let i = 0; i < size; i++) {\n const property = path[i];\n const o = obj[property];\n if (i === (size - 1)) { // list\n if (!o) {\n obj[property] = value;\n } else if (o instanceof Array) {\n obj[property].push(value);\n } else { // create array\n obj[property] = [o];\n obj[property][1] = value;\n }\n } else {\n if (!o) {\n obj[property] = {};\n }\n obj = obj[property];\n }\n }\n } else {\n data[key] = null;\n }\n }\n }\n return data;\n }\n\n}\n\nexport class Base64 {\n\n private static _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n static encode(e: string): string {\n let t = \"\";\n let n: any, r: any, i: any, s: any, o: any, u: any, a: any;\n let f = 0;\n e = Base64._utf8_encode(e);\n while (f < e.length) {\n n = e.charCodeAt(f++);\n r = e.charCodeAt(f++);\n i = e.charCodeAt(f++);\n s = n >> 2;\n o = (n & 3) << 4 | r >> 4;\n u = (r & 15) << 2 | i >> 6;\n a = i & 63;\n if (isNaN(r)) {\n u = a = 64;\n } else if (isNaN(i)) {\n a = 64;\n }\n t = t + Base64._keyStr.charAt(s) + Base64._keyStr.charAt(o) + Base64._keyStr.charAt(u) + Base64._keyStr.charAt(a);\n }\n return t;\n }\n\n static decode(e: string): string {\n let t = \"\";\n let n: any, r: any, i: any;\n let s: any, o: any, u: any, a: any;\n let f = 0;\n e = e.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n while (f < e.length) {\n s = this._keyStr.indexOf(e.charAt(f++));\n o = this._keyStr.indexOf(e.charAt(f++));\n u = this._keyStr.indexOf(e.charAt(f++));\n a = this._keyStr.indexOf(e.charAt(f++));\n n = s << 2 | o >> 4;\n r = (o & 15) << 4 | u >> 2;\n i = (u & 3) << 6 | a;\n t = t + String.fromCharCode(n);\n if (u !== 64) {\n t = t + String.fromCharCode(r);\n }\n if (a !== 64) {\n t = t + String.fromCharCode(i);\n }\n }\n t = Base64._utf8_decode(t);\n return t;\n }\n\n private static _utf8_encode(e: string): string {\n e = e.replace(/\\r\\n/g, \"\\n\");\n let t = \"\";\n for (let n = 0; n < e.length; n++) {\n const r = e.charCodeAt(n);\n if (r < 128) {\n t += String.fromCharCode(r);\n } else if (r > 127 && r < 2048) {\n t += String.fromCharCode(r >> 6 | 192);\n t += String.fromCharCode(r & 63 | 128);\n } else {\n t += String.fromCharCode(r >> 12 | 224);\n t += String.fromCharCode(r >> 6 & 63 | 128);\n t += String.fromCharCode(r & 63 | 128);\n }\n }\n return t;\n }\n\n private static _utf8_decode(e: string): string {\n let t = \"\";\n let n = 0;\n let r = 0;\n let c1 = 0;\n let c2 = 0;\n while (n < e.length) {\n r = e.charCodeAt(n);\n if (r < 128) {\n t += String.fromCharCode(r);\n n++;\n } else if (r > 191 && r < 224) {\n c1 = e.charCodeAt(n + 1);\n t += String.fromCharCode((r & 31) << 6 | c1 & 63);\n n += 2;\n } else {\n c1 = e.charCodeAt(n + 1);\n c2 = e.charCodeAt(n + 2);\n t += String.fromCharCode((r & 15) << 12 | (c1 & 63) << 6 | c2 & 63);\n n += 3;\n }\n }\n return t;\n }\n}\n","\nexport interface Entry {\n getName(): string;\n getValue(): string | undefined;\n setValue(value: string): this;\n validate(locale?: string): string;\n setValidator(validator: (entry: Entry, locale?: string) => string): this;\n onChange(callback: (entry: Entry) => void): this;\n}\n\n\nexport class TextAreaEntry implements Entry {\n\n private _element: HTMLTextAreaElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry, final: boolean) => void;\n\n constructor(element: HTMLTextAreaElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLTextAreaElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this, true);\n }\n });\n this._element.addEventListener(\"input\", () => {\n if (this._onChange) {\n this._onChange(this, false);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return this._element.value;\n }\n\n setValue(value: string): this {\n this._element.value = value;\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry, final: boolean) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class TextInputEntry implements Entry {\n\n private _element: HTMLInputElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry, final: boolean) => void;\n\n constructor(element: HTMLInputElement|string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLInputElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this, true);\n }\n });\n this._element.addEventListener(\"input\", () => {\n if (this._onChange) {\n this._onChange(this, false);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return this._element.value;\n }\n\n setValue(value: string): this {\n this._element.value = value;\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry, final: boolean) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class NumberInputEntry implements Entry {\n\n private _element: HTMLInputElement;\n\n private _decimals: number = 0;\n private _dragSensitivity: number = 1.0;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry, final: boolean) => void;\n\n constructor(element: HTMLInputElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLInputElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this, true);\n }\n });\n this.setDecimals(2);\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return this._element.value;\n }\n\n setValue(value: string): this {\n if (!isNaN(+value)) {\n this._element.value = (+value).toFixed(this._decimals);\n }\n return this;\n }\n\n setStep(value: number): this {\n if (!isNaN(value)) {\n this._element.step = \"\" + value;\n }\n return this;\n }\n\n setMin(value: number): this {\n if (!isNaN(value)) {\n this._element.min = \"\" + value;\n }\n return this;\n }\n\n setMax(value: number): this {\n if (!isNaN(value)) {\n this._element.max = \"\" + value;\n }\n return this;\n }\n\n setDecimals(value: number): this {\n if (!isNaN(value)) {\n this._decimals = value;\n }\n return this;\n }\n\n setDragSensitivity(value: number): this {\n if (!isNaN(value)) {\n this._dragSensitivity = value;\n }\n return this;\n }\n\n enableMouseWheel(): this {\n const onMouseWheel = () => {\n if (this._onChange) {\n setTimeout(() => {\n // const value = Number(this._element.value);\n // this.setValue(value.toFixed(this._decimals));\n this._onChange && this._onChange(this, false);\n }, 0);\n }\n };\n this._element.addEventListener(\"focus\", () => {\n this._element.addEventListener(\"mousewheel\", onMouseWheel);\n });\n this._element.addEventListener(\"blur\", () => {\n this._element.removeEventListener(\"mousewheel\", onMouseWheel);\n });\n return this;\n }\n\n enableMouseDrag(): this {\n this._element.addEventListener(\"mousedown\", (e: MouseEvent) => {\n document.body.style.cursor = \"row-resize\";\n this._element.style.cursor = \"row-resize\";\n const initialY = e.pageY;\n const value = Number(this.getValue());\n const min = this._element.min === \"\" ? null : Number(this._element.min);\n const max = this._element.max === \"\" ? null : Number(this._element.max);\n const step = this._element.step === \"\" ? 1 : Number(this._element.step);\n const num: number = isNaN(value) ? (min === null ? 0 : min) : value;\n\n const onMouseMove = (e: MouseEvent) => {\n const diffY = (e.pageY - initialY) * this._dragSensitivity;\n const newValue = num - diffY * step;\n if (min !== null && newValue < min) {\n this.setValue(min.toFixed(this._decimals));\n } else if (max !== null && newValue > max) {\n this.setValue(max.toFixed(this._decimals));\n } else {\n this.setValue(newValue.toFixed(this._decimals));\n }\n this._onChange && this._onChange(this, false);\n };\n\n const onMouseUp = () => {\n document.body.style.cursor = \"\";\n this._element.style.cursor = \"\";\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n this._onChange && this._onChange(this, true);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n });\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry, final: boolean) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class CheckboxEntry implements Entry {\n\n private _element: HTMLInputElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry) => void;\n\n constructor(element: HTMLInputElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLInputElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return \"\" + this._element.checked;\n }\n\n setValue(value: string): this {\n this._element.checked = (value && value !== \"false\") ? true : false;\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class SelectEntry implements Entry {\n\n private _element: HTMLSelectElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry) => void;\n\n constructor(element: HTMLSelectElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLSelectElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return this._element.value;\n\n // const idx = this._element.selectedIndex;\n // return this._element.options[idx].value;\n\n // const values: string[] = [];\n // const opts = this._element.options;\n // for (let i = 0; i < opts.length; i++) {\n // if (opts[i].selected === true) {\n // values.push(opts[i].value);\n // }\n // }\n // return values;\n }\n\n setValue(value: string): this {\n this._element.value = value;\n return this;\n }\n\n setOptions(options: {value: string, text: string}[]): this {\n const e = this._element;\n while (e.options.length > 0) {\n e.remove(0);\n }\n options.forEach(opt => {\n const o = document.createElement(\"option\");\n o.text = opt.text;\n o.value = opt.value;\n e.add(o);\n });\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class RadioEntry implements Entry {\n\n private _elements: HTMLInputElement[] = [];\n\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry) => void;\n\n constructor(elements: HTMLInputElement[] | string[]) {\n (elements as any).forEach((e: HTMLInputElement | string) => {\n if (typeof e === \"string\") {\n this._elements.push(document.getElementById(e) as HTMLInputElement);\n } else {\n this._elements.push(e);\n }\n });\n this._elements.forEach(e => {\n e.addEventListener(\"change\", () => {\n if (this._onChange && e.checked) {\n this._onChange(this);\n }\n });\n });\n }\n\n getName(): string {\n return this._elements[0].name;\n }\n\n getValue(): string | undefined {\n for (let e of this._elements) {\n if (e.checked) {\n return e.value;\n }\n }\n return;\n }\n\n setValue(value: string): this {\n for (let e of this._elements) {\n if (e.value === value) {\n e.checked = true;\n }\n }\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\n/*\n var fileInput = document.getElementById('fileInput');\n var fileDisplayArea = document.getElementById('fileDisplayArea');\n\n fileInput.addEventListener('change', function(e) {\n var file = fileInput.files[0];\n var textType = /text.*!/;\n\n if (file.type.match(textType)) {\n var reader = new FileReader();\n reader.onload = function (e) {\n fileDisplayArea.innerText = reader.result;\n }\n reader.readAsText(file);\n } else {\n fileDisplayArea.innerText = \"File not supported!\"\n }\n });\n */\nexport class FileEntry implements Entry {\n\n private _element: HTMLInputElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry) => void;\n\n constructor(element: HTMLInputElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLInputElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n const f = this._element.files;\n if (f && f.length) {\n return f[0].name + \" (\" + f[0].type + \", \" + f[0].size + \")\";\n } else {\n return;\n }\n }\n\n getFile(): File | null {\n return (this._element.files && this._element.files.length)\n ? this._element.files[0]\n : null;\n }\n\n setValue(value: string): this {\n // this._element.files..value = value;\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class Form {\n\n private _element: HTMLFormElement;\n private _formEntries: Entry[] = [];\n private _onSubmit?: (form: Form) => void;\n\n constructor(element: HTMLFormElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLFormElement;\n } else {\n this._element = element;\n }\n this._element.onsubmit = (e) => {\n e.preventDefault();\n if (this._onSubmit) {\n this._onSubmit(this);\n }\n return false;\n };\n }\n\n addEntry(entry: Entry): this {\n this._formEntries.push(entry);\n return this;\n }\n\n setEntries(entries: Entry[]): this {\n this._formEntries = entries;\n return this;\n }\n\n getEntries(): Entry[] {\n return this._formEntries;\n }\n\n getEntry(name: string): Entry | undefined {\n for (let entry of this._formEntries) {\n if (entry.getName() === name) {\n return entry;\n }\n }\n return;\n }\n\n validate(locale?: string): any {\n const errors: any = {};\n for (let entry of this._formEntries) {\n errors[entry.getName()] = entry.validate(locale);\n }\n return errors;\n }\n\n isValid(errors?: any): boolean {\n if (!errors) {\n errors = this.validate();\n }\n for (let error in errors) {\n if (errors.hasOwnProperty(error) && errors[error]) {\n return false;\n }\n }\n return true;\n }\n\n getValues(): any {\n const values: any = {};\n for (let entry of this._formEntries) {\n values[entry.getName()] = entry.getValue();\n }\n return values;\n }\n\n submit(): void {\n this._element.submit();\n }\n\n onSubmit(callback: (form: Form) => void): this {\n this._onSubmit = callback;\n return this;\n }\n\n}\n","\nexport interface HashUrlData {\n path: string[];\n query: {\n [key: string]: string | string[];\n };\n}\n\nexport const hashJsonEncoder = (data: any) => data ? JSON.stringify(data) : \"\";\nexport const hashJsonDecoder = (str: string) => str ? JSON.parse(str) : undefined;\n\nexport const hashUrlEncoder = (data: HashUrlData): string => {\n // console.log(data);\n const d = typeof data === \"string\"\n ? hashUrlDecoder(data)\n : data as HashUrlData;\n const dpath = d.path || [];\n const dquery = d.query || {};\n const path = dpath.join(\"/\");\n // const params = new URLSearchParams();\n const query = Object.entries(dquery)\n .reduce(\n (p, c) => {\n if (typeof c[1] === \"string\") {\n p.append(c[0], c[1]);\n } else {\n c[1].forEach(v => p.append(c[0], v));\n }\n return p;\n },\n new URLSearchParams())\n .toString();\n const str = `${path}?${query}`;\n // console.log(str);\n return str;\n};\nexport const hashUrlDecoder = (str: string): HashUrlData => {\n // console.log(str);\n const [pathStr, queryStr] = str.split(\"?\");\n // const pathStr = str.substring(0, str.indexOf(\"?\"));\n // const queryStr = str.substring(str.indexOf(\"?\") + 1);\n const path = pathStr.split(\"/\");\n const query = {} as any;\n for (const e of new URLSearchParams(queryStr).entries()) {\n const [k, v] = e;\n if (k in query) {\n if (typeof query[k] === \"string\") {\n query[k] = [query[k], v];\n } else {\n query[k].push(v);\n }\n } else {\n query[k] = v;\n }\n }\n const data = { path, query };\n // console.log(data);\n return data;\n};\n\nexport class Hash<T = string> {\n\n private _cb?: (data: T) => void;\n\n private _emitWritten: boolean;\n private _writtenDataJson?: string;\n\n private _encode = (data: T) => String(data);\n private _decode = (str: string) => str as any as T;\n\n constructor(emitWritten = true) {\n this._emitWritten = emitWritten;\n }\n\n onChange(cb: (data: T) => void): this {\n this._cb = cb;\n return this;\n }\n\n coders(encode: (data: T) => string,\n decode: (data: string) => T): this {\n this._encode = encode;\n this._decode = decode;\n return this;\n }\n\n listen(): this {\n this._cb && this._cb(this.read());\n if (\"onhashchange\" in window) {\n onhashchange = () => {\n const data = this.read();\n // console.log(\"onhashchange\", location.hash, data);\n if (!this._emitWritten) {\n const written = this._writtenDataJson === JSON.stringify(data);\n this._writtenDataJson = undefined;\n if (!written) {\n this._cb && this._cb(data);\n }\n } else {\n this._cb && this._cb(data);\n }\n };\n } else {\n alert(`Browser \"window.onhashchange\" not implemented`);\n // let prevHash = location.hash;\n // if (this._iId) {\n // clearInterval(this._iId);\n // }\n // this._iId = setInterval(() => {\n // if (location.hash !== prevHash) {\n // prevHash = location.hash;\n // const written = this._dataJson === location.hash;\n // this._dataJson = undefined;\n // if (this._emitWritten || !written) {\n // this._cb && this._cb(data);\n // }\n // }\n // }, 500);\n }\n return this;\n }\n\n read(): T {\n return this._decode(decodeURIComponent(location.hash.slice(1)));\n }\n\n write(data: T): this {\n location.hash = \"#\" + encodeURI(this._encode(data));\n // location.hash = \"#\" + this._encode(data);\n if (!this._emitWritten) {\n this._writtenDataJson = JSON.stringify(data);\n this._cb && this._cb(data);\n }\n return this;\n }\n\n}\n","\nexport class History<T> {\n\n back(): void {\n window.history.back();\n }\n\n forward(): void {\n window.history.forward();\n }\n\n go(delta?: number): void {\n window.history.go(delta);\n }\n\n length(): number {\n return window.history.length;\n }\n\n state(): T {\n return window.history.state as T;\n }\n\n pushState(state: T, title: string, url?: string): void {\n window.history.pushState(state, title, url);\n }\n\n replaceState(state: T, title: string, url?: string): void {\n window.history.replaceState(state, title, url);\n }\n\n onChange(callback: (state: T) => void): this {\n window.addEventListener(\"popstate\", function (e: PopStateEvent) {\n callback(e.state);\n });\n return this;\n }\n\n}\n","import { HElement, HElements, HAttrOnData, HAttrOnDataFnc, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst err = console.error;\n\nexport type HView<STATE> = (state: STATE) => HElements;\nexport type HView1<STATE> = (state: STATE) => HElement;\n\nexport interface HAction {\n type: string;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatch = (type: HAction[\"type\"],\n data?: HAction[\"data\"],\n event?: HAction[\"event\"]) => Promise<void>;\n\nexport type HUpdate = () => void;\n\nexport type HDispatcher<STATE> = (action: HAction, state: STATE, dispatch: HDispatch) => Promise<void>;\n\n// export type Class<T = object> = new (...args: any[]) => T;\n\n// export function happ<STATE>(state: STATE,\n// view: HView<STATE>,\n// dispatcher?: HDispatcher<STATE>,\n// element: Element | string | null = document.body) {\n// return new HApp<STATE>(state, view, dispatcher, element);\n// }\n\nexport enum HAppAction {\n _init = \"_init\",\n _mount = \"_mount\",\n _umount = \"_umount\",\n}\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"HApp action:\";\nconst msgDispatch = \"HApp dispatch:\";\nconst msgRender = \"HApp render:\";\nconst msgUpdate = \"HApp update:\";\n\nexport class HApp<STATE> implements HHandlerCtx {\n\n static debug = false;\n\n readonly state: STATE;\n readonly view: HView<STATE>;\n readonly dispatcher: HDispatcher<STATE>;\n\n readonly dom?: Element;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n private _updateSched?: number;\n\n private _onUpdate?: (app: HApp<STATE>) => void;\n\n constructor(state: STATE, view: HView<STATE>, dispatcher?: HDispatcher<STATE>, e: Element | string | null = document.body) {\n this.state = state;\n this.view = view;\n this.dispatcher = dispatcher || (async (a) => log(msgAction, a.type, a.data));\n this.dispatch(HAppAction._init).then(() => this.mount(e));\n }\n\n dispatch: HDispatch = async (type: string, data?: any, event?: Event): Promise<void> => {\n if (HApp.debug) {\n log(msgAction, { type, data, event });\n const t0 = performance.now();\n try {\n await this.dispatcher({ type, data, event }, this.state, this.dispatch);\n this.update();\n } catch (e) {\n err(msgDispatch, e);\n }\n const t1 = performance.now();\n log(msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n try {\n await this.dispatcher({ type, data, event }, this.state, this.dispatch);\n this.update();\n } catch (e) {\n err(msgDispatch, e);\n }\n }\n }\n\n render = (): HElements => {\n if (HApp.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n err(msgRender, e);\n }\n const t1 = performance.now();\n log(msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls || [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n err(msgRender, e);\n }\n return hsmls || [];\n }\n }\n\n actionCb = (action: string, data: HAttrOnData, event: Event): void => {\n data = (data && data.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n data = formData(event);\n }\n this.dispatch(action, data, event);\n }\n\n mount = (e: Element | string | null = document.body): this => {\n const el = (typeof e === \"string\")\n ? document.getElementById(e) || document.body\n : e || document.body;\n if ((el as any).app) {\n const a = (el as any).app as HApp<STATE>;\n a.umount();\n }\n if (!this.dom) {\n (this as any).dom = el;\n (el as any).app = this;\n const hsmls = (this as any).render();\n updateDom(el, hsmls, this);\n this._onUpdate && this._onUpdate(this);\n this.dispatch(HAppAction._mount, this.dom);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.dom) {\n this.dispatch(HAppAction._umount, this.dom);\n if (this.dom.hasAttribute(\"app\")) {\n this.dom.removeAttribute(\"app\");\n }\n const aNodes = this.dom.querySelectorAll(\"[app]\");\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).app as HApp<STATE>;\n a && a.umount();\n }\n while (this.dom.firstChild /*.hasChildNodes()*/) {\n this.dom.removeChild(this.dom.firstChild);\n }\n delete (this.dom as any).app;\n (this as any).dom = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.dom && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.dom) {\n const hsmls = this.render();\n updateDom(this.dom, hsmls, this);\n }\n this._updateSched = undefined;\n this._onUpdate && this._onUpdate(this);\n });\n }\n return this;\n }\n\n onUpdate = (cb: (app: HApp<STATE>) => void): this => {\n this._onUpdate = cb;\n return this;\n }\n\n toHsml = (): HElement => {\n if (this.dom) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { _skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.dom) {\n (this as any).dom = e;\n (e as any).app = this;\n this.dispatch(HAppAction._mount, this.dom);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.dom ? this.dom.outerHTML : \"\";\n }\n\n}\n\nfunction updateDom(el: Element, hsml: HElements, ctx: HHandlerCtx): void {\n if (HApp.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | string[] | null } | string | string[] | number | boolean | null {\n let data: { [k: string]: string | string[] | null } | string | string[] | number | boolean | null = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: String(iel.checked) };\n } else {\n data = String(iel.checked);\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n\n// export const formInputData = <STATE>(dispatcher: Actions<STATE>): Actions<STATE> =>\n// (app: App<STATE>, action: string | number, data?: any, event?: Event): void => {\n// if (data === undefined && event) {\n// data = inputEventData(event);\n// }\n// dispatcher(app, action, data, event);\n// };\n\n// // Decorator\n// export function FormInputData() {\n// return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n// const method = descriptor.value;\n// descriptor.value = formInputData(method);\n// return descriptor;\n// };\n// }\n","import {\n hsml,\n HElement,\n HElements,\n HHead,\n HAttrs,\n HAttrClasses,\n HAttrData,\n HAttrStyles,\n HAttrOn,\n HAttrOnCb,\n HAttrOnAct,\n HAttrOnAction,\n HAttrOnData,\n HFnc,\n HObj,\n HHandler,\n HHandlerCtx\n} from \"./hsml\";\n\nclass HsmlDomHandler implements HHandler<HHandlerCtx> {\n\n element?: HTMLElement;\n\n private _current?: HTMLElement;\n\n open(tag: HHead, attrs: HAttrs, children: HElements, ctx?: HHandlerCtx): boolean {\n const e = document.createElement(tag);\n let id = attrs._id;\n let classes: string[] = attrs._classes ? attrs._classes : [];\n let ref = attrs._ref;\n let hObj: any = attrs._hObj;\n for (const a in attrs) {\n if (attrs.hasOwnProperty(a)) {\n switch (a) {\n case \"_id\":\n case \"_classes\":\n case \"_ref\":\n case \"_key\":\n case \"_skip\":\n case \"_hObj\":\n break;\n case \"id\":\n id = attrs[a] as string;\n break;\n case \"classes\":\n const attrClasses = attrs[a] as HAttrClasses;\n classes = classes.concat(attrClasses\n ? attrClasses\n .map(c =>\n c.constructor === String\n ? c as string\n : (c[1] ? c[0] as string : undefined))\n .filter((c): c is string => c !== undefined)\n : [] as string[]);\n break;\n case \"class\":\n classes = classes.concat((attrs[a] as string).split(\" \"));\n break;\n case \"data\":\n const attrData = attrs[a] as HAttrData;\n for (const d in attrData) {\n if (attrData.hasOwnProperty(d)) {\n if (attrData[d].constructor === String) {\n e.dataset[d] = attrData[d] as string;\n } else {\n e.dataset[d] = JSON.stringify(attrData[d]);\n }\n }\n }\n break;\n case \"styles\":\n const attrStyles = attrs[a] as HAttrStyles;\n for (const d in attrStyles) {\n if (attrStyles.hasOwnProperty(d)) {\n (e.style as any)[d] = attrStyles[d];\n }\n }\n break;\n case \"on\":\n const attrOn = attrs[a] as HAttrOn;\n if (typeof attrOn[0] === \"string\") {\n if (typeof attrOn[1] === \"function\") {\n e.addEventListener(attrOn[0] as string, attrOn[1] as (e: Event) => void);\n } else {\n e.addEventListener(attrOn[0] as string, (e: Event) => {\n ctx && ctx.actionCb &&\n typeof ctx.actionCb === \"function\" &&\n ctx.actionCb(attrOn[1] as HAttrOnAction,\n attrOn[2] as HAttrOnData,\n e);\n });\n }\n } else {\n (attrOn as Array<HAttrOnCb | HAttrOnAct>)\n .forEach(attr => {\n if (typeof attrOn[1] === \"function\") {\n e.addEventListener(attrOn[0] as string, attrOn[1] as (e: Event) => void);\n } else {\n e.addEventListener(attrOn[0] as string, (e: Event) => {\n ctx && ctx.actionCb &&\n typeof ctx.actionCb === \"function\" &&\n ctx.actionCb(attrOn[1] as HAttrOnAction,\n attrOn[2] as HAttrOnData,\n e);\n });\n }\n });\n }\n break;\n default:\n if (typeof attrs[a] === \"function\") {\n e.addEventListener(a, attrs[a] as (e: Event) => void);\n } else if (typeof attrs[a] === \"boolean\") {\n attrs[a] && e.setAttribute(a, \"\");\n } else {\n e.setAttribute(a, attrs[a] as string);\n }\n }\n }\n }\n if (id) {\n e.setAttribute(\"id\", id);\n }\n if (classes.length) {\n e.classList.add(...classes);\n }\n if (this._current) {\n this._current.appendChild(e);\n this._current = e;\n } else {\n this.element = e;\n this._current = e;\n }\n if (ctx && ref) {\n ctx.refs[ref] = this._current;\n }\n if (hObj && hObj.mount && hObj.mount.constructor === Function) {\n hObj.mount(e);\n }\n return attrs._skip ? true : false;\n }\n\n close(tag: HHead, children: HElements, ctx?: HHandlerCtx): void {\n if (this._current !== this.element) {\n this._current && (this._current = this._current.parentElement || undefined);\n }\n }\n\n text(text: string, ctx?: HHandlerCtx): void {\n this._current && this._current.appendChild(document.createTextNode(text));\n }\n\n fnc(fnc: HFnc, ctx?: HHandlerCtx): void {\n this._current && fnc(this._current);\n }\n\n obj(obj: HObj, ctx?: HHandlerCtx): void {\n if (\"toHsml\" in obj) {\n obj.toHsml && hsml(obj.toHsml(), this, obj as HHandlerCtx);\n } else {\n this.text(\"\" + obj, ctx);\n }\n }\n\n}\n\nexport function hsml2dom(hml: HElement, ctx?: HHandlerCtx): HTMLElement | undefined {\n const handler = new HsmlDomHandler();\n hsml(hml, handler, ctx);\n return handler.element;\n}\n\nexport function hsmls2dom(hmls: HElements, ctx?: HHandlerCtx): Node[] {\n const elems: Node[] = [];\n for (const hml of hmls) {\n if (hml === undefined || hml === null) {\n continue;\n }\n if (hml.constructor === String) {\n elems.push(document.createTextNode(hml as string));\n } else if (\"toHsml\" in (hml as object)) {\n const obj = hml as HHandlerCtx;\n if (obj.toHsml) {\n elems.push(hsml2dom(obj.toHsml(), obj)!);\n }\n } else {\n elems.push(hsml2dom(hml, ctx)!);\n }\n }\n return elems;\n}\n","import { HElement, HAttrs, HHead, HFnc, HChildren } from \"./hsml\";\n\nexport function h(tag: HHead): HElement;\nexport function h(tag: HHead, text: string | number): HElement;\nexport function h(tag: HHead, children: HChildren): HElement;\nexport function h(tag: HHead, fnc: HFnc): HElement;\nexport function h(tag: HHead, attrs: HAttrs): HElement;\nexport function h(tag: HHead, attrs: HAttrs, text: string | number): HElement;\nexport function h(tag: HHead, attrs: HAttrs, children: HElement[]): HElement;\nexport function h(tag: HHead, attrs: HAttrs, fnc: HFnc): HElement;\nexport function h(tag: HHead, second?: HAttrs | HChildren, third?: HAttrs | HChildren): HElement {\n const result: [string, ...any[]] = [tag];\n if (second) {\n if (typeof second === \"string\" || typeof second === \"number\") {\n result.push([second]);\n } else if (Array.isArray(second) || typeof second === \"function\") {\n result.push(second);\n } else {\n // element has attributes\n result.push(second);\n }\n }\n if (third) {\n if (typeof third === \"string\" || typeof third === \"number\") {\n result.push([third]);\n } else if (Array.isArray(third) || typeof third === \"function\") {\n result.push(third);\n }\n }\n return result as HElement;\n}\n","import { HMount, HAction, HView, HComponent as SvacComponent } from \"./hsml-svac\";\nimport { HElement, HElements, HAttrOnData, HAttrOnDataFnc, HHandlerCtx, HFnc } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\nimport * as idom from \"incremental-dom\";\n\nexport interface HComponent<STATE> extends SvacComponent<STATE> {\n actions?: HActions<STATE>;\n}\n\nexport type HActions<STATE> = (ctrl: HCtrl<STATE>,\n action: string | number,\n data?: any,\n event?: Event) => void;\n\nconst mount: HMount = <STATE>(\n component: HComponent<STATE>,\n state?: STATE,\n action?: HAction): HFnc | HElements =>\n (e: Element) => {\n if ((e as any).ctrl) {\n const c = (e as any).ctrl as HCtrl<STATE>;\n if (c.view === component.view) {\n if (state !== undefined) {\n c.state = state;\n }\n c.update();\n } else {\n c.umount();\n const c1 = new HCtrl<STATE>(component, action);\n if (state !== undefined) {\n c1.state = state;\n }\n c1.mount(e);\n }\n } else {\n const c = new HCtrl<STATE>(component, action);\n if (state !== undefined) {\n c.state = state;\n }\n c.mount(e);\n }\n return true;\n };\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (handler: Function) { window.setTimeout(handler, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst ctrlAttr = \"ctrl\";\n\nexport class HCtrl<STATE> implements HHandlerCtx {\n\n static debug = false;\n\n static appActions?: HActions<any>;\n\n private static _count = 0;\n\n private static _ctrls: { [ctrl: string]: HCtrl<any> } = {};\n\n readonly type: string = \"Ctrl\";\n readonly id: string = this.type + \"-\" + HCtrl._count++;\n readonly dom?: Element;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n state: STATE;\n\n readonly view: HView<STATE>;\n\n private _actions?: HActions<STATE>;\n private _extAction?: HAction;\n\n private _updateSched?: number;\n\n constructor(component: HComponent<STATE>, extAction?: HAction) {\n this.view = component.view;\n this.type = component.type;\n this.state = component.state;\n this._actions = component.actions;\n this._extAction = extAction || this.appAction;\n this.action(\"_init\");\n }\n\n appAction = (action: string | number, data?: any, event?: Event): void => {\n HCtrl.debug && console.log(\"appAction\", this.type, action, data, event);\n HCtrl.appActions && HCtrl.appActions(this, action, data, event);\n }\n\n appActions(actions: HActions<STATE>): this {\n HCtrl.appActions = actions;\n return this;\n }\n\n extAction = (action: string | number, data?: any, event?: Event): void => {\n HCtrl.debug && console.log(\"extAction\", this.type, action, data, event);\n this._extAction && this._extAction(action, data, event);\n }\n\n action = (action: string | number, data?: any, event?: Event): void => {\n HCtrl.debug && console.log(\"action\", this.type, action, data, event);\n this._actions && this._actions(this, action, data, event);\n }\n\n appCtrls(): HCtrl<any>[] {\n return Object.values(HCtrl._ctrls);\n }\n\n render = (): HElements => {\n return this.view(this.state, this.action, mount);\n }\n\n actionCb = (action: string, data: HAttrOnData, event: Event): void => {\n data = (data && data.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n data = formInputData(event);\n }\n this.action(action, data, event);\n }\n\n mount = (e?: string | Element | null): this => {\n const el = typeof e === \"string\"\n ? document.getElementById(e) || document.body\n : e || document.body;\n if ((el as any).ctrl) {\n const c = (el as any).ctrl as HCtrl<STATE>;\n c && c.umount();\n }\n if (!this.dom) {\n HCtrl._ctrls[this.id] = this;\n (this as any).dom = el;\n (el as any).ctrl = this;\n const hsmls = (this as any).render();\n hsmls2idomPatch(el, hsmls, this);\n el.setAttribute(ctrlAttr, this.type);\n this.action(\"_mount\", this.dom);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.dom) {\n delete HCtrl._ctrls[this.id];\n this.action(\"_umount\", this.dom);\n if (this.dom.hasAttribute(ctrlAttr)) {\n this.dom.removeAttribute(ctrlAttr);\n }\n const cNodes = this.dom.querySelectorAll(`[${ctrlAttr}]`);\n for (let i = 0; i < cNodes.length; i++) {\n const c = (cNodes[i] as any).ctrl as HCtrl<STATE>;\n c && c.umount();\n }\n while (this.dom.firstChild) {\n this.dom.removeChild(this.dom.firstChild);\n }\n delete (this.dom as any).ctrl;\n (this as any).dom = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.dom && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.dom) {\n hsmls2idomPatch(this.dom, this.render(), this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement => {\n if (this.dom) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return (\n [\"div\",\n {\n _skip: true,\n _id: this.id,\n _key: this.id,\n ctrl: this.type\n }\n ]\n );\n }\n }\n const hsmls = this.render() as HElements;\n hsmls.push(\n (e: Element) => {\n if (!this.dom) {\n (this as any).dom = e;\n (e as any).ctrl = this;\n HCtrl._ctrls[this.id] = this;\n this.action(\"_mount\", this.dom);\n }\n });\n return (\n [\"div\",\n {\n _id: this.id,\n _key: this.id,\n ctrl: this.type\n },\n hsmls\n ]\n );\n }\n\n toHtml = (): string => {\n return this.dom ? this.dom.outerHTML : \"\";\n }\n\n}\n\n(idom as any).notifications.nodesDeleted = (nodes: Node[]) => {\n nodes.forEach(node => {\n if (node.nodeType === 1 && (node as any).ctrl) {\n const c = (node as any).ctrl as HCtrl<any>;\n c && c.umount();\n }\n });\n};\n\nfunction formInputData(e: Event): { [k: string]: string } {\n const value = {} as { [k: string]: string };\n const el = (e.target as HTMLElement);\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = (el as HTMLInputElement);\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n case \"radio\":\n value[iel.name] = iel.value;\n break;\n case \"number\":\n value[iel.name] = iel.value;\n break;\n case \"checkbox\":\n value[iel.name] = \"\" + iel.checked;\n break;\n }\n break;\n case \"SELECT\":\n const sel = (el as HTMLSelectElement);\n value[sel.name] = sel.value;\n break;\n case \"TEXTAREA\":\n const tel = (el as HTMLTextAreaElement);\n value[tel.name] = tel.innerText;\n break;\n case \"BUTTON\":\n const bel = (el as HTMLButtonElement);\n value[bel.name] = bel.value;\n break;\n }\n return value;\n}\n","import { HElements, HFnc } from \"./hsml\";\nimport { hsmls2htmls, hsmls2html } from \"./hsml-html\";\nimport { HAction, HMount, HComponent } from \"./hsml-svac\";\n\nconst actionHtml: HAction = (action: string | number, data: any, event?: Event) => { };\n\nconst mountHtml: HMount = <STATE>(component: HComponent<STATE>,\n state?: STATE): HFnc | HElements => {\n return component.view(state || component.state, actionHtml, mountHtml);\n};\n\nexport function html<STATE>(component: HComponent<STATE>,\n state: STATE,\n onHtml: (html: string) => void,\n pretty = false): void {\n hsmls2html(component.view(state, actionHtml, mountHtml), onHtml, pretty);\n}\n\nexport function htmls<STATE>(component: HComponent<STATE>,\n state: STATE,\n pretty = false): string {\n return hsmls2htmls(component.view(state, actionHtml, mountHtml), pretty).join(\"\");\n}\n","import { HElement, HElements, HAttrOnData, HHandlerCtx, HAttrOnDataFnc, HObj } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\nimport * as idom from \"incremental-dom\";\n\nexport interface IHWidget {\n render(): HElements;\n onMount(): void;\n onUmount(): void;\n actions(action: string, data?: HAttrOnData): void;\n}\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nexport abstract class HWidget implements HObj, HHandlerCtx, IHWidget {\n\n private static _count = 0;\n\n static readonly mounted: { [wid: string]: HWidget } = {};\n\n readonly type: string = this.constructor.name; // \"Widget\"\n readonly id: string = this.type + \"-\" + HWidget._count++;\n readonly dom?: Element;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n private _updateSched?: number;\n\n constructor(type?: string) {\n if (type) {\n this.type = type;\n }\n }\n\n abstract render(): HElements;\n\n onMount(): void {\n console.log(\"mount\");\n }\n\n onUmount(): void {\n console.log(\"umount\");\n }\n\n actions(action: string, data: any): void {\n console.log(action, data);\n }\n\n action(action: string, data?: any): void {\n this.actions(action, data);\n }\n\n actionCb(action: string, data: HAttrOnData, e: Event) {\n data = (data && data.constructor === Function)\n ? (data as HAttrOnDataFnc)(e)\n : data === undefined ? e : data;\n this.action(action, data);\n }\n\n mount(e?: string | Element | null): this {\n const el = typeof e === \"string\"\n ? document.getElementById(e) || document.body\n : e || document.body;\n if (\"widget\" in el) {\n const w = (el as any).widget as HWidget;\n w && w.umount();\n }\n if (!this.dom) {\n HWidget.mounted[this.id] = this;\n (this as any).dom = el;\n (el as any).widget = this;\n const hsmls = this.render();\n hsmls2idomPatch(el, hsmls, this);\n el.setAttribute(\"widget\", this.type);\n if ((this as any).onMount) {\n (this as any).onMount();\n }\n }\n return this;\n }\n\n umount(): this {\n if (this.dom) {\n delete HWidget.mounted[this.id];\n if ((this as any).onUmount) {\n (this as any).onUmount();\n }\n if (this.dom.hasAttribute(\"widget\")) {\n this.dom.removeAttribute(\"widget\");\n }\n const wNodes = this.dom.querySelectorAll(\"[widget]\");\n for (let i = 0; i < wNodes.length; i++) {\n const w = (wNodes[i] as any).widget as HWidget;\n w && w.umount();\n }\n while (this.dom.firstChild /*.hasChildNodes()*/) {\n this.dom.removeChild(this.dom.firstChild);\n }\n delete (this.dom as any).widget;\n (this as any).dom = undefined;\n }\n return this;\n }\n\n update(): this {\n if (this.dom && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.dom) {\n hsmls2idomPatch(this.dom, this.render(), this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml(): HElement {\n if (this.dom) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return (\n [\"div\",\n {\n _skip: true,\n _id: this.id,\n _key: this.id,\n widget: this.type\n }\n ]\n );\n }\n }\n const hsmls = (this as any).render() as HElements;\n hsmls.push(\n (e: Element) => {\n if (!this.dom) {\n (this as any).dom = e;\n (e as any).widget = this;\n if ((this as any).onMount) {\n (this as any).onMount();\n }\n }\n });\n return (\n [\"div\",\n {\n _id: this.id,\n _key: this.id,\n widget: this.type\n },\n hsmls\n ]\n );\n }\n\n toHtml = (): string => {\n return this.dom ? this.dom.outerHTML : \"\";\n }\n\n}\n\n(idom as any).notifications.nodesDeleted = (nodes: Node[]) => {\n nodes.forEach(node => {\n if (node.nodeType === 1 && \"widget\" in node) {\n const w = (node as any).widget as HWidget;\n w && w.umount();\n }\n });\n};\n","\nexport function isArray(obj: any) {\n return Array.isArray ?\n Array.isArray(obj) :\n (obj == null || obj === undefined || \"boolean|number|string|function|xml\".indexOf(typeof obj) !== -1) ?\n false :\n (typeof obj.length === \"number\" && !(obj.propertyIsEnumerable(\"length\")));\n}\n\nexport function decodeUrlQuery(queryStr: string): { [key: string]: string } {\n const query: { [key: string]: string } = {};\n if (queryStr) {\n const a = queryStr.substr(1).split(\"&\");\n for (const item of a) {\n const b = item.split(\"=\");\n query[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || \"\");\n }\n }\n return query;\n}\n\nexport function encodeUrlQuery(query: any): string {\n const key_value_pairs: any[] = [];\n for (const key in query) {\n if (query.hasOwnProperty(key)) {\n const value = query[key];\n if (typeof value === \"object\") {\n if (isArray(value)) {\n for (const item of value) {\n key_value_pairs.push(\n [key, typeof item === \"object\" ?\n JSON.stringify(item) : item]);\n }\n } else {\n key_value_pairs.push([key, JSON.stringify(value)]);\n }\n } else {\n key_value_pairs.push([key, value]);\n }\n }\n }\n for (let j = 0, pair: any; pair = key_value_pairs[j++];) {\n key_value_pairs[j - 1] = `${encodeURIComponent(pair[0])}=${encodeURIComponent(pair[1])}`;\n }\n return key_value_pairs.join(\"&\");\n}\n\n\nexport class HttpResponse {\n\n private _xhr: XMLHttpRequest;\n\n constructor(xhr: XMLHttpRequest) {\n this._xhr = xhr;\n }\n\n getHeaders(): string {\n return this._xhr.getAllResponseHeaders();\n }\n\n getHeader(header: string): string | null {\n return this._xhr.getResponseHeader(header);\n }\n\n getBody(): any {\n return this._xhr.response;\n }\n\n getType(): string {\n return this._xhr.responseType;\n }\n\n getContentType(): string | null {\n return this.getHeader(\"Content-Type\");\n }\n\n getText(): string {\n return this._xhr.responseText;\n }\n\n getJson(): any {\n return JSON.parse(this._xhr.responseText);\n }\n\n getXml(): Document | null {\n return this._xhr.responseXML;\n }\n\n}\n\n\nexport interface HttpProgress {\n loaded: number;\n total?: number;\n}\n\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"HEAD\"\n | \"CONNECT\"\n | \"OPTIONS\"\n | \"TRACE\";\n\nexport type HttpResponseType =\n | \"arraybuffer\"\n | \"blob\"\n | \"document\"\n | \"json\"\n | \"text\";\n\nexport const authBasic = (login: string, password: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Basic \" + btoa(login + \":\" + password) });\n};\n\nexport class HttpRequest {\n\n static readonly xhrs: HttpRequest[] = [];\n\n static onRequest?: (request: HttpRequest) => void;\n static onResponse?: (response: HttpResponse) => void;\n static onError?: (e: Event) => void;\n\n static abortAll() {\n HttpRequest.xhrs.forEach(x => x.abort());\n HttpRequest.xhrs.length = 0;\n }\n\n private _url?: string;\n private _query?: Object;\n private _method: HttpMethod = \"GET\";\n private _headers: { [key: string]: string } = {};\n private _timeout?: number;\n private _responseType?: HttpResponseType;\n\n private _onProgress?: (progress: HttpProgress) => void;\n private _onResponse?: (response: HttpResponse) => void;\n private _onError?: (e?: Event) => void;\n\n private _xhr?: XMLHttpRequest;\n private _async: boolean = true;\n private _noCache: boolean = false;\n\n get(url: string, query?: Object): this {\n this.method(\"GET\");\n this.url(url, query);\n return this;\n }\n\n post(url: string, query?: Object): this {\n this.method(\"POST\");\n this.url(url, query);\n return this;\n }\n\n put(url: string, query?: Object): this {\n this.method(\"PUT\");\n this.url(url, query);\n return this;\n }\n\n patch(url: string, query?: Object): this {\n this.method(\"PATCH\");\n this.url(url, query);\n return this;\n }\n\n del(url: string, query?: Object): this {\n this.method(\"DELETE\");\n this.url(url, query);\n return this;\n }\n\n url(url: string, query?: Object): this {\n this._url = url;\n this._query = query;\n return this;\n }\n\n method(method: HttpMethod): this {\n this._method = method;\n return this;\n }\n\n headers(headers: { [key: string]: string }): this {\n for (const key in headers) {\n if (headers.hasOwnProperty(key)) {\n this._headers[key] = headers[key];\n }\n }\n return this;\n }\n\n use(middleware: (req: HttpRequest) => void): this {\n middleware(this);\n return this;\n }\n\n timeout(timeout: number): this {\n this._timeout = timeout;\n return this;\n }\n\n responseType(type: HttpResponseType): this {\n this._responseType = type;\n return this;\n }\n\n onProgress(onProgress: (progress: HttpProgress) => void): this {\n this._onProgress = onProgress;\n return this;\n }\n\n onResponse(onResponse: (response: HttpResponse) => void): this {\n this._onResponse = onResponse;\n return this;\n }\n\n onError(onError: (e?: Event) => void): this {\n this._onError = onError;\n return this;\n }\n\n async(async: boolean = true): this {\n this._async = async;\n return this;\n }\n\n noCache(noCache: boolean = true): this {\n this._noCache = noCache;\n return this;\n }\n\n abort(): this {\n if (this._xhr) {\n this._xhr.abort();\n }\n return this;\n }\n\n send(data?: any, contentType?: string): void {\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n // this._headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n this._send(data, this._headers);\n }\n\n sendPromise(data?: any, contentType?: string): Promise<HttpResponse> {\n return new Promise<HttpResponse>((res, rej) => {\n this._onResponse = res;\n this._onError = rej;\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n this._send(data, this._headers);\n });\n }\n\n private _send(data?: any, headers?: { [key: string]: string }): void {\n const xhr = new XMLHttpRequest();\n this._xhr = xhr;\n\n let url = this._url || \"\";\n if (this._query) {\n const query = encodeUrlQuery(this._query);\n url = query ? `${url}?${query}` : url;\n }\n if (this._noCache) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + new Date().getTime();\n }\n // console.debug(\"HttpRequest: \" + this._method + \" \" + url, data);\n\n if (this._responseType) {\n this._xhr.responseType = this._responseType;\n }\n\n if (\"onprogress\" in xhr) {\n if (this._onProgress) {\n const onprogress = (e: ProgressEvent) => {\n this._onProgress!({\n loaded: e.loaded,\n total: e.lengthComputable ? e.total : undefined\n });\n };\n xhr.upload.onprogress = onprogress;\n xhr.onprogress = onprogress;\n }\n }\n\n HttpRequest.xhrs.push(this);\n\n xhr.open(this._method, url, this._async);\n\n for (const header in headers) {\n if (headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n\n if (this._timeout) {\n xhr.timeout = this._timeout;\n }\n\n if (\"ontimeout\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.ontimeout = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (\"onabort\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.onabort = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (this._onError || HttpRequest.onError) {\n xhr.onerror = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n\n if (this._async) {\n if (\"onload\" in xhr) {\n xhr.onload = (e: ProgressEvent) => {\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n if (xhr.status >= 200 && xhr.status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n };\n } else {\n // legacy\n (xhr as any).onreadystatechange = (e: Event) => {\n switch ((xhr as any).readyState) {\n // 0 UNSENT Client has been created. open() not called yet.\n // 1 OPENED open() has been called.\n // 2 HEADERS_RECEIVED send() has been called, and headers and status are available.\n // 3 LOADING Downloading; responseText holds partial data.\n // 4 DONE The operation is complete.\n // case 3: // loading\n // if (this._onProgress) {\n // this._onProgress(new HttpResponse(httpRequest));\n // }\n // break;\n case 4: // done\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n // const httpStatusOk = xhr.status >= 200 && xhr.status < 300;\n // schemes other than http/https (file, ftp)\n // const fileFtpStatusOk = xhr.status === 0 && !this._url.match(/^https?:\\/\\//);\n // const fileFtpStatusOk = xhr.status === 0 && !xhr.responseURL.match(/^https?:\\/\\//);\n // if (httpStatusOk || fileFtpStatusOk) {\n if ((xhr as any).status >= 200 && (xhr as any).status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n break;\n default:\n }\n };\n }\n\n if (data !== undefined) {\n if (\n typeof data === \"string\" ||\n data instanceof FormData ||\n data instanceof Blob\n ) {\n xhr.send(data);\n } else {\n if (!this._headers[\"Content-Type\"]) {\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n }\n xhr.send(JSON.stringify(data));\n }\n } else {\n xhr.send();\n }\n } else {\n if (data) {\n const payload = (typeof data === \"string\") ? data : JSON.stringify(data);\n xhr.send(payload);\n } else {\n xhr.send();\n }\n return JSON.parse(xhr.responseText);\n }\n }\n\n}\n\n\nexport function get(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"GET\").url(url, query);\n}\n\nexport function post(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"POST\").url(url, query);\n}\n\nexport function put(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PUT\").url(url, query);\n}\n\nexport function patch(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PATCH\").url(url, query);\n}\n\nexport function del(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"DELETE\").url(url, query);\n}\n\nexport function onRequest(onRequest: (req: HttpRequest) => void): void {\n HttpRequest.onRequest = onRequest;\n}\n\nexport function onResponse(onResponse: (req: HttpResponse) => void): void {\n HttpRequest.onResponse = onResponse;\n}\n\nexport function onError(onError: (req: Event) => void): void {\n HttpRequest.onError = onError;\n}\n\nexport const http = {\n get,\n post,\n put,\n delete: del,\n onRequest,\n onResponse,\n onError\n};\n","\nexport function scriptLib(url: string,\n namespace: string,\n callback?: (lib: any) => void): void {\n script(url, () => {\n const lib = (window as any)[namespace];\n (window as any)[namespace] = {};\n delete (window as any)[namespace];\n callback && callback(lib);\n });\n}\n\nexport function script(url: string, callback?: () => void): void {\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.charset = \"utf-8\";\n script.src = url;\n if ((script as any).readyState) { // IE\n (script as any).onreadystatechange = () => {\n const loaded = (script as any).readyState === \"loaded\";\n const completed = (script as any).readyState === \"complete\";\n if (loaded || completed) {\n (script as any).onreadystatechange = null;\n if (typeof callback === \"function\") {\n callback();\n }\n }\n };\n } else { // Others\n script.onload = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n }\n document.getElementsByTagName(\"head\")[0].appendChild(script);\n}\n\nexport function scripts(urls: string[], callback?: () => void): void {\n urls.reverse();\n let callbackTmp = callback;\n for (let i = 0; i < urls.length; i++) {\n const url = urls[i];\n callbackTmp = (\n (url, callbackTmp) => () =>\n script(url, () => callbackTmp && callbackTmp())\n )(url, callbackTmp);\n }\n callbackTmp && callbackTmp();\n}\n\nexport function image(url: string, callback?: () => void): void {\n const img = new Image();\n img.src = url;\n if ((img as any).readyState) {\n (img as any).onreadystatechange = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n } else {\n img.onload = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n }\n}\n\nexport function css(url: string, callback?: () => void): void {\n const link = <HTMLLinkElement> document.createElement(\"link\");\n link.type = \"text/css\";\n link.rel = \"stylesheet\";\n link.href = url;\n if ((link as any).readyState) {\n (link as any).onreadystatechange = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n } else {\n link.onload = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n }\n document.getElementsByTagName(\"head\")[0].appendChild(link);\n}\n","\nexport function objPaths(obj: object): string[][] {\n const valPaths = objValuePaths(obj);\n return Object.keys(valPaths)\n .map(val => valPaths[val])\n .reduce((a, paths) => a.concat(paths));\n}\n\nexport function objValuePaths(obj: any, root: string[] = [], result: object = {}): any {\n const ok = Object.keys(obj);\n return ok.reduce<any>((res, key) => {\n const path = root.concat(key);\n typeof obj[key] === \"object\" && obj[key] !== null\n ? objValuePaths(obj[key], path, res)\n : res[obj[key]] === 0 || res[obj[key]]\n ? res[obj[key]].push(path)\n : (res[obj[key]] = [path]);\n return res;\n }, result);\n}\n\n\n// TEST\n\n// const obj = {\n// obj1: {\n// obj2: {\n// data1: 213,\n// data2: \"1231\",\n// obj3: {\n// data: \"milf\"\n// }\n// }\n// },\n// obj4: {\n// description: \"toto\",\n// cougars: \"Jodi\",\n// category: \"milf\"\n// }\n// };\n\n// const vpaths = objValuePaths(obj);\n// const paths = objPaths(obj);\n// const strPaths = paths.map(p => p.join(\".\"));\n\n// console.log(JSON.stringify(obj, null, 4));\n// console.log(JSON.stringify(vpaths, null, 4));\n// console.log(JSON.stringify(paths, null, 4));\n// console.log(JSON.stringify(strPaths, null, 4));\n","// implemented based on https://github.com/mench/hash-router/\n\ntype Path = string | RegExp | Array<string>;\n\nexport type Keys = { name: string; optional: boolean }[];\n\nexport class Emitter {\n\n private _callbacks: { [key: string]: Function[] } = {};\n\n on(event: string, fn: Function): this {\n if (!(event in this._callbacks)) {\n this._callbacks[event] = [];\n }\n this._callbacks[event].push(fn);\n return this;\n }\n\n emit(event: string, ...args: any[]): this {\n if (event in this._callbacks) {\n this._callbacks[event].forEach(cb => cb.apply(this, args));\n }\n return this;\n }\n\n off(event: string, fn?: Function) {\n if (!this._callbacks || arguments.length === 0) {\n this._callbacks = {};\n return this;\n }\n const callbacks = this._callbacks[event];\n if (!callbacks) {\n return this;\n }\n if (arguments.length === 1) {\n delete this._callbacks[event];\n return this;\n }\n for (let i = 0; i < callbacks.length; i++) {\n const callback = callbacks[i];\n if (callback === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n return this;\n }\n}\n\nexport class Route {\n\n private _regex!: RegExp;\n private _params: any = {};\n\n readonly path: string;\n readonly keys: Keys = [];\n\n constructor(path: string) {\n this.path = path;\n this._pathParse(path, false, false);\n }\n\n match(path: string, params: string[]) {\n const m = this._regex.exec(path);\n if (!m) {\n return false;\n }\n for (let i = 1; i < m.length; ++i) {\n const key = this.keys[i - 1];\n const val = \"string\" === typeof m[i] ? decodeURIComponent(m[i]) : m[i];\n if (key) {\n this._params[key.name] = val;\n }\n params.push(val);\n }\n return true;\n }\n\n private _pathParse(path: Path, sensitive: boolean, strict: boolean): void {\n if (path instanceof RegExp) {\n this._regex = path;\n return;\n }\n if (path instanceof Array) {\n path = \"(\" + path.join(\"|\") + \")\";\n }\n path = path\n .concat(strict ? \"\" : \"/?\")\n .replace(/\\/\\(/g, \"(?:/\")\n .replace(/\\+/g, \"__plus__\")\n .replace(\n /(\\/)?(\\.)?:(\\w+)(?:(\\(.*?\\)))?(\\?)?/g,\n (\n _: any,\n slash: string,\n format: string,\n key: string,\n capture: boolean,\n optional: boolean\n ) => {\n this.keys.push({ name: key, optional: !!optional });\n slash = slash || \"\";\n return (\n \"\" +\n (optional ? \"\" : slash) +\n \"(?:\" +\n (optional ? slash : \"\") +\n (format || \"\") +\n (capture || ((format && \"([^/.]+?)\") || \"([^/]+?)\")) +\n \")\" +\n (optional || \"\")\n );\n }\n )\n .replace(/([\\/.])/g, \"\\\\$1\")\n .replace(/__plus__/g, \"(.+)\")\n .replace(/\\*/g, \"(.*)\");\n this._regex = new RegExp(\"^\" + path + \"$\", sensitive ? \"\" : \"i\");\n }\n\n}\n\nexport class Router extends Emitter {\n\n static default: Router = new Router();\n\n static route(path: string, handler: Function): Router {\n Router.default.route(path, handler);\n return Router.default;\n }\n\n static navigate(path: string, force = false): Router {\n Router.default.navigate(path, force);\n return Router.default;\n }\n\n static start(): Router {\n Router.default.start();\n return Router.default;\n }\n\n static hash(): string {\n return Router.default.hash();\n }\n\n static handle(hash: string): Router {\n return Router.default.handle(hash);\n }\n\n private _routes: Route[] = [];\n\n constructor() {\n super();\n if (window.addEventListener) {\n window.addEventListener(\"hashchange\", this._onHashChange, false);\n } else {\n (window as any).attachEvent(\"onhashchange\", this._onHashChange);\n }\n }\n\n route(path: string, handler: Function): this {\n const route = new Route(path);\n this._routes.push(route);\n this.on(path, (params: any, route: any) => {\n return handler.apply(route, params);\n });\n return this;\n }\n\n navigate(path: string, force = false): this {\n const hash = this.hash();\n window.location.hash = path;\n if (force && hash === path) {\n this.handle(path);\n }\n return this;\n }\n\n start(): this {\n this._onHashChange();\n return this;\n }\n\n hash(): string {\n return window.location.hash.substring(1);\n }\n\n handle(hash: string): this {\n for (const route of this._routes) {\n const params: string[] = [];\n if (route.match(hash, params)) {\n this.emit(route.path, params, route);\n break;\n }\n }\n return this;\n }\n\n private _onHashChange = () => {\n this.handle(this.hash());\n }\n\n}\n\nexport function route(path: string, handler: Function) {\n return Router.route(path, handler);\n}\n","import { Events } from \"./events\";\n\nexport class Settings<T extends { [key: string]: any }> {\n\n readonly name: string;\n readonly props: T;\n\n readonly events = new Events<T & { \"\": Partial<T> }, Settings<T>>();\n\n constructor(props: T, name: string = \"settings\") {\n this.props = props;\n this.name = name;\n }\n\n getProps(): T {\n return this.props;\n }\n\n setProps(props: Partial<T>): this {\n Object.keys(props).forEach(p => ((this.props as any)[p] = props[p]));\n this.events.emit(\"\", props);\n return this;\n }\n\n getProp<K extends keyof T>(key: K): T[K] {\n return (this.props)[key];\n }\n\n setProp<K extends keyof T>(key: K, value: T[K]): this {\n (this.props)[key] = value;\n const props: Partial<T> = {};\n props[key] = value;\n this.events.emit(key as string, value);\n return this;\n }\n\n}\n\n// Test\n\n// const x = { n: 2, s: \"s\" };\n// const s = new Settings<typeof x>(x);\n\n// s.setProps({ n: 3 });\n\n// console.log(typeof s.getProp(\"n\")); // number\n// console.log(typeof s.getProp(\"s\")); // string\n\n// s.setProps(JSON.parse(window.localStorage[s.name]));\n// s.events.any(data => (window.localStorage[s.name] = JSON.stringify(s.props)));\n","\nexport type SlotCallback<T> = (data?: T) => void;\n\ninterface Slot<T> {\n callback: SlotCallback<T>;\n object?: any;\n}\n\nexport interface Sig<T> {\n onConnect(onConnect: (connNo: number) => void): void;\n onDisconnect(onDisconnect: (connNo: number) => void): void;\n connNo(): number;\n connect(callback: SlotCallback<T>, object?: any): void;\n disconnect(callback: SlotCallback<T>, object?: any): void;\n disconnectAll(): void;\n freeze(): void;\n unfreeze(): void;\n}\n\nexport class Signal<T> implements Sig<T> {\n\n private _slots: Slot<T>[] = [];\n private _emit: boolean = true;\n\n private _onConnect?: ((connNo: number) => void);\n private _onDisconnect?: ((connNo: number) => void);\n\n constructor() {\n }\n\n onConnect(onConnect: (connNo: number) => void): void {\n this._onConnect = onConnect;\n }\n\n onDisconnect(onDisconnect: (connNo: number) => void): void {\n this._onDisconnect = onDisconnect;\n }\n\n connNo(): number {\n return this._slots.length;\n }\n\n // ES5\n // set slot(slot:(data?:T) => void) {\n // this.connect(slot);\n // }\n\n connect(callback: (data?: T) => void): void;\n connect(callback: (data?: T) => void, object?: Object): void;\n connect(callback: (data?: any) => void, object?: Object): void {\n if (typeof callback !== \"function\") return;\n if (object) {\n this._slots.push({ callback: callback, object: object });\n } else {\n this._slots.push({ callback: callback });\n }\n if (this._onConnect) {\n this._onConnect(this._slots.length);\n }\n }\n\n disconnect(callback: (data?: T) => void, object?: Object): void {\n if (typeof callback !== \"function\") return;\n this._slots = this._slots.filter(slot => {\n return (object === undefined) ?\n (slot.callback !== callback) :\n (slot.callback !== callback) && (slot.object !== object);\n });\n if (this._onDisconnect) {\n this._onDisconnect(this._slots.length);\n }\n }\n\n disconnectAll(): void {\n this._slots = [];\n if (this._onDisconnect) {\n this._onDisconnect(this._slots.length);\n }\n }\n\n freeze(): void {\n this._emit = false;\n }\n\n unfreeze(): void {\n this._emit = true;\n }\n\n emit(this: Signal<void>): any[];\n emit(this: Signal<T>, data?: T): any[];\n emit(this: Signal<any>, data?: any): any[] {\n if (this._emit && this._slots.length) {\n return this._slots.map(slot => {\n const object: Object = slot.object;\n if (object) {\n return slot.callback.call(object, data);\n } else {\n return slot.callback(data);\n }\n });\n }\n return [];\n }\n\n /*\n emitAsync(this: Signal<void>): void;\n emitAsync(this: Signal<T>, data?: T): void;\n emitAsync(this: Signal<any>, data?: any): void {\n if (this._emit && this._slots.length) {\n this._slots.forEach(slot => {\n const object: Object = slot.object;\n if (object) {\n setTimeout(() => {\n slot.callback.call(object, data);\n });\n } else {\n setTimeout(() => {\n slot.callback(data);\n });\n }\n });\n }\n }\n */\n\n}\n","// https://gist.github.com/WebReflection/8f227532143e63649804\n// accepts optional transformer\n// now transformers are compatible with ES6\n//\n// examples:\n// 'test1 ${1 + 2} test2 ${3 + 4}'.template();\n// 'Hello ${name}!'.template({name: 'Andrea'});\n//\n/*\n\nString.prototype[\"template\"] = function (fn, object) {\n \"use strict\";\n // Andrea Giammarchi - WTFPL License\n let\n hasTransformer = typeof fn === \"function\",\n stringify = JSON.stringify,\n re = /\\$\\{([\\S\\s]*?)\\}/g,\n strings = [],\n values = hasTransformer ? [] : strings,\n i = 0,\n str,\n m\n ;\n while ((m = re.exec(this))) {\n str = this.slice(i, m.index);\n if (hasTransformer) {\n strings.push(str);\n values.push(\"(\" + m[1] + \")\");\n } else {\n strings.push(stringify(str), \"(\" + m[1] + \")\");\n }\n i = re.lastIndex;\n }\n str = this.slice(i);\n strings.push(hasTransformer ? str : stringify(str));\n if (hasTransformer) {\n str = \"function\" + (Math.random() * 1e5 | 0);\n strings = [\n str,\n \"with(this)return \" + str + \"(\" + stringify(strings) + (\n values.length ? (\",\" + values.join(\",\")) : \"\"\n ) + \")\"\n ];\n } else {\n strings = [\"with(this)return \" + strings.join(\"+\")];\n }\n return Function.apply(null, strings).call(\n hasTransformer ? object : fn,\n hasTransformer && fn\n );\n};\n*/\n\n/**\n * Template with same syntax as template literal\n *\n * @param templateOrId\n * @param data\n * @returns {(data: Object) => string | string}\n */\nexport function tmpl(templateOrId: string, data?: Object) {\n const template = !/[^a-zA-Z0-9_-]+/.test(templateOrId)\n ? document.getElementById(templateOrId)!.innerHTML\n : templateOrId;\n let\n stringify = JSON.stringify,\n re = /\\$\\{([\\S\\s]*?)\\}/g,\n strings: any[] = [],\n i = 0,\n str: string,\n m: RegExpExecArray | null;\n while ((m = re.exec(template))) {\n str = template.slice(i, m.index);\n strings.push(stringify(str), \"(\" + m[1] + \")\");\n i = re.lastIndex;\n }\n str = template.slice(i);\n strings.push(stringify(str));\n const fn = new Function(\"obj\", \"with(obj)return \" + strings.join(\"+\"));\n return data ? fn(data) : fn;\n}\n\n\nconst template_cache: any = {};\n\n/**\n * Template engine\n *\n * @param templateOrId\n * @param data\n * @returns {(data:Object)=>string|string}\n */\nexport function template(templateOrId: string, data?: any) {\n // Simple JavaScript Templating\n // John Resig - http://ejohn.org/ - MIT Licensed\n // Figure out if we're getting a template, or if we need to\n // load the template - and be sure to cache the result.\n // var fn = !/\\W/.test(str) ?\n const fn: Function = !/[^a-zA-Z0-9_-]+/.test(templateOrId) ?\n template_cache[templateOrId] = template_cache[templateOrId] ||\n template(document.getElementById(templateOrId)!.innerHTML) :\n // Generate a reusable function that will serve as a template\n // generator (and which will be cached).\n new Function(\"obj\",\n \"var p=[],print=function(){p.push.apply(p,arguments);};\" +\n // Introduce the data as local variables using with(){}\n \"with(obj){p.push('\" +\n // Convert the template into pure JavaScript\n templateOrId\n .replace(/[\\r\\t\\n]/g, \" \")\n .split(\"<%\").join(\"\\t\")\n .replace(/((^|%>)[^\\t]*)'/g, \"$1\\r\")\n .replace(/\\t=(.*?)%\\>/g, \"',$1,'\")\n .split(\"\\t\").join(\"');\")\n .split(\"%>\").join(\"\\np.push('\")\n .split(\"\\r\").join(\"\\\\'\")\n + \"');}return p.join('');\");\n // Provide some basic currying to the user\n return data ? fn(data) : fn;\n}\n","/**\n * ```\n * const dataStrObject = { a: \"A\", b: \"B\" };\n * console.log(\"tmpls: {{a}} {{b}} {{a}}\", \"|\", tmpls(\"tmpls: {{a}} {{b}} {{a}}\", dataStrObject));\n *\n * const dataStrArray = [\"A\", \"B\"];\n * console.log(\"tmpls: {{0}} {{1}} {{0}}\", \"|\", tmpls(\"tmpla: {{0}} {{1}} {{0}}\", dataStrArray));\n * ```\n *\n * @param tmpl Template string\n * @param data Template data\n */\nexport function tmpls(tmpl: string, data: { [k: string]: any }): string {\n return Object.keys(data)\n .map(k => [k, data[k]])\n .reduce((t, d) =>\n t.replace(new RegExp(`\\\\{\\\\{${d[0]}\\\\}\\\\}`, \"g\"), String(d[1])), tmpl);\n}\n\n/**\n * ```\n * const dataArray = [\"A\", \"B\"];\n * console.log(\"tmpla: ${0} ${1} ${0}\", \"|\", tmpla(\"tmpla: ${0} ${1} ${0}\", dataArray));\n * ```\n *\n * @param tmpl Template string\n * @param data Template data\n */\nexport function tmpla(tmpl: string, data: string[]): string {\n return data.reduce((t, d, i) => t.replace(new RegExp(`\\\\$\\\\{${i}\\\\}`, \"g\"), d), tmpl);\n}\n\n/**\n * ```\n * const dataObject = { a: \"A\", b: \"B\" };\n * console.log(\"tmplo: ${a} ${b} ${a}\", \"|\", tmplo(\"tmplo: ${a} ${b} ${a}\", dataObject));\n * ```\n *\n * @param tmpl Template string\n * @param data Template data\n */\nexport function tmplo(tmpl: string, data: { [k: string]: string }): string {\n return Object.keys(data)\n .map(k => [k, data[k]])\n .reduce((t, d) => t.replace(new RegExp(`\\\\$\\\\{${d[0]}\\\\}`, \"g\"), d[1]), tmpl);\n}\n\n/**\n * const t = tmpl<typeof dataObject>(\"tmpl : ${a} ${b} ${a}\");\n * console.log(\"tmpl : ${a} ${b} ${a}\", \"|\", t(dataObject));\n * console.log(\"tmpl : \", t);\n *\n * const tl = tmpl(\"1+2=${1 + 2} 3+x=${3 + x[1]}\");\n * console.log(\"tmpl : 1+2=${1 + 2} 3+x=${3 + x[1]}\", \"|\", tl({ x: [2] }));\n * console.log(\"tmpl : \", tl);\n *\n * @param template Template string\n */\nexport function tmpl<T = any>(template: string): (data: { [key in keyof T]: any }) => string {\n const stringify = JSON.stringify;\n const re = /\\$\\{([\\S\\s]*?)\\}/g;\n const strings: string[] = [];\n let m: RegExpExecArray | null;\n let i = 0;\n let str: string;\n while ((m = re.exec(template))) {\n str = template.slice(i, m.index);\n strings.push(stringify(str), \"(\" + m[1] + \")\");\n i = re.lastIndex;\n }\n str = template.slice(i);\n strings.push(stringify(str));\n const fn = new Function(\"obj\", \"with(obj)return \" + strings.join(\"+\"));\n return fn as (data: Object) => string;\n}\n\n// TEST\n\n// const dataStrObject = { a: \"A\", b: \"B\" };\n// console.log(\"tmpls: {{a}} {{b}} {{a}}\", \"|\", tmpls(\"tmpls: {{a}} {{b}} {{a}}\", dataStrObject));\n\n// const dataStrArray = [\"A\", \"B\"];\n// console.log(\"tmpls: {{0}} {{1}} {{0}}\", \"|\", tmpls(\"tmpla: {{0}} {{1}} {{0}}\", dataStrArray));\n\n// const dataArray = [\"A\", \"B\"];\n// console.log(\"tmpla: ${0} ${1} ${0}\", \"|\", tmpla(\"tmpla: ${0} ${1} ${0}\", dataArray));\n\n// const dataObject = { a: \"A\", b: \"B\" };\n// console.log(\"tmplo: ${a} ${b} ${a}\", \"|\", tmplo(\"tmplo: ${a} ${b} ${a}\", dataObject));\n\n// const t = tmpl<typeof dataObject>(\"tmpl : ${a} ${b} ${a}\");\n// console.log(\"tmpl : ${a} ${b} ${a}\", \"|\", t(dataObject));\n// console.log(\"tmpl : \", t);\n\n// const tl = tmpl(\"1+2=${1 + 2} 3+x=${3 + x[1]}\");\n// console.log(\"tmpl : 1+2=${1 + 2} 3+x=${3 + x[1]}\", \"|\", tl({ x: [2] }));\n// console.log(\"tmpl : \", tl);\n","import * as debounce from \"./debounce\";\nimport * as dom from \"./dom\";\nimport * as encode from \"./encode\";\nimport * as events from \"./events\";\nimport * as form from \"./form\";\nimport * as hash from \"./hash\";\nimport * as history from \"./history\";\nimport * as hsmlapp from \"./hsml-app\";\nimport * as hsmldom from \"./hsml-dom\";\nimport * as hsmlh from \"./hsml-h\";\nimport * as hsmlhtml from \"./hsml-html\";\nimport * as hsmlidom from \"./hsml-idom\";\nimport * as hsmlsvacctrl from \"./hsml-svac-ctrl\";\nimport * as hsmlsvachtml from \"./hsml-svac-html\";\nimport * as hsmlsvac from \"./hsml-svac\";\nimport * as hsmlwidget from \"./hsml-widget\";\nimport * as hsml from \"./hsml\";\nimport * as http from \"./http\";\nimport * as load from \"./load\";\nimport * as objpaths from \"./objpaths\";\nimport * as router from \"./router\";\nimport * as settings from \"./settings\";\nimport * as signal from \"./signal\";\nimport * as template from \"./template\";\nimport * as tmpl from \"./tmpl\";\nimport * as validators from \"./validators\";\n\nexport {\n debounce,\n dom,\n encode,\n events,\n form,\n hash,\n history,\n hsmlapp,\n hsmldom,\n hsmlh,\n hsmlhtml,\n hsmlidom,\n hsmlsvacctrl,\n hsmlsvachtml,\n hsmlsvac,\n hsmlwidget,\n hsml,\n http,\n load,\n objpaths,\n router,\n settings,\n signal,\n template,\n tmpl,\n validators\n};\n"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///./src/hsml.ts","webpack:///external \"IncrementalDOM\"","webpack:///./src/hsml-idom.ts","webpack:///./src/validators.ts","webpack:///./src/events.ts","webpack:///./src/hsml-html.ts","webpack:///./src/debounce.ts","webpack:///./src/dom.ts","webpack:///./src/encode.ts","webpack:///./src/form.ts","webpack:///./src/hash.ts","webpack:///./src/history.ts","webpack:///./src/hsml-app.ts","webpack:///./src/hsml-dom.ts","webpack:///./src/hsml-h.ts","webpack:///./src/hsml-svac-ctrl.ts","webpack:///./src/hsml-svac-html.ts","webpack:///./src/hsml-widget.ts","webpack:///./src/http.ts","webpack:///./src/load.ts","webpack:///./src/objpaths.ts","webpack:///./src/router.ts","webpack:///./src/settings.ts","webpack:///./src/signal.ts","webpack:///./src/template.ts","webpack:///./src/tmpl.ts","webpack:///./src/index.ts"],"names":["root","factory","exports","module","require","define","amd","a","i","window","__WEBPACK_EXTERNAL_MODULE__1__","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","NBSP","hsml","hml","handler","ctx","constructor","Array","hmlTag","console","error","head","attrsObj","hasAttrs","hFnc","hObj","children","htc","Function","String","Boolean","Number","Date","refSplit","split","ref","dotSplit","hashSplit","tag","id","classes","slice","attrs","_id","length","_classes","_ref","_hObj","skip","open","fnc","forEach","jml","close","hsmlTag","text","toLocaleString","toString","ds","obj","hsmls","sep","reduce","push","splice","HsmlIDomHandler","props","attrClasses","concat","map","undefined","filter","attrData","JSON","stringify","attrOn","e","actionCb","attr","unshift","join","idom","elementOpen","_key","_skip","refs","currentElement","mount","elementClose","toHsml","this","hsml2idom","node","hsmlEl","patch","data","hsmlFr","hmls","hsmls2idom","emailRegex","phoneRgex","pscRgex","rodneCisloRgex","Validator","opts","msgs","str","err","v","sto","strToObj","objCheck","format","ots","objToStr","tpl","tmpl","keys","k","replace","RegExp","super","required","options","indexOf","invalid_option","option","min","max","regexp","test","invalid_format","not_in_range","isNaN","strict","num","toFixed","decimals","dateToLocaleString","date","dateToLocaleDateString","toLocaleDateString","dateToIsoString","toISOString","dateToIsoDateString","toDateString","iso","dateToStr","dateOnly","getFullYear","getMonth","getDate","dt","parse","getTime","b","invalid_value","validators","field","validator","res","validate","valid","_cb","_cbs","_ctx","ev","cb","wrap","evt","off","on","HsmlHtmlHandler","onHtml","pretty","indent","_depth","_onHtml","_pretty","_indent","attrStyles","style","toLowerCase","type","args","escapeHtml","html","_mkIndent","_pairTags","render","pairTag","count","hsml2html","hsmls2html","htmls","escapeHtmlRegExp","exec","esc","escHtml","idx","lastIdx","index","charCodeAt","substring","debounce","func","delay","timeout","clearTimeout","setTimeout","apply","target","propertyKey","descriptor","method","selector","element","qsa","document","querySelectorAll","querySelector","elements","appendChild","oldElement","newElement","parentElement","replaceChild","removeChild","firstChild","trim","wrapMap","legend","area","param","thead","tr","col","td","body","_default","optgroup","tbody","tfoot","colgroup","caption","th","match","el","createElement","innerHTML","attributes","setAttribute","j","lastChild","Element","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","ownerDocument","item","event","listener","useCapture","addEventListener","srcElement","removeEventListener","prefix","params","size","valueLength","val","arguments","callee","encodeURIComponent","paramsLength","parameter","decodeURIComponent","path","Base64","u","f","_utf8_encode","_keyStr","charAt","fromCharCode","_utf8_decode","c1","c2","_element","getElementById","_onChange","locale","_validator","callback","_decimals","_dragSensitivity","setDecimals","step","onMouseWheel","cursor","initialY","pageY","getValue","onMouseMove","diffY","newValue","setValue","onMouseUp","checked","remove","opt","add","_elements","files","_formEntries","onsubmit","preventDefault","_onSubmit","entry","entries","getName","errors","values","submit","hashJsonEncoder","hashJsonDecoder","hashUrlEncoder","hashUrlDecoder","dpath","dquery","query","append","URLSearchParams","pathStr","queryStr","emitWritten","_encode","_decode","_emitWritten","encode","decode","read","onhashchange","written","_writtenDataJson","alert","location","hash","history","back","forward","delta","go","state","title","url","pushState","replaceState","log","HAppAction","schedule","requestAnimationFrame","unschedule","cancelAnimationFrame","handle","HApp","view","dispatcher","dispatch","debug","t0","performance","now","update","t1","action","nodeName","els","formInputData","names","formData","app","umount","dom","updateDom","_onUpdate","_mount","_umount","hasAttribute","removeAttribute","aNodes","_updateSched","onUpdate","toHtml","outerHTML","_init","then","hsmls2idomPatch","iel","sel","multiple","from","selectedOptions","tel","bel","HsmlDomHandler","dataset","classList","_current","createTextNode","hsml2dom","elems","second","third","result","isArray","component","ctrl","HCtrl","extAction","_count","appAction","appActions","_extAction","_actions","innerText","_ctrls","cNodes","actions","notifications","nodesDeleted","nodes","nodeType","actionHtml","mountHtml","hsmls2htmls","HWidget","w","widget","mounted","onMount","onUmount","wNodes","propertyIsEnumerable","encodeUrlQuery","key_value_pairs","pair","substr","HttpResponse","xhr","_xhr","getAllResponseHeaders","header","getResponseHeader","response","responseType","getHeader","responseText","responseXML","authBasic","login","password","req","headers","btoa","HttpRequest","_method","_headers","_async","_noCache","xhrs","x","abort","_url","_query","middleware","_timeout","_responseType","onProgress","_onProgress","onResponse","_onResponse","onError","_onError","async","noCache","contentType","_send","Promise","rej","XMLHttpRequest","onprogress","loaded","total","lengthComputable","upload","setRequestHeader","ontimeout","onabort","onerror","payload","send","onload","status","respone","onreadystatechange","readyState","FormData","Blob","post","put","del","onRequest","http","delete","script","charset","src","completed","getElementsByTagName","namespace","lib","urls","reverse","callbackTmp","img","Image","link","rel","href","objValuePaths","valPaths","paths","Emitter","_callbacks","fn","callbacks","Route","_params","_pathParse","_regex","sensitive","_","slash","capture","optional","Router","_routes","_onHashChange","attachEvent","default","route","force","navigate","start","emit","events","Events","_slots","_emit","onConnect","_onConnect","onDisconnect","_onDisconnect","slot","templateOrId","template","re","strings","lastIndex","template_cache","form","hsmlapp","hsmldom","hsmlh","hsmlhtml","hsmlidom","hsmlsvacctrl","hsmlsvachtml","hsmlsvac","hsmlwidget","load","objpaths","router","settings","signal"],"mappings":"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","file":"index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"IncrementalDOM\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"IncrementalDOM\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"IncrementalDOM\")) : factory(root[\"IncrementalDOM\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__1__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 30);\n","\nexport type HHead = keyof HTMLElementTagNameMap | string; // \"tag#id.class1.class2~handler\"\n\nexport type HAttrClasses = Array<string | [string, boolean]>;\n\nexport type HAttrStyles = { [key: string]: string };\n\nexport type HAttrData = {\n [key: string]:\n | string\n | String\n | number\n | Number\n | boolean\n | Boolean\n | Date\n | Array<any>\n | Object;\n};\n\nexport type HAttrOnAction = string;\n\nexport type HAttrOnDataFnc = (e: Event) => any;\n\nexport type HAttrOnData =\n | string\n | String\n | number\n | Number\n | boolean\n | Boolean\n | Date\n | Array<any>\n | Object\n | HAttrOnDataFnc\n | null;\n\nexport type HAttrOnCb = [keyof HTMLElementEventMap, EventListener];\n\nexport type HAttrOnAct = [\n keyof HTMLElementEventMap,\n HAttrOnAction,\n HAttrOnData?\n];\n\nexport type HAttrOn = HAttrOnCb | HAttrOnAct | Array<HAttrOnCb | HAttrOnAct>;\n\nexport interface HAttrs {\n readonly _id?: string;\n readonly _classes?: string[];\n readonly _ref?: string;\n readonly _key?: string;\n readonly _skip?: boolean;\n readonly _hObj?: HObj;\n readonly classes?: HAttrClasses;\n readonly styles?: HAttrStyles;\n readonly data?: HAttrData;\n readonly on?: HAttrOn;\n readonly [key: string]:\n | string\n | String\n | string[]\n | String[]\n | number\n | Number\n | boolean\n | Boolean\n | Date\n | HAttrClasses\n | HAttrStyles\n // | HsmlAttrData\n | HAttrOn\n | EventListener\n | HObj\n | undefined;\n}\n\nexport type HFnc = (e: Element) => boolean | void;\n\nexport interface HObj {\n toHsml?(): HElement;\n}\n\nexport interface HElements extends Array<HElement> {}\n\nexport type HChildren =\n | HElements\n | HFnc\n | HObj\n | string\n | String\n | boolean\n | Boolean\n | number\n | Number\n | Date\n | undefined\n | null;\n\nexport type HTagNoAttr = [HHead, HChildren?];\nexport type HTagAttr = [HHead, HAttrs, HChildren?];\n\nexport type HTag = HTagNoAttr | HTagAttr;\n\nexport type HElement =\n | HFnc\n | HObj\n | HTag\n | string\n | String\n | boolean\n | Boolean\n | number\n | Number\n | Date\n | undefined\n | null;\n\nexport interface HHandlerCtx extends HObj {\n refs: { [name: string]: Element };\n actionCb(action: HAttrOnAction, data: HAttrOnData, e: Event): void;\n}\n\nexport interface HHandler<C extends HHandlerCtx> {\n open(tag: HHead, attrs: HAttrs, children: HElements, ctx?: C): boolean;\n close(tag: HHead, children: HElements, ctx?: C): void;\n text(text: string, ctx?: C): void;\n fnc(fnc: HFnc, ctx?: C): void;\n obj(obj: HObj, ctx?: C): void;\n}\n\nexport const NBSP = \"\\u00a0 \";\n\nexport function hsml<C extends HHandlerCtx>(hml: HElement,\n handler: HHandler<C>,\n ctx?: C): void {\n // console.log(\"hsml\", hsml);\n if (hml === undefined || hml === null) {\n return;\n }\n switch (hml.constructor) {\n case Array:\n // const tag = hml as HTag;\n // if (\n // (\n // tag.length === 1 &&\n // tag[0].constructor === String\n // ) ||\n // (\n // tag.length === 2 &&\n // (\n // tag[0].constructor === String &&\n // (tag[1]!.constructor === Array || tag[1]!.constructor === Function)\n // ) ||\n // (\n // tag[0].constructor === String &&\n // tag[1]!.constructor === Object\n // )\n // ) ||\n // (\n // tag.length === 3 &&\n // tag[0].constructor === String &&\n // tag[1].constructor === Object &&\n // tag[2]!.constructor === Array\n // )\n // ) {\n // hsmlTag(hml as HTag, handler, ctx);\n // } else {\n // console.error(\"hsml parse error:\", hml);\n // // console.error(\"hsml parse error:\", JSON.stringify(hml, null, 4));\n // // throw Error(`hsml parse error: ${JSON.stringify(hml)}`);\n // }\n hsmlTag(hml as HTag, handler, ctx);\n break;\n case Function:\n handler.fnc(hml as HFnc, ctx);\n break;\n case String:\n handler.text(hml as string, ctx);\n break;\n case Boolean:\n handler.text(\"\" + hml, ctx);\n break;\n case Number:\n const n = hml as number;\n const ns = n.toLocaleString ? n.toLocaleString() : n.toString();\n handler.text(ns, ctx);\n break;\n case Date:\n const d = hml as Date;\n const ds = d.toLocaleString ? d.toLocaleString() : d.toString();\n handler.text(ds, ctx);\n break;\n default: // HObj\n handler.obj(hml as HObj, ctx);\n }\n\n function hsmlTag(hmlTag: HTag, handler: HHandler<C>, ctx?: C): void {\n // console.log(\"hsml tag\", hmlTag);\n\n if (typeof hmlTag[0] !== \"string\") {\n console.error(\"HSML tag head not string:\", hmlTag);\n return;\n }\n\n const head = hmlTag[0] as HHead;\n const attrsObj = hmlTag[1] as any;\n const hasAttrs = attrsObj && attrsObj.constructor === Object;\n const childIdx = hasAttrs ? 2 : 1;\n\n let children: HElements = [];\n let hFnc: HFnc | undefined;\n let hObj: HObj | undefined;\n\n const htc = hmlTag[childIdx];\n switch (htc != null && htc.constructor) { // switch ((typeof htc !== \"undefined\" || htc !== null) && htc.constructor) {\n case Array:\n children = htc as HElements;\n break;\n case Function:\n hFnc = htc as HFnc;\n break;\n case String:\n case Boolean:\n case Number:\n case Date:\n children = [htc as string | boolean | number | Date];\n break;\n default: // HObj\n hObj = htc as HObj;\n break;\n }\n\n const refSplit = head.split(\"~\");\n const ref = refSplit[1];\n const dotSplit = refSplit[0].split(\".\");\n const hashSplit = dotSplit[0].split(\"#\");\n const tag = hashSplit[0] || \"div\";\n const id = hashSplit[1];\n const classes = dotSplit.slice(1);\n\n let attrs: HAttrs;\n if (hasAttrs) {\n attrs = attrsObj as HAttrs;\n } else {\n attrs = {} as HAttrs;\n }\n\n if (id) {\n (attrs as any)._id = id;\n }\n if (classes.length) {\n (attrs as any)._classes = classes;\n }\n if (ref) {\n (attrs as any)._ref = ref;\n }\n if (hObj) {\n (attrs as any)._hObj = hObj;\n }\n\n const skip = handler.open(tag, attrs, children, ctx);\n\n if (hFnc) {\n handler.fnc(hFnc, ctx);\n }\n\n if (!skip) {\n children.forEach(jml => hsml(jml, handler, ctx));\n }\n\n handler.close(tag, children, ctx);\n }\n}\n\nexport function hjoin(hsmls: HElements, sep: string | HElement): HElements {\n const r = hsmls.reduce<HElements>(\n (p, c) => (p.push(c, sep), p),\n [] as HElements\n );\n r.splice(-1);\n return r;\n}\n\n// Test\n\n// const hsmls: Hsmls = [\n// \"text\",\n// [\"tag\", [\n// \"d\",\n// [\"\"]\n// ]],\n// [\"taga\", { attr: \"attr\", classes: [\"class\"] }, [\n// \"text\",\n// 123,\n// true\n// ]]\n// ];\n\n// const hml: Hsml = [\"xxx\", {}, [\n// \"types\", \" \", 1235.456, \" \", new Date(), \" \",\n// ...hsmls,\n// [\"t\", [\"t\", \"a\", \"\"]],\n// [\"t\", {}, [\"t\", \"a\", \"\"]],\n// [\"t\"]\n// ]];\n\n// console.log(hsmls, hml);\n\n// const hml1: Hsml = [\"div\", null, [\n// [\"span\", null, [\n// [\"a\",\n// {\n// href: \"https://gitlab.com/peter-rybar/diasheet\",\n// title: \"GitLab\",\n// target: \"_blank\"\n// },\n// [[\"i.fa.fa-gitlab\"]]\n// ]\n// ]],\n// [\"span\"]\n// ]];\n// console.log(hml1);\n\n// const hml2: Hsml = [\"div\", [\n// [\"h2\", [\"title\"]],\n// [\"div.w3-card-12\", [\n// [\"header.w3-container w3-light-grey\", [\n// [\"h3\", [\"Account: \", \"User\"]]\n// ]],\n// [\"div.w3-container.w3-light-grey\", [\n// [\"p\", [\"Balance: 4 DCT\"]],\n// [\"br\"]\n// ]],\n// [\"h4\", [\"Your account spending\"]],\n// [\"div#piechart\"],\n// [\"h4\", [\"Your account balance\"]],\n// [\"div#linechart\"],\n// [\"button.w3-button.w3-block.w3-dark-grey\", [\"Refresh\"]]\n// ]],\n// [\"br\"]\n// ]];\n// console.log(hml2);\n\n// TEST\n\n// import { hsmls2htmls } from \"./hsml-html\";\n// import { HDispatch } from \"./hsml-app\";\n\n// const dispatch: HDispatch = (type: string, data?: any, event?: Event): void => {\n// console.log(\"action:\", type, data, event);\n// };\n\n// const data = { attr: \"action-data\" };\n\n// const hmls: HElements = [\n// [\"button\", { on: [\"click\", \"action\", data] }, \"send\"],\n// [\"h1\", \"aaa\"],\n// [\"input\",\n// {\n// type: \"text\",\n// on: [\n// [\"mouseover\", \"hover-action\", data],\n// [\"change\", \"click-action\", e => (e.target as HTMLInputElement).value],\n// [\"click\", e => dispatch(\"action\", data, e)],\n// ],\n// click: e => dispatch(\"action\", data, e)\n// }\n// ],\n// [\"button\",\n// {\n// on: [\"click\", e => dispatch(\"action\", data, e)],\n// click: e => dispatch(\"action\", data, e)\n// },\n// [\"Send\"]\n// ]\n// ];\n\n// console.log(hsmls2htmls(hmls, true).join(\"\"));\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1__;","import {\n hsml,\n HElement,\n HElements,\n HHead,\n HAttrs,\n HAttrClasses,\n HAttrData,\n HAttrStyles,\n HAttrOn,\n HAttrOnCb,\n HAttrOnAct,\n HAttrOnAction,\n HAttrOnData,\n HFnc,\n HObj,\n HHandler,\n HHandlerCtx\n} from \"./hsml\";\nimport * as idom from \"incremental-dom\";\n\n// function setBoolAttrProp(el: any, attr: string, value: any) {\n// // console.log(\"idom.attributes\", attr, value, typeof value, el);\n// if (typeof value === \"string\") {\n// let b;\n// switch (value) {\n// case \"true\":\n// case \"1\":\n// case \"on\":\n// case \"yes\":\n// b = true;\n// break;\n// default:\n// b = false;\n// }\n// if (b) {\n// el.setAttribute(attr, value);\n// } else {\n// el.removeAttribute(attr);\n// }\n// el[attr] = b;\n// } else if (typeof value === \"boolean\") {\n// if (value) {\n// el.setAttribute(attr, \"\");\n// } else {\n// el.removeAttribute(attr);\n// }\n// el[attr] = value;\n// } else {\n// if (value) {\n// el.setAttribute(attr, value ? value : \"\");\n// } else {\n// el.removeAttribute(attr);\n// }\n// }\n// }\n\n// const boolAttrProps = [\n// \"readonly\",\n// \"disabled\",\n// \"checked\",\n// \"value\"\n// ];\n\n// boolAttrProps.forEach(a => idom.attributes[a] = setBoolAttrProp);\n\nclass HsmlIDomHandler implements HHandler<HHandlerCtx> {\n\n open(tag: HHead, attrs: HAttrs, children: HElements, ctx?: HHandlerCtx): boolean {\n const props: any[] = [];\n let id = attrs._id;\n let classes: string[] = attrs._classes ? attrs._classes : [];\n let ref = attrs._ref;\n let hObj: any = attrs._hObj;\n for (const a in attrs) {\n if (attrs.hasOwnProperty(a)) {\n switch (a) {\n case \"_id\":\n case \"_classes\":\n case \"_ref\":\n case \"_key\":\n case \"_skip\":\n case \"_hObj\":\n break;\n case \"id\":\n id = attrs[a] as string;\n break;\n case \"classes\":\n const attrClasses = attrs[a] as HAttrClasses;\n classes = classes.concat(attrClasses\n ? attrClasses\n .map(c =>\n c.constructor === String\n ? c as string\n : (c[1] ? c[0] as string : undefined))\n .filter((c): c is string => c !== undefined)\n : [] as string[]);\n break;\n case \"class\":\n classes = classes.concat((attrs[a] as string).split(\" \"));\n break;\n case \"data\":\n const attrData = attrs[a] as HAttrData;\n for (const d in attrData) {\n if (attrData.hasOwnProperty(d)) {\n if (attrData[d].constructor === String) {\n props.push(\"data-\" + d, attrData[d]);\n } else {\n props.push(\"data-\" + d, JSON.stringify(attrData[d]));\n }\n }\n }\n break;\n case \"styles\":\n props.push(\"style\", attrs[a] as HAttrStyles);\n break;\n case \"on\":\n const attrOn = attrs[a] as HAttrOn;\n if (typeof attrOn[0] === \"string\") {\n if (typeof attrOn[1] === \"function\") {\n props.push(\"on\" + attrOn[0], attrOn[1]);\n } else {\n props.push(\"on\" + attrOn[0], (e: Event) => {\n ctx && ctx.actionCb &&\n typeof ctx.actionCb === \"function\" &&\n ctx.actionCb(attrOn[1] as HAttrOnAction,\n attrOn[2] as HAttrOnData,\n e);\n });\n }\n } else {\n (attrOn as Array<HAttrOnCb | HAttrOnAct>)\n .forEach(attr => {\n if (typeof attr[1] === \"function\") {\n props.push(\"on\" + attr[0], attr[1]);\n } else {\n props.push(\"on\" + attr[0], (e: Event) => {\n ctx && ctx.actionCb &&\n typeof ctx.actionCb === \"function\" &&\n ctx.actionCb(attr[1] as HAttrOnAction,\n attr[2] as HAttrOnData,\n e);\n });\n }\n });\n }\n break;\n default:\n // http://google.github.io/incremental-dom/#attributes-and-properties\n switch (typeof attrs[a]) {\n case \"function\":\n props.push(\"on\" + a, attrs[a]);\n break;\n case \"object\":\n // console.log(\"---\", a, typeof attrs[a], attrs[a]);\n // console.log(\"---String \", attrs[a] instanceof String);\n // console.log(\"---Boolean\", attrs[a] instanceof Boolean);\n // console.log(\"---Number \", attrs[a] instanceof Number);\n props.push(a, attrs[a]);\n break;\n // case \"boolean\":\n // if (boolAttrProps.includes(a)) {\n // props.push(a, attrs[a]);\n // } else {\n // attrs[a] && props.push(a, a);\n // }\n // break;\n case \"boolean\":\n attrs[a] && props.push(a, a);\n break;\n default:\n props.push(a, attrs[a]);\n break;\n }\n }\n }\n }\n if (classes.length) {\n props.unshift(\"class\", classes.join(\" \"));\n }\n if (id) {\n props.unshift(\"id\", id);\n }\n idom.elementOpen(tag, attrs._key, undefined, ...props);\n if (attrs._skip) {\n idom.skip();\n }\n if (ctx && ref) {\n ctx.refs[ref] = idom.currentElement();\n }\n if (hObj && hObj.mount && hObj.mount.constructor === Function) {\n hObj.mount(idom.currentElement());\n idom.skip();\n }\n return attrs._skip ? true : false;\n }\n\n close(tag: HHead, children: HElements, ctx?: HHandlerCtx): void {\n idom.elementClose(tag);\n }\n\n text(text: string, ctx?: HHandlerCtx): void {\n idom.text(text);\n }\n\n fnc(fnc: HFnc, ctx?: HHandlerCtx): void {\n const skip = fnc(idom.currentElement());\n skip && idom.skip();\n }\n\n obj(obj: HObj, ctx?: HHandlerCtx): void {\n if (\"toHsml\" in obj) {\n obj.toHsml && hsml(obj.toHsml(), this, obj as HHandlerCtx);\n } else {\n this.text(\"\" + obj, ctx);\n }\n }\n\n}\n\nfunction hsml2idom(hml: HElement, ctx?: HHandlerCtx): void {\n hsml(hml, new HsmlIDomHandler(), ctx);\n}\n\nfunction hsmls2idom(hmls: HElements, ctx?: HHandlerCtx): void {\n for (const hml of hmls) {\n if (hml === undefined || hml === null) {\n continue;\n }\n if (hml.constructor === String) {\n idom.text(hml as string);\n } else if (\"toHsml\" in (hml as any)) {\n const obj = hml as HHandlerCtx;\n obj.toHsml && hsml2idom(obj.toHsml(), obj);\n } else {\n hsml2idom(hml as HElement, ctx);\n }\n }\n}\n\nexport function hsml2idomPatch(node: Element, hsmlEl: HElement, ctx?: HHandlerCtx): void {\n idom.patch(node,\n (data?: HElement) => (data && hsml2idom(data, ctx)), hsmlEl);\n}\n\nexport function hsmls2idomPatch(node: Element, hsmlFr: HElements, ctx?: HHandlerCtx): void {\n idom.patch(node,\n (data?: HElements) => (data && hsmls2idom(data, ctx)), hsmlFr);\n}\n","const requiredMsg = \"required\";\nconst notInRangeMsg = \"not_in_range\";\nconst invalidFormatMsg = \"invalid_format\";\nconst invalidOptionMsg = \"invalid_option\";\nconst invalidValueMsg = \"invalid_value\";\n\n// name@doamin.net\nexport const emailRegex = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n\n// +421901123456 or +421 901 123 456 or +421-901-123-456 or 901123456 or 901 123 456 or 901-123-456\nexport const phoneRgex = /^(((00)([- ]?)|\\+)(\\d{1,3})([- ]?))?((\\d{3})([- ]?))((\\d{3})([- ]?))(\\d{3})$/;\n\n// 123 45 or 12345\nexport const pscRgex = /^\\d{3} ?\\d{2}$/;\n\n// 450115/8346\nexport const rodneCisloRgex = /^\\s*(\\d\\d)(\\d\\d)(\\d\\d)[ /]*(\\d\\d\\d)(\\d?)\\s*$/;\n\nexport abstract class Validator<TYPE, OPTS, MSGS> {\n\n readonly opts: OPTS;\n readonly msgs: MSGS;\n\n readonly str: string | null = null;\n readonly err: string | null = null;\n readonly obj: TYPE | null = null;\n\n constructor(opts?: OPTS, msgs?: MSGS) {\n this.opts = opts || {} as OPTS;\n this.msgs = msgs || {} as MSGS;\n }\n\n protected abstract strToObj(str?: string | null): { obj: TYPE | null, err: string };\n\n protected abstract objCheck(obj?: TYPE | null): string;\n\n protected abstract objToStr(obj?: TYPE | null,\n format?: string): { str: string, err: string };\n\n validate(value?: string | TYPE): { str?: string | null, obj?: TYPE | null, err: string } {\n if (typeof value === \"string\" || value === undefined || value === null) {\n const v = value as string | null | undefined;\n (this.str as any) = v;\n const sto = this.strToObj(v);\n (this.obj as any) = sto.obj;\n if (sto.err) {\n (this.err as any) = sto.err;\n return {\n str: (v === undefined || v === null) ? \"\" : v,\n obj: sto.obj,\n err: sto.err };\n }\n const err = this.objCheck(sto.obj);\n (this.err as any) = err;\n return {\n str: (v === undefined || v === null) ? \"\" : v,\n obj: sto.obj,\n err\n };\n } else {\n (this.str as any) = (value === undefined || value === null) ? null : (\"\" + value);\n const err = this.objCheck(value);\n (this.err as any) = err;\n return {\n str: this.str,\n obj: value,\n err\n };\n }\n }\n\n format(obj?: TYPE | null, format?: string): { str: string, err: string } {\n // const err = this.objCheck(obj);\n const ots = this.objToStr(obj, format);\n return {\n str: (ots.str === undefined || ots.str === null) ? \"\" : ots.str,\n // err: ots.err ? ots.err : err\n err: ots.err\n };\n }\n\n}\n\nexport function tpl(tmpl: string, data: { [k: string]: any }): string {\n return Object.keys(data)\n .map(k => [k, data[k]])\n .reduce((t, d) =>\n t.replace(new RegExp(`\\\\{\\\\{${d[0]}\\\\}\\\\}`, \"g\"), String(d[1])), tmpl);\n}\n\nexport interface ValidatorDataOpts {\n data?: { [key: string]: any };\n}\n\nexport interface SelectValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n options?: string[];\n}\n\nexport interface SelectValidatorMsgs {\n required?: string;\n invalid_option?: string;\n}\n\nexport class SelectValidator\n extends Validator<string, SelectValidatorOpts, SelectValidatorMsgs> {\n\n constructor(opts?: SelectValidatorOpts, msgs?: SelectValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: string | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n options: (\"options\" in opts)\n ? opts.options!.join(\", \")\n : \"\"\n })\n : requiredMsg\n };\n }\n }\n return {\n obj: str === undefined ? null : str,\n err: \"\"\n };\n }\n\n protected objCheck(obj?: string | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"options\" in opts) {\n if (obj && opts.options!.indexOf(obj) === -1) {\n return msgs.invalid_option\n ? tpl(msgs.invalid_option,\n {\n ...opts.data,\n option: obj === null ? \"\" : obj,\n options: (\"options\" in opts)\n ? opts.options!.join(\", \")\n : \"\"\n })\n : invalidOptionMsg;\n }\n }\n return \"\";\n }\n\n protected objToStr(obj?: string | null,\n format?: string): { str: string, err: string } {\n return { str: obj || \"\", err: \"\" };\n }\n\n}\n\nexport interface StringValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: number;\n max?: number;\n regexp?: RegExp;\n}\n\nexport interface StringValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nexport class StringValidator\n extends Validator<string, StringValidatorOpts, StringValidatorMsgs> {\n\n constructor(opts?: StringValidatorOpts, msgs?: StringValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: string | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min || \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max || \"\")) : \"\",\n regexp: (\"regexp\" in opts)\n ? (\"\" + (opts.regexp || \"\"))\n : \"\"\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n if (\"regexp\" in opts) {\n if (!opts.regexp!.test(str)) {\n return {\n obj: null,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n regexp: (\"regexp\" in opts)\n ? (\"\" + (opts.regexp || \"\"))\n : \"\"\n })\n : invalidFormatMsg\n };\n }\n }\n return { obj: str , err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: string | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (obj.length > opts.max!) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (obj.length < opts.min!) {\n err = true;\n }\n }\n if ((\"min\" in opts) && (\"max\" in opts)) {\n if (obj.length > opts.max! && obj.length < opts.min!) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min || \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max || \"\")) : \"\",\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: string | null,\n format?: string): { str: string, err: string } {\n return { str: obj || \"\", err: \"\" };\n }\n\n}\n\nexport interface NumberValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: number;\n max?: number;\n strict?: boolean;\n decimals?: number;\n}\n\nexport interface NumberValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nexport class NumberValidator\n extends Validator<number, NumberValidatorOpts, NumberValidatorMsgs> {\n\n constructor(opts?: NumberValidatorOpts, msgs?: NumberValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: number | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min || \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max || \"\")) : \"\",\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n const n = Number(str);\n let err: boolean = false;\n if (isNaN(n)) {\n err = true;\n }\n if (opts.strict && (str !== this.objToStr(n).str)) {\n err = true;\n }\n if (err) {\n const num = isNaN(n) ? 1234.45 : n;\n return {\n obj: isNaN(n) ? null : n,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n num: this.objToStr(num).str || \"\"\n })\n : invalidFormatMsg\n };\n }\n return { obj: n, err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: number | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (obj > opts.max!) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (obj < opts.min!) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min || \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max || \"\")) : \"\",\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: number | null,\n format?: string): { str: string, err: string } {\n let str;\n if (obj === undefined || obj === null) {\n str = \"\";\n } else {\n if (\"decimals\" in this.opts) {\n str = obj.toFixed(this.opts.decimals);\n } else {\n str = String(obj);\n }\n }\n return {\n str,\n err: \"\"\n };\n }\n\n}\n\nexport interface DateValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: Date;\n max?: Date;\n dateOnly?: boolean;\n iso?: boolean;\n // strict?: boolean;\n\n}\n\nexport interface DateValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nconst dateToLocaleString = (date: Date) => date.toLocaleString();\nconst dateToLocaleDateString = (date: Date) => date.toLocaleDateString();\n\nconst dateToIsoString = (date: Date) => date.toISOString();\nconst dateToIsoDateString = (date: Date) => new Date(date.toDateString()).toISOString();\n\nexport class DateValidator\n extends Validator<Date, DateValidatorOpts, DateValidatorMsgs> {\n\n dateToStr: (date: Date) => string;\n\n constructor(opts?: DateValidatorOpts, msgs?: DateValidatorMsgs) {\n super(opts, msgs);\n if (opts?.iso) {\n this.dateToStr = opts?.dateOnly ? dateToIsoDateString : dateToIsoString;\n } else {\n this.dateToStr = opts?.dateOnly ? dateToLocaleDateString : dateToLocaleString;\n }\n if (opts?.dateOnly && opts?.min) {\n opts.min = new Date(opts.min.getFullYear(), opts.min.getMonth(), opts.min.getDate());\n }\n if (opts?.dateOnly && opts?.max) {\n opts.max = new Date(opts.max.getFullYear(), opts.max.getMonth(), opts.max.getDate() + 1);\n }\n }\n\n protected strToObj(str?: string | null): { obj: Date | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts && opts.min) ? this.dateToStr(opts.min) : \"\",\n max: (\"max\" in opts && opts.max) ? this.dateToStr(opts.max) : \"\"\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n const dt = Date.parse(str);\n let d = new Date(dt);\n if (opts.dateOnly) {\n d = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n let err: boolean = false;\n if (isNaN(dt)) {\n err = true;\n }\n // if (opts.strict && (str !== this.objToStr(d).str)) {\n // err = true;\n // }\n if (err) {\n const date = isNaN(dt) ? new Date() : d;\n return {\n obj: isNaN(dt) ? null : d,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n date: this.objToStr(date).str || \"\"\n })\n : invalidFormatMsg\n };\n }\n return { obj: d, err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: Date | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (opts.max && obj.getTime() > opts.max.getTime()) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (opts.min && obj < opts.min) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts && opts.min) ? this.dateToStr(opts.min) : \"\",\n max: (\"max\" in opts && opts.max) ? this.dateToStr(opts.max) : \"\"\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: Date | null,\n format?: string): { str: string, err: string } {\n return {\n str: (obj === undefined || obj === null) ? \"\" : this.dateToStr(obj),\n err: \"\"\n };\n }\n\n}\n\nexport interface BooleanValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n value?: boolean;\n}\n\nexport interface BooleanValidatorMsgs {\n required?: string;\n invalid_value?: string;\n}\n\nexport class BooleanValidator\n extends Validator<boolean, BooleanValidatorOpts, BooleanValidatorMsgs> {\n\n constructor(opts?: BooleanValidatorOpts, msgs?: BooleanValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: boolean | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data\n })\n : requiredMsg\n };\n }\n }\n let b;\n switch (str) {\n case \"true\":\n case \"1\":\n case \"on\":\n case \"yes\":\n b = true;\n break;\n default:\n b = false;\n }\n return { obj: b, err: \"\" };\n }\n\n protected objCheck(obj?: boolean | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err = false;\n if (\"value\" in opts) {\n if (obj !== opts.value) {\n err = true;\n }\n }\n if (err) {\n return msgs.invalid_value\n ? tpl(msgs.invalid_value,\n {\n ...opts.data,\n value: (\"value\" in opts) ? (\"\" + (opts.value || \"\")) : \"\",\n })\n : invalidValueMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: boolean | null,\n format?: string): { str: string, err: string } {\n return {\n str: (obj === undefined || obj === null) ? \"\" : (\"\" + obj),\n err: \"\"\n };\n }\n\n}\n\ntype FormValidators<TYPE> = { [key in keyof TYPE]: Validator<any, any, any> };\n\nexport type Str<TYPE> = { [key in keyof TYPE]: string };\nexport type Obj<TYPE> = { [key in keyof TYPE]: any };\nexport type Err<TYPE> = { [key in keyof TYPE]: string };\n\nexport interface FormValidatorData<TYPE> {\n str: Str<TYPE>;\n obj: Obj<TYPE>;\n err: Err<TYPE>;\n valid: boolean;\n}\n\nexport class FormValidator<TYPE extends { [key: string]: any }> {\n\n readonly validators: FormValidators<TYPE> = {} as FormValidators<TYPE>;\n\n readonly str?: Str<TYPE>;\n readonly obj?: Obj<TYPE>;\n readonly err?: Err<TYPE>;\n\n readonly valid?: boolean;\n\n addValidator(field: keyof TYPE, validator: Validator<any, any, any>): this {\n this.validators[field] = validator;\n return this;\n }\n\n validate(data: { [key in keyof TYPE]?: string }): this {\n const res = Object.keys(this.validators)\n .reduce(\n (a, k) => {\n const v = (data as any)[k];\n const r = (this.validators as any)[k].validate(v);\n (a.str as any)[k] = r.str;\n (a.obj as any)[k] = r.obj;\n (a.err as any)[k] = r.err;\n r.err && (a.valid = false);\n return a;\n },\n { str: {}, obj: {}, err: {}, valid: true });\n (this.str as any) = res.str;\n (this.obj as any) = res.obj;\n (this.err as any) = res.err;\n (this.valid as any) = res.valid;\n return this;\n }\n\n format(data: { [key in keyof TYPE]: any }): this {\n const res = Object.keys(this.validators)\n .reduce(\n (a, k) => {\n const v = (data as any)[k];\n const r = (this.validators as any)[k].format(v);\n (a.str as any)[k] = r.str;\n (a.obj as any)[k] = v;\n (a.err as any)[k] = r.err;\n r.err && (a.valid = false);\n return a;\n },\n { str: {}, obj: {}, err: {}, valid: true });\n (this.str as any) = res.str;\n (this.obj as any) = res.obj;\n (this.err as any) = res.err;\n (this.valid as any) = res.valid;\n return this;\n }\n\n data(): FormValidatorData<TYPE> {\n return {\n str: this.str!,\n obj: this.obj!,\n err: this.err!,\n valid: this.valid!\n };\n }\n\n}\n\n\n// TEST\n\n// const sv = new StringValidator(\n// {\n// required: true,\n// min: 3,\n// max: 5,\n// // regexp: /^[0123]+$/\n// data: {\n// xxx: \"xXx\"\n// }\n// },\n// {\n// required: \"required {{min}} {{max}} {{regexp}}\",\n// invalid_format: \"invalid_format {{regexp}}\",\n// not_in_range: \"not_in_range {{min}} {{max}} | data.xxx={{xxx}}\"\n// });\n\n// [\n// \"x1234\",\n// \"x1234y\",\n// \"xy\"\n// ].forEach(v => {\n// console.log();\n// console.log(v);\n// const r = sv.validate(v);\n// console.log(r);\n// if (r.obj) {\n// const f = sv.format(r.obj);\n// console.log(f);\n// }\n// });\n\n// console.log();\n\n// const nv = new NumberValidator(\n// {\n// required: true,\n// min: 3,\n// max: 500000,\n// decimals: 2,\n// strict: true\n// },\n// {\n// required: \"required {{min}} {{max}}\",\n// invalid_format: \"invalid_format {{num}}\",\n// not_in_range: \"not_in_range {{min}} {{max}}\"\n// });\n\n// console.log(nv.format(undefined));\n// console.log(nv.format(12345.6789));\n\n// console.log(nv.validate(\"12345.6789\"));\n// console.log(nv.validate(\"12345,6789\"));\n// console.log(nv.validate(\"12,345.6789\"));\n\n// const dv = new DateValidator(\n// {\n// required: false,\n// // min: new Date(),\n// max: new Date(),\n// clearTime: false\n// // strict: true\n// },\n// {\n// required: \"required {{min}} {{max}}\",\n// invalid_format: \"invalid_format {{date}}\",\n// not_in_range: \"not_in_range {{min}} {{max}}\"\n// });\n\n// console.log(dv.opts);\n\n// console.log(dv.format(undefined));\n\n// console.log(dv.format(new Date));\n\n// console.log(dv.validate(\"9/17/2020, 10:46:07 AM\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"9/17/2020\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"2020-09-17T08:46:07.000Z\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"\"));\n// console.log(dv.format(dv.obj).str);\n\n// console.log(new Date().toString());\n// console.log(new Date().toDateString());\n// console.log(new Date().toTimeString());\n// console.log(new Date().toLocaleString());\n// console.log(new Date().toLocaleDateString());\n// console.log(new Date().toLocaleTimeString());\n// console.log();\n// console.log(new Date(Date.parse(new Date().toString())));\n// console.log(new Date(Date.parse(new Date().toDateString())));\n// console.log(new Date(Date.parse(new Date().toTimeString())));\n// console.log(new Date(Date.parse(new Date().toLocaleString())));\n// console.log(new Date(Date.parse(new Date().toLocaleDateString())));\n// console.log(new Date(Date.parse(new Date().toLocaleTimeString())));\n\n// const formData = { str: \"123a\", num: \"123456.789\", date: \"9/17/2020, 10:46:07 AM\" };\n// const formData = { str: \"\", num: \"\", date: \"\" };\n// const formData = { str: undefined, num: undefined, date: undefined };\n\n// const fv = new FormValidator<typeof formData>()\n// .addValidator(\"str\", sv)\n// .addValidator(\"num\", nv)\n// .addValidator(\"date\", dv)\n// .validate(formData);\n\n// console.log(fv.data());\n\n// fv.format(fv.obj!);\n// console.log(fv);\n\n// const ovData = { str: \"123a\", num: \"123.45\", date: \"02.01.2019 12:12\" };\n\n// const ov = new ObjectValidator<typeof ovData>()\n// .addValidator(\"str\", sv)\n// .addValidator(\"num\", nv)\n// // .addValidator(\"date\", dv)\n// .validate(ovData);\n\n// // console.log(ov);\n\n// ov.format(ov.obj!);\n// console.log(ov);\n\n// console.log();\n\n// interface ReportFormData {\n// spz: string;\n// tachometer: string;\n// dateCreated: string;\n// user: {\n// // name: string[];\n// email: string;\n// };\n// }\n\n// const dov = new ObjectValidator<ReportFormData>()\n// .addValidator(\"spz\", new StringValidator({ required: true }))\n// .addValidator(\"tachometer\", new NumberValidator({ required: true, min: 1 } ))\n// .addValidator(\"dateCreated\", new StringValidator({ required: true }))\n// .addValidator(\"user\", new ObjectValidator<ReportFormData[\"user\"]>()\n// .addValidator(\"email\", new StringValidator({ required: true}))\n// // .addValidator(\"name\", { })\n// // new ArrayValidator({\n// // required: true,\n// // validator: new StringValidator({ required: true })\n// // })\n// );\n\n// dov.validate(\n// {\n// spz: \"dasdas\",\n// tachometer: \"111222\",\n// // dateCreated: \"10.02.2019\",\n// user: {\n// // email: \"dsafasdf\",\n// }\n// },\n// {\n// dateCreated: \"01.03.2011\",\n// spz: \"32ds9f0f\",\n// tachometer: \"3213214214\",\n// user: {\n// email: \"sadmaskdmk2@dsadsamkl.com\"\n// }\n// });\n\n// const avn = new ArrayValidator<number>(new NumberValidator());\n// const rn = avn.validate([345, 123]);\n// console.log(rn);\n\n\n// interface D {\n// a: number;\n// b?: string;\n// }\n\n// const av = new ArrayValidator<T>(new ObjectValidator<T>()\n// .addValidator(\"a\", new NumberValidator())\n// .addValidator(\"b\", new StringValidator({ required: true }))\n// );\n\n// const d: D[] = [\n// { a: 123, b: \"text\" },\n// // { a: 5.6, b: \"\" },\n// { a: 5.6 }\n// ];\n\n// const r = av.validate(d);\n// console.log(r);\n\n// const ro = new ObjectValidator<T>()\n// .addValidator(\"a\", new NumberValidator())\n// .addValidator(\"b\", new StringValidator({ required: true }))\n// .validate({\n// a: \"5.6\",\n// b: undefined\n// // b: \"text\"\n// });\n// console.log(\"---\", ro);\n\n// const v = new StringValidator({ required: true });\n// const str = undefined;\n// const sr = v.validate(str!);\n// console.log(sr);\n\n// const v = new StringValidator({ required: true, min: 8 });\n// const str = \"\";\n// const sr = v.format(str);\n// console.log(sr, v);\n","export type Callback<Ctx, E, Data> = (data: Data, e: E, ctx?: Ctx) => void;\n\nexport class Events<Evt extends { [e: string]: any } = any, Ctx = undefined> {\n\n private _ctx?: Ctx;\n private _cb: Array<Function> = [];\n private _cbs: { [e: string]: Array<Function> } = {};\n\n constructor(ctx?: Ctx) {\n ctx && (this._ctx = ctx);\n }\n\n emit<E extends keyof Evt>(e: E, data?: Evt[E]): this {\n if (e in this._cbs) {\n for (let i = 0, l = this._cbs[e as string].length; i < l; i++) {\n this._cbs[e as string][i](data, e, this._ctx);\n }\n }\n for (let i = 0, l = this._cb.length; i < l; i++) {\n this._cb[i](data, e, this._ctx);\n }\n return this;\n }\n\n on<E extends keyof Evt>(ev: E, cb: Callback<Ctx, E, Evt[E]>): this {\n const e = ev as string;\n if (!(e in this._cbs)) {\n this._cbs[e] = [];\n }\n if (this._cbs[e].indexOf(cb) === -1) {\n this._cbs[e].push(cb);\n }\n return this;\n }\n\n any<E extends keyof Evt>(cb: Callback<Ctx, E, Evt[E]>): this {\n this._cb.push(cb);\n return this;\n }\n\n once<E extends keyof Evt>(ev: E, cb: Callback<Ctx, E, Evt[E]>): this {\n const e = ev;\n const wrap = (d: Evt[E], evt: E, c?: Ctx) => {\n this.off(e, wrap);\n cb(d, evt, c);\n };\n this.on(ev, wrap);\n return this;\n }\n\n off<E extends keyof Evt>(e?: E, cb?: Callback<Ctx, E, Evt[E]>): this {\n if (e === undefined) {\n if (cb) {\n this._cb = this._cb.filter(c => c !== cb);\n } else {\n this._cb.length = 0;\n }\n }\n if (e && e in this._cbs) {\n if (cb) {\n this._cbs[e as string].splice(this._cbs[e as string].indexOf(cb), 1);\n } else {\n this._cbs[e as string].length = 0;\n delete this._cbs[e as string];\n }\n }\n return this;\n }\n\n}\n\n\n// Test\n\n// type Evts = {\n// s: string;\n// s1: string;\n// s2: string;\n// s3: string;\n// sx1: string;\n// sx2: string;\n// n: number;\n// o: { x: string };\n// };\n\n// const e = new Events<Evts, string>(\"ctx\");\n\n// e.any((data, e, ctx) => console.log(\"any:\", data, e, ctx));\n\n// e.emit(\"s\", \"data-eee1\");\n// e.emit(\"s\", \"data-eee1\");\n// e.on(\"s\", (data, e, ctx) => console.log(data, ctx, e));\n// e.emit(\"s\", \"data-eee2\");\n// e.off(\"s\");\n// e.emit(\"s\", \"data-eee3\");\n\n// e.off();\n\n// e.emit(\"s\", \"data-not-emitted\");\n\n\n// e.emit(\"o\", { x: \"obj-1\" });\n// e.once(\"o\", (data, ctx, e) => console.log(data, ctx, e));\n// e.emit(\"o\", { x: \"obj-2\" });\n// e.emit(\"o\", { x: \"obj-3\" });\n\n// e.emit(\"s1\", \"data-all-s1\");\n// e.emit(\"s2\", \"data-all-s2\");\n// e.emit(\"s3\", \"data-all-s3\");\n\n// e.emit(\"sx1\", \"data-ex1\");\n// e.emit(\"sx2\", \"data-ex2\");\n","import {\n hsml,\n HElement,\n HElements,\n HHead,\n HAttrs,\n HAttrClasses,\n HAttrData,\n HAttrStyles,\n HFnc,\n HObj,\n HHandler,\n HHandlerCtx\n} from \"./hsml\";\n\nclass HsmlHtmlHandler implements HHandler<HHandlerCtx> {\n\n private static _pairTags = [\n \"script\", \"iframe\",\n \"html\", \"head\", \"body\", \"title\", \"div\",\n \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"p\", \"a\", \"pre\", \"blockquote\", \"i\", \"b\", \"em\", \"strong\", \"tt\", \"cite\",\n \"ol\", \"ul\", \"li\", \"dl\", \"dt\", \"dd\", \"table\", \"tr\", \"td\",\n \"textarea\", \"select\", \"option\"];\n\n private _onHtml: (html: string) => void;\n private _pretty: boolean;\n private _indent: string;\n private _depth: number = 0;\n\n constructor(onHtml: (html: string) => void,\n pretty: boolean = false,\n indent: string = \" \") {\n this._onHtml = onHtml;\n this._pretty = pretty;\n this._indent = indent;\n }\n\n open(tag: HHead, attrs: HAttrs, children: HElements, ctx?: HHandlerCtx): boolean {\n const props: any[] = [];\n let id = attrs._id;\n let classes: string[] = attrs._classes ? attrs._classes : [];\n let hObj: any = attrs._hObj;\n for (const a in attrs) {\n if (attrs.hasOwnProperty(a)) {\n switch (a) {\n case \"_id\":\n case \"_classes\":\n case \"_ref\":\n case \"_key\":\n case \"_skip\":\n case \"_hObj\":\n break;\n case \"id\":\n id = attrs[a] as string;\n break;\n case \"classes\":\n const attrClasses = attrs[a] as HAttrClasses;\n classes = classes.concat(attrClasses\n ? attrClasses\n .map(c =>\n c.constructor === String\n ? c as string\n : (c[1] ? c[0] as string : undefined))\n .filter((c): c is string => c !== undefined)\n : [] as string[]);\n break;\n case \"class\":\n classes = classes.concat((attrs[a] as string).split(\" \"));\n break;\n case \"data\":\n const attrData = attrs[a] as HAttrData;\n for (const d in attrData) {\n if (attrData.hasOwnProperty(d)) {\n if (attrData[d].constructor === String) {\n props.push([\"data-\" + d, attrData[d]]);\n } else {\n props.push([\"data-\" + d, JSON.stringify(attrData[d])]);\n }\n }\n }\n break;\n case \"styles\":\n const attrStyles = attrs[a] as HAttrStyles;\n let style = \"\";\n for (const d in attrStyles) {\n if (attrStyles.hasOwnProperty(d)) {\n const dd = d.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n style += dd + \":\" + attrStyles[d] + \";\";\n }\n }\n props.push([\"style\", style]);\n break;\n case \"styles\":\n break;\n case \"on\":\n break;\n default:\n if (typeof attrs[a] === \"function\") {\n // ignore\n } else if (typeof attrs[a] === \"boolean\") {\n attrs[a] && props.push([a, \"\"]);\n } else {\n props.push([a, attrs[a]]);\n }\n }\n }\n }\n if (classes.length) {\n props.unshift([\"class\", classes.join(\" \")]);\n }\n if (id) {\n props.unshift([\"id\", id]);\n }\n if (hObj && \"type\" in hObj) {\n props.unshift([\"hObj\", hObj.type]);\n }\n const args = props.map(p => `${p[0]}=\"${escapeHtml(p[1])}\"`).join(\" \");\n let html = \"\";\n if (this._pretty) {\n html += this._mkIndent(this._depth);\n this._depth++;\n }\n const pairTag = (children.length || HsmlHtmlHandler._pairTags.indexOf(tag) !== -1);\n html += \"<\" + tag + (args ? \" \" + args : \"\") + (pairTag ? \">\" : \"/>\");\n if (this._pretty) {\n html += \"\\n\";\n }\n this._onHtml(html);\n if (hObj && \"render\" in hObj && hObj.render.constructor === Function) {\n const hsmls = hObj.render() as HElements;\n for (const hml of hsmls) {\n if (hml === undefined || hml === null) {\n continue;\n }\n if (hml.constructor === String) {\n this._onHtml(hml + (this._pretty ? \"\\n\" : \"\"));\n } else if (\"toHsml\" in (hml as any)) {\n const obj = hml as HObj;\n obj.toHsml && hsml(obj.toHsml(), this);\n } else {\n hsml(hml as HElement, this);\n }\n }\n }\n return false;\n }\n\n close(tag: HHead, children: HElements, ctx?: HHandlerCtx): void {\n let html = \"\";\n const pairTag = (children.length || HsmlHtmlHandler._pairTags.indexOf(tag) !== -1);\n if (this._pretty) {\n this._depth--;\n if (pairTag) {\n html += this._mkIndent(this._depth);\n }\n }\n if (pairTag) {\n html += \"</\" + tag + \">\";\n if (this._pretty) {\n html += \"\\n\";\n }\n this._onHtml(html);\n }\n }\n\n text(text: string, ctx?: HHandlerCtx): void {\n let html = \"\";\n if (this._pretty) {\n html += this._mkIndent(this._depth);\n }\n html += (text as any) instanceof String\n ? text\n : escapeHtml(text);\n if (this._pretty) {\n html += \"\\n\";\n }\n this._onHtml(html);\n }\n\n fnc(fnc: HFnc, ctx?: HHandlerCtx): void {\n }\n\n obj(obj: HObj, ctx?: HHandlerCtx): void {\n if (\"toHsml\" in obj) {\n obj.toHsml && hsml(obj.toHsml(), this, obj as HHandlerCtx);\n } else {\n this.text(\"\" + obj, ctx);\n }\n }\n\n private _mkIndent(count: number): string {\n let indent = \"\";\n for (let i = 0; i < count; i++) {\n indent += this._indent;\n }\n return indent;\n }\n\n}\n\nexport function hsml2html(hsmlEl: HElement, onHtml: (html: string) => void, pretty = false): void {\n const handler = new HsmlHtmlHandler(onHtml, pretty);\n hsml(hsmlEl, handler);\n}\n\nexport function hsmls2html(hsmls: HElements, onHtml: (html: string) => void, pretty = false): void {\n for (const hml of hsmls) {\n if (hml === undefined || hml === null) {\n continue;\n }\n if (hml.constructor === String) {\n onHtml(hml + (pretty ? \"\\n\" : \"\"));\n } else if (\"toHsml\" in (hml as any)) {\n const obj = hml as HObj;\n obj.toHsml && hsml2html(obj.toHsml(), onHtml, pretty);\n } else {\n hsml2html(hml as HElement, onHtml, pretty);\n }\n }\n}\n\nexport function hsml2htmls(hsml: HElement, pretty = false): string[] {\n const htmls: string[] = [];\n hsml2html(hsml, html => htmls.push(html), pretty);\n return htmls;\n}\n\nexport function hsmls2htmls(hsmls: HElements, pretty = false): string[] {\n const htmls: string[] = [];\n hsmls2html(hsmls, html => htmls.push(html), pretty);\n return htmls;\n}\n\nconst escapeHtmlRegExp = /[\"'&<>]/;\n\n// TODO: check performance\n// const escapeHTML = (html: string) => html.replace(/[&<>'\"]/g,\n// tag => (({\n// '&': '&',\n// '<': '<',\n// '>': '>',\n// \"'\": ''',\n// '\"': '"'\n// } as any)[tag]));\n\nfunction escapeHtml(html: string): string {\n const str = \"\" + html;\n const m = escapeHtmlRegExp.exec(str);\n if (!m) {\n return str;\n }\n let esc;\n let escHtml = \"\";\n let idx = 0;\n let lastIdx = 0;\n for (idx = m.index; idx < str.length; idx++) {\n switch (str.charCodeAt(idx)) {\n case 34: // \"\n esc = \""\";\n break;\n case 38: // &\n esc = \"&\";\n break;\n case 39: // '\n esc = \"'\";\n break;\n case 60: // <\n esc = \"<\";\n break;\n case 62: // >\n esc = \">\";\n break;\n default:\n continue;\n }\n if (lastIdx !== idx) {\n escHtml += str.substring(lastIdx, idx);\n }\n lastIdx = idx + 1;\n escHtml += esc;\n }\n return lastIdx !== idx\n ? escHtml + str.substring(lastIdx, idx)\n : escHtml;\n}\n\n// Test\n\n// const hsmls: HElements = [\n// \"text\",\n// [\"tag\", [\n// \"d\",\n// [\"\"]\n// ]],\n// [\"taga\",\n// {\n// attr: \"escape html attr entities: \\\" ' & < >\",\n// classes: [\"class\"]\n// },\n// [\n// \"text\",\n// \"escape html entities: \\\" ' & < >\",\n// new String(\"escape html entities: \\\" ' & < >\"),\n// 123,\n// true\n// ]\n// ]\n// ];\n\n// const hml: HElement = [\"xxx\", {}, [\n// \"types\", \" \", 1235.456, \" \", new Date(), \" \",\n// ...hsmls,\n// [\"t\", [\"t\", \"a\", \"\"]],\n// [\"t\", {}, [\"t\", \"a\", \"\"]],\n// [\"a\", { href: \"url\", onclick: \"return confirm('Confirm please')\" }, \"link\"]\n// ]];\n\n// console.log(hsmls, hml);\n\n// const html = hsml2htmls(hml, true);\n// console.log(html.join(\"\"));\n","\ntype Fnc = (...args: any[]) => void;\n\nexport function debounce<F extends Fnc>(func: F, delay = 300) {\n type Args = F extends (...args: infer P) => void ? P : never;\n let timeout: number;\n return function (this: any, ...args: Args) {\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, delay);\n };\n}\n\n// Decorator\nexport function Debounce(delay = 300) {\n return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const method = descriptor.value;\n descriptor.value = debounce(method, delay);\n return descriptor;\n };\n}\n\n\n// TEST\n\n// const d = debounce(\n// function (this: any, x: string, y: number) {\n// console.log(\"debounce\", x, y);\n// },\n// 300);\n// d(\"peter\", 3);\n\n// const o = {\n// x: \"o.x\",\n// m: function (y: number) {\n// console.log(\"o.m\", this.x, y);\n// },\n// d: ({} as any)\n// };\n// o.d = debounce(o.m, 300);\n// o.d(\"test\");\n\n// class O {\n// x: string = \"O.x\";\n\n// @Debounce(300)\n// m(y: string) {\n// console.log(\"O.m\", this.x, y);\n// }\n// }\n// const obj = new O();\n// // obj.m = debounce(obj.m, 300); // decorator equivalent\n// obj.m(\"m(p)\");\n\n// setTimeout(() => obj.m(\"m(p) 200\"), 200);\n// setTimeout(() => obj.m(\"m(p) 1200\"), 1200);\n// setTimeout(() => obj.m(\"m(p) 1400\"), 1400);\n// setTimeout(() => obj.m(\"m(p) 2200\"), 2200);\n// setTimeout(() => obj.m(\"m(p) 2400\"), 2400);\n","\nexport function selectAll(selector: string, element?: HTMLElement): HTMLElement[] {\n const e = element || document;\n const qsa = e.querySelectorAll(selector);\n const a: HTMLElement[] = [];\n for (let i = 0; i < qsa.length; i++) {\n a.push(qsa[i] as HTMLElement);\n }\n return a;\n}\n\nexport function select(selector: string, element?: HTMLElement): HTMLElement | null {\n const e = element || document;\n return e.querySelector(selector);\n}\n\nexport function append(element: HTMLElement, ...elements: HTMLElement[]): void {\n elements.forEach(e => element.appendChild(e));\n}\n\nexport function replace(oldElement: HTMLElement, newElement: HTMLElement): void {\n oldElement.parentElement &&\n oldElement.parentElement.replaceChild(newElement, oldElement);\n}\n\nexport function remove(element: HTMLElement): void {\n element.parentElement && element.parentElement.removeChild(element);\n}\n\nexport function empty(element: HTMLElement) {\n while (element.firstChild /*.hasChildNodes()*/) {\n element.removeChild(element.firstChild);\n }\n}\n\n\nexport function html(html: string): HTMLElement {\n html = html.trim();\n // const t = document.createElement(\"template\") as HTMLTemplateElement;\n // if (\"content\" in t) {\n // t.innerHTML = html;\n // return t.content.cloneNode(true) as HTMLElement;\n // } else {\n let wrapMap: any = {\n option: [1, \"<select multiple='multiple'>\", \"</select>\"],\n legend: [1, \"<fieldset>\", \"</fieldset>\"],\n area: [1, \"<map>\", \"</map>\"],\n param: [1, \"<object>\", \"</object>\"],\n thead: [1, \"<table>\", \"</table>\"],\n tr: [2, \"<table><tbody>\", \"</tbody></table>\"],\n col: [2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\"],\n td: [3, \"<table><tbody><tr>\", \"</tr></tbody></table>\"],\n body: [0, \"\", \"\"],\n _default: [1, \"<div>\", \"</div>\"]\n };\n wrapMap.optgroup = wrapMap.option;\n wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\n wrapMap.th = wrapMap.td;\n const match = /<\\s*\\w.*?>/g.exec(html);\n let el: HTMLElement = document.createElement(\"div\");\n if (match != null) {\n const tag = match[0].replace(/</g, \"\").replace(/>/g, \"\").split(\" \")[0];\n if (tag.toLowerCase() === \"body\") {\n const body = document.createElement(\"body\");\n // keeping the attributes\n el.innerHTML = html.replace(/<body/g, \"<div\").replace(/<\\/body>/g, \"</div>\");\n const attrs = (el.firstChild as Element).attributes;\n body.innerHTML = html;\n for (let i = 0; i < attrs.length; i++) {\n body.setAttribute(attrs[i].name, attrs[i].value);\n }\n return body;\n } else {\n const map = wrapMap[tag] || wrapMap._default;\n html = map[1] + html + map[2];\n el.innerHTML = html;\n // Descend through wrappers to the right content\n let j = map[0] + 1;\n while (j--) {\n el = el.lastChild as HTMLElement;\n }\n }\n } else {\n el.innerHTML = html;\n el = el.lastChild as HTMLElement;\n }\n return el;\n // }\n}\n\n\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n (Element.prototype as any).matchesSelector ||\n (Element.prototype as any).mozMatchesSelector ||\n (Element.prototype as any).msMatchesSelector ||\n (Element.prototype as any).oMatchesSelector ||\n (Element.prototype as any).webkitMatchesSelector ||\n function(this: any, s: string) {\n const matches = (this.document || this.ownerDocument).querySelectorAll(s);\n let i = matches.length;\n while (--i >= 0 && matches.item(i) !== this) {}\n return i > -1;\n };\n}\n\nexport function addEventListener(element: HTMLElement,\n selector: string,\n event: string,\n listener: (target: HTMLElement, evt: Event) => void,\n useCapture: boolean = false) {\n element.addEventListener(\n event,\n function (e: Event) {\n const evt: Event = e || window.event;\n const target = (evt.target || e.srcElement) as HTMLElement;\n if (target && target.matches(selector)) {\n listener(target, evt);\n }\n },\n useCapture);\n}\n\nexport function removeEventListener(element: HTMLElement,\n event: string,\n listener: (evt: Event) => void,\n useCapture: boolean = false) {\n element.removeEventListener(event, listener, useCapture);\n}\n\n\nexport interface Widget {\n mount(element: HTMLElement): this;\n umount(): this;\n}\n","\nexport class UrlEncodedData {\n\n static encode(data: any, prefix = \"\"): string {\n let str: string;\n if (typeof data !== \"object\") {\n str = data;\n } else {\n const params: string[] = [];\n let size = 0;\n for (let key in data) {\n if (data.hasOwnProperty(key)) {\n let value = data[key];\n if (!(value instanceof Array)) {\n value = [value];\n }\n const valueLength = value.length;\n for (let i = 0; i < valueLength; i++) {\n const val = value[i];\n if ((typeof val === \"object\") && (val != null)) {\n params[size++] = arguments.callee(val, prefix + key + \".\");\n } else { // list\n params[size] = encodeURIComponent(prefix + key);\n if (val != null) {\n params[size] += \"=\" + encodeURIComponent(val);\n }\n size++;\n }\n }\n }\n }\n str = params.join(\"&\");\n }\n return str;\n }\n\n static decode(str: string): any {\n const data: any = {};\n if (str) {\n const params = str.split(\"&\");\n const paramsLength = params.length;\n for (let j = 0; j < paramsLength; j++) {\n const parameter = params[j].split(\"=\");\n const key = decodeURIComponent(parameter[0]);\n if (parameter.length > 1) {\n const value = decodeURIComponent(parameter[1]);\n const path = key.split(\".\");\n const size = path.length;\n let obj = data;\n for (let i = 0; i < size; i++) {\n const property = path[i];\n const o = obj[property];\n if (i === (size - 1)) { // list\n if (!o) {\n obj[property] = value;\n } else if (o instanceof Array) {\n obj[property].push(value);\n } else { // create array\n obj[property] = [o];\n obj[property][1] = value;\n }\n } else {\n if (!o) {\n obj[property] = {};\n }\n obj = obj[property];\n }\n }\n } else {\n data[key] = null;\n }\n }\n }\n return data;\n }\n\n}\n\nexport class Base64 {\n\n private static _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n static encode(e: string): string {\n let t = \"\";\n let n: any, r: any, i: any, s: any, o: any, u: any, a: any;\n let f = 0;\n e = Base64._utf8_encode(e);\n while (f < e.length) {\n n = e.charCodeAt(f++);\n r = e.charCodeAt(f++);\n i = e.charCodeAt(f++);\n s = n >> 2;\n o = (n & 3) << 4 | r >> 4;\n u = (r & 15) << 2 | i >> 6;\n a = i & 63;\n if (isNaN(r)) {\n u = a = 64;\n } else if (isNaN(i)) {\n a = 64;\n }\n t = t + Base64._keyStr.charAt(s) + Base64._keyStr.charAt(o) + Base64._keyStr.charAt(u) + Base64._keyStr.charAt(a);\n }\n return t;\n }\n\n static decode(e: string): string {\n let t = \"\";\n let n: any, r: any, i: any;\n let s: any, o: any, u: any, a: any;\n let f = 0;\n e = e.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n while (f < e.length) {\n s = this._keyStr.indexOf(e.charAt(f++));\n o = this._keyStr.indexOf(e.charAt(f++));\n u = this._keyStr.indexOf(e.charAt(f++));\n a = this._keyStr.indexOf(e.charAt(f++));\n n = s << 2 | o >> 4;\n r = (o & 15) << 4 | u >> 2;\n i = (u & 3) << 6 | a;\n t = t + String.fromCharCode(n);\n if (u !== 64) {\n t = t + String.fromCharCode(r);\n }\n if (a !== 64) {\n t = t + String.fromCharCode(i);\n }\n }\n t = Base64._utf8_decode(t);\n return t;\n }\n\n private static _utf8_encode(e: string): string {\n e = e.replace(/\\r\\n/g, \"\\n\");\n let t = \"\";\n for (let n = 0; n < e.length; n++) {\n const r = e.charCodeAt(n);\n if (r < 128) {\n t += String.fromCharCode(r);\n } else if (r > 127 && r < 2048) {\n t += String.fromCharCode(r >> 6 | 192);\n t += String.fromCharCode(r & 63 | 128);\n } else {\n t += String.fromCharCode(r >> 12 | 224);\n t += String.fromCharCode(r >> 6 & 63 | 128);\n t += String.fromCharCode(r & 63 | 128);\n }\n }\n return t;\n }\n\n private static _utf8_decode(e: string): string {\n let t = \"\";\n let n = 0;\n let r = 0;\n let c1 = 0;\n let c2 = 0;\n while (n < e.length) {\n r = e.charCodeAt(n);\n if (r < 128) {\n t += String.fromCharCode(r);\n n++;\n } else if (r > 191 && r < 224) {\n c1 = e.charCodeAt(n + 1);\n t += String.fromCharCode((r & 31) << 6 | c1 & 63);\n n += 2;\n } else {\n c1 = e.charCodeAt(n + 1);\n c2 = e.charCodeAt(n + 2);\n t += String.fromCharCode((r & 15) << 12 | (c1 & 63) << 6 | c2 & 63);\n n += 3;\n }\n }\n return t;\n }\n}\n","\nexport interface Entry {\n getName(): string;\n getValue(): string | undefined;\n setValue(value: string): this;\n validate(locale?: string): string;\n setValidator(validator: (entry: Entry, locale?: string) => string): this;\n onChange(callback: (entry: Entry) => void): this;\n}\n\n\nexport class TextAreaEntry implements Entry {\n\n private _element: HTMLTextAreaElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry, final: boolean) => void;\n\n constructor(element: HTMLTextAreaElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLTextAreaElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this, true);\n }\n });\n this._element.addEventListener(\"input\", () => {\n if (this._onChange) {\n this._onChange(this, false);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return this._element.value;\n }\n\n setValue(value: string): this {\n this._element.value = value;\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry, final: boolean) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class TextInputEntry implements Entry {\n\n private _element: HTMLInputElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry, final: boolean) => void;\n\n constructor(element: HTMLInputElement|string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLInputElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this, true);\n }\n });\n this._element.addEventListener(\"input\", () => {\n if (this._onChange) {\n this._onChange(this, false);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return this._element.value;\n }\n\n setValue(value: string): this {\n this._element.value = value;\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry, final: boolean) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class NumberInputEntry implements Entry {\n\n private _element: HTMLInputElement;\n\n private _decimals: number = 0;\n private _dragSensitivity: number = 1.0;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry, final: boolean) => void;\n\n constructor(element: HTMLInputElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLInputElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this, true);\n }\n });\n this.setDecimals(2);\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return this._element.value;\n }\n\n setValue(value: string): this {\n if (!isNaN(+value)) {\n this._element.value = (+value).toFixed(this._decimals);\n }\n return this;\n }\n\n setStep(value: number): this {\n if (!isNaN(value)) {\n this._element.step = \"\" + value;\n }\n return this;\n }\n\n setMin(value: number): this {\n if (!isNaN(value)) {\n this._element.min = \"\" + value;\n }\n return this;\n }\n\n setMax(value: number): this {\n if (!isNaN(value)) {\n this._element.max = \"\" + value;\n }\n return this;\n }\n\n setDecimals(value: number): this {\n if (!isNaN(value)) {\n this._decimals = value;\n }\n return this;\n }\n\n setDragSensitivity(value: number): this {\n if (!isNaN(value)) {\n this._dragSensitivity = value;\n }\n return this;\n }\n\n enableMouseWheel(): this {\n const onMouseWheel = () => {\n if (this._onChange) {\n setTimeout(() => {\n // const value = Number(this._element.value);\n // this.setValue(value.toFixed(this._decimals));\n this._onChange && this._onChange(this, false);\n }, 0);\n }\n };\n this._element.addEventListener(\"focus\", () => {\n this._element.addEventListener(\"mousewheel\", onMouseWheel);\n });\n this._element.addEventListener(\"blur\", () => {\n this._element.removeEventListener(\"mousewheel\", onMouseWheel);\n });\n return this;\n }\n\n enableMouseDrag(): this {\n this._element.addEventListener(\"mousedown\", (e: MouseEvent) => {\n document.body.style.cursor = \"row-resize\";\n this._element.style.cursor = \"row-resize\";\n const initialY = e.pageY;\n const value = Number(this.getValue());\n const min = this._element.min === \"\" ? null : Number(this._element.min);\n const max = this._element.max === \"\" ? null : Number(this._element.max);\n const step = this._element.step === \"\" ? 1 : Number(this._element.step);\n const num: number = isNaN(value) ? (min === null ? 0 : min) : value;\n\n const onMouseMove = (e: MouseEvent) => {\n const diffY = (e.pageY - initialY) * this._dragSensitivity;\n const newValue = num - diffY * step;\n if (min !== null && newValue < min) {\n this.setValue(min.toFixed(this._decimals));\n } else if (max !== null && newValue > max) {\n this.setValue(max.toFixed(this._decimals));\n } else {\n this.setValue(newValue.toFixed(this._decimals));\n }\n this._onChange && this._onChange(this, false);\n };\n\n const onMouseUp = () => {\n document.body.style.cursor = \"\";\n this._element.style.cursor = \"\";\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n this._onChange && this._onChange(this, true);\n };\n\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n });\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry, final: boolean) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class CheckboxEntry implements Entry {\n\n private _element: HTMLInputElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry) => void;\n\n constructor(element: HTMLInputElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLInputElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return \"\" + this._element.checked;\n }\n\n setValue(value: string): this {\n this._element.checked = (value && value !== \"false\") ? true : false;\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class SelectEntry implements Entry {\n\n private _element: HTMLSelectElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry) => void;\n\n constructor(element: HTMLSelectElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLSelectElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n return this._element.value;\n\n // const idx = this._element.selectedIndex;\n // return this._element.options[idx].value;\n\n // const values: string[] = [];\n // const opts = this._element.options;\n // for (let i = 0; i < opts.length; i++) {\n // if (opts[i].selected === true) {\n // values.push(opts[i].value);\n // }\n // }\n // return values;\n }\n\n setValue(value: string): this {\n this._element.value = value;\n return this;\n }\n\n setOptions(options: {value: string, text: string}[]): this {\n const e = this._element;\n while (e.options.length > 0) {\n e.remove(0);\n }\n options.forEach(opt => {\n const o = document.createElement(\"option\");\n o.text = opt.text;\n o.value = opt.value;\n e.add(o);\n });\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class RadioEntry implements Entry {\n\n private _elements: HTMLInputElement[] = [];\n\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry) => void;\n\n constructor(elements: HTMLInputElement[] | string[]) {\n (elements as any).forEach((e: HTMLInputElement | string) => {\n if (typeof e === \"string\") {\n this._elements.push(document.getElementById(e) as HTMLInputElement);\n } else {\n this._elements.push(e);\n }\n });\n this._elements.forEach(e => {\n e.addEventListener(\"change\", () => {\n if (this._onChange && e.checked) {\n this._onChange(this);\n }\n });\n });\n }\n\n getName(): string {\n return this._elements[0].name;\n }\n\n getValue(): string | undefined {\n for (let e of this._elements) {\n if (e.checked) {\n return e.value;\n }\n }\n return;\n }\n\n setValue(value: string): this {\n for (let e of this._elements) {\n if (e.value === value) {\n e.checked = true;\n }\n }\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\n/*\n var fileInput = document.getElementById('fileInput');\n var fileDisplayArea = document.getElementById('fileDisplayArea');\n\n fileInput.addEventListener('change', function(e) {\n var file = fileInput.files[0];\n var textType = /text.*!/;\n\n if (file.type.match(textType)) {\n var reader = new FileReader();\n reader.onload = function (e) {\n fileDisplayArea.innerText = reader.result;\n }\n reader.readAsText(file);\n } else {\n fileDisplayArea.innerText = \"File not supported!\"\n }\n });\n */\nexport class FileEntry implements Entry {\n\n private _element: HTMLInputElement;\n private _validator?: (entry: Entry, locale: string) => string;\n private _onChange?: (entry: Entry) => void;\n\n constructor(element: HTMLInputElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLInputElement;\n } else {\n this._element = element;\n }\n this._element.addEventListener(\"change\", () => {\n if (this._onChange) {\n this._onChange(this);\n }\n });\n }\n\n getName(): string {\n return this._element.name;\n }\n\n getValue(): string | undefined {\n const f = this._element.files;\n if (f && f.length) {\n return f[0].name + \" (\" + f[0].type + \", \" + f[0].size + \")\";\n } else {\n return;\n }\n }\n\n getFile(): File | null {\n return (this._element.files && this._element.files.length)\n ? this._element.files[0]\n : null;\n }\n\n setValue(value: string): this {\n // this._element.files..value = value;\n return this;\n }\n\n validate(locale: string = \"\"): string {\n if (this._validator) {\n return this._validator(this, locale);\n }\n return \"\";\n }\n\n setValidator(validator: (entry: Entry, locale?: string) => string): this {\n this._validator = validator;\n return this;\n }\n\n onChange(callback: (entry: Entry) => void): this {\n this._onChange = callback;\n return this;\n }\n\n}\n\n\nexport class Form {\n\n private _element: HTMLFormElement;\n private _formEntries: Entry[] = [];\n private _onSubmit?: (form: Form) => void;\n\n constructor(element: HTMLFormElement | string) {\n if (typeof element === \"string\") {\n this._element = document.getElementById(element) as HTMLFormElement;\n } else {\n this._element = element;\n }\n this._element.onsubmit = (e) => {\n e.preventDefault();\n if (this._onSubmit) {\n this._onSubmit(this);\n }\n return false;\n };\n }\n\n addEntry(entry: Entry): this {\n this._formEntries.push(entry);\n return this;\n }\n\n setEntries(entries: Entry[]): this {\n this._formEntries = entries;\n return this;\n }\n\n getEntries(): Entry[] {\n return this._formEntries;\n }\n\n getEntry(name: string): Entry | undefined {\n for (let entry of this._formEntries) {\n if (entry.getName() === name) {\n return entry;\n }\n }\n return;\n }\n\n validate(locale?: string): any {\n const errors: any = {};\n for (let entry of this._formEntries) {\n errors[entry.getName()] = entry.validate(locale);\n }\n return errors;\n }\n\n isValid(errors?: any): boolean {\n if (!errors) {\n errors = this.validate();\n }\n for (let error in errors) {\n if (errors.hasOwnProperty(error) && errors[error]) {\n return false;\n }\n }\n return true;\n }\n\n getValues(): any {\n const values: any = {};\n for (let entry of this._formEntries) {\n values[entry.getName()] = entry.getValue();\n }\n return values;\n }\n\n submit(): void {\n this._element.submit();\n }\n\n onSubmit(callback: (form: Form) => void): this {\n this._onSubmit = callback;\n return this;\n }\n\n}\n","\nexport interface HashUrlData {\n path?: string[];\n query?: {\n [key: string]: string | string[];\n };\n}\n\nexport const hashJsonEncoder = (data: any) => data ? encodeURIComponent(JSON.stringify(data)) : \"\";\nexport const hashJsonDecoder = (str: string) => str ? JSON.parse(decodeURIComponent(str)) : undefined;\n\nexport const hashUrlEncoder = (data: HashUrlData): string => {\n // console.log(data);\n const d = typeof data === \"string\"\n ? hashUrlDecoder(data)\n : data as HashUrlData;\n const dpath = d.path || [];\n const dquery = d.query || {};\n const path = dpath.map(p => encodeURIComponent(p)).join(\"/\");\n // const params = new URLSearchParams();\n const query = Object.entries(dquery)\n .reduce(\n (p, c) => {\n if (typeof c[1] === \"string\") {\n p.append(c[0], c[1]);\n } else {\n c[1].forEach(v => p.append(c[0], v));\n }\n return p;\n },\n new URLSearchParams())\n .toString();\n const str = `${path}${query ? \"?\" : \"\"}${query}`;\n // console.log(str);\n return str;\n};\nexport const hashUrlDecoder = (str: string): HashUrlData => {\n // console.log(str);\n const [pathStr, queryStr] = str.split(\"?\");\n // const pathStr = str.substring(0, str.indexOf(\"?\"));\n // const queryStr = str.substring(str.indexOf(\"?\") + 1);\n const path = pathStr.split(\"/\").map(p => decodeURIComponent(p));\n const query = {} as any;\n for (const e of new URLSearchParams(queryStr).entries()) {\n const [k, v] = e;\n if (k in query) {\n if (typeof query[k] === \"string\") {\n query[k] = [query[k], v];\n } else {\n query[k].push(v);\n }\n } else {\n query[k] = v;\n }\n }\n const data = { path, query };\n // console.log(data);\n return data;\n};\n\nexport class Hash<T = string> {\n\n private _cb?: (data: T) => void;\n\n private _emitWritten: boolean;\n private _writtenDataJson?: string;\n\n private _encode = (data: T) => String(data);\n private _decode = (str: string) => str as any as T;\n\n constructor(emitWritten = true) {\n this._emitWritten = emitWritten;\n }\n\n onChange(cb: (data: T) => void): this {\n this._cb = cb;\n return this;\n }\n\n coders(encode: (data: T) => string,\n decode: (data: string) => T): this {\n this._encode = encode;\n this._decode = decode;\n return this;\n }\n\n listen(): this {\n this._cb && this._cb(this.read());\n if (\"onhashchange\" in window) {\n onhashchange = () => {\n const data = this.read();\n // console.log(\"onhashchange\", location.hash, data);\n if (!this._emitWritten) {\n const written = this._writtenDataJson === JSON.stringify(data);\n this._writtenDataJson = undefined;\n if (!written) {\n this._cb && this._cb(data);\n }\n } else {\n this._cb && this._cb(data);\n }\n };\n } else {\n alert(`Browser \"window.onhashchange\" not implemented`);\n // let prevHash = location.hash;\n // if (this._iId) {\n // clearInterval(this._iId);\n // }\n // this._iId = setInterval(() => {\n // if (location.hash !== prevHash) {\n // prevHash = location.hash;\n // const written = this._dataJson === location.hash;\n // this._dataJson = undefined;\n // if (this._emitWritten || !written) {\n // this._cb && this._cb(data);\n // }\n // }\n // }, 500);\n }\n return this;\n }\n\n read(): T {\n return this._decode(location.hash.slice(1));\n }\n\n write(data: T): this {\n location.hash = \"#\" + this._encode(data);\n // location.hash = \"#\" + this._encode(data);\n if (!this._emitWritten) {\n this._writtenDataJson = JSON.stringify(data);\n this._cb && this._cb(data);\n }\n return this;\n }\n\n}\n","\nexport class History<T> {\n\n back(): void {\n window.history.back();\n }\n\n forward(): void {\n window.history.forward();\n }\n\n go(delta?: number): void {\n window.history.go(delta);\n }\n\n length(): number {\n return window.history.length;\n }\n\n state(): T {\n return window.history.state as T;\n }\n\n pushState(state: T, title: string, url?: string): void {\n window.history.pushState(state, title, url);\n }\n\n replaceState(state: T, title: string, url?: string): void {\n window.history.replaceState(state, title, url);\n }\n\n onChange(callback: (state: T) => void): this {\n window.addEventListener(\"popstate\", function (e: PopStateEvent) {\n callback(e.state);\n });\n return this;\n }\n\n}\n","import { HElement, HElements, HAttrOnData, HAttrOnDataFnc, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst err = console.error;\n\nexport type HView<STATE> = (state: STATE) => HElements;\nexport type HView1<STATE> = (state: STATE) => HElement;\n\nexport interface HAction {\n type: string;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatch = (type: HAction[\"type\"],\n data?: HAction[\"data\"],\n event?: HAction[\"event\"]) => Promise<void>;\n\nexport type HUpdate = () => void;\n\nexport type HDispatcher<STATE> = (action: HAction, state: STATE, dispatch: HDispatch) => Promise<void>;\n\n// export type Class<T = object> = new (...args: any[]) => T;\n\n// export function happ<STATE>(state: STATE,\n// view: HView<STATE>,\n// dispatcher?: HDispatcher<STATE>,\n// element: Element | string | null = document.body) {\n// return new HApp<STATE>(state, view, dispatcher, element);\n// }\n\nexport enum HAppAction {\n _init = \"_init\",\n _mount = \"_mount\",\n _umount = \"_umount\",\n}\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"HApp action:\";\nconst msgDispatch = \"HApp dispatch:\";\nconst msgRender = \"HApp render:\";\nconst msgUpdate = \"HApp update:\";\n\nexport class HApp<STATE> implements HHandlerCtx {\n\n static debug = false;\n\n readonly state: STATE;\n readonly view: HView<STATE>;\n readonly dispatcher: HDispatcher<STATE>;\n\n readonly dom?: Element;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n private _updateSched?: number;\n\n private _onUpdate?: (app: HApp<STATE>) => void;\n\n constructor(state: STATE, view: HView<STATE>, dispatcher?: HDispatcher<STATE>, e: Element | string | null = document.body) {\n this.state = state;\n this.view = view;\n this.dispatcher = dispatcher || (async (a) => log(msgAction, a.type, a.data));\n this.dispatch(HAppAction._init).then(() => this.mount(e));\n }\n\n dispatch: HDispatch = async (type: string, data?: any, event?: Event): Promise<void> => {\n if (HApp.debug) {\n log(msgAction, { type, data, event });\n const t0 = performance.now();\n try {\n await this.dispatcher({ type, data, event }, this.state, this.dispatch);\n this.update();\n } catch (e) {\n err(msgDispatch, e);\n }\n const t1 = performance.now();\n log(msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n try {\n await this.dispatcher({ type, data, event }, this.state, this.dispatch);\n this.update();\n } catch (e) {\n err(msgDispatch, e);\n }\n }\n }\n\n render = (): HElements => {\n if (HApp.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n err(msgRender, e);\n }\n const t1 = performance.now();\n log(msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls || [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n err(msgRender, e);\n }\n return hsmls || [];\n }\n }\n\n actionCb = (action: string, data: HAttrOnData, event: Event): void => {\n data = (data && data.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n data = formData(event);\n }\n this.dispatch(action, data, event);\n }\n\n mount = (e: Element | string | null = document.body): this => {\n const el = (typeof e === \"string\")\n ? document.getElementById(e) || document.body\n : e || document.body;\n if ((el as any).app) {\n const a = (el as any).app as HApp<STATE>;\n a.umount();\n }\n if (!this.dom) {\n (this as any).dom = el;\n (el as any).app = this;\n const hsmls = (this as any).render();\n updateDom(el, hsmls, this);\n this._onUpdate && this._onUpdate(this);\n this.dispatch(HAppAction._mount, this.dom);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.dom) {\n this.dispatch(HAppAction._umount, this.dom);\n if (this.dom.hasAttribute(\"app\")) {\n this.dom.removeAttribute(\"app\");\n }\n const aNodes = this.dom.querySelectorAll(\"[app]\");\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).app as HApp<STATE>;\n a && a.umount();\n }\n while (this.dom.firstChild /*.hasChildNodes()*/) {\n this.dom.removeChild(this.dom.firstChild);\n }\n delete (this.dom as any).app;\n (this as any).dom = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.dom && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.dom) {\n const hsmls = this.render();\n updateDom(this.dom, hsmls, this);\n }\n this._updateSched = undefined;\n this._onUpdate && this._onUpdate(this);\n });\n }\n return this;\n }\n\n onUpdate = (cb: (app: HApp<STATE>) => void): this => {\n this._onUpdate = cb;\n return this;\n }\n\n toHsml = (): HElement => {\n if (this.dom) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { _skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.dom) {\n (this as any).dom = e;\n (e as any).app = this;\n this.dispatch(HAppAction._mount, this.dom);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.dom ? this.dom.outerHTML : \"\";\n }\n\n}\n\nfunction updateDom(el: Element, hsml: HElements, ctx: HHandlerCtx): void {\n if (HApp.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | string[] | null } | string | string[] | number | boolean | null {\n let data: { [k: string]: string | string[] | null } | string | string[] | number | boolean | null = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: String(iel.checked) };\n } else {\n data = String(iel.checked);\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n\n// export const formInputData = <STATE>(dispatcher: Actions<STATE>): Actions<STATE> =>\n// (app: App<STATE>, action: string | number, data?: any, event?: Event): void => {\n// if (data === undefined && event) {\n// data = inputEventData(event);\n// }\n// dispatcher(app, action, data, event);\n// };\n\n// // Decorator\n// export function FormInputData() {\n// return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n// const method = descriptor.value;\n// descriptor.value = formInputData(method);\n// return descriptor;\n// };\n// }\n","import {\n hsml,\n HElement,\n HElements,\n HHead,\n HAttrs,\n HAttrClasses,\n HAttrData,\n HAttrStyles,\n HAttrOn,\n HAttrOnCb,\n HAttrOnAct,\n HAttrOnAction,\n HAttrOnData,\n HFnc,\n HObj,\n HHandler,\n HHandlerCtx\n} from \"./hsml\";\n\nclass HsmlDomHandler implements HHandler<HHandlerCtx> {\n\n element?: HTMLElement;\n\n private _current?: HTMLElement;\n\n open(tag: HHead, attrs: HAttrs, children: HElements, ctx?: HHandlerCtx): boolean {\n const e = document.createElement(tag);\n let id = attrs._id;\n let classes: string[] = attrs._classes ? attrs._classes : [];\n let ref = attrs._ref;\n let hObj: any = attrs._hObj;\n for (const a in attrs) {\n if (attrs.hasOwnProperty(a)) {\n switch (a) {\n case \"_id\":\n case \"_classes\":\n case \"_ref\":\n case \"_key\":\n case \"_skip\":\n case \"_hObj\":\n break;\n case \"id\":\n id = attrs[a] as string;\n break;\n case \"classes\":\n const attrClasses = attrs[a] as HAttrClasses;\n classes = classes.concat(attrClasses\n ? attrClasses\n .map(c =>\n c.constructor === String\n ? c as string\n : (c[1] ? c[0] as string : undefined))\n .filter((c): c is string => c !== undefined)\n : [] as string[]);\n break;\n case \"class\":\n classes = classes.concat((attrs[a] as string).split(\" \"));\n break;\n case \"data\":\n const attrData = attrs[a] as HAttrData;\n for (const d in attrData) {\n if (attrData.hasOwnProperty(d)) {\n if (attrData[d].constructor === String) {\n e.dataset[d] = attrData[d] as string;\n } else {\n e.dataset[d] = JSON.stringify(attrData[d]);\n }\n }\n }\n break;\n case \"styles\":\n const attrStyles = attrs[a] as HAttrStyles;\n for (const d in attrStyles) {\n if (attrStyles.hasOwnProperty(d)) {\n (e.style as any)[d] = attrStyles[d];\n }\n }\n break;\n case \"on\":\n const attrOn = attrs[a] as HAttrOn;\n if (typeof attrOn[0] === \"string\") {\n if (typeof attrOn[1] === \"function\") {\n e.addEventListener(attrOn[0] as string, attrOn[1] as (e: Event) => void);\n } else {\n e.addEventListener(attrOn[0] as string, (e: Event) => {\n ctx && ctx.actionCb &&\n typeof ctx.actionCb === \"function\" &&\n ctx.actionCb(attrOn[1] as HAttrOnAction,\n attrOn[2] as HAttrOnData,\n e);\n });\n }\n } else {\n (attrOn as Array<HAttrOnCb | HAttrOnAct>)\n .forEach(attr => {\n if (typeof attrOn[1] === \"function\") {\n e.addEventListener(attrOn[0] as string, attrOn[1] as (e: Event) => void);\n } else {\n e.addEventListener(attrOn[0] as string, (e: Event) => {\n ctx && ctx.actionCb &&\n typeof ctx.actionCb === \"function\" &&\n ctx.actionCb(attrOn[1] as HAttrOnAction,\n attrOn[2] as HAttrOnData,\n e);\n });\n }\n });\n }\n break;\n default:\n if (typeof attrs[a] === \"function\") {\n e.addEventListener(a, attrs[a] as (e: Event) => void);\n } else if (typeof attrs[a] === \"boolean\") {\n attrs[a] && e.setAttribute(a, \"\");\n } else {\n e.setAttribute(a, attrs[a] as string);\n }\n }\n }\n }\n if (id) {\n e.setAttribute(\"id\", id);\n }\n if (classes.length) {\n e.classList.add(...classes);\n }\n if (this._current) {\n this._current.appendChild(e);\n this._current = e;\n } else {\n this.element = e;\n this._current = e;\n }\n if (ctx && ref) {\n ctx.refs[ref] = this._current;\n }\n if (hObj && hObj.mount && hObj.mount.constructor === Function) {\n hObj.mount(e);\n }\n return attrs._skip ? true : false;\n }\n\n close(tag: HHead, children: HElements, ctx?: HHandlerCtx): void {\n if (this._current !== this.element) {\n this._current && (this._current = this._current.parentElement || undefined);\n }\n }\n\n text(text: string, ctx?: HHandlerCtx): void {\n this._current && this._current.appendChild(document.createTextNode(text));\n }\n\n fnc(fnc: HFnc, ctx?: HHandlerCtx): void {\n this._current && fnc(this._current);\n }\n\n obj(obj: HObj, ctx?: HHandlerCtx): void {\n if (\"toHsml\" in obj) {\n obj.toHsml && hsml(obj.toHsml(), this, obj as HHandlerCtx);\n } else {\n this.text(\"\" + obj, ctx);\n }\n }\n\n}\n\nexport function hsml2dom(hml: HElement, ctx?: HHandlerCtx): HTMLElement | undefined {\n const handler = new HsmlDomHandler();\n hsml(hml, handler, ctx);\n return handler.element;\n}\n\nexport function hsmls2dom(hmls: HElements, ctx?: HHandlerCtx): Node[] {\n const elems: Node[] = [];\n for (const hml of hmls) {\n if (hml === undefined || hml === null) {\n continue;\n }\n if (hml.constructor === String) {\n elems.push(document.createTextNode(hml as string));\n } else if (\"toHsml\" in (hml as object)) {\n const obj = hml as HHandlerCtx;\n if (obj.toHsml) {\n elems.push(hsml2dom(obj.toHsml(), obj)!);\n }\n } else {\n elems.push(hsml2dom(hml, ctx)!);\n }\n }\n return elems;\n}\n","import { HElement, HAttrs, HHead, HFnc, HChildren } from \"./hsml\";\n\nexport function h(tag: HHead): HElement;\nexport function h(tag: HHead, text: string | number): HElement;\nexport function h(tag: HHead, children: HChildren): HElement;\nexport function h(tag: HHead, fnc: HFnc): HElement;\nexport function h(tag: HHead, attrs: HAttrs): HElement;\nexport function h(tag: HHead, attrs: HAttrs, text: string | number): HElement;\nexport function h(tag: HHead, attrs: HAttrs, children: HElement[]): HElement;\nexport function h(tag: HHead, attrs: HAttrs, fnc: HFnc): HElement;\nexport function h(tag: HHead, second?: HAttrs | HChildren, third?: HAttrs | HChildren): HElement {\n const result: [string, ...any[]] = [tag];\n if (second) {\n if (typeof second === \"string\" || typeof second === \"number\") {\n result.push([second]);\n } else if (Array.isArray(second) || typeof second === \"function\") {\n result.push(second);\n } else {\n // element has attributes\n result.push(second);\n }\n }\n if (third) {\n if (typeof third === \"string\" || typeof third === \"number\") {\n result.push([third]);\n } else if (Array.isArray(third) || typeof third === \"function\") {\n result.push(third);\n }\n }\n return result as HElement;\n}\n","import { HMount, HAction, HView, HComponent as SvacComponent } from \"./hsml-svac\";\nimport { HElement, HElements, HAttrOnData, HAttrOnDataFnc, HHandlerCtx, HFnc } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\nimport * as idom from \"incremental-dom\";\n\nexport interface HComponent<STATE> extends SvacComponent<STATE> {\n actions?: HActions<STATE>;\n}\n\nexport type HActions<STATE> = (ctrl: HCtrl<STATE>,\n action: string | number,\n data?: any,\n event?: Event) => void;\n\nconst mount: HMount = <STATE>(\n component: HComponent<STATE>,\n state?: STATE,\n action?: HAction): HFnc | HElements =>\n (e: Element) => {\n if ((e as any).ctrl) {\n const c = (e as any).ctrl as HCtrl<STATE>;\n if (c.view === component.view) {\n if (state !== undefined) {\n c.state = state;\n }\n c.update();\n } else {\n c.umount();\n const c1 = new HCtrl<STATE>(component, action);\n if (state !== undefined) {\n c1.state = state;\n }\n c1.mount(e);\n }\n } else {\n const c = new HCtrl<STATE>(component, action);\n if (state !== undefined) {\n c.state = state;\n }\n c.mount(e);\n }\n return true;\n };\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (handler: Function) { window.setTimeout(handler, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst ctrlAttr = \"ctrl\";\n\nexport class HCtrl<STATE> implements HHandlerCtx {\n\n static debug = false;\n\n static appActions?: HActions<any>;\n\n private static _count = 0;\n\n private static _ctrls: { [ctrl: string]: HCtrl<any> } = {};\n\n readonly type: string = \"Ctrl\";\n readonly id: string = this.type + \"-\" + HCtrl._count++;\n readonly dom?: Element;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n state: STATE;\n\n readonly view: HView<STATE>;\n\n private _actions?: HActions<STATE>;\n private _extAction?: HAction;\n\n private _updateSched?: number;\n\n constructor(component: HComponent<STATE>, extAction?: HAction) {\n this.view = component.view;\n this.type = component.type;\n this.state = component.state;\n this._actions = component.actions;\n this._extAction = extAction || this.appAction;\n this.action(\"_init\");\n }\n\n appAction = (action: string | number, data?: any, event?: Event): void => {\n HCtrl.debug && console.log(\"appAction\", this.type, action, data, event);\n HCtrl.appActions && HCtrl.appActions(this, action, data, event);\n }\n\n appActions(actions: HActions<STATE>): this {\n HCtrl.appActions = actions;\n return this;\n }\n\n extAction = (action: string | number, data?: any, event?: Event): void => {\n HCtrl.debug && console.log(\"extAction\", this.type, action, data, event);\n this._extAction && this._extAction(action, data, event);\n }\n\n action = (action: string | number, data?: any, event?: Event): void => {\n HCtrl.debug && console.log(\"action\", this.type, action, data, event);\n this._actions && this._actions(this, action, data, event);\n }\n\n appCtrls(): HCtrl<any>[] {\n return Object.values(HCtrl._ctrls);\n }\n\n render = (): HElements => {\n return this.view(this.state, this.action, mount);\n }\n\n actionCb = (action: string, data: HAttrOnData, event: Event): void => {\n data = (data && data.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n data = formInputData(event);\n }\n this.action(action, data, event);\n }\n\n mount = (e?: string | Element | null): this => {\n const el = typeof e === \"string\"\n ? document.getElementById(e) || document.body\n : e || document.body;\n if ((el as any).ctrl) {\n const c = (el as any).ctrl as HCtrl<STATE>;\n c && c.umount();\n }\n if (!this.dom) {\n HCtrl._ctrls[this.id] = this;\n (this as any).dom = el;\n (el as any).ctrl = this;\n const hsmls = (this as any).render();\n hsmls2idomPatch(el, hsmls, this);\n el.setAttribute(ctrlAttr, this.type);\n this.action(\"_mount\", this.dom);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.dom) {\n delete HCtrl._ctrls[this.id];\n this.action(\"_umount\", this.dom);\n if (this.dom.hasAttribute(ctrlAttr)) {\n this.dom.removeAttribute(ctrlAttr);\n }\n const cNodes = this.dom.querySelectorAll(`[${ctrlAttr}]`);\n for (let i = 0; i < cNodes.length; i++) {\n const c = (cNodes[i] as any).ctrl as HCtrl<STATE>;\n c && c.umount();\n }\n while (this.dom.firstChild) {\n this.dom.removeChild(this.dom.firstChild);\n }\n delete (this.dom as any).ctrl;\n (this as any).dom = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.dom && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.dom) {\n hsmls2idomPatch(this.dom, this.render(), this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement => {\n if (this.dom) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return (\n [\"div\",\n {\n _skip: true,\n _id: this.id,\n _key: this.id,\n ctrl: this.type\n }\n ]\n );\n }\n }\n const hsmls = this.render() as HElements;\n hsmls.push(\n (e: Element) => {\n if (!this.dom) {\n (this as any).dom = e;\n (e as any).ctrl = this;\n HCtrl._ctrls[this.id] = this;\n this.action(\"_mount\", this.dom);\n }\n });\n return (\n [\"div\",\n {\n _id: this.id,\n _key: this.id,\n ctrl: this.type\n },\n hsmls\n ]\n );\n }\n\n toHtml = (): string => {\n return this.dom ? this.dom.outerHTML : \"\";\n }\n\n}\n\n(idom as any).notifications.nodesDeleted = (nodes: Node[]) => {\n nodes.forEach(node => {\n if (node.nodeType === 1 && (node as any).ctrl) {\n const c = (node as any).ctrl as HCtrl<any>;\n c && c.umount();\n }\n });\n};\n\nfunction formInputData(e: Event): { [k: string]: string } {\n const value = {} as { [k: string]: string };\n const el = (e.target as HTMLElement);\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = (el as HTMLInputElement);\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n case \"radio\":\n value[iel.name] = iel.value;\n break;\n case \"number\":\n value[iel.name] = iel.value;\n break;\n case \"checkbox\":\n value[iel.name] = \"\" + iel.checked;\n break;\n }\n break;\n case \"SELECT\":\n const sel = (el as HTMLSelectElement);\n value[sel.name] = sel.value;\n break;\n case \"TEXTAREA\":\n const tel = (el as HTMLTextAreaElement);\n value[tel.name] = tel.innerText;\n break;\n case \"BUTTON\":\n const bel = (el as HTMLButtonElement);\n value[bel.name] = bel.value;\n break;\n }\n return value;\n}\n","import { HElements, HFnc } from \"./hsml\";\nimport { hsmls2htmls, hsmls2html } from \"./hsml-html\";\nimport { HAction, HMount, HComponent } from \"./hsml-svac\";\n\nconst actionHtml: HAction = (action: string | number, data: any, event?: Event) => { };\n\nconst mountHtml: HMount = <STATE>(component: HComponent<STATE>,\n state?: STATE): HFnc | HElements => {\n return component.view(state || component.state, actionHtml, mountHtml);\n};\n\nexport function html<STATE>(component: HComponent<STATE>,\n state: STATE,\n onHtml: (html: string) => void,\n pretty = false): void {\n hsmls2html(component.view(state, actionHtml, mountHtml), onHtml, pretty);\n}\n\nexport function htmls<STATE>(component: HComponent<STATE>,\n state: STATE,\n pretty = false): string {\n return hsmls2htmls(component.view(state, actionHtml, mountHtml), pretty).join(\"\");\n}\n","import { HElement, HElements, HAttrOnData, HHandlerCtx, HAttrOnDataFnc, HObj } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\nimport * as idom from \"incremental-dom\";\n\nexport interface IHWidget {\n render(): HElements;\n onMount(): void;\n onUmount(): void;\n actions(action: string, data?: HAttrOnData): void;\n}\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nexport abstract class HWidget implements HObj, HHandlerCtx, IHWidget {\n\n private static _count = 0;\n\n static readonly mounted: { [wid: string]: HWidget } = {};\n\n readonly type: string = this.constructor.name; // \"Widget\"\n readonly id: string = this.type + \"-\" + HWidget._count++;\n readonly dom?: Element;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n private _updateSched?: number;\n\n constructor(type?: string) {\n if (type) {\n this.type = type;\n }\n }\n\n abstract render(): HElements;\n\n onMount(): void {\n console.log(\"mount\");\n }\n\n onUmount(): void {\n console.log(\"umount\");\n }\n\n actions(action: string, data: any): void {\n console.log(action, data);\n }\n\n action(action: string, data?: any): void {\n this.actions(action, data);\n }\n\n actionCb(action: string, data: HAttrOnData, e: Event) {\n data = (data && data.constructor === Function)\n ? (data as HAttrOnDataFnc)(e)\n : data === undefined ? e : data;\n this.action(action, data);\n }\n\n mount(e?: string | Element | null): this {\n const el = typeof e === \"string\"\n ? document.getElementById(e) || document.body\n : e || document.body;\n if (\"widget\" in el) {\n const w = (el as any).widget as HWidget;\n w && w.umount();\n }\n if (!this.dom) {\n HWidget.mounted[this.id] = this;\n (this as any).dom = el;\n (el as any).widget = this;\n const hsmls = this.render();\n hsmls2idomPatch(el, hsmls, this);\n el.setAttribute(\"widget\", this.type);\n if ((this as any).onMount) {\n (this as any).onMount();\n }\n }\n return this;\n }\n\n umount(): this {\n if (this.dom) {\n delete HWidget.mounted[this.id];\n if ((this as any).onUmount) {\n (this as any).onUmount();\n }\n if (this.dom.hasAttribute(\"widget\")) {\n this.dom.removeAttribute(\"widget\");\n }\n const wNodes = this.dom.querySelectorAll(\"[widget]\");\n for (let i = 0; i < wNodes.length; i++) {\n const w = (wNodes[i] as any).widget as HWidget;\n w && w.umount();\n }\n while (this.dom.firstChild /*.hasChildNodes()*/) {\n this.dom.removeChild(this.dom.firstChild);\n }\n delete (this.dom as any).widget;\n (this as any).dom = undefined;\n }\n return this;\n }\n\n update(): this {\n if (this.dom && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.dom) {\n hsmls2idomPatch(this.dom, this.render(), this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml(): HElement {\n if (this.dom) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return (\n [\"div\",\n {\n _skip: true,\n _id: this.id,\n _key: this.id,\n widget: this.type\n }\n ]\n );\n }\n }\n const hsmls = (this as any).render() as HElements;\n hsmls.push(\n (e: Element) => {\n if (!this.dom) {\n (this as any).dom = e;\n (e as any).widget = this;\n if ((this as any).onMount) {\n (this as any).onMount();\n }\n }\n });\n return (\n [\"div\",\n {\n _id: this.id,\n _key: this.id,\n widget: this.type\n },\n hsmls\n ]\n );\n }\n\n toHtml = (): string => {\n return this.dom ? this.dom.outerHTML : \"\";\n }\n\n}\n\n(idom as any).notifications.nodesDeleted = (nodes: Node[]) => {\n nodes.forEach(node => {\n if (node.nodeType === 1 && \"widget\" in node) {\n const w = (node as any).widget as HWidget;\n w && w.umount();\n }\n });\n};\n","\nexport function isArray(obj: any) {\n return Array.isArray ?\n Array.isArray(obj) :\n (obj == null || obj === undefined || \"boolean|number|string|function|xml\".indexOf(typeof obj) !== -1) ?\n false :\n (typeof obj.length === \"number\" && !(obj.propertyIsEnumerable(\"length\")));\n}\n\nexport function decodeUrlQuery(queryStr: string): { [key: string]: string } {\n const query: { [key: string]: string } = {};\n if (queryStr) {\n const a = queryStr.substr(1).split(\"&\");\n for (const item of a) {\n const b = item.split(\"=\");\n query[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || \"\");\n }\n }\n return query;\n}\n\nexport function encodeUrlQuery(query: any): string {\n const key_value_pairs: any[] = [];\n for (const key in query) {\n if (query.hasOwnProperty(key)) {\n const value = query[key];\n if (typeof value === \"object\") {\n if (isArray(value)) {\n for (const item of value) {\n key_value_pairs.push(\n [key, typeof item === \"object\" ?\n JSON.stringify(item) : item]);\n }\n } else {\n key_value_pairs.push([key, JSON.stringify(value)]);\n }\n } else {\n key_value_pairs.push([key, value]);\n }\n }\n }\n for (let j = 0, pair: any; pair = key_value_pairs[j++];) {\n key_value_pairs[j - 1] = `${encodeURIComponent(pair[0])}=${encodeURIComponent(pair[1])}`;\n }\n return key_value_pairs.join(\"&\");\n}\n\n\nexport class HttpResponse {\n\n private _xhr: XMLHttpRequest;\n\n constructor(xhr: XMLHttpRequest) {\n this._xhr = xhr;\n }\n\n getHeaders(): string {\n return this._xhr.getAllResponseHeaders();\n }\n\n getHeader(header: string): string | null {\n return this._xhr.getResponseHeader(header);\n }\n\n getBody(): any {\n return this._xhr.response;\n }\n\n getType(): string {\n return this._xhr.responseType;\n }\n\n getContentType(): string | null {\n return this.getHeader(\"Content-Type\");\n }\n\n getText(): string {\n return this._xhr.responseText;\n }\n\n getJson(): any {\n return JSON.parse(this._xhr.responseText);\n }\n\n getXml(): Document | null {\n return this._xhr.responseXML;\n }\n\n}\n\n\nexport interface HttpProgress {\n loaded: number;\n total?: number;\n}\n\nexport type HttpMethod =\n | \"GET\"\n | \"POST\"\n | \"PUT\"\n | \"DELETE\"\n | \"PATCH\"\n | \"HEAD\"\n | \"CONNECT\"\n | \"OPTIONS\"\n | \"TRACE\";\n\nexport type HttpResponseType =\n | \"arraybuffer\"\n | \"blob\"\n | \"document\"\n | \"json\"\n | \"text\";\n\nexport const authBasic = (login: string, password: string) => (req: HttpRequest) => {\n req.headers({ \"Authorization\": \"Basic \" + btoa(login + \":\" + password) });\n};\n\nexport class HttpRequest {\n\n static readonly xhrs: HttpRequest[] = [];\n\n static onRequest?: (request: HttpRequest) => void;\n static onResponse?: (response: HttpResponse) => void;\n static onError?: (e: Event) => void;\n\n static abortAll() {\n HttpRequest.xhrs.forEach(x => x.abort());\n HttpRequest.xhrs.length = 0;\n }\n\n private _url?: string;\n private _query?: Object;\n private _method: HttpMethod = \"GET\";\n private _headers: { [key: string]: string } = {};\n private _timeout?: number;\n private _responseType?: HttpResponseType;\n\n private _onProgress?: (progress: HttpProgress) => void;\n private _onResponse?: (response: HttpResponse) => void;\n private _onError?: (e?: Event) => void;\n\n private _xhr?: XMLHttpRequest;\n private _async: boolean = true;\n private _noCache: boolean = false;\n\n get(url: string, query?: Object): this {\n this.method(\"GET\");\n this.url(url, query);\n return this;\n }\n\n post(url: string, query?: Object): this {\n this.method(\"POST\");\n this.url(url, query);\n return this;\n }\n\n put(url: string, query?: Object): this {\n this.method(\"PUT\");\n this.url(url, query);\n return this;\n }\n\n patch(url: string, query?: Object): this {\n this.method(\"PATCH\");\n this.url(url, query);\n return this;\n }\n\n del(url: string, query?: Object): this {\n this.method(\"DELETE\");\n this.url(url, query);\n return this;\n }\n\n url(url: string, query?: Object): this {\n this._url = url;\n this._query = query;\n return this;\n }\n\n method(method: HttpMethod): this {\n this._method = method;\n return this;\n }\n\n headers(headers: { [key: string]: string }): this {\n for (const key in headers) {\n if (headers.hasOwnProperty(key)) {\n this._headers[key] = headers[key];\n }\n }\n return this;\n }\n\n use(middleware: (req: HttpRequest) => void): this {\n middleware(this);\n return this;\n }\n\n timeout(timeout: number): this {\n this._timeout = timeout;\n return this;\n }\n\n responseType(type: HttpResponseType): this {\n this._responseType = type;\n return this;\n }\n\n onProgress(onProgress: (progress: HttpProgress) => void): this {\n this._onProgress = onProgress;\n return this;\n }\n\n onResponse(onResponse: (response: HttpResponse) => void): this {\n this._onResponse = onResponse;\n return this;\n }\n\n onError(onError: (e?: Event) => void): this {\n this._onError = onError;\n return this;\n }\n\n async(async: boolean = true): this {\n this._async = async;\n return this;\n }\n\n noCache(noCache: boolean = true): this {\n this._noCache = noCache;\n return this;\n }\n\n abort(): this {\n if (this._xhr) {\n this._xhr.abort();\n }\n return this;\n }\n\n send(data?: any, contentType?: string): void {\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n // this._headers[\"X-Requested-With\"] = \"XMLHttpRequest\";\n this._send(data, this._headers);\n }\n\n sendPromise(data?: any, contentType?: string): Promise<HttpResponse> {\n return new Promise<HttpResponse>((res, rej) => {\n this._onResponse = res;\n this._onError = rej;\n if (contentType) {\n this._headers[\"Content-Type\"] = contentType;\n }\n this._send(data, this._headers);\n });\n }\n\n private _send(data?: any, headers?: { [key: string]: string }): void {\n const xhr = new XMLHttpRequest();\n this._xhr = xhr;\n\n let url = this._url || \"\";\n if (this._query) {\n const query = encodeUrlQuery(this._query);\n url = query ? `${url}?${query}` : url;\n }\n if (this._noCache) {\n url += (/\\?/.test(url) ? \"&\" : \"?\") + new Date().getTime();\n }\n // console.debug(\"HttpRequest: \" + this._method + \" \" + url, data);\n\n if (this._responseType) {\n this._xhr.responseType = this._responseType;\n }\n\n if (\"onprogress\" in xhr) {\n if (this._onProgress) {\n const onprogress = (e: ProgressEvent) => {\n this._onProgress!({\n loaded: e.loaded,\n total: e.lengthComputable ? e.total : undefined\n });\n };\n xhr.upload.onprogress = onprogress;\n xhr.onprogress = onprogress;\n }\n }\n\n HttpRequest.xhrs.push(this);\n\n xhr.open(this._method, url, this._async);\n\n for (const header in headers) {\n if (headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n\n if (this._timeout) {\n xhr.timeout = this._timeout;\n }\n\n if (\"ontimeout\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.ontimeout = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (\"onabort\" in xhr) {\n if (this._onError || HttpRequest.onError) {\n xhr.onabort = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n }\n\n if (this._onError || HttpRequest.onError) {\n xhr.onerror = (e: ProgressEvent) => {\n HttpRequest.onError && HttpRequest.onError(e);\n this._onError && this._onError(e);\n };\n }\n\n if (this._async) {\n if (\"onload\" in xhr) {\n xhr.onload = (e: ProgressEvent) => {\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n if (xhr.status >= 200 && xhr.status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n };\n } else {\n // legacy\n (xhr as any).onreadystatechange = (e: Event) => {\n switch ((xhr as any).readyState) {\n // 0 UNSENT Client has been created. open() not called yet.\n // 1 OPENED open() has been called.\n // 2 HEADERS_RECEIVED send() has been called, and headers and status are available.\n // 3 LOADING Downloading; responseText holds partial data.\n // 4 DONE The operation is complete.\n // case 3: // loading\n // if (this._onProgress) {\n // this._onProgress(new HttpResponse(httpRequest));\n // }\n // break;\n case 4: // done\n (HttpRequest as any).xhrs = HttpRequest.xhrs.filter(x => this !== x);\n // const httpStatusOk = xhr.status >= 200 && xhr.status < 300;\n // schemes other than http/https (file, ftp)\n // const fileFtpStatusOk = xhr.status === 0 && !this._url.match(/^https?:\\/\\//);\n // const fileFtpStatusOk = xhr.status === 0 && !xhr.responseURL.match(/^https?:\\/\\//);\n // if (httpStatusOk || fileFtpStatusOk) {\n if ((xhr as any).status >= 200 && (xhr as any).status < 300) {\n const respone = new HttpResponse(xhr);\n if (HttpRequest.onResponse) {\n HttpRequest.onResponse(respone);\n }\n if (this._onResponse) {\n this._onResponse(respone);\n }\n } else {\n if (HttpRequest.onError) {\n HttpRequest.onError(e);\n }\n if (this._onError) {\n this._onError(e);\n }\n }\n break;\n default:\n }\n };\n }\n\n if (data !== undefined) {\n if (\n typeof data === \"string\" ||\n data instanceof FormData ||\n data instanceof Blob\n ) {\n xhr.send(data);\n } else {\n if (!this._headers[\"Content-Type\"]) {\n xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n }\n xhr.send(JSON.stringify(data));\n }\n } else {\n xhr.send();\n }\n } else {\n if (data) {\n const payload = (typeof data === \"string\") ? data : JSON.stringify(data);\n xhr.send(payload);\n } else {\n xhr.send();\n }\n return JSON.parse(xhr.responseText);\n }\n }\n\n}\n\n\nexport function get(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"GET\").url(url, query);\n}\n\nexport function post(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"POST\").url(url, query);\n}\n\nexport function put(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PUT\").url(url, query);\n}\n\nexport function patch(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"PATCH\").url(url, query);\n}\n\nexport function del(url: string, query?: Object): HttpRequest {\n return new HttpRequest().method(\"DELETE\").url(url, query);\n}\n\nexport function onRequest(onRequest: (req: HttpRequest) => void): void {\n HttpRequest.onRequest = onRequest;\n}\n\nexport function onResponse(onResponse: (req: HttpResponse) => void): void {\n HttpRequest.onResponse = onResponse;\n}\n\nexport function onError(onError: (req: Event) => void): void {\n HttpRequest.onError = onError;\n}\n\nexport const http = {\n get,\n post,\n put,\n delete: del,\n onRequest,\n onResponse,\n onError\n};\n","\nexport function scriptLib(url: string,\n namespace: string,\n callback?: (lib: any) => void): void {\n script(url, () => {\n const lib = (window as any)[namespace];\n (window as any)[namespace] = {};\n delete (window as any)[namespace];\n callback && callback(lib);\n });\n}\n\nexport function script(url: string, callback?: () => void): void {\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.charset = \"utf-8\";\n script.src = url;\n if ((script as any).readyState) { // IE\n (script as any).onreadystatechange = () => {\n const loaded = (script as any).readyState === \"loaded\";\n const completed = (script as any).readyState === \"complete\";\n if (loaded || completed) {\n (script as any).onreadystatechange = null;\n if (typeof callback === \"function\") {\n callback();\n }\n }\n };\n } else { // Others\n script.onload = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n }\n document.getElementsByTagName(\"head\")[0].appendChild(script);\n}\n\nexport function scripts(urls: string[], callback?: () => void): void {\n urls.reverse();\n let callbackTmp = callback;\n for (let i = 0; i < urls.length; i++) {\n const url = urls[i];\n callbackTmp = (\n (url, callbackTmp) => () =>\n script(url, () => callbackTmp && callbackTmp())\n )(url, callbackTmp);\n }\n callbackTmp && callbackTmp();\n}\n\nexport function image(url: string, callback?: () => void): void {\n const img = new Image();\n img.src = url;\n if ((img as any).readyState) {\n (img as any).onreadystatechange = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n } else {\n img.onload = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n }\n}\n\nexport function css(url: string, callback?: () => void): void {\n const link = <HTMLLinkElement> document.createElement(\"link\");\n link.type = \"text/css\";\n link.rel = \"stylesheet\";\n link.href = url;\n if ((link as any).readyState) {\n (link as any).onreadystatechange = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n } else {\n link.onload = () => {\n if (typeof callback === \"function\") {\n callback();\n }\n };\n }\n document.getElementsByTagName(\"head\")[0].appendChild(link);\n}\n","\nexport function objPaths(obj: object): string[][] {\n const valPaths = objValuePaths(obj);\n return Object.keys(valPaths)\n .map(val => valPaths[val])\n .reduce((a, paths) => a.concat(paths));\n}\n\nexport function objValuePaths(obj: any, root: string[] = [], result: object = {}): any {\n const ok = Object.keys(obj);\n return ok.reduce<any>((res, key) => {\n const path = root.concat(key);\n typeof obj[key] === \"object\" && obj[key] !== null\n ? objValuePaths(obj[key], path, res)\n : res[obj[key]] === 0 || res[obj[key]]\n ? res[obj[key]].push(path)\n : (res[obj[key]] = [path]);\n return res;\n }, result);\n}\n\n\n// TEST\n\n// const obj = {\n// obj1: {\n// obj2: {\n// data1: 213,\n// data2: \"1231\",\n// obj3: {\n// data: \"milf\"\n// }\n// }\n// },\n// obj4: {\n// description: \"toto\",\n// cougars: \"Jodi\",\n// category: \"milf\"\n// }\n// };\n\n// const vpaths = objValuePaths(obj);\n// const paths = objPaths(obj);\n// const strPaths = paths.map(p => p.join(\".\"));\n\n// console.log(JSON.stringify(obj, null, 4));\n// console.log(JSON.stringify(vpaths, null, 4));\n// console.log(JSON.stringify(paths, null, 4));\n// console.log(JSON.stringify(strPaths, null, 4));\n","// implemented based on https://github.com/mench/hash-router/\n\ntype Path = string | RegExp | Array<string>;\n\nexport type Keys = { name: string; optional: boolean }[];\n\nexport class Emitter {\n\n private _callbacks: { [key: string]: Function[] } = {};\n\n on(event: string, fn: Function): this {\n if (!(event in this._callbacks)) {\n this._callbacks[event] = [];\n }\n this._callbacks[event].push(fn);\n return this;\n }\n\n emit(event: string, ...args: any[]): this {\n if (event in this._callbacks) {\n this._callbacks[event].forEach(cb => cb.apply(this, args));\n }\n return this;\n }\n\n off(event: string, fn?: Function) {\n if (!this._callbacks || arguments.length === 0) {\n this._callbacks = {};\n return this;\n }\n const callbacks = this._callbacks[event];\n if (!callbacks) {\n return this;\n }\n if (arguments.length === 1) {\n delete this._callbacks[event];\n return this;\n }\n for (let i = 0; i < callbacks.length; i++) {\n const callback = callbacks[i];\n if (callback === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n return this;\n }\n}\n\nexport class Route {\n\n private _regex!: RegExp;\n private _params: any = {};\n\n readonly path: string;\n readonly keys: Keys = [];\n\n constructor(path: string) {\n this.path = path;\n this._pathParse(path, false, false);\n }\n\n match(path: string, params: string[]) {\n const m = this._regex.exec(path);\n if (!m) {\n return false;\n }\n for (let i = 1; i < m.length; ++i) {\n const key = this.keys[i - 1];\n const val = \"string\" === typeof m[i] ? decodeURIComponent(m[i]) : m[i];\n if (key) {\n this._params[key.name] = val;\n }\n params.push(val);\n }\n return true;\n }\n\n private _pathParse(path: Path, sensitive: boolean, strict: boolean): void {\n if (path instanceof RegExp) {\n this._regex = path;\n return;\n }\n if (path instanceof Array) {\n path = \"(\" + path.join(\"|\") + \")\";\n }\n path = path\n .concat(strict ? \"\" : \"/?\")\n .replace(/\\/\\(/g, \"(?:/\")\n .replace(/\\+/g, \"__plus__\")\n .replace(\n /(\\/)?(\\.)?:(\\w+)(?:(\\(.*?\\)))?(\\?)?/g,\n (\n _: any,\n slash: string,\n format: string,\n key: string,\n capture: boolean,\n optional: boolean\n ) => {\n this.keys.push({ name: key, optional: !!optional });\n slash = slash || \"\";\n return (\n \"\" +\n (optional ? \"\" : slash) +\n \"(?:\" +\n (optional ? slash : \"\") +\n (format || \"\") +\n (capture || ((format && \"([^/.]+?)\") || \"([^/]+?)\")) +\n \")\" +\n (optional || \"\")\n );\n }\n )\n .replace(/([\\/.])/g, \"\\\\$1\")\n .replace(/__plus__/g, \"(.+)\")\n .replace(/\\*/g, \"(.*)\");\n this._regex = new RegExp(\"^\" + path + \"$\", sensitive ? \"\" : \"i\");\n }\n\n}\n\nexport class Router extends Emitter {\n\n static default: Router = new Router();\n\n static route(path: string, handler: Function): Router {\n Router.default.route(path, handler);\n return Router.default;\n }\n\n static navigate(path: string, force = false): Router {\n Router.default.navigate(path, force);\n return Router.default;\n }\n\n static start(): Router {\n Router.default.start();\n return Router.default;\n }\n\n static hash(): string {\n return Router.default.hash();\n }\n\n static handle(hash: string): Router {\n return Router.default.handle(hash);\n }\n\n private _routes: Route[] = [];\n\n constructor() {\n super();\n if (window.addEventListener) {\n window.addEventListener(\"hashchange\", this._onHashChange, false);\n } else {\n (window as any).attachEvent(\"onhashchange\", this._onHashChange);\n }\n }\n\n route(path: string, handler: Function): this {\n const route = new Route(path);\n this._routes.push(route);\n this.on(path, (params: any, route: any) => {\n return handler.apply(route, params);\n });\n return this;\n }\n\n navigate(path: string, force = false): this {\n const hash = this.hash();\n window.location.hash = path;\n if (force && hash === path) {\n this.handle(path);\n }\n return this;\n }\n\n start(): this {\n this._onHashChange();\n return this;\n }\n\n hash(): string {\n return window.location.hash.substring(1);\n }\n\n handle(hash: string): this {\n for (const route of this._routes) {\n const params: string[] = [];\n if (route.match(hash, params)) {\n this.emit(route.path, params, route);\n break;\n }\n }\n return this;\n }\n\n private _onHashChange = () => {\n this.handle(this.hash());\n }\n\n}\n\nexport function route(path: string, handler: Function) {\n return Router.route(path, handler);\n}\n","import { Events } from \"./events\";\n\nexport class Settings<T extends { [key: string]: any }> {\n\n readonly name: string;\n readonly props: T;\n\n readonly events = new Events<T & { \"\": Partial<T> }, Settings<T>>();\n\n constructor(props: T, name: string = \"settings\") {\n this.props = props;\n this.name = name;\n }\n\n getProps(): T {\n return this.props;\n }\n\n setProps(props: Partial<T>): this {\n Object.keys(props).forEach(p => ((this.props as any)[p] = props[p]));\n this.events.emit(\"\", props);\n return this;\n }\n\n getProp<K extends keyof T>(key: K): T[K] {\n return (this.props)[key];\n }\n\n setProp<K extends keyof T>(key: K, value: T[K]): this {\n (this.props)[key] = value;\n const props: Partial<T> = {};\n props[key] = value;\n this.events.emit(key as string, value);\n return this;\n }\n\n}\n\n// Test\n\n// const x = { n: 2, s: \"s\" };\n// const s = new Settings<typeof x>(x);\n\n// s.setProps({ n: 3 });\n\n// console.log(typeof s.getProp(\"n\")); // number\n// console.log(typeof s.getProp(\"s\")); // string\n\n// s.setProps(JSON.parse(window.localStorage[s.name]));\n// s.events.any(data => (window.localStorage[s.name] = JSON.stringify(s.props)));\n","\nexport type SlotCallback<T> = (data?: T) => void;\n\ninterface Slot<T> {\n callback: SlotCallback<T>;\n object?: any;\n}\n\nexport interface Sig<T> {\n onConnect(onConnect: (connNo: number) => void): void;\n onDisconnect(onDisconnect: (connNo: number) => void): void;\n connNo(): number;\n connect(callback: SlotCallback<T>, object?: any): void;\n disconnect(callback: SlotCallback<T>, object?: any): void;\n disconnectAll(): void;\n freeze(): void;\n unfreeze(): void;\n}\n\nexport class Signal<T> implements Sig<T> {\n\n private _slots: Slot<T>[] = [];\n private _emit: boolean = true;\n\n private _onConnect?: ((connNo: number) => void);\n private _onDisconnect?: ((connNo: number) => void);\n\n constructor() {\n }\n\n onConnect(onConnect: (connNo: number) => void): void {\n this._onConnect = onConnect;\n }\n\n onDisconnect(onDisconnect: (connNo: number) => void): void {\n this._onDisconnect = onDisconnect;\n }\n\n connNo(): number {\n return this._slots.length;\n }\n\n // ES5\n // set slot(slot:(data?:T) => void) {\n // this.connect(slot);\n // }\n\n connect(callback: (data?: T) => void): void;\n connect(callback: (data?: T) => void, object?: Object): void;\n connect(callback: (data?: any) => void, object?: Object): void {\n if (typeof callback !== \"function\") return;\n if (object) {\n this._slots.push({ callback: callback, object: object });\n } else {\n this._slots.push({ callback: callback });\n }\n if (this._onConnect) {\n this._onConnect(this._slots.length);\n }\n }\n\n disconnect(callback: (data?: T) => void, object?: Object): void {\n if (typeof callback !== \"function\") return;\n this._slots = this._slots.filter(slot => {\n return (object === undefined) ?\n (slot.callback !== callback) :\n (slot.callback !== callback) && (slot.object !== object);\n });\n if (this._onDisconnect) {\n this._onDisconnect(this._slots.length);\n }\n }\n\n disconnectAll(): void {\n this._slots = [];\n if (this._onDisconnect) {\n this._onDisconnect(this._slots.length);\n }\n }\n\n freeze(): void {\n this._emit = false;\n }\n\n unfreeze(): void {\n this._emit = true;\n }\n\n emit(this: Signal<void>): any[];\n emit(this: Signal<T>, data?: T): any[];\n emit(this: Signal<any>, data?: any): any[] {\n if (this._emit && this._slots.length) {\n return this._slots.map(slot => {\n const object: Object = slot.object;\n if (object) {\n return slot.callback.call(object, data);\n } else {\n return slot.callback(data);\n }\n });\n }\n return [];\n }\n\n /*\n emitAsync(this: Signal<void>): void;\n emitAsync(this: Signal<T>, data?: T): void;\n emitAsync(this: Signal<any>, data?: any): void {\n if (this._emit && this._slots.length) {\n this._slots.forEach(slot => {\n const object: Object = slot.object;\n if (object) {\n setTimeout(() => {\n slot.callback.call(object, data);\n });\n } else {\n setTimeout(() => {\n slot.callback(data);\n });\n }\n });\n }\n }\n */\n\n}\n","// https://gist.github.com/WebReflection/8f227532143e63649804\n// accepts optional transformer\n// now transformers are compatible with ES6\n//\n// examples:\n// 'test1 ${1 + 2} test2 ${3 + 4}'.template();\n// 'Hello ${name}!'.template({name: 'Andrea'});\n//\n/*\n\nString.prototype[\"template\"] = function (fn, object) {\n \"use strict\";\n // Andrea Giammarchi - WTFPL License\n let\n hasTransformer = typeof fn === \"function\",\n stringify = JSON.stringify,\n re = /\\$\\{([\\S\\s]*?)\\}/g,\n strings = [],\n values = hasTransformer ? [] : strings,\n i = 0,\n str,\n m\n ;\n while ((m = re.exec(this))) {\n str = this.slice(i, m.index);\n if (hasTransformer) {\n strings.push(str);\n values.push(\"(\" + m[1] + \")\");\n } else {\n strings.push(stringify(str), \"(\" + m[1] + \")\");\n }\n i = re.lastIndex;\n }\n str = this.slice(i);\n strings.push(hasTransformer ? str : stringify(str));\n if (hasTransformer) {\n str = \"function\" + (Math.random() * 1e5 | 0);\n strings = [\n str,\n \"with(this)return \" + str + \"(\" + stringify(strings) + (\n values.length ? (\",\" + values.join(\",\")) : \"\"\n ) + \")\"\n ];\n } else {\n strings = [\"with(this)return \" + strings.join(\"+\")];\n }\n return Function.apply(null, strings).call(\n hasTransformer ? object : fn,\n hasTransformer && fn\n );\n};\n*/\n\n/**\n * Template with same syntax as template literal\n *\n * @param templateOrId\n * @param data\n * @returns {(data: Object) => string | string}\n */\nexport function tmpl(templateOrId: string, data?: Object) {\n const template = !/[^a-zA-Z0-9_-]+/.test(templateOrId)\n ? document.getElementById(templateOrId)!.innerHTML\n : templateOrId;\n let\n stringify = JSON.stringify,\n re = /\\$\\{([\\S\\s]*?)\\}/g,\n strings: any[] = [],\n i = 0,\n str: string,\n m: RegExpExecArray | null;\n while ((m = re.exec(template))) {\n str = template.slice(i, m.index);\n strings.push(stringify(str), \"(\" + m[1] + \")\");\n i = re.lastIndex;\n }\n str = template.slice(i);\n strings.push(stringify(str));\n const fn = new Function(\"obj\", \"with(obj)return \" + strings.join(\"+\"));\n return data ? fn(data) : fn;\n}\n\n\nconst template_cache: any = {};\n\n/**\n * Template engine\n *\n * @param templateOrId\n * @param data\n * @returns {(data:Object)=>string|string}\n */\nexport function template(templateOrId: string, data?: any) {\n // Simple JavaScript Templating\n // John Resig - http://ejohn.org/ - MIT Licensed\n // Figure out if we're getting a template, or if we need to\n // load the template - and be sure to cache the result.\n // var fn = !/\\W/.test(str) ?\n const fn: Function = !/[^a-zA-Z0-9_-]+/.test(templateOrId) ?\n template_cache[templateOrId] = template_cache[templateOrId] ||\n template(document.getElementById(templateOrId)!.innerHTML) :\n // Generate a reusable function that will serve as a template\n // generator (and which will be cached).\n new Function(\"obj\",\n \"var p=[],print=function(){p.push.apply(p,arguments);};\" +\n // Introduce the data as local variables using with(){}\n \"with(obj){p.push('\" +\n // Convert the template into pure JavaScript\n templateOrId\n .replace(/[\\r\\t\\n]/g, \" \")\n .split(\"<%\").join(\"\\t\")\n .replace(/((^|%>)[^\\t]*)'/g, \"$1\\r\")\n .replace(/\\t=(.*?)%\\>/g, \"',$1,'\")\n .split(\"\\t\").join(\"');\")\n .split(\"%>\").join(\"\\np.push('\")\n .split(\"\\r\").join(\"\\\\'\")\n + \"');}return p.join('');\");\n // Provide some basic currying to the user\n return data ? fn(data) : fn;\n}\n","/**\n * ```\n * const dataStrObject = { a: \"A\", b: \"B\" };\n * console.log(\"tmpls: {{a}} {{b}} {{a}}\", \"|\", tmpls(\"tmpls: {{a}} {{b}} {{a}}\", dataStrObject));\n *\n * const dataStrArray = [\"A\", \"B\"];\n * console.log(\"tmpls: {{0}} {{1}} {{0}}\", \"|\", tmpls(\"tmpla: {{0}} {{1}} {{0}}\", dataStrArray));\n * ```\n *\n * @param tmpl Template string\n * @param data Template data\n */\nexport function tmpls(tmpl: string, data: { [k: string]: any }): string {\n return Object.keys(data)\n .map(k => [k, data[k]])\n .reduce((t, d) =>\n t.replace(new RegExp(`\\\\{\\\\{${d[0]}\\\\}\\\\}`, \"g\"), String(d[1])), tmpl);\n}\n\n/**\n * ```\n * const dataArray = [\"A\", \"B\"];\n * console.log(\"tmpla: ${0} ${1} ${0}\", \"|\", tmpla(\"tmpla: ${0} ${1} ${0}\", dataArray));\n * ```\n *\n * @param tmpl Template string\n * @param data Template data\n */\nexport function tmpla(tmpl: string, data: string[]): string {\n return data.reduce((t, d, i) => t.replace(new RegExp(`\\\\$\\\\{${i}\\\\}`, \"g\"), d), tmpl);\n}\n\n/**\n * ```\n * const dataObject = { a: \"A\", b: \"B\" };\n * console.log(\"tmplo: ${a} ${b} ${a}\", \"|\", tmplo(\"tmplo: ${a} ${b} ${a}\", dataObject));\n * ```\n *\n * @param tmpl Template string\n * @param data Template data\n */\nexport function tmplo(tmpl: string, data: { [k: string]: string }): string {\n return Object.keys(data)\n .map(k => [k, data[k]])\n .reduce((t, d) => t.replace(new RegExp(`\\\\$\\\\{${d[0]}\\\\}`, \"g\"), d[1]), tmpl);\n}\n\n/**\n * const t = tmpl<typeof dataObject>(\"tmpl : ${a} ${b} ${a}\");\n * console.log(\"tmpl : ${a} ${b} ${a}\", \"|\", t(dataObject));\n * console.log(\"tmpl : \", t);\n *\n * const tl = tmpl(\"1+2=${1 + 2} 3+x=${3 + x[1]}\");\n * console.log(\"tmpl : 1+2=${1 + 2} 3+x=${3 + x[1]}\", \"|\", tl({ x: [2] }));\n * console.log(\"tmpl : \", tl);\n *\n * @param template Template string\n */\nexport function tmpl<T = any>(template: string): (data: { [key in keyof T]: any }) => string {\n const stringify = JSON.stringify;\n const re = /\\$\\{([\\S\\s]*?)\\}/g;\n const strings: string[] = [];\n let m: RegExpExecArray | null;\n let i = 0;\n let str: string;\n while ((m = re.exec(template))) {\n str = template.slice(i, m.index);\n strings.push(stringify(str), \"(\" + m[1] + \")\");\n i = re.lastIndex;\n }\n str = template.slice(i);\n strings.push(stringify(str));\n const fn = new Function(\"obj\", \"with(obj)return \" + strings.join(\"+\"));\n return fn as (data: Object) => string;\n}\n\n// TEST\n\n// const dataStrObject = { a: \"A\", b: \"B\" };\n// console.log(\"tmpls: {{a}} {{b}} {{a}}\", \"|\", tmpls(\"tmpls: {{a}} {{b}} {{a}}\", dataStrObject));\n\n// const dataStrArray = [\"A\", \"B\"];\n// console.log(\"tmpls: {{0}} {{1}} {{0}}\", \"|\", tmpls(\"tmpla: {{0}} {{1}} {{0}}\", dataStrArray));\n\n// const dataArray = [\"A\", \"B\"];\n// console.log(\"tmpla: ${0} ${1} ${0}\", \"|\", tmpla(\"tmpla: ${0} ${1} ${0}\", dataArray));\n\n// const dataObject = { a: \"A\", b: \"B\" };\n// console.log(\"tmplo: ${a} ${b} ${a}\", \"|\", tmplo(\"tmplo: ${a} ${b} ${a}\", dataObject));\n\n// const t = tmpl<typeof dataObject>(\"tmpl : ${a} ${b} ${a}\");\n// console.log(\"tmpl : ${a} ${b} ${a}\", \"|\", t(dataObject));\n// console.log(\"tmpl : \", t);\n\n// const tl = tmpl(\"1+2=${1 + 2} 3+x=${3 + x[1]}\");\n// console.log(\"tmpl : 1+2=${1 + 2} 3+x=${3 + x[1]}\", \"|\", tl({ x: [2] }));\n// console.log(\"tmpl : \", tl);\n","import * as debounce from \"./debounce\";\nimport * as dom from \"./dom\";\nimport * as encode from \"./encode\";\nimport * as events from \"./events\";\nimport * as form from \"./form\";\nimport * as hash from \"./hash\";\nimport * as history from \"./history\";\nimport * as hsmlapp from \"./hsml-app\";\nimport * as hsmldom from \"./hsml-dom\";\nimport * as hsmlh from \"./hsml-h\";\nimport * as hsmlhtml from \"./hsml-html\";\nimport * as hsmlidom from \"./hsml-idom\";\nimport * as hsmlsvacctrl from \"./hsml-svac-ctrl\";\nimport * as hsmlsvachtml from \"./hsml-svac-html\";\nimport * as hsmlsvac from \"./hsml-svac\";\nimport * as hsmlwidget from \"./hsml-widget\";\nimport * as hsml from \"./hsml\";\nimport * as http from \"./http\";\nimport * as load from \"./load\";\nimport * as objpaths from \"./objpaths\";\nimport * as router from \"./router\";\nimport * as settings from \"./settings\";\nimport * as signal from \"./signal\";\nimport * as template from \"./template\";\nimport * as tmpl from \"./tmpl\";\nimport * as validators from \"./validators\";\n\nexport {\n debounce,\n dom,\n encode,\n events,\n form,\n hash,\n history,\n hsmlapp,\n hsmldom,\n hsmlh,\n hsmlhtml,\n hsmlidom,\n hsmlsvacctrl,\n hsmlsvachtml,\n hsmlsvac,\n hsmlwidget,\n hsml,\n http,\n load,\n objpaths,\n router,\n settings,\n signal,\n template,\n tmpl,\n validators\n};\n"],"sourceRoot":""}
|