@beforesemicolon/site-builder 0.25.0 → 0.26.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.
- package/dist/cjs/build-templates.js +1 -1
- package/dist/cjs/parse-template.js +1 -25
- package/dist/cjs/parse-widget.js +1 -1
- package/dist/cjs/types.js +1 -1
- package/dist/client.js +1 -25
- package/dist/client.js.map +3 -3
- package/dist/esm/build-templates.js +1 -1
- package/dist/esm/parse-template.js +1 -25
- package/dist/esm/parse-widget.js +1 -1
- package/dist/esm/types.js +1 -1
- package/dist/types/parse-widget.d.ts +3 -3
- package/dist/types/types.d.ts +19 -12
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var R=Object.create;var f=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var E=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var u=(e,s)=>f(e,"name",{value:s,configurable:!0});var H=(e,s)=>{for(var n in s)f(e,n,{get:s[n],enumerable:!0})},S=(e,s,n,c)=>{if(s&&typeof s=="object"||typeof s=="function")for(let l of z(s))!G.call(e,l)&&l!==n&&f(e,l,{get:()=>s[l],enumerable:!(c=q(s,l))||c.enumerable});return e};var d=(e,s,n)=>(n=e!=null?R(E(e)):{},S(s||!e||!e.__esModule?f(n,"default",{value:e,enumerable:!0}):n,e)),I=e=>S(f({},"__esModule",{value:!0}),e);var V={};H(V,{buildTemplates:()=>U});module.exports=I(V);var a=d(require("path"),1),w=d(require("fs"),1),C=d(require("esbuild"),1),F=require("./utils/merge-objects.js"),b=require("./parse-template.js"),x=d(require("clean-css"),1),O=require("./types.js"),k=require("html-minifier");const K=new x.default,{writeFile:j,readFile:W,readdir:L,mkdir:h,cp:M,rm:Q}=w.default.promises,U=u(async({publicDir:e,srcDir:s,prod:n=!0})=>{const c=a.default.resolve(e,"scripts"),l=a.default.resolve(e,"stylesheets"),B=a.default.resolve(e,"assets");w.default.existsSync(e)&&await Q(e,{recursive:!0,force:!0}),await h(e,{recursive:!0}),await h(c,{recursive:!0}),await h(l,{recursive:!0}),await M(a.default.resolve(s,"assets"),B,{recursive:!0});const N=await L(a.default.resolve(s,"templates")),y=await Promise.all(N.filter(t=>t.endsWith(".json")).map(async t=>{const r=a.default.basename(t);return{dir:a.default.dirname(t),name:r.replace(".json",""),content:JSON.parse(await W(a.default.resolve(s,"templates",t),"utf8"))}})),g=y.reduce((t,r)=>({...t,[r.name]:r}),{}),P=y.filter(({content:t})=>t.type===O.TemplateType.Page),v=u(async t=>{typeof t=="string"&&t.endsWith(".js")&&!t.startsWith("http")&&await C.default.build({entryPoints:[a.default.resolve(s,"scripts",t)],minify:!0,outfile:a.default.join(c,t)})},"handleScript"),T=u(async t=>{if(typeof t=="string"&&t.endsWith(".css")&&!t.startsWith("http")){const r=await W(a.default.resolve(s,"stylesheets",t),"utf8");await j(a.default.join(l,t),K.minify(r).styles,"utf-8")}},"handleStylesheet");for(const{name:t,dir:r,content:J}of P){let o=J;if(o.extends){const i=g[o.extends];o=(0,F.mergeObjects)(i.content,o)}await h(a.default.join(e,r),{recursive:!0});for(let i=0;i<(o.scripts?.length??0);i++)await v(o.scripts[i]);for(let i=0;i<(o.stylesheets?.length??0);i++)await T(o.stylesheets[i]);const $=await(0,b.parseTemplate)(o,{prod:n,fetchTemplate:i=>g[i].content,fetchWidget:async i=>{const p=(await import(a.default.resolve(s,"widgets",`${i}.js`))).default;for(let m=0;m<(p.scripts?.length??0);m++)await v(p.scripts[m]);for(let m=0;m<(p.stylesheets?.length??0);m++)await T(p.stylesheets[m]);return p}}),A=(0,k.minify)($,{collapseWhitespace:!0,removeComments:!0,minifyCSS:!0,minifyJS:!0});await j(a.default.join(e,r,`${t}.html`),A)}},"buildTemplates");0&&(module.exports={buildTemplates});
|
|
@@ -1,25 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
<html lang="${o.lang??"en"}">
|
|
3
|
-
<head>
|
|
4
|
-
<title>${o.title}</title>
|
|
5
|
-
<meta charset="UTF-8">
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<!-- og -->
|
|
8
|
-
<meta property="og:title" content="${o.title}">
|
|
9
|
-
<meta property="og:type" content="website">
|
|
10
|
-
<meta property="og:description" content="${o.description}">
|
|
11
|
-
<meta property="og:image" content="${o.image}">
|
|
12
|
-
<meta property="og:url" content="${o.domain}">
|
|
13
|
-
<meta property="og:site_name" content="${o.title}">
|
|
14
|
-
${j?`<!-- metas -->${j}`:""}
|
|
15
|
-
${h?`<!-- favicons -->${h}`:""}
|
|
16
|
-
${d?`<!-- fonts -->${d}`:""}
|
|
17
|
-
${m?`<!-- links -->${m}`:""}
|
|
18
|
-
${b?`<link rel="manifest" href="${e.assetsOrigin}assets/${b}">`:""}
|
|
19
|
-
${n?`<!-- stylesheets -->${n}`:""}
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
${A}
|
|
23
|
-
${l?"<!-- scripts -->"+l:""}
|
|
24
|
-
</body>
|
|
25
|
-
</html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");0&&(module.exports={parseTemplate});
|
|
1
|
+
"use strict";var m=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var O=(e,s)=>m(e,"name",{value:s,configurable:!0});var z=(e,s)=>{for(var i in s)m(e,i,{get:s[i],enumerable:!0})},B=(e,s,i,f)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of q(s))!_.call(e,o)&&o!==i&&m(e,o,{get:()=>s[o],enumerable:!(f=U(s,o))||f.enumerable});return e};var D=e=>B(m({},"__esModule",{value:!0}),e);var H={};z(H,{parseTemplate:()=>G});module.exports=D(H);var S=require("./utils/merge-objects.js"),u=require("./default-parse-options.js"),A=require("./parse-widget.js"),E=require("./parse-style.js");const b=new Map,k=O(e=>Array.from(new Set(e)),"unique"),G=O(async(e,s=u.defaultOptions)=>{if(s=(0,S.mergeObjects)(u.defaultOptions,s),b.set(e.id,e),e.extends){const t=b.get(e.extends)||await s.fetchTemplate?.(e.extends);if(!t)throw new Error(`Template "${e.extends}" not found`);b.set(e.extends,t),e=(0,S.mergeObjects)(t,e)}const{metadata:i={},scripts:f=[],stylesheets:o=[],links:C=[],fonts:W=[],favicons:F=[],content:$="",manifest:j,...l}=e??{},v=new Map,x=new Map,I=typeof $=="string"?$:await(0,A.parseTemplateContent)($,l,v,x,s);i.charset||(i.charset="UTF-8"),i.viewport||(i.viewport="width=device-width, initial-scale=1.0");const M=Object.entries(i).map(([t,r])=>t.startsWith("property:")?`<meta property="${t.replace("property:","")}" content="${r}">`:(t==="msapplication-TileImage"&&(r=`${s.assetsOrigin}${r}`),`<meta name="${t}" content="${r}">`)).join("");let h="";C.forEach(t=>{let r="<link ";Object.entries(t).forEach(([n,p])=>{r+=`${n}="${p}" `}),h+=r+"/>"});let g="";F.forEach(t=>{let r="<link ";Object.entries(t).forEach(([n,p])=>{r+=`${n}="${n==="href"?`${s.assetsOrigin}assets/favicons/`:""}${p}" `}),g+=r+"/>"});let d="";W.forEach(t=>{d+=`<link rel="preload" href="${s.assetsOrigin}assets/fonts/${t}" as="font" crossorigin>`});let a="",y="";Array.from(v.values()).flat().forEach(t=>{o.push(t)}),k(o).forEach(t=>{if(typeof t=="string")t.startsWith("http")?a+=`<link rel="stylesheet" href="${t}" >`:t.endsWith(".css")?a+=`<link rel="stylesheet" href="${s.assetsOrigin}stylesheets/${t}">`:y+=t;else if(Array.isArray(t)){const[r,n]=t;a+=`<style id="${r}-style">${(0,E.parseStyle)(n)}</style>`}else{a+="<style";const{attributes:r,content:n="",...p}=t;Object.entries(r??p).forEach(([T,w])=>{a+=`${T}="${w}" `}),a+=`>${(0,E.parseStyle)(n)}</style>`}}),y&&(a=`<style>${y}</style>`+a);let c="";return Array.from(x.values()).flat().forEach(t=>{f.push(t)}),k(f).forEach(t=>{if(typeof t=="string")t.startsWith("http")?c+=`<script src="${t}"></script>`:t.endsWith(".js")?c+=`<script src="${s.assetsOrigin}scripts/${t}"></script>`:c+=`<script>${t}</script>`;else{c+="<script ";const{attributes:r,content:n="",...p}=t;Object.entries(r??p).forEach(([T,w])=>{c+=`${T}="${w}" `}),c+=`>${n}</script>`}}),`<!doctype html><html lang="${l.lang??"en"}"><head><title>${l.title}</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- og --><meta property="og:title" content="${l.title}"><meta property="og:type" content="website"><meta property="og:description" content="${l.description}"><meta property="og:image" content="${l.image}"><meta property="og:url" content="${l.domain}"><meta property="og:site_name" content="${l.title}">`+(M?`<!-- metas -->${M}`:"")+(g?`<!-- favicons -->${g}`:"")+(d?`<!-- fonts -->${d}`:"")+(h?`<!-- links -->${h}`:"")+(j?`<link rel="manifest" href="${s.assetsOrigin}assets/${j}">`:"")+(a?`<!-- stylesheets -->${a}`:"")+"</head><body>"+I+(c?`<!-- scripts -->${c}`:"")+"</body></html>"},"parseTemplate");0&&(module.exports={parseTemplate});
|
package/dist/cjs/parse-widget.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var c=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var u=(r,t)=>c(r,"name",{value:t,configurable:!0});var W=(r,t)=>{for(var s in t)c(r,s,{get:t[s],enumerable:!0})},j=(r,t,s,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of b(t))!w.call(r,i)&&i!==s&&c(r,i,{get:()=>t[i],enumerable:!(o=S(t,i))||o.enumerable});return r};var N=r=>j(c({},"__esModule",{value:!0}),r);var x={};W(x,{parseTemplateContent:()=>y,parseWidget:()=>O});module.exports=N(x);var g=require("./default-parse-options.js"),h=require("./utils/input-definitions-to-object.js"),$=require("./parse-style.js"),C=require("./utils/attributes-to-string.js"),M=require("./utils/replace-string-value.js");const T=new Map;async function O(r,t={},s,o,i=g.defaultOptions){let{name:p,children:a,...n}=r;if(r["data-render-id"]=r["data-render-id"]||Math.random().toString(36).substring(2,15),{name:p,children:a,...n}=r,n.id){const e=T.get(n.id)||await i.fetchWidget?.(n.id);if(e){const l={...(0,h.inputDefinitionsToObject)(e?.inputs??[]),...n,env:{...t,assetsOrigin:i.assetsOrigin,prod:i.prod}};typeof e.render=="function"?a=[e.render(l)]:a=e.content?[e.content]:[];const m=[],f=e.id||n.id;if(e.style){const d=typeof e.style=="function"?e.style(l):e.style;m.push([f,(0,$.parseStyle)(d,e.cssSelector??"")])}e.stylesheets?.forEach(d=>{m.push(d)}),m.length>0&&s.set(f,m),e.scripts&&o.set(f,e.scripts),T.set(n.id,e)}}return i.prod?a.join(""):`<${p} id="${n.id}" data-render-id="${n["data-render-id"]}">${await y(a,t,s,o,i)}</${p}>`}u(O,"parseWidget");async function y(r,t={},s,o,i=g.defaultOptions){return r?(await Promise.all(r.map(async p=>{if(typeof p=="string")return(0,M.replaceStringValue)(p,t);const{name:a,children:n,...e}=p;if(a==="widget")return O(p,t,s,o,i);const l=(0,C.attributeToString)(e,t);return`<${a}`+(l?` ${l}`:"")+`>${await y(n,t,s,o,i)}</${a}>`}))).join(""):""}u(y,"parseTemplateContent");0&&(module.exports={parseTemplateContent,parseWidget});
|
package/dist/cjs/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var l=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var m=(r,t)=>{for(var s in t)l(r,s,{get:t[s],enumerable:!0})},b=(r,t,s,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of i(t))!d.call(r,a)&&a!==s&&l(r,a,{get:()=>t[a],enumerable:!(o=c(t,a))||o.enumerable});return r};var x=r=>b(l({},"__esModule",{value:!0}),r);var S={};m(S,{InputDefinitionType:()=>g,TemplateType:()=>n});module.exports=x(S);var g=(e=>(e.Text="text",e.Html="html",e.Markdown="markdown",e.Number="number",e.Code="code",e.Image="image",e.Video="video",e.Audio="audio",e.File="file",e.Font="font",e.Pdf="pdf",e.Icon="icon",e.Embed="embed",e.Favicon="favicon",e.Email="email",e.Password="password",e.Url="url",e.Tel="tel",e.Color="color",e.Date="date",e.DateTimeLocal="datetime-local",e.Month="month",e.Time="time",e.Week="week",e.Textarea="textarea",e.Boolean="boolean",e.Options="options",e.Group="group",e.List="list",e))(g||{}),n=(s=>(s.Base="base",s.Page="page",s))(n||{});0&&(module.exports={InputDefinitionType,TemplateType});
|
package/dist/client.js
CHANGED
|
@@ -1,26 +1,2 @@
|
|
|
1
|
-
"use strict";(()=>{var
|
|
2
|
-
<html lang="${l.lang??"en"}">
|
|
3
|
-
<head>
|
|
4
|
-
<title>${l.title}</title>
|
|
5
|
-
<meta charset="UTF-8">
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<!-- og -->
|
|
8
|
-
<meta property="og:title" content="${l.title}">
|
|
9
|
-
<meta property="og:type" content="website">
|
|
10
|
-
<meta property="og:description" content="${l.description}">
|
|
11
|
-
<meta property="og:image" content="${l.image}">
|
|
12
|
-
<meta property="og:url" content="${l.domain}">
|
|
13
|
-
<meta property="og:site_name" content="${l.title}">
|
|
14
|
-
${g?`<!-- metas -->${g}`:""}
|
|
15
|
-
${W?`<!-- favicons -->${W}`:""}
|
|
16
|
-
${E?`<!-- fonts -->${E}`:""}
|
|
17
|
-
${b?`<!-- links -->${b}`:""}
|
|
18
|
-
${d?`<link rel="manifest" href="${t.assetsOrigin}assets/${d}">`:""}
|
|
19
|
-
${y?`<!-- stylesheets -->${y}`:""}
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
${f}
|
|
23
|
-
${w?"<!-- scripts -->"+w:""}
|
|
24
|
-
</body>
|
|
25
|
-
</html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");var z=a(e=>{switch(typeof e){case"number":return"number";case"boolean":return"boolean";case"object":return Array.isArray(e)?"list":"group";default:return"text"}},"dataTypeToInputType");function A(e,t){switch(t.type){case"group":return{...t,definitions:Object.entries(e??{}).map(([n,r])=>A(r,(t.definitions??[]).find(c=>c.name===n)??{name:n,type:z(r),value:r}))};case"list":return{...t,definitions:(e??[]).map((n,r)=>A(n,(t.definitions??[])[r]??{name:String(r),type:z(n),value:n}))};default:return{...t,value:e}}}a(A,"mergeDataIntoInputDefinition");window&&(window.BFS={...window.BFS||{},SITE_BUILDER:{inputDefinitionsToObject:O,mergeDataIntoInputDefinition:A,attributeToString:M,parseTemplate:N,parseTemplateContent:S,parseWidget:P,parseStyle:j}});})();
|
|
1
|
+
"use strict";(()=>{var q=Object.defineProperty;var l=(e,t)=>q(e,"name",{value:t,configurable:!0});function x(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}l(x,"turnCamelToKebabCasing");var H=new Set(["@media","@supports","@container","@scope","@document","@layer","@starting-style","@page"]);function N(e,t){return t&&e.trim().startsWith(t)}l(N,"startsWithPrefix");function O(e,t=""){if(typeof e=="string")return e;let n=new Map,r=new Map;function c(m,o,i,u){for(let[a,d]of Object.entries(m))if(typeof d=="object"&&d!==null)if(a.startsWith("@")){let p=Array.from(H).some(f=>a.startsWith(f));c(d,o,a,u||!p)}else{let p,f=x(a);a.startsWith("&")?p=o?a.replace(/&/g,o):a.replace(/&/g,""):o?p=`${o} ${f}`:t&&!u&&!N(f,t)?p=`${t} ${f}`:p=f,c(d,p.trim(),i,u)}else if(d!=null){let p=o;if(t&&!u&&o&&!N(o,t)?p=`${t} ${o}`.trim():!o&&t&&!u&&(p=t),!p)continue;if(i){let f=r.get(i);f||(f=new Map,r.set(i,f));let w=f.get(p);w||(w=new Map,f.set(p,w)),w.set(x(a),d)}else{let f=n.get(p);f||(f=new Map,n.set(p,f)),f.set(x(a),d)}}}l(c,"walk"),c(e,"",null,!1);let g=[];for(let[m,o]of n)if(m&&o.size){let i=[];for(let[u,a]of o)i.push(`${u}: ${a};`);g.push(`${m} { ${i.join(" ")} }`)}for(let[m,o]of r){let i=[];for(let[u,a]of o)if(u&&a.size){let d=[];for(let[p,f]of a)d.push(`${p}: ${f};`);i.push(`${u} { ${d.join(" ")} }`)}i.length&&g.push(`${m} { ${i.join(" ")} }`)}return g.join(" ")}l(O,"parseStyle");function C(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 r in t)t.hasOwnProperty(r)&&(Array.isArray(e[r])&&Array.isArray(t[r])?n[r]=Array.from(new Set([...e[r],...t[r]])):n[r]=C(n[r],t[r]));return n}l(C,"mergeObjects");var j={fetchWidget:async()=>null,fetchTemplate:async()=>null,prod:!1,assetsOrigin:"/"};function T(e){return e.reduce((t,{name:n="",value:r,type:c,definitions:g=[]})=>{switch(c){case"group":t[n]=T(g);break;case"options":t[n]={value:r,options:g.map(m=>Object.values(T([m]))[0])};break;case"list":t[n]=g.map(m=>Object.values(T([m]))[0]);break;default:t[n]=r}return t},{})}l(T,"inputDefinitionsToObject");var z=l((e,t)=>String(t??"").split(".").filter(Boolean).reduce((r,c)=>{try{return r&&typeof r=="object"?r[c]:void 0}catch{return null}},e),"deepValue");var M=l((e,t)=>{let n=null;for(;(n=/{{([a-z0-9.$_]+)}}/gim.exec(e))!==null;){let[r,c]=n,g=z(t,c);e=e.replace(r,String(g))}return e},"replaceStringValue");var A=l((e,t={})=>Object.entries(e).map(([n,r])=>(typeof r=="string"&&(r=M(r,t)),`${n}="${r}"`)).join(" "),"attributeToString");var U=new Map;async function R(e,t={},n,r,c=j){let{name:g,children:m,...o}=e;if(e["data-render-id"]=e["data-render-id"]||Math.random().toString(36).substring(2,15),{name:g,children:m,...o}=e,o.id){let i=U.get(o.id)||await c.fetchWidget?.(o.id);if(i){let u={...T(i?.inputs??[]),...o,env:{...t,assetsOrigin:c.assetsOrigin,prod:c.prod}};typeof i.render=="function"?m=[i.render(u)]:m=i.content?[i.content]:[];let a=[],d=i.id||o.id;if(i.style){let p=typeof i.style=="function"?i.style(u):i.style;a.push([d,O(p,i.cssSelector??"")])}i.stylesheets?.forEach(p=>{a.push(p)}),a.length>0&&n.set(d,a),i.scripts&&r.set(d,i.scripts),U.set(o.id,i)}}return c.prod?m.join(""):`<${g} id="${o.id}" data-render-id="${o["data-render-id"]}">${await k(m,t,n,r,c)}</${g}>`}l(R,"parseWidget");async function k(e,t={},n,r,c=j){return e?(await Promise.all(e.map(async g=>{if(typeof g=="string")return M(g,t);let{name:m,children:o,...i}=g;if(m==="widget")return R(g,t,n,r,c);let u=A(i,t);return`<${m}`+(u?` ${u}`:"")+`>${await k(o,t,n,r,c)}</${m}>`}))).join(""):""}l(k,"parseTemplateContent");var V=new Map,K=l(e=>Array.from(new Set(e)),"unique"),_=l(async(e,t=j)=>{if(t=C(j,t),V.set(e.id,e),e.extends){let s=V.get(e.extends)||await t.fetchTemplate?.(e.extends);if(!s)throw new Error(`Template "${e.extends}" not found`);V.set(e.extends,s),e=C(s,e)}let{metadata:n={},scripts:r=[],stylesheets:c=[],links:g=[],fonts:m=[],favicons:o=[],content:i="",manifest:u,...a}=e??{},d=new Map,p=new Map,f=typeof i=="string"?i:await k(i,a,d,p,t);n.charset||(n.charset="UTF-8"),n.viewport||(n.viewport="width=device-width, initial-scale=1.0");let w=Object.entries(n).map(([s,y])=>s.startsWith("property:")?`<meta property="${s.replace("property:","")}" content="${y}">`:(s==="msapplication-TileImage"&&(y=`${t.assetsOrigin}${y}`),`<meta name="${s}" content="${y}">`)).join(""),E="";g.forEach(s=>{let y="<link ";Object.entries(s).forEach(([$,S])=>{y+=`${$}="${S}" `}),E+=y+"/>"});let L="";o.forEach(s=>{let y="<link ";Object.entries(s).forEach(([$,S])=>{y+=`${$}="${$==="href"?`${t.assetsOrigin}assets/favicons/`:""}${S}" `}),L+=y+"/>"});let v="";m.forEach(s=>{v+=`<link rel="preload" href="${t.assetsOrigin}assets/fonts/${s}" as="font" crossorigin>`});let h="",P="";Array.from(d.values()).flat().forEach(s=>{c.push(s)}),K(c).forEach(s=>{if(typeof s=="string")s.startsWith("http")?h+=`<link rel="stylesheet" href="${s}" >`:s.endsWith(".css")?h+=`<link rel="stylesheet" href="${t.assetsOrigin}stylesheets/${s}">`:P+=s;else if(Array.isArray(s)){let[y,$]=s;h+=`<style id="${y}-style">${O($)}</style>`}else{h+="<style";let{attributes:y,content:$="",...S}=s;Object.entries(y??S).forEach(([B,F])=>{h+=`${B}="${F}" `}),h+=`>${O($)}</style>`}}),P&&(h=`<style>${P}</style>`+h);let b="";return Array.from(p.values()).flat().forEach(s=>{r.push(s)}),K(r).forEach(s=>{if(typeof s=="string")s.startsWith("http")?b+=`<script src="${s}"><\/script>`:s.endsWith(".js")?b+=`<script src="${t.assetsOrigin}scripts/${s}"><\/script>`:b+=`<script>${s}<\/script>`;else{b+="<script ";let{attributes:y,content:$="",...S}=s;Object.entries(y??S).forEach(([B,F])=>{b+=`${B}="${F}" `}),b+=`>${$}<\/script>`}}),`<!doctype html><html lang="${a.lang??"en"}"><head><title>${a.title}</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- og --><meta property="og:title" content="${a.title}"><meta property="og:type" content="website"><meta property="og:description" content="${a.description}"><meta property="og:image" content="${a.image}"><meta property="og:url" content="${a.domain}"><meta property="og:site_name" content="${a.title}">`+(w?`<!-- metas -->${w}`:"")+(L?`<!-- favicons -->${L}`:"")+(v?`<!-- fonts -->${v}`:"")+(E?`<!-- links -->${E}`:"")+(u?`<link rel="manifest" href="${t.assetsOrigin}assets/${u}">`:"")+(h?`<!-- stylesheets -->${h}`:"")+"</head><body>"+f+(b?`<!-- scripts -->${b}`:"")+"</body></html>"},"parseTemplate");var G=l(e=>{switch(typeof e){case"number":return"number";case"boolean":return"boolean";case"object":return Array.isArray(e)?"list":"group";default:return"text"}},"dataTypeToInputType");function W(e,t){switch(t.type){case"group":return{...t,definitions:Object.entries(e??{}).map(([n,r])=>W(r,(t.definitions??[]).find(c=>c.name===n)??{name:n,type:G(r),value:r}))};case"list":return{...t,definitions:(e??[]).map((n,r)=>W(n,(t.definitions??[])[r]??{name:String(r),type:G(n),value:n}))};default:return{...t,value:e}}}l(W,"mergeDataIntoInputDefinition");window&&(window.BFS={...window.BFS||{},SITE_BUILDER:{inputDefinitionsToObject:T,mergeDataIntoInputDefinition:W,attributeToString:A,parseTemplate:_,parseTemplateContent:k,parseWidget:R,parseStyle:O}});})();
|
|
26
2
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/utils/turn-camel-to-kebab-casing.ts", "../src/parse-style.ts", "../src/utils/merge-objects.ts", "../src/default-parse-options.ts", "../src/utils/input-definitions-to-object.ts", "../src/utils/deep-value.ts", "../src/utils/replace-string-value.ts", "../src/utils/attributes-to-string.ts", "../src/parse-widget.ts", "../src/parse-template.ts", "../src/utils/merge-data-into-input-definition.ts", "../src/client.ts"],
|
|
4
|
-
"sourcesContent": ["export function turnCamelToKebabCasing(str: string): string {\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()\n}\n", "import { Style } from './types.ts'\nimport { turnCamelToKebabCasing } from './utils/turn-camel-to-kebab-casing.ts'\n\nconst prefixingAtRules = new Set([\n '@media',\n '@supports',\n '@container',\n '@scope',\n '@document',\n '@layer',\n '@starting-style',\n '@page',\n])\n\nfunction startsWithPrefix(sel: string, prefix: string) {\n return prefix && sel.trim().startsWith(prefix)\n}\n\nexport function parseStyle(style: Style, prefix = ''): string {\n if (typeof style === 'string') return style\n\n const selectorMap = new Map<string, Map<string, string>>()\n const atRuleMap = new Map<string, Map<string, Map<string, string>>>()\n\n function walk(\n node: Style,\n sel: string,\n at: string | null,\n insideNonPrefixingAtRule: boolean\n ) {\n for (const [key, value] of Object.entries(node)) {\n if (typeof value === 'object' && value !== null) {\n if (key.startsWith('@')) {\n const isPrefixing = Array.from(prefixingAtRules).some(\n (rule) => key.startsWith(rule)\n )\n walk(\n value,\n sel,\n key,\n insideNonPrefixingAtRule || !isPrefixing\n )\n } else {\n let nextSel: string\n const kebabKey = turnCamelToKebabCasing(key)\n if (key.startsWith('&')) {\n nextSel = sel\n ? key.replace(/&/g, sel)\n : key.replace(/&/g, '')\n } else if (sel) {\n nextSel = `${sel} ${kebabKey}`\n } else if (\n prefix &&\n !insideNonPrefixingAtRule &&\n !startsWithPrefix(kebabKey, prefix)\n ) {\n nextSel = `${prefix} ${kebabKey}`\n } else {\n nextSel = kebabKey\n }\n walk(value, nextSel.trim(), at, insideNonPrefixingAtRule)\n }\n } else if (value != null) {\n let finalSel = sel\n if (\n prefix &&\n !insideNonPrefixingAtRule &&\n sel &&\n !startsWithPrefix(sel, prefix)\n ) {\n finalSel = `${prefix} ${sel}`.trim()\n } else if (!sel && prefix && !insideNonPrefixingAtRule) {\n finalSel = prefix\n }\n if (!finalSel) continue\n if (at) {\n let selMap = atRuleMap.get(at)\n if (!selMap) {\n selMap = new Map()\n atRuleMap.set(at, selMap)\n }\n let props = selMap.get(finalSel)\n if (!props) {\n props = new Map()\n selMap.set(finalSel, props)\n }\n props.set(turnCamelToKebabCasing(key), value as string)\n } else {\n let props = selectorMap.get(finalSel)\n if (!props) {\n props = new Map()\n selectorMap.set(finalSel, props)\n }\n props.set(turnCamelToKebabCasing(key), value as string)\n }\n }\n }\n }\n\n walk(style, '', null, false)\n\n const blocks: string[] = []\n\n for (const [sel, props] of selectorMap) {\n if (sel && props.size) {\n const propStrs: string[] = []\n for (const [k, v] of props) propStrs.push(`${k}: ${v};`)\n blocks.push(`${sel} { ${propStrs.join(' ')} }`)\n }\n }\n\n for (const [at, selMap] of atRuleMap) {\n const inner: string[] = []\n for (const [sel, props] of selMap) {\n if (sel && props.size) {\n const propStrs: string[] = []\n for (const [k, v] of props) propStrs.push(`${k}: ${v};`)\n inner.push(`${sel} { ${propStrs.join(' ')} }`)\n }\n }\n if (inner.length) blocks.push(`${at} { ${inner.join(' ')} }`)\n }\n\n return blocks.join(' ')\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 { parseOptions } from './types.ts'\n\nexport const defaultOptions: parseOptions = {\n fetchWidget: async () => null,\n fetchTemplate: async () => null,\n prod: false,\n assetsOrigin: '/',\n}\n", "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 case 'options':\n acc[name] = {\n value,\n options: definitions.map((item) => {\n return Object.values(\n inputDefinitionsToObject([item])\n )[0]\n }),\n }\n break\n case 'list':\n acc[name] = definitions.map((item) => {\n return Object.values(\n inputDefinitionsToObject([item])\n )[0]\n })\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", "import { replaceStringValue } from './replace-string-value.ts'\n\nexport const attributeToString = (\n attributes: Record<string, unknown>,\n data = {}\n) => {\n return 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", "import {\n parseOptions,\n TemplateContentNode,\n Widget,\n Style,\n TemplateContent,\n} from './types.js'\nimport { defaultOptions } from './default-parse-options.ts'\nimport { inputDefinitionsToObject } from './utils/input-definitions-to-object.ts'\nimport { parseStyle } from './parse-style.ts'\nimport { attributeToString } from './utils/attributes-to-string.ts'\nimport { replaceStringValue } from './utils/replace-string-value.ts'\n\nconst widgetCache: Map<string, Widget> = new Map()\n\nexport async function parseWidget(\n node: TemplateContentNode,\n data = {},\n widgetStyles: Map<string, Style>,\n opt: parseOptions = defaultOptions\n) {\n let { name, children, ...attributes } = node\n\n node['data-render-id'] =\n node['data-render-id'] || 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 const props = {\n ...inputDefinitionsToObject(widget?.inputs ?? []),\n ...attributes,\n env: {\n ...data,\n assetsOrigin: opt.assetsOrigin,\n prod: opt.prod,\n },\n }\n\n if (typeof widget.render === 'function') {\n children = [widget.render(props)]\n } else {\n children = widget.content ? [widget.content] : []\n }\n\n if (widget.style) {\n const styleContent =\n typeof widget.style === 'function'\n ? widget.style(props)\n : widget.style\n widgetStyles.set(\n widget.id || attributes.id,\n parseStyle(styleContent, widget.cssSelector ?? '')\n )\n }\n\n widgetCache.set(attributes.id, widget)\n }\n }\n\n if (opt.prod) {\n return children.join('')\n }\n\n return (\n `<${name} id=\"${attributes.id}\" data-render-id=\"${attributes['data-render-id']}\"` +\n `>${await parseTemplateContent(children, data, widgetStyles, opt)}</${name}>`\n )\n}\n\nexport async function parseTemplateContent(\n content: TemplateContent,\n data = {},\n widgetStyles: Map<string, Style>,\n opt: parseOptions = defaultOptions\n): Promise<string> {\n if (!content) {\n return ''\n }\n\n return (\n await Promise.all(\n content.map(async (node) => {\n if (typeof node === 'string') {\n return replaceStringValue(node, data)\n }\n\n const { name, children, ...attributes } = node\n\n if (name === 'widget') {\n return parseWidget(\n node as TemplateContentNode,\n data,\n widgetStyles,\n opt\n )\n }\n\n const attrs = attributeToString(attributes, data)\n\n return (\n `<${name}` +\n (attrs ? ` ${attrs}` : '') +\n `>${await parseTemplateContent(children, data, widgetStyles, opt)}</${name}>`\n )\n })\n )\n ).join('')\n}\n", "import { parseOptions, Template, TemplateContent } from './types.ts'\nimport { mergeObjects } from './utils/merge-objects.ts'\nimport { defaultOptions } from './default-parse-options.ts'\nimport { parseTemplateContent } from './parse-widget.ts'\nimport { parseStyle } from './parse-style.ts'\n\nconst tempCache: Map<string, Template> = new Map()\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 parseTemplateContent(\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 if (key === 'msapplication-TileImage') {\n value = `${opt.assetsOrigin}${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>`\n })\n\n let st = ''\n let loseInlineStyles = ''\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 loseInlineStyles += stylesheet\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 if (loseInlineStyles) {\n // make it come before so it can easily be overridden by widget styles\n st = `<style>${loseInlineStyles}</style>` + st\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", "import {\n InputDefinition,\n ObjectLiteral,\n InputDefinitionType,\n} from '../types.ts'\n\nconst dataTypeToInputType = (data: unknown) => {\n switch (typeof data) {\n case 'number':\n return InputDefinitionType.Number\n case 'boolean':\n return InputDefinitionType.Boolean\n case 'object':\n if (Array.isArray(data)) {\n return InputDefinitionType.List\n } else {\n return InputDefinitionType.Group\n }\n default:\n return InputDefinitionType.Text\n }\n}\n\nexport function mergeDataIntoInputDefinition(\n data: unknown,\n def: InputDefinition\n): InputDefinition {\n switch (def.type) {\n case 'group':\n return {\n ...def,\n definitions: Object.entries((data ?? {}) as ObjectLiteral).map(\n ([k, v]) => {\n return mergeDataIntoInputDefinition(\n v,\n ((def.definitions ?? []) as InputDefinition[]).find(\n (item) => item.name === k\n ) ?? {\n name: k,\n type: dataTypeToInputType(v),\n value: v,\n }\n )\n }\n ),\n }\n case 'list':\n return {\n ...def,\n definitions: ((data ?? []) as Array<unknown>).map(\n (item, idx) => {\n return mergeDataIntoInputDefinition(\n item,\n ((def.definitions ?? [])[idx] ?? {\n name: String(idx),\n type: dataTypeToInputType(item),\n value: item,\n }) as InputDefinition\n )\n }\n ),\n }\n default:\n return {\n ...def,\n value: data,\n }\n }\n}\n", "import { parseStyle } from './parse-style.ts'\nimport { parseTemplate } from './parse-template.ts'\nimport { parseTemplateContent, parseWidget } from './parse-widget.ts'\nimport { attributeToString } from './utils/attributes-to-string.ts'\nimport { inputDefinitionsToObject } from './utils/input-definitions-to-object.ts'\nimport { mergeDataIntoInputDefinition } from './utils/merge-data-into-input-definition.ts'\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 inputDefinitionsToObject,\n mergeDataIntoInputDefinition,\n attributeToString,\n parseTemplate,\n parseTemplateContent,\n parseWidget,\n parseStyle,\n },\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
6
|
-
"names": ["turnCamelToKebabCasing", "str", "__name", "prefixingAtRules", "startsWithPrefix", "sel", "prefix", "__name", "parseStyle", "style", "selectorMap", "atRuleMap", "walk", "node", "at", "insideNonPrefixingAtRule", "key", "value", "isPrefixing", "rule", "nextSel", "kebabKey", "turnCamelToKebabCasing", "finalSel", "selMap", "props", "blocks", "propStrs", "k", "v", "inner", "mergeObjects", "a", "b", "obj", "key", "__name", "defaultOptions", "inputDefinitionsToObject", "inputDefinitions", "acc", "name", "value", "type", "definitions", "item", "__name", "deepValue", "__name", "obj", "key", "acc", "k", "replaceStringValue", "__name", "value", "data", "match", "full", "key", "dv", "deepValue", "attributeToString", "__name", "attributes", "data", "name", "value", "replaceStringValue", "widgetCache", "parseWidget", "node", "data", "widgetStyles", "opt", "defaultOptions", "name", "children", "attributes", "widget", "props", "inputDefinitionsToObject", "styleContent", "parseStyle", "parseTemplateContent", "__name", "content", "replaceStringValue", "attrs", "attributeToString", "tempCache", "
|
|
4
|
+
"sourcesContent": ["export function turnCamelToKebabCasing(str: string): string {\n return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()\n}\n", "import { Style } from './types.ts'\nimport { turnCamelToKebabCasing } from './utils/turn-camel-to-kebab-casing.ts'\n\nconst prefixingAtRules = new Set([\n '@media',\n '@supports',\n '@container',\n '@scope',\n '@document',\n '@layer',\n '@starting-style',\n '@page',\n])\n\nfunction startsWithPrefix(sel: string, prefix: string) {\n return prefix && sel.trim().startsWith(prefix)\n}\n\nexport function parseStyle(style: Style, prefix = ''): string {\n if (typeof style === 'string') return style\n\n const selectorMap = new Map<string, Map<string, string>>()\n const atRuleMap = new Map<string, Map<string, Map<string, string>>>()\n\n function walk(\n node: Style,\n sel: string,\n at: string | null,\n insideNonPrefixingAtRule: boolean\n ) {\n for (const [key, value] of Object.entries(node)) {\n if (typeof value === 'object' && value !== null) {\n if (key.startsWith('@')) {\n const isPrefixing = Array.from(prefixingAtRules).some(\n (rule) => key.startsWith(rule)\n )\n walk(\n value,\n sel,\n key,\n insideNonPrefixingAtRule || !isPrefixing\n )\n } else {\n let nextSel: string\n const kebabKey = turnCamelToKebabCasing(key)\n if (key.startsWith('&')) {\n nextSel = sel\n ? key.replace(/&/g, sel)\n : key.replace(/&/g, '')\n } else if (sel) {\n nextSel = `${sel} ${kebabKey}`\n } else if (\n prefix &&\n !insideNonPrefixingAtRule &&\n !startsWithPrefix(kebabKey, prefix)\n ) {\n nextSel = `${prefix} ${kebabKey}`\n } else {\n nextSel = kebabKey\n }\n walk(value, nextSel.trim(), at, insideNonPrefixingAtRule)\n }\n } else if (value != null) {\n let finalSel = sel\n if (\n prefix &&\n !insideNonPrefixingAtRule &&\n sel &&\n !startsWithPrefix(sel, prefix)\n ) {\n finalSel = `${prefix} ${sel}`.trim()\n } else if (!sel && prefix && !insideNonPrefixingAtRule) {\n finalSel = prefix\n }\n if (!finalSel) continue\n if (at) {\n let selMap = atRuleMap.get(at)\n if (!selMap) {\n selMap = new Map()\n atRuleMap.set(at, selMap)\n }\n let props = selMap.get(finalSel)\n if (!props) {\n props = new Map()\n selMap.set(finalSel, props)\n }\n props.set(turnCamelToKebabCasing(key), value as string)\n } else {\n let props = selectorMap.get(finalSel)\n if (!props) {\n props = new Map()\n selectorMap.set(finalSel, props)\n }\n props.set(turnCamelToKebabCasing(key), value as string)\n }\n }\n }\n }\n\n walk(style, '', null, false)\n\n const blocks: string[] = []\n\n for (const [sel, props] of selectorMap) {\n if (sel && props.size) {\n const propStrs: string[] = []\n for (const [k, v] of props) propStrs.push(`${k}: ${v};`)\n blocks.push(`${sel} { ${propStrs.join(' ')} }`)\n }\n }\n\n for (const [at, selMap] of atRuleMap) {\n const inner: string[] = []\n for (const [sel, props] of selMap) {\n if (sel && props.size) {\n const propStrs: string[] = []\n for (const [k, v] of props) propStrs.push(`${k}: ${v};`)\n inner.push(`${sel} { ${propStrs.join(' ')} }`)\n }\n }\n if (inner.length) blocks.push(`${at} { ${inner.join(' ')} }`)\n }\n\n return blocks.join(' ')\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 { parseOptions } from './types.ts'\n\nexport const defaultOptions: parseOptions = {\n fetchWidget: async () => null,\n fetchTemplate: async () => null,\n prod: false,\n assetsOrigin: '/',\n}\n", "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 case 'options':\n acc[name] = {\n value,\n options: definitions.map((item) => {\n return Object.values(\n inputDefinitionsToObject([item])\n )[0]\n }),\n }\n break\n case 'list':\n acc[name] = definitions.map((item) => {\n return Object.values(\n inputDefinitionsToObject([item])\n )[0]\n })\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", "import { replaceStringValue } from './replace-string-value.ts'\n\nexport const attributeToString = (\n attributes: Record<string, unknown>,\n data = {}\n) => {\n return 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", "import {\n parseOptions,\n TemplateContentNode,\n Widget,\n TemplateContent,\n TemplateStylesheet,\n TemplateScript,\n} from './types.js'\nimport { defaultOptions } from './default-parse-options.ts'\nimport { inputDefinitionsToObject } from './utils/input-definitions-to-object.ts'\nimport { parseStyle } from './parse-style.ts'\nimport { attributeToString } from './utils/attributes-to-string.ts'\nimport { replaceStringValue } from './utils/replace-string-value.ts'\n\nconst widgetCache: Map<string, Widget> = new Map()\n\nexport async function parseWidget(\n node: TemplateContentNode,\n data = {},\n widgetStyles: Map<string, TemplateStylesheet[]>,\n widgetScripts: Map<string, TemplateScript[]>,\n opt: parseOptions = defaultOptions\n) {\n let { name, children, ...attributes } = node\n\n node['data-render-id'] =\n node['data-render-id'] || 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 const props = {\n ...inputDefinitionsToObject(widget?.inputs ?? []),\n ...attributes,\n env: {\n ...data,\n assetsOrigin: opt.assetsOrigin,\n prod: opt.prod,\n },\n }\n\n if (typeof widget.render === 'function') {\n children = [widget.render(props)]\n } else {\n children = widget.content ? [widget.content] : []\n }\n\n const styles = []\n const ID = widget.id || attributes.id\n\n if (widget.style) {\n const styleContent =\n typeof widget.style === 'function'\n ? widget.style(props)\n : widget.style\n\n styles.push([\n ID,\n parseStyle(styleContent, widget.cssSelector ?? ''),\n ])\n }\n\n widget.stylesheets?.forEach((stylesheet) => {\n styles.push(stylesheet)\n })\n\n if (styles.length > 0) {\n widgetStyles.set(ID, styles)\n }\n\n if (widget.scripts) {\n widgetScripts.set(ID, widget.scripts)\n }\n\n widgetCache.set(attributes.id, widget)\n }\n }\n\n if (opt.prod) {\n return children.join('')\n }\n\n return (\n `<${name} id=\"${attributes.id}\" data-render-id=\"${attributes['data-render-id']}\"` +\n `>${await parseTemplateContent(children, data, widgetStyles, widgetScripts, opt)}</${name}>`\n )\n}\n\nexport async function parseTemplateContent(\n content: TemplateContent,\n data = {},\n widgetStyles: Map<string, TemplateStylesheet[]>,\n widgetScripts: Map<string, TemplateScript[]>,\n opt: parseOptions = defaultOptions\n): Promise<string> {\n if (!content) {\n return ''\n }\n\n return (\n await Promise.all(\n content.map(async (node) => {\n if (typeof node === 'string') {\n return replaceStringValue(node, data)\n }\n\n const { name, children, ...attributes } = node\n\n if (name === 'widget') {\n return parseWidget(\n node as TemplateContentNode,\n data,\n widgetStyles,\n widgetScripts,\n opt\n )\n }\n\n const attrs = attributeToString(attributes, data)\n\n return (\n `<${name}` +\n (attrs ? ` ${attrs}` : '') +\n `>${await parseTemplateContent(children, data, widgetStyles, widgetScripts, opt)}</${name}>`\n )\n })\n )\n ).join('')\n}\n", "import {\n parseOptions,\n Template,\n TemplateContent,\n TemplateStylesheet,\n TemplateScript,\n StyleTag,\n ScriptTag,\n} from './types.ts'\nimport { mergeObjects } from './utils/merge-objects.ts'\nimport { defaultOptions } from './default-parse-options.ts'\nimport { parseTemplateContent } from './parse-widget.ts'\nimport { parseStyle } from './parse-style.ts'\n\nconst tempCache: Map<string, Template> = new Map()\n\nconst unique = (list: unknown[]) => Array.from(new Set(list))\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: Map<string, TemplateStylesheet[]> = new Map()\n const widgetScripts: Map<string, TemplateScript[]> = new Map()\n\n const bodyContent =\n typeof content === 'string'\n ? content\n : await parseTemplateContent(\n content as TemplateContent,\n data,\n widgetStyles,\n widgetScripts,\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 if (key === 'msapplication-TileImage') {\n value = `${opt.assetsOrigin}${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>`\n })\n\n let st = ''\n let loseInlineStyles = ''\n\n Array.from(widgetStyles.values())\n .flat()\n .forEach((style) => {\n stylesheets.push(style)\n })\n\n unique(stylesheets).forEach((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 loseInlineStyles += stylesheet\n }\n } else if (Array.isArray(stylesheet)) {\n const [id, style] = stylesheet\n st += `<style id=\"${id}-style\">${parseStyle(style)}</style>`\n } else {\n st += `<style`\n\n const {\n attributes,\n content = '',\n ...attrs\n } = stylesheet as StyleTag\n\n Object.entries(attributes ?? attrs).forEach(([key, value]) => {\n st += `${key}=\"${value}\" `\n })\n\n st += `>${parseStyle(content)}</style>`\n }\n })\n\n if (loseInlineStyles) {\n // make it come before so it can easily be overridden by widget styles\n st = `<style>${loseInlineStyles}</style>` + st\n }\n\n let sc = ''\n\n Array.from(widgetScripts.values())\n .flat()\n .forEach((script) => {\n scripts.push(script)\n })\n\n unique(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 const { attributes, content = '', ...attrs } = script as ScriptTag\n\n Object.entries(attributes ?? attrs).forEach(([key, value]) => {\n sc += `${key}=\"${value}\" `\n })\n\n sc += `>${content}</script>`\n }\n })\n\n return (\n '<!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\n ? `<link rel=\"manifest\" href=\"${opt.assetsOrigin}assets/${manifest}\">`\n : '') +\n (st ? `<!-- stylesheets -->${st}` : '') +\n '</head><body>' +\n bodyContent +\n (sc ? `<!-- scripts -->${sc}` : '') +\n '</body></html>'\n )\n}\n", "import {\n InputDefinition,\n ObjectLiteral,\n InputDefinitionType,\n} from '../types.ts'\n\nconst dataTypeToInputType = (data: unknown) => {\n switch (typeof data) {\n case 'number':\n return InputDefinitionType.Number\n case 'boolean':\n return InputDefinitionType.Boolean\n case 'object':\n if (Array.isArray(data)) {\n return InputDefinitionType.List\n } else {\n return InputDefinitionType.Group\n }\n default:\n return InputDefinitionType.Text\n }\n}\n\nexport function mergeDataIntoInputDefinition(\n data: unknown,\n def: InputDefinition\n): InputDefinition {\n switch (def.type) {\n case 'group':\n return {\n ...def,\n definitions: Object.entries((data ?? {}) as ObjectLiteral).map(\n ([k, v]) => {\n return mergeDataIntoInputDefinition(\n v,\n ((def.definitions ?? []) as InputDefinition[]).find(\n (item) => item.name === k\n ) ?? {\n name: k,\n type: dataTypeToInputType(v),\n value: v,\n }\n )\n }\n ),\n }\n case 'list':\n return {\n ...def,\n definitions: ((data ?? []) as Array<unknown>).map(\n (item, idx) => {\n return mergeDataIntoInputDefinition(\n item,\n ((def.definitions ?? [])[idx] ?? {\n name: String(idx),\n type: dataTypeToInputType(item),\n value: item,\n }) as InputDefinition\n )\n }\n ),\n }\n default:\n return {\n ...def,\n value: data,\n }\n }\n}\n", "import { parseStyle } from './parse-style.ts'\nimport { parseTemplate } from './parse-template.ts'\nimport { parseTemplateContent, parseWidget } from './parse-widget.ts'\nimport { attributeToString } from './utils/attributes-to-string.ts'\nimport { inputDefinitionsToObject } from './utils/input-definitions-to-object.ts'\nimport { mergeDataIntoInputDefinition } from './utils/merge-data-into-input-definition.ts'\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 inputDefinitionsToObject,\n mergeDataIntoInputDefinition,\n attributeToString,\n parseTemplate,\n parseTemplateContent,\n parseWidget,\n parseStyle,\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "kGAAO,SAASA,EAAuBC,EAAqB,CACxD,OAAOA,EAAI,QAAQ,qBAAsB,OAAO,EAAE,YAAY,CAClE,CAFgBC,EAAAF,EAAA,0BCGhB,IAAMG,EAAmB,IAAI,IAAI,CAC7B,SACA,YACA,aACA,SACA,YACA,SACA,kBACA,OACJ,CAAC,EAED,SAASC,EAAiBC,EAAaC,EAAgB,CACnD,OAAOA,GAAUD,EAAI,KAAK,EAAE,WAAWC,CAAM,CACjD,CAFSC,EAAAH,EAAA,oBAIF,SAASI,EAAWC,EAAcH,EAAS,GAAY,CAC1D,GAAI,OAAOG,GAAU,SAAU,OAAOA,EAEtC,IAAMC,EAAc,IAAI,IAClBC,EAAY,IAAI,IAEtB,SAASC,EACLC,EACAR,EACAS,EACAC,EACF,CACE,OAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQJ,CAAI,EAC1C,GAAI,OAAOI,GAAU,UAAYA,IAAU,KACvC,GAAID,EAAI,WAAW,GAAG,EAAG,CACrB,IAAME,EAAc,MAAM,KAAKf,CAAgB,EAAE,KAC5CgB,GAASH,EAAI,WAAWG,CAAI,CACjC,EACAP,EACIK,EACAZ,EACAW,EACAD,GAA4B,CAACG,CACjC,CACJ,KAAO,CACH,IAAIE,EACEC,EAAWC,EAAuBN,CAAG,EACvCA,EAAI,WAAW,GAAG,EAClBI,EAAUf,EACJW,EAAI,QAAQ,KAAMX,CAAG,EACrBW,EAAI,QAAQ,KAAM,EAAE,EACnBX,EACPe,EAAU,GAAGf,CAAG,IAAIgB,CAAQ,GAE5Bf,GACA,CAACS,GACD,CAACX,EAAiBiB,EAAUf,CAAM,EAElCc,EAAU,GAAGd,CAAM,IAAIe,CAAQ,GAE/BD,EAAUC,EAEdT,EAAKK,EAAOG,EAAQ,KAAK,EAAGN,EAAIC,CAAwB,CAC5D,SACOE,GAAS,KAAM,CACtB,IAAIM,EAAWlB,EAWf,GATIC,GACA,CAACS,GACDV,GACA,CAACD,EAAiBC,EAAKC,CAAM,EAE7BiB,EAAW,GAAGjB,CAAM,IAAID,CAAG,GAAG,KAAK,EAC5B,CAACA,GAAOC,GAAU,CAACS,IAC1BQ,EAAWjB,GAEX,CAACiB,EAAU,SACf,GAAIT,EAAI,CACJ,IAAIU,EAASb,EAAU,IAAIG,CAAE,EACxBU,IACDA,EAAS,IAAI,IACbb,EAAU,IAAIG,EAAIU,CAAM,GAE5B,IAAIC,EAAQD,EAAO,IAAID,CAAQ,EAC1BE,IACDA,EAAQ,IAAI,IACZD,EAAO,IAAID,EAAUE,CAAK,GAE9BA,EAAM,IAAIH,EAAuBN,CAAG,EAAGC,CAAe,CAC1D,KAAO,CACH,IAAIQ,EAAQf,EAAY,IAAIa,CAAQ,EAC/BE,IACDA,EAAQ,IAAI,IACZf,EAAY,IAAIa,EAAUE,CAAK,GAEnCA,EAAM,IAAIH,EAAuBN,CAAG,EAAGC,CAAe,CAC1D,CACJ,CAER,CAzESV,EAAAK,EAAA,QA2ETA,EAAKH,EAAO,GAAI,KAAM,EAAK,EAE3B,IAAMiB,EAAmB,CAAC,EAE1B,OAAW,CAACrB,EAAKoB,CAAK,IAAKf,EACvB,GAAIL,GAAOoB,EAAM,KAAM,CACnB,IAAME,EAAqB,CAAC,EAC5B,OAAW,CAACC,EAAGC,CAAC,IAAKJ,EAAOE,EAAS,KAAK,GAAGC,CAAC,KAAKC,CAAC,GAAG,EACvDH,EAAO,KAAK,GAAGrB,CAAG,MAAMsB,EAAS,KAAK,GAAG,CAAC,IAAI,CAClD,CAGJ,OAAW,CAACb,EAAIU,CAAM,IAAKb,EAAW,CAClC,IAAMmB,EAAkB,CAAC,EACzB,OAAW,CAACzB,EAAKoB,CAAK,IAAKD,EACvB,GAAInB,GAAOoB,EAAM,KAAM,CACnB,IAAME,EAAqB,CAAC,EAC5B,OAAW,CAACC,EAAGC,CAAC,IAAKJ,EAAOE,EAAS,KAAK,GAAGC,CAAC,KAAKC,CAAC,GAAG,EACvDC,EAAM,KAAK,GAAGzB,CAAG,MAAMsB,EAAS,KAAK,GAAG,CAAC,IAAI,CACjD,CAEAG,EAAM,QAAQJ,EAAO,KAAK,GAAGZ,CAAE,MAAMgB,EAAM,KAAK,GAAG,CAAC,IAAI,CAChE,CAEA,OAAOJ,EAAO,KAAK,GAAG,CAC1B,CA1GgBnB,EAAAC,EAAA,cClBT,SAASuB,EAAaC,EAAYC,EAAY,CAEjD,GADID,IAAM,MAAQ,OAAOA,GAAM,UAC3BC,IAAM,MAAQ,OAAOA,GAAM,SAAU,OAAOA,EAEhD,GAAI,MAAM,QAAQD,CAAC,GAAK,MAAM,QAAQC,CAAC,EACnC,OAAO,MAAM,KAAK,IAAI,IAAI,CAAC,GAAGD,EAAG,GAAGC,CAAC,CAAC,CAAC,EAG3C,IAAMC,EAAM,MAAM,QAAQF,CAAC,EAAI,CAAC,GAAGA,CAAC,EAAI,CAAE,GAAGA,CAAE,EAE/C,QAAWG,KAAOF,EACVA,EAAE,eAAeE,CAAG,IAEhB,MAAM,QAAQH,EAAEG,CAAG,CAAC,GAAK,MAAM,QAAQF,EAAEE,CAAG,CAAC,EAE7CD,EAAIC,CAAG,EAAI,MAAM,KAAK,IAAI,IAAI,CAAC,GAAGH,EAAEG,CAAG,EAAG,GAAGF,EAAEE,CAAG,CAAC,CAAC,CAAC,EAGrDD,EAAIC,CAAG,EAAIJ,EAAaG,EAAIC,CAAG,EAAGF,EAAEE,CAAG,CAAC,GAKpD,OAAOD,CACX,CAxBgBE,EAAAL,EAAA,gBCET,IAAMM,EAA+B,CACxC,YAAa,SAAY,KACzB,cAAe,SAAY,KAC3B,KAAM,GACN,aAAc,GAClB,ECLO,SAASC,EAAyBC,EAAqC,CAC1E,OAAOA,EAAiB,OACpB,CAACC,EAAK,CAAE,KAAAC,EAAO,GAAI,MAAAC,EAAO,KAAAC,EAAM,YAAAC,EAAc,CAAC,CAAE,IAAM,CACnD,OAAQD,EAAM,CACV,IAAK,QACDH,EAAIC,CAAI,EAAIH,EAAyBM,CAAW,EAChD,MACJ,IAAK,UACDJ,EAAIC,CAAI,EAAI,CACR,MAAAC,EACA,QAASE,EAAY,IAAKC,GACf,OAAO,OACVP,EAAyB,CAACO,CAAI,CAAC,CACnC,EAAE,CAAC,CACN,CACL,EACA,MACJ,IAAK,OACDL,EAAIC,CAAI,EAAIG,EAAY,IAAKC,GAClB,OAAO,OACVP,EAAyB,CAACO,CAAI,CAAC,CACnC,EAAE,CAAC,CACN,EACD,MACJ,QACIL,EAAIC,CAAI,EAAIC,CACpB,CAEA,OAAOF,CACX,EACA,CAAC,CACL,CACJ,CAhCgBM,EAAAR,EAAA,4BCAT,IAAMS,EAAYC,EAAA,CAACC,EAAgCC,IACrC,OAAOA,GAAO,EAAE,EAC5B,MAAM,GAAG,EACT,OAAO,OAAO,EAEH,OAAO,CAACC,EAAKC,IAAM,CAC/B,GAAI,CAEA,OAAOD,GAAO,OAAOA,GAAQ,SAAWA,EAAIC,CAAC,EAAI,MACrD,MAAY,CACR,OAAO,IACX,CACJ,EAAGH,CAAG,EAZe,aCAlB,IAAMI,EAAqBC,EAAA,CAC9BC,EACAC,IACC,CACD,IAAIC,EAAQ,KAEZ,MAAQA,EAAQ,wBAAwB,KAAKF,CAAK,KAAO,MAAM,CAC3D,GAAM,CAACG,EAAMC,CAAG,EAAIF,EACdG,EAAKC,EAAUL,EAAMG,CAAG,EAE9BJ,EAAQA,EAAM,QAAQG,EAAM,OAAOE,CAAE,CAAC,CAC1C,CAEA,OAAOL,CACX,EAdkC,sBCA3B,IAAMO,EAAoBC,EAAA,CAC7BC,EACAC,EAAO,CAAC,IAED,OAAO,QAAQD,CAAU,EAC3B,IAAI,CAAC,CAACE,EAAMC,CAAK,KACV,OAAOA,GAAU,WACjBA,EAAQC,EAAmBD,EAAOF,CAAI,GAGnC,GAAGC,CAAI,KAAKC,CAAK,IAC3B,EACA,KAAK,GAAG,EAZgB,qBCYjC,IAAME,EAAmC,IAAI,IAE7C,eAAsBC,EAClBC,EACAC,EAAO,CAAC,EACRC,EACAC,EACAC,EAAoBC,EACtB,CACE,GAAI,CAAE,KAAAC,EAAM,SAAAC,EAAU,GAAGC,CAAW,EAAIR,EAMxC,GAJAA,EAAK,gBAAgB,EACjBA,EAAK,gBAAgB,GAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,EAAE,EACtE,CAAE,KAAAM,EAAM,SAAAC,EAAU,GAAGC,CAAW,EAAIR,EAElCQ,EAAW,GAAI,CACf,IAAMC,EACFX,EAAY,IAAIU,EAAW,EAAE,GAC5B,MAAMJ,EAAI,cAAcI,EAAW,EAAE,EAE1C,GAAIC,EAAQ,CACR,IAAMC,EAAQ,CACV,GAAGC,EAAyBF,GAAQ,QAAU,CAAC,CAAC,EAChD,GAAGD,EACH,IAAK,CACD,GAAGP,EACH,aAAcG,EAAI,aAClB,KAAMA,EAAI,IACd,CACJ,EAEI,OAAOK,EAAO,QAAW,WACzBF,EAAW,CAACE,EAAO,OAAOC,CAAK,CAAC,EAEhCH,EAAWE,EAAO,QAAU,CAACA,EAAO,OAAO,EAAI,CAAC,EAGpD,IAAMG,EAAS,CAAC,EACVC,EAAKJ,EAAO,IAAMD,EAAW,GAEnC,GAAIC,EAAO,MAAO,CACd,IAAMK,EACF,OAAOL,EAAO,OAAU,WAClBA,EAAO,MAAMC,CAAK,EAClBD,EAAO,MAEjBG,EAAO,KAAK,CACRC,EACAE,EAAWD,EAAcL,EAAO,aAAe,EAAE,CACrD,CAAC,CACL,CAEAA,EAAO,aAAa,QAASO,GAAe,CACxCJ,EAAO,KAAKI,CAAU,CAC1B,CAAC,EAEGJ,EAAO,OAAS,GAChBV,EAAa,IAAIW,EAAID,CAAM,EAG3BH,EAAO,SACPN,EAAc,IAAIU,EAAIJ,EAAO,OAAO,EAGxCX,EAAY,IAAIU,EAAW,GAAIC,CAAM,CACzC,CACJ,CAEA,OAAIL,EAAI,KACGG,EAAS,KAAK,EAAE,EAIvB,IAAID,CAAI,QAAQE,EAAW,EAAE,qBAAqBA,EAAW,gBAAgB,CAAC,KAC1E,MAAMS,EAAqBV,EAAUN,EAAMC,EAAcC,EAAeC,CAAG,CAAC,KAAKE,CAAI,GAEjG,CA1EsBY,EAAAnB,EAAA,eA4EtB,eAAsBkB,EAClBE,EACAlB,EAAO,CAAC,EACRC,EACAC,EACAC,EAAoBC,EACL,CACf,OAAKc,GAKD,MAAM,QAAQ,IACVA,EAAQ,IAAI,MAAOnB,GAAS,CACxB,GAAI,OAAOA,GAAS,SAChB,OAAOoB,EAAmBpB,EAAMC,CAAI,EAGxC,GAAM,CAAE,KAAAK,EAAM,SAAAC,EAAU,GAAGC,CAAW,EAAIR,EAE1C,GAAIM,IAAS,SACT,OAAOP,EACHC,EACAC,EACAC,EACAC,EACAC,CACJ,EAGJ,IAAMiB,EAAQC,EAAkBd,EAAYP,CAAI,EAEhD,MACI,IAAIK,CAAI,IACPe,EAAQ,IAAIA,CAAK,GAAK,IACvB,IAAI,MAAMJ,EAAqBV,EAAUN,EAAMC,EAAcC,EAAeC,CAAG,CAAC,KAAKE,CAAI,GAEjG,CAAC,CACL,GACF,KAAK,EAAE,EA/BE,EAgCf,CAxCsBY,EAAAD,EAAA,wBC9EtB,IAAMM,EAAmC,IAAI,IAEvCC,EAASC,EAACC,GAAoB,MAAM,KAAK,IAAI,IAAIA,CAAI,CAAC,EAA7C,UAEFC,EAAgBF,EAAA,MACzBG,EACAC,EAAoBC,IACnB,CAID,GAHAD,EAAME,EAAaD,EAAgBD,CAAG,EACtCN,EAAU,IAAIK,EAAK,GAAIA,CAAI,EAEvBA,EAAK,QAAS,CACd,IAAMI,EACFT,EAAU,IAAIK,EAAK,OAAO,GACzB,MAAMC,EAAI,gBAAgBD,EAAK,OAAO,EAE3C,GAAI,CAACI,EACD,MAAM,IAAI,MAAM,aAAaJ,EAAK,OAAO,aAAa,EAG1DL,EAAU,IAAIK,EAAK,QAASI,CAAI,EAChCJ,EAAOG,EAAaC,EAAMJ,CAAI,CAClC,CAEA,GAAM,CACF,SAAAK,EAAW,CAAC,EACZ,QAAAC,EAAU,CAAC,EACX,YAAAC,EAAc,CAAC,EACf,MAAAC,EAAQ,CAAC,EACT,MAAAC,EAAQ,CAAC,EACT,SAAAC,EAAW,CAAC,EACZ,QAAAC,EAAU,GACV,SAAAC,EACA,GAAGC,CACP,EAAIb,GAAQ,CAAC,EAEPc,EAAkD,IAAI,IACtDC,EAA+C,IAAI,IAEnDC,EACF,OAAOL,GAAY,SACbA,EACA,MAAMM,EACFN,EACAE,EACAC,EACAC,EACAd,CACJ,EAELI,EAAS,UACVA,EAAS,QAAa,SAGrBA,EAAS,WACVA,EAAS,SAAc,yCAG3B,IAAMa,EAAQ,OAAO,QAAQb,CAAQ,EAChC,IAAI,CAAC,CAACc,EAAKC,CAAK,IACTD,EAAI,WAAW,WAAW,EACnB,mBAAmBA,EAAI,QAAQ,YAAa,EAAE,CAAC,cAAcC,CAAK,MAGzED,IAAQ,4BACRC,EAAQ,GAAGnB,EAAI,YAAY,GAAGmB,CAAK,IAGhC,eAAeD,CAAG,cAAcC,CAAK,KAC/C,EACA,KAAK,EAAE,EAERC,EAAK,GAETb,EAAM,QAASc,GAAS,CACpB,IAAIC,EAAI,SAER,OAAO,QAAQD,CAAI,EAAE,QAAQ,CAAC,CAACH,EAAKC,CAAK,IAAM,CAC3CG,GAAK,GAAGJ,CAAG,KAAKC,CAAK,IACzB,CAAC,EAEDC,GAAME,EAAI,IACd,CAAC,EAED,IAAIC,EAAK,GAETd,EAAS,QAASY,GAAS,CACvB,IAAIC,EAAI,SAER,OAAO,QAAQD,CAAI,EAAE,QAAQ,CAAC,CAACH,EAAKC,CAAK,IAAM,CAC3CG,GAAK,GAAGJ,CAAG,KAAKA,IAAQ,OAAS,GAAGlB,EAAI,YAAY,mBAAqB,EAAE,GAAGmB,CAAK,IACvF,CAAC,EAEDI,GAAMD,EAAI,IACd,CAAC,EAED,IAAIE,EAAK,GAEThB,EAAM,QAASiB,GAAS,CACpBD,GAAM,6BAA6BxB,EAAI,YAAY,gBAAgByB,CAAI,0BAC3E,CAAC,EAED,IAAIC,EAAK,GACLC,EAAmB,GAEvB,MAAM,KAAKd,EAAa,OAAO,CAAC,EAC3B,KAAK,EACL,QAASe,GAAU,CAChBtB,EAAY,KAAKsB,CAAK,CAC1B,CAAC,EAELjC,EAAOW,CAAW,EAAE,QAASuB,GAAe,CACxC,GAAI,OAAOA,GAAe,SAClBA,EAAW,WAAW,MAAM,EAC5BH,GAAM,gCAAgCG,CAAU,MACzCA,EAAW,SAAS,MAAM,EACjCH,GAAM,gCAAgC1B,EAAI,YAAY,eAAe6B,CAAU,KAE/EF,GAAoBE,UAEjB,MAAM,QAAQA,CAAU,EAAG,CAClC,GAAM,CAACC,EAAIF,CAAK,EAAIC,EACpBH,GAAM,cAAcI,CAAE,WAAWC,EAAWH,CAAK,CAAC,UACtD,KAAO,CACHF,GAAM,SAEN,GAAM,CACF,WAAAM,EACA,QAAAtB,EAAU,GACV,GAAGuB,CACP,EAAIJ,EAEJ,OAAO,QAAQG,GAAcC,CAAK,EAAE,QAAQ,CAAC,CAACf,EAAKC,CAAK,IAAM,CAC1DO,GAAM,GAAGR,CAAG,KAAKC,CAAK,IAC1B,CAAC,EAEDO,GAAM,IAAIK,EAAWrB,CAAO,CAAC,UACjC,CACJ,CAAC,EAEGiB,IAEAD,EAAK,UAAUC,CAAgB,WAAaD,GAGhD,IAAIQ,EAAK,GAET,aAAM,KAAKpB,EAAc,OAAO,CAAC,EAC5B,KAAK,EACL,QAASqB,GAAW,CACjB9B,EAAQ,KAAK8B,CAAM,CACvB,CAAC,EAELxC,EAAOU,CAAO,EAAE,QAAS8B,GAAW,CAChC,GAAI,OAAOA,GAAW,SACdA,EAAO,WAAW,MAAM,EACxBD,GAAM,gBAAgBC,CAAM,eACrBA,EAAO,SAAS,KAAK,EAC5BD,GAAM,gBAAgBlC,EAAI,YAAY,WAAWmC,CAAM,eAEvDD,GAAM,WAAWC,CAAM,iBAExB,CACHD,GAAM,WAEN,GAAM,CAAE,WAAAF,EAAY,QAAAtB,EAAU,GAAI,GAAGuB,CAAM,EAAIE,EAE/C,OAAO,QAAQH,GAAcC,CAAK,EAAE,QAAQ,CAAC,CAACf,EAAKC,CAAK,IAAM,CAC1De,GAAM,GAAGhB,CAAG,KAAKC,CAAK,IAC1B,CAAC,EAEDe,GAAM,IAAIxB,CAAO,YACrB,CACJ,CAAC,EAGG,8BACeE,EAAK,MAAQ,IAAI,kBAEtBA,EAAK,KAAK,qJAIkBA,EAAK,KAAK,yFAEJA,EAAK,WAAW,wCACtBA,EAAK,KAAK,sCACZA,EAAK,MAAM,4CACLA,EAAK,KAAK,MACnDK,EAAQ,iBAAiBA,CAAK,GAAK,KACnCM,EAAK,oBAAoBA,CAAE,GAAK,KAChCC,EAAK,iBAAiBA,CAAE,GAAK,KAC7BJ,EAAK,iBAAiBA,CAAE,GAAK,KAC7BT,EACK,8BAA8BX,EAAI,YAAY,UAAUW,CAAQ,KAChE,KACLe,EAAK,uBAAuBA,CAAE,GAAK,IACpC,gBACAX,GACCmB,EAAK,mBAAmBA,CAAE,GAAK,IAChC,gBAER,EAtM6B,iBCZ7B,IAAME,EAAsBC,EAACC,GAAkB,CAC3C,OAAQ,OAAOA,EAAM,CACjB,IAAK,SACD,eACJ,IAAK,UACD,gBACJ,IAAK,SACD,OAAI,MAAM,QAAQA,CAAI,iBAK1B,QACI,YACR,CACJ,EAf4B,uBAiBrB,SAASC,EACZD,EACAE,EACe,CACf,OAAQA,EAAI,KAAM,CACd,IAAK,QACD,MAAO,CACH,GAAGA,EACH,YAAa,OAAO,QAASF,GAAQ,CAAC,CAAmB,EAAE,IACvD,CAAC,CAACG,EAAGC,CAAC,IACKH,EACHG,GACEF,EAAI,aAAe,CAAC,GAAyB,KAC1CG,GAASA,EAAK,OAASF,CAC5B,GAAK,CACD,KAAMA,EACN,KAAML,EAAoBM,CAAC,EAC3B,MAAOA,CACX,CACJ,CAER,CACJ,EACJ,IAAK,OACD,MAAO,CACH,GAAGF,EACH,aAAeF,GAAQ,CAAC,GAAsB,IAC1C,CAACK,EAAMC,IACIL,EACHI,GACEH,EAAI,aAAe,CAAC,GAAGI,CAAG,GAAK,CAC7B,KAAM,OAAOA,CAAG,EAChB,KAAMR,EAAoBO,CAAI,EAC9B,MAAOA,CACX,CACJ,CAER,CACJ,EACJ,QACI,MAAO,CACH,GAAGH,EACH,MAAOF,CACX,CACR,CACJ,CA7CgBD,EAAAE,EAAA,gCCdZ,SAGA,OAAO,IAAM,CAGT,GAAI,OAAO,KAAO,CAAC,EACnB,aAAc,CACV,yBAAAM,EACA,6BAAAC,EACA,kBAAAC,EACA,cAAAC,EACA,qBAAAC,EACA,YAAAC,EACA,WAAAC,CACJ,CACJ",
|
|
6
|
+
"names": ["turnCamelToKebabCasing", "str", "__name", "prefixingAtRules", "startsWithPrefix", "sel", "prefix", "__name", "parseStyle", "style", "selectorMap", "atRuleMap", "walk", "node", "at", "insideNonPrefixingAtRule", "key", "value", "isPrefixing", "rule", "nextSel", "kebabKey", "turnCamelToKebabCasing", "finalSel", "selMap", "props", "blocks", "propStrs", "k", "v", "inner", "mergeObjects", "a", "b", "obj", "key", "__name", "defaultOptions", "inputDefinitionsToObject", "inputDefinitions", "acc", "name", "value", "type", "definitions", "item", "__name", "deepValue", "__name", "obj", "key", "acc", "k", "replaceStringValue", "__name", "value", "data", "match", "full", "key", "dv", "deepValue", "attributeToString", "__name", "attributes", "data", "name", "value", "replaceStringValue", "widgetCache", "parseWidget", "node", "data", "widgetStyles", "widgetScripts", "opt", "defaultOptions", "name", "children", "attributes", "widget", "props", "inputDefinitionsToObject", "styles", "ID", "styleContent", "parseStyle", "stylesheet", "parseTemplateContent", "__name", "content", "replaceStringValue", "attrs", "attributeToString", "tempCache", "unique", "__name", "list", "parseTemplate", "temp", "opt", "defaultOptions", "mergeObjects", "base", "metadata", "scripts", "stylesheets", "links", "fonts", "favicons", "content", "manifest", "data", "widgetStyles", "widgetScripts", "bodyContent", "parseTemplateContent", "metas", "key", "value", "ls", "link", "l", "fi", "ft", "font", "st", "loseInlineStyles", "style", "stylesheet", "id", "parseStyle", "attributes", "attrs", "sc", "script", "dataTypeToInputType", "__name", "data", "mergeDataIntoInputDefinition", "def", "k", "v", "item", "idx", "inputDefinitionsToObject", "mergeDataIntoInputDefinition", "attributeToString", "parseTemplate", "parseTemplateContent", "parseWidget", "parseStyle"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var x=Object.defineProperty;var m=(a,r)=>x(a,"name",{value:r,configurable:!0});import t from"path";import y from"fs";import O from"esbuild";import{mergeObjects as k}from"./utils/merge-objects.js";import{parseTemplate as B}from"./parse-template.js";import N from"clean-css";import{TemplateType as P}from"./types.js";import{minify as J}from"html-minifier";const $=new N,{writeFile:g,readFile:v,readdir:A,mkdir:c,cp:R,rm:q}=y.promises,V=m(async({publicDir:a,srcDir:r,prod:T=!0})=>{const p=t.resolve(a,"scripts"),f=t.resolve(a,"stylesheets"),S=t.resolve(a,"assets");y.existsSync(a)&&await q(a,{recursive:!0,force:!0}),await c(a,{recursive:!0}),await c(p,{recursive:!0}),await c(f,{recursive:!0}),await R(t.resolve(r,"assets"),S,{recursive:!0});const j=await A(t.resolve(r,"templates")),u=await Promise.all(j.filter(e=>e.endsWith(".json")).map(async e=>{const i=t.basename(e);return{dir:t.dirname(e),name:i.replace(".json",""),content:JSON.parse(await v(t.resolve(r,"templates",e),"utf8"))}})),d=u.reduce((e,i)=>({...e,[i.name]:i}),{}),W=u.filter(({content:e})=>e.type===P.Page),h=m(async e=>{typeof e=="string"&&e.endsWith(".js")&&!e.startsWith("http")&&await O.build({entryPoints:[t.resolve(r,"scripts",e)],minify:!0,outfile:t.join(p,e)})},"handleScript"),w=m(async e=>{if(typeof e=="string"&&e.endsWith(".css")&&!e.startsWith("http")){const i=await v(t.resolve(r,"stylesheets",e),"utf8");await g(t.join(f,e),$.minify(i).styles,"utf-8")}},"handleStylesheet");for(const{name:e,dir:i,content:C}of W){let n=C;if(n.extends){const s=d[n.extends];n=k(s.content,n)}await c(t.join(a,i),{recursive:!0});for(let s=0;s<(n.scripts?.length??0);s++)await h(n.scripts[s]);for(let s=0;s<(n.stylesheets?.length??0);s++)await w(n.stylesheets[s]);const F=await B(n,{prod:T,fetchTemplate:s=>d[s].content,fetchWidget:async s=>{const l=(await import(t.resolve(r,"widgets",`${s}.js`))).default;for(let o=0;o<(l.scripts?.length??0);o++)await h(l.scripts[o]);for(let o=0;o<(l.stylesheets?.length??0);o++)await w(l.stylesheets[o]);return l}}),b=J(F,{collapseWhitespace:!0,removeComments:!0,minifyCSS:!0,minifyJS:!0});await g(t.join(a,i,`${e}.html`),b)}},"buildTemplates");export{V as buildTemplates};
|
|
@@ -1,25 +1 @@
|
|
|
1
|
-
var
|
|
2
|
-
<html lang="${a.lang??"en"}">
|
|
3
|
-
<head>
|
|
4
|
-
<title>${a.title}</title>
|
|
5
|
-
<meta charset="UTF-8">
|
|
6
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
-
<!-- og -->
|
|
8
|
-
<meta property="og:title" content="${a.title}">
|
|
9
|
-
<meta property="og:type" content="website">
|
|
10
|
-
<meta property="og:description" content="${a.description}">
|
|
11
|
-
<meta property="og:image" content="${a.image}">
|
|
12
|
-
<meta property="og:url" content="${a.domain}">
|
|
13
|
-
<meta property="og:site_name" content="${a.title}">
|
|
14
|
-
${O?`<!-- metas -->${O}`:""}
|
|
15
|
-
${f?`<!-- favicons -->${f}`:""}
|
|
16
|
-
${$?`<!-- fonts -->${$}`:""}
|
|
17
|
-
${p?`<!-- links -->${p}`:""}
|
|
18
|
-
${g?`<link rel="manifest" href="${i.assetsOrigin}assets/${g}">`:""}
|
|
19
|
-
${r?`<!-- stylesheets -->${r}`:""}
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
${W}
|
|
23
|
-
${o?"<!-- scripts -->"+o:""}
|
|
24
|
-
</body>
|
|
25
|
-
</html>`.replace(/\s{2,}/g," ").replace(/[\t\n]+/g,"")},"parseTemplate");export{D as parseTemplate};
|
|
1
|
+
var F=Object.defineProperty;var y=(s,r)=>F(s,"name",{value:r,configurable:!0});import{mergeObjects as j}from"./utils/merge-objects.js";import{defaultOptions as v}from"./default-parse-options.js";import{parseTemplateContent as I}from"./parse-widget.js";import{parseStyle as x}from"./parse-style.js";const T=new Map,M=y(s=>Array.from(new Set(s)),"unique"),Q=y(async(s,r=v)=>{if(r=j(v,r),T.set(s.id,s),s.extends){const t=T.get(s.extends)||await r.fetchTemplate?.(s.extends);if(!t)throw new Error(`Template "${s.extends}" not found`);T.set(s.extends,t),s=j(t,s)}const{metadata:c={},scripts:w=[],stylesheets:O=[],links:k=[],fonts:A=[],favicons:C=[],content:p="",manifest:b,...n}=s??{},S=new Map,u=new Map,W=typeof p=="string"?p:await I(p,n,S,u,r);c.charset||(c.charset="UTF-8"),c.viewport||(c.viewport="width=device-width, initial-scale=1.0");const E=Object.entries(c).map(([t,e])=>t.startsWith("property:")?`<meta property="${t.replace("property:","")}" content="${e}">`:(t==="msapplication-TileImage"&&(e=`${r.assetsOrigin}${e}`),`<meta name="${t}" content="${e}">`)).join("");let f="";k.forEach(t=>{let e="<link ";Object.entries(t).forEach(([a,l])=>{e+=`${a}="${l}" `}),f+=e+"/>"});let m="";C.forEach(t=>{let e="<link ";Object.entries(t).forEach(([a,l])=>{e+=`${a}="${a==="href"?`${r.assetsOrigin}assets/favicons/`:""}${l}" `}),m+=e+"/>"});let $="";A.forEach(t=>{$+=`<link rel="preload" href="${r.assetsOrigin}assets/fonts/${t}" as="font" crossorigin>`});let i="",h="";Array.from(S.values()).flat().forEach(t=>{O.push(t)}),M(O).forEach(t=>{if(typeof t=="string")t.startsWith("http")?i+=`<link rel="stylesheet" href="${t}" >`:t.endsWith(".css")?i+=`<link rel="stylesheet" href="${r.assetsOrigin}stylesheets/${t}">`:h+=t;else if(Array.isArray(t)){const[e,a]=t;i+=`<style id="${e}-style">${x(a)}</style>`}else{i+="<style";const{attributes:e,content:a="",...l}=t;Object.entries(e??l).forEach(([g,d])=>{i+=`${g}="${d}" `}),i+=`>${x(a)}</style>`}}),h&&(i=`<style>${h}</style>`+i);let o="";return Array.from(u.values()).flat().forEach(t=>{w.push(t)}),M(w).forEach(t=>{if(typeof t=="string")t.startsWith("http")?o+=`<script src="${t}"></script>`:t.endsWith(".js")?o+=`<script src="${r.assetsOrigin}scripts/${t}"></script>`:o+=`<script>${t}</script>`;else{o+="<script ";const{attributes:e,content:a="",...l}=t;Object.entries(e??l).forEach(([g,d])=>{o+=`${g}="${d}" `}),o+=`>${a}</script>`}}),`<!doctype html><html lang="${n.lang??"en"}"><head><title>${n.title}</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- og --><meta property="og:title" content="${n.title}"><meta property="og:type" content="website"><meta property="og:description" content="${n.description}"><meta property="og:image" content="${n.image}"><meta property="og:url" content="${n.domain}"><meta property="og:site_name" content="${n.title}">`+(E?`<!-- metas -->${E}`:"")+(m?`<!-- favicons -->${m}`:"")+($?`<!-- fonts -->${$}`:"")+(f?`<!-- links -->${f}`:"")+(b?`<link rel="manifest" href="${r.assetsOrigin}assets/${b}">`:"")+(i?`<!-- stylesheets -->${i}`:"")+"</head><body>"+W+(o?`<!-- scripts -->${o}`:"")+"</body></html>"},"parseTemplate");export{Q as parseTemplate};
|
package/dist/esm/parse-widget.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var T=Object.defineProperty;var d=(r,i)=>T(r,"name",{value:i,configurable:!0});import{defaultOptions as u}from"./default-parse-options.js";import{inputDefinitionsToObject as h}from"./utils/input-definitions-to-object.js";import{parseStyle as $}from"./parse-style.js";import{attributeToString as C}from"./utils/attributes-to-string.js";import{replaceStringValue as M}from"./utils/replace-string-value.js";const g=new Map;async function O(r,i={},o,p,s=u){let{name:a,children:n,...e}=r;if(r["data-render-id"]=r["data-render-id"]||Math.random().toString(36).substring(2,15),{name:a,children:n,...e}=r,e.id){const t=g.get(e.id)||await s.fetchWidget?.(e.id);if(t){const l={...h(t?.inputs??[]),...e,env:{...i,assetsOrigin:s.assetsOrigin,prod:s.prod}};typeof t.render=="function"?n=[t.render(l)]:n=t.content?[t.content]:[];const m=[],c=t.id||e.id;if(t.style){const f=typeof t.style=="function"?t.style(l):t.style;m.push([c,$(f,t.cssSelector??"")])}t.stylesheets?.forEach(f=>{m.push(f)}),m.length>0&&o.set(c,m),t.scripts&&p.set(c,t.scripts),g.set(e.id,t)}}return s.prod?n.join(""):`<${a} id="${e.id}" data-render-id="${e["data-render-id"]}">${await y(n,i,o,p,s)}</${a}>`}d(O,"parseWidget");async function y(r,i={},o,p,s=u){return r?(await Promise.all(r.map(async a=>{if(typeof a=="string")return M(a,i);const{name:n,children:e,...t}=a;if(n==="widget")return O(a,i,o,p,s);const l=C(t,i);return`<${n}`+(l?` ${l}`:"")+`>${await y(e,i,o,p,s)}</${n}>`}))).join(""):""}d(y,"parseTemplateContent");export{y as parseTemplateContent,O as parseWidget};
|
package/dist/esm/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var r=(e=>(e.Text="text",e.Html="html",e.Markdown="markdown",e.Number="number",e.Code="code",e.Image="image",e.Video="video",e.Audio="audio",e.File="file",e.Font="font",e.Pdf="pdf",e.Icon="icon",e.Embed="embed",e.Favicon="favicon",e.Email="email",e.Password="password",e.Url="url",e.Tel="tel",e.Color="color",e.Date="date",e.DateTimeLocal="datetime-local",e.Month="month",e.Time="time",e.Week="week",e.Textarea="textarea",e.Boolean="boolean",e.Options="options",e.Group="group",e.List="list",e))(r||{}),s=(t=>(t.Base="base",t.Page="page",t))(s||{});export{r as InputDefinitionType,s as TemplateType};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { parseOptions, TemplateContentNode,
|
|
2
|
-
export declare function parseWidget(node: TemplateContentNode, data: {} | undefined, widgetStyles: Map<string,
|
|
3
|
-
export declare function parseTemplateContent(content: TemplateContent, data: {} | undefined, widgetStyles: Map<string,
|
|
1
|
+
import { parseOptions, TemplateContentNode, TemplateContent, TemplateStylesheet, TemplateScript } from './types.js';
|
|
2
|
+
export declare function parseWidget(node: TemplateContentNode, data: {} | undefined, widgetStyles: Map<string, TemplateStylesheet[]>, widgetScripts: Map<string, TemplateScript[]>, opt?: parseOptions): Promise<string>;
|
|
3
|
+
export declare function parseTemplateContent(content: TemplateContent, data: {} | undefined, widgetStyles: Map<string, TemplateStylesheet[]>, widgetScripts: Map<string, TemplateScript[]>, opt?: parseOptions): Promise<string>;
|
package/dist/types/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export interface ObjectLiteral {
|
|
2
2
|
[key: string]: string | number | boolean | ObjectLiteral | ObjectLiteral[] | unknown;
|
|
3
3
|
}
|
|
4
|
-
interface StyleObject {
|
|
4
|
+
export interface StyleObject {
|
|
5
5
|
[key: string]: string | number | StyleObject;
|
|
6
6
|
}
|
|
7
7
|
export type Style = string | StyleObject;
|
|
@@ -55,6 +55,16 @@ export declare enum TemplateType {
|
|
|
55
55
|
Base = "base",
|
|
56
56
|
Page = "page"
|
|
57
57
|
}
|
|
58
|
+
export interface StyleTag extends ObjectLiteral {
|
|
59
|
+
attributes: Record<string, string>;
|
|
60
|
+
content?: Style;
|
|
61
|
+
}
|
|
62
|
+
export interface ScriptTag extends ObjectLiteral {
|
|
63
|
+
attributes: Record<string, string>;
|
|
64
|
+
content?: string;
|
|
65
|
+
}
|
|
66
|
+
export type TemplateStylesheet = string | string[] | StyleTag;
|
|
67
|
+
export type TemplateScript = string | ScriptTag;
|
|
58
68
|
export interface Template {
|
|
59
69
|
id: string;
|
|
60
70
|
name: string;
|
|
@@ -67,12 +77,8 @@ export interface Template {
|
|
|
67
77
|
description: string;
|
|
68
78
|
image?: string;
|
|
69
79
|
metadata?: Record<string, string>;
|
|
70
|
-
scripts?:
|
|
71
|
-
stylesheets?: Array<
|
|
72
|
-
[key: string]: string;
|
|
73
|
-
} & {
|
|
74
|
-
attributes: Record<string, string>;
|
|
75
|
-
})>;
|
|
80
|
+
scripts?: TemplateScript[];
|
|
81
|
+
stylesheets?: Array<TemplateStylesheet>;
|
|
76
82
|
links?: Record<string, string>[];
|
|
77
83
|
fonts?: string[];
|
|
78
84
|
favicons?: Record<string, string>[];
|
|
@@ -83,10 +89,12 @@ export interface Widget {
|
|
|
83
89
|
id: string;
|
|
84
90
|
name: string;
|
|
85
91
|
cssSelector?: string;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
92
|
+
scripts?: TemplateScript[];
|
|
93
|
+
style?: Style | ((props?: Record<string, unknown>) => Style);
|
|
94
|
+
stylesheets?: Array<TemplateStylesheet>;
|
|
95
|
+
inputs?: InputDefinition<unknown>[];
|
|
96
|
+
render?: <P>(props: P) => string;
|
|
97
|
+
content?: string;
|
|
90
98
|
}
|
|
91
99
|
export interface parseOptions {
|
|
92
100
|
prod?: boolean;
|
|
@@ -94,4 +102,3 @@ export interface parseOptions {
|
|
|
94
102
|
fetchWidget?: (id: string) => Widget | null | Promise<Widget | null>;
|
|
95
103
|
fetchTemplate?: (id: string) => Template | null | Promise<Template | null>;
|
|
96
104
|
}
|
|
97
|
-
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beforesemicolon/site-builder",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "Site builder based on JSON files",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=18.16.0"
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"@beforesemicolon/builder": "^1.6.3",
|
|
46
46
|
"@gjsify/esbuild-plugin-transform-ext": "0.0.4",
|
|
47
47
|
"@types/clean-css": "^4.2.11",
|
|
48
|
+
"@types/html-minifier": "^4.0.5",
|
|
48
49
|
"@types/jest": "^29.5.11",
|
|
49
50
|
"@types/jsdom": "^21.1.6",
|
|
50
51
|
"@types/jsdom-global": "^3.0.7",
|
|
@@ -78,6 +79,7 @@
|
|
|
78
79
|
},
|
|
79
80
|
"dependencies": {
|
|
80
81
|
"clean-css": "^5.3.3",
|
|
81
|
-
"esbuild": "^0.25.0"
|
|
82
|
+
"esbuild": "^0.25.0",
|
|
83
|
+
"html-minifier": "^4.0.0"
|
|
82
84
|
}
|
|
83
85
|
}
|