@relax.js/core 1.0.3 → 1.0.5

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.
Files changed (90) hide show
  1. package/README.md +194 -188
  2. package/dist/DependencyInjection.d.ts +45 -27
  3. package/dist/collections/LinkedList.d.ts +9 -8
  4. package/dist/collections/index.js +1 -1
  5. package/dist/collections/index.js.map +3 -3
  6. package/dist/collections/index.mjs +1 -1
  7. package/dist/collections/index.mjs.map +3 -3
  8. package/dist/di/index.js +1 -1
  9. package/dist/di/index.js.map +3 -3
  10. package/dist/di/index.mjs +1 -1
  11. package/dist/di/index.mjs.map +3 -3
  12. package/dist/elements/index.js +1 -1
  13. package/dist/elements/index.js.map +1 -1
  14. package/dist/errors.d.ts +20 -0
  15. package/dist/forms/FormValidator.d.ts +3 -22
  16. package/dist/forms/ValidationRules.d.ts +4 -6
  17. package/dist/forms/index.js +1 -1
  18. package/dist/forms/index.js.map +4 -4
  19. package/dist/forms/index.mjs +1 -1
  20. package/dist/forms/index.mjs.map +4 -4
  21. package/dist/forms/setFormData.d.ts +39 -1
  22. package/dist/html/TableRenderer.d.ts +1 -0
  23. package/dist/html/index.js +1 -1
  24. package/dist/html/index.js.map +3 -3
  25. package/dist/html/index.mjs +1 -1
  26. package/dist/html/index.mjs.map +3 -3
  27. package/dist/html/template.d.ts +4 -0
  28. package/dist/http/ServerSentEvents.d.ts +1 -1
  29. package/dist/http/SimpleWebSocket.d.ts +1 -1
  30. package/dist/http/http.d.ts +1 -0
  31. package/dist/http/index.js +1 -1
  32. package/dist/http/index.js.map +3 -3
  33. package/dist/http/index.mjs +1 -1
  34. package/dist/http/index.mjs.map +3 -3
  35. package/dist/i18n/icu.d.ts +1 -1
  36. package/dist/i18n/index.js +1 -1
  37. package/dist/i18n/index.js.map +2 -2
  38. package/dist/i18n/index.mjs +1 -1
  39. package/dist/i18n/index.mjs.map +2 -2
  40. package/dist/index.js +3 -3
  41. package/dist/index.js.map +3 -3
  42. package/dist/index.mjs +3 -3
  43. package/dist/index.mjs.map +3 -3
  44. package/dist/routing/NavigateRouteEvent.d.ts +4 -4
  45. package/dist/routing/index.js +3 -3
  46. package/dist/routing/index.js.map +3 -3
  47. package/dist/routing/index.mjs +3 -3
  48. package/dist/routing/index.mjs.map +3 -3
  49. package/dist/routing/navigation.d.ts +1 -1
  50. package/dist/routing/routeTargetRegistry.d.ts +1 -0
  51. package/dist/routing/types.d.ts +2 -1
  52. package/dist/templates/NodeTemplate.d.ts +3 -1
  53. package/dist/utils/index.d.ts +1 -1
  54. package/dist/utils/index.js +1 -1
  55. package/dist/utils/index.js.map +3 -3
  56. package/dist/utils/index.mjs +1 -1
  57. package/dist/utils/index.mjs.map +3 -3
  58. package/docs/Architecture.md +333 -333
  59. package/docs/DependencyInjection.md +277 -237
  60. package/docs/Errors.md +87 -87
  61. package/docs/GettingStarted.md +238 -231
  62. package/docs/Pipes.md +5 -5
  63. package/docs/Translations.md +167 -312
  64. package/docs/WhyRelaxjs.md +336 -336
  65. package/docs/api.json +93193 -0
  66. package/docs/elements/dom.md +102 -102
  67. package/docs/forms/creating-form-components.md +924 -924
  68. package/docs/forms/form-api.md +94 -94
  69. package/docs/forms/forms.md +99 -99
  70. package/docs/forms/patterns.md +311 -311
  71. package/docs/forms/reading-writing.md +465 -365
  72. package/docs/forms/validation.md +351 -351
  73. package/docs/html/TableRenderer.md +291 -291
  74. package/docs/html/html.md +175 -175
  75. package/docs/html/index.md +54 -54
  76. package/docs/html/template.md +422 -422
  77. package/docs/http/HttpClient.md +459 -459
  78. package/docs/http/ServerSentEvents.md +184 -184
  79. package/docs/http/index.md +109 -109
  80. package/docs/i18n/i18n.md +49 -4
  81. package/docs/i18n/intl-standard.md +178 -178
  82. package/docs/routing/RouteLink.md +98 -98
  83. package/docs/routing/Routing.md +332 -332
  84. package/docs/routing/layouts.md +207 -207
  85. package/docs/setup/bootstrapping.md +154 -0
  86. package/docs/setup/build-and-deploy.md +183 -0
  87. package/docs/setup/project-structure.md +170 -0
  88. package/docs/setup/vite.md +175 -0
  89. package/docs/utilities.md +143 -143
  90. package/package.json +4 -2
