@beforesemicolon/site-builder 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- "use strict";var h=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var y=(i,e)=>h(i,"name",{value:e,configurable:!0});var K=(i,e)=>{for(var n in e)h(i,n,{get:e[n],enumerable:!0})},V=(i,e,n,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of U(e))!D.call(i,s)&&s!==n&&h(i,s,{get:()=>e[s],enumerable:!(p=F(e,s))||p.enumerable});return i};var _=i=>V(h({},"__esModule",{value:!0}),i);var z={};K(z,{parseTemplate:()=>q});module.exports=_(z);var v=require("./utils/input-definitions-to-object.js"),W=require("./utils/replace-string-value.js"),E=require("./utils/turn-camel-to-kebab-casing.js"),C=require("./utils/merge-objects.js");const M=new Map,T=new Map,j={fetchWidget:async()=>null,fetchTemplate:async()=>null,prod:!1,assetsOrigin:"/"},q=y(async(i,e=j)=>{if(e=(0,C.mergeObjects)(j,e),T.set(i.id,i),i.extends){const t=T.get(i.extends)||await e.fetchTemplate(i.extends);if(!t)throw new Error(`Template "${i.extends}" not found`);T.set(i.extends,t),i=(0,C.mergeObjects)(t,i)}const{metadata:n={},scripts:p=[],stylesheets:s=[],links:d=[],fonts:m=[],favicons:c=[],content:g="",manifest:r,...o}=i??{},x=new Map,A=typeof g=="string"?g:await P(g,o,x,e);n.charset||(n.charset="UTF-8"),n.viewport||(n.viewport="width=device-width, initial-scale=1.0");const S=Object.entries(n).map(([t,a])=>t.startsWith("property:")?`<meta property="${t.replace("property:","")}" content="${a}">`:`<meta name="${t}" content="${a}">`).join("");let u="";d.forEach(t=>{let a="<link ";Object.entries(t).forEach(([l,w])=>{a+=`${l}="${w}" `}),u+=a+"/>"});let O="";c.forEach(t=>{let a="<link ";Object.entries(t).forEach(([l,w])=>{a+=`${l}="${l==="href"?`${e.assetsOrigin}assets/favicons/`:""}${w}" `}),O+=a+"/>"});let b="";m.forEach(t=>{b+=`<link rel="preload" href="${e.assetsOrigin}assets/fonts/${t}" as="font" crossorigin="anonymous">`});let f="";[...s,...Array.from(x.entries())].forEach(t=>{if(typeof t=="string")t.startsWith("http")?f+=`<link rel="stylesheet" href="${t}" >`:t.endsWith(".css")?f+=`<link rel="stylesheet" href="${e.assetsOrigin}stylesheets/${t}">`:f+=`<style>${t}</style>`;else if(Array.isArray(t)){const[a,l]=t;f+=`<style id="${a}">${k(l)}</style>`}else f+="<style",Object.entries(t.attributes).forEach(([a,l])=>{f+=`${a}="${l}" `}),f+="></style>"});let $="";return p.forEach(t=>{typeof t=="string"?t.startsWith("http")?$+=`<script src="${t}"></script>`:t.endsWith(".js")?$+=`<script src="${e.assetsOrigin}scripts/${t}"></script>`:$+=`<script>${t}</script>`:($+="<script ",Object.entries(t).forEach(([a,l])=>{$+=`${a}="${l}" `}),$+="></script>")}),`<!doctype html>
1
+ "use strict";var h=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var y=(i,e)=>h(i,"name",{value:e,configurable:!0});var K=(i,e)=>{for(var s in e)h(i,s,{get:e[s],enumerable:!0})},V=(i,e,s,f)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of U(e))!D.call(i,n)&&n!==s&&h(i,n,{get:()=>e[n],enumerable:!(f=F(e,n))||f.enumerable});return i};var _=i=>V(h({},"__esModule",{value:!0}),i);var z={};K(z,{parseTemplate:()=>q});module.exports=_(z);var v=require("./utils/input-definitions-to-object.js"),W=require("./utils/replace-string-value.js"),E=require("./utils/turn-camel-to-kebab-casing.js"),C=require("./utils/merge-objects.js");const M=new Map,T=new Map,j={fetchWidget:async()=>null,fetchTemplate:async()=>null,prod:!1,assetsOrigin:"/"},q=y(async(i,e=j)=>{if(e=(0,C.mergeObjects)(j,e),T.set(i.id,i),i.extends){const t=T.get(i.extends)||await e.fetchTemplate(i.extends);if(!t)throw new Error(`Template "${i.extends}" not found`);T.set(i.extends,t),i=(0,C.mergeObjects)(t,i)}const{metadata:s={},scripts:f=[],stylesheets:n=[],links:d=[],fonts:m=[],favicons:c=[],content:g="",manifest:r,...o}=i??{},x=new Map,A=typeof g=="string"?g:await P(g,o,x,e);s.charset||(s.charset="UTF-8"),s.viewport||(s.viewport="width=device-width, initial-scale=1.0");const S=Object.entries(s).map(([t,a])=>t.startsWith("property:")?`<meta property="${t.replace("property:","")}" content="${a}">`:`<meta name="${t}" content="${a}">`).join("");let u="";d.forEach(t=>{let a="<link ";Object.entries(t).forEach(([l,w])=>{a+=`${l}="${w}" `}),u+=a+"/>"});let O="";c.forEach(t=>{let a="<link ";Object.entries(t).forEach(([l,w])=>{a+=`${l}="${l==="href"?`${e.assetsOrigin}assets/favicons/`:""}${w}" `}),O+=a+"/>"});let b="";m.forEach(t=>{b+=`<link rel="preload" href="${e.assetsOrigin}assets/fonts/${t}" as="font" crossorigin="anonymous">`});let p="";[...n,...Array.from(x.entries())].forEach(t=>{if(typeof t=="string")t.startsWith("http")?p+=`<link rel="stylesheet" href="${t}" >`:t.endsWith(".css")?p+=`<link rel="stylesheet" href="${e.assetsOrigin}stylesheets/${t}">`:p+=`<style>${t}</style>`;else if(Array.isArray(t)){const[a,l]=t;p+=`<style id="${a}">${k(l)}</style>`}else p+="<style",Object.entries(t.attributes).forEach(([a,l])=>{p+=`${a}="${l}" `}),p+="></style>"});let $="";return f.forEach(t=>{typeof t=="string"?t.startsWith("http")?$+=`<script src="${t}"></script>`:t.endsWith(".js")?$+=`<script src="${e.assetsOrigin}scripts/${t}"></script>`:$+=`<script>${t}</script>`:($+="<script ",Object.entries(t).forEach(([a,l])=>{$+=`${a}="${l}" `}),$+="></script>")}),`<!doctype html>
2
2
  <html lang="${o.lang??"en"}">
3
3
  <head>
4
4
  <title>${o.title}</title>
@@ -16,10 +16,10 @@
16
16
  ${b?`<!-- fonts -->${b}`:""}
17
17
  ${u?`<!-- links -->${u}`:""}
18
18
  ${r?`<link rel="manifest" href="${e.assetsOrigin}assets/${r}">`:""}
19
- ${f?`<!-- stylesheets -->${f}`:""}
19
+ ${p?`<!-- stylesheets -->${p}`:""}
20
20
  </head>
21
21
  <body>
22
22
  ${A}
23
23
  ${$?"<!-- scripts -->"+$:""}
24
24
  </body>
25
- </html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");function k(i){return typeof i=="string"?i:Object.entries(i).map(([e,n])=>typeof n=="object"?`${(0,E.turnCamelToKebabCasing)(e)} { ${k(n)} }`:`${(0,E.turnCamelToKebabCasing)(e)}: ${n};`).join(" ")}y(k,"parseStyle");async function P(i,e={},n,p=j){return(await Promise.all(i.map(async s=>{if(typeof s=="string")return(0,W.replaceStringValue)(s,e);let{name:d,children:m,...c}=s;if(d==="widget"){if(s["data-render-id"]=s["data-render-id"]||Math.random().toString(36).substring(2,15),{name:d,children:m,...c}=s,c.id){const r=M.get(c.id)||await p.fetchWidget(c.id);r&&(typeof r.render=="function"?m=[r.render({...(0,v.inputDefinitionsToObject)(r.inputs),...c,env:e})]:m=r.content?[r.content]:[],r.style&&n.set(c.id,r.style),M.set(c.id,r))}if(p.prod)return m.join("")}const g=Object.entries(c).map(([r,o])=>(typeof o=="string"&&(o=(0,W.replaceStringValue)(o,e)),`${r}="${o}"`)).join(" ");return`<${d}`+(g?` ${g}`:"")+`>${await P(m,e,n,p)}</${d}>`}))).join("")}y(P,"parseContent");0&&(module.exports={parseTemplate});
25
+ </html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");function k(i){return typeof i=="string"?i:Object.entries(i).map(([e,s])=>typeof s=="object"?`${(0,E.turnCamelToKebabCasing)(e)} { ${k(s)} }`:`${(0,E.turnCamelToKebabCasing)(e)}: ${s};`).join(" ")}y(k,"parseStyle");async function P(i,e={},s,f=j){return(await Promise.all(i.map(async n=>{if(typeof n=="string")return(0,W.replaceStringValue)(n,e);let{name:d,children:m,...c}=n;if(d==="widget"){if(n["data-render-id"]=n["data-render-id"]||Math.random().toString(36).substring(2,15),{name:d,children:m,...c}=n,c.id){const r=M.get(c.id)||await f.fetchWidget(c.id);r&&(typeof r.render=="function"?m=[r.render({...(0,v.inputDefinitionsToObject)(r.inputs),...c,env:{...e,assetsOrigin:f.assetsOrigin}})]:m=r.content?[r.content]:[],r.style&&s.set(c.id,r.style),M.set(c.id,r))}if(f.prod)return m.join("")}const g=Object.entries(c).map(([r,o])=>(typeof o=="string"&&(o=(0,W.replaceStringValue)(o,e)),`${r}="${o}"`)).join(" ");return`<${d}`+(g?` ${g}`:"")+`>${await P(m,e,s,f)}</${d}>`}))).join("")}y(P,"parseContent");0&&(module.exports={parseTemplate});
package/dist/client.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";(()=>{var Z=Object.defineProperty;var l=(e,t)=>Z(e,"name",{value:t,configurable:!0});function b(e){return e.reduce((t,{name:n,value:i,type:s,definitions:f=[]})=>{switch(s){case"group":t[n]=b(f);break;default:t[n]=i}return t},{})}l(b,"inputDefinitionsToObject");var E=l((e,t)=>String(t??"").split(".").filter(Boolean).reduce((i,s)=>{try{return i&&typeof i=="object"?i[s]:void 0}catch{return null}},e),"deepValue");var T=l((e,t)=>{let n=null;for(;(n=/{{([a-z0-9.$_]+)}}/gim.exec(e))!==null;){let[i,s]=n,f=E(t,s);e=e.replace(i,String(f))}return e},"replaceStringValue");var A=l(e=>{let t=e.match(/(?:[A-Z]+(?=[A-Z][a-z])|[A-Z]+|[a-zA-Z])[^A-Z]*/g);if(t){for(let n=0;n<t.length;n++)t[n]=t[n].toLowerCase();return t.join("-")}return name},"turnCamelToKebabCasing");function y(e,t){if(e===null||typeof e!="object"||t===null||typeof t!="object")return t;if(Array.isArray(e)&&Array.isArray(t))return Array.from(new Set([...e,...t]));let n=Array.isArray(e)?[...e]:{...e};for(let i in t)t.hasOwnProperty(i)&&(Array.isArray(e[i])&&Array.isArray(t[i])?n[i]=Array.from(new Set([...e[i],...t[i]])):n[i]=y(n[i],t[i]));return n}l(y,"mergeObjects");var W=new Map,k=new Map,S={fetchWidget:async()=>null,fetchTemplate:async()=>null,prod:!1,assetsOrigin:"/"},P=l(async(e,t=S)=>{if(t=y(S,t),k.set(e.id,e),e.extends){let r=k.get(e.extends)||await t.fetchTemplate(e.extends);if(!r)throw new Error(`Template "${e.extends}" not found`);k.set(e.extends,r),e=y(r,e)}let{metadata:n={},scripts:i=[],stylesheets:s=[],links:f=[],fonts:u=[],favicons:p=[],content:$="",manifest:o,...c}=e??{},x=new Map,M=typeof $=="string"?$:await D($,c,x,t);n.charset||(n.charset="UTF-8"),n.viewport||(n.viewport="width=device-width, initial-scale=1.0");let C=Object.entries(n).map(([r,a])=>r.startsWith("property:")?`<meta property="${r.replace("property:","")}" content="${a}">`:`<meta name="${r}" content="${a}">`).join(""),h="";f.forEach(r=>{let a="<link ";Object.entries(r).forEach(([m,j])=>{a+=`${m}="${j}" `}),h+=a+"/>"});let w="";p.forEach(r=>{let a="<link ";Object.entries(r).forEach(([m,j])=>{a+=`${m}="${m==="href"?`${t.assetsOrigin}assets/favicons/`:""}${j}" `}),w+=a+"/>"});let O="";u.forEach(r=>{O+=`<link rel="preload" href="${t.assetsOrigin}assets/fonts/${r}" as="font" crossorigin="anonymous">`});let d="";[...s,...Array.from(x.entries())].forEach(r=>{if(typeof r=="string")r.startsWith("http")?d+=`<link rel="stylesheet" href="${r}" >`:r.endsWith(".css")?d+=`<link rel="stylesheet" href="${t.assetsOrigin}stylesheets/${r}">`:d+=`<style>${r}</style>`;else if(Array.isArray(r)){let[a,m]=r;d+=`<style id="${a}">${L(m)}</style>`}else d+="<style",Object.entries(r.attributes).forEach(([a,m])=>{d+=`${a}="${m}" `}),d+="></style>"});let g="";return i.forEach(r=>{typeof r=="string"?r.startsWith("http")?g+=`<script src="${r}"><\/script>`:r.endsWith(".js")?g+=`<script src="${t.assetsOrigin}scripts/${r}"><\/script>`:g+=`<script>${r}<\/script>`:(g+="<script ",Object.entries(r).forEach(([a,m])=>{g+=`${a}="${m}" `}),g+="><\/script>")}),`<!doctype html>
1
+ "use strict";(()=>{var Z=Object.defineProperty;var l=(e,t)=>Z(e,"name",{value:t,configurable:!0});function b(e){return e.reduce((t,{name:n,value:i,type:s,definitions:f=[]})=>{switch(s){case"group":t[n]=b(f);break;default:t[n]=i}return t},{})}l(b,"inputDefinitionsToObject");var E=l((e,t)=>String(t??"").split(".").filter(Boolean).reduce((i,s)=>{try{return i&&typeof i=="object"?i[s]:void 0}catch{return null}},e),"deepValue");var T=l((e,t)=>{let n=null;for(;(n=/{{([a-z0-9.$_]+)}}/gim.exec(e))!==null;){let[i,s]=n,f=E(t,s);e=e.replace(i,String(f))}return e},"replaceStringValue");var A=l(e=>{let t=e.match(/(?:[A-Z]+(?=[A-Z][a-z])|[A-Z]+|[a-zA-Z])[^A-Z]*/g);if(t){for(let n=0;n<t.length;n++)t[n]=t[n].toLowerCase();return t.join("-")}return name},"turnCamelToKebabCasing");function y(e,t){if(e===null||typeof e!="object"||t===null||typeof t!="object")return t;if(Array.isArray(e)&&Array.isArray(t))return Array.from(new Set([...e,...t]));let n=Array.isArray(e)?[...e]:{...e};for(let i in t)t.hasOwnProperty(i)&&(Array.isArray(e[i])&&Array.isArray(t[i])?n[i]=Array.from(new Set([...e[i],...t[i]])):n[i]=y(n[i],t[i]));return n}l(y,"mergeObjects");var W=new Map,k=new Map,S={fetchWidget:async()=>null,fetchTemplate:async()=>null,prod:!1,assetsOrigin:"/"},P=l(async(e,t=S)=>{if(t=y(S,t),k.set(e.id,e),e.extends){let r=k.get(e.extends)||await t.fetchTemplate(e.extends);if(!r)throw new Error(`Template "${e.extends}" not found`);k.set(e.extends,r),e=y(r,e)}let{metadata:n={},scripts:i=[],stylesheets:s=[],links:f=[],fonts:u=[],favicons:p=[],content:$="",manifest:o,...c}=e??{},x=new Map,M=typeof $=="string"?$:await D($,c,x,t);n.charset||(n.charset="UTF-8"),n.viewport||(n.viewport="width=device-width, initial-scale=1.0");let C=Object.entries(n).map(([r,a])=>r.startsWith("property:")?`<meta property="${r.replace("property:","")}" content="${a}">`:`<meta name="${r}" content="${a}">`).join(""),h="";f.forEach(r=>{let a="<link ";Object.entries(r).forEach(([m,j])=>{a+=`${m}="${j}" `}),h+=a+"/>"});let w="";p.forEach(r=>{let a="<link ";Object.entries(r).forEach(([m,j])=>{a+=`${m}="${m==="href"?`${t.assetsOrigin}assets/favicons/`:""}${j}" `}),w+=a+"/>"});let O="";u.forEach(r=>{O+=`<link rel="preload" href="${t.assetsOrigin}assets/fonts/${r}" as="font" crossorigin="anonymous">`});let g="";[...s,...Array.from(x.entries())].forEach(r=>{if(typeof r=="string")r.startsWith("http")?g+=`<link rel="stylesheet" href="${r}" >`:r.endsWith(".css")?g+=`<link rel="stylesheet" href="${t.assetsOrigin}stylesheets/${r}">`:g+=`<style>${r}</style>`;else if(Array.isArray(r)){let[a,m]=r;g+=`<style id="${a}">${L(m)}</style>`}else g+="<style",Object.entries(r.attributes).forEach(([a,m])=>{g+=`${a}="${m}" `}),g+="></style>"});let d="";return i.forEach(r=>{typeof r=="string"?r.startsWith("http")?d+=`<script src="${r}"><\/script>`:r.endsWith(".js")?d+=`<script src="${t.assetsOrigin}scripts/${r}"><\/script>`:d+=`<script>${r}<\/script>`:(d+="<script ",Object.entries(r).forEach(([a,m])=>{d+=`${a}="${m}" `}),d+="><\/script>")}),`<!doctype html>
2
2
  <html lang="${c.lang??"en"}">
3
3
  <head>
4
4
  <title>${c.title}</title>
@@ -16,11 +16,11 @@
16
16
  ${O?`<!-- fonts -->${O}`:""}
17
17
  ${h?`<!-- links -->${h}`:""}
18
18
  ${o?`<link rel="manifest" href="${t.assetsOrigin}assets/${o}">`:""}
19
- ${d?`<!-- stylesheets -->${d}`:""}
19
+ ${g?`<!-- stylesheets -->${g}`:""}
20
20
  </head>
21
21
  <body>
22
22
  ${M}
23
- ${g?"<!-- scripts -->"+g:""}
23
+ ${d?"<!-- scripts -->"+d:""}
24
24
  </body>
25
- </html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");function L(e){return typeof e=="string"?e:Object.entries(e).map(([t,n])=>typeof n=="object"?`${A(t)} { ${L(n)} }`:`${A(t)}: ${n};`).join(" ")}l(L,"parseStyle");async function D(e,t={},n,i=S){return(await Promise.all(e.map(async s=>{if(typeof s=="string")return T(s,t);let{name:f,children:u,...p}=s;if(f==="widget"){if(s["data-render-id"]=s["data-render-id"]||Math.random().toString(36).substring(2,15),{name:f,children:u,...p}=s,p.id){let o=W.get(p.id)||await i.fetchWidget(p.id);o&&(typeof o.render=="function"?u=[o.render({...b(o.inputs),...p,env:t})]:u=o.content?[o.content]:[],o.style&&n.set(p.id,o.style),W.set(p.id,o))}if(i.prod)return u.join("")}let $=Object.entries(p).map(([o,c])=>(typeof c=="string"&&(c=T(c,t)),`${o}="${c}"`)).join(" ");return`<${f}`+($?` ${$}`:"")+`>${await D(u,t,n,i)}</${f}>`}))).join("")}l(D,"parseContent");window&&(window.BFS={...window.BFS||{},SITE_BUILDER:{parseTemplate:P}});})();
25
+ </html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");function L(e){return typeof e=="string"?e:Object.entries(e).map(([t,n])=>typeof n=="object"?`${A(t)} { ${L(n)} }`:`${A(t)}: ${n};`).join(" ")}l(L,"parseStyle");async function D(e,t={},n,i=S){return(await Promise.all(e.map(async s=>{if(typeof s=="string")return T(s,t);let{name:f,children:u,...p}=s;if(f==="widget"){if(s["data-render-id"]=s["data-render-id"]||Math.random().toString(36).substring(2,15),{name:f,children:u,...p}=s,p.id){let o=W.get(p.id)||await i.fetchWidget(p.id);o&&(typeof o.render=="function"?u=[o.render({...b(o.inputs),...p,env:{...t,assetsOrigin:i.assetsOrigin}})]:u=o.content?[o.content]:[],o.style&&n.set(p.id,o.style),W.set(p.id,o))}if(i.prod)return u.join("")}let $=Object.entries(p).map(([o,c])=>(typeof c=="string"&&(c=T(c,t)),`${o}="${c}"`)).join(" ");return`<${f}`+($?` ${$}`:"")+`>${await D(u,t,n,i)}</${f}>`}))).join("")}l(D,"parseContent");window&&(window.BFS={...window.BFS||{},SITE_BUILDER:{parseTemplate:P}});})();
26
26
  //# sourceMappingURL=client.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/utils/input-definitions-to-object.ts", "../src/utils/deep-value.ts", "../src/utils/replace-string-value.ts", "../src/utils/turn-camel-to-kebab-casing.ts", "../src/utils/merge-objects.ts", "../src/parse-template.ts", "../src/client.ts"],
4
- "sourcesContent": ["import { ObjectLiteral, InputDefinition } from '../types.ts'\n\nexport function inputDefinitionsToObject(inputDefinitions: InputDefinition[]) {\n return inputDefinitions.reduce(\n (acc, { name, value, type, definitions = [] }) => {\n switch (type) {\n case 'group':\n acc[name] = inputDefinitionsToObject(definitions)\n break\n default:\n acc[name] = value\n }\n\n return acc\n },\n {} as ObjectLiteral\n )\n}\n", "import { ObjectLiteral } from '../types.ts'\n\nexport const deepValue = (obj: ObjectLiteral | unknown[], key: string) => {\n const keyParts = String(key ?? '')\n .split('.')\n .filter(Boolean)\n\n return keyParts.reduce((acc, k) => {\n try {\n // @ts-expect-error No index signature with a parameter of type string\n return acc && typeof acc === 'object' ? acc[k] : undefined\n } catch (e) {\n return null\n }\n }, obj) as unknown\n}\n", "import { deepValue } from './deep-value.ts'\n\nexport const replaceStringValue = (\n value: string,\n data: Record<string, unknown>\n) => {\n let match = null\n\n while ((match = /{{([a-z0-9.$_]+)}}/gim.exec(value)) !== null) {\n const [full, key] = match\n const dv = deepValue(data, key)\n\n value = value.replace(full, String(dv))\n }\n\n return value\n}\n", "export const turnCamelToKebabCasing = (str: string) => {\n const match = str.match(/(?:[A-Z]+(?=[A-Z][a-z])|[A-Z]+|[a-zA-Z])[^A-Z]*/g)\n\n if (match) {\n for (let i = 0; i < match.length; i++) {\n match[i] = match[i].toLowerCase()\n }\n\n return match.join('-')\n }\n\n return name\n}\n", "export function mergeObjects(a: unknown, b: unknown) {\n if (a === null || typeof a !== 'object') return b\n if (b === null || typeof b !== 'object') return b\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return Array.from(new Set([...a, ...b]))\n }\n\n const obj = Array.isArray(a) ? [...a] : { ...a }\n\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n // @ts-expect-error a or b in unknown\n if (Array.isArray(a[key]) && Array.isArray(b[key])) {\n // @ts-expect-error a or b in unknown\n obj[key] = Array.from(new Set([...a[key], ...b[key]]))\n } else {\n // @ts-expect-error a or b in unknown\n obj[key] = mergeObjects(obj[key], b[key])\n }\n }\n }\n\n return obj\n}\n", "import { Template, Style, TemplateContent, Widget } from './types.ts'\nimport { inputDefinitionsToObject } from './utils/input-definitions-to-object.ts'\nimport { replaceStringValue } from './utils/replace-string-value.ts'\nimport { turnCamelToKebabCasing } from './utils/turn-camel-to-kebab-casing.ts'\nimport { mergeObjects } from './utils/merge-objects.ts'\n\nconst widgetCache = new Map()\nconst tempCache = new Map()\n\ninterface parseOptions {\n prod?: boolean\n assetsOrigin?: string\n fetchWidget: (id: string) => Widget | null | Promise<Widget | null>\n fetchTemplate: (id: string) => Template | null | Promise<Template | null>\n}\n\nconst defaultOptions: parseOptions = {\n fetchWidget: async () => null,\n fetchTemplate: async () => null,\n prod: false,\n assetsOrigin: '/',\n}\n\nexport const parseTemplate = async (\n temp: Template,\n opt: parseOptions = defaultOptions\n) => {\n opt = mergeObjects(defaultOptions, opt) as parseOptions\n tempCache.set(temp.id, temp)\n\n if (temp.extends) {\n const base =\n tempCache.get(temp.extends) ||\n (await opt.fetchTemplate(temp.extends))\n\n if (!base) {\n throw new Error(`Template \"${temp.extends}\" not found`)\n }\n\n tempCache.set(temp.extends, base)\n temp = mergeObjects(base, temp) as Template\n }\n\n const {\n metadata = {},\n scripts = [],\n stylesheets = [],\n links = [],\n fonts = [],\n favicons = [],\n content = '',\n manifest,\n ...data\n } = temp ?? {}\n\n const widgetStyles = new Map()\n\n const bodyContent =\n typeof content === 'string'\n ? content\n : await parseContent(\n content as TemplateContent,\n data,\n widgetStyles,\n opt\n )\n\n if (!metadata['charset']) {\n metadata['charset'] = 'UTF-8'\n }\n\n if (!metadata['viewport']) {\n metadata['viewport'] = 'width=device-width, initial-scale=1.0'\n }\n\n const metas = Object.entries(metadata)\n .map(([key, value]) => {\n if (key.startsWith('property:')) {\n return `<meta property=\"${key.replace('property:', '')}\" content=\"${value}\">`\n }\n\n return `<meta name=\"${key}\" content=\"${value}\">`\n })\n .join('')\n\n let ls = ''\n\n links.forEach((link) => {\n let l = '<link '\n\n Object.entries(link).forEach(([key, value]) => {\n l += `${key}=\"${value}\" `\n })\n\n ls += l + '/>'\n })\n\n let fi = ''\n\n favicons.forEach((link) => {\n let l = '<link '\n\n Object.entries(link).forEach(([key, value]) => {\n l += `${key}=\"${key === 'href' ? `${opt.assetsOrigin}assets/favicons/` : ''}${value}\" `\n })\n\n fi += l + '/>'\n })\n\n let ft = ''\n\n fonts.forEach((font) => {\n ft += `<link rel=\"preload\" href=\"${opt.assetsOrigin}assets/fonts/${font}\" as=\"font\" crossorigin=\"anonymous\">`\n })\n\n let st = ''\n\n ;[...stylesheets, ...Array.from(widgetStyles.entries())].forEach(\n (stylesheet) => {\n if (typeof stylesheet === 'string') {\n if (stylesheet.startsWith('http')) {\n st += `<link rel=\"stylesheet\" href=\"${stylesheet}\" >`\n } else if (stylesheet.endsWith('.css')) {\n st += `<link rel=\"stylesheet\" href=\"${opt.assetsOrigin}stylesheets/${stylesheet}\">`\n } else {\n st += `<style>${stylesheet}</style>`\n }\n } else if (Array.isArray(stylesheet)) {\n const [id, style] = stylesheet\n st += `<style id=\"${id}\">${parseStyle(style)}</style>`\n } else {\n st += `<style`\n\n Object.entries(stylesheet.attributes).forEach(\n ([key, value]) => {\n st += `${key}=\"${value}\" `\n }\n )\n\n st += '></style>'\n }\n }\n )\n\n let sc = ''\n\n scripts.forEach((script) => {\n if (typeof script === 'string') {\n if (script.startsWith('http')) {\n sc += `<script src=\"${script}\"></script>`\n } else if (script.endsWith('.js')) {\n sc += `<script src=\"${opt.assetsOrigin}scripts/${script}\"></script>`\n } else {\n sc += `<script>${script}</script>`\n }\n } else {\n sc += '<script '\n\n Object.entries(script).forEach(([key, value]) => {\n sc += `${key}=\"${value}\" `\n })\n\n sc += `></script>`\n }\n })\n\n return `<!doctype html>\n<html lang=\"${data.lang ?? 'en'}\">\n<head>\n <title>${data.title}</title>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <!-- og -->\n <meta property=\"og:title\" content=\"${data.title}\">\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:description\" content=\"${data.description}\">\n <meta property=\"og:image\" content=\"${data.image}\">\n <meta property=\"og:url\" content=\"${data.domain}\">\n <meta property=\"og:site_name\" content=\"${data.title}\">\n ${metas ? `<!-- metas -->${metas}` : ''}\n ${fi ? `<!-- favicons -->${fi}` : ''}\n ${ft ? `<!-- fonts -->${ft}` : ''}\n ${ls ? `<!-- links -->${ls}` : ''}\n ${manifest ? `<link rel=\"manifest\" href=\"${opt.assetsOrigin}assets/${manifest}\">` : ''}\n ${st ? `<!-- stylesheets -->${st}` : ''}\n</head>\n<body>\n${bodyContent}\n${sc ? '<!-- scripts -->' + sc : ''}\n</body>\n</html>`\n .replace(/\\s{2,}/g, ' ')\n .replace(/[\\t\\n]+/g, '')\n}\n\nfunction parseStyle(style: Style): string {\n if (typeof style === 'string') {\n return style\n }\n\n return Object.entries(style)\n .map(([key, value]) => {\n if (typeof value === 'object') {\n return `${turnCamelToKebabCasing(key)} { ${parseStyle(value)} }`\n }\n\n return `${turnCamelToKebabCasing(key)}: ${value};`\n })\n .join(' ')\n}\n\nasync function parseContent(\n content: TemplateContent,\n data = {},\n widgetStyles: Map<string, Style>,\n opt: parseOptions = defaultOptions\n): Promise<string> {\n return (\n await Promise.all(\n content.map(async (node) => {\n if (typeof node === 'string') {\n return replaceStringValue(node, data)\n }\n\n let { name, children, ...attributes } = node\n\n if (name === 'widget') {\n node['data-render-id'] =\n node['data-render-id'] ||\n Math.random().toString(36).substring(2, 15)\n ;({ name, children, ...attributes } = node)\n\n if (attributes.id) {\n const widget =\n widgetCache.get(attributes.id) ||\n (await opt.fetchWidget(attributes.id))\n\n if (widget) {\n if (typeof widget.render === 'function') {\n children = [\n widget.render({\n ...inputDefinitionsToObject(\n widget.inputs\n ),\n ...attributes,\n env: data,\n }),\n ]\n } else {\n children = widget.content\n ? [widget.content]\n : []\n }\n\n if (widget.style) {\n widgetStyles.set(attributes.id, widget.style)\n }\n\n widgetCache.set(attributes.id, widget)\n }\n }\n\n if (opt.prod) {\n return children.join('')\n }\n }\n\n const attrs = Object.entries(attributes)\n .map(([name, value]) => {\n if (typeof value === 'string') {\n value = replaceStringValue(value, data)\n }\n\n return `${name}=\"${value}\"`\n })\n .join(' ')\n\n return (\n `<${name}` +\n (attrs ? ` ${attrs}` : '') +\n `>${await parseContent(children, data, widgetStyles, opt)}</${name}>`\n )\n })\n )\n ).join('')\n}\n", "import { parseTemplate } from './parse-template.js'\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nif (window) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.BFS = {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n ...(window.BFS || {}),\n SITE_BUILDER: {\n parseTemplate,\n },\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ObjectLiteral, InputDefinition } from '../types.ts'\n\nexport function inputDefinitionsToObject(inputDefinitions: InputDefinition[]) {\n return inputDefinitions.reduce(\n (acc, { name, value, type, definitions = [] }) => {\n switch (type) {\n case 'group':\n acc[name] = inputDefinitionsToObject(definitions)\n break\n default:\n acc[name] = value\n }\n\n return acc\n },\n {} as ObjectLiteral\n )\n}\n", "import { ObjectLiteral } from '../types.ts'\n\nexport const deepValue = (obj: ObjectLiteral | unknown[], key: string) => {\n const keyParts = String(key ?? '')\n .split('.')\n .filter(Boolean)\n\n return keyParts.reduce((acc, k) => {\n try {\n // @ts-expect-error No index signature with a parameter of type string\n return acc && typeof acc === 'object' ? acc[k] : undefined\n } catch (e) {\n return null\n }\n }, obj) as unknown\n}\n", "import { deepValue } from './deep-value.ts'\n\nexport const replaceStringValue = (\n value: string,\n data: Record<string, unknown>\n) => {\n let match = null\n\n while ((match = /{{([a-z0-9.$_]+)}}/gim.exec(value)) !== null) {\n const [full, key] = match\n const dv = deepValue(data, key)\n\n value = value.replace(full, String(dv))\n }\n\n return value\n}\n", "export const turnCamelToKebabCasing = (str: string) => {\n const match = str.match(/(?:[A-Z]+(?=[A-Z][a-z])|[A-Z]+|[a-zA-Z])[^A-Z]*/g)\n\n if (match) {\n for (let i = 0; i < match.length; i++) {\n match[i] = match[i].toLowerCase()\n }\n\n return match.join('-')\n }\n\n return name\n}\n", "export function mergeObjects(a: unknown, b: unknown) {\n if (a === null || typeof a !== 'object') return b\n if (b === null || typeof b !== 'object') return b\n\n if (Array.isArray(a) && Array.isArray(b)) {\n return Array.from(new Set([...a, ...b]))\n }\n\n const obj = Array.isArray(a) ? [...a] : { ...a }\n\n for (const key in b) {\n if (b.hasOwnProperty(key)) {\n // @ts-expect-error a or b in unknown\n if (Array.isArray(a[key]) && Array.isArray(b[key])) {\n // @ts-expect-error a or b in unknown\n obj[key] = Array.from(new Set([...a[key], ...b[key]]))\n } else {\n // @ts-expect-error a or b in unknown\n obj[key] = mergeObjects(obj[key], b[key])\n }\n }\n }\n\n return obj\n}\n", "import { Template, Style, TemplateContent, Widget } from './types.ts'\nimport { inputDefinitionsToObject } from './utils/input-definitions-to-object.ts'\nimport { replaceStringValue } from './utils/replace-string-value.ts'\nimport { turnCamelToKebabCasing } from './utils/turn-camel-to-kebab-casing.ts'\nimport { mergeObjects } from './utils/merge-objects.ts'\n\nconst widgetCache = new Map()\nconst tempCache = new Map()\n\ninterface parseOptions {\n prod?: boolean\n assetsOrigin?: string\n fetchWidget: (id: string) => Widget | null | Promise<Widget | null>\n fetchTemplate: (id: string) => Template | null | Promise<Template | null>\n}\n\nconst defaultOptions: parseOptions = {\n fetchWidget: async () => null,\n fetchTemplate: async () => null,\n prod: false,\n assetsOrigin: '/',\n}\n\nexport const parseTemplate = async (\n temp: Template,\n opt: parseOptions = defaultOptions\n) => {\n opt = mergeObjects(defaultOptions, opt) as parseOptions\n tempCache.set(temp.id, temp)\n\n if (temp.extends) {\n const base =\n tempCache.get(temp.extends) ||\n (await opt.fetchTemplate(temp.extends))\n\n if (!base) {\n throw new Error(`Template \"${temp.extends}\" not found`)\n }\n\n tempCache.set(temp.extends, base)\n temp = mergeObjects(base, temp) as Template\n }\n\n const {\n metadata = {},\n scripts = [],\n stylesheets = [],\n links = [],\n fonts = [],\n favicons = [],\n content = '',\n manifest,\n ...data\n } = temp ?? {}\n\n const widgetStyles = new Map()\n\n const bodyContent =\n typeof content === 'string'\n ? content\n : await parseContent(\n content as TemplateContent,\n data,\n widgetStyles,\n opt\n )\n\n if (!metadata['charset']) {\n metadata['charset'] = 'UTF-8'\n }\n\n if (!metadata['viewport']) {\n metadata['viewport'] = 'width=device-width, initial-scale=1.0'\n }\n\n const metas = Object.entries(metadata)\n .map(([key, value]) => {\n if (key.startsWith('property:')) {\n return `<meta property=\"${key.replace('property:', '')}\" content=\"${value}\">`\n }\n\n return `<meta name=\"${key}\" content=\"${value}\">`\n })\n .join('')\n\n let ls = ''\n\n links.forEach((link) => {\n let l = '<link '\n\n Object.entries(link).forEach(([key, value]) => {\n l += `${key}=\"${value}\" `\n })\n\n ls += l + '/>'\n })\n\n let fi = ''\n\n favicons.forEach((link) => {\n let l = '<link '\n\n Object.entries(link).forEach(([key, value]) => {\n l += `${key}=\"${key === 'href' ? `${opt.assetsOrigin}assets/favicons/` : ''}${value}\" `\n })\n\n fi += l + '/>'\n })\n\n let ft = ''\n\n fonts.forEach((font) => {\n ft += `<link rel=\"preload\" href=\"${opt.assetsOrigin}assets/fonts/${font}\" as=\"font\" crossorigin=\"anonymous\">`\n })\n\n let st = ''\n\n ;[...stylesheets, ...Array.from(widgetStyles.entries())].forEach(\n (stylesheet) => {\n if (typeof stylesheet === 'string') {\n if (stylesheet.startsWith('http')) {\n st += `<link rel=\"stylesheet\" href=\"${stylesheet}\" >`\n } else if (stylesheet.endsWith('.css')) {\n st += `<link rel=\"stylesheet\" href=\"${opt.assetsOrigin}stylesheets/${stylesheet}\">`\n } else {\n st += `<style>${stylesheet}</style>`\n }\n } else if (Array.isArray(stylesheet)) {\n const [id, style] = stylesheet\n st += `<style id=\"${id}\">${parseStyle(style)}</style>`\n } else {\n st += `<style`\n\n Object.entries(stylesheet.attributes).forEach(\n ([key, value]) => {\n st += `${key}=\"${value}\" `\n }\n )\n\n st += '></style>'\n }\n }\n )\n\n let sc = ''\n\n scripts.forEach((script) => {\n if (typeof script === 'string') {\n if (script.startsWith('http')) {\n sc += `<script src=\"${script}\"></script>`\n } else if (script.endsWith('.js')) {\n sc += `<script src=\"${opt.assetsOrigin}scripts/${script}\"></script>`\n } else {\n sc += `<script>${script}</script>`\n }\n } else {\n sc += '<script '\n\n Object.entries(script).forEach(([key, value]) => {\n sc += `${key}=\"${value}\" `\n })\n\n sc += `></script>`\n }\n })\n\n return `<!doctype html>\n<html lang=\"${data.lang ?? 'en'}\">\n<head>\n <title>${data.title}</title>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <!-- og -->\n <meta property=\"og:title\" content=\"${data.title}\">\n <meta property=\"og:type\" content=\"website\">\n <meta property=\"og:description\" content=\"${data.description}\">\n <meta property=\"og:image\" content=\"${data.image}\">\n <meta property=\"og:url\" content=\"${data.domain}\">\n <meta property=\"og:site_name\" content=\"${data.title}\">\n ${metas ? `<!-- metas -->${metas}` : ''}\n ${fi ? `<!-- favicons -->${fi}` : ''}\n ${ft ? `<!-- fonts -->${ft}` : ''}\n ${ls ? `<!-- links -->${ls}` : ''}\n ${manifest ? `<link rel=\"manifest\" href=\"${opt.assetsOrigin}assets/${manifest}\">` : ''}\n ${st ? `<!-- stylesheets -->${st}` : ''}\n</head>\n<body>\n${bodyContent}\n${sc ? '<!-- scripts -->' + sc : ''}\n</body>\n</html>`\n .replace(/\\s{2,}/g, ' ')\n .replace(/[\\t\\n]+/g, '')\n}\n\nfunction parseStyle(style: Style): string {\n if (typeof style === 'string') {\n return style\n }\n\n return Object.entries(style)\n .map(([key, value]) => {\n if (typeof value === 'object') {\n return `${turnCamelToKebabCasing(key)} { ${parseStyle(value)} }`\n }\n\n return `${turnCamelToKebabCasing(key)}: ${value};`\n })\n .join(' ')\n}\n\nasync function parseContent(\n content: TemplateContent,\n data = {},\n widgetStyles: Map<string, Style>,\n opt: parseOptions = defaultOptions\n): Promise<string> {\n return (\n await Promise.all(\n content.map(async (node) => {\n if (typeof node === 'string') {\n return replaceStringValue(node, data)\n }\n\n let { name, children, ...attributes } = node\n\n if (name === 'widget') {\n node['data-render-id'] =\n node['data-render-id'] ||\n Math.random().toString(36).substring(2, 15)\n ;({ name, children, ...attributes } = node)\n\n if (attributes.id) {\n const widget =\n widgetCache.get(attributes.id) ||\n (await opt.fetchWidget(attributes.id))\n\n if (widget) {\n if (typeof widget.render === 'function') {\n children = [\n widget.render({\n ...inputDefinitionsToObject(\n widget.inputs\n ),\n ...attributes,\n env: {\n ...data,\n assetsOrigin: opt.assetsOrigin,\n },\n }),\n ]\n } else {\n children = widget.content\n ? [widget.content]\n : []\n }\n\n if (widget.style) {\n widgetStyles.set(attributes.id, widget.style)\n }\n\n widgetCache.set(attributes.id, widget)\n }\n }\n\n if (opt.prod) {\n return children.join('')\n }\n }\n\n const attrs = Object.entries(attributes)\n .map(([name, value]) => {\n if (typeof value === 'string') {\n value = replaceStringValue(value, data)\n }\n\n return `${name}=\"${value}\"`\n })\n .join(' ')\n\n return (\n `<${name}` +\n (attrs ? ` ${attrs}` : '') +\n `>${await parseContent(children, data, widgetStyles, opt)}</${name}>`\n )\n })\n )\n ).join('')\n}\n", "import { parseTemplate } from './parse-template.js'\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nif (window) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.BFS = {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n ...(window.BFS || {}),\n SITE_BUILDER: {\n parseTemplate,\n },\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["inputDefinitionsToObject", "inputDefinitions", "acc", "name", "value", "type", "definitions", "__name", "deepValue", "__name", "obj", "key", "acc", "k", "replaceStringValue", "__name", "value", "data", "match", "full", "key", "dv", "deepValue", "turnCamelToKebabCasing", "__name", "str", "match", "i", "mergeObjects", "a", "b", "obj", "key", "__name", "widgetCache", "tempCache", "defaultOptions", "parseTemplate", "__name", "temp", "opt", "mergeObjects", "base", "metadata", "scripts", "stylesheets", "links", "fonts", "favicons", "content", "manifest", "data", "widgetStyles", "bodyContent", "parseContent", "metas", "key", "value", "ls", "link", "l", "fi", "ft", "font", "st", "stylesheet", "id", "style", "parseStyle", "sc", "script", "turnCamelToKebabCasing", "node", "replaceStringValue", "name", "children", "attributes", "widget", "inputDefinitionsToObject", "attrs", "parseTemplate"]
7
7
  }
@@ -1,4 +1,4 @@
1
- var v=Object.defineProperty;var h=(i,e)=>v(i,"name",{value:e,configurable:!0});import{inputDefinitionsToObject as A}from"./utils/input-definitions-to-object.js";import{replaceStringValue as E}from"./utils/replace-string-value.js";import{turnCamelToKebabCasing as C}from"./utils/turn-camel-to-kebab-casing.js";import{mergeObjects as x}from"./utils/merge-objects.js";const S=new Map,w=new Map,T={fetchWidget:async()=>null,fetchTemplate:async()=>null,prod:!1,assetsOrigin:"/"},H=h(async(i,e=T)=>{if(e=x(T,e),w.set(i.id,i),i.extends){const t=w.get(i.extends)||await e.fetchTemplate(i.extends);if(!t)throw new Error(`Template "${i.extends}" not found`);w.set(i.extends,t),i=x(t,i)}const{metadata:a={},scripts:g=[],stylesheets:f=[],links:m=[],fonts:$=[],favicons:o=[],content:d="",manifest:n,...r}=i??{},j=new Map,P=typeof d=="string"?d:await k(d,r,j,e);a.charset||(a.charset="UTF-8"),a.viewport||(a.viewport="width=device-width, initial-scale=1.0");const W=Object.entries(a).map(([t,s])=>t.startsWith("property:")?`<meta property="${t.replace("property:","")}" content="${s}">`:`<meta name="${t}" content="${s}">`).join("");let y="";m.forEach(t=>{let s="<link ";Object.entries(t).forEach(([c,b])=>{s+=`${c}="${b}" `}),y+=s+"/>"});let u="";o.forEach(t=>{let s="<link ";Object.entries(t).forEach(([c,b])=>{s+=`${c}="${c==="href"?`${e.assetsOrigin}assets/favicons/`:""}${b}" `}),u+=s+"/>"});let O="";$.forEach(t=>{O+=`<link rel="preload" href="${e.assetsOrigin}assets/fonts/${t}" as="font" crossorigin="anonymous">`});let l="";[...f,...Array.from(j.entries())].forEach(t=>{if(typeof t=="string")t.startsWith("http")?l+=`<link rel="stylesheet" href="${t}" >`:t.endsWith(".css")?l+=`<link rel="stylesheet" href="${e.assetsOrigin}stylesheets/${t}">`:l+=`<style>${t}</style>`;else if(Array.isArray(t)){const[s,c]=t;l+=`<style id="${s}">${M(c)}</style>`}else l+="<style",Object.entries(t.attributes).forEach(([s,c])=>{l+=`${s}="${c}" `}),l+="></style>"});let p="";return g.forEach(t=>{typeof t=="string"?t.startsWith("http")?p+=`<script src="${t}"></script>`:t.endsWith(".js")?p+=`<script src="${e.assetsOrigin}scripts/${t}"></script>`:p+=`<script>${t}</script>`:(p+="<script ",Object.entries(t).forEach(([s,c])=>{p+=`${s}="${c}" `}),p+="></script>")}),`<!doctype html>
1
+ var v=Object.defineProperty;var h=(i,e)=>v(i,"name",{value:e,configurable:!0});import{inputDefinitionsToObject as A}from"./utils/input-definitions-to-object.js";import{replaceStringValue as E}from"./utils/replace-string-value.js";import{turnCamelToKebabCasing as C}from"./utils/turn-camel-to-kebab-casing.js";import{mergeObjects as x}from"./utils/merge-objects.js";const S=new Map,w=new Map,T={fetchWidget:async()=>null,fetchTemplate:async()=>null,prod:!1,assetsOrigin:"/"},H=h(async(i,e=T)=>{if(e=x(T,e),w.set(i.id,i),i.extends){const t=w.get(i.extends)||await e.fetchTemplate(i.extends);if(!t)throw new Error(`Template "${i.extends}" not found`);w.set(i.extends,t),i=x(t,i)}const{metadata:a={},scripts:m=[],stylesheets:f=[],links:d=[],fonts:$=[],favicons:o=[],content:g="",manifest:s,...r}=i??{},j=new Map,P=typeof g=="string"?g:await k(g,r,j,e);a.charset||(a.charset="UTF-8"),a.viewport||(a.viewport="width=device-width, initial-scale=1.0");const W=Object.entries(a).map(([t,n])=>t.startsWith("property:")?`<meta property="${t.replace("property:","")}" content="${n}">`:`<meta name="${t}" content="${n}">`).join("");let y="";d.forEach(t=>{let n="<link ";Object.entries(t).forEach(([c,b])=>{n+=`${c}="${b}" `}),y+=n+"/>"});let u="";o.forEach(t=>{let n="<link ";Object.entries(t).forEach(([c,b])=>{n+=`${c}="${c==="href"?`${e.assetsOrigin}assets/favicons/`:""}${b}" `}),u+=n+"/>"});let O="";$.forEach(t=>{O+=`<link rel="preload" href="${e.assetsOrigin}assets/fonts/${t}" as="font" crossorigin="anonymous">`});let l="";[...f,...Array.from(j.entries())].forEach(t=>{if(typeof t=="string")t.startsWith("http")?l+=`<link rel="stylesheet" href="${t}" >`:t.endsWith(".css")?l+=`<link rel="stylesheet" href="${e.assetsOrigin}stylesheets/${t}">`:l+=`<style>${t}</style>`;else if(Array.isArray(t)){const[n,c]=t;l+=`<style id="${n}">${M(c)}</style>`}else l+="<style",Object.entries(t.attributes).forEach(([n,c])=>{l+=`${n}="${c}" `}),l+="></style>"});let p="";return m.forEach(t=>{typeof t=="string"?t.startsWith("http")?p+=`<script src="${t}"></script>`:t.endsWith(".js")?p+=`<script src="${e.assetsOrigin}scripts/${t}"></script>`:p+=`<script>${t}</script>`:(p+="<script ",Object.entries(t).forEach(([n,c])=>{p+=`${n}="${c}" `}),p+="></script>")}),`<!doctype html>
2
2
  <html lang="${r.lang??"en"}">
3
3
  <head>
4
4
  <title>${r.title}</title>
@@ -15,11 +15,11 @@ var v=Object.defineProperty;var h=(i,e)=>v(i,"name",{value:e,configurable:!0});i
15
15
  ${u?`<!-- favicons -->${u}`:""}
16
16
  ${O?`<!-- fonts -->${O}`:""}
17
17
  ${y?`<!-- links -->${y}`:""}
18
- ${n?`<link rel="manifest" href="${e.assetsOrigin}assets/${n}">`:""}
18
+ ${s?`<link rel="manifest" href="${e.assetsOrigin}assets/${s}">`:""}
19
19
  ${l?`<!-- stylesheets -->${l}`:""}
20
20
  </head>
21
21
  <body>
22
22
  ${P}
23
23
  ${p?"<!-- scripts -->"+p:""}
24
24
  </body>
25
- </html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");function M(i){return typeof i=="string"?i:Object.entries(i).map(([e,a])=>typeof a=="object"?`${C(e)} { ${M(a)} }`:`${C(e)}: ${a};`).join(" ")}h(M,"parseStyle");async function k(i,e={},a,g=T){return(await Promise.all(i.map(async f=>{if(typeof f=="string")return E(f,e);let{name:m,children:$,...o}=f;if(m==="widget"){if(f["data-render-id"]=f["data-render-id"]||Math.random().toString(36).substring(2,15),{name:m,children:$,...o}=f,o.id){const n=S.get(o.id)||await g.fetchWidget(o.id);n&&(typeof n.render=="function"?$=[n.render({...A(n.inputs),...o,env:e})]:$=n.content?[n.content]:[],n.style&&a.set(o.id,n.style),S.set(o.id,n))}if(g.prod)return $.join("")}const d=Object.entries(o).map(([n,r])=>(typeof r=="string"&&(r=E(r,e)),`${n}="${r}"`)).join(" ");return`<${m}`+(d?` ${d}`:"")+`>${await k($,e,a,g)}</${m}>`}))).join("")}h(k,"parseContent");export{H as parseTemplate};
25
+ </html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");function M(i){return typeof i=="string"?i:Object.entries(i).map(([e,a])=>typeof a=="object"?`${C(e)} { ${M(a)} }`:`${C(e)}: ${a};`).join(" ")}h(M,"parseStyle");async function k(i,e={},a,m=T){return(await Promise.all(i.map(async f=>{if(typeof f=="string")return E(f,e);let{name:d,children:$,...o}=f;if(d==="widget"){if(f["data-render-id"]=f["data-render-id"]||Math.random().toString(36).substring(2,15),{name:d,children:$,...o}=f,o.id){const s=S.get(o.id)||await m.fetchWidget(o.id);s&&(typeof s.render=="function"?$=[s.render({...A(s.inputs),...o,env:{...e,assetsOrigin:m.assetsOrigin}})]:$=s.content?[s.content]:[],s.style&&a.set(o.id,s.style),S.set(o.id,s))}if(m.prod)return $.join("")}const g=Object.entries(o).map(([s,r])=>(typeof r=="string"&&(r=E(r,e)),`${s}="${r}"`)).join(" ");return`<${d}`+(g?` ${g}`:"")+`>${await k($,e,a,m)}</${d}>`}))).join("")}h(k,"parseContent");export{H as parseTemplate};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beforesemicolon/site-builder",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Site builder based on JSON files",
5
5
  "engines": {
6
6
  "node": ">=18.16.0"
@@ -20,9 +20,8 @@
20
20
  "test:watch": "jest --watch",
21
21
  "docs:watch": "rm -rf website && NODE_ENV=development nodemon --watch docs -e js,css,md,json --exec 'node node_modules/@beforesemicolon/builder/dist/esm/docs/run.js'",
22
22
  "local": "nodemon --watch src -e ts --exec 'npm run build && npm pack && npm link'",
23
- "build:browser": "node node_modules/@beforesemicolon/builder/dist/esm/build-browser.js",
24
- "build:modules": "node node_modules/@beforesemicolon/builder/dist/esm/build-modules.js",
25
- "build": "rm -rf dist && npm-run-all lint test && tsc --emitDeclarationOnly && npm-run-all build:modules build:browser",
23
+ "build:browser": "node ",
24
+ "build": "rm -rf dist && npm-run-all lint test && tsc --emitDeclarationOnly && tsx ./build.ts && tsx ./build-client.ts",
26
25
  "lint": "eslint ./src && prettier --check .",
27
26
  "format": "eslint ./src --fix && prettier --write ."
28
27
  },
@@ -43,7 +42,7 @@
43
42
  "type": "github"
44
43
  },
45
44
  "devDependencies": {
46
- "@beforesemicolon/builder": "^1.4.0",
45
+ "@beforesemicolon/builder": "^1.6.3",
47
46
  "@gjsify/esbuild-plugin-transform-ext": "0.0.4",
48
47
  "@types/clean-css": "^4.2.11",
49
48
  "@types/jest": "^29.5.11",