@beforesemicolon/builder 1.8.11 → 1.8.13

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.
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 60" role="img" aria-label="Fading Citrus">
2
+ <g fill="none" fill-rule="evenodd">
3
+ <circle cx="30" cy="30" r="23" fill="#f97316" />
4
+ <path d="M30 7a23 23 0 0 1 23 23H30z" fill="#22d3ee" opacity=".9" />
5
+ <path d="M30 7a23 23 0 0 0 0 46 23 23 0 0 1 0-46z" fill="#fff7ed" opacity=".35" />
6
+ <text x="68" y="37" fill="#f8fafc" font-family="Inter, Arial, sans-serif" font-size="22" font-weight="700">Docs</text>
7
+ </g>
8
+ </svg>
@@ -1,5 +1,3 @@
1
- import logo from './_logo.js'
2
-
3
1
  const social = [
4
2
  {
5
3
  link: 'https://medium.com/before-semicolon',
@@ -33,11 +31,15 @@ const social = [
33
31
  },
34
32
  ]
35
33
 
36
- export default () => `
34
+ export default (props = {}) => {
35
+ const siteName =
36
+ props.projectMeta?.name || props.name || props.title || 'Documentation'
37
+
38
+ return `
37
39
  <footer class="site-footer">
38
40
  <div class="footer-inner wrapper">
39
41
  <div class="footer-brand">
40
- ${logo({ fill: 'currentColor', width: '100px' })}
42
+ <img class="site-logo" src="/assets/logo.svg" alt="${siteName} logo" width="100" height="30" />
41
43
  <p>A reactive HTML templating system for building dynamic UIs with pure JavaScript. No build step. No virtual DOM.</p>
42
44
  </div>
43
45
  <ul class="footer-links">
@@ -70,3 +72,4 @@ export default () => `
70
72
  </div>
71
73
  </footer>
72
74
  `
75
+ }
@@ -1,14 +1,14 @@
1
- import logo from './_logo.js'
2
-
3
1
  export default (props = {}) => {
4
2
  const isDocs = props.path?.startsWith('/documentation')
3
+ const siteName =
4
+ props.projectMeta?.name || props.name || props.title || 'Documentation'
5
5
 
6
6
  return `
7
7
  <header class="site-header">
8
8
  <div class="header-inner wrapper">
9
9
  <h1>
10
- <a href="/" aria-label="Markup home">
11
- ${logo({ fill: 'currentColor', width: '90px' })}
10
+ <a href="/" aria-label="${siteName} home">
11
+ <img class="site-logo" src="/assets/logo.svg" alt="${siteName} logo" width="90" height="27" />
12
12
  </a>
13
13
  </h1>
14
14
  ${
@@ -86,7 +86,7 @@ export default (props) => {
86
86
  </aside>
87
87
  </main>
88
88
 
89
- ${footer()}
89
+ ${footer(props)}
90
90
  ${props.scripts?.join('') || ''}
91
91
 
92
92
  </body>
@@ -18,7 +18,7 @@ export default (props) => {
18
18
  <body>
19
19
  ${header(props)}
20
20
  ${props.content}
21
- ${footer()}
21
+ ${footer(props)}
22
22
  ${props.scripts?.join('') || ''}
23
23
  </body>
24
24
  </html>
@@ -341,7 +341,7 @@ footer .footer-brand {
341
341
  min-width: 280px;
342
342
  }
343
343
 
344
- footer .footer-brand svg {
344
+ footer .footer-brand .site-logo {
345
345
  margin-bottom: 16px;
346
346
  display: block;
347
347
  }
@@ -663,8 +663,10 @@ header.site-header .header-inner {
663
663
  justify-content: space-between;
664
664
  }
665
665
 
666
- header.site-header h1 a svg {
666
+ header.site-header h1 a .site-logo {
667
667
  height: 28px;
668
+ width: auto;
669
+ display: block;
668
670
  }
669
671
 
670
672
  header.site-header nav a {
@@ -704,10 +706,10 @@ header.site-header nav a.docs-github-link {
704
706
  gap: 40px;
705
707
  }
706
708
 
707
- .site-footer .footer-brand svg {
709
+ .site-footer .footer-brand .site-logo {
708
710
  height: 28px;
709
711
  width: auto;
710
- color: var(--foreground);
712
+ display: block;
711
713
  }
712
714
 
713
715
  .site-footer .footer-brand p {
@@ -1 +1 @@
1
- "use strict";var i=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var g=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of a(t))!p.call(e,r)&&r!==s&&i(e,r,{get:()=>t[r],enumerable:!(n=o(t,r))||n.enumerable});return e};var c=e=>g(i({},"__esModule",{value:!0}),e);var m={};module.exports=c(m);
1
+ "use strict";var i=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var g=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of a(t))!p.call(e,r)&&r!==o&&i(e,r,{get:()=>t[r],enumerable:!(n=s(t,r))||n.enumerable});return e};var c=e=>g(i({},"__esModule",{value:!0}),e);var m={};module.exports=c(m);
@@ -1,48 +1,48 @@
1
- var oe=Object.defineProperty;var c=(e,t)=>oe(e,"name",{value:t,configurable:!0});import{Marked as ae}from"marked";import{cp as F,mkdir as v,readdir as ne,readFile as M,writeFile as b}from"fs/promises";import o from"path";import ie from"front-matter";import le from"isomorphic-dompurify";import{markedHighlight as ce}from"marked-highlight";import Q from"highlight.js";import me from"./templates/default.template.js";import ue from"./renderer/index.js";import{createMarkdownLayoutExtension as pe}from"./markdown-layout/index.js";import fe from"clean-css";import de from"html-minifier";import*as X from"@putout/minify";import{fileURLToPath as he,pathToFileURL as A}from"url";import p from"fs";let K;const V=new fe({inline:["none"]}),R=new Map;R.set("default",me);let W;const ge=c((e,t)=>{if(!(!e&&!t))return{light:{...e?.light,...t?.light},dark:{...e?.dark,...t?.dark}}},"mergeTheme"),ye=c((e,t)=>({...e,...t,markdownLayouts:{...e.markdownLayouts,...t.markdownLayouts},scripts:{...e.scripts,...t.scripts},theme:ge(e.theme,t.theme)}),"mergeTemplateConfig"),we=c((e,t)=>{if(typeof e=="function")return!0;const{match:r}=e;return r?typeof r=="string"?t.includes(r):Array.isArray(r)?r.some(i=>t.includes(i)):r instanceof RegExp?r.test(t):r(t):!0},"scriptMatches"),ve=c((e,t)=>e?Object.values(e).filter(r=>r!==!1).filter(r=>we(r,t)).map(r=>typeof r=="function"?r():r.render()):[],"renderPageScripts"),G=c((e,t)=>{const r=Object.entries(t).filter(([i])=>i.startsWith("--")).map(([i,l])=>` ${i}: ${l};`).join(`
1
+ var ne=Object.defineProperty;var c=(e,t)=>ne(e,"name",{value:t,configurable:!0});import{Marked as ae}from"marked";import{cp as F,mkdir as v,readdir as ie,readFile as j,writeFile as x}from"fs/promises";import o from"path";import le from"front-matter";import ce from"isomorphic-dompurify";import{markedHighlight as me}from"marked-highlight";import Q from"highlight.js";import ue from"./templates/default.template.js";import fe from"./renderer/index.js";import{createMarkdownLayoutExtension as pe}from"./markdown-layout/index.js";import de from"clean-css";import he from"html-minifier";import*as X from"@putout/minify";import{fileURLToPath as ge,pathToFileURL as A}from"url";import f from"fs";let K;const V=new de({inline:["none"]}),R=new Map;R.set("default",ue);let W;const Y=c((e,t)=>t===!1?!1:t===void 0?e:e===!1||e===void 0?t:{...e,...t},"mergeThemeMode"),ye=c((e,t)=>{if(!(!e&&!t))return{light:Y(e?.light,t?.light),dark:Y(e?.dark,t?.dark)}},"mergeTheme"),we=c((e,t)=>({...e,...t,markdownLayouts:{...e.markdownLayouts,...t.markdownLayouts},scripts:{...e.scripts,...t.scripts},theme:ye(e.theme,t.theme)}),"mergeTemplateConfig"),ve=c((e,t)=>{if(typeof e=="function")return!0;const{match:r}=e;return r?typeof r=="string"?t.includes(r):Array.isArray(r)?r.some(n=>t.includes(n)):r instanceof RegExp?r.test(t):r(t):!0},"scriptMatches"),De=c((e,t)=>e?Object.values(e).filter(r=>r!==!1).filter(r=>ve(r,t)).map(r=>typeof r=="function"?r():r.render()):[],"renderPageScripts"),G=c((e,t)=>{const r=Object.entries(t).filter(([n])=>n.startsWith("--")).map(([n,l])=>` ${n}: ${l};`).join(`
2
2
  `);return r?`${e} {
3
3
  ${r}
4
- }`:""},"renderThemeBlock"),xe=c(e=>{if(!e)return"";const t=e.light??e.dark,r=e.dark??e.light;return!t&&!r?"":[t?G(":root",t):"",r?`@media (prefers-color-scheme: dark) {
5
- ${G(" :root",r)}
6
- }`:"",t?G('[data-theme="light"]',t):"",r?G('[data-theme="dark"]',r):""].filter(Boolean).join(`
4
+ }`:""},"renderThemeBlock"),Se=c(e=>{if(!e)return"";const t=e.light===!1,r=e.light===!1?void 0:e.light,n=e.dark===!1?void 0:e.dark,l=r||n;return l?[G(":root",l),n&&!t?`@media (prefers-color-scheme: dark) {
5
+ ${G(" :root",n)}
6
+ }`:"",r?G('[data-theme="light"]',r):"",n?G('[data-theme="dark"]',n):""].filter(Boolean).join(`
7
7
 
8
- `)},"renderThemeStylesheet"),Se=c((e="")=>String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"),"escapeXML"),be=c((e="")=>e.replace(/```[\s\S]*?```/g," ").replace(/`([^`]+)`/g,"$1").replace(/!\[[^\]]*]\([^)]*\)/g," ").replace(/\[([^\]]+)]\([^)]*\)/g,"$1").replace(/^#{1,6}\s+/gm,"").replace(/^---+$/gm," ").replace(/[>*_~]/g,"").replace(/\s+/g," ").trim(),"stripMarkdown"),De=c(e=>e==="/index.html"?"/":e.replace(/\/index\.html$/,"/").replace(/\.html$/,"").replace(/\/+/g,"/"),"pagePathToUrlPath"),Y=c((e,t)=>e?`${e.replace(/\/$/,"")}${t==="/"?"/":t}`:t,"canonicalUrl"),$e=c(async(e,t)=>p.existsSync(e)?(await v(o.dirname(t),{recursive:!0}),await F(e,t),!0):!1,"copyIfExists"),Pe=c(e=>{const t={sitemap:!0,robots:!0,llms:!0,llmsFull:!0,netlify:!1};return e===!1?{sitemap:!1,robots:!1,llms:!1,llmsFull:!1,netlify:!1}:e===!0||e===void 0?t:{...t,...e}},"normalizeGeneratedFilesConfig"),ke=c((e,t)=>{if(!t)return"";const r=new Date().toISOString().slice(0,10);return`<?xml version="1.0" encoding="UTF-8"?>
8
+ `):""},"renderThemeStylesheet"),xe=c((e="")=>String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"),"escapeXML"),be=c((e="")=>e.replace(/```[\s\S]*?```/g," ").replace(/`([^`]+)`/g,"$1").replace(/!\[[^\]]*]\([^)]*\)/g," ").replace(/\[([^\]]+)]\([^)]*\)/g,"$1").replace(/^#{1,6}\s+/gm,"").replace(/^---+$/gm," ").replace(/[>*_~]/g,"").replace(/\s+/g," ").trim(),"stripMarkdown"),$e=c(e=>e==="/index.html"?"/":e.replace(/\/index\.html$/,"/").replace(/\.html$/,"").replace(/\/+/g,"/"),"pagePathToUrlPath"),Z=c((e,t)=>e?`${e.replace(/\/$/,"")}${t==="/"?"/":t}`:t,"canonicalUrl"),Pe=c(async(e,t)=>f.existsSync(e)?(await v(o.dirname(t),{recursive:!0}),await F(e,t),!0):!1,"copyIfExists"),Te=c(e=>{const t={sitemap:!0,robots:!0,llms:!0,llmsFull:!0,netlify:!1};return e===!1?{sitemap:!1,robots:!1,llms:!1,llmsFull:!1,netlify:!1}:e===!0||e===void 0?t:{...t,...e}},"normalizeGeneratedFilesConfig"),ke=c((e,t)=>{if(!t)return"";const r=new Date().toISOString().slice(0,10);return`<?xml version="1.0" encoding="UTF-8"?>
9
9
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
10
10
  ${e.map(l=>{const m=l.urlPath==="/"?"1.0":"0.8";return` <url>
11
- <loc>${Se(Y(t,l.urlPath))}</loc>
11
+ <loc>${xe(Z(t,l.urlPath))}</loc>
12
12
  <lastmod>${r}</lastmod>
13
13
  <changefreq>weekly</changefreq>
14
14
  <priority>${m}</priority>
15
15
  </url>`}).join(`
16
16
  `)}
17
17
  </urlset>
18
- `},"generateSitemap"),je=c(e=>`User-agent: *
18
+ `},"generateSitemap"),Me=c(e=>`User-agent: *
19
19
  Allow: /
20
20
  ${e?`
21
21
  Sitemap: ${e.replace(/\/$/,"")}/sitemap.xml
22
22
  Host: ${e.replace(/\/$/,"")}
23
23
  `:""}
24
- `,"generateRobots"),Te=c(e=>`# Documentation
24
+ `,"generateRobots"),je=c(e=>`# Documentation
25
25
 
26
26
  ## Page index
27
27
 
28
28
  ${e.map(t=>`- ${t.name}: ${t.urlPath} - ${t.description}`).join(`
29
29
  `)}
30
- `,"generateLlms"),Me=c((e,t)=>`# Documentation for AI agents
30
+ `,"generateLlms"),Ce=c((e,t)=>`# Documentation for AI agents
31
31
 
32
32
  This file is generated at build time from the Markdown documentation. Use it to choose the most relevant page before reading the canonical HTML documentation.
33
33
 
34
34
  ${e.map(r=>`## ${r.title}
35
35
 
36
- URL: ${Y(t,r.urlPath)}
36
+ URL: ${Z(t,r.urlPath)}
37
37
  Source: docs/${r.sourcePath}
38
38
  Description: ${r.description}
39
39
 
40
40
  ${r.summary||r.description}
41
41
  `).join(`
42
42
  `)}
43
- `,"generateLlmsFull"),Ce=c((e,t)=>{const r=["# Generated by @beforesemicolon/builder"];return[t.llms?"llms.txt":"",t.llmsFull?"llms-full.txt":"",t.sitemap?"sitemap.xml":"",t.robots?"robots.txt":""].filter(Boolean).forEach(l=>r.push(`/${l} /${l} 200`)),e.forEach(l=>{if(l.urlPath==="/")return;const m=l.urlPath.endsWith("/")?`${l.urlPath}index.html`:`${l.urlPath}.html`;r.push(`${l.urlPath} ${m} 200`),l.urlPath.endsWith("/")&&r.push(`${l.urlPath.replace(/\/$/,"")} ${m} 200`)}),`${[...new Set(r)].join(`
43
+ `,"generateLlmsFull"),Fe=c((e,t)=>{const r=["# Generated by @beforesemicolon/builder"];return[t.llms?"llms.txt":"",t.llmsFull?"llms-full.txt":"",t.sitemap?"sitemap.xml":"",t.robots?"robots.txt":""].filter(Boolean).forEach(l=>r.push(`/${l} /${l} 200`)),e.forEach(l=>{if(l.urlPath==="/")return;const m=l.urlPath.endsWith("/")?`${l.urlPath}index.html`:`${l.urlPath}.html`;r.push(`${l.urlPath} ${m} 200`),l.urlPath.endsWith("/")&&r.push(`${l.urlPath.replace(/\/$/,"")} ${m} 200`)}),`${[...new Set(r)].join(`
44
44
  `)}
45
- `},"generateNetlifyRedirects"),Fe=c(e=>`[build]
45
+ `},"generateNetlifyRedirects"),Ge=c(e=>`[build]
46
46
  command = "node build-docs.js"
47
47
  publish = "${e||"website"}"
48
48
 
@@ -73,4 +73,4 @@ for = "/robots.txt"
73
73
  [headers.values]
74
74
  Content-Type = "text/plain; charset=utf-8"
75
75
  Cache-Control = "public, max-age=0, must-revalidate"
76
- `,"generateNetlifyToml"),D=c(async(e,t,r,i)=>{if(await $e(e,t))return;const l=r();if(!l){i&&console.warn(i);return}await v(o.dirname(t),{recursive:!0}),await b(t,l)},"writeGeneratedFile"),Ge=c(async({docsDir:e,docsSiteDir:t,pages:r,siteUrl:i,publicDir:l,generatedFiles:m})=>{m.sitemap&&await D(o.resolve(e,"sitemap.xml"),o.resolve(t,"sitemap.xml"),()=>ke(r,i),"Skipping generated sitemap.xml because buildDocs({ siteUrl }) is not set."),m.robots&&await D(o.resolve(e,"robots.txt"),o.resolve(t,"robots.txt"),()=>je(i)),m.llms&&await D(o.resolve(e,"llms.txt"),o.resolve(t,"llms.txt"),()=>Te(r)),m.llmsFull&&await D(o.resolve(e,"llms-full.txt"),o.resolve(t,"llms-full.txt"),()=>Me(r,i)),m.netlify&&(await D(o.resolve(e,"_redirects"),o.resolve(t,"_redirects"),()=>Ce(r,m)),await D(o.resolve(e,"netlify.toml"),o.resolve(t,"netlify.toml"),()=>Fe(l&&o.basename(l))))},"writeGeneratedDocsFiles"),Z=c((e={},t,r)=>{const i=new ae(ce({langPrefix:"hljs language-",highlight(l,m){const $=Q.getLanguage(m)?m:"plaintext";return Q.highlight(l,{language:$}).value}}));return i.use({renderer:ue}),i.use(pe({marked:i,handlers:e.markdownLayouts,renderMarkdown:r})),e.markedOptions&&i.use(e.markedOptions),t&&i.use(t),i},"createBaseMarked"),Ee=c((e={},t)=>{const r=Z(e,t),i=c(m=>r.parse(m),"renderMarkdown"),l=Z(e,t,i);return l.use({hooks:{postprocess(m){const{layout:$="default",...g}=W.attributes,P=ve(e.scripts,m);m=le.sanitize(m);const k=[...m.matchAll(/<h([0-6])\sid="[^"]+".*?>.*?<a\s+href="([^"]+)".*?>([^<]+)<\/a>/gm)].map(x=>({path:x[2],label:x[3],level:x[1]}));return R.get($)?.({...g,content:m,siteMap:W.siteMap,tableOfContent:k,projectMeta:K,renderMarkdown:i,scripts:P,themeStylesheet:e.theme?"/stylesheets/theme.css":void 0})||m}}}),l},"createMarked"),y=c(async e=>{const t=await ne(e),r=[];for(const i of t){const l=o.extname(i);/^[._]/.test(i)||(l?r.push(o.join(e,i)):/(stylesheets|assets|scripts)/.test(i)||r.push(...await y(o.join(e,i))))}return r},"traverseDirectory"),ot=c(async({srcDir:e,publicDir:t,markedOptions:r,template:i,siteUrl:l,generatedFiles:m}={})=>{try{const s=o.resolve(process.cwd(),"package.json");p.existsSync(s)&&(K=JSON.parse(await M(s,"utf-8")))}catch(s){console.warn("Failed to load project package.json metadata",s)}const $=c(()=>{try{return __dirname}catch{return o.dirname(he(import.meta.url))}},"getDirname"),g=i?o.resolve($(),"templates",i):null,P=g?o.resolve(g,"assets"):null,k=g?o.resolve(g,"stylesheets"):null,x=g?o.resolve(g,"layouts"):null;let j={};if(g)try{let s=o.resolve(g,"template.config.js");if(p.existsSync(s)||(s=s.replace(/\.js$/,".ts")),p.existsSync(s)){const a=await import(A(s).href);j=a.default||a}}catch(s){console.error(`Failed to load template config for ${i}`,s)}const f=e??o.resolve(process.cwd(),"docs"),u=t??o.resolve(process.cwd(),"website"),ee=Pe(m),w=o.resolve(f,"_template"),_=o.resolve(w,"assets"),B=o.resolve(w,"stylesheets"),N=o.resolve(w,"scripts"),U=o.resolve(w,"layouts"),z=o.resolve(f,"_layouts"),C=o.resolve(f,"assets"),q=o.resolve(f,"stylesheets"),E=o.resolve(f,"scripts");try{let s=o.resolve(w,"template.config.js");if(p.existsSync(s)||(s=s.replace(/\.js$/,".ts")),p.existsSync(s)){const a=await import(A(s).href),n=a.default||a;j=ye(j,n)}}catch(s){console.error("Failed to load docs _template config",s)}const te=Ee(j,r);if(await v(u,{recursive:!0}),P&&p.existsSync(P))try{await F(P,C.replace(f,u),{recursive:!0})}catch(s){console.warn(s)}if(p.existsSync(C))try{await F(C,C.replace(f,u),{recursive:!0})}catch(s){console.warn(s)}if(p.existsSync(_))try{await F(_,o.resolve(u,"assets"),{recursive:!0})}catch(s){console.warn(s)}try{const s=new Set;if(k&&p.existsSync(k)&&(await y(k)).forEach(n=>s.add(n)),p.existsSync(q)&&(await y(q)).forEach(n=>s.add(n)),p.existsSync(B)&&(await y(B)).forEach(n=>s.add(n)),s.size){await v(o.join(u,"stylesheets"),{recursive:!0});for(const n of s){const d=await M(n,"utf-8"),h=V.minify(d);h.errors.length&&h.errors.forEach(console.error);const T=n.startsWith(w)?n.replace(w,u):n.startsWith(f)?n.replace(f,u):o.join(u,"stylesheets",o.basename(n));await b(T,h.styles??d)}}const a=xe(j.theme);if(a){const n=V.minify(a);n.errors.length&&n.errors.forEach(console.error),await v(o.join(u,"stylesheets"),{recursive:!0}),await b(o.join(u,"stylesheets","theme.css"),n.styles??a)}}catch(s){console.error(s)}if(p.existsSync(E))try{const s=await y(E);s.length&&await v(E.replace(f,u),{recursive:!0});for(const a of s)try{const n=await M(a,"utf-8");await b(a.replace(f,u),X.minify(n))}catch(n){console.error(n)}}catch(s){console.warn(s)}if(p.existsSync(N))try{const s=await y(N);s.length&&await v(o.join(u,"scripts"),{recursive:!0});for(const a of s)try{const n=await M(a,"utf-8");await b(a.replace(w,u),X.minify(n))}catch(n){console.error(n)}}catch(s){console.warn(s)}try{const s=new Map;x&&p.existsSync(x)&&(await y(x)).forEach(a=>{/\.(j|t)s$/.test(a)&&s.set(o.basename(a).replace(/\.(j|t)s$/,""),a)}),p.existsSync(z)&&(await y(z)).forEach(a=>{/\.(j|t)s$/.test(a)&&s.set(o.basename(a).replace(/\.(j|t)s$/,""),a)}),p.existsSync(U)&&(await y(U)).forEach(a=>{/\.(j|t)s$/.test(a)&&s.set(o.basename(a).replace(/\.(j|t)s$/,""),a)});for(const[a,n]of s.entries()){const d=await import(A(n).href);R.set(a,d.default)}}catch(s){console.error("Template import failed",s)}const se=await y(f),H=new Map,I=(await Promise.all(se.filter(s=>s.endsWith(".md")).map(async s=>{const a=await M(s,"utf-8");return{filePath:s,...ie(a)}}))).sort((s,a)=>(s.attributes.order??0)-(a.attributes.order??0)).map(({attributes:s,body:a,filePath:n})=>{const d=n.replace(f,"").replace(/\.md/,".html"),h=n.replace(f,u).replace(".md",".html"),T=h.replace(o.basename(h),""),L=o.basename(d)||"/",re=d.replace(L,"").replace(/\/$/,"");let S=H;re.split("/").filter(Boolean).forEach(O=>{S.has(O)||S.set(O,new Map),S=S.get(O)});const J={...s,path:d};return S.has(L)||S.set(L,J),{attributes:J,fileWebsitePath:h,fileDirWebsitePath:T,body:a,sourcePath:o.relative(f,n),siteMap:H}});for(const{attributes:s,body:a,fileDirWebsitePath:n,fileWebsitePath:d,siteMap:h}of I){W={attributes:s,siteMap:h};const T=await te.parse(a);await v(n,{recursive:!0}),await b(d,de.minify(T,{includeAutoGeneratedTags:!0,removeAttributeQuotes:!0,removeComments:!0,removeRedundantAttributes:!0,removeScriptTypeAttributes:!0,removeStyleLinkTypeAttributes:!0,sortClassName:!0,useShortDoctype:!0,collapseWhitespace:!0,minifyJS:!0,minifyCSS:!0}))}await Ge({docsDir:f,docsSiteDir:u,pages:I.map(({attributes:s,body:a,sourcePath:n})=>{const d=De(String(s.path)),h=be(a);return{sourcePath:n,urlPath:d,title:String(s.title||s.name||"").trim()||"Documentation",name:String(s.name||s.title||"").trim()||"Documentation",description:String(s.description||"").trim()||h.slice(0,156)||"Documentation page.",order:Number(s.order??999),summary:h.slice(0,320)}}),siteUrl:l,publicDir:u,generatedFiles:ee})},"buildDocs");export{ot as buildDocs};
76
+ `,"generateNetlifyToml"),b=c(async(e,t,r,n)=>{if(await Pe(e,t))return;const l=r();if(!l){n&&console.warn(n);return}await v(o.dirname(t),{recursive:!0}),await x(t,l)},"writeGeneratedFile"),Ee=c(async({docsDir:e,docsSiteDir:t,pages:r,siteUrl:n,publicDir:l,generatedFiles:m})=>{m.sitemap&&await b(o.resolve(e,"sitemap.xml"),o.resolve(t,"sitemap.xml"),()=>ke(r,n),"Skipping generated sitemap.xml because buildDocs({ siteUrl }) is not set."),m.robots&&await b(o.resolve(e,"robots.txt"),o.resolve(t,"robots.txt"),()=>Me(n)),m.llms&&await b(o.resolve(e,"llms.txt"),o.resolve(t,"llms.txt"),()=>je(r)),m.llmsFull&&await b(o.resolve(e,"llms-full.txt"),o.resolve(t,"llms-full.txt"),()=>Ce(r,n)),m.netlify&&(await b(o.resolve(e,"_redirects"),o.resolve(t,"_redirects"),()=>Fe(r,m)),await b(o.resolve(e,"netlify.toml"),o.resolve(t,"netlify.toml"),()=>Ge(l&&o.basename(l))))},"writeGeneratedDocsFiles"),ee=c((e={},t,r)=>{const n=new ae(me({langPrefix:"hljs language-",highlight(l,m){const $=Q.getLanguage(m)?m:"plaintext";return Q.highlight(l,{language:$}).value}}));return n.use({renderer:fe}),n.use(pe({marked:n,handlers:e.markdownLayouts,renderMarkdown:r})),e.markedOptions&&n.use(e.markedOptions),t&&n.use(t),n},"createBaseMarked"),Le=c((e={},t)=>{const r=ee(e,t),n=c(m=>r.parse(m),"renderMarkdown"),l=ee(e,t,n);return l.use({hooks:{postprocess(m){const{layout:$="default",...g}=W.attributes,P=De(e.scripts,m);m=ce.sanitize(m);const T=[...m.matchAll(/<h([0-6])\sid="[^"]+".*?>.*?<a\s+href="([^"]+)".*?>([^<]+)<\/a>/gm)].map(D=>({path:D[2],label:D[3],level:D[1]}));return R.get($)?.({...g,content:m,siteMap:W.siteMap,tableOfContent:T,projectMeta:K,renderMarkdown:n,scripts:P,themeStylesheet:e.theme?"/stylesheets/theme.css":void 0})||m}}}),l},"createMarked"),y=c(async e=>{const t=await ie(e),r=[];for(const n of t){const l=o.extname(n);/^[._]/.test(n)||(l?r.push(o.join(e,n)):/(stylesheets|assets|scripts)/.test(n)||r.push(...await y(o.join(e,n))))}return r},"traverseDirectory"),at=c(async({srcDir:e,publicDir:t,markedOptions:r,template:n,siteUrl:l,generatedFiles:m}={})=>{try{const s=o.resolve(process.cwd(),"package.json");f.existsSync(s)&&(K=JSON.parse(await j(s,"utf-8")))}catch(s){console.warn("Failed to load project package.json metadata",s)}const $=c(()=>{try{return __dirname}catch{return o.dirname(ge(import.meta.url))}},"getDirname"),g=n?o.resolve($(),"templates",n):null,P=g?o.resolve(g,"assets"):null,T=g?o.resolve(g,"stylesheets"):null,D=g?o.resolve(g,"layouts"):null;let k={};if(g)try{let s=o.resolve(g,"template.config.js");if(f.existsSync(s)||(s=s.replace(/\.js$/,".ts")),f.existsSync(s)){const a=await import(A(s).href);k=a.default||a}}catch(s){console.error(`Failed to load template config for ${n}`,s)}const p=e??o.resolve(process.cwd(),"docs"),u=t??o.resolve(process.cwd(),"website"),te=Te(m),w=o.resolve(p,"_template"),_=o.resolve(w,"assets"),B=o.resolve(w,"stylesheets"),N=o.resolve(w,"scripts"),U=o.resolve(w,"layouts"),z=o.resolve(p,"_layouts"),C=o.resolve(p,"assets"),q=o.resolve(p,"stylesheets"),E=o.resolve(p,"scripts");try{let s=o.resolve(w,"template.config.js");if(f.existsSync(s)||(s=s.replace(/\.js$/,".ts")),f.existsSync(s)){const a=await import(A(s).href),i=a.default||a;k=we(k,i)}}catch(s){console.error("Failed to load docs _template config",s)}const se=Le(k,r);if(await v(u,{recursive:!0}),P&&f.existsSync(P))try{await F(P,C.replace(p,u),{recursive:!0})}catch(s){console.warn(s)}if(f.existsSync(C))try{await F(C,C.replace(p,u),{recursive:!0})}catch(s){console.warn(s)}if(f.existsSync(_))try{await F(_,o.resolve(u,"assets"),{recursive:!0})}catch(s){console.warn(s)}try{const s=new Set;if(T&&f.existsSync(T)&&(await y(T)).forEach(i=>s.add(i)),f.existsSync(q)&&(await y(q)).forEach(i=>s.add(i)),f.existsSync(B)&&(await y(B)).forEach(i=>s.add(i)),s.size){await v(o.join(u,"stylesheets"),{recursive:!0});for(const i of s){const d=await j(i,"utf-8"),h=V.minify(d);h.errors.length&&h.errors.forEach(console.error);const M=i.startsWith(w)?i.replace(w,u):i.startsWith(p)?i.replace(p,u):o.join(u,"stylesheets",o.basename(i));await x(M,h.styles??d)}}const a=Se(k.theme);if(a){const i=V.minify(a);i.errors.length&&i.errors.forEach(console.error),await v(o.join(u,"stylesheets"),{recursive:!0}),await x(o.join(u,"stylesheets","theme.css"),i.styles??a)}}catch(s){console.error(s)}if(f.existsSync(E))try{const s=await y(E);s.length&&await v(E.replace(p,u),{recursive:!0});for(const a of s)try{const i=await j(a,"utf-8");await x(a.replace(p,u),X.minify(i))}catch(i){console.error(i)}}catch(s){console.warn(s)}if(f.existsSync(N))try{const s=await y(N);s.length&&await v(o.join(u,"scripts"),{recursive:!0});for(const a of s)try{const i=await j(a,"utf-8");await x(a.replace(w,u),X.minify(i))}catch(i){console.error(i)}}catch(s){console.warn(s)}try{const s=new Map;D&&f.existsSync(D)&&(await y(D)).forEach(a=>{/\.(j|t)s$/.test(a)&&s.set(o.basename(a).replace(/\.(j|t)s$/,""),a)}),f.existsSync(z)&&(await y(z)).forEach(a=>{/\.(j|t)s$/.test(a)&&s.set(o.basename(a).replace(/\.(j|t)s$/,""),a)}),f.existsSync(U)&&(await y(U)).forEach(a=>{/\.(j|t)s$/.test(a)&&s.set(o.basename(a).replace(/\.(j|t)s$/,""),a)});for(const[a,i]of s.entries()){const d=await import(A(i).href);R.set(a,d.default)}}catch(s){console.error("Template import failed",s)}const re=await y(p),H=new Map,I=(await Promise.all(re.filter(s=>s.endsWith(".md")).map(async s=>{const a=await j(s,"utf-8");return{filePath:s,...le(a)}}))).sort((s,a)=>(s.attributes.order??0)-(a.attributes.order??0)).map(({attributes:s,body:a,filePath:i})=>{const d=i.replace(p,"").replace(/\.md/,".html"),h=i.replace(p,u).replace(".md",".html"),M=h.replace(o.basename(h),""),L=o.basename(d)||"/",oe=d.replace(L,"").replace(/\/$/,"");let S=H;oe.split("/").filter(Boolean).forEach(O=>{S.has(O)||S.set(O,new Map),S=S.get(O)});const J={...s,path:d};return S.has(L)||S.set(L,J),{attributes:J,fileWebsitePath:h,fileDirWebsitePath:M,body:a,sourcePath:o.relative(p,i),siteMap:H}});for(const{attributes:s,body:a,fileDirWebsitePath:i,fileWebsitePath:d,siteMap:h}of I){W={attributes:s,siteMap:h};const M=await se.parse(a);await v(i,{recursive:!0}),await x(d,he.minify(M,{includeAutoGeneratedTags:!0,removeAttributeQuotes:!0,removeComments:!0,removeRedundantAttributes:!0,removeScriptTypeAttributes:!0,removeStyleLinkTypeAttributes:!0,sortClassName:!0,useShortDoctype:!0,collapseWhitespace:!0,minifyJS:!0,minifyCSS:!0}))}await Ee({docsDir:p,docsSiteDir:u,pages:I.map(({attributes:s,body:a,sourcePath:i})=>{const d=$e(String(s.path)),h=be(a);return{sourcePath:i,urlPath:d,title:String(s.title||s.name||"").trim()||"Documentation",name:String(s.name||s.title||"").trim()||"Documentation",description:String(s.description||"").trim()||h.slice(0,156)||"Documentation page.",order:Number(s.order??999),summary:h.slice(0,320)}}),siteUrl:l,publicDir:u,generatedFiles:te})},"buildDocs");export{at as buildDocs};