@@ -1,2 +1,2 @@
1
- var ie=Object.create;var _=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var z=t=>r=>{var e=t[r];if(e)return e();throw new Error("Module not found in bundle: "+r)};var C=(t,r)=>()=>(r||t((r={exports:{}}).exports,r),r.exports);var pe=(t,r,e,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of le(r))!ue.call(t,n)&&n!==e&&_(t,n,{get:()=>r[n],enumerable:!(o=ae(r,n))||o.enumerable});return t};var b=(t,r,e)=>(e=t!=null?ie(ce(t)):{},pe(r||!t||!t.__esModule?_(e,"default",{value:t,enumerable:!0}):e,t));var W=C((lt,fe)=>{fe.exports={greeting:"Hello, {name}!",items:"{count, plural, one {# item} other {# items}}"}});var U=C((ct,ge)=>{ge.exports={today:"today",yesterday:"yesterday",daysAgo:"{count, plural, one {# day ago} other {# days ago}}",pieces:"{count, plural, =0 {none} one {one} other {# pcs}}"}});var G=C((ut,he)=>{he.exports={required:"This field is required.",range:"Number must be between {min} and {max}, was {actual}.",digits:"Please enter only digits."}});var Z=C((pt,ye)=>{ye.exports={greeting:"Hej, {name}!",items:"{count, plural, one {# sak} other {# saker}}"}});var J=C((dt,xe)=>{xe.exports={today:"idag",yesterday:"ig\xE5r",daysAgo:"{count, plural, one {# dag sedan} other {# dagar sedan}}",pieces:"{count, plural, =0 {inga} one {en} other {# st}}"}});var X=C((mt,Ee)=>{Ee.exports={required:"Detta f\xE4lt \xE4r obligatoriskt.",range:"Talet m\xE5ste vara mellan {min} och {max}, var {actual}.",digits:"Ange endast siffror."}});var R=new Map;function de(t){return R.has(t)||R.set(t,new Intl.PluralRules(t)),R.get(t)}function j(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function me(t,r,e="en"){return t.replace(/\{(\w+)(?:, (plural|select),((?:[^{}]*\{[^{}]*\})+))?\}/g,(o,n,s,a)=>{let i=r[n];if(s==="plural"){let l=new RegExp(`=${j(String(i))}\\s*\\{([^{}]*)\\}`).exec(a);if(l)return l[1].replace(`{${n}}`,String(i)).replace("#",String(i));let p=de(e).select(i),u=new RegExp(`${p}\\s*\\{([^{}]*)\\}`).exec(a)||new RegExp("other\\s*\\{([^{}]*)\\}").exec(a);return u?u[1].replace(`{${n}}`,String(i)).replace("#",String(i)):String(i)}if(s==="select"){let l=j(String(i)),c=new RegExp(`\\b${l}\\s*\\{([^{}]*)\\}`).exec(a)||new RegExp("\\bother\\s*\\{([^{}]*)\\}").exec(a);return c?c[1]:String(i)}return i!==void 0?String(i):`{${n}}`})}var q=me;var ht=z({"./locales/en/r-common.json":()=>Promise.resolve().then(()=>b(W())),"./locales/en/r-pipes.json":()=>Promise.resolve().then(()=>b(U())),"./locales/en/r-validation.json":()=>Promise.resolve().then(()=>b(G())),"./locales/sv/r-common.json":()=>Promise.resolve().then(()=>b(Z())),"./locales/sv/r-pipes.json":()=>Promise.resolve().then(()=>b(J())),"./locales/sv/r-validation.json":()=>Promise.resolve().then(()=>b(X()))});var Te="en",A=Te;var ve={},Q=null;function w(t,r){let[e,o]=t.includes(":")?t.split(":"):["r-common",t],n=ve[e]?.[o];if(!n)return Q&&Q(o,e,A),t;try{return q(n,r,A)}catch{return t}}function S(){return A}function Ce(t){return String(t).toUpperCase()}function be(t){return String(t).trimEnd().trimStart()}function we(t){return String(t).toLowerCase()}function Ne(t){let r=String(t);return r.charAt(0).toUpperCase()+r.slice(1)}function Me(t,r){let e=String(t),o=parseInt(r,10);return e.length>o?e.substring(0,o-3)+"...":e}function Pe(t,r="USD"){let e=S();return new Intl.NumberFormat(e,{style:"currency",currency:r}).format(t)}function ke(t,r){let e=new Date(t),o=S();return r==="short"?e.toLocaleDateString(o):r==="long"?e.toLocaleDateString(o,{weekday:"long",year:"numeric",month:"long",day:"numeric"}):e.toISOString()}function Le(t){if(!t)return"n/a";let r=new Date(t),e=new Date;r.setHours(0,0,0,0),e.setHours(0,0,0,0);let o=e.getTime()-r.getTime(),n=Math.round(o/(1e3*60*60*24));return n===0?w("r-pipes:today"):n===1?w("r-pipes:yesterday"):w("r-pipes:daysAgo",{count:n})}function Re(t){if(t==null)return"n/a";let r=Number(t);return w("r-pipes:pieces",{count:r})}function Ae(t,r=","){return Array.isArray(t)?t.join(r):t}function Se(t){return!Array.isArray(t)||t.length===0?"":t[0]}function $e(t){return!Array.isArray(t)||t.length===0?"":t[t.length-1]}function He(t){return typeof t!="object"||t===null?[]:Object.keys(t)}function Fe(t,r){return t||r}function Ie(t,r,e){return t?r:e}function Be(){let t=new Map;return t.set("uppercase",Ce),t.set("lowercase",we),t.set("capitalize",Ne),t.set("trim",be),t.set("shorten",Me),t.set("currency",Pe),t.set("date",ke),t.set("daysAgo",Le),t.set("pieces",Re),t.set("join",Ae),t.set("first",Se),t.set("last",$e),t.set("keys",He),t.set("default",Fe),t.set("ternary",Ie),{lookup(r){return t.get(r)},get(r){var e=t.get(r);if(!e)throw Error("Pipe '"+r+"' not found.");return e},has(r){return t.has(r)}}}var v=Be();function Y(t,r,e=v){return r.reduce((o,n)=>{let[s,...a]=n.split(":").map(i=>i.trim());if(!e.has(s))return`[Pipe ${s} not found]`;try{return e.get(s)(o,...a)}catch(i){return`[Pipe ${s}, value: ${t}, error: ${i}]`}},t)}var De=v;function Oe(t,...r){let e=document.createElement("template"),o=Ve(t);e.innerHTML=o;let n=[],s=document.createTreeWalker(e.content,NodeFilter.SHOW_ALL),a;for(;a=s.nextNode();)if(a.nodeType===Node.ELEMENT_NODE){let i=a;_e(i,r,n),customElements.get(i.tagName.toLowerCase())&&customElements.upgrade(i)}else if(a.nodeType===Node.TEXT_NODE){let i=a,l=i.textContent,c=K(l,r);if(c)if(/€€\d+€€/.test(l)){let u=null,d=null,m=[];n.push({originalValue:l,setter(f){var h=c(f);u||(u=document.createComment(""),d=document.createComment(""),i.parentNode?.replaceChild(d,i),d.parentNode?.insertBefore(u,d)),m.forEach(y=>y.parentNode?.removeChild(y)),m=[];let g=document.createElement("template");g.innerHTML=h;let x=Array.from(g.content.childNodes),T=d.parentNode;x.forEach(y=>{T.insertBefore(y,d),m.push(y)})}})}else n.push({originalValue:l,setter(u){var d=c(u);i.textContent=d}})}return function(l){return n.forEach(c=>{c.setter(l)}),{fragment:e.content,update(c){n.forEach(p=>{p.setter(c)})}}}}function Ve(t){return t.raw.map((r,e)=>e<t.raw.length-1?`${r}\u20AC\u20AC${e}\u20AC\u20AC`:r).join("")}function _e(t,r,e){let o=[];for(let a of Array.from(t.attributes)){var n=a.value;if(n=="")continue;let i=/€€(\d+)€€/,l=n.match(i);if(l){let c=parseInt(l[1],10),p=r[c];if(typeof p=="function"){o.push({setter(u){let d=p.bind(u);t.removeAttribute(a.name),t[a.name]=d}});continue}}var s=K(n,r);s!=null&&o.push({originalValue:n,setter(c){let p=s(c)??n;a.name in t?t[a.name]=p:a.value=p}})}o.length>0&&e.push({originalValue:t.tagName,setter(a){o.forEach(i=>i.setter(a))}})}function ze(t,r){return t.split(",").map(e=>{if(e=e.trim(),e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))return e.slice(1,-1);if(!isNaN(Number(e)))return Number(e);if(e.includes(".")){let o=e.split("."),n=r;for(let s of o){if(n==null)return;n=n[s]}return n}return r[e]})}function K(t,r){let e=/€€(\d+)€€|{{\s*([^|]+?)(?:\|([\w|]+))?\s*}}/g,o=0,n,s=[];for(;(n=e.exec(t))!==null;){var a=t.slice(o,n.index);if(a.length>0&&s.push(l=>a),n[1]){let l=parseInt(n[1],10),c=r[l];if(!c)continue;if(typeof c=="function"){let p=c;s.push(u=>{var d=p.apply(u);return d})}else c&&c.length>0&&s.push(p=>c)}else if(n[2]){let l=n[2].trim(),c=n[3]?n[3].trim():null,p=n[4]?n[4].split("|").map(u=>u.trim()):[];s.push(u=>{var d=u[l];if(typeof d=="function")if(c){let m=ze(c,u);d=d.apply(u,m)}else d=d.call(u);return p.forEach(m=>{d=De[m](d)}),d})}o=e.lastIndex}if(s.length==0)return null;var i=t.slice(o);return i.length>0&&s.push(l=>i),l=>{var c="";return s.forEach(p=>{var u=p(l);c+=u}),c}}function ee(t){let r=t.split("|").map(s=>s.trim()),e=r[0],o=r.slice(1),n=e.match(/^(\w+)\s*\((.*)\)$/);if(n){let[,s,a]=n,i=a?a.split(",").map(l=>l.trim()):[];return{type:"function",fnName:s,fnArgs:i,pipes:o}}return{type:"path",path:e,pipes:o}}function N(t,r){let o=r.replace(/\[(\d+)\]/g,".$1").split("."),n=t;for(let s of o)if(n&&typeof n=="object"&&s in n)n=n[s];else return;return n}function E(t,r,e,o=!1){let n=`[template error] ${r} (at ${e})`;if(t.onError&&t.onError(n),t.strict||o)throw new Error(n)}function je(t){return function(e,o,n=""){try{let s=N(e,o);return s===void 0?(E(t,`Cannot resolve "${o}"`,n),""):s===null?"":Array.isArray(s)?s.length>0?JSON.stringify(s):"":typeof s=="object"?JSON.stringify(s):s}catch(s){let a=s instanceof Error?s.message:String(s);return E(t,`Exception resolving "${o}": ${a}`,n,!0),""}}}function te(t,r,e,o,n){let s,a=o.pipeRegistry??v;if(t.type==="function"){let i=e?.[t.fnName];if(typeof i!="function")return E(o,`Function "${t.fnName}" not found`,n),"";let l=(t.fnArgs??[]).map(c=>c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'")?c.slice(1,-1):isNaN(Number(c))?N(r,c):Number(c));try{s=i(...l)}catch(c){let p=c instanceof Error?c.message:String(c);return E(o,`Error calling "${t.fnName}": ${p}`,n),""}}else{let i=N(r,t.path);if(i===void 0)return E(o,`Cannot resolve "${t.path}"`,n),"";i===null?s="":typeof i=="object"?s=JSON.stringify(i):s=i}return t.pipes.length>0&&(s=Y(s,t.pipes,a)),s}var $=new Map;function qe(t,r,e){if(t.nodeType!==Node.TEXT_NODE||!t.textContent?.includes("{{"))return;let o=t.textContent;if(!$.has(o)){let i=o.split(/(\{\{.*?\}\})/).map(l=>{if(l.startsWith("{{")){let c=l.slice(2,-2).trim();return{parsed:ee(c),literal:""}}else return{parsed:null,literal:l}});$.set(o,i)}let n=$.get(o),s=`TextNode: "${o}"`;return(a,i)=>{let l=n.map(({parsed:c,literal:p})=>c?String(te(c,a,i,e,s)):p).join("");t.textContent=l}}function We(t,r,e){if(t.nodeType!==Node.ELEMENT_NODE)return;let o=t,n=[],s=Array.from(o.attributes);for(let a of s){let i=a.value.match(/\{\{(.+?)\}\}/);if(i){let l=i[1].trim(),c=ee(l),p=a.name,u=`Attribute: ${p} on <${o.tagName.toLowerCase()}>`;n.push((d,m)=>{let f=te(c,d,m,e,u);o.setAttribute(p,String(f))})}}if(n.length>0)return(a,i)=>n.forEach(l=>l(a,i))}function ne(t,r,e,o,n){if(t.nodeType!==Node.ELEMENT_NODE||!t.hasAttribute(o))return;let s=t,a=s.getAttribute(o),i=s.cloneNode(!0),l=document.createComment(`${o}: ${a}`),c=s.parentNode;c.insertBefore(l,s),s.remove();let p=null,u=null,d=null,m=null;return(f,h)=>{let g=r(f,a,`${o}="${a}"`),x=n(g);if(x&&!p){if(d&&m)p=d,u=m,d=null,m=null;else{let T=i.cloneNode(!0);T.removeAttribute(o),p=T,u=H(T,e)}u(f,h),c.insertBefore(p,l.nextSibling)}else x&&u&&u(f,h);!x&&p&&(p.remove(),d=p,m=u,p=null,u=null)}}function Ue(t,r,e){return ne(t,r,e,"if",o=>!!o)}function Ge(t,r,e){return ne(t,r,e,"unless",o=>!o)}function Ze(t,r,e){if(t.nodeType!==Node.ELEMENT_NODE||!t.hasAttribute("loop"))return;let o=t,n=o.getAttribute("loop"),s=n.match(/(\w+)\s+in\s+(.+)/);if(!s){E(e,`Invalid loop syntax: "${n}"`,`Element: <${o.tagName.toLowerCase()}>`);return}let[,a,i]=s,l=o.cloneNode(!0);l.removeAttribute("loop");let c=o.parentNode,p=document.createComment(`loop: ${n}`);c.insertBefore(p,o),o.remove();let u=[];return(d,m)=>{let f=N(d,i);if(f===void 0){E(e,`Cannot resolve "${i}"`,`Loop source: "${n}"`);return}if(!Array.isArray(f)){E(e,`"${i}" is not an array in loop: "${n}"`,`Element: <${l.tagName.toLowerCase()}>`);return}let h=Math.min(u.length,f.length);for(let g=0;g<h;g++)u[g].renderer({...d,[a]:f[g]},m);for(let g=u.length-1;g>=f.length;g--)u[g].element.remove();if(f.length>h){let g=document.createDocumentFragment(),x=[];for(let y=h;y<f.length;y++){let L=l.cloneNode(!0),V=H(L,e);V({...d,[a]:f[y]},m),g.appendChild(L),x.push({element:L,renderer:V})}let T=h>0?u[h-1].element:p;c.insertBefore(g,T.nextSibling),u=u.slice(0,h).concat(x)}else u.length=f.length}}var Je=[Ze,Ue,Ge],Xe=[qe,We];function H(t,r){let e=[],o=je(r);function n(i){for(let l of Je){let c=l(i,o,r);if(c){e.push(c);return}}for(let l of Xe){let c=l(i,o,r);c&&e.push(c)}for(let l of Array.from(i.childNodes))n(l)}n(t);let s=null,a;return(i,l)=>{(s!==i||a!==l)&&(e.forEach(c=>c(i,l)),s=i,a=l)}}function Qe(t,r={strict:!1}){let n=new DOMParser().parseFromString(`<template><div>${t}</div></template>`,"text/html").querySelector("template").content.firstElementChild,s=H(n,r);return{content:n,render:s}}function Ye(t,r={}){let{delimiter:e=".",escapeChar:o="\\"}=r;if(!t||typeof t!="string")throw new Error("Notation must be a non-empty string");let n=[],s="",a=0,i=!1,l="";for(;a<t.length;){let c=t[a],p=t.substring(a,e.length+a),u=t[a+1],d=t.substring(a+1,e.length+a+1);if(c===o&&(d===e||u==="["||u==="]"))i?l+=u:s+=u,a+=2;else if(c==="["&&!i)s&&(n.push({type:"property",key:s}),s=""),i=!0,l="",a++;else if(c==="]"&&i){if(!/^\d+$/.test(l.trim()))throw new Error(`Invalid array index: [${l}]. Only numeric indices are supported.`);n.push({type:"index",key:l.trim()}),i=!1,l="",a++}else p===e&&!i?(s&&(n.push({type:"property",key:s}),s=""),a+=e.length):i?(l+=c,a++):(s+=c,a++)}if(i)throw new Error("Unclosed bracket in notation");if(s&&n.push({type:"property",key:s}),n.length===0)throw new Error("Invalid notation: must contain at least one property or index");return n}function Ke(t){return r=>{let e=r;for(let o of t){if(e==null)return;if(o.type==="property"){if(typeof e!="object")return;e=e[o.key]}else if(o.type==="index"){if(!Array.isArray(e))return;let n=parseInt(o.key,10);if(n<0||n>=e.length)return;e=e[n]}}return e}}function M(t,r={}){let e=Ye(t,r);return Ke(e)}function oe(t){let r=[],e=0;for(;e<t.length;){let o=t[e];if(/\s/.test(o)){e++;continue}if(o==="|"){for(e++;e<t.length&&/\s/.test(t[e]);)e++;let n="";for(;e<t.length&&!/[\s\(\)\[\]\{\}\|\+\-\*\/\=\;\,\.]/.test(t[e]);)n+=t[e],e++;r.push({type:3,value:n});continue}if(o==='"'||o==="'"){let n=o,s=n;for(e++;e<t.length&&t[e]!==n;)t[e]==="\\"&&e+1<t.length&&t[e+1]===n?(s+="\\"+n,e+=2):(s+=t[e],e++);e<t.length&&(s+=n,e++),r.push({type:0,value:s});continue}if(/[0-9]/.test(o)){let n="",s=!1;for(;e<t.length&&(/[0-9]/.test(t[e])||t[e]==="."&&!s);)t[e]==="."&&(s=!0),n+=t[e],e++;r.push({type:0,value:n});continue}if(/[a-zA-Z_$]/.test(o)){let n="",s=!1;for(;e<t.length;)if(/[a-zA-Z0-9_$.]/.test(t[e]))n+=t[e],e++;else if(t[e]==="["){let c=1;for(n+=t[e++];e<t.length&&c>0;)t[e]==="["&&c++,t[e]==="]"&&c--,n+=t[e++]}else break;let a=0;for(;e<t.length&&/\s/.test(t[e]);)a++,e++;if(e<t.length&&t[e]==="("){s=!0,n+="(",e++;let c=1;for(;e<t.length&&c>0;)t[e]==="("&&c++,t[e]===")"&&c--,n+=t[e++]}else e-=a;let i=r[r.length-1],l=t[e-n.length-1]==="."&&i?.type===0;r.push({type:s||l?1:2,value:n});continue}e++}return r}function P(t){let r=[],e=t.indexOf("("),o=t.lastIndexOf(")");if(e===-1||o===-1||o<=e)throw new Error("Invalid function call syntax");let n=t.slice(e+1,o),s=0;for(;s<n.length;){let a=n[s];if(/\s/.test(a)){s++;continue}if(a==='"'||a==="'"){let i=a,l="";for(s++;s<n.length&&n[s]!==i;)n[s]==="\\"?(s++,s<n.length&&(l+=n[s])):l+=n[s],s++;if(s>=n.length)throw new Error("Unterminated string in arguments");s++,r.push({type:"string",value:l});continue}if(/[0-9]/.test(a)){let i="";for(;s<n.length&&/[0-9.]/.test(n[s]);)i+=n[s],s++;r.push({type:"number",value:parseFloat(i)});continue}if(/[a-zA-Z_]/.test(a)){let i="";for(;s<n.length&&/[a-zA-Z0-9_\.]/.test(n[s]);)i+=n[s],s++;r.push({type:"identifier",value:i});continue}if(a===","){s++;continue}throw new Error(`Unexpected character in arguments: ${a}`)}return r}function se(t){let r=[],e=0;for(;e<t.length;){let o=t.indexOf("{{",e);if(o===-1){r.push(re(t.slice(e)));break}o>e&&r.push(re(t.slice(e,o)));let{value:n,endIndex:s,balanced:a}=tt(t,o);if(!a)throw new Error(`Unclosed mustache tag starting at index ${o}, template: ${t}`);r.push(et(n)),e=s}return r}function re(t){return{type:"string",value:t}}function et(t){return{type:"mustache",value:t}}function tt(t,r){let e="{{",o="}}",n=r+e.length,s=1;for(;n<t.length&&s>0;)t.slice(n,n+e.length)===e?(s++,n+=e.length):t.slice(n,n+o.length)===o?(s--,n+=o.length):n++;let a=s===0,i=a?n:t.length;return{value:t.slice(r,i),endIndex:i,balanced:a}}function F(t,r){let e=se(t).map(o=>o.type==="string"?(n,s)=>o.value:nt(o,r));return(o,n)=>e.map(s=>s(o,n)).join("")}function nt(t,r){let e=oe(t.value),o=rt(e,t.value,r?.pipeRegistry);return ot(o)}function rt(t,r,e){let o=null;e||(e=v);for(let n of t)switch(n.type){case 0:throw Error(`Constants not supported: ${n.value}`);case 2:{o={source:M(n.value),pipes:[]};break}case 1:{o={source:st(n.value),pipes:[]};break}case 3:{if(!o)throw Error(`Pipe '${n.value}' has no input expression in: ${r}`);if(!n.value||n.value==="")throw Error("Pipe symbol was provided, but no pipes. Template: "+r);let[s,...a]=n.value.split(":").map(l=>l.trim()),i=e.lookup(s);if(!i)throw Error(`Pipe not found: ${s}`);o.pipes.push(l=>i(l,a));break}}if(!o)throw Error(`Invalid expression: ${r}`);return o}function ot(t){return(r,e)=>{let o=t.source(r,e),n=t.pipes.reduce((s,a)=>a(s),o);return n!=null?n.toString():""}}function st(t){let r=t.indexOf("(");if(r===-1)throw Error(`Invalid function: ${t}`);let o=P(t).map(a=>{if(a.type==="number"||a.type==="string")return()=>a.value;if(a.type==="identifier")return i=>M(a.value)(i);throw Error(`Unsupported argument type: ${a.type}`)}),n=t.substring(0,r),s=M(n);return(a,i)=>{if(!i)throw Error(`Component context is required for calling '${n}'`);let l=s(i);if(typeof l!="function")throw Error(`Resolved '${n}' is not a function`);let c=o.map(p=>p(a));return l.apply(i,c)}}var I=class{constructor(r,e,o,n){this.root=r;this.bindings=e;this.clickBindings=o;this.component=n}render(r){for(let e of this.bindings)e.type==="text"?e.func(r,e.node):e.func(r,e.element);for(let e of this.clickBindings){let o=this.getNodeAtPath(this.root,e.path),n=this.component?.[e.methodName];o instanceof HTMLElement&&typeof n=="function"&&(o.onclick=s=>{let a=e.argTokens.map(i=>{if(i.type==="number"||i.type==="string")return i.value;if(i.type==="identifier")return i.value==="event"?s:i.value.split(".").reduce((c,p)=>c?.[p],r)});n.apply(this.component,a)})}return this.root}getNodeAtPath(r,e){return e.reduce((o,n)=>o.childNodes[n],r)}};function _t(t){var r=new B(t);return r}var B=class{constructor(r){if(typeof r=="string"){let o=r.trim();if(o.startsWith("<template")){let n=document.createElement("div");n.innerHTML=o;let s=n.querySelector("template");if(!s)throw new Error("Could not find <template> in input string");this.template=s}else this.template=document.createElement("template"),this.template.innerHTML=o}else this.template=r;let e=this.getRootElement();this.bindings=this.collectBindings(e),this.clickBindings=this.collectClickBindings(e)}createInstance(r){let e=this.getRootElement().cloneNode(!0),o=this.bindings.map(n=>{let s=this.getNodeAtPath(e,n.path);return n.type==="text"?{type:"text",node:s,func:(a,i)=>n.func(a,r,i)}:{type:"attribute",element:s,name:n.name,func:(a,i)=>n.func(a,r,i)}});return new I(e,o,this.clickBindings,r)}getRootElement(){let r=Array.from(this.template.content.childNodes).find(e=>e.nodeType===Node.ELEMENT_NODE);if(!(r instanceof HTMLElement))throw new Error("Template must contain a single root element");return r}collectBindings(r){let e=[],o=(n,s=[])=>{if(n.nodeType===Node.TEXT_NODE&&n.textContent&&n.textContent.match(/\{\{\s*(.*?)\s*\}\}/g)){let a=F(n.textContent);e.push({type:"text",path:[...s],func:(i,l,c)=>{c.textContent=a(i,l)}})}if(n.nodeType===Node.ELEMENT_NODE){let a=n;if(a.tagName==="TEMPLATE")return;for(let i=0;i<a.attributes.length;i++){let l=a.attributes[i];if(l.value.match(/\{\{\s*(.*?)\s*\}\}/g)){let c=F(l.value);e.push({type:"attribute",path:[...s],name:l.name,func:(p,u,d)=>{d.setAttribute(l.name,c(p,u))}})}}Array.from(n.childNodes).forEach((i,l)=>{o(i,[...s,l])})}};return o(r),e}collectClickBindings(r){let e=[],o=(n,s=[])=>{if(n.nodeType===Node.ELEMENT_NODE){let i=n.getAttribute("click");if(i?.trim()){let l=i.trim(),c=l.match(/^([a-zA-Z_$][\w$]*)\s*\((.*)\)$/);if(c){let p=c[1],u=P(l);e.push({path:[...s],methodName:p,argTokens:u})}else e.push({path:[...s],methodName:l,argTokens:[]})}Array.from(n.childNodes).forEach((l,c)=>{o(l,[...s,c])})}};return o(r),e}getNodeAtPath(r,e){return e.reduce((o,n)=>o.childNodes[n],r)}};var D=class{constructor(r,e,o,n){this.dataMap=new Map;this.rowMap=new Map;this.table=r,this.template=e,this.IdColumn=o,this.component=n}render(r){this.clearRows();for(let e of r)this.renderRow(e)}clearRows(){this.table.tBodies[0].innerHTML="",this.dataMap.clear(),this.rowMap.clear()}renderRow(r){let e=r[this.IdColumn];if(e==null)throw new Error(`Missing IdColumn '${this.IdColumn}' in data`);let o=this.template.content.firstElementChild?.cloneNode(!0);if(!o)throw new Error("Template must have a <tr> as its first child");this.populateRow(o,r),this.attachEventHandlers(o,r),this.table.tBodies[0].appendChild(o),this.dataMap.set(e,r),this.rowMap.set(e,o)}populateRow(r,e){r.querySelectorAll("[data-field]").forEach(n=>{let s=n.dataset.field;s&&s in e&&(n.textContent=String(e[s]))})}attachEventHandlers(r,e){r.querySelectorAll("[onclick]").forEach(n=>{let s=n,a=s.getAttribute("onclick");if(!a)return;let i=a.match(/^(\w+)(\(([^)]*)\))?$/);if(!i)return;let[,l,,c]=i,p=c?c.split(",").map(u=>u.trim().replace(/^['"]|['"]$/g,"")):[];typeof this.component[l]=="function"&&(s.removeAttribute("onclick"),s.addEventListener("click",u=>{this.component[l](...p,e,u)}))})}update(r){let e=r[this.IdColumn];if(e==null)throw new Error(`Missing IdColumn '${this.IdColumn}' in update data`);let o=this.rowMap.get(e);o?(this.populateRow(o,r),this.attachEventHandlers(o,r),this.dataMap.set(e,r)):this.renderRow(r)}},k=class extends CustomEvent{constructor(r){super("sortchange",{detail:r,bubbles:!0,composed:!0})}},O=class{constructor(r,e){this.sortColumns=[];this.table=r,this.component=e,this.setupListeners()}setupListeners(){this.table.tHead?.querySelectorAll("th[name]")?.forEach(e=>{e.addEventListener("click",()=>{let o=e.getAttribute("name");this.toggle(o),this.updateSortIndicators(),this.emit()})})}toggle(r){let e=this.sortColumns.findIndex(o=>o.column===r);e===-1?this.sortColumns.push({column:r,direction:"asc"}):this.sortColumns[e].direction==="asc"?this.sortColumns[e].direction="desc":this.sortColumns.splice(e,1)}emit(){let r=new k(this.sortColumns);this.component.dispatchEvent(r)}updateSortIndicators(){this.table.tHead?.querySelectorAll("th[name]")?.forEach(e=>{let o=e.querySelector(".sort-indicator");o&&e.removeChild(o);let n=e.getAttribute("name"),s=this.sortColumns.find(a=>a.column===n);if(s){let a=document.createElement("span");a.className="sort-indicator",a.textContent=s.direction==="asc"?"\u2191":"\u2193",a.style.float="right",a.style.marginLeft="5px",e.appendChild(a)}e.style.position||(e.style.position="relative")})}getSortColumns(){return[...this.sortColumns]}clear(){this.sortColumns=[],this.updateSortIndicators(),this.emit()}};export{B as Blueprint,I as BoundNode,k as SortChangeEvent,D as TableRenderer,O as TableSorter,Qe as compileTemplate,_t as createBluePrint,Oe as html};
1
+ var ie=Object.create;var _=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var ce=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var z=e=>r=>{var t=e[r];if(t)return t();throw new Error("Module not found in bundle: "+r)};var C=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports);var pe=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of le(r))!ue.call(e,n)&&n!==t&&_(e,n,{get:()=>r[n],enumerable:!(o=ae(r,n))||o.enumerable});return e};var b=(e,r,t)=>(t=e!=null?ie(ce(e)):{},pe(r||!e||!e.__esModule?_(t,"default",{value:e,enumerable:!0}):t,e));var W=C((lt,fe)=>{fe.exports={greeting:"Hello, {name}!",items:"{count, plural, one {# item} other {# items}}"}});var U=C((ct,ge)=>{ge.exports={today:"today",yesterday:"yesterday",daysAgo:"{count, plural, one {# day ago} other {# days ago}}",pieces:"{count, plural, =0 {none} one {one} other {# pcs}}"}});var G=C((ut,he)=>{he.exports={required:"This field is required.",range:"Number must be between {min} and {max}, was {actual}.",digits:"Please enter only digits."}});var Z=C((pt,ye)=>{ye.exports={greeting:"Hej, {name}!",items:"{count, plural, one {# sak} other {# saker}}"}});var J=C((dt,xe)=>{xe.exports={today:"idag",yesterday:"ig\xE5r",daysAgo:"{count, plural, one {# dag sedan} other {# dagar sedan}}",pieces:"{count, plural, =0 {inga} one {en} other {# st}}"}});var X=C((mt,Ee)=>{Ee.exports={required:"Detta f\xE4lt \xE4r obligatoriskt.",range:"Talet m\xE5ste vara mellan {min} och {max}, var {actual}.",digits:"Ange endast siffror."}});var R=new Map;function de(e){return R.has(e)||R.set(e,new Intl.PluralRules(e)),R.get(e)}function j(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function me(e,r,t="en"){return e.replace(/\{(\w+)(?:, (plural|select),((?:[^{}]*\{[^{}]*\})+))?\}/g,(o,n,s,a)=>{let i=r?.[n];if(s==="plural"){let l=new RegExp(`=${j(String(i))}\\s*\\{([^{}]*)\\}`).exec(a);if(l)return l[1].replace(`{${n}}`,String(i)).replace("#",String(i));let p=de(t).select(i),u=new RegExp(`${p}\\s*\\{([^{}]*)\\}`).exec(a)||new RegExp("other\\s*\\{([^{}]*)\\}").exec(a);return u?u[1].replace(`{${n}}`,String(i)).replace("#",String(i)):String(i)}if(s==="select"){let l=j(String(i)),c=new RegExp(`\\b${l}\\s*\\{([^{}]*)\\}`).exec(a)||new RegExp("\\bother\\s*\\{([^{}]*)\\}").exec(a);return c?c[1]:String(i)}return i!==void 0?String(i):`{${n}}`})}var q=me;var ht=z({"./locales/en/r-common.json":()=>Promise.resolve().then(()=>b(W())),"./locales/en/r-pipes.json":()=>Promise.resolve().then(()=>b(U())),"./locales/en/r-validation.json":()=>Promise.resolve().then(()=>b(G())),"./locales/sv/r-common.json":()=>Promise.resolve().then(()=>b(Z())),"./locales/sv/r-pipes.json":()=>Promise.resolve().then(()=>b(J())),"./locales/sv/r-validation.json":()=>Promise.resolve().then(()=>b(X()))});var Te="en",A=Te;var ve={},Q=null;function w(e,r){let[t,o]=e.includes(":")?e.split(":"):["r-common",e],n=ve[t]?.[o];if(!n)return Q&&Q(o,t,A),e;try{return q(n,r,A)}catch{return e}}function S(){return A}function Ce(e){return String(e).toUpperCase()}function be(e){return String(e).trimEnd().trimStart()}function we(e){return String(e).toLowerCase()}function Ne(e){let r=String(e);return r.charAt(0).toUpperCase()+r.slice(1)}function Me(e,r){let t=String(e),o=parseInt(r,10);return t.length>o?t.substring(0,o-3)+"...":t}function Pe(e,r="USD"){let t=S();return new Intl.NumberFormat(t,{style:"currency",currency:r}).format(e)}function ke(e,r){let t=new Date(e),o=S();return r==="short"?t.toLocaleDateString(o):r==="long"?t.toLocaleDateString(o,{weekday:"long",year:"numeric",month:"long",day:"numeric"}):t.toISOString()}function Le(e){if(!e)return"n/a";let r=new Date(e),t=new Date;r.setHours(0,0,0,0),t.setHours(0,0,0,0);let o=t.getTime()-r.getTime(),n=Math.round(o/(1e3*60*60*24));return n===0?w("r-pipes:today"):n===1?w("r-pipes:yesterday"):w("r-pipes:daysAgo",{count:n})}function Re(e){if(e==null)return"n/a";let r=Number(e);return w("r-pipes:pieces",{count:r})}function Ae(e,r=","){return Array.isArray(e)?e.join(r):e}function Se(e){return!Array.isArray(e)||e.length===0?"":e[0]}function $e(e){return!Array.isArray(e)||e.length===0?"":e[e.length-1]}function He(e){return typeof e!="object"||e===null?[]:Object.keys(e)}function Fe(e,r){return e||r}function Ie(e,r,t){return e?r:t}function Be(){let e=new Map;return e.set("uppercase",Ce),e.set("lowercase",we),e.set("capitalize",Ne),e.set("trim",be),e.set("shorten",Me),e.set("currency",Pe),e.set("date",ke),e.set("daysAgo",Le),e.set("pieces",Re),e.set("join",Ae),e.set("first",Se),e.set("last",$e),e.set("keys",He),e.set("default",Fe),e.set("ternary",Ie),{lookup(r){return e.get(r)??null},get(r){var t=e.get(r);if(!t)throw Error("Pipe '"+r+"' not found.");return t},has(r){return e.has(r)}}}var v=Be();function Y(e,r,t=v){return r.reduce((o,n)=>{let[s,...a]=n.split(":").map(i=>i.trim());if(!t.has(s))return`[Pipe ${s} not found]`;try{return t.get(s)(o,...a)}catch(i){return`[Pipe ${s}, value: ${e}, error: ${i}]`}},e)}var De=v;function Oe(e,...r){let t=document.createElement("template"),o=Ve(e);t.innerHTML=o;let n=[],s=document.createTreeWalker(t.content,NodeFilter.SHOW_ALL),a;for(;a=s.nextNode();)if(a.nodeType===Node.ELEMENT_NODE){let i=a;_e(i,r,n),customElements.get(i.tagName.toLowerCase())&&customElements.upgrade(i)}else if(a.nodeType===Node.TEXT_NODE){let i=a,l=i.textContent,c=K(l,r);if(c)if(/€€\d+€€/.test(l)){let u=null,d=null,m=[];n.push({originalValue:l,setter(f){var h=c(f);u||(u=document.createComment(""),d=document.createComment(""),i.parentNode?.replaceChild(d,i),d.parentNode?.insertBefore(u,d)),m.forEach(y=>y.parentNode?.removeChild(y)),m=[];let g=document.createElement("template");g.innerHTML=h;let x=Array.from(g.content.childNodes),T=d.parentNode;x.forEach(y=>{T.insertBefore(y,d),m.push(y)})}})}else n.push({originalValue:l,setter(u){var d=c(u);i.textContent=d}})}return function(l){return n.forEach(c=>{c.setter(l)}),{fragment:t.content,update(c){n.forEach(p=>{p.setter(c)})}}}}function Ve(e){return e.raw.map((r,t)=>t<e.raw.length-1?`${r}\u20AC\u20AC${t}\u20AC\u20AC`:r).join("")}function _e(e,r,t){let o=[];for(let a of Array.from(e.attributes)){var n=a.value;if(n=="")continue;let i=/€€(\d+)€€/,l=n.match(i);if(l){let c=parseInt(l[1],10),p=r[c];if(typeof p=="function"){o.push({setter(u){let d=p.bind(u);e.removeAttribute(a.name),e[a.name]=d}});continue}}var s=K(n,r);s!=null&&o.push({originalValue:n,setter(c){let p=s(c)??n;a.name in e?e[a.name]=p:a.value=p}})}o.length>0&&t.push({originalValue:e.tagName,setter(a){o.forEach(i=>i.setter(a))}})}function ze(e,r){return e.split(",").map(t=>{if(t=t.trim(),t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'"))return t.slice(1,-1);if(!isNaN(Number(t)))return Number(t);if(t.includes(".")){let o=t.split("."),n=r;for(let s of o){if(n==null)return;n=n[s]}return n}return r[t]})}function K(e,r){let t=/€€(\d+)€€|{{\s*([^|]+?)(?:\|([\w|]+))?\s*}}/g,o=0,n,s=[];for(;(n=t.exec(e))!==null;){var a=e.slice(o,n.index);if(a.length>0&&s.push(l=>a),n[1]){let l=parseInt(n[1],10),c=r[l];if(!c)continue;if(typeof c=="function"){let p=c;s.push(u=>{var d=p.apply(u);return d})}else c&&c.length>0&&s.push(p=>c)}else if(n[2]){let l=n[2].trim(),c=n[3]?n[3].trim():null,p=n[4]?n[4].split("|").map(u=>u.trim()):[];s.push(u=>{var d=u[l];if(typeof d=="function")if(c){let m=ze(c,u);d=d.apply(u,m)}else d=d.call(u);return p.forEach(m=>{d=De.get(m)(d)}),d})}o=t.lastIndex}if(s.length==0)return null;var i=e.slice(o);return i.length>0&&s.push(l=>i),l=>{var c="";return s.forEach(p=>{var u=p(l);c+=u}),c}}function ee(e){let r=e.split("|").map(s=>s.trim()),t=r[0],o=r.slice(1),n=t.match(/^(\w+)\s*\((.*)\)$/);if(n){let[,s,a]=n,i=a?a.split(",").map(l=>l.trim()):[];return{type:"function",fnName:s,fnArgs:i,pipes:o}}return{type:"path",path:t,pipes:o}}function N(e,r){let o=r.replace(/\[(\d+)\]/g,".$1").split("."),n=e;for(let s of o)if(n&&typeof n=="object"&&s in n)n=n[s];else return;return n}function E(e,r,t,o=!1){let n=`[template error] ${r} (at ${t})`;if(e.onError&&e.onError(n),e.strict||o)throw new Error(n)}function je(e){return function(t,o,n=""){try{let s=N(t,o);return s===void 0?(E(e,`Cannot resolve "${o}"`,n),""):s===null?"":Array.isArray(s)?s.length>0?JSON.stringify(s):"":typeof s=="object"?JSON.stringify(s):s}catch(s){let a=s instanceof Error?s.message:String(s);return E(e,`Exception resolving "${o}": ${a}`,n,!0),""}}}function te(e,r,t,o,n){let s,a=o.pipeRegistry??v;if(e.type==="function"){let i=t?.[e.fnName];if(typeof i!="function")return E(o,`Function "${e.fnName}" not found`,n),"";let l=(e.fnArgs??[]).map(c=>c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'")?c.slice(1,-1):isNaN(Number(c))?N(r,c):Number(c));try{s=i(...l)}catch(c){let p=c instanceof Error?c.message:String(c);return E(o,`Error calling "${e.fnName}": ${p}`,n),""}}else{let i=N(r,e.path);if(i===void 0)return E(o,`Cannot resolve "${e.path}"`,n),"";i===null?s="":typeof i=="object"?s=JSON.stringify(i):s=i}return e.pipes.length>0&&(s=Y(s,e.pipes,a)),s}var $=new Map;function qe(e,r,t){if(e.nodeType!==Node.TEXT_NODE||!e.textContent?.includes("{{"))return;let o=e.textContent;if(!$.has(o)){let i=o.split(/(\{\{.*?\}\})/).map(l=>{if(l.startsWith("{{")){let c=l.slice(2,-2).trim();return{parsed:ee(c),literal:""}}else return{parsed:null,literal:l}});$.set(o,i)}let n=$.get(o),s=`TextNode: "${o}"`;return(a,i)=>{let l=n.map(({parsed:c,literal:p})=>c?String(te(c,a,i,t,s)):p).join("");e.textContent=l}}function We(e,r,t){if(e.nodeType!==Node.ELEMENT_NODE)return;let o=e,n=[],s=Array.from(o.attributes);for(let a of s){let i=a.value.match(/\{\{(.+?)\}\}/);if(i){let l=i[1].trim(),c=ee(l),p=a.name,u=`Attribute: ${p} on <${o.tagName.toLowerCase()}>`;n.push((d,m)=>{let f=te(c,d,m,t,u);o.setAttribute(p,String(f))})}}if(n.length>0)return(a,i)=>n.forEach(l=>l(a,i))}function ne(e,r,t,o,n){if(e.nodeType!==Node.ELEMENT_NODE||!e.hasAttribute(o))return;let s=e,a=s.getAttribute(o),i=s.cloneNode(!0),l=document.createComment(`${o}: ${a}`),c=s.parentNode;c.insertBefore(l,s),s.remove();let p=null,u=null,d=null,m=null;return(f,h)=>{let g=r(f,a,`${o}="${a}"`),x=n(g);if(x&&!p){if(d&&m)p=d,u=m,d=null,m=null;else{let T=i.cloneNode(!0);T.removeAttribute(o),p=T,u=H(T,t)}u(f,h),c.insertBefore(p,l.nextSibling)}else x&&u&&u(f,h);!x&&p&&(p.remove(),d=p,m=u,p=null,u=null)}}function Ue(e,r,t){return ne(e,r,t,"if",o=>!!o)}function Ge(e,r,t){return ne(e,r,t,"unless",o=>!o)}function Ze(e,r,t){if(e.nodeType!==Node.ELEMENT_NODE||!e.hasAttribute("loop"))return;let o=e,n=o.getAttribute("loop"),s=n.match(/(\w+)\s+in\s+(.+)/);if(!s){E(t,`Invalid loop syntax: "${n}"`,`Element: <${o.tagName.toLowerCase()}>`);return}let[,a,i]=s,l=o.cloneNode(!0);l.removeAttribute("loop");let c=o.parentNode,p=document.createComment(`loop: ${n}`);c.insertBefore(p,o),o.remove();let u=[];return(d,m)=>{let f=N(d,i);if(f===void 0){E(t,`Cannot resolve "${i}"`,`Loop source: "${n}"`);return}if(!Array.isArray(f)){E(t,`"${i}" is not an array in loop: "${n}"`,`Element: <${l.tagName.toLowerCase()}>`);return}let h=Math.min(u.length,f.length);for(let g=0;g<h;g++)u[g].renderer({...d,[a]:f[g]},m);for(let g=u.length-1;g>=f.length;g--)u[g].element.remove();if(f.length>h){let g=document.createDocumentFragment(),x=[];for(let y=h;y<f.length;y++){let L=l.cloneNode(!0),V=H(L,t);V({...d,[a]:f[y]},m),g.appendChild(L),x.push({element:L,renderer:V})}let T=h>0?u[h-1].element:p;c.insertBefore(g,T.nextSibling),u=u.slice(0,h).concat(x)}else u.length=f.length}}var Je=[Ze,Ue,Ge],Xe=[qe,We];function H(e,r){let t=[],o=je(r);function n(i){for(let l of Je){let c=l(i,o,r);if(c){t.push(c);return}}for(let l of Xe){let c=l(i,o,r);c&&t.push(c)}for(let l of Array.from(i.childNodes))n(l)}n(e);let s=null,a;return(i,l)=>{(s!==i||a!==l)&&(t.forEach(c=>c(i,l)),s=i,a=l)}}function Qe(e,r={strict:!1}){let n=new DOMParser().parseFromString(`<template><div>${e}</div></template>`,"text/html").querySelector("template").content.firstElementChild,s=H(n,r);return{content:n,render:s}}function Ye(e,r={}){let{delimiter:t=".",escapeChar:o="\\"}=r;if(!e||typeof e!="string")throw new Error("Notation must be a non-empty string");let n=[],s="",a=0,i=!1,l="";for(;a<e.length;){let c=e[a],p=e.substring(a,t.length+a),u=e[a+1],d=e.substring(a+1,t.length+a+1);if(c===o&&(d===t||u==="["||u==="]"))i?l+=u:s+=u,a+=2;else if(c==="["&&!i)s&&(n.push({type:"property",key:s}),s=""),i=!0,l="",a++;else if(c==="]"&&i){if(!/^\d+$/.test(l.trim()))throw new Error(`Invalid array index: [${l}]. Only numeric indices are supported.`);n.push({type:"index",key:l.trim()}),i=!1,l="",a++}else p===t&&!i?(s&&(n.push({type:"property",key:s}),s=""),a+=t.length):i?(l+=c,a++):(s+=c,a++)}if(i)throw new Error("Unclosed bracket in notation");if(s&&n.push({type:"property",key:s}),n.length===0)throw new Error("Invalid notation: must contain at least one property or index");return n}function Ke(e){return r=>{let t=r;for(let o of e){if(t==null)return;if(o.type==="property"){if(typeof t!="object")return;t=t[o.key]}else if(o.type==="index"){if(!Array.isArray(t))return;let n=parseInt(o.key,10);if(n<0||n>=t.length)return;t=t[n]}}return t}}function M(e,r={}){let t=Ye(e,r);return Ke(t)}function oe(e){let r=[],t=0;for(;t<e.length;){let o=e[t];if(/\s/.test(o)){t++;continue}if(o==="|"){for(t++;t<e.length&&/\s/.test(e[t]);)t++;let n="";for(;t<e.length&&!/[\s\(\)\[\]\{\}\|\+\-\*\/\=\;\,\.]/.test(e[t]);)n+=e[t],t++;r.push({type:3,value:n});continue}if(o==='"'||o==="'"){let n=o,s=n;for(t++;t<e.length&&e[t]!==n;)e[t]==="\\"&&t+1<e.length&&e[t+1]===n?(s+="\\"+n,t+=2):(s+=e[t],t++);t<e.length&&(s+=n,t++),r.push({type:0,value:s});continue}if(/[0-9]/.test(o)){let n="",s=!1;for(;t<e.length&&(/[0-9]/.test(e[t])||e[t]==="."&&!s);)e[t]==="."&&(s=!0),n+=e[t],t++;r.push({type:0,value:n});continue}if(/[a-zA-Z_$]/.test(o)){let n="",s=!1;for(;t<e.length;)if(/[a-zA-Z0-9_$.]/.test(e[t]))n+=e[t],t++;else if(e[t]==="["){let c=1;for(n+=e[t++];t<e.length&&c>0;)e[t]==="["&&c++,e[t]==="]"&&c--,n+=e[t++]}else break;let a=0;for(;t<e.length&&/\s/.test(e[t]);)a++,t++;if(t<e.length&&e[t]==="("){s=!0,n+="(",t++;let c=1;for(;t<e.length&&c>0;)e[t]==="("&&c++,e[t]===")"&&c--,n+=e[t++]}else t-=a;let i=r[r.length-1],l=e[t-n.length-1]==="."&&i?.type===0;r.push({type:s||l?1:2,value:n});continue}t++}return r}function P(e){let r=[],t=e.indexOf("("),o=e.lastIndexOf(")");if(t===-1||o===-1||o<=t)throw new Error("Invalid function call syntax");let n=e.slice(t+1,o),s=0;for(;s<n.length;){let a=n[s];if(/\s/.test(a)){s++;continue}if(a==='"'||a==="'"){let i=a,l="";for(s++;s<n.length&&n[s]!==i;)n[s]==="\\"?(s++,s<n.length&&(l+=n[s])):l+=n[s],s++;if(s>=n.length)throw new Error("Unterminated string in arguments");s++,r.push({type:"string",value:l});continue}if(/[0-9]/.test(a)){let i="";for(;s<n.length&&/[0-9.]/.test(n[s]);)i+=n[s],s++;r.push({type:"number",value:parseFloat(i)});continue}if(/[a-zA-Z_]/.test(a)){let i="";for(;s<n.length&&/[a-zA-Z0-9_\.]/.test(n[s]);)i+=n[s],s++;r.push({type:"identifier",value:i});continue}if(a===","){s++;continue}throw new Error(`Unexpected character in arguments: ${a}`)}return r}function se(e){let r=[],t=0;for(;t<e.length;){let o=e.indexOf("{{",t);if(o===-1){r.push(re(e.slice(t)));break}o>t&&r.push(re(e.slice(t,o)));let{value:n,endIndex:s,balanced:a}=tt(e,o);if(!a)throw new Error(`Unclosed mustache tag starting at index ${o}, template: ${e}`);r.push(et(n)),t=s}return r}function re(e){return{type:"string",value:e}}function et(e){return{type:"mustache",value:e}}function tt(e,r){let t="{{",o="}}",n=r+t.length,s=1;for(;n<e.length&&s>0;)e.slice(n,n+t.length)===t?(s++,n+=t.length):e.slice(n,n+o.length)===o?(s--,n+=o.length):n++;let a=s===0,i=a?n:e.length;return{value:e.slice(r,i),endIndex:i,balanced:a}}function F(e,r){let t=se(e).map(o=>o.type==="string"?(n,s)=>o.value:nt(o,r));return(o,n)=>t.map(s=>s(o,n)).join("")}function nt(e,r){let t=oe(e.value),o=rt(t,e.value,r?.pipeRegistry);return ot(o)}function rt(e,r,t){let o=null;t||(t=v);for(let n of e)switch(n.type){case 0:throw Error(`Constants not supported: ${n.value}`);case 2:{o={source:M(n.value),pipes:[]};break}case 1:{o={source:st(n.value),pipes:[]};break}case 3:{if(!o)throw Error(`Pipe '${n.value}' has no input expression in: ${r}`);if(!n.value||n.value==="")throw Error("Pipe symbol was provided, but no pipes. Template: "+r);let[s,...a]=n.value.split(":").map(l=>l.trim()),i=t.lookup(s);if(!i)throw Error(`Pipe not found: ${s}`);o.pipes.push(l=>i(l,a));break}}if(!o)throw Error(`Invalid expression: ${r}`);return o}function ot(e){return(r,t)=>{let o=e.source(r,t),n=e.pipes.reduce((s,a)=>a(s),o);return n!=null?n.toString():""}}function st(e){let r=e.indexOf("(");if(r===-1)throw Error(`Invalid function: ${e}`);let o=P(e).map(a=>{if(a.type==="number"||a.type==="string")return()=>a.value;if(a.type==="identifier")return i=>M(a.value)(i);throw Error(`Unsupported argument type: ${a.type}`)}),n=e.substring(0,r),s=M(n);return(a,i)=>{if(!i)throw Error(`Component context is required for calling '${n}'`);let l=s(i);if(typeof l!="function")throw Error(`Resolved '${n}' is not a function`);let c=o.map(p=>p(a));return l.apply(i,c)}}var I=class{constructor(r,t,o,n){this.root=r;this.bindings=t;this.clickBindings=o;this.component=n}render(r){for(let t of this.bindings)t.type==="text"?t.func(r,t.node):t.func(r,t.element);for(let t of this.clickBindings){let o=this.getNodeAtPath(this.root,t.path),n=this.component?.[t.methodName];o instanceof HTMLElement&&typeof n=="function"&&(o.onclick=s=>{let a=t.argTokens.map(i=>{if(i.type==="number"||i.type==="string")return i.value;if(i.type==="identifier")return i.value==="event"?s:i.value.split(".").reduce((c,p)=>c?.[p],r)});n.apply(this.component,a)})}return this.root}getNodeAtPath(r,t){return t.reduce((o,n)=>o.childNodes[n],r)}};function _t(e){var r=new B(e);return r}var B=class{constructor(r){if(typeof r=="string"){let o=r.trim();if(o.startsWith("<template")){let n=document.createElement("div");n.innerHTML=o;let s=n.querySelector("template");if(!s)throw new Error("Could not find <template> in input string");this.template=s}else this.template=document.createElement("template"),this.template.innerHTML=o}else this.template=r;let t=this.getRootElement();this.bindings=this.collectBindings(t),this.clickBindings=this.collectClickBindings(t)}createInstance(r){let t=this.getRootElement().cloneNode(!0),o=r??{},n=this.bindings.map(s=>{let a=this.getNodeAtPath(t,s.path);return s.type==="text"?{type:"text",node:a,func:(i,l)=>s.func(i,o,l)}:{type:"attribute",element:a,name:s.name,func:(i,l)=>s.func(i,o,l)}});return new I(t,n,this.clickBindings,r)}getRootElement(){let r=Array.from(this.template.content.childNodes).find(t=>t.nodeType===Node.ELEMENT_NODE);if(!(r instanceof HTMLElement))throw new Error("Template must contain a single root element");return r}collectBindings(r){let t=[],o=(n,s=[])=>{if(n.nodeType===Node.TEXT_NODE&&n.textContent&&n.textContent.match(/\{\{\s*(.*?)\s*\}\}/g)){let a=F(n.textContent);t.push({type:"text",path:[...s],func:(i,l,c)=>{c.textContent=a(i,l)}})}if(n.nodeType===Node.ELEMENT_NODE){let a=n;if(a.tagName==="TEMPLATE")return;for(let i=0;i<a.attributes.length;i++){let l=a.attributes[i];if(l.value.match(/\{\{\s*(.*?)\s*\}\}/g)){let c=F(l.value);t.push({type:"attribute",path:[...s],name:l.name,func:(p,u,d)=>{d.setAttribute(l.name,c(p,u))}})}}Array.from(n.childNodes).forEach((i,l)=>{o(i,[...s,l])})}};return o(r),t}collectClickBindings(r){let t=[],o=(n,s=[])=>{if(n.nodeType===Node.ELEMENT_NODE){let i=n.getAttribute("click");if(i?.trim()){let l=i.trim(),c=l.match(/^([a-zA-Z_$][\w$]*)\s*\((.*)\)$/);if(c){let p=c[1],u=P(l);t.push({path:[...s],methodName:p,argTokens:u})}else t.push({path:[...s],methodName:l,argTokens:[]})}Array.from(n.childNodes).forEach((l,c)=>{o(l,[...s,c])})}};return o(r),t}getNodeAtPath(r,t){return t.reduce((o,n)=>o.childNodes[n],r)}};var D=class{constructor(r,t,o,n){this.dataMap=new Map;this.rowMap=new Map;this.table=r,this.template=t,this.IdColumn=o,this.component=n}render(r){this.clearRows();for(let t of r)this.renderRow(t)}clearRows(){this.table.tBodies[0].innerHTML="",this.dataMap.clear(),this.rowMap.clear()}renderRow(r){let t=r[this.IdColumn];if(t==null)throw new Error(`Missing IdColumn '${this.IdColumn}' in data`);let o=this.template.content.firstElementChild?.cloneNode(!0);if(!o)throw new Error("Template must have a <tr> as its first child");this.populateRow(o,r),this.attachEventHandlers(o,r),this.table.tBodies[0].appendChild(o),this.dataMap.set(t,r),this.rowMap.set(t,o)}populateRow(r,t){r.querySelectorAll("[data-field]").forEach(n=>{let s=n.dataset.field;s&&s in t&&(n.textContent=String(t[s]))})}attachEventHandlers(r,t){r.querySelectorAll("[onclick]").forEach(n=>{let s=n,a=s.getAttribute("onclick");if(!a)return;let i=a.match(/^(\w+)(\(([^)]*)\))?$/);if(!i)return;let[,l,,c]=i,p=c?c.split(",").map(u=>u.trim().replace(/^['"]|['"]$/g,"")):[];typeof this.component[l]=="function"&&(s.removeAttribute("onclick"),s.addEventListener("click",u=>{this.component[l](...p,t,u)}))})}update(r){let t=r[this.IdColumn];if(t==null)throw new Error(`Missing IdColumn '${this.IdColumn}' in update data`);let o=this.rowMap.get(t);o?(this.populateRow(o,r),this.attachEventHandlers(o,r),this.dataMap.set(t,r)):this.renderRow(r)}},k=class extends CustomEvent{constructor(r){super("sortchange",{detail:r,bubbles:!0,composed:!0})}},O=class{constructor(r,t){this.sortColumns=[];this.table=r,this.component=t,this.setupListeners()}setupListeners(){this.table.tHead?.querySelectorAll("th[name]")?.forEach(t=>{t.addEventListener("click",()=>{let o=t.getAttribute("name");this.toggle(o),this.updateSortIndicators(),this.emit()})})}toggle(r){let t=this.sortColumns.findIndex(o=>o.column===r);t===-1?this.sortColumns.push({column:r,direction:"asc"}):this.sortColumns[t].direction==="asc"?this.sortColumns[t].direction="desc":this.sortColumns.splice(t,1)}emit(){let r=new k(this.sortColumns);this.component.dispatchEvent(r)}updateSortIndicators(){this.table.tHead?.querySelectorAll("th[name]")?.forEach(t=>{let o=t,n=o.querySelector(".sort-indicator");n&&o.removeChild(n);let s=o.getAttribute("name"),a=this.sortColumns.find(i=>i.column===s);if(a){let i=document.createElement("span");i.className="sort-indicator",i.textContent=a.direction==="asc"?"\u2191":"\u2193",i.style.float="right",i.style.marginLeft="5px",o.appendChild(i)}o.style.position||(o.style.position="relative")})}getSortColumns(){return[...this.sortColumns]}clear(){this.sortColumns=[],this.updateSortIndicators(),this.emit()}};export{B as Blueprint,I as BoundNode,k as SortChangeEvent,D as TableRenderer,O as TableSorter,Qe as compileTemplate,_t as createBluePrint,Oe as html};
2
2
  //# sourceMappingURL=index.mjs.map