@veluai/velu 0.2.37 → 0.2.38

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/cli.js CHANGED
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- var Kr=Object.defineProperty;var P=(e,t)=>()=>(e&&(t=e(e=0)),t);var $e=(e,t)=>{for(var r in t)Kr(e,r,{get:t[r],enumerable:!0})};var rn={};$e(rn,{initProject:()=>Qr});import me from"node:fs/promises";import de from"node:path";import{fileURLToPath as Xr}from"node:url";async function Qr(e,t){try{if((await me.readdir(e)).length>0)throw new Error(`Directory "${t}" already exists and is not empty. Choose a different name or remove the folder first.`)}catch(i){if(i.code!=="ENOENT")throw i}await me.mkdir(e,{recursive:!0}),await me.cp(Zr,e,{recursive:!0});let r=de.join(e,"velu.json"),n=JSON.parse(await me.readFile(r,"utf-8"));n.name=t,await me.writeFile(r,JSON.stringify(n,null,2)+`
3
- `,"utf-8");let o=await nn(e);console.log(`[velu] created ${t}/`);for(let i of o)console.log(` ${i}`);console.log(""),console.log("Next steps:"),console.log(` cd ${t}`),console.log(" velu dev")}async function nn(e,t=e,r=[]){let n=await me.readdir(e,{withFileTypes:!0});for(let o of n){let i=de.join(e,o.name);o.isDirectory()?await nn(i,t,r):r.push(de.relative(t,i).split(de.sep).join("/"))}return r.sort()}var Yr,Zr,on=P(()=>{Yr=de.dirname(Xr(import.meta.url)),Zr=de.resolve(Yr,"..","templates","starter")});import Se from"node:fs";import K from"node:path";import{fileURLToPath as eo}from"node:url";import{parse as to,printParseErrorCode as no}from"jsonc-parser";import ro from"js-yaml";function le(e,t){let r=K.relative(e,t);return r===""||!r.startsWith(`..${K.sep}`)&&r!==".."&&!K.isAbsolute(r)}function dt(e,t){let r=[],n=to(e.replace(/^\uFEFF/,""),r,{allowTrailingComma:!0});if(r.length)throw new Error(`${t}: ${no(r[0].error)} at offset ${r[0].offset}`);return n}function sn(e,t){let r=Se.realpathSync(e);function n(i,a=[]){if(!le(r,Se.realpathSync(i)))throw new Error("Config reference escapes the source directory.");if(a.includes(i))throw new Error(`Circular config reference: ${mt(K.relative(e,i))}`);if(a.length>50)throw new Error("Config reference nesting exceeds 50 levels.");let s=Se.readFileSync(i,"utf8"),l=/\.ya?ml$/i.test(i)?ro.load(s):dt(s,K.basename(i));function c(u){if(Array.isArray(u))return u.map(c);if(!W(u))return u;if(typeof u.$ref=="string"){if(!/^\.\.?\//.test(u.$ref)||/[#?]/.test(u.$ref))throw new Error(`Config $ref must be a local JSON/YAML file without a fragment: ${u.$ref}`);let p=K.resolve(K.dirname(i),u.$ref);if(!le(e,p))throw new Error("Config reference escapes the source directory.");let y=n(p,[...a,i]),m=Object.fromEntries(Object.entries(u).filter(([g])=>g!=="$ref").map(([g,b])=>[g,c(b)]));if(Object.keys(m).length&&!W(y))throw new Error("Config $ref siblings require an object reference.");return W(y)?{...y,...m}:y}return Object.fromEntries(Object.entries(u).map(([p,y])=>[p,c(y)]))}return c(l)}let o=n(K.join(e,t));if(!W(o))throw new Error(`${t} must contain an object.`);return o}function oo(e,t){let r=e.navigation||[],n=e.tabs||[];if(!Array.isArray(r)||!Array.isArray(n))throw new Error("Legacy navigation and tabs must be arrays.");function o(a,s,l){return a.flatMap(c=>{if(typeof c=="string"){let p=c.replace(/^\//,"");return(s?p===s||p.startsWith(s+"/"):!l.some(m=>p===m||p.startsWith(m+"/")))?[c]:[]}if(!W(c))return[];let u=o(c.pages||[],s,l);return u.length?[{...c,pages:u}]:[]})}let i={groups:r};if(n.length){let a=n.filter(c=>c.url&&!/^https?:/.test(c.url)).map(c=>c.url.replace(/^\/+|\/+$/g,"")),s=n.map(c=>{if(/^https?:/.test(c.url||""))return{tab:c.name,href:c.url,...c.icon?{icon:c.icon}:{}};let u=(c.url||"").replace(/^\/+|\/+$/g,"");return{tab:c.name,...c.icon?{icon:c.icon}:{},groups:o(r,u,a)}}),l=o(r,"",a);l.length&&!n.some(c=>!c.url||c.url==="/")&&s.unshift({tab:"Documentation",groups:l}),i={tabs:s}}return Array.isArray(e.anchors)&&(i.anchors=e.anchors.map(({name:a,url:s,...l})=>({...l,anchor:a,href:s}))),e.versions&&t("legacy-versions","warning","versions","Legacy version filtering needs review; all groups are retained. Convert version-specific groups to navigation.versions."),i}function an(e,t,r){let n=structuredClone(e);if(n.theme==="sequoia"&&(n.theme="vepa",n.contextual==null&&(n.contextual={options:[]})),n.theme&&!["velu","vepa"].includes(n.theme)&&(r("unsupported-config","warning","theme","This theme has no Velu preset; original setting preserved in source config."),delete n.theme),t==="mint.json"||Array.isArray(n.navigation)){if(n.navigation=oo(n,r),n.topbarLinks&&(n.navbar={...n.navbar,links:n.topbarLinks.map(({name:p,...y})=>({...y,label:p}))}),n.topbarCta){let{name:p,...y}=n.topbarCta;p&&!y.label&&(y.label=p),n.navbar={...n.navbar,primary:y}}n.footerSocials&&(n.footer={...n.footer,socials:n.footerSocials}),n.modeToggle&&r("appearance","warning","modeToggle","Set the initial theme and theme-switcher behavior manually in Velu."),typeof n.api?.baseUrl=="string"&&(n.api.server=n.api.baseUrl),n.api?.request?.example?.languages&&(n.api.examples={languages:n.api.request.example.languages});for(let p of["tabs","anchors","topbarLinks","topbarCta","footerSocials","modeToggle"])delete n[p];n.api&&(delete n.api.baseUrl,delete n.api.request)}if(n.fonts&&!n.font){let p=n.fonts.family||n.fonts.body?.family;p&&(n.font={family:p}),r("fonts","warning","fonts","Body font family migrated where available; custom font sources, weights, and heading fonts need review."),delete n.fonts}W(n.favicon)&&(n.favicon=n.favicon.light||n.favicon.dark,r("favicon-theme","warning","favicon","Velu uses one favicon; selected the light variant when available.")),W(n.logo)&&(n.logo.light??=n.logo.dark,n.logo.dark??=n.logo.light);function o(p,y="navigation"){if(Array.isArray(p))return p.map((g,b)=>o(g,`${y}[${b}]`));if(!W(p))return p;let m={...p};if(Array.isArray(m.dropdowns)&&!m.products&&!m.tabs&&(m.tabs=m.dropdowns.map(({dropdown:g,...b})=>({tab:g,...b})),delete m.dropdowns,r("navigation-dropdowns","warning",y,"Dropdowns converted to tabs. Check navigation layout and URLs.")),m.global){for(let g of["anchors","tabs"])Array.isArray(m.global[g])&&(m[g]=[...m[g]||[],...m.global[g]]);r("navigation-global","warning",`${y}.global`,"Global anchors/tabs merged into this container. Review switcher visibility; other global entries remain in the original config."),delete m.global}W(m.icon)&&typeof m.icon.name=="string"&&(m.icon=m.icon.name,r("icon-library","warning",`${y}.icon`,"Icon name retained; check its equivalent in Velu\u2019s Lucide icon library.")),W(m.openapi)&&typeof m.openapi.source=="string"&&(r("openapi-options","warning",`${y}.openapi`,"OpenAPI source retained; generation options need review."),m.openapi=m.openapi.source);for(let[g,b]of Object.entries(m))g==="pages"&&Array.isArray(b)?m[g]=b.map((d,h)=>typeof d=="string"?d.replace(/\.(mdx|md)$/i,""):o(d,`${y}.pages[${h}]`)):(W(b)||Array.isArray(b))&&(m[g]=o(b,`${y}.${g}`));return m}n.navigation=o(n.navigation||{}),typeof n.description=="string"&&(n.seo={...n.seo,metatags:{description:n.description,...n.seo?.metatags}},delete n.description),n.$schema="https://veludocs.com/velu.schema.json";let i=K.dirname(eo(import.meta.url)),a=[K.resolve(i,"../../schema/velu.schema.json"),K.resolve(i,"../schema/velu.schema.json")].find(p=>Se.existsSync(p));if(!a)throw new Error("Velu config schema is missing from this installation.");let s=JSON.parse(Se.readFileSync(a,"utf8")),l=p=>p.$ref?p.$ref.split("/").slice(1).reduce((y,m)=>y[m],s):p,c=p=>Array.isArray(p)?"array":p===null?"null":typeof p;function u(p,y,m){let g=l(y);if(g.oneOf&&(g=g.oneOf.map(l).find(b=>(!b.type||c(p)===b.type)&&(!b.properties?.type?.const||p?.type===b.properties.type.const)),!g)){r("config-shape","error",m,"Value does not match any supported Velu shape; original retained in source config.");return}if(g.type&&c(p)!==g.type||g.enum&&!g.enum.includes(p)||"const"in g&&p!==g.const){r("config-value","error",m,"Unsupported value or type; original retained in source config.");return}if(typeof p=="string"&&g.minLength&&p.length<g.minLength&&r("config-value","error",m,"Value must not be empty."),W(p)){let b={};for(let[d,h]of Object.entries(p)){let S=m?`${m}.${d}`:d,T=g.properties?.[d]||(W(g.additionalProperties)?g.additionalProperties:null);if(!T&&g.additionalProperties===!1){let x=/(^|\.)(auth|authentication|groups|hidden|public|permissions|personalization)(\.|$)/.test(S);r("unsupported-config",x?"error":"warning",S,x?"Access or visibility rules require manual migration before publishing.":"No equivalent in the Velu schema; original setting preserved in source config.");continue}let A=T?u(h,T,S):h;A!==void 0&&Object.defineProperty(b,d,{value:A,enumerable:!0,writable:!0,configurable:!0})}for(let d of g.required||[])d in b||r("required-config","error",m?`${m}.${d}`:d,"Required Velu setting is missing.");return b}return Array.isArray(p)&&g.items?(g.maxItems&&p.length>g.maxItems&&r("config-limit","warning",m,`Velu supports up to ${g.maxItems} entries here; review rendering.`),p.map((b,d)=>u(b,g.items,`${m}[${d}]`)).filter(b=>b!==void 0)):p}return u(n,s,"")}var W,mt,Be=P(()=>{W=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),mt=e=>e.split(K.sep).join("/")});var te,De=P(()=>{te=["Callout","Card","CardGroup","Accordion","AccordionGroup","Columns","Field","Prompt","Steps","Step","Tree","Folder","File","Update","Icon","Image","CodeBlock","CodeGroup","MethodBadge","ApiPath","TryItBar","ApiField","ApiClient","ApiSidebar"]});import q from"node:path";import{createProcessor as io,compile as so}from"@mdx-js/mdx";import ln from"remark-frontmatter";import ao from"remark-mdx-frontmatter";import cn from"remark-gfm";import{visit as un}from"unist-util-visit";import lo from"js-yaml";import{parse as co}from"@babel/parser";import uo from"postcss";async function pn(e,t,r,n,{endpointConverted:o=!1}={}){let i=io({remarkPlugins:[ln,cn]}),a;try{a=i.parse(e)}catch(d){return n("mdx-syntax","error",t,d.reason||d.message,d.line),{text:e,adapters:[]}}let s=new Set,l=[],c=[],u=new Set,p=new Set,y=new Set,m=(d,h,S)=>c.push({start:d,end:h,value:S});un(a,"mdxjsEsm",d=>{for(let h of d.data?.estree?.body||[]){if(h.type==="ImportDeclaration"){for(let T of h.specifiers)s.add(T.local.name);l.push({node:d,stmt:h})}let S=h.declaration;S?.id?.name&&s.add(S.id.name);for(let T of S?.declarations||[])T.id?.name&&s.add(T.id.name)}});let g=(d,h=!1)=>{if(typeof d!="string"||/^(?:[a-z][a-z0-9+.-]*:|\/\/|#)/i.test(d)||h&&!d.startsWith(".")&&!d.startsWith("/"))return d;let[,S,T]=/^([^?#]*)(.*)$/.exec(d),A=q.posix.normalize(S.startsWith("/")?S.slice(1):q.posix.join(q.posix.dirname(t),S)),x=r.get(A);if(!x)return h&&n("missing-import","error",t,`Local import cannot be resolved in migrated files: ${d}`),d;if(h){let w=q.posix.relative(q.posix.dirname(r.get(t)||t),x);return(w.startsWith(".")?w:"./"+w)+T}return/\.(md|mdx)$/i.test(x)||p.add(x),/\.mdx$/i.test(x)&&/\.(md|mdx)$/i.test(S)?S.replace(/\.(md|mdx)$/i,"")+T:d};for(let{stmt:d}of l){let h=d.source.value;/^(?:@mintlify\/|next(?:\/|$))/.test(h)&&n("runtime-import","error",t,`Replace the runtime dependency ${h} with a Velu/React equivalent.`);let S=g(h,!0);S!==h&&m(d.source.start,d.source.end,JSON.stringify(S))}un(a,d=>{if(d.type==="yaml")try{let w=lo.load(d.value)||{};for(let L of Object.keys(w))if(["auth","groups","public","hidden"].includes(L))n("page-access","error",t,`Frontmatter ${L} requires manual visibility/access migration.`,d.position.start.line);else{if(L==="openapi"&&o)continue;["api","openapi","asyncapi"].includes(L)?n("endpoint-frontmatter","error",t,`Frontmatter ${L} is preserved but does not generate an endpoint in Velu. Wire the spec into navigation.openapi and review endpoint routes.`,d.position.start.line):["title","description","icon","sidebarTitle","mode","keywords","og:title","og:description","og:image"].includes(L)||n("frontmatter-review","warning",t,`Frontmatter ${L} is preserved; verify its behavior in Velu.`,d.position.start.line)}}catch(w){n("frontmatter-syntax","error",t,w.message,d.position.start.line)}if(["link","image","definition"].includes(d.type)&&d.url){let w=g(d.url);if(w!==d.url){let L=d.position.start.offset,B=e.slice(L,d.position.end.offset).lastIndexOf(d.url);B>=0&&m(L+B,L+B+d.url.length,w)}}if(!["mdxJsxFlowElement","mdxJsxTextElement"].includes(d.type)||!d.name)return;let h=d.name,S=d.position.start.line;if(s.has(h.split(".")[0]))return;y.add(h);let T=gt[h]?"Callout":["ParamField","ResponseField"].includes(h)?"Field":h==="Expandable"?"Accordion":h;if(T!==h&&s.has(T)){n("component-name-conflict","error",t,`Cannot convert <${h}> to <${T}> because that name is already locally defined. Rename the local binding before migration.`,S);return}let A=d.attributes.filter(w=>w.type==="mdxJsxAttribute"),x=(w,L)=>{let _=A.find(B=>B.name===w);_&&!A.some(B=>B.name===L)&&m(_.position.start.offset,_.position.start.offset+w.length,L)};if(h==="ParamField")for(let w of["body","query","path","header","cookie"])x(w,"name");if(h==="CardGroup"&&x("cols","limit"),h==="Accordion"&&x("default-open","defaultOpen"),h==="Expandable"&&(x("title","title"),A.some(w=>w.name==="title")||m(d.position.start.offset+1+h.length,d.position.start.offset+1+h.length,' title="Details"')),T!==h){let w=d.position.start.offset;m(w+1,w+1+h.length,T+(gt[h]?` type="${gt[h]}"`:""));let L=d.position.end.offset,_=new RegExp(`</${h}\\s*>$`).exec(e.slice(w,L));_&&m(L-_[0].length+2,L-_[0].length+2+h.length,T)}po.has(h)?(u.add(h),n("component-adapter","warning",t,`<${h}> uses an editable React adapter. Review visual styling and optional props.`,S)):/^[A-Z]/.test(T)&&!fo.has(T)&&n("unsupported-component","error",t,`<${h}> needs a local component implementation or import.`,S);for(let w of A)if(["href","src"].includes(w.name)&&typeof w.value=="string"){let L=g(w.value);if(L!==w.value){let _=w.position.start.offset,ee=e.slice(_,w.position.end.offset).indexOf(w.value);ee>=0&&m(_+ee,_+ee+w.value.length,L)}}}),c.sort((d,h)=>h.start-d.start||h.end-d.end);let b=e;for(let d of c)b=b.slice(0,d.start)+d.value+b.slice(d.end);if(u.size){let d=q.posix.relative(q.posix.dirname(r.get(t)||t),ge);b+=`
2
+ var Kr=Object.defineProperty;var _=(e,t)=>()=>(e&&(t=e(e=0)),t);var $e=(e,t)=>{for(var r in t)Kr(e,r,{get:t[r],enumerable:!0})};var on={};$e(on,{initProject:()=>Qr});import me from"node:fs/promises";import de from"node:path";import{fileURLToPath as Xr}from"node:url";async function Qr(e,t){try{if((await me.readdir(e)).length>0)throw new Error(`Directory "${t}" already exists and is not empty. Choose a different name or remove the folder first.`)}catch(i){if(i.code!=="ENOENT")throw i}await me.mkdir(e,{recursive:!0}),await me.cp(Zr,e,{recursive:!0});let r=de.join(e,"velu.json"),n=JSON.parse(await me.readFile(r,"utf-8"));n.name=t,await me.writeFile(r,JSON.stringify(n,null,2)+`
3
+ `,"utf-8");let o=await rn(e);console.log(`[velu] created ${t}/`);for(let i of o)console.log(` ${i}`);console.log(""),console.log("Next steps:"),console.log(` cd ${t}`),console.log(" velu dev")}async function rn(e,t=e,r=[]){let n=await me.readdir(e,{withFileTypes:!0});for(let o of n){let i=de.join(e,o.name);o.isDirectory()?await rn(i,t,r):r.push(de.relative(t,i).split(de.sep).join("/"))}return r.sort()}var Yr,Zr,sn=_(()=>{Yr=de.dirname(Xr(import.meta.url)),Zr=de.resolve(Yr,"..","templates","starter")});import Se from"node:fs";import K from"node:path";import{fileURLToPath as eo}from"node:url";import{parse as to,printParseErrorCode as no}from"jsonc-parser";import ro from"js-yaml";function le(e,t){let r=K.relative(e,t);return r===""||!r.startsWith(`..${K.sep}`)&&r!==".."&&!K.isAbsolute(r)}function dt(e,t){let r=[],n=to(e.replace(/^\uFEFF/,""),r,{allowTrailingComma:!0});if(r.length)throw new Error(`${t}: ${no(r[0].error)} at offset ${r[0].offset}`);return n}function an(e,t){let r=Se.realpathSync(e);function n(i,a=[]){if(!le(r,Se.realpathSync(i)))throw new Error("Config reference escapes the source directory.");if(a.includes(i))throw new Error(`Circular config reference: ${mt(K.relative(e,i))}`);if(a.length>50)throw new Error("Config reference nesting exceeds 50 levels.");let s=Se.readFileSync(i,"utf8"),l=/\.ya?ml$/i.test(i)?ro.load(s):dt(s,K.basename(i));function c(u){if(Array.isArray(u))return u.map(c);if(!W(u))return u;if(typeof u.$ref=="string"){if(!/^\.\.?\//.test(u.$ref)||/[#?]/.test(u.$ref))throw new Error(`Config $ref must be a local JSON/YAML file without a fragment: ${u.$ref}`);let p=K.resolve(K.dirname(i),u.$ref);if(!le(e,p))throw new Error("Config reference escapes the source directory.");let y=n(p,[...a,i]),m=Object.fromEntries(Object.entries(u).filter(([g])=>g!=="$ref").map(([g,b])=>[g,c(b)]));if(Object.keys(m).length&&!W(y))throw new Error("Config $ref siblings require an object reference.");return W(y)?{...y,...m}:y}return Object.fromEntries(Object.entries(u).map(([p,y])=>[p,c(y)]))}return c(l)}let o=n(K.join(e,t));if(!W(o))throw new Error(`${t} must contain an object.`);return o}function oo(e,t){let r=e.navigation||[],n=e.tabs||[];if(!Array.isArray(r)||!Array.isArray(n))throw new Error("Legacy navigation and tabs must be arrays.");function o(a,s,l){return a.flatMap(c=>{if(typeof c=="string"){let p=c.replace(/^\//,"");return(s?p===s||p.startsWith(s+"/"):!l.some(m=>p===m||p.startsWith(m+"/")))?[c]:[]}if(!W(c))return[];let u=o(c.pages||[],s,l);return u.length?[{...c,pages:u}]:[]})}let i={groups:r};if(n.length){let a=n.filter(c=>c.url&&!/^https?:/.test(c.url)).map(c=>c.url.replace(/^\/+|\/+$/g,"")),s=n.map(c=>{if(/^https?:/.test(c.url||""))return{tab:c.name,href:c.url,...c.icon?{icon:c.icon}:{}};let u=(c.url||"").replace(/^\/+|\/+$/g,"");return{tab:c.name,...c.icon?{icon:c.icon}:{},groups:o(r,u,a)}}),l=o(r,"",a);l.length&&!n.some(c=>!c.url||c.url==="/")&&s.unshift({tab:"Documentation",groups:l}),i={tabs:s}}return Array.isArray(e.anchors)&&(i.anchors=e.anchors.map(({name:a,url:s,...l})=>({...l,anchor:a,href:s}))),e.versions&&t("legacy-versions","warning","versions","Legacy version filtering needs review; all groups are retained. Convert version-specific groups to navigation.versions."),i}function ln(e,t,r){let n=structuredClone(e);if(n.theme==="sequoia"&&(n.theme="vepa",n.contextual==null&&(n.contextual={options:[]})),n.theme&&!["velu","vepa"].includes(n.theme)&&(r("unsupported-config","warning","theme","This theme has no Velu preset; original setting preserved in source config."),delete n.theme),t==="mint.json"||Array.isArray(n.navigation)){if(n.navigation=oo(n,r),n.topbarLinks&&(n.navbar={...n.navbar,links:n.topbarLinks.map(({name:p,...y})=>({...y,label:p}))}),n.topbarCta){let{name:p,...y}=n.topbarCta;p&&!y.label&&(y.label=p),n.navbar={...n.navbar,primary:y}}n.footerSocials&&(n.footer={...n.footer,socials:n.footerSocials}),n.modeToggle&&r("appearance","warning","modeToggle","Set the initial theme and theme-switcher behavior manually in Velu."),typeof n.api?.baseUrl=="string"&&(n.api.server=n.api.baseUrl),n.api?.request?.example?.languages&&(n.api.examples={languages:n.api.request.example.languages});for(let p of["tabs","anchors","topbarLinks","topbarCta","footerSocials","modeToggle"])delete n[p];n.api&&(delete n.api.baseUrl,delete n.api.request)}if(n.fonts&&!n.font){let p=n.fonts.family||n.fonts.body?.family;p&&(n.font={family:p}),r("fonts","warning","fonts","Body font family migrated where available; custom font sources, weights, and heading fonts need review."),delete n.fonts}W(n.favicon)&&(n.favicon=n.favicon.light||n.favicon.dark,r("favicon-theme","warning","favicon","Velu uses one favicon; selected the light variant when available.")),W(n.logo)&&(n.logo.light??=n.logo.dark,n.logo.dark??=n.logo.light);function o(p,y="navigation"){if(Array.isArray(p))return p.map((g,b)=>o(g,`${y}[${b}]`));if(!W(p))return p;let m={...p};if(Array.isArray(m.dropdowns)&&!m.products&&!m.tabs&&(m.tabs=m.dropdowns.map(({dropdown:g,...b})=>({tab:g,...b})),delete m.dropdowns,r("navigation-dropdowns","warning",y,"Dropdowns converted to tabs. Check navigation layout and URLs.")),m.global){for(let g of["anchors","tabs"])Array.isArray(m.global[g])&&(m[g]=[...m[g]||[],...m.global[g]]);r("navigation-global","warning",`${y}.global`,"Global anchors/tabs merged into this container. Review switcher visibility; other global entries remain in the original config."),delete m.global}W(m.icon)&&typeof m.icon.name=="string"&&(m.icon=m.icon.name,r("icon-library","warning",`${y}.icon`,"Icon name retained; check its equivalent in Velu\u2019s Lucide icon library.")),W(m.openapi)&&typeof m.openapi.source=="string"&&(r("openapi-options","warning",`${y}.openapi`,"OpenAPI source retained; generation options need review."),m.openapi=m.openapi.source);for(let[g,b]of Object.entries(m))g==="pages"&&Array.isArray(b)?m[g]=b.map((d,h)=>typeof d=="string"?d.replace(/\.(mdx|md)$/i,""):o(d,`${y}.pages[${h}]`)):(W(b)||Array.isArray(b))&&(m[g]=o(b,`${y}.${g}`));return m}n.navigation=o(n.navigation||{}),typeof n.description=="string"&&(n.seo={...n.seo,metatags:{description:n.description,...n.seo?.metatags}},delete n.description),n.$schema="https://veludocs.com/velu.schema.json";let i=K.dirname(eo(import.meta.url)),a=[K.resolve(i,"../../schema/velu.schema.json"),K.resolve(i,"../schema/velu.schema.json")].find(p=>Se.existsSync(p));if(!a)throw new Error("Velu config schema is missing from this installation.");let s=JSON.parse(Se.readFileSync(a,"utf8")),l=p=>p.$ref?p.$ref.split("/").slice(1).reduce((y,m)=>y[m],s):p,c=p=>Array.isArray(p)?"array":p===null?"null":typeof p;function u(p,y,m){let g=l(y);if(g.oneOf&&(g=g.oneOf.map(l).find(b=>(!b.type||c(p)===b.type)&&(!b.properties?.type?.const||p?.type===b.properties.type.const)),!g)){r("config-shape","error",m,"Value does not match any supported Velu shape; original retained in source config.");return}if(g.type&&c(p)!==g.type||g.enum&&!g.enum.includes(p)||"const"in g&&p!==g.const){r("config-value","error",m,"Unsupported value or type; original retained in source config.");return}if(typeof p=="string"&&g.minLength&&p.length<g.minLength&&r("config-value","error",m,"Value must not be empty."),W(p)){let b={};for(let[d,h]of Object.entries(p)){let S=m?`${m}.${d}`:d,O=g.properties?.[d]||(W(g.additionalProperties)?g.additionalProperties:null);if(!O&&g.additionalProperties===!1){let x=/(^|\.)(auth|authentication|groups|hidden|public|permissions|personalization)(\.|$)/.test(S);r("unsupported-config",x?"error":"warning",S,x?"Access or visibility rules require manual migration before publishing.":"No equivalent in the Velu schema; original setting preserved in source config.");continue}let A=O?u(h,O,S):h;A!==void 0&&Object.defineProperty(b,d,{value:A,enumerable:!0,writable:!0,configurable:!0})}for(let d of g.required||[])d in b||r("required-config","error",m?`${m}.${d}`:d,"Required Velu setting is missing.");return b}return Array.isArray(p)&&g.items?(g.maxItems&&p.length>g.maxItems&&r("config-limit","warning",m,`Velu supports up to ${g.maxItems} entries here; review rendering.`),p.map((b,d)=>u(b,g.items,`${m}[${d}]`)).filter(b=>b!==void 0)):p}return u(n,s,"")}var W,mt,De=_(()=>{W=e=>e!==null&&typeof e=="object"&&!Array.isArray(e),mt=e=>e.split(K.sep).join("/")});var te,Je=_(()=>{te=["Callout","Card","CardGroup","Accordion","AccordionGroup","Columns","Field","Prompt","Steps","Step","Tree","Folder","File","Update","Icon","Image","CodeBlock","CodeGroup","MethodBadge","ApiPath","TryItBar","ApiField","ApiClient","ApiSidebar"]});import q from"node:path";import{createProcessor as io,compile as so}from"@mdx-js/mdx";import cn from"remark-frontmatter";import ao from"remark-mdx-frontmatter";import un from"remark-gfm";import{visit as pn}from"unist-util-visit";import lo from"js-yaml";import{parse as co}from"@babel/parser";import uo from"postcss";async function fn(e,t,r,n,{endpointConverted:o=!1}={}){let i=io({remarkPlugins:[cn,un]}),a;try{a=i.parse(e)}catch(d){return n("mdx-syntax","error",t,d.reason||d.message,d.line),{text:e,adapters:[]}}let s=new Set,l=[],c=[],u=new Set,p=new Set,y=new Set,m=(d,h,S)=>c.push({start:d,end:h,value:S});pn(a,"mdxjsEsm",d=>{for(let h of d.data?.estree?.body||[]){if(h.type==="ImportDeclaration"){for(let O of h.specifiers)s.add(O.local.name);l.push({node:d,stmt:h})}let S=h.declaration;S?.id?.name&&s.add(S.id.name);for(let O of S?.declarations||[])O.id?.name&&s.add(O.id.name)}});let g=(d,h=!1)=>{if(typeof d!="string"||/^(?:[a-z][a-z0-9+.-]*:|\/\/|#)/i.test(d)||h&&!d.startsWith(".")&&!d.startsWith("/"))return d;let[,S,O]=/^([^?#]*)(.*)$/.exec(d),A=q.posix.normalize(S.startsWith("/")?S.slice(1):q.posix.join(q.posix.dirname(t),S)),x=r.get(A);if(!x)return h&&n("missing-import","error",t,`Local import cannot be resolved in migrated files: ${d}`),d;if(h){let w=q.posix.relative(q.posix.dirname(r.get(t)||t),x);return(w.startsWith(".")?w:"./"+w)+O}return/\.(md|mdx)$/i.test(x)||p.add(x),/\.mdx$/i.test(x)&&/\.(md|mdx)$/i.test(S)?S.replace(/\.(md|mdx)$/i,"")+O:d};for(let{stmt:d}of l){let h=d.source.value;/^(?:@mintlify\/|next(?:\/|$))/.test(h)&&n("runtime-import","error",t,`Replace the runtime dependency ${h} with a Velu/React equivalent.`);let S=g(h,!0);S!==h&&m(d.source.start,d.source.end,JSON.stringify(S))}pn(a,d=>{if(d.type==="yaml")try{let w=lo.load(d.value)||{};for(let L of Object.keys(w))if(["auth","groups","public","hidden"].includes(L))n("page-access","error",t,`Frontmatter ${L} requires manual visibility/access migration.`,d.position.start.line);else{if(L==="openapi"&&o)continue;["api","openapi","asyncapi"].includes(L)?n("endpoint-frontmatter","error",t,`Frontmatter ${L} is preserved but does not generate an endpoint in Velu. Wire the spec into navigation.openapi and review endpoint routes.`,d.position.start.line):["title","description","icon","sidebarTitle","mode","keywords","og:title","og:description","og:image"].includes(L)||n("frontmatter-review","warning",t,`Frontmatter ${L} is preserved; verify its behavior in Velu.`,d.position.start.line)}}catch(w){n("frontmatter-syntax","error",t,w.message,d.position.start.line)}if(["link","image","definition"].includes(d.type)&&d.url){let w=g(d.url);if(w!==d.url){let L=d.position.start.offset,B=e.slice(L,d.position.end.offset).lastIndexOf(d.url);B>=0&&m(L+B,L+B+d.url.length,w)}}if(!["mdxJsxFlowElement","mdxJsxTextElement"].includes(d.type)||!d.name)return;let h=d.name,S=d.position.start.line;if(s.has(h.split(".")[0]))return;y.add(h);let O=gt[h]?"Callout":["ParamField","ResponseField"].includes(h)?"Field":h==="Expandable"?"Accordion":h;if(O!==h&&s.has(O)){n("component-name-conflict","error",t,`Cannot convert <${h}> to <${O}> because that name is already locally defined. Rename the local binding before migration.`,S);return}let A=d.attributes.filter(w=>w.type==="mdxJsxAttribute"),x=(w,L)=>{let P=A.find(B=>B.name===w);P&&!A.some(B=>B.name===L)&&m(P.position.start.offset,P.position.start.offset+w.length,L)};if(h==="ParamField")for(let w of["body","query","path","header","cookie"])x(w,"name");if(h==="CardGroup"&&x("cols","limit"),h==="Accordion"&&x("default-open","defaultOpen"),h==="Expandable"&&(x("title","title"),A.some(w=>w.name==="title")||m(d.position.start.offset+1+h.length,d.position.start.offset+1+h.length,' title="Details"')),O!==h){let w=d.position.start.offset;m(w+1,w+1+h.length,O+(gt[h]?` type="${gt[h]}"`:""));let L=d.position.end.offset,P=new RegExp(`</${h}\\s*>$`).exec(e.slice(w,L));P&&m(L-P[0].length+2,L-P[0].length+2+h.length,O)}po.has(h)?(u.add(h),n("component-adapter","warning",t,`<${h}> uses an editable React adapter. Review visual styling and optional props.`,S)):/^[A-Z]/.test(O)&&!fo.has(O)&&n("unsupported-component","error",t,`<${h}> needs a local component implementation or import.`,S);for(let w of A)if(["href","src"].includes(w.name)&&typeof w.value=="string"){let L=g(w.value);if(L!==w.value){let P=w.position.start.offset,ee=e.slice(P,w.position.end.offset).indexOf(w.value);ee>=0&&m(P+ee,P+ee+w.value.length,L)}}}),c.sort((d,h)=>h.start-d.start||h.end-d.end);let b=e;for(let d of c)b=b.slice(0,d.start)+d.value+b.slice(d.end);if(u.size){let d=q.posix.relative(q.posix.dirname(r.get(t)||t),ge);b+=`
4
4
 
5
5
  import { ${[...u].sort().join(", ")} } from ${JSON.stringify(d.startsWith(".")?d:"./"+d)};
6
- `}try{await so(b,{remarkPlugins:[ln,ao,cn]})}catch(d){n("mdx-compile","error",t,d.reason||d.message,d.line)}return{text:b,adapters:[...u],components:[...y].sort(),assets:[...p]}}function fn(e,t,r){let n=[[/\b(?:window|globalThis)\s*(?:\?\.)?\s*\.?(?:mintlify|\[\s*['"]mintlify['"]\s*\])|mintlify:user/,"mintlify-browser-api","error","Mintlify browser APIs/events need a Velu implementation; script preserved without inventing an API mapping."],[/__NEXT_DATA__|next\/router|next\/navigation|routeChangeComplete|next-route-announcer/,"next-runtime","error","Script depends on Next.js internals; adapt it to Velu\u2019s React Router runtime."],[/DOMContentLoaded|\bwindow\.onload\b|addEventListener\(\s*['"]load['"]/,"script-lifecycle","warning","Script loads after hydration; use document.readyState or an immediate initializer when DOMContentLoaded/load has already fired."],[/\brequire\s*\(|\bmodule\.exports|\bprocess\.env|from\s*['"]node:/,"node-script","error","This .js file is auto-loaded in the browser but contains Node.js constructs. Move tooling outside the docs content root or use .cjs/.mjs."],[/(?:^|\n)\s*(?:import\s|export\s)/,"module-script","error","Auto-loaded JavaScript uses classic scripts. Bundle ES modules for the browser or move them to explicitly imported .jsx/.mjs modules."],[/document\.querySelector|document\.getElementById|MutationObserver/,"script-dom","warning","Verify DOM hooks and behavior after client-side navigation; scripts execute once per full page load."]];for(let[o,i,a,s]of n){let l=o.exec(e);l&&r(i,a,t,s,e.slice(0,l.index).split(`
7
- `).length)}}function mn(e,t,r){let n=JSON.parse(e),o=!1,i=!1,a=[];for(let[s,l]of Object.entries(n.scripts||{})){if(typeof l!="string"||!/\b(?:mint|mintlify)\b/.test(l))continue;i=!0;let c=/^(?:(?:npx(?: --no-install)?|yarn|pnpm(?: exec)?|bunx)\s+)?(?:mint|mintlify)\s+(dev|validate|version|v|update)\s*$/.exec(l.trim());if(c){let u=`velu ${c[1]==="v"?"version":c[1]}`;n.scripts[s]=u,o=!0,a.push({name:s,action:"converted",from:l,to:u})}else a.push({name:s,action:"preserved",from:l}),r("npm-script","warning",`package.json:scripts.${s}`,"Mintlify command/flags or compound shell script has no verified equivalent. Original retained; update manually.")}for(let s of["dependencies","devDependencies","optionalDependencies"])Object.keys(n[s]||{}).some(l=>["mint","mintlify","@mintlify/cli"].includes(l))&&(i=!0);return i&&!n.dependencies?.["@veluai/velu"]&&!n.devDependencies?.["@veluai/velu"]&&(n.devDependencies={...n.devDependencies,"@veluai/velu":`^${t}`},o=!0),i&&r("package-install","warning","package.json","Run your package manager in the migrated directory to refresh its lockfile. Mintlify dependencies remain for scripts that still need them; remove them after review."),{text:o?JSON.stringify(n,null,2)+`
8
- `:e,scripts:a}}function dn(e,t,r,n){let o;try{o=co(e,{sourceType:"unambiguous",plugins:["jsx",.../\.[cm]?tsx?$/.test(t)?["typescript"]:[]]})}catch(l){return n("module-syntax","error",t,l.message,l.loc?.line),e}let i=[],a=new Set,s=l=>{if(!l||typeof l!="object")return;let c=["ImportDeclaration","ExportNamedDeclaration","ExportAllDeclaration"].includes(l.type)?l.source:l.type==="CallExpression"&&(l.callee?.type==="Import"||l.callee?.name==="require")?l.arguments?.[0]:null;if(c?.type==="StringLiteral"&&!a.has(c.start)){a.add(c.start);let u=c.value;if(u.startsWith(".")||u.startsWith("/")){let p=q.posix.normalize(u.startsWith("/")?u.slice(1):q.posix.join(q.posix.dirname(t),u)),y=r.get(p);if(y){let m=q.posix.relative(q.posix.dirname(r.get(t)||t),y),g=m.startsWith(".")?m:"./"+m;u!==g&&i.push({start:c.start,end:c.end,value:JSON.stringify(g)})}else n("missing-import","error",t,`Local module import missing or ignored: ${u}`,c.loc?.start.line)}}for(let[u,p]of Object.entries(l))["loc","comments","tokens","extra"].includes(u)||(Array.isArray(p)?p.forEach(s):p&&typeof p=="object"&&s(p))};s(o.program);for(let l of i.sort((c,u)=>u.start-c.start))e=e.slice(0,l.start)+l.value+e.slice(l.end);return e}function gn(e,t,r,n){let o;try{o=uo.parse(e,{from:t})}catch(s){return n("css-syntax","error",t,s.reason||s.message,s.line),e}let i=new Set,a;return o.walkRules(s=>{for(let l of s.selector.matchAll(/#(?:content|navbar|sidebar(?:-content)?|navigation-items|page-title|header|footer|table-of-contents)(?![\w-])/g))i.add(l[0]),a??=s.source?.start?.line}),i.size&&n("css-dom","warning",t,`Styles target renderer structure (${[...i].join(", ")}). Selectors are preserved, but matching elements and their nesting can differ in Velu; compare page headers, sidebars, API pages, and mobile layouts in the browser.`,a),o.walkDecls(s=>{s.value=s.value.replace(/url\(\s*(?:"([^"\\]*)"|'([^'\\]*)'|([^)'"\\\s]*))\s*\)/gi,(l,c,u,p)=>{let y=c??u??p;if(!y||/^(?:[a-z][a-z0-9+.-]*:|\/|#)/i.test(y))return l;let m=/^([^?#]*)(.*)$/.exec(y),g=q.posix.normalize(q.posix.join(q.posix.dirname(t),m[1]));return r.has(g)?`url("${"/"+r.get(g).split("/").map(encodeURIComponent).join("/")+m[2]}")`:(n("css-missing-asset","error",t,`CSS asset missing or ignored: ${y}`,s.source?.start?.line),l)})}),o.walkAtRules("import",s=>n("css-import","warning",t,"Custom CSS files are included globally. Check @import for duplicate styles and loading order.",s.source?.start?.line)),o.toString()}var ge,gt,po,fo,ht,hn=P(()=>{De();Be();ge="snippets/velu-mintlify-compat.jsx",gt={Note:"note",Tip:"tip",Warning:"warning",Info:"info",Check:"check",Danger:"danger"},po=new Set(["Tabs","Tab","Frame","Tooltip","Badge","Button","Panel"]),fo=new Set(te),ht=`import React from 'react';
6
+ `}try{await so(b,{remarkPlugins:[cn,ao,un]})}catch(d){n("mdx-compile","error",t,d.reason||d.message,d.line)}return{text:b,adapters:[...u],components:[...y].sort(),assets:[...p]}}function mn(e,t,r){let n=[[/\b(?:window|globalThis)\s*(?:\?\.)?\s*\.?(?:mintlify|\[\s*['"]mintlify['"]\s*\])|mintlify:user/,"mintlify-browser-api","error","Mintlify browser APIs/events need a Velu implementation; script preserved without inventing an API mapping."],[/__NEXT_DATA__|next\/router|next\/navigation|routeChangeComplete|next-route-announcer/,"next-runtime","error","Script depends on Next.js internals; adapt it to Velu\u2019s React Router runtime."],[/DOMContentLoaded|\bwindow\.onload\b|addEventListener\(\s*['"]load['"]/,"script-lifecycle","warning","Script loads after hydration; use document.readyState or an immediate initializer when DOMContentLoaded/load has already fired."],[/\brequire\s*\(|\bmodule\.exports|\bprocess\.env|from\s*['"]node:/,"node-script","error","This .js file is auto-loaded in the browser but contains Node.js constructs. Move tooling outside the docs content root or use .cjs/.mjs."],[/(?:^|\n)\s*(?:import\s|export\s)/,"module-script","error","Auto-loaded JavaScript uses classic scripts. Bundle ES modules for the browser or move them to explicitly imported .jsx/.mjs modules."],[/document\.querySelector|document\.getElementById|MutationObserver/,"script-dom","warning","Verify DOM hooks and behavior after client-side navigation; scripts execute once per full page load."]];for(let[o,i,a,s]of n){let l=o.exec(e);l&&r(i,a,t,s,e.slice(0,l.index).split(`
7
+ `).length)}}function dn(e,t,r){let n=JSON.parse(e),o=!1,i=!1,a=[];for(let[s,l]of Object.entries(n.scripts||{})){if(typeof l!="string"||!/\b(?:mint|mintlify)\b/.test(l))continue;i=!0;let c=/^(?:(?:npx(?: --no-install)?|yarn|pnpm(?: exec)?|bunx)\s+)?(?:mint|mintlify)\s+(dev|validate|version|v|update)\s*$/.exec(l.trim());if(c){let u=`velu ${c[1]==="v"?"version":c[1]}`;n.scripts[s]=u,o=!0,a.push({name:s,action:"converted",from:l,to:u})}else a.push({name:s,action:"preserved",from:l}),r("npm-script","warning",`package.json:scripts.${s}`,"Mintlify command/flags or compound shell script has no verified equivalent. Original retained; update manually.")}for(let s of["dependencies","devDependencies","optionalDependencies"])Object.keys(n[s]||{}).some(l=>["mint","mintlify","@mintlify/cli"].includes(l))&&(i=!0);return i&&!n.dependencies?.["@veluai/velu"]&&!n.devDependencies?.["@veluai/velu"]&&(n.devDependencies={...n.devDependencies,"@veluai/velu":`^${t}`},o=!0),i&&r("package-install","warning","package.json","Run your package manager in the migrated directory to refresh its lockfile. Mintlify dependencies remain for scripts that still need them; remove them after review."),{text:o?JSON.stringify(n,null,2)+`
8
+ `:e,scripts:a}}function gn(e,t,r,n){let o;try{o=co(e,{sourceType:"unambiguous",plugins:["jsx",.../\.[cm]?tsx?$/.test(t)?["typescript"]:[]]})}catch(l){return n("module-syntax","error",t,l.message,l.loc?.line),e}let i=[],a=new Set,s=l=>{if(!l||typeof l!="object")return;let c=["ImportDeclaration","ExportNamedDeclaration","ExportAllDeclaration"].includes(l.type)?l.source:l.type==="CallExpression"&&(l.callee?.type==="Import"||l.callee?.name==="require")?l.arguments?.[0]:null;if(c?.type==="StringLiteral"&&!a.has(c.start)){a.add(c.start);let u=c.value;if(u.startsWith(".")||u.startsWith("/")){let p=q.posix.normalize(u.startsWith("/")?u.slice(1):q.posix.join(q.posix.dirname(t),u)),y=r.get(p);if(y){let m=q.posix.relative(q.posix.dirname(r.get(t)||t),y),g=m.startsWith(".")?m:"./"+m;u!==g&&i.push({start:c.start,end:c.end,value:JSON.stringify(g)})}else n("missing-import","error",t,`Local module import missing or ignored: ${u}`,c.loc?.start.line)}}for(let[u,p]of Object.entries(l))["loc","comments","tokens","extra"].includes(u)||(Array.isArray(p)?p.forEach(s):p&&typeof p=="object"&&s(p))};s(o.program);for(let l of i.sort((c,u)=>u.start-c.start))e=e.slice(0,l.start)+l.value+e.slice(l.end);return e}function hn(e,t,r,n){let o;try{o=uo.parse(e,{from:t})}catch(s){return n("css-syntax","error",t,s.reason||s.message,s.line),e}let i=new Set,a;return o.walkRules(s=>{for(let l of s.selector.matchAll(/#(?:content|navbar|sidebar(?:-content)?|navigation-items|page-title|header|footer|table-of-contents)(?![\w-])/g))i.add(l[0]),a??=s.source?.start?.line}),i.size&&n("css-dom","warning",t,`Styles target renderer structure (${[...i].join(", ")}). Selectors are preserved, but matching elements and their nesting can differ in Velu; compare page headers, sidebars, API pages, and mobile layouts in the browser.`,a),o.walkDecls(s=>{s.value=s.value.replace(/url\(\s*(?:"([^"\\]*)"|'([^'\\]*)'|([^)'"\\\s]*))\s*\)/gi,(l,c,u,p)=>{let y=c??u??p;if(!y||/^(?:[a-z][a-z0-9+.-]*:|\/|#)/i.test(y))return l;let m=/^([^?#]*)(.*)$/.exec(y),g=q.posix.normalize(q.posix.join(q.posix.dirname(t),m[1]));return r.has(g)?`url("${"/"+r.get(g).split("/").map(encodeURIComponent).join("/")+m[2]}")`:(n("css-missing-asset","error",t,`CSS asset missing or ignored: ${y}`,s.source?.start?.line),l)})}),o.walkAtRules("import",s=>n("css-import","warning",t,"Custom CSS files are included globally. Check @import for duplicate styles and loading order.",s.source?.start?.line)),o.toString()}var ge,gt,po,fo,ht,yn=_(()=>{Je();De();ge="snippets/velu-mintlify-compat.jsx",gt={Note:"note",Tip:"tip",Warning:"warning",Info:"info",Check:"check",Danger:"danger"},po=new Set(["Tabs","Tab","Frame","Tooltip","Badge","Button","Panel"]),fo=new Set(te),ht=`import React from 'react';
9
9
  export function Tabs({ children, defaultIndex = 0 }) {
10
10
  const tabs = React.Children.toArray(children).filter(React.isValidElement);
11
11
  const [active, setActive] = React.useState(defaultIndex);
@@ -30,7 +30,7 @@ export function Tooltip({children,tip}) { return <span title={typeof tip === 'st
30
30
  export function Badge({children,color,className=''}) { return <span data-component="badge" className={className} style={{border:'1px solid currentColor',borderRadius:'1rem',padding:'.1rem .5rem',color}}>{children}</span>; }
31
31
  export function Button({children,href,variant,size,icon,iconType,...props}) { return href ? <a href={href} {...props}>{children}</a> : <button type="button" {...props}>{children}</button>; }
32
32
  export function Panel({children}) { return <aside data-component="panel">{children}</aside>; }
33
- `});import mo from"github-slugger";import go from"iso-639-1";function yo(e){let t=String(e).toLowerCase();return go.getNativeName(t)||e}function Je(e){return new mo().slug(String(e??""))}function vo(e){let t=String(e).replace(/^\/+|\/+$/g,"").split("/").filter(Boolean);return t[t.length-1]==="index"&&t.pop(),"/"+t.join("/")}function yt(e){let t=String(e).split("#")[0].split("?")[0];try{t=decodeURI(t)}catch{}return t.startsWith("/")||(t="/"+t),t.length>1&&(t=t.replace(/\/+$/,"")),t||"/"}function X(e){let t={kind:"root",children:ke(e??{})};return bn(t.children),t}function ke(e){let t=Array.isArray(e.anchors)?e.anchors.map(So):[];if(Array.isArray(e.products))return[...t,...e.products.map(bo)];if(Array.isArray(e.versions))return[...t,...e.versions.map(xo)];if(Array.isArray(e.languages))return[...t,...e.languages.map(wo)];if(Array.isArray(e.tabs))return[...t,...e.tabs.map($o)];let r=[...t];return Array.isArray(e.groups)&&r.push(...e.groups.map(yn)),Array.isArray(e.pages)&&r.push(...e.pages.map(vn)),r}function bo(e){return{kind:"product",label:e.name??e.product,slug:Je(e.product),icon:e.icon,color:e.color,default:!!e.default,children:ke(e)}}function xo(e){return{kind:"version",label:e.version,slug:Je(e.version),default:!!e.default,children:ke(e)}}function wo(e){let t=String(e.language);return{kind:"language",code:t,label:yo(t),slug:Je(t),default:!!e.default,children:ke(e)}}function $o(e){return{kind:"tab",label:e.tab,slug:Je(e.tab),icon:e.icon,href:e.href,children:ke(e)}}function So(e){return{kind:"anchor",label:e.anchor,icon:e.icon,href:e.href,color:e.color}}function yn(e){let t=(e.pages??[]).map(vn);return e.root&&t.unshift({kind:"page",pagePath:e.root}),{kind:"group",label:e.group,icon:e.icon,expanded:!!e.expanded,root:e.root,children:t}}function vn(e){return typeof e=="string"?{kind:"page",pagePath:e}:e&&e.apiPage?{kind:"page",pagePath:e.apiPage,label:e.label,method:e.method,api:!0}:yn(e)}function bn(e){for(let t of ho){let r=e.filter(n=>n.kind===t);r.length&&!r.some(n=>n.default)&&(r[0].default=!0)}for(let t of e)t.children&&bn(t.children)}function ne(e){let t=[],r=(n,o,i)=>{if(n.kind==="page"){t.push({pagePath:n.pagePath,url:ko(n.pagePath,o),ctx:{...o},ancestors:i,node:n});return}let a=o;n.kind==="product"?a={...o,product:n.default?null:n.slug}:n.kind==="version"?a={...o,version:n.default?null:n.slug}:n.kind==="language"&&(a={...o,language:n.default?null:n.slug});let s=n.kind==="root"?i:[...i,n];for(let l of n.children??[])r(l,a,s)};return r(e,{product:null,version:null,language:null},[]),t}function ko(e,t){let r=[t.product,t.version,t.language].filter(Boolean),n=vo(e).split("/").filter(Boolean);return"/"+[...r,...n].join("/")}var ho,re=P(()=>{ho=["product","version","language"]});function jo(e,t){let r=t.slice(2).split("/").filter(o=>o!=="").map(o=>decodeURIComponent(o).replace(/~1/g,"/").replace(/~0/g,"~")),n=e;for(let o of r){if(n==null||typeof n!="object")return;n=n[o]}return n}function xn(e){let t=new Map;function r(n){if(n==null||typeof n!="object")return n;if(t.has(n))return t.get(n);if(typeof n.$ref=="string"){let i=n.$ref;if(!i.startsWith("#/"))throw new Error(`external $ref "${i}" is not supported in the instant preview \u2014 inline it or use a single-file spec`);let a=jo(e,i);if(a===void 0)throw new Error(`$ref "${i}" does not resolve`);let s=r(a);return t.set(n,s),s}let o=Array.isArray(n)?[]:{};t.set(n,o);for(let[i,a]of Object.entries(n))o[i]=r(a);return o}return r(e)}var wn=P(()=>{});function ce(e){return!e||typeof e!="object"?e||{}:Array.isArray(e.allOf)?e.allOf.reduce((t,r)=>{let n=ce(r);return{...t,...n,properties:{...t.properties||{},...n.properties||{}},required:[...t.required||[],...n.required||[]]}},{...e,allOf:void 0}):Array.isArray(e.oneOf)&&e.oneOf.length?ce(e.oneOf[0]):Array.isArray(e.anyOf)&&e.anyOf.length?ce(e.anyOf[0]):e}function je(e){let t=ce(e);if(!t||typeof t!="object")return"any";if(Array.isArray(t.enum)&&t.enum.length)return`enum<${typeof t.enum[0]}>`;if(t.type==="array")return`${je(t.items||{})}[]`;let r=t.type||(t.properties?"object":"any");return t.format?`${r}<${t.format}>`:r}function he(e,t=0){let r=ce(e);if(!r||typeof r!="object")return null;if(r.example!==void 0)return r.example;if(r.default!==void 0)return r.default;if(Array.isArray(r.enum)&&r.enum.length)return r.enum[0];if(t>=6)return r.type==="object"?{}:null;switch(r.type){case"object":{let n={};for(let[o,i]of Object.entries(r.properties||{}))n[o]=he(i,t+1);return n}case"array":return[he(r.items||{},t+1)];case"integer":case"number":return 0;case"boolean":return!0;default:return Oo(r)}}function Oo(e){switch(e.format){case"date-time":return"2024-01-01T00:00:00Z";case"date":return"2024-01-01";case"email":return"user@example.com";case"uuid":return"3fa85f64-5717-4562-b3fc-2c963f66afa6";case"uri":case"url":return"https://example.com";default:return"<string>"}}function vt(e){let t=ce(e);if(!t||t.type!=="object"||!t.properties)return t&&(t.type||t.items)?[{name:"body",type:je(t),required:!1,description:t.description||""}]:[];let r=new Set(t.required||[]);return Object.entries(t.properties).map(([n,o])=>{let i=ce(o);return{name:n,type:je(i),required:r.has(n),description:i.description||"",enum:Array.isArray(i.enum)?i.enum:void 0,deprecated:i.deprecated||void 0}})}function To(e){let t=e.schema||{};return{name:e.name,in:e.in,required:e.in==="path"?!0:!!e.required,type:je(t),description:e.description||"",enum:Array.isArray(t.enum)?t.enum:void 0,example:he(t),deprecated:e.deprecated||void 0}}function Sn(e){if(!e||typeof e!="object")return null;let t=Object.keys(e),r=t.find(n=>/json/i.test(n))||t[0];return r?{contentType:r,media:e[r]}:null}function Eo(e){if(!e)return null;let t=Sn(e.content);if(!t)return null;let r=t.media.schema||{};return{required:!!e.required,description:e.description||"",contentType:t.contentType,fields:vt(r),example:t.media.example??he(r)}}function Co(e){return!e||typeof e!="object"?[]:Object.entries(e).map(([t,r])=>{let n=Sn(r?.content),o=n?.media?.schema||{};return{status:t,description:r?.description||"",contentType:n?.contentType||null,fields:n?vt(o):[],example:n?n.media.example??he(o):null}})}function Lo(e,t){if(!Array.isArray(e)||!t)return[];let r=[],n=new Set;for(let o of e)for(let i of Object.keys(o||{})){let a=t[i];!a||n.has(i)||(n.add(i),r.push(_o(i,a)))}return r.filter(Boolean)}function _o(e,t){return t.type==="http"&&/bearer/i.test(t.scheme||"")?{name:"Authorization",in:"header",required:!0,type:"string",prefix:"Bearer",description:t.description||"Bearer authentication token."}:t.type==="http"&&/basic/i.test(t.scheme||"")?{name:"Authorization",in:"header",required:!0,type:"string",prefix:"Basic",description:t.description||"Basic authentication credentials."}:t.type==="apiKey"?{name:t.name||e,in:t.in||"header",required:!0,type:"string",description:t.description||"API key."}:t.type==="oauth2"||t.type==="openIdConnect"?{name:"Authorization",in:"header",required:!0,type:"string",prefix:"Bearer",description:t.description||"OAuth 2.0 access token."}:{name:e,in:"header",required:!0,type:"string",description:t.description||""}}function $n(e){return String(e).replace(/\{[^}]+\}/g,t=>t.slice(1,-1)).replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Po(e){let{method:t,path:r,op:n,sharedParams:o,servers:i,schemes:a}=e,s=[...o||[],...n.parameters||[]],l={path:[],query:[],header:[],cookie:[]};for(let u of s)u&&l[u.in]&&l[u.in].push(To(u));let c=n.security??e.globalSecurity;return{id:n.operationId?$n(n.operationId):`${t}-${$n(r)}`,method:t.toUpperCase(),path:r,title:n.summary||n.operationId||`${t.toUpperCase()} ${r}`,description:n.description||n.summary||"",tags:Array.isArray(n.tags)&&n.tags.length?n.tags:["API"],deprecated:n.deprecated||!1,auth:Lo(c,a),parameters:l,body:Eo(n.requestBody),responses:Co(n.responses),servers:(i||[]).map(u=>u.url).filter(Boolean)}}function Ro(e,t,r,n,o,i,a){let s={};e.openapi?s.openapi=e.openapi:e.swagger?s.swagger=e.swagger:s.openapi="3.0.0",s.info=e.info||{title:"API Reference",version:"1.0.0"};let l=(n.servers||i||[]).filter(Boolean);l.length&&(s.servers=l);let c={};Array.isArray(o)&&o.length&&(c.parameters=o),c[r]=n,s.paths={[t]:c};let u=n.security??e.security;if(a&&Array.isArray(u)&&u.length){let p={};for(let y of u)for(let m of Object.keys(y||{}))a[m]&&(p[m]=a[m]);Object.keys(p).length&&(e.swagger?s.securityDefinitions=p:s.components={securitySchemes:p})}return s}function kn(e){let t=[],r=[],n=e.components?.securitySchemes||e.securityDefinitions||{},o=e.security||[],i=e.servers||(e.host?[{url:`https://${e.host}${e.basePath||""}`}]:[]);for(let[a,s]of Object.entries(e.paths||{})){if(!s||typeof s!="object")continue;let l=s.parameters||[],c=s.servers||i;for(let u of Ao){let p=s[u];!p||typeof p!="object"||(t.push(Po({method:u,path:a,op:p,sharedParams:l,servers:p.servers||c,globalSecurity:o,schemes:n})),r.push(Ro(e,a,u,p,l,p.servers||c,n)))}}return{operations:t,segments:r}}function Ae(e){let t=e.servers||(e.host?[{url:`https://${e.host}${e.basePath||""}`}]:[]),{operations:r,segments:n}=kn(e);return{title:e.info?.title||"API Reference",version:e.info?.version||"",servers:t.map(o=>o.url).filter(Boolean),operations:r,segments:n}}var Ao,qe=P(()=>{Ao=["get","post","put","patch","delete","options","head","trace"]});function Uo(e,{server:t}={}){let n=`${(t||e.servers?.[0]||"").replace(/\/+$/,"")}${e.path}`,o={};for(let a of e.auth||[])a.in==="header"&&(o[a.name]=a.prefix?`${a.prefix} <token>`:"<token>");for(let a of e.parameters?.header||[])o[a.name]||(o[a.name]=String(a.example??`<${a.type}>`));let i=!!e.body;return i&&(o["Content-Type"]=e.body.contentType||"application/json"),{method:e.method,url:n,headers:o,body:i?e.body.example??{}:null}}function No(e){let t=`curl --request ${e.method} \\
33
+ `});import mo from"github-slugger";import go from"iso-639-1";function yo(e){let t=String(e).toLowerCase();return go.getNativeName(t)||e}function qe(e){return new mo().slug(String(e??""))}function vo(e){let t=String(e).replace(/^\/+|\/+$/g,"").split("/").filter(Boolean);return t[t.length-1]==="index"&&t.pop(),"/"+t.join("/")}function yt(e){let t=String(e).split("#")[0].split("?")[0];try{t=decodeURI(t)}catch{}return t.startsWith("/")||(t="/"+t),t.length>1&&(t=t.replace(/\/+$/,"")),t||"/"}function X(e){let t={kind:"root",children:ke(e??{})};return xn(t.children),t}function ke(e){let t=Array.isArray(e.anchors)?e.anchors.map(So):[];if(Array.isArray(e.products))return[...t,...e.products.map(bo)];if(Array.isArray(e.versions))return[...t,...e.versions.map(xo)];if(Array.isArray(e.languages))return[...t,...e.languages.map(wo)];if(Array.isArray(e.tabs))return[...t,...e.tabs.map($o)];let r=[...t];return Array.isArray(e.groups)&&r.push(...e.groups.map(vn)),Array.isArray(e.pages)&&r.push(...e.pages.map(bn)),r}function bo(e){return{kind:"product",label:e.name??e.product,slug:qe(e.product),icon:e.icon,color:e.color,default:!!e.default,children:ke(e)}}function xo(e){return{kind:"version",label:e.version,slug:qe(e.version),default:!!e.default,children:ke(e)}}function wo(e){let t=String(e.language);return{kind:"language",code:t,label:yo(t),slug:qe(t),default:!!e.default,children:ke(e)}}function $o(e){return{kind:"tab",label:e.tab,slug:qe(e.tab),icon:e.icon,href:e.href,children:ke(e)}}function So(e){return{kind:"anchor",label:e.anchor,icon:e.icon,href:e.href,color:e.color}}function vn(e){let t=(e.pages??[]).map(bn);return e.root&&t.unshift({kind:"page",pagePath:e.root}),{kind:"group",label:e.group,icon:e.icon,expanded:!!e.expanded,root:e.root,children:t}}function bn(e){return typeof e=="string"?{kind:"page",pagePath:e}:e&&e.apiPage?{kind:"page",pagePath:e.apiPage,label:e.label,method:e.method,api:!0}:vn(e)}function xn(e){for(let t of ho){let r=e.filter(n=>n.kind===t);r.length&&!r.some(n=>n.default)&&(r[0].default=!0)}for(let t of e)t.children&&xn(t.children)}function ne(e){let t=[],r=(n,o,i)=>{if(n.kind==="page"){t.push({pagePath:n.pagePath,url:ko(n.pagePath,o),ctx:{...o},ancestors:i,node:n});return}let a=o;n.kind==="product"?a={...o,product:n.default?null:n.slug}:n.kind==="version"?a={...o,version:n.default?null:n.slug}:n.kind==="language"&&(a={...o,language:n.default?null:n.slug});let s=n.kind==="root"?i:[...i,n];for(let l of n.children??[])r(l,a,s)};return r(e,{product:null,version:null,language:null},[]),t}function ko(e,t){let r=[t.product,t.version,t.language].filter(Boolean),n=vo(e).split("/").filter(Boolean);return"/"+[...r,...n].join("/")}var ho,re=_(()=>{ho=["product","version","language"]});function jo(e,t){let r=t.slice(2).split("/").filter(o=>o!=="").map(o=>decodeURIComponent(o).replace(/~1/g,"/").replace(/~0/g,"~")),n=e;for(let o of r){if(n==null||typeof n!="object")return;n=n[o]}return n}function wn(e){let t=new Map;function r(n){if(n==null||typeof n!="object")return n;if(t.has(n))return t.get(n);if(typeof n.$ref=="string"){let i=n.$ref;if(!i.startsWith("#/"))throw new Error(`external $ref "${i}" is not supported in the instant preview \u2014 inline it or use a single-file spec`);let a=jo(e,i);if(a===void 0)throw new Error(`$ref "${i}" does not resolve`);let s=r(a);return t.set(n,s),s}let o=Array.isArray(n)?[]:{};t.set(n,o);for(let[i,a]of Object.entries(n))o[i]=r(a);return o}return r(e)}var $n=_(()=>{});function ce(e){return!e||typeof e!="object"?e||{}:Array.isArray(e.allOf)?e.allOf.reduce((t,r)=>{let n=ce(r);return{...t,...n,properties:{...t.properties||{},...n.properties||{}},required:[...t.required||[],...n.required||[]]}},{...e,allOf:void 0}):Array.isArray(e.oneOf)&&e.oneOf.length?ce(e.oneOf[0]):Array.isArray(e.anyOf)&&e.anyOf.length?ce(e.anyOf[0]):e}function je(e){let t=ce(e);if(!t||typeof t!="object")return"any";if(Array.isArray(t.enum)&&t.enum.length)return`enum<${typeof t.enum[0]}>`;if(t.type==="array")return`${je(t.items||{})}[]`;let r=t.type||(t.properties?"object":"any");return t.format?`${r}<${t.format}>`:r}function he(e,t=0){let r=ce(e);if(!r||typeof r!="object")return null;if(r.example!==void 0)return r.example;if(r.default!==void 0)return r.default;if(Array.isArray(r.enum)&&r.enum.length)return r.enum[0];if(t>=6)return r.type==="object"?{}:null;switch(r.type){case"object":{let n={};for(let[o,i]of Object.entries(r.properties||{}))n[o]=he(i,t+1);return n}case"array":return[he(r.items||{},t+1)];case"integer":case"number":return 0;case"boolean":return!0;default:return Oo(r)}}function Oo(e){switch(e.format){case"date-time":return"2024-01-01T00:00:00Z";case"date":return"2024-01-01";case"email":return"user@example.com";case"uuid":return"3fa85f64-5717-4562-b3fc-2c963f66afa6";case"uri":case"url":return"https://example.com";default:return"<string>"}}function vt(e){let t=ce(e);if(!t||t.type!=="object"||!t.properties)return t&&(t.type||t.items)?[{name:"body",type:je(t),required:!1,description:t.description||""}]:[];let r=new Set(t.required||[]);return Object.entries(t.properties).map(([n,o])=>{let i=ce(o);return{name:n,type:je(i),required:r.has(n),description:i.description||"",enum:Array.isArray(i.enum)?i.enum:void 0,deprecated:i.deprecated||void 0}})}function To(e){let t=e.schema||{};return{name:e.name,in:e.in,required:e.in==="path"?!0:!!e.required,type:je(t),description:e.description||"",enum:Array.isArray(t.enum)?t.enum:void 0,example:he(t),deprecated:e.deprecated||void 0}}function kn(e){if(!e||typeof e!="object")return null;let t=Object.keys(e),r=t.find(n=>/json/i.test(n))||t[0];return r?{contentType:r,media:e[r]}:null}function Eo(e){if(!e)return null;let t=kn(e.content);if(!t)return null;let r=t.media.schema||{};return{required:!!e.required,description:e.description||"",contentType:t.contentType,fields:vt(r),example:t.media.example??he(r)}}function Co(e){return!e||typeof e!="object"?[]:Object.entries(e).map(([t,r])=>{let n=kn(r?.content),o=n?.media?.schema||{};return{status:t,description:r?.description||"",contentType:n?.contentType||null,fields:n?vt(o):[],example:n?n.media.example??he(o):null}})}function Lo(e,t){if(!Array.isArray(e)||!t)return[];let r=[],n=new Set;for(let o of e)for(let i of Object.keys(o||{})){let a=t[i];!a||n.has(i)||(n.add(i),r.push(Po(i,a)))}return r.filter(Boolean)}function Po(e,t){return t.type==="http"&&/bearer/i.test(t.scheme||"")?{name:"Authorization",in:"header",required:!0,type:"string",prefix:"Bearer",description:t.description||"Bearer authentication token."}:t.type==="http"&&/basic/i.test(t.scheme||"")?{name:"Authorization",in:"header",required:!0,type:"string",prefix:"Basic",description:t.description||"Basic authentication credentials."}:t.type==="apiKey"?{name:t.name||e,in:t.in||"header",required:!0,type:"string",description:t.description||"API key."}:t.type==="oauth2"||t.type==="openIdConnect"?{name:"Authorization",in:"header",required:!0,type:"string",prefix:"Bearer",description:t.description||"OAuth 2.0 access token."}:{name:e,in:"header",required:!0,type:"string",description:t.description||""}}function Sn(e){return String(e).replace(/\{[^}]+\}/g,t=>t.slice(1,-1)).replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function _o(e){let{method:t,path:r,op:n,sharedParams:o,servers:i,schemes:a}=e,s=[...o||[],...n.parameters||[]],l={path:[],query:[],header:[],cookie:[]};for(let u of s)u&&l[u.in]&&l[u.in].push(To(u));let c=n.security??e.globalSecurity;return{id:n.operationId?Sn(n.operationId):`${t}-${Sn(r)}`,method:t.toUpperCase(),path:r,title:n.summary||n.operationId||`${t.toUpperCase()} ${r}`,description:n.description||n.summary||"",tags:Array.isArray(n.tags)&&n.tags.length?n.tags:["API"],deprecated:n.deprecated||!1,auth:Lo(c,a),parameters:l,body:Eo(n.requestBody),responses:Co(n.responses),servers:(i||[]).map(u=>u.url).filter(Boolean)}}function Ro(e,t,r,n,o,i,a){let s={};e.openapi?s.openapi=e.openapi:e.swagger?s.swagger=e.swagger:s.openapi="3.0.0",s.info=e.info||{title:"API Reference",version:"1.0.0"};let l=(n.servers||i||[]).filter(Boolean);l.length&&(s.servers=l);let c={};Array.isArray(o)&&o.length&&(c.parameters=o),c[r]=n,s.paths={[t]:c};let u=n.security??e.security;if(a&&Array.isArray(u)&&u.length){let p={};for(let y of u)for(let m of Object.keys(y||{}))a[m]&&(p[m]=a[m]);Object.keys(p).length&&(e.swagger?s.securityDefinitions=p:s.components={securitySchemes:p})}return s}function jn(e){let t=[],r=[],n=e.components?.securitySchemes||e.securityDefinitions||{},o=e.security||[],i=e.servers||(e.host?[{url:`https://${e.host}${e.basePath||""}`}]:[]);for(let[a,s]of Object.entries(e.paths||{})){if(!s||typeof s!="object")continue;let l=s.parameters||[],c=s.servers||i;for(let u of Ao){let p=s[u];!p||typeof p!="object"||(t.push(_o({method:u,path:a,op:p,sharedParams:l,servers:p.servers||c,globalSecurity:o,schemes:n})),r.push(Ro(e,a,u,p,l,p.servers||c,n)))}}return{operations:t,segments:r}}function Ae(e){let t=e.servers||(e.host?[{url:`https://${e.host}${e.basePath||""}`}]:[]),{operations:r,segments:n}=jn(e);return{title:e.info?.title||"API Reference",version:e.info?.version||"",servers:t.map(o=>o.url).filter(Boolean),operations:r,segments:n}}var Ao,Ge=_(()=>{Ao=["get","post","put","patch","delete","options","head","trace"]});function Uo(e,{server:t}={}){let n=`${(t||e.servers?.[0]||"").replace(/\/+$/,"")}${e.path}`,o={};for(let a of e.auth||[])a.in==="header"&&(o[a.name]=a.prefix?`${a.prefix} <token>`:"<token>");for(let a of e.parameters?.header||[])o[a.name]||(o[a.name]=String(a.example??`<${a.type}>`));let i=!!e.body;return i&&(o["Content-Type"]=e.body.contentType||"application/json"),{method:e.method,url:n,headers:o,body:i?e.body.example??{}:null}}function No(e){let t=`curl --request ${e.method} \\
34
34
  --url ${e.url}`;for(let[r,n]of Object.entries(e.headers))t+=` \\
35
35
  --header '${r}: ${n}'`;return e.body!=null&&(t+=` \\
36
36
  --data '${JSON.stringify(e.body)}'`),t}function Fo(e){let t=[` method: '${e.method}'`];if(Object.keys(e.headers).length){let r=Object.entries(e.headers).map(([n,o])=>` '${n}': '${o}'`).join(`,
@@ -43,14 +43,14 @@ ${r}
43
43
  ${n}
44
44
  }`)}let r=["url"];return e.body!=null&&(t.push(`payload = ${bt(e.body,"")}`),r.push("json=payload")),Object.keys(e.headers).length&&r.push("headers=headers"),t.push("",`response = requests.${e.method.toLowerCase()}(${r.join(", ")})`,"print(response.json())"),t.join(`
45
45
  `)}function Mo(e){let t=e.method.charAt(0)+e.method.slice(1).toLowerCase(),r=["require 'net/http'","require 'json'","",`uri = URI("${e.url}")`,"http = Net::HTTP.new(uri.host, uri.port)","http.use_ssl = true",`request = Net::HTTP::${t}.new(uri)`];for(let[n,o]of Object.entries(e.headers))r.push(`request['${n}'] = '${o}'`);return e.body!=null&&r.push(`request.body = ${bt(e.body,"")}.to_json`),r.push("","response = http.request(request)","puts response.body"),r.join(`
46
- `)}function Ge(e,{server:t,languages:r=xt}={}){let n=Uo(e,{server:t});return r.filter(o=>jn[o]).map(o=>({key:o,label:zo[o],language:Vo[o],code:jn[o](n)}))}var bt,jn,zo,Vo,xt,wt=P(()=>{bt=(e,t)=>JSON.stringify(e,null,2).split(`
46
+ `)}function We(e,{server:t,languages:r=xt}={}){let n=Uo(e,{server:t});return r.filter(o=>An[o]).map(o=>({key:o,label:zo[o],language:Vo[o],code:An[o](n)}))}var bt,An,zo,Vo,xt,wt=_(()=>{bt=(e,t)=>JSON.stringify(e,null,2).split(`
47
47
  `).map((r,n)=>n===0?r:t+r).join(`
48
- `);jn={curl:No,javascript:Fo,python:Io,ruby:Mo},zo={curl:"cURL",javascript:"JavaScript",python:"Python",ruby:"Ruby"},Vo={curl:"bash",javascript:"javascript",python:"python",ruby:"ruby"},xt=["curl","javascript","python","ruby"]});function On(e){let t=e?.font?.family;return typeof t=="string"&&t.trim()?t.trim():e?.theme==="vepa"?"Inter":Do}function Tn(e){return e==="vepa"?"vepa":"velu"}function St({light:e,dark:t,family:r,theme:n,primary:o=e}){let i=n==="vepa"?Jo(o,t):"";return[":root:root {",` --accent-color: ${e};`,` --font-sans: "${r}", sans-serif;`,i,"}",':root:root[data-theme="dark"] {',` --accent-color: ${t};`,"}"].join(`
48
+ `);An={curl:No,javascript:Fo,python:Io,ruby:Mo},zo={curl:"cURL",javascript:"JavaScript",python:"Python",ruby:"Ruby"},Vo={curl:"bash",javascript:"javascript",python:"python",ruby:"ruby"},xt=["curl","javascript","python","ruby"]});function Tn(e){let t=e?.font?.family;return typeof t=="string"&&t.trim()?t.trim():e?.theme==="vepa"?"Inter":Do}function En(e){return e==="vepa"?"vepa":"velu"}function St({light:e,dark:t,family:r,theme:n,primary:o=e}){let i=n==="vepa"?Jo(o,t):"";return[":root:root {",` --accent-color: ${e};`,` --font-sans: "${r}", sans-serif;`,i,"}",':root:root[data-theme="dark"] {',` --accent-color: ${t};`,"}"].join(`
49
49
  `)}function Jo(e,t){let r=(s,l)=>{let c=/^#([\da-f]{3}|[\da-f]{6})$/i.exec(s||"")?.[1];return c||(c=l),c.length===3&&(c=[...c].map(u=>u+u).join("")),[0,2,4].map(u=>parseInt(c.slice(u,u+2),16))},n=r(e,"16a34a"),o=r(t,"4ade80"),i={50:250,100:245,200:229,300:212,400:163,500:115,600:82,700:64,800:38,900:23,950:10},a=.95/(.95+.6-.95*.6);return[...Object.entries(i).map(([s,l])=>` --vepa-gray-${s}: rgb(${n.map(c=>Math.round(c*(1-a)+l*a)).join(" ")});`),` --vepa-background-dark: rgb(${o.map((s,l)=>Math.round([9,9,11][l]*.98+s*.02)).join(" ")});`].join(`
50
- `)}function Oe(e){if(!e||typeof e!="object")return null;let t=[];if(e.socials&&typeof e.socials=="object")for(let[n,o]of Object.entries(e.socials))typeof o!="string"||!o.trim()||t.push({kind:Bo[n]??n,href:o.trim()});let r=Array.isArray(e.links)?e.links.filter(n=>n&&typeof n=="object").map(n=>({title:(n.header??n.title??"").trim(),items:(Array.isArray(n.items)?n.items:[]).filter(o=>o&&o.label).map(o=>({label:o.label,href:o.href??"#"}))})).filter(n=>n.title||n.items.length):[];return!t.length&&!r.length?null:{socials:t,links:r}}function $t(e){return/^(https?:)?\/\//.test(e)||/^(mailto|tel):/.test(e)}function Te(e){if(!e||typeof e!="object")return null;let t=(Array.isArray(e.links)?e.links:[]).filter(o=>o&&typeof o.href=="string"&&o.href.trim()).map(o=>({label:o.label??"",href:o.href.trim(),icon:o.icon??null,external:$t(o.href.trim())})),r=null,n=e.primary;if(n&&typeof n=="object"&&typeof n.href=="string"&&n.href.trim()){let o=n.href.trim();r=n.type==="github"?{kind:"github",label:n.label??"GitHub",href:o,external:$t(o)}:{kind:"button",label:n.label??"",href:o,external:$t(o)}}return!t.length&&!r?null:{links:t,primary:r}}function kt(e){if(e==null)return{options:[...An],display:"header"};if(typeof e!="object")return{options:[],display:"header"};let t=e.display==="toc"?"toc":"header",r=Array.isArray(e.options)?e.options:An,n=[];for(let o of r)typeof o=="string"?qo.has(o)&&n.push(o):o&&typeof o=="object"&&o.title&&o.href&&n.push({title:String(o.title),description:o.description?String(o.description):"",href:String(o.href),icon:typeof o.icon=="string"?o.icon:void 0});return{options:n,display:t}}function Y(e){if(!e||typeof e!="object")return{server:null,proxy:!0,languages:void 0};let t=e.playground||{};return{server:typeof e.server=="string"?e.server.trim():null,proxy:t.proxy!==!1&&t.display!=="none",languages:Array.isArray(e.examples?.languages)?e.examples.languages:void 0}}function Ee(e){if(!e||typeof e!="object")return null;let t=typeof e.apiBase=="string"&&e.apiBase.trim()?e.apiBase.trim().replace(/\/+$/,""):null,r=typeof e.host=="string"&&e.host.trim()?e.host.trim():null,n=Array.isArray(e.suggestions)?e.suggestions.filter(o=>typeof o=="string"&&o.trim()).map(o=>o.trim()).slice(0,6):[];return!t&&!n.length?null:{apiBase:t,host:r,suggestions:n}}var Bo,Do,qo,An,Ce=P(()=>{Bo={twitter:"x","x-twitter":"x"},Do="Google Sans Flex";qo=new Set(["copy","assistant","view","download-pdf","download-spec","chatgpt","claude","perplexity","grok","aistudio","devin","windsurf","mcp","add-mcp","cursor","vscode","devin-mcp"]),An=["copy","view","chatgpt","claude"]});import Go from"node:path";import En from"js-yaml";function Cn(e,t,r,n,o){let i=/^(?:\uFEFF)?---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(e);if(!i)return{text:e,converted:!1};let a;try{a=En.load(i[1])}catch{return{text:e,converted:!1}}if(typeof a?.openapi!="string")return{text:e,converted:!1};let s=/^(?:(.+?)\s+)?(GET|POST|PUT|PATCH|DELETE|OPTIONS|HEAD|TRACE)\s+(\/\S+)$/i.exec(a.openapi.trim());if(!s)return{text:e,converted:!1};let l=s[1]?[s[1]]:[].concat(n.openapi||n.api?.openapi||[]);if(l=l.map(u=>typeof u=="string"?u:u?.source).filter(Boolean),!l.length)return{text:e,converted:!1};let c=[];try{for(let d of l){if(/^[a-z][a-z0-9+.-]*:/i.test(d))throw new Error("Remote specs must be downloaded locally first.");let h=Go.posix.normalize(d.replace(/^\//,"")),S=r.get(h);if(!S)throw new Error(`Spec is missing or ignored: ${h}`);let T=/\.ya?ml$/i.test(h)?En.load(S.toString("utf8")):dt(S.toString("utf8"),h),A=Ae(xn(T));for(let x of A.operations)x.method===s[2].toUpperCase()&&x.path===s[3]&&c.push({operation:x,rel:h})}if(c.length!==1)throw new Error(`Expected exactly one matching operation; found ${c.length}.`);let{operation:u,rel:p}=c[0],y=Y(n.api),m=Ge(u,{server:y.server||u.servers?.[0],...y.languages?{languages:y.languages}:{}});if(/\bveluApi\b/.test(e))throw new Error("Reserved generated export name already used: veluApi");let b=`
50
+ `)}function Oe(e){if(!e||typeof e!="object")return null;let t=[];if(e.socials&&typeof e.socials=="object")for(let[n,o]of Object.entries(e.socials))typeof o!="string"||!o.trim()||t.push({kind:Bo[n]??n,href:o.trim()});let r=Array.isArray(e.links)?e.links.filter(n=>n&&typeof n=="object").map(n=>({title:(n.header??n.title??"").trim(),items:(Array.isArray(n.items)?n.items:[]).filter(o=>o&&o.label).map(o=>({label:o.label,href:o.href??"#"}))})).filter(n=>n.title||n.items.length):[];return!t.length&&!r.length?null:{socials:t,links:r}}function $t(e){return/^(https?:)?\/\//.test(e)||/^(mailto|tel):/.test(e)}function Te(e){if(!e||typeof e!="object")return null;let t=(Array.isArray(e.links)?e.links:[]).filter(o=>o&&typeof o.href=="string"&&o.href.trim()).map(o=>({label:o.label??"",href:o.href.trim(),icon:o.icon??null,external:$t(o.href.trim())})),r=null,n=e.primary;if(n&&typeof n=="object"&&typeof n.href=="string"&&n.href.trim()){let o=n.href.trim();r=n.type==="github"?{kind:"github",label:n.label??"GitHub",href:o,external:$t(o)}:{kind:"button",label:n.label??"",href:o,external:$t(o)}}return!t.length&&!r?null:{links:t,primary:r}}function kt(e){if(e==null)return{options:[...On],display:"header"};if(typeof e!="object")return{options:[],display:"header"};let t=e.display==="toc"?"toc":"header",r=Array.isArray(e.options)?e.options:On,n=[];for(let o of r)typeof o=="string"?qo.has(o)&&n.push(o):o&&typeof o=="object"&&o.title&&o.href&&n.push({title:String(o.title),description:o.description?String(o.description):"",href:String(o.href),icon:typeof o.icon=="string"?o.icon:void 0});return{options:n,display:t}}function Y(e){if(!e||typeof e!="object")return{server:null,proxy:!0,languages:void 0};let t=e.playground||{};return{server:typeof e.server=="string"?e.server.trim():null,proxy:t.proxy!==!1&&t.display!=="none",languages:Array.isArray(e.examples?.languages)?e.examples.languages:void 0}}function Ee(e){if(!e||typeof e!="object")return null;let t=typeof e.apiBase=="string"&&e.apiBase.trim()?e.apiBase.trim().replace(/\/+$/,""):null,r=typeof e.host=="string"&&e.host.trim()?e.host.trim():null,n=Array.isArray(e.suggestions)?e.suggestions.filter(o=>typeof o=="string"&&o.trim()).map(o=>o.trim()).slice(0,6):[];return!t&&!n.length?null:{apiBase:t,host:r,suggestions:n}}var Bo,Do,qo,On,Ce=_(()=>{Bo={twitter:"x","x-twitter":"x"},Do="Google Sans Flex";qo=new Set(["copy","assistant","view","download-pdf","download-spec","chatgpt","claude","perplexity","grok","aistudio","devin","windsurf","mcp","add-mcp","cursor","vscode","devin-mcp"]),On=["copy","view","chatgpt","claude"]});import Go from"node:path";import Cn from"js-yaml";function Ln(e,t,r,n,o){let i=/^(?:\uFEFF)?---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(e);if(!i)return{text:e,converted:!1};let a;try{a=Cn.load(i[1])}catch{return{text:e,converted:!1}}if(typeof a?.openapi!="string")return{text:e,converted:!1};let s=/^(?:(.+?)\s+)?(GET|POST|PUT|PATCH|DELETE|OPTIONS|HEAD|TRACE)\s+(\/\S+)$/i.exec(a.openapi.trim());if(!s)return{text:e,converted:!1};let l=s[1]?[s[1]]:[].concat(n.openapi||n.api?.openapi||[]);if(l=l.map(u=>typeof u=="string"?u:u?.source).filter(Boolean),!l.length)return{text:e,converted:!1};let c=[];try{for(let d of l){if(/^[a-z][a-z0-9+.-]*:/i.test(d))throw new Error("Remote specs must be downloaded locally first.");let h=Go.posix.normalize(d.replace(/^\//,"")),S=r.get(h);if(!S)throw new Error(`Spec is missing or ignored: ${h}`);let O=/\.ya?ml$/i.test(h)?Cn.load(S.toString("utf8")):dt(S.toString("utf8"),h),A=Ae(wn(O));for(let x of A.operations)x.method===s[2].toUpperCase()&&x.path===s[3]&&c.push({operation:x,rel:h})}if(c.length!==1)throw new Error(`Expected exactly one matching operation; found ${c.length}.`);let{operation:u,rel:p}=c[0],y=Y(n.api),m=We(u,{server:y.server||u.servers?.[0],...y.languages?{languages:y.languages}:{}});if(/\bveluApi\b/.test(e))throw new Error("Reserved generated export name already used: veluApi");let b=`
51
51
  export const veluApi = ${JSON.stringify({operation:u,samples:m,api:{proxy:y.proxy,server:y.server}})};
52
52
 
53
- ${e.slice(i[0].length)}`;return o("endpoint-snapshot","warning",t,`Generated the ${s[2].toUpperCase()} ${s[3]} playground from ${p}, preserving the page URL and body. This is an editable snapshot: regenerate after spec changes; review x-mint extensions and page-specific overrides.`),{text:e.slice(0,i[0].length)+b,converted:!0}}catch(u){return o("endpoint-conversion","error",t,`Could not migrate OpenAPI endpoint: ${u.message}`),{text:e,converted:!1}}}var Ln=P(()=>{wn();qe();wt();Ce();Be()});var Fn={};$e(Fn,{MIGRATE_HELP:()=>Pn,migrateMintlify:()=>Nn,parseMigrateArgs:()=>Rn,planMigration:()=>Un,runMigrate:()=>ei});import F from"node:fs";import z from"node:path";import{randomUUID as Wo,createHash as Ho}from"node:crypto";import Ko from"ignore";function Rn(e){if(e.includes("--help")||e.includes("-h"))return{help:!0};if(e.shift()!=="mintlify")throw new Error("Specify the source platform: velu migrate mintlify [source]");let t={},r=!1;for(let n=0;n<e.length;n++){let o=e[n];if(["--dry-run","--json","--strict"].includes(o))t[{"--dry-run":"dryRun","--json":"json","--strict":"strict"}[o]]=!0;else if(["--out","--config"].includes(o)){if(!e[n+1]||e[n+1].startsWith("--"))throw new Error(`${o} requires a value.`);if(t[o.slice(2)]!==void 0)throw new Error(`${o} was specified twice.`);t[o.slice(2)]=e[++n]}else{if(o.startsWith("-"))throw new Error(`Unknown migration option: ${o}`);if(r)throw new Error("Only one source directory may be specified. Use --out for the destination.");t.source=o,r=!0}}if(t.config&&!["docs.json","mint.json"].includes(t.config))throw new Error("--config must be docs.json or mint.json.");return t}function Zo(e,t){let r=z.resolve(t||`${e}-velu`),n=r,o=[];for(;!F.existsSync(n);){o.unshift(z.basename(n));let a=z.dirname(n);if(a===n)throw new Error("Cannot resolve destination parent.");n=a}let i=z.join(F.realpathSync(n),...o);if(le(e,i)||le(i,e))throw new Error("Destination must be outside the source directory and cannot be its ancestor.");if(F.existsSync(r))throw new Error("Destination already exists. Choose a new directory; migration never overwrites existing files.");return i}function Qo(e){let t=r=>String(r).replace(/\|/g,"\\|").replace(/[\r\n]+/g," ");return`# Mintlify \u2192 Velu migration
53
+ ${e.slice(i[0].length)}`;return o("endpoint-snapshot","warning",t,`Generated the ${s[2].toUpperCase()} ${s[3]} playground from ${p}, preserving the page URL and body. This is an editable snapshot: regenerate after spec changes; review x-mint extensions and page-specific overrides.`),{text:e.slice(0,i[0].length)+b,converted:!0}}catch(u){return o("endpoint-conversion","error",t,`Could not migrate OpenAPI endpoint: ${u.message}`),{text:e,converted:!1}}}var Pn=_(()=>{$n();Ge();wt();Ce();De()});var In={};$e(In,{MIGRATE_HELP:()=>Rn,migrateMintlify:()=>Fn,parseMigrateArgs:()=>Un,planMigration:()=>Nn,runMigrate:()=>ei});import F from"node:fs";import z from"node:path";import{randomUUID as Wo,createHash as Ho}from"node:crypto";import Ko from"ignore";function Un(e){if(e.includes("--help")||e.includes("-h"))return{help:!0};if(e.shift()!=="mintlify")throw new Error("Specify the source platform: velu migrate mintlify [source]");let t={},r=!1;for(let n=0;n<e.length;n++){let o=e[n];if(["--dry-run","--json","--strict"].includes(o))t[{"--dry-run":"dryRun","--json":"json","--strict":"strict"}[o]]=!0;else if(["--out","--config"].includes(o)){if(!e[n+1]||e[n+1].startsWith("--"))throw new Error(`${o} requires a value.`);if(t[o.slice(2)]!==void 0)throw new Error(`${o} was specified twice.`);t[o.slice(2)]=e[++n]}else{if(o.startsWith("-"))throw new Error(`Unknown migration option: ${o}`);if(r)throw new Error("Only one source directory may be specified. Use --out for the destination.");t.source=o,r=!0}}if(t.config&&!["docs.json","mint.json"].includes(t.config))throw new Error("--config must be docs.json or mint.json.");return t}function Zo(e,t){let r=z.resolve(t||`${e}-velu`),n=r,o=[];for(;!F.existsSync(n);){o.unshift(z.basename(n));let a=z.dirname(n);if(a===n)throw new Error("Cannot resolve destination parent.");n=a}let i=z.join(F.realpathSync(n),...o);if(le(e,i)||le(i,e))throw new Error("Destination must be outside the source directory and cannot be its ancestor.");if(F.existsSync(r))throw new Error("Destination already exists. Choose a new directory; migration never overwrites existing files.");return i}function Qo(e){let t=r=>String(r).replace(/\|/g,"\\|").replace(/[\r\n]+/g," ");return`# Mintlify \u2192 Velu migration
54
54
 
55
55
  Status: **${e.status}**. ${e.summary.files} files; ${e.summary.pages} pages/snippets; ${e.summary.scripts} browser scripts; ${e.summary.styles} stylesheets.
56
56
 
@@ -69,8 +69,8 @@ The original Mintlify configuration is preserved. Unsupported settings have not
69
69
  | --- | --- | --- | --- |
70
70
  `+e.issues.map(r=>`| ${r.severity} | ${t(r.code)} | ${t(r.file)}${r.line?":"+r.line:""} | ${t(r.message)} |`).join(`
71
71
  `)+`
72
- `}async function Un({source:e=".",out:t,config:r,version:n="0.2.37"}={}){let o=F.realpathSync(z.resolve(e));if(!F.statSync(o).isDirectory())throw new Error("Source must be a directory.");let i=Zo(o,t);if(r&&!["docs.json","mint.json"].includes(r))throw new Error("Config must be docs.json or mint.json.");let a=r||["docs.json","mint.json"].find(f=>F.existsSync(z.join(o,f)));if(!a)throw new Error("No docs.json or mint.json found in the source directory.");let s=[],l=new Set,c=(f,v,j,C,M)=>{let ie=JSON.stringify([f,v,j,C,M]);l.has(ie)||(s.push({code:f,severity:v,file:j,message:C,...M?{line:M}:{}}),l.add(ie))},u=sn(o,a),p=an(u,a,c);!r&&F.existsSync(z.join(o,"docs.json"))&&F.existsSync(z.join(o,"mint.json"))&&c("multiple-configs","warning",a,"Both config files exist; docs.json selected. Use --config mint.json to select the legacy config.");let y=Ko(),m=z.join(o,".mintignore");if(F.existsSync(m)){if(!le(o,F.realpathSync(m)))throw new Error(".mintignore resolves outside the source.");y.add(F.readFileSync(m,"utf8"))}let g=new Map,b=[];function d(f){for(let v of F.readdirSync(f,{withFileTypes:!0}).sort((j,C)=>j.name<C.name?-1:j.name>C.name?1:0)){let j=z.join(f,v.name),C=mt(z.relative(o,j));v.isSymbolicLink()?(b.push({path:C,reason:"symbolic-link"}),c("symlink","warning",C,"Symbolic link/junction skipped. Copy its required content into the source explicitly.")):v.isDirectory()&&Xo.has(v.name)||/^\.env(?:\.|$)/i.test(v.name)||[".npmrc",".yarnrc.yml",".pnp.cjs",".pnp.loader.mjs"].includes(v.name)?b.push({path:C,reason:"dependency-cache-tooling-or-environment"}):y.ignores(C+(v.isDirectory()?"/":""))&&C!==a&&C!==".mintignore"?b.push({path:C,reason:"mintignore"}):v.isFile()&&C.startsWith(".mintlify/")&&!/\.(json|ya?ml)$/i.test(C)&&!C.startsWith(".mintlify/skills/")?b.push({path:C,reason:"mintlify-runtime-file"}):v.isDirectory()?d(j):v.isFile()?g.set(C,F.readFileSync(j)):b.push({path:C,reason:"not-regular-file"})}}if(d(o),!g.has(a))throw new Error("Source config must be a regular file, not a symbolic link.");if(g.has("velu.json"))throw new Error("Source already contains velu.json. Use the original Mintlify project to avoid replacing an existing Velu config.");let h=new Map,S=new Set,T=new Set;try{for(let f of ne(X(p.navigation)))T.add(f.pagePath.replace(/^\//,""))}catch{}for(let f of g.keys()){let v=f;/\.md$/i.test(f)&&(T.has(f.slice(0,-3))||!/^(readme|license|changelog|contributing|contribute|skill|agents|claude)\.md$/i.test(z.posix.basename(f)))&&(v=f.replace(/\.md$/i,".mdx")),/\.mdx$/i.test(f)&&(v=f.replace(/\.mdx$/i,".mdx")),/^(?:_snippets|snippets)\/.*\.js$/i.test(f)&&(v=f.replace(/\.js$/i,".jsx"));let j=v.toLowerCase();if(S.has(j)||[jt.toLowerCase(),At.toLowerCase()].includes(j))throw new Error(`Migration output collision: ${v}`);S.add(j),h.set(f,v)}let A=new Map(h);for(let[f,v]of h)if(/\.(mdx?|jsx?|tsx?)$/.test(f)){let j=f.replace(/\.[^.]+$/,"");A.has(j)||A.set(j,v),/\/index$/.test(j)&&!A.has(j.slice(0,-6))&&A.set(j.slice(0,-6),v)}let x=new Map,w=[],L=new Set,_=!1,B=[];for(let[f,v]of g){let j=h.get(f),C=v,M="asset",ie;if(/\.mdx$/i.test(j)){M="content";let J=Cn(v.toString("utf8"),f,g,u,c),se=await pn(J.text,f,A,c,{endpointConverted:J.converted});C=Buffer.from(se.text),ie=se.components,_||=se.adapters.length>0;for(let ft of se.assets||[])L.add(ft)}else if(f==="package.json"){M="package";let J=mn(v.toString("utf8"),n,c);C=Buffer.from(J.text),B=J.scripts}else if(/\.js$/i.test(j))M="script",fn(v.toString("utf8"),f,c),(f.startsWith("public/")||f.split("/").some(J=>J.startsWith(".")))&&c("asset-not-autoloaded","warning",f,"Velu does not auto-load JavaScript from public or dot directories; explicitly load it from a custom script if required.");else if(/\.css$/i.test(j)){M="style";let J=v.toString("utf8");f.startsWith("public/")||(C=Buffer.from(gn(J,f,h,c))),/@import|data-component-(?:name|part)|\.dark\b|__next|#banner|#header\b/.test(J)&&c("css-hooks","warning",f,"Review CSS imports, theme classes, and Mintlify-specific selectors against Velu\u2019s DOM hooks."),(f.startsWith("public/")||f.split("/").some(se=>se.startsWith(".")))&&c("asset-not-autoloaded","warning",f,"Velu does not auto-load CSS from public or dot directories.")}else/\.[cm]?[jt]sx?$/.test(j)&&(M="module",C=Buffer.from(dn(v.toString("utf8"),f,A,c)),/(?:@mintlify\/|next\/|window\.mintlify)/.test(v.toString("utf8"))&&c("module-runtime","error",f,"Custom module depends on a Mintlify/Next.js runtime. Adapt its imports and APIs."));f.startsWith(".github/workflows/")&&/mintlify|\bmint\s/.test(v.toString("utf8"))&&c("ci-workflow","warning",f,"Workflow preserved. Replace Mintlify install/validation/deployment commands manually."),x.set(j,C),w.push({source:f,destination:j,kind:M,action:f!==j?"renamed":C.equals(v)?"copied":"transformed",sha256:Le(C),...ie?{components:ie}:{}})}for(let[f,v]of[...x]){if(!Yo.test(f)&&!L.has(f)&&!/\.(css|js)$/i.test(f)||f.startsWith("public/")||f.split("/").some(M=>M.startsWith("."))||["docs.json","mint.json","package.json","velu.json",..._n].includes(f))continue;let j=`public/${f}`,C=[...x.keys()].find(M=>M.toLowerCase()===j.toLowerCase());if(C){x.get(C).equals(v)||c("public-asset-conflict","error",f,`Different asset already exists at ${C}; public file retained. Review which URL should be served.`);continue}x.set(j,v),w.push({source:f,destination:j,kind:"public-asset",action:"mirrored",sha256:Le(v)})}if(_){if(S.has(ge.toLowerCase()))throw new Error(`Generated adapter conflicts with source file: ${ge}`);x.set(ge,Buffer.from(ht)),w.push({destination:ge,kind:"module",action:"generated",sha256:Le(ht)})}let ee=Buffer.from(We(p));x.set("velu.json",ee),w.push({destination:"velu.json",kind:"config",action:"generated",sha256:Le(ee)});let O=Buffer.from(We(u));x.set(".velu-migration/source-config.json",O),w.push({destination:".velu-migration/source-config.json",kind:"config",action:"archived",sha256:Le(O)});let $=new Set,E=new Set;try{for(let f of ne(X(p.navigation))){E.has(f.url)&&c("duplicate-route","error","velu.json",`Duplicate route: ${f.url}`),E.add(f.url);let v=f.pagePath.replace(/^\/+|\/+$/g,"")+".mdx";/\.\.(?:\/|$)|\\/.test(v)&&c("unsafe-page-path","error","velu.json",`Page path is outside the supported project-relative format: ${f.pagePath}`),$.add(v),x.has(v)||c("missing-page","error","velu.json",`Navigation page is missing or ignored: ${v}`)}}catch(f){c("navigation-invalid","error","velu.json",f.message)}for(let f of w.filter(v=>v.kind==="content"))!$.has(f.destination)&&!/^(?:_snippets|snippets)\//.test(f.destination)&&c("unlisted-page","warning",f.destination,"Page preserved but absent from navigation. Velu\u2019s current preview only renders navigation pages; add it to navigation if it must be accessible.");let k=(f,v)=>{if(typeof f!="string")return;if(/^https?:\/\//.test(f)){c("remote-asset","error",v,"Download this branding asset into the project and use a local path; migration does not fetch external assets.");return}let j=f.replace(/^\//,"").split(/[?#]/)[0];x.has(j)||c("missing-asset","error",v,`Asset is missing or ignored: ${j}`)};if(k(p.favicon,"favicon"),typeof p.logo=="string")k(p.logo,"logo");else for(let f of["light","dark"])k(p.logo?.[f],`logo.${f}`);function N(f){if(!(!f||typeof f!="object")){if(f.openapi)for(let v of[].concat(f.openapi))/^https?:\/\//.test(v)?c("remote-openapi","warning","velu.json","Remote OpenAPI URL preserved; availability and generation need validation with network access."):x.has(v.replace(/^\//,""))?c("openapi-routes","warning","velu.json",`OpenAPI source ${v} preserved; compare generated endpoint URLs and x-mint extensions in preview.`):c("missing-openapi","error","velu.json",`OpenAPI source missing or ignored: ${v}`);for(let v of Object.values(f))typeof v=="object"&&N(v)}}N(p.navigation),B.some(f=>f.action==="converted")&&[..._n].some(f=>x.has(f))&&c("lockfile-stale","warning","package.json","Lockfiles are preserved and require regeneration after the dependency changes."),s.sort((f,v)=>f.file.localeCompare(v.file)||(f.line||0)-(v.line||0)||f.code.localeCompare(v.code));let R=s.filter(f=>f.severity==="error").length,U=s.filter(f=>f.severity==="warning").length,V={reportVersion:1,source:o,destination:i,sourceConfig:a,status:R||U?"needs-review":"ready",parityReference:{cli:"@mintlify/cli@4.0.1479",common:"@mintlify/common@1.0.1132",prebuild:"@mintlify/prebuild@1.0.1286",inspected:"2026-09-08"},summary:{files:w.length,pages:w.filter(f=>f.kind==="content").length,scripts:w.filter(f=>f.kind==="script").length,styles:w.filter(f=>f.kind==="style").length,errors:R,warnings:U,skipped:b.length},issues:s,files:w,skipped:b,npmScripts:B};return x.set(jt,Buffer.from(We(V))),x.set(At,Buffer.from(Qo(V))),{report:V,files:x}}async function Nn(e={}){let t=await Un(e),r=e.strict&&(t.report.summary.errors||t.report.summary.warnings),n=!1;if(!e.dryRun&&!r){let o=t.report.destination,i=z.dirname(o);F.mkdirSync(i,{recursive:!0});let a=z.join(i,`.velu-migration-${Wo()}`);F.mkdirSync(a);try{for(let[s,l]of t.files){let c=z.resolve(a,s);if(!le(a,c))throw new Error("Output path escapes the staging directory.");F.mkdirSync(z.dirname(c),{recursive:!0}),F.writeFileSync(c,l,{flag:"wx"})}if(F.existsSync(o))throw new Error("Destination appeared during migration; no existing files were changed.");F.renameSync(a,o),n=!0}finally{z.dirname(a)===i&&z.basename(a).startsWith(".velu-migration-")&&F.rmSync(a,{recursive:!0,force:!0})}}return{report:t.report,written:n,exitCode:r?3:t.report.summary.errors?2:0}}async function ei(e,t){let r=Rn([...e]);if(r.help)return console.log(Pn),0;let n=await Nn({...r,version:t});if(r.json)console.log(We({...n.report,written:n.written}).trimEnd());else{let{summary:o}=n.report;console.log(`${n.written?"Migrated to":"Migration plan for"} ${n.report.destination}`),console.log(`${o.files} files \xB7 ${o.pages} pages/snippets \xB7 ${o.scripts} scripts \xB7 ${o.styles} stylesheets`),console.log(`${o.errors} errors \xB7 ${o.warnings} warnings \xB7 ${o.skipped} skipped paths`);for(let i of n.report.issues)console.log(` ${i.severity.toUpperCase()} [${i.code}] ${i.file}${i.line?":"+i.line:""}: ${i.message}`);n.written?console.log(`Review ${At}, then run: velu validate ${JSON.stringify(n.report.destination)}`):console.log(r.strict&&n.exitCode===3?"Strict mode: review required; no files written.":"Dry run: no files written.")}return n.exitCode}var Xo,_n,jt,At,Yo,Le,We,Pn,In=P(()=>{Be();hn();re();re();Ln();Xo=new Set(["node_modules",".git",".velu",".velu-migration",".next",".turbo",".cache",".idea",".vscode",".claude",".agents","dist","dist-preview","coverage"]),_n=new Set(["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lock","bun.lockb"]),jt="velu-migration-report.json",At="VELU-MIGRATION.md",Yo=/\.(?:avif|apng|bmp|gif|ico|jpe?g|png|svg|svgz|tiff?|webp|mp4|webm|mov|avi|m4v|mp3|wav|ogg|flac|aac|m4a|woff2?|ttf|otf|eot|pdf|txt|csv|tsv|xml|zip|gz|tar|docx?|xlsx?|pptx?)$/i,Le=e=>Ho("sha256").update(e).digest("hex"),We=e=>JSON.stringify(e,null,2)+`
73
- `,Pn=`Usage: velu migrate mintlify [source] [--out <directory>] [--config docs.json|mint.json] [--dry-run] [--json] [--strict]
72
+ `}async function Nn({source:e=".",out:t,config:r,version:n="0.2.37"}={}){let o=F.realpathSync(z.resolve(e));if(!F.statSync(o).isDirectory())throw new Error("Source must be a directory.");let i=Zo(o,t);if(r&&!["docs.json","mint.json"].includes(r))throw new Error("Config must be docs.json or mint.json.");let a=r||["docs.json","mint.json"].find(f=>F.existsSync(z.join(o,f)));if(!a)throw new Error("No docs.json or mint.json found in the source directory.");let s=[],l=new Set,c=(f,v,j,C,M)=>{let ie=JSON.stringify([f,v,j,C,M]);l.has(ie)||(s.push({code:f,severity:v,file:j,message:C,...M?{line:M}:{}}),l.add(ie))},u=an(o,a),p=ln(u,a,c);!r&&F.existsSync(z.join(o,"docs.json"))&&F.existsSync(z.join(o,"mint.json"))&&c("multiple-configs","warning",a,"Both config files exist; docs.json selected. Use --config mint.json to select the legacy config.");let y=Ko(),m=z.join(o,".mintignore");if(F.existsSync(m)){if(!le(o,F.realpathSync(m)))throw new Error(".mintignore resolves outside the source.");y.add(F.readFileSync(m,"utf8"))}let g=new Map,b=[];function d(f){for(let v of F.readdirSync(f,{withFileTypes:!0}).sort((j,C)=>j.name<C.name?-1:j.name>C.name?1:0)){let j=z.join(f,v.name),C=mt(z.relative(o,j));v.isSymbolicLink()?(b.push({path:C,reason:"symbolic-link"}),c("symlink","warning",C,"Symbolic link/junction skipped. Copy its required content into the source explicitly.")):v.isDirectory()&&Xo.has(v.name)||/^\.env(?:\.|$)/i.test(v.name)||[".npmrc",".yarnrc.yml",".pnp.cjs",".pnp.loader.mjs"].includes(v.name)?b.push({path:C,reason:"dependency-cache-tooling-or-environment"}):y.ignores(C+(v.isDirectory()?"/":""))&&C!==a&&C!==".mintignore"?b.push({path:C,reason:"mintignore"}):v.isFile()&&C.startsWith(".mintlify/")&&!/\.(json|ya?ml)$/i.test(C)&&!C.startsWith(".mintlify/skills/")?b.push({path:C,reason:"mintlify-runtime-file"}):v.isDirectory()?d(j):v.isFile()?g.set(C,F.readFileSync(j)):b.push({path:C,reason:"not-regular-file"})}}if(d(o),!g.has(a))throw new Error("Source config must be a regular file, not a symbolic link.");if(g.has("velu.json"))throw new Error("Source already contains velu.json. Use the original Mintlify project to avoid replacing an existing Velu config.");let h=new Map,S=new Set,O=new Set;try{for(let f of ne(X(p.navigation)))O.add(f.pagePath.replace(/^\//,""))}catch{}for(let f of g.keys()){let v=f;/\.md$/i.test(f)&&(O.has(f.slice(0,-3))||!/^(readme|license|changelog|contributing|contribute|skill|agents|claude)\.md$/i.test(z.posix.basename(f)))&&(v=f.replace(/\.md$/i,".mdx")),/\.mdx$/i.test(f)&&(v=f.replace(/\.mdx$/i,".mdx")),/^(?:_snippets|snippets)\/.*\.js$/i.test(f)&&(v=f.replace(/\.js$/i,".jsx"));let j=v.toLowerCase();if(S.has(j)||[jt.toLowerCase(),At.toLowerCase()].includes(j))throw new Error(`Migration output collision: ${v}`);S.add(j),h.set(f,v)}let A=new Map(h);for(let[f,v]of h)if(/\.(mdx?|jsx?|tsx?)$/.test(f)){let j=f.replace(/\.[^.]+$/,"");A.has(j)||A.set(j,v),/\/index$/.test(j)&&!A.has(j.slice(0,-6))&&A.set(j.slice(0,-6),v)}let x=new Map,w=[],L=new Set,P=!1,B=[];for(let[f,v]of g){let j=h.get(f),C=v,M="asset",ie;if(/\.mdx$/i.test(j)){M="content";let J=Ln(v.toString("utf8"),f,g,u,c),se=await fn(J.text,f,A,c,{endpointConverted:J.converted});C=Buffer.from(se.text),ie=se.components,P||=se.adapters.length>0;for(let ft of se.assets||[])L.add(ft)}else if(f==="package.json"){M="package";let J=dn(v.toString("utf8"),n,c);C=Buffer.from(J.text),B=J.scripts}else if(/\.js$/i.test(j))M="script",mn(v.toString("utf8"),f,c),(f.startsWith("public/")||f.split("/").some(J=>J.startsWith(".")))&&c("asset-not-autoloaded","warning",f,"Velu does not auto-load JavaScript from public or dot directories; explicitly load it from a custom script if required.");else if(/\.css$/i.test(j)){M="style";let J=v.toString("utf8");f.startsWith("public/")||(C=Buffer.from(hn(J,f,h,c))),/@import|data-component-(?:name|part)|\.dark\b|__next|#banner|#header\b/.test(J)&&c("css-hooks","warning",f,"Review CSS imports, theme classes, and Mintlify-specific selectors against Velu\u2019s DOM hooks."),(f.startsWith("public/")||f.split("/").some(se=>se.startsWith(".")))&&c("asset-not-autoloaded","warning",f,"Velu does not auto-load CSS from public or dot directories.")}else/\.[cm]?[jt]sx?$/.test(j)&&(M="module",C=Buffer.from(gn(v.toString("utf8"),f,A,c)),/(?:@mintlify\/|next\/|window\.mintlify)/.test(v.toString("utf8"))&&c("module-runtime","error",f,"Custom module depends on a Mintlify/Next.js runtime. Adapt its imports and APIs."));f.startsWith(".github/workflows/")&&/mintlify|\bmint\s/.test(v.toString("utf8"))&&c("ci-workflow","warning",f,"Workflow preserved. Replace Mintlify install/validation/deployment commands manually."),x.set(j,C),w.push({source:f,destination:j,kind:M,action:f!==j?"renamed":C.equals(v)?"copied":"transformed",sha256:Le(C),...ie?{components:ie}:{}})}for(let[f,v]of[...x]){if(!Yo.test(f)&&!L.has(f)&&!/\.(css|js)$/i.test(f)||f.startsWith("public/")||f.split("/").some(M=>M.startsWith("."))||["docs.json","mint.json","package.json","velu.json",..._n].includes(f))continue;let j=`public/${f}`,C=[...x.keys()].find(M=>M.toLowerCase()===j.toLowerCase());if(C){x.get(C).equals(v)||c("public-asset-conflict","error",f,`Different asset already exists at ${C}; public file retained. Review which URL should be served.`);continue}x.set(j,v),w.push({source:f,destination:j,kind:"public-asset",action:"mirrored",sha256:Le(v)})}if(P){if(S.has(ge.toLowerCase()))throw new Error(`Generated adapter conflicts with source file: ${ge}`);x.set(ge,Buffer.from(ht)),w.push({destination:ge,kind:"module",action:"generated",sha256:Le(ht)})}let ee=Buffer.from(He(p));x.set("velu.json",ee),w.push({destination:"velu.json",kind:"config",action:"generated",sha256:Le(ee)});let T=Buffer.from(He(u));x.set(".velu-migration/source-config.json",T),w.push({destination:".velu-migration/source-config.json",kind:"config",action:"archived",sha256:Le(T)});let $=new Set,E=new Set;try{for(let f of ne(X(p.navigation))){E.has(f.url)&&c("duplicate-route","error","velu.json",`Duplicate route: ${f.url}`),E.add(f.url);let v=f.pagePath.replace(/^\/+|\/+$/g,"")+".mdx";/\.\.(?:\/|$)|\\/.test(v)&&c("unsafe-page-path","error","velu.json",`Page path is outside the supported project-relative format: ${f.pagePath}`),$.add(v),x.has(v)||c("missing-page","error","velu.json",`Navigation page is missing or ignored: ${v}`)}}catch(f){c("navigation-invalid","error","velu.json",f.message)}for(let f of w.filter(v=>v.kind==="content"))!$.has(f.destination)&&!/^(?:_snippets|snippets)\//.test(f.destination)&&c("unlisted-page","warning",f.destination,"Page preserved but absent from navigation. Velu\u2019s current preview only renders navigation pages; add it to navigation if it must be accessible.");let k=(f,v)=>{if(typeof f!="string")return;if(/^https?:\/\//.test(f)){c("remote-asset","error",v,"Download this branding asset into the project and use a local path; migration does not fetch external assets.");return}let j=f.replace(/^\//,"").split(/[?#]/)[0];x.has(j)||c("missing-asset","error",v,`Asset is missing or ignored: ${j}`)};if(k(p.favicon,"favicon"),typeof p.logo=="string")k(p.logo,"logo");else for(let f of["light","dark"])k(p.logo?.[f],`logo.${f}`);function N(f){if(!(!f||typeof f!="object")){if(f.openapi)for(let v of[].concat(f.openapi))/^https?:\/\//.test(v)?c("remote-openapi","warning","velu.json","Remote OpenAPI URL preserved; availability and generation need validation with network access."):x.has(v.replace(/^\//,""))?c("openapi-routes","warning","velu.json",`OpenAPI source ${v} preserved; compare generated endpoint URLs and x-mint extensions in preview.`):c("missing-openapi","error","velu.json",`OpenAPI source missing or ignored: ${v}`);for(let v of Object.values(f))typeof v=="object"&&N(v)}}N(p.navigation),B.some(f=>f.action==="converted")&&[..._n].some(f=>x.has(f))&&c("lockfile-stale","warning","package.json","Lockfiles are preserved and require regeneration after the dependency changes."),s.sort((f,v)=>f.file.localeCompare(v.file)||(f.line||0)-(v.line||0)||f.code.localeCompare(v.code));let R=s.filter(f=>f.severity==="error").length,U=s.filter(f=>f.severity==="warning").length,V={reportVersion:1,source:o,destination:i,sourceConfig:a,status:R||U?"needs-review":"ready",parityReference:{cli:"@mintlify/cli@4.0.1479",common:"@mintlify/common@1.0.1132",prebuild:"@mintlify/prebuild@1.0.1286",inspected:"2026-09-08"},summary:{files:w.length,pages:w.filter(f=>f.kind==="content").length,scripts:w.filter(f=>f.kind==="script").length,styles:w.filter(f=>f.kind==="style").length,errors:R,warnings:U,skipped:b.length},issues:s,files:w,skipped:b,npmScripts:B};return x.set(jt,Buffer.from(He(V))),x.set(At,Buffer.from(Qo(V))),{report:V,files:x}}async function Fn(e={}){let t=await Nn(e),r=e.strict&&(t.report.summary.errors||t.report.summary.warnings),n=!1;if(!e.dryRun&&!r){let o=t.report.destination,i=z.dirname(o);F.mkdirSync(i,{recursive:!0});let a=z.join(i,`.velu-migration-${Wo()}`);F.mkdirSync(a);try{for(let[s,l]of t.files){let c=z.resolve(a,s);if(!le(a,c))throw new Error("Output path escapes the staging directory.");F.mkdirSync(z.dirname(c),{recursive:!0}),F.writeFileSync(c,l,{flag:"wx"})}if(F.existsSync(o))throw new Error("Destination appeared during migration; no existing files were changed.");F.renameSync(a,o),n=!0}finally{z.dirname(a)===i&&z.basename(a).startsWith(".velu-migration-")&&F.rmSync(a,{recursive:!0,force:!0})}}return{report:t.report,written:n,exitCode:r?3:t.report.summary.errors?2:0}}async function ei(e,t){let r=Un([...e]);if(r.help)return console.log(Rn),0;let n=await Fn({...r,version:t});if(r.json)console.log(He({...n.report,written:n.written}).trimEnd());else{let{summary:o}=n.report;console.log(`${n.written?"Migrated to":"Migration plan for"} ${n.report.destination}`),console.log(`${o.files} files \xB7 ${o.pages} pages/snippets \xB7 ${o.scripts} scripts \xB7 ${o.styles} stylesheets`),console.log(`${o.errors} errors \xB7 ${o.warnings} warnings \xB7 ${o.skipped} skipped paths`);for(let i of n.report.issues)console.log(` ${i.severity.toUpperCase()} [${i.code}] ${i.file}${i.line?":"+i.line:""}: ${i.message}`);n.written?console.log(`Review ${At}, then run: velu validate ${JSON.stringify(n.report.destination)}`):console.log(r.strict&&n.exitCode===3?"Strict mode: review required; no files written.":"Dry run: no files written.")}return n.exitCode}var Xo,_n,jt,At,Yo,Le,He,Rn,Mn=_(()=>{De();yn();re();re();Pn();Xo=new Set(["node_modules",".git",".velu",".velu-migration",".next",".turbo",".cache",".idea",".vscode",".claude",".agents","dist","dist-preview","coverage"]),_n=new Set(["package-lock.json","yarn.lock","pnpm-lock.yaml","bun.lock","bun.lockb"]),jt="velu-migration-report.json",At="VELU-MIGRATION.md",Yo=/\.(?:avif|apng|bmp|gif|ico|jpe?g|png|svg|svgz|tiff?|webp|mp4|webm|mov|avi|m4v|mp3|wav|ogg|flac|aac|m4a|woff2?|ttf|otf|eot|pdf|txt|csv|tsv|xml|zip|gz|tar|docx?|xlsx?|pptx?)$/i,Le=e=>Ho("sha256").update(e).digest("hex"),He=e=>JSON.stringify(e,null,2)+`
73
+ `,Rn=`Usage: velu migrate mintlify [source] [--out <directory>] [--config docs.json|mint.json] [--dry-run] [--json] [--strict]
74
74
 
75
75
  Migrate a local Mintlify project into a NEW Velu directory.
76
76
  Defaults: source=current directory, output=<source>-velu, docs.json before mint.json.
@@ -83,10 +83,10 @@ Defaults: source=current directory, output=<source>-velu, docs.json before mint.
83
83
  Source files are never modified; no project scripts or package installs are executed.
84
84
  Exit codes: 0=completed/clean plan, 1=invalid invocation or I/O failure,
85
85
  2=compatibility errors (output is still written unless --strict), 3=strict review required.
86
- `});var Lt={};$e(Lt,{currentVersion:()=>Tt,getLatestVersion:()=>Ct,isNewer:()=>Et,maybeAutoUpdate:()=>di,updateCommand:()=>mi});import{spawnSync as zn}from"node:child_process";import{readFileSync as Vn,writeFileSync as ti,mkdirSync as ni}from"node:fs";import{fileURLToPath as ri}from"node:url";import{homedir as oi,tmpdir as ii}from"node:os";import Ot from"node:path";import Q from"node:process";function Tt(){try{return JSON.parse(Vn(new URL("../package.json",import.meta.url),"utf8")).version}catch{return"unknown"}}function ci(e,t){let r=i=>String(i).split("-")[0].split(".").map(a=>Number(a)||0),n=r(e),o=r(t);for(let i=0;i<3;i++){let a=(n[i]||0)-(o[i]||0);if(a!==0)return a<0?-1:1}return 0}function Et(e,t){return!e||!t||t==="unknown"?!1:ci(e,t)>0}function Bn(){let e=Ot.join(oi()||ii(),".velu");return Ot.join(e,"update-check.json")}function Mn(){try{return JSON.parse(Vn(Bn(),"utf8"))}catch{return null}}function ui(e){try{let t=Bn();ni(Ot.dirname(t),{recursive:!0}),ti(t,JSON.stringify(e))}catch{}}async function pi(){let e=`${si}/-/package/${He}/dist-tags`,t=new AbortController,r=setTimeout(()=>t.abort(),li);try{let n=await fetch(e,{signal:t.signal,headers:{accept:"application/json"}});if(!n.ok)return null;let o=await n.json();return o&&typeof o.latest=="string"?o.latest:null}catch{return null}finally{clearTimeout(r)}}async function Ct({force:e=!1}={}){if(!e){let r=Mn();if(r?.latest&&Date.now()-(r.checkedAt||0)<ai)return r.latest}let t=await pi();return t?(ui({latest:t,checkedAt:Date.now()}),t):Mn()?.latest??null}function Dn(){let e=Q.env.npm_config_user_agent||"";if(e.startsWith("pnpm"))return"pnpm";if(e.startsWith("yarn"))return"yarn";if(e.startsWith("bun"))return"bun";let t="";try{t=ri(import.meta.url).replace(/\\/g,"/")}catch{}return t.includes("/pnpm/")?"pnpm":t.includes("/yarn/")||t.includes("/.yarn/")?"yarn":t.includes("/.bun/")?"bun":"npm"}function fi(e){let t=`${He}@latest`;switch(e){case"pnpm":return["pnpm",["add","-g",t]];case"yarn":return["yarn",["global","add",t]];case"bun":return["bun",["add","-g",t]];default:return["npm",["install","-g",t]]}}function Jn(e){let[t,r]=fi(e);return zn(t,r,{stdio:"inherit",shell:Q.platform==="win32"}).status===0}async function mi(){let e=Tt(),t=await Ct({force:!0});if(t&&!Et(t,e)){console.log(`velu is already up to date (v${e}).`);return}let r=Dn();console.log(t?`Updating velu ${e} \u2192 ${t} (via ${r})\u2026`:`Could not reach the npm registry; installing ${He}@latest (via ${r}) anyway\u2026`),Jn(r)?console.log('\u2713 Updated. Run "velu version" to confirm.'):(console.error("Update failed. You can update manually with:"),console.error(` npm install -g ${He}@latest`),Q.exitCode=1)}async function di(){if(Q.env.VELU_NO_UPDATE==="1"||Q.env.VELU_UPDATED==="1"||!Q.stdout.isTTY)return;let e=Tt();if(e==="unknown")return;let t=null;try{t=await Ct()}catch{return}if(!Et(t,e))return;let r=Dn();if(console.log(`
87
- New velu version available: ${e} \u2192 ${t}. Updating\u2026`),!Jn(r)){console.log("Auto-update failed; continuing on the current version. Run `velu update` to retry.\n");return}console.log(`Restarting on the new version\u2026
88
- `);let n=zn(Q.execPath,Q.argv.slice(1),{stdio:"inherit",env:{...Q.env,VELU_UPDATED:"1"}});Q.exit(n.status??0)}var He,si,ai,li,_t=P(()=>{He="@veluai/velu",si="https://registry.npmjs.org",ai=720*60*1e3,li=3e3});import gi from"node:fs/promises";import Pt from"node:path";function qn(e){if(!e.favicon)return null;let t=Pt.extname(e.favicon).toLowerCase();return{url:Rt+t,type:yi[t]||""}}function _e(e){if(typeof e=="string"){let t=e.trim();return t?{light:t,dark:t,href:"/"}:null}if(e&&typeof e=="object"){let t=(e.light??e.dark)?.trim?.(),r=(e.dark??e.light)?.trim?.();return!t||!r?null:{light:t,dark:r,href:e.href?.trim?.()||"/"}}return null}function vi(e){return!e||typeof e!="object"?{metatags:{},indexing:"navigable"}:{metatags:e.metatags&&typeof e.metatags=="object"?e.metatags:{},indexing:e.indexing==="all"?"all":"navigable"}}function Ut(e={},t){let r=e.colors?.primary??hi;return{name:e.name??t??"docs",theme:Tn(e.theme),url:typeof process.env.VELU_SITE_URL=="string"&&process.env.VELU_SITE_URL.trim()?process.env.VELU_SITE_URL.trim().replace(/\/+$/,""):null,seo:vi(e.seo),assistant:Ee(e.assistant),thumbnails:e.thumbnails&&typeof e.thumbnails=="object"&&typeof e.thumbnails.background=="string"?{background:e.thumbnails.background}:null,colors:{primary:r,light:e.theme==="vepa"?r:e.colors?.light??r,dark:e.theme==="vepa"?e.colors?.light??r:e.colors?.dark??r},favicon:e.favicon??null,api:Y(e.api),logo:_e(e.logo),footer:Oe(e.footer),navbar:Te(e.navbar),font:{family:On(e)},navigation:e.navigation??null}}async function Gn(e){let t=Pt.join(e,"velu.json"),r;try{r=await gi.readFile(t,"utf-8")}catch(o){throw o.code==="ENOENT"?new Error(`No velu.json found in ${e}. Run \`velu init <name>\` to scaffold one.`):o}let n;try{n=JSON.parse(r)}catch(o){throw new Error(`velu.json is not valid JSON: ${o.message}`)}return Ut(n,Pt.basename(e))}function Wn(e){let{colors:t,font:r}=e;return St({light:t.light,dark:t.dark,family:r.family,theme:e.theme,primary:t.primary})}var hi,Ke,Xe,Rt,yi,Pe=P(()=>{Ce();Ce();hi="#dc143c",Ke="/@velu-logo-light",Xe="/@velu-logo-dark",Rt="/@velu-favicon",yi={".svg":"image/svg+xml",".ico":"image/x-icon",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".avif":"image/avif"}});import{visit as Hn}from"unist-util-visit";import{toString as bi}from"mdast-util-to-string";import xi from"github-slugger";import{valueToEstree as wi}from"estree-util-value-to-estree";function $i(e){return`update-${String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"item"}`}function Kn(e,t){let r=(e.attributes||[]).find(n=>n&&n.type==="mdxJsxAttribute"&&n.name===t);if(r)return typeof r.value=="string"?r.value:void 0}function Si(e){let t=(e.attributes||[]).find(a=>a&&a.type==="mdxJsxAttribute"&&a.name==="tags");if(!t)return[];if(typeof t.value=="string")return[t.value];let r=t.value&&t.value.value?String(t.value.value):"",n=[],o=/["'`]([^"'`]+)["'`]/g,i;for(;i=o.exec(r);)n.push(i[1]);return n}function Re(){return e=>{let t=new xi,r=[];Hn(e,"heading",l=>{let c=bi(l);r.push({depth:l.depth,id:t.slug(c),label:c})});let n=[],o=[],i=new Set;if(Hn(e,"mdxJsxFlowElement",l=>{if(l.name!=="Update")return;let c=Kn(l,"label")??Kn(l,"date");c&&n.push({id:$i(c),label:c});for(let u of Si(l)){let p=u.trim().toLowerCase();u.trim()&&!i.has(p)&&(i.add(p),o.push(u.trim()))}}),n.length){Xn(e,n),Nt(e,"changelog",{tags:o});return}let a={children:[]},s=[{node:a,depth:0}];for(let l of r){for(;s.length>1&&s[s.length-1].depth>=l.depth;)s.pop();let c={id:l.id,label:l.label},u=s[s.length-1].node;u.children||(u.children=[]),u.children.push(c),s.push({node:c,depth:l.depth})}Xn(e,a.children),Nt(e,"changelog",null)}}function Xn(e,t){Nt(e,"toc",t)}function Nt(e,t,r){e.children.unshift({type:"mdxjsEsm",value:"",data:{estree:{type:"Program",sourceType:"module",body:[{type:"ExportNamedDeclaration",specifiers:[],declaration:{type:"VariableDeclaration",kind:"const",declarations:[{type:"VariableDeclarator",id:{type:"Identifier",name:t},init:wi(r)}]}}]}}})}var Ft=P(()=>{});import{visit as ki}from"unist-util-visit";function It(){return e=>{ki(e,"code",t=>{let r=(t.meta||"").trim();if(!r)return;let n={},o=r.match(/\btitle="([^"]*)"/);o&&(n["data-title"]=o[1],r=(r.slice(0,o.index)+r.slice(o.index+o[0].length)).trim());let i=r.match(/\{([\d,\s-]+)\}/);i&&(n["data-highlight"]=i[1].replace(/\s+/g,""),r=(r.slice(0,i.index)+r.slice(i.index+i[0].length)).trim()),r=r.replace(/\blineNumbers\b/,()=>(n["data-line-numbers"]="","")).trim(),r&&(n["data-filename"]=r),Object.keys(n).length&&(t.data=t.data||{},t.data.hProperties={...t.data.hProperties||{},...n})})}}var Yn=P(()=>{});import ji from"node:fs";import Zn from"node:path";function ae(e,t){let r=[],n=[],o=new Set;for(let i of ne(e)){if(i.node?.api){o.add(i.url);continue}if(o.has(i.url)){r.push(`duplicate URL "${i.url}" (page "${i.pagePath}") \u2014 keeping the first occurrence`);continue}o.add(i.url);let a=i.pagePath.replace(/^\/+|\/+$/g,""),s=Zn.join(t,...a.split("/"))+".mdx",l=ji.existsSync(s);l||r.push(`page "${i.pagePath}" \u2192 ${Zn.relative(t,s)} not found`),n.push({pagePath:i.pagePath,url:i.url,fileAbsPath:s,exists:l})}return{pageEntries:n,warnings:r}}var Ue=P(()=>{re()});import Ai from"@apidevtools/swagger-parser";async function Oi(e){return Ai.dereference(e)}async function Qn(e){return Ae(await Oi(e))}var er=P(()=>{qe();qe()});function tr(e,t){if(!t||typeof t!="object")return e;let r=Y(t);return{server:t.server!=null?r.server:e?.server??null,proxy:t.playground!=null?r.proxy:e?.proxy!==!1,languages:t.examples?.languages!=null?r.languages:e?.languages}}function Ti(e,{base:t,api:r,ops:n}){let o=r?.server,i=r?.languages||xt,a={proxy:r?.proxy!==!1,server:o??null},s=new Map;for(let c of e){let u=c.op.tags?.[0]||"API";s.has(u)||s.set(u,[]),s.get(u).push(c)}let l=[];for(let[c,u]of s){let p=u.map(({op:y,segment:m})=>{let g=`${t}/${Mt(c)}/${y.id}`;return n[g]={operation:y,samples:Ge(y,{server:o||y.servers?.[0],languages:i}),segment:m,title:y.title,description:y.description,method:y.method,api:a},{apiPage:g,label:y.title,method:y.method}});l.push({group:c,pages:p})}return l}async function nr(e,{loadOps:t,base:r,api:n,ops:o}){let i=Array.isArray(e)?e:[e],a=[];for(let s of i){let{operations:l,segments:c,servers:u}=await t(s);l.forEach((p,y)=>{!p.servers?.length&&u?.length&&(p.servers=u),a.push({op:p,segment:c[y]})})}return Ti(a,{base:r,api:n,ops:o})}async function rr(e,t){if(!e||typeof e!="object")return e;if(typeof e.tab=="string"&&e.openapi){let n=Mt(e.tab),o=tr(t.api,e.api),i=await nr(e.openapi,{...t,base:n,api:o}),{openapi:a,api:s,...l}=e;return{...l,groups:[...l.groups||[],...i]}}if(typeof e.group=="string"&&e.openapi){let n=Mt(e.group),o=tr(t.api,e.api),i=await nr(e.openapi,{...t,base:n,api:o}),{openapi:a,api:s,...l}=e,c=i.flatMap(u=>u.pages);return{...l,pages:[...l.pages||[],...c]}}let r={...e};for(let n of["products","versions","languages","tabs","groups"])Array.isArray(e[n])&&(r[n]=await Promise.all(e[n].map(o=>rr(o,t))));return r}async function or(e,{api:t,loadOps:r}){let n={};return!e||typeof e!="object"?{nav:e,ops:n}:{nav:await rr(e,{api:t,loadOps:r,ops:n}),ops:n}}var Mt,ir=P(()=>{Ce();wt();Mt=e=>String(e??"").replace(/\{[^}]+\}/g,t=>t.slice(1,-1)).replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()||"x"});import Ei from"node:path";function Ci(e,t){return/^https?:\/\//.test(e)?e:Ei.resolve(t,e.replace(/^\/+/,""))}async function Ye(e,{targetDir:t,api:r}={}){return or(e,{api:r,loadOps:n=>Qn(Ci(n,t))})}var zt=P(()=>{er();ir()});import ar from"node:fs";import ye from"node:path";import{createHash as Li}from"node:crypto";function Ne(e,{outDir:t}={}){let r=ye.resolve(e),n=t?ye.resolve(t):null,o=[],i=[],a=l=>{let c;try{c=ar.readdirSync(l,{withFileTypes:!0})}catch{return}for(let u of c){let p=ye.join(l,u.name);if(u.isDirectory()){if(u.name.startsWith(".")||Pi.has(u.name)||n&&p===n)continue;a(p);continue}if(!u.isFile())continue;let y=ye.extname(u.name).toLowerCase();if(y!==sr&&y!==_i)continue;let m=ye.relative(r,p).split(ye.sep).join("/"),g={rel:m,abs:p,url:`${Ze}/${m.split("/").map(encodeURIComponent).join("/")}?v=${Ri(p)}`,kind:y===sr?"css":"js"};(g.kind==="css"?o:i).push(g)}};a(r);let s=(l,c)=>l.rel<c.rel?-1:l.rel>c.rel?1:0;return o.sort(s),i.sort(s),{styles:o,scripts:i}}function Ri(e){try{return Li("sha1").update(ar.readFileSync(e)).digest("hex").slice(0,8)}catch{return"0"}}function lr(e,t){let r=`${Ze}/`;if(!t.startsWith(r))return null;let n;try{n=decodeURIComponent(t.slice(r.length))}catch{return null}return[...e.styles,...e.scripts].find(o=>o.rel===n)??null}function cr(e,t=""){return(e?.styles??[]).map(r=>`<link rel="stylesheet" href="${Ui(t+r.url)}" data-velu-custom />`).join(`
89
- `)}var Ze,sr,_i,Pi,Ui,Vt=P(()=>{Ze="/@velu-custom",sr=".css",_i=".js",Pi=new Set(["node_modules","public","dist"]);Ui=e=>String(e).replace(/&/g,"&amp;").replace(/"/g,"&quot;")});import Ni from"node:fs";import Fe from"node:path";function fr(e,{buildOutDir:t}={}){return{name:"velu-site",resolveId(r){return r===pr?ur:null},async load(r){return r!==ur?null:Fi(e,{buildOutDir:t})}}}async function Fi(e,{buildOutDir:t}={}){let r={};try{r=JSON.parse(Ni.readFileSync(Fe.join(e,"velu.json"),"utf-8"))}catch{}let n=Y(r.api),o=r.navigation??{},i={};try{let x=await Ye(r.navigation??{},{targetDir:e,api:n});o=x.nav,i=x.ops}catch(x){console.warn(`[velu] openapi: ${x.message}`)}let a=X(o),{pageEntries:s,warnings:l}=ae(a,e);for(let x of l)console.warn(`[velu] nav: ${x}`);let c=_e(r.logo),u={name:r.name??Fe.basename(e),theme:r.theme==="vepa"?"vepa":"velu",logo:c?{light:Ke,dark:Xe,href:c.href,mono:c.light===c.dark}:null,footer:Oe(r.footer),navbar:Te(r.navbar),contextual:kt(r.contextual),assistant:Ee(r.assistant),customScripts:Ne(e,{outDir:t}).scripts.map(x=>x.url)},p=[],y=[],m=0;for(let x of s){if(!x.exists)continue;let w=JSON.stringify(x.fileAbsPath.split(Fe.sep).join("/")),L=JSON.stringify(Fe.relative(e,x.fileAbsPath).split(Fe.sep).join("/")),_=`__p${m++}`;p.push(`import * as ${_} from ${w};`),y.push(` ${JSON.stringify(x.url)}: { Component: ${_}.default, frontmatter: ${_}.frontmatter, toc: ${_}.toc, changelog: ${_}.changelog, relPath: ${L}, ...__mdxApi(${_}) },`)}let g=new Set(s.filter(x=>x.exists).map(x=>x.url));for(let x of s)!x.exists&&!g.has(x.url)&&y.push(` ${JSON.stringify(x.url)}: { missing: true },`);let b=[],d=[],h=[],S=!1,T=0;for(let x of ne(a)){if(!x.node?.api)continue;let w=i[x.pagePath];if(!w)continue;S=!0;let L=`__op${T}`,_=`__samples${T}`,B=`__api${T}`;T+=1,b.push(`const ${L} = ${JSON.stringify(w.operation)};`),b.push(`const ${_} = ${JSON.stringify(w.samples)};`),h.push(`{ id: ${JSON.stringify(w.operation.id)}, method: ${JSON.stringify(w.operation.method)}, title: ${JSON.stringify(w.operation.title)}, url: ${JSON.stringify(x.url)}, operation: ${L}, samples: ${_}, api: ${JSON.stringify(w.api||{proxy:!0,server:null})} }`),d.push(`function ${B}(){ return React.createElement(ApiReferencePage, { preset: ${JSON.stringify(u.theme)}, operation: ${L}, samples: ${_}, apiOperations: __apiOperations, api: ${JSON.stringify(w.api||{proxy:!0,server:null})} }); }`),y.push(` ${JSON.stringify(x.url)}: { Component: ${B}, frontmatter: { title: ${JSON.stringify(w.title)}, description: ${JSON.stringify(w.description)} }, toc: [], operation: ${L}, samples: ${_}, api: true },`)}S&&(b.push(`const __apiOperations = [
86
+ `});var Lt={};$e(Lt,{currentVersion:()=>Tt,getLatestVersion:()=>Ct,isNewer:()=>Et,maybeAutoUpdate:()=>di,updateCommand:()=>mi});import{spawnSync as Vn}from"node:child_process";import{readFileSync as Bn,writeFileSync as ti,mkdirSync as ni}from"node:fs";import{fileURLToPath as ri}from"node:url";import{homedir as oi,tmpdir as ii}from"node:os";import Ot from"node:path";import Q from"node:process";function Tt(){try{return JSON.parse(Bn(new URL("../package.json",import.meta.url),"utf8")).version}catch{return"unknown"}}function ci(e,t){let r=i=>String(i).split("-")[0].split(".").map(a=>Number(a)||0),n=r(e),o=r(t);for(let i=0;i<3;i++){let a=(n[i]||0)-(o[i]||0);if(a!==0)return a<0?-1:1}return 0}function Et(e,t){return!e||!t||t==="unknown"?!1:ci(e,t)>0}function Dn(){let e=Ot.join(oi()||ii(),".velu");return Ot.join(e,"update-check.json")}function zn(){try{return JSON.parse(Bn(Dn(),"utf8"))}catch{return null}}function ui(e){try{let t=Dn();ni(Ot.dirname(t),{recursive:!0}),ti(t,JSON.stringify(e))}catch{}}async function pi(){let e=`${si}/-/package/${Ke}/dist-tags`,t=new AbortController,r=setTimeout(()=>t.abort(),li);try{let n=await fetch(e,{signal:t.signal,headers:{accept:"application/json"}});if(!n.ok)return null;let o=await n.json();return o&&typeof o.latest=="string"?o.latest:null}catch{return null}finally{clearTimeout(r)}}async function Ct({force:e=!1}={}){if(!e){let r=zn();if(r?.latest&&Date.now()-(r.checkedAt||0)<ai)return r.latest}let t=await pi();return t?(ui({latest:t,checkedAt:Date.now()}),t):zn()?.latest??null}function Jn(){let e=Q.env.npm_config_user_agent||"";if(e.startsWith("pnpm"))return"pnpm";if(e.startsWith("yarn"))return"yarn";if(e.startsWith("bun"))return"bun";let t="";try{t=ri(import.meta.url).replace(/\\/g,"/")}catch{}return t.includes("/pnpm/")?"pnpm":t.includes("/yarn/")||t.includes("/.yarn/")?"yarn":t.includes("/.bun/")?"bun":"npm"}function fi(e){let t=`${Ke}@latest`;switch(e){case"pnpm":return["pnpm",["add","-g",t]];case"yarn":return["yarn",["global","add",t]];case"bun":return["bun",["add","-g",t]];default:return["npm",["install","-g",t]]}}function qn(e){let[t,r]=fi(e);return Vn(t,r,{stdio:"inherit",shell:Q.platform==="win32"}).status===0}async function mi(){let e=Tt(),t=await Ct({force:!0});if(t&&!Et(t,e)){console.log(`velu is already up to date (v${e}).`);return}let r=Jn();console.log(t?`Updating velu ${e} \u2192 ${t} (via ${r})\u2026`:`Could not reach the npm registry; installing ${Ke}@latest (via ${r}) anyway\u2026`),qn(r)?console.log('\u2713 Updated. Run "velu version" to confirm.'):(console.error("Update failed. You can update manually with:"),console.error(` npm install -g ${Ke}@latest`),Q.exitCode=1)}async function di(){if(Q.env.VELU_NO_UPDATE==="1"||Q.env.VELU_UPDATED==="1"||!Q.stdout.isTTY)return;let e=Tt();if(e==="unknown")return;let t=null;try{t=await Ct()}catch{return}if(!Et(t,e))return;let r=Jn();if(console.log(`
87
+ New velu version available: ${e} \u2192 ${t}. Updating\u2026`),!qn(r)){console.log("Auto-update failed; continuing on the current version. Run `velu update` to retry.\n");return}console.log(`Restarting on the new version\u2026
88
+ `);let n=Vn(Q.execPath,Q.argv.slice(1),{stdio:"inherit",env:{...Q.env,VELU_UPDATED:"1"}});Q.exit(n.status??0)}var Ke,si,ai,li,Pt=_(()=>{Ke="@veluai/velu",si="https://registry.npmjs.org",ai=720*60*1e3,li=3e3});import gi from"node:fs/promises";import _t from"node:path";function Gn(e){if(!e.favicon)return null;let t=_t.extname(e.favicon).toLowerCase();return{url:Rt+t,type:yi[t]||""}}function Pe(e){if(typeof e=="string"){let t=e.trim();return t?{light:t,dark:t,href:"/"}:null}if(e&&typeof e=="object"){let t=(e.light??e.dark)?.trim?.(),r=(e.dark??e.light)?.trim?.();return!t||!r?null:{light:t,dark:r,href:e.href?.trim?.()||"/"}}return null}function vi(e){return!e||typeof e!="object"?{metatags:{},indexing:"navigable"}:{metatags:e.metatags&&typeof e.metatags=="object"?e.metatags:{},indexing:e.indexing==="all"?"all":"navigable"}}function Ut(e={},t){let r=e.colors?.primary??hi;return{name:e.name??t??"docs",theme:En(e.theme),url:typeof process.env.VELU_SITE_URL=="string"&&process.env.VELU_SITE_URL.trim()?process.env.VELU_SITE_URL.trim().replace(/\/+$/,""):null,seo:vi(e.seo),assistant:Ee(e.assistant),thumbnails:e.thumbnails&&typeof e.thumbnails=="object"&&typeof e.thumbnails.background=="string"?{background:e.thumbnails.background}:null,colors:{primary:r,light:e.theme==="vepa"?r:e.colors?.light??r,dark:e.theme==="vepa"?e.colors?.light??r:e.colors?.dark??r},favicon:e.favicon??null,api:Y(e.api),logo:Pe(e.logo),footer:Oe(e.footer),navbar:Te(e.navbar),font:{family:Tn(e)},navigation:e.navigation??null}}async function Wn(e){let t=_t.join(e,"velu.json"),r;try{r=await gi.readFile(t,"utf-8")}catch(o){throw o.code==="ENOENT"?new Error(`No velu.json found in ${e}. Run \`velu init <name>\` to scaffold one.`):o}let n;try{n=JSON.parse(r)}catch(o){throw new Error(`velu.json is not valid JSON: ${o.message}`)}return Ut(n,_t.basename(e))}function Hn(e){let{colors:t,font:r}=e;return St({light:t.light,dark:t.dark,family:r.family,theme:e.theme,primary:t.primary})}var hi,Xe,Ye,Rt,yi,_e=_(()=>{Ce();Ce();hi="#dc143c",Xe="/@velu-logo-light",Ye="/@velu-logo-dark",Rt="/@velu-favicon",yi={".svg":"image/svg+xml",".ico":"image/x-icon",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".avif":"image/avif"}});import{visit as Kn}from"unist-util-visit";import{toString as bi}from"mdast-util-to-string";import xi from"github-slugger";import{valueToEstree as wi}from"estree-util-value-to-estree";function $i(e,t){let r=a=>String(a||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),n=r(e),o=t==null||t===""?"":r(t);return`update-${o?n?`${n}-${o}`:o:n||"item"}`}function Nt(e,t){let r=(e.attributes||[]).find(n=>n&&n.type==="mdxJsxAttribute"&&n.name===t);if(r)return typeof r.value=="string"?r.value:void 0}function Si(e){let t=(e.attributes||[]).find(a=>a&&a.type==="mdxJsxAttribute"&&a.name==="tags");if(!t)return[];if(typeof t.value=="string")return[t.value];let r=t.value&&t.value.value?String(t.value.value):"",n=[],o=/["'`]([^"'`]+)["'`]/g,i;for(;i=o.exec(r);)n.push(i[1]);return n}function Re(){return e=>{let t=new xi,r=[];Kn(e,"heading",l=>{let c=bi(l);r.push({depth:l.depth,id:t.slug(c),label:c})});let n=[],o=[],i=new Set;if(Kn(e,"mdxJsxFlowElement",l=>{if(l.name!=="Update")return;let c=Nt(l,"label")??Nt(l,"date"),u=Nt(l,"description");c&&n.push({id:$i(c,u),label:u||c});for(let p of Si(l)){let y=p.trim().toLowerCase();p.trim()&&!i.has(y)&&(i.add(y),o.push(p.trim()))}}),n.length){Xn(e,n),Ft(e,"changelog",{tags:o});return}let a={children:[]},s=[{node:a,depth:0}];for(let l of r){for(;s.length>1&&s[s.length-1].depth>=l.depth;)s.pop();let c={id:l.id,label:l.label},u=s[s.length-1].node;u.children||(u.children=[]),u.children.push(c),s.push({node:c,depth:l.depth})}Xn(e,a.children),Ft(e,"changelog",null)}}function Xn(e,t){Ft(e,"toc",t)}function Ft(e,t,r){e.children.unshift({type:"mdxjsEsm",value:"",data:{estree:{type:"Program",sourceType:"module",body:[{type:"ExportNamedDeclaration",specifiers:[],declaration:{type:"VariableDeclaration",kind:"const",declarations:[{type:"VariableDeclarator",id:{type:"Identifier",name:t},init:wi(r)}]}}]}}})}var It=_(()=>{});import{visit as ki}from"unist-util-visit";function Mt(){return e=>{ki(e,"code",t=>{let r=(t.meta||"").trim();if(!r)return;let n={},o=r.match(/\btitle="([^"]*)"/);o&&(n["data-title"]=o[1],r=(r.slice(0,o.index)+r.slice(o.index+o[0].length)).trim());let i=r.match(/\{([\d,\s-]+)\}/);i&&(n["data-highlight"]=i[1].replace(/\s+/g,""),r=(r.slice(0,i.index)+r.slice(i.index+i[0].length)).trim()),r=r.replace(/\blineNumbers\b/,()=>(n["data-line-numbers"]="","")).trim(),r&&(n["data-filename"]=r),Object.keys(n).length&&(t.data=t.data||{},t.data.hProperties={...t.data.hProperties||{},...n})})}}var Yn=_(()=>{});import ji from"node:fs";import Zn from"node:path";function ae(e,t){let r=[],n=[],o=new Set;for(let i of ne(e)){if(i.node?.api){o.add(i.url);continue}if(o.has(i.url)){r.push(`duplicate URL "${i.url}" (page "${i.pagePath}") \u2014 keeping the first occurrence`);continue}o.add(i.url);let a=i.pagePath.replace(/^\/+|\/+$/g,""),s=Zn.join(t,...a.split("/"))+".mdx",l=ji.existsSync(s);l||r.push(`page "${i.pagePath}" \u2192 ${Zn.relative(t,s)} not found`),n.push({pagePath:i.pagePath,url:i.url,fileAbsPath:s,exists:l})}return{pageEntries:n,warnings:r}}var Ue=_(()=>{re()});import Ai from"@apidevtools/swagger-parser";async function Oi(e){return Ai.dereference(e)}async function Qn(e){return Ae(await Oi(e))}var er=_(()=>{Ge();Ge()});function tr(e,t){if(!t||typeof t!="object")return e;let r=Y(t);return{server:t.server!=null?r.server:e?.server??null,proxy:t.playground!=null?r.proxy:e?.proxy!==!1,languages:t.examples?.languages!=null?r.languages:e?.languages}}function Ti(e,{base:t,api:r,ops:n}){let o=r?.server,i=r?.languages||xt,a={proxy:r?.proxy!==!1,server:o??null},s=new Map;for(let c of e){let u=c.op.tags?.[0]||"API";s.has(u)||s.set(u,[]),s.get(u).push(c)}let l=[];for(let[c,u]of s){let p=u.map(({op:y,segment:m})=>{let g=`${t}/${zt(c)}/${y.id}`;return n[g]={operation:y,samples:We(y,{server:o||y.servers?.[0],languages:i}),segment:m,title:y.title,description:y.description,method:y.method,api:a},{apiPage:g,label:y.title,method:y.method}});l.push({group:c,pages:p})}return l}async function nr(e,{loadOps:t,base:r,api:n,ops:o}){let i=Array.isArray(e)?e:[e],a=[];for(let s of i){let{operations:l,segments:c,servers:u}=await t(s);l.forEach((p,y)=>{!p.servers?.length&&u?.length&&(p.servers=u),a.push({op:p,segment:c[y]})})}return Ti(a,{base:r,api:n,ops:o})}async function rr(e,t){if(!e||typeof e!="object")return e;if(typeof e.tab=="string"&&e.openapi){let n=zt(e.tab),o=tr(t.api,e.api),i=await nr(e.openapi,{...t,base:n,api:o}),{openapi:a,api:s,...l}=e;return{...l,groups:[...l.groups||[],...i]}}if(typeof e.group=="string"&&e.openapi){let n=zt(e.group),o=tr(t.api,e.api),i=await nr(e.openapi,{...t,base:n,api:o}),{openapi:a,api:s,...l}=e,c=i.flatMap(u=>u.pages);return{...l,pages:[...l.pages||[],...c]}}let r={...e};for(let n of["products","versions","languages","tabs","groups"])Array.isArray(e[n])&&(r[n]=await Promise.all(e[n].map(o=>rr(o,t))));return r}async function or(e,{api:t,loadOps:r}){let n={};return!e||typeof e!="object"?{nav:e,ops:n}:{nav:await rr(e,{api:t,loadOps:r,ops:n}),ops:n}}var zt,ir=_(()=>{Ce();wt();zt=e=>String(e??"").replace(/\{[^}]+\}/g,t=>t.slice(1,-1)).replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()||"x"});import Ei from"node:path";function Ci(e,t){return/^https?:\/\//.test(e)?e:Ei.resolve(t,e.replace(/^\/+/,""))}async function Ze(e,{targetDir:t,api:r}={}){return or(e,{api:r,loadOps:n=>Qn(Ci(n,t))})}var Vt=_(()=>{er();ir()});import ar from"node:fs";import ye from"node:path";import{createHash as Li}from"node:crypto";function Ne(e,{outDir:t}={}){let r=ye.resolve(e),n=t?ye.resolve(t):null,o=[],i=[],a=l=>{let c;try{c=ar.readdirSync(l,{withFileTypes:!0})}catch{return}for(let u of c){let p=ye.join(l,u.name);if(u.isDirectory()){if(u.name.startsWith(".")||_i.has(u.name)||n&&p===n)continue;a(p);continue}if(!u.isFile())continue;let y=ye.extname(u.name).toLowerCase();if(y!==sr&&y!==Pi)continue;let m=ye.relative(r,p).split(ye.sep).join("/"),g={rel:m,abs:p,url:`${Qe}/${m.split("/").map(encodeURIComponent).join("/")}?v=${Ri(p)}`,kind:y===sr?"css":"js"};(g.kind==="css"?o:i).push(g)}};a(r);let s=(l,c)=>l.rel<c.rel?-1:l.rel>c.rel?1:0;return o.sort(s),i.sort(s),{styles:o,scripts:i}}function Ri(e){try{return Li("sha1").update(ar.readFileSync(e)).digest("hex").slice(0,8)}catch{return"0"}}function lr(e,t){let r=`${Qe}/`;if(!t.startsWith(r))return null;let n;try{n=decodeURIComponent(t.slice(r.length))}catch{return null}return[...e.styles,...e.scripts].find(o=>o.rel===n)??null}function cr(e,t=""){return(e?.styles??[]).map(r=>`<link rel="stylesheet" href="${Ui(t+r.url)}" data-velu-custom />`).join(`
89
+ `)}var Qe,sr,Pi,_i,Ui,Bt=_(()=>{Qe="/@velu-custom",sr=".css",Pi=".js",_i=new Set(["node_modules","public","dist"]);Ui=e=>String(e).replace(/&/g,"&amp;").replace(/"/g,"&quot;")});import Ni from"node:fs";import Fe from"node:path";function fr(e,{buildOutDir:t}={}){return{name:"velu-site",resolveId(r){return r===pr?ur:null},async load(r){return r!==ur?null:Fi(e,{buildOutDir:t})}}}async function Fi(e,{buildOutDir:t}={}){let r={};try{r=JSON.parse(Ni.readFileSync(Fe.join(e,"velu.json"),"utf-8"))}catch{}let n=Y(r.api),o=r.navigation??{},i={};try{let x=await Ze(r.navigation??{},{targetDir:e,api:n});o=x.nav,i=x.ops}catch(x){console.warn(`[velu] openapi: ${x.message}`)}let a=X(o),{pageEntries:s,warnings:l}=ae(a,e);for(let x of l)console.warn(`[velu] nav: ${x}`);let c=Pe(r.logo),u={name:r.name??Fe.basename(e),theme:r.theme==="vepa"?"vepa":"velu",logo:c?{light:Xe,dark:Ye,href:c.href,mono:c.light===c.dark}:null,footer:Oe(r.footer),navbar:Te(r.navbar),contextual:kt(r.contextual),assistant:Ee(r.assistant),customScripts:Ne(e,{outDir:t}).scripts.map(x=>x.url)},p=[],y=[],m=0;for(let x of s){if(!x.exists)continue;let w=JSON.stringify(x.fileAbsPath.split(Fe.sep).join("/")),L=JSON.stringify(Fe.relative(e,x.fileAbsPath).split(Fe.sep).join("/")),P=`__p${m++}`;p.push(`import * as ${P} from ${w};`),y.push(` ${JSON.stringify(x.url)}: { Component: ${P}.default, frontmatter: ${P}.frontmatter, toc: ${P}.toc, changelog: ${P}.changelog, relPath: ${L}, ...__mdxApi(${P}) },`)}let g=new Set(s.filter(x=>x.exists).map(x=>x.url));for(let x of s)!x.exists&&!g.has(x.url)&&y.push(` ${JSON.stringify(x.url)}: { missing: true },`);let b=[],d=[],h=[],S=!1,O=0;for(let x of ne(a)){if(!x.node?.api)continue;let w=i[x.pagePath];if(!w)continue;S=!0;let L=`__op${O}`,P=`__samples${O}`,B=`__api${O}`;O+=1,b.push(`const ${L} = ${JSON.stringify(w.operation)};`),b.push(`const ${P} = ${JSON.stringify(w.samples)};`),h.push(`{ id: ${JSON.stringify(w.operation.id)}, method: ${JSON.stringify(w.operation.method)}, title: ${JSON.stringify(w.operation.title)}, url: ${JSON.stringify(x.url)}, operation: ${L}, samples: ${P}, api: ${JSON.stringify(w.api||{proxy:!0,server:null})} }`),d.push(`function ${B}(){ return React.createElement(ApiReferencePage, { preset: ${JSON.stringify(u.theme)}, operation: ${L}, samples: ${P}, apiOperations: __apiOperations, api: ${JSON.stringify(w.api||{proxy:!0,server:null})} }); }`),y.push(` ${JSON.stringify(x.url)}: { Component: ${B}, frontmatter: { title: ${JSON.stringify(w.title)}, description: ${JSON.stringify(w.description)} }, toc: [], operation: ${L}, samples: ${P}, api: true },`)}S&&(b.push(`const __apiOperations = [
90
90
  ${h.join(`,
91
91
  `)}
92
92
  ];`),b.push(d.join(`
@@ -95,17 +95,17 @@ ${h.join(`,
95
95
  `),"function __mdxApi(mod) { const data = Reflect.get(mod, 'veluApi'); return data?.operation ? { mdxApi: data, api: true, operation: data.operation, samples: data.samples } : {}; }",b.join(`
96
96
  `),"","export const pages = {",y.join(`
97
97
  `),"};",`export const navigation = ${JSON.stringify(a)};`,`export const site = ${JSON.stringify(u)};`,"if (site.logo) {"," const __veluBase = (import.meta.env.BASE_URL || '/').replace(/\\/$/, '');"," site.logo = { ...site.logo, light: __veluBase + site.logo.light, dark: __veluBase + site.logo.dark };","}",""].join(`
98
- `)}var pr,ur,mr=P(()=>{re();Ue();Pe();zt();Vt();pr="virtual:velu-site",ur="\0"+pr});import Qe from"node:path";function dr(e){let t=Qe.resolve(e);return{name:"velu-tailwind-project-source",enforce:"pre",transform(r,n){let o=n.split("?",1)[0].replace(/\\/g,"/");if(!o.endsWith("/styles.css")||!o.includes("/velu-ui/")||r.includes("data-velu-project-source"))return null;let i=Qe.dirname(n.split("?",1)[0]),a=Qe.relative(i,t).split(Qe.sep).join("/");!a||a===""?a=".":a.startsWith(".")||(a=`./${a}`);let s=`
98
+ `)}var pr,ur,mr=_(()=>{re();Ue();_e();Vt();Bt();pr="virtual:velu-site",ur="\0"+pr});import et from"node:path";function dr(e){let t=et.resolve(e);return{name:"velu-tailwind-project-source",enforce:"pre",transform(r,n){let o=n.split("?",1)[0].replace(/\\/g,"/");if(!o.endsWith("/styles.css")||!o.includes("/velu-ui/")||r.includes("data-velu-project-source"))return null;let i=et.dirname(n.split("?",1)[0]),a=et.relative(i,t).split(et.sep).join("/");!a||a===""?a=".":a.startsWith(".")||(a=`./${a}`);let s=`
99
99
  /* data-velu-project-source */
100
100
  @source "${a}/**/*.{mdx,md,jsx,tsx,js,ts,html}";
101
101
  @source not "${a}/node_modules";
102
102
  @source not "${a}/.velu";
103
103
  @source not "${a}/dist";
104
104
  @source not "${a}/.git";
105
- `;return{code:r+s,map:null}}}}var gr=P(()=>{});import{visit as Ii}from"unist-util-visit";function Mi(e,t){let r=hr(e).replace(/[?#].*$/,""),n=hr(t).replace(/\/+$/,"");return n&&r.toLowerCase().startsWith(n.toLowerCase())?r.slice(n.length).replace(/^\/+/,""):null}function yr(e,t){return()=>(r,n)=>{typeof e=="function"&&Ii(r,o=>{if(o.type!=="mdxJsxFlowElement"&&o.type!=="mdxJsxTextElement"||typeof o.name!="string"||!/^[A-Z]/.test(o.name)||o.name.includes("."))return;let i={};for(let s of o.attributes||[])s.type==="mdxJsxAttribute"&&(s.value==null?i[s.name]=!0:typeof s.value=="string"&&(i[s.name]=s.value));let a=e(o.name,i,{checkRequired:!1});if(a){let s=new Error(a.title);throw s.veluIssue={...a,file:Mi(n?.path,t),line:o.position?.start?.line??null,column:o.position?.start?.column??null},s.loc={line:s.veluIssue.line,column:s.veluIssue.column},s}})}}var hr,vr=P(()=>{hr=e=>String(e||"").replace(/\\/g,"/")});import et from"node:path";import zi from"node:fs";import{createRequire as Vi}from"node:module";import Bi from"@tailwindcss/vite";import Di from"@vitejs/plugin-react";import Ji from"@mdx-js/rollup";import qi from"remark-frontmatter";import Gi from"remark-mdx-frontmatter";import Wi from"remark-gfm";import Hi from"rehype-slug";function Ki(e){let r=Vi(import.meta.url).resolve("@mdx-js/react"),n=et.resolve(e,"runtime","velu-ui"),o=zi.existsSync(n)?n:et.resolve(e,"..","velu-ui","src");return[{find:"@mdx-js/react",replacement:r},{find:/^velu-ui$/,replacement:et.join(o,"index.js")},{find:/^velu-ui\//,replacement:o+"/"}]}function br({targetDir:e,VITE_ROOT:t,validateProps:r,basePath:n,buildOutDir:o}){return{root:t,base:n?`${n}/`:"/",plugins:[fr(e,{buildOutDir:o}),Ji({remarkPlugins:[qi,Gi,Wi,It,Re,yr(r,e)],rehypePlugins:[Hi],providerImportSource:"@mdx-js/react"}),Di(),dr(e),Bi({optimize:!1})],cacheDir:et.resolve(e,".velu","vite-cache"),optimizeDeps:{include:["react","react-dom","react-dom/client","react-router-dom","@mdx-js/react","lucide-react","prism-react-renderer","iso-639-1","github-slugger"],exclude:["tailwindcss","@tailwindcss/oxide","playwright","playwright-core","@apidevtools/swagger-parser","satori","@resvg/resvg-js","pagefind"],esbuildOptions:{loader:{".mdx":"jsx"}}},resolve:{alias:Ki(t),dedupe:["react","react-dom","@mdx-js/react"]}}}var xr=P(()=>{Ft();Yn();mr();gr();vr()});function I(e){return{category:"render-crash",severity:"error",file:null,line:null,column:null,frame:null,title:"Something went wrong",detail:"",hint:"",suggestion:null,...e}}function Xi(e,t){if(e=String(e),t=String(t),e===t)return 0;if(!e.length)return t.length;if(!t.length)return e.length;let r=Array.from({length:t.length+1},(o,i)=>i),n=new Array(t.length+1);for(let o=1;o<=e.length;o++){n[0]=o;for(let i=1;i<=t.length;i++){let a=e[o-1]===t[i-1]?0:1;n[i]=Math.min(n[i-1]+1,r[i]+1,r[i-1]+a)}[r,n]=[n,r]}return r[t.length]}function tt(e,t=[]){if(!e)return null;let r=String(e).toLowerCase(),n=null,o=1/0;for(let a of t){let s=Xi(r,String(a).toLowerCase());s<o&&(o=s,n=a)}let i=Math.min(3,Math.max(2,Math.floor(r.length/4)));return o<=i?n:null}function Yi(e,t){return e==="warning"?Z(t,H.yellow,"\u26A0"):e==="info"?Z(t,H.cyan,"\u2139"):Z(t,H.red,"\u2716")}function Dt(e,{color:t=!1}={}){let r=Bt[e.category]||e.category,n=e.line?`${e.line}${e.column?`:${e.column}`:""}`:"",o=e.file?`${e.file}${n?`:${n}`:""}`:n,i=[];if(i.push(`${Yi(e.severity,t)} ${Z(t,H.bold,r)}`+(o?` ${Z(t,H.dim,o)}`:"")),e.title&&i.push(` ${e.title}`),e.detail&&e.detail!==e.title&&i.push(` ${Z(t,H.dim,e.detail)}`),e.frame)for(let a of String(e.frame).split(`
105
+ `;return{code:r+s,map:null}}}}var gr=_(()=>{});import{visit as Ii}from"unist-util-visit";function Mi(e,t){let r=hr(e).replace(/[?#].*$/,""),n=hr(t).replace(/\/+$/,"");return n&&r.toLowerCase().startsWith(n.toLowerCase())?r.slice(n.length).replace(/^\/+/,""):null}function yr(e,t){return()=>(r,n)=>{typeof e=="function"&&Ii(r,o=>{if(o.type!=="mdxJsxFlowElement"&&o.type!=="mdxJsxTextElement"||typeof o.name!="string"||!/^[A-Z]/.test(o.name)||o.name.includes("."))return;let i={};for(let s of o.attributes||[])s.type==="mdxJsxAttribute"&&(s.value==null?i[s.name]=!0:typeof s.value=="string"&&(i[s.name]=s.value));let a=e(o.name,i,{checkRequired:!1});if(a){let s=new Error(a.title);throw s.veluIssue={...a,file:Mi(n?.path,t),line:o.position?.start?.line??null,column:o.position?.start?.column??null},s.loc={line:s.veluIssue.line,column:s.veluIssue.column},s}})}}var hr,vr=_(()=>{hr=e=>String(e||"").replace(/\\/g,"/")});import tt from"node:path";import zi from"node:fs";import{createRequire as Vi}from"node:module";import Bi from"@tailwindcss/vite";import Di from"@vitejs/plugin-react";import Ji from"@mdx-js/rollup";import qi from"remark-frontmatter";import Gi from"remark-mdx-frontmatter";import Wi from"remark-gfm";import Hi from"rehype-slug";function Ki(e){let r=Vi(import.meta.url).resolve("@mdx-js/react"),n=tt.resolve(e,"runtime","velu-ui"),o=zi.existsSync(n)?n:tt.resolve(e,"..","velu-ui","src");return[{find:"@mdx-js/react",replacement:r},{find:/^velu-ui$/,replacement:tt.join(o,"index.js")},{find:/^velu-ui\//,replacement:o+"/"}]}function br({targetDir:e,VITE_ROOT:t,validateProps:r,basePath:n,buildOutDir:o}){return{root:t,base:n?`${n}/`:"/",plugins:[fr(e,{buildOutDir:o}),Ji({remarkPlugins:[qi,Gi,Wi,Mt,Re,yr(r,e)],rehypePlugins:[Hi],providerImportSource:"@mdx-js/react"}),Di(),dr(e),Bi({optimize:!1})],cacheDir:tt.resolve(e,".velu","vite-cache"),optimizeDeps:{include:["react","react-dom","react-dom/client","react-router-dom","@mdx-js/react","lucide-react","prism-react-renderer","iso-639-1","github-slugger"],exclude:["tailwindcss","@tailwindcss/oxide","playwright","playwright-core","@apidevtools/swagger-parser","satori","@resvg/resvg-js","pagefind"],esbuildOptions:{loader:{".mdx":"jsx"}}},resolve:{alias:Ki(t),dedupe:["react","react-dom","@mdx-js/react"]}}}var xr=_(()=>{It();Yn();mr();gr();vr()});function I(e){return{category:"render-crash",severity:"error",file:null,line:null,column:null,frame:null,title:"Something went wrong",detail:"",hint:"",suggestion:null,...e}}function Xi(e,t){if(e=String(e),t=String(t),e===t)return 0;if(!e.length)return t.length;if(!t.length)return e.length;let r=Array.from({length:t.length+1},(o,i)=>i),n=new Array(t.length+1);for(let o=1;o<=e.length;o++){n[0]=o;for(let i=1;i<=t.length;i++){let a=e[o-1]===t[i-1]?0:1;n[i]=Math.min(n[i-1]+1,r[i]+1,r[i-1]+a)}[r,n]=[n,r]}return r[t.length]}function nt(e,t=[]){if(!e)return null;let r=String(e).toLowerCase(),n=null,o=1/0;for(let a of t){let s=Xi(r,String(a).toLowerCase());s<o&&(o=s,n=a)}let i=Math.min(3,Math.max(2,Math.floor(r.length/4)));return o<=i?n:null}function Yi(e,t){return e==="warning"?Z(t,H.yellow,"\u26A0"):e==="info"?Z(t,H.cyan,"\u2139"):Z(t,H.red,"\u2716")}function Jt(e,{color:t=!1}={}){let r=Dt[e.category]||e.category,n=e.line?`${e.line}${e.column?`:${e.column}`:""}`:"",o=e.file?`${e.file}${n?`:${n}`:""}`:n,i=[];if(i.push(`${Yi(e.severity,t)} ${Z(t,H.bold,r)}`+(o?` ${Z(t,H.dim,o)}`:"")),e.title&&i.push(` ${e.title}`),e.detail&&e.detail!==e.title&&i.push(` ${Z(t,H.dim,e.detail)}`),e.frame)for(let a of String(e.frame).split(`
106
106
  `))i.push(` ${a}`);return e.suggestion&&i.push(` ${Z(t,H.cyan,`Did you mean <${e.suggestion}>?`)}`),e.hint&&i.push(` ${Z(t,H.dim,`\u2192 ${e.hint}`)}`),i.join(`
107
- `)}function nt(e,{color:t=!1}={}){if(!e.length)return Z(t,H.cyan,"\u2713 No issues found.");let r=new Map;for(let s of e){let l=s.file||"velu.json";r.has(l)||r.set(l,[]),r.get(l).push(s)}let n=[];for(let[s,l]of r){n.push(Z(t,H.bold,s));for(let c of l)n.push(Dt({...c,file:null},{color:t}).replace(/^/gm," "));n.push("")}let o=e.filter(s=>s.severity!=="warning"&&s.severity!=="info").length,i=e.length-o,a=`${o} error${o===1?"":"s"}`+(i?`, ${i} warning${i===1?"":"s"}`:"");return n.push(Z(t,o?H.red:H.yellow,a)),n.join(`
108
- `)}var Bt,H,Z,ue=P(()=>{Bt={"mdx-syntax":"MDX syntax",frontmatter:"Frontmatter","unknown-component":"Unknown component","invalid-props":"Invalid options","render-crash":"Render error","config-json":"velu.json","config-schema":"velu.json","config-nav":"Navigation","config-asset":"Asset"};H={reset:"\x1B[0m",red:"\x1B[31m",yellow:"\x1B[33m",cyan:"\x1B[36m",dim:"\x1B[2m",bold:"\x1B[1m"},Z=(e,t,r)=>e?`${t}${r}${H.reset}`:r});function Zi(e){let t=e,r=0;for(;t&&t.cause&&r<3&&!(t.loc||t.line||/`[^`]+` to be defined/.test(t.message||""));)t=t.cause,r+=1;return t||e}function Jt(e,t){if(!e)return null;let r=wr(e).replace(/[?#].*$/,""),n=t?wr(t).replace(/\/+$/,""):"";return n&&r.toLowerCase().startsWith(n.toLowerCase())?r.slice(n.length).replace(/^\/+/,""):!/^([a-zA-Z]:\/|\/)/.test(r)&&!/node_modules/.test(r)?r:null}function Qi(e){return e?String(e).replace(/([a-zA-Z]:\\|\/)[^\s'"()]+/g,t=>/node_modules|[\\/]vite[\\/]|@veluai|velu-cli|velu-ui/.test(t)?"\u2026":t).trim():""}function es(e){let t=/\((\d+):(\d+)(?:-\d+:\d+)?\)\s*$/.exec(String(e||""));return t?{line:Number(t[1]),column:Number(t[2])}:null}function ts(e){return String(e||"").replace(/\s*\(\d+:\d+(?:-\d+:\d+)?\)\s*$/,"").trim()}function rs(e,t){if(!e||!t)return null;let r=String(e);return/node_modules|[\\/]vite[\\/]|@veluai[\\/]/.test(r)?null:r}function Ie(e,t={}){let{projectDir:r="",knownComponents:n=[],file:o=null}=t,i=null;for(let h=e,S=0;h&&S<6;h=h.cause,S+=1)if(h.veluIssue){i=h.veluIssue;break}if(i)return I({...i,file:i.file||o});let a=Zi(e)||{},s=a.message||String(e||""),l=/Expected component `([^`]+)` to be defined/.exec(s);if(l){let h=l[1],S=/referenced in your code at `(\d+):(\d+)/.exec(s),T=/\bin `([^`]+)`/.exec(s),A=T?Jt(T[1],r):null;return I({category:"unknown-component",file:A||o,line:S?Number(S[1]):null,column:S?Number(S[2]):null,title:`<${h}> is not a built-in component`,detail:"",hint:"Components are built in \u2014 check the spelling and capitalization (you don\u2019t import them).",suggestion:tt(h,n)})}let c=a.loc||(a.line!=null?{line:a.line,column:a.column,file:a.file}:null)||es(a.reason||s),u=a.id||c&&c.file||a.file||null,p=Jt(u,r)||o,y=!!p&&Jt(u,r)!=null,m=rs(a.frame,y||!!o),g=Qi(ts(a.reason||s)),b=ns.test(s),d=a.source==="remark-frontmatter"||/\byaml\b|frontmatter/i.test(s)||c&&c.line===1&&/unexpected|expected/i.test(s)&&/---/.test(s);return c||b||m&&y?I({category:d?"frontmatter":"mdx-syntax",file:p,line:c?c.line:null,column:c?c.column:null,frame:m,title:g||(d?"Invalid frontmatter":"MDX syntax error"),detail:"",hint:d?"Check the YAML between the --- markers \u2014 indentation, quotes, and colons.":"Make sure every <Component> has a matching closing tag and that { } braces are balanced."}):/\.map is not a function|is not iterable|reading '|undefined \(reading/i.test(s)?I({category:"invalid-props",file:p,title:"A component received an invalid value",detail:g,hint:"Check the props/options you passed to a component on this page."}):I({category:"render-crash",file:p,title:"This page failed to render",detail:g,hint:"Set VELU_DEBUG=1 for the full stack trace."})}var wr,ns,qt=P(()=>{ue();wr=e=>String(e).replace(/\\/g,"/");ns=/closing tag|unexpected closing|could not parse (?:expression|import|export)|unexpected character|unexpected end of|expected a closing|expected the closing|unexpected `|in expression|misnested|before name/i});function os(e){let t=Bt[e.category]||e.category,r=e.file?`${e.file}${e.line?`:${e.line}${e.column?`:${e.column}`:""}`:""}`:"",n=[];return n.push('<div class="velu-err-card">'),n.push('<div class="velu-err-head">'),n.push(`<span class="velu-err-pill">${oe(t)}</span>`),n.push("</div>"),e.title&&n.push(`<div class="velu-err-title">${oe(e.title)}</div>`),r&&n.push(`<a class="velu-err-loc" title="${oe(r)}">${oe(r)}</a>`),e.detail&&n.push(`<div class="velu-err-detail">${oe(e.detail)}</div>`),e.frame&&n.push(`<pre class="velu-err-frame">${oe(e.frame)}</pre>`),e.suggestion&&n.push(`<div class="velu-err-suggest">Did you mean <code>&lt;${oe(e.suggestion)}&gt;</code>?</div>`),e.hint&&n.push(`<div class="velu-err-hint">${oe(e.hint)}</div>`),n.push("</div>"),n.join("")}function Gt(e,t={}){let r=Array.isArray(e)?e:[e],n=t.title||(r.length>1?`${r.length} problems to fix`:"There\u2019s a problem to fix"),o=r.map(os).join(`
107
+ `)}function rt(e,{color:t=!1}={}){if(!e.length)return Z(t,H.cyan,"\u2713 No issues found.");let r=new Map;for(let s of e){let l=s.file||"velu.json";r.has(l)||r.set(l,[]),r.get(l).push(s)}let n=[];for(let[s,l]of r){n.push(Z(t,H.bold,s));for(let c of l)n.push(Jt({...c,file:null},{color:t}).replace(/^/gm," "));n.push("")}let o=e.filter(s=>s.severity!=="warning"&&s.severity!=="info").length,i=e.length-o,a=`${o} error${o===1?"":"s"}`+(i?`, ${i} warning${i===1?"":"s"}`:"");return n.push(Z(t,o?H.red:H.yellow,a)),n.join(`
108
+ `)}var Dt,H,Z,ue=_(()=>{Dt={"mdx-syntax":"MDX syntax",frontmatter:"Frontmatter","unknown-component":"Unknown component","invalid-props":"Invalid options","render-crash":"Render error","config-json":"velu.json","config-schema":"velu.json","config-nav":"Navigation","config-asset":"Asset"};H={reset:"\x1B[0m",red:"\x1B[31m",yellow:"\x1B[33m",cyan:"\x1B[36m",dim:"\x1B[2m",bold:"\x1B[1m"},Z=(e,t,r)=>e?`${t}${r}${H.reset}`:r});function Zi(e){let t=e,r=0;for(;t&&t.cause&&r<3&&!(t.loc||t.line||/`[^`]+` to be defined/.test(t.message||""));)t=t.cause,r+=1;return t||e}function qt(e,t){if(!e)return null;let r=wr(e).replace(/[?#].*$/,""),n=t?wr(t).replace(/\/+$/,""):"";return n&&r.toLowerCase().startsWith(n.toLowerCase())?r.slice(n.length).replace(/^\/+/,""):!/^([a-zA-Z]:\/|\/)/.test(r)&&!/node_modules/.test(r)?r:null}function Qi(e){return e?String(e).replace(/([a-zA-Z]:\\|\/)[^\s'"()]+/g,t=>/node_modules|[\\/]vite[\\/]|@veluai|velu-cli|velu-ui/.test(t)?"\u2026":t).trim():""}function es(e){let t=/\((\d+):(\d+)(?:-\d+:\d+)?\)\s*$/.exec(String(e||""));return t?{line:Number(t[1]),column:Number(t[2])}:null}function ts(e){return String(e||"").replace(/\s*\(\d+:\d+(?:-\d+:\d+)?\)\s*$/,"").trim()}function rs(e,t){if(!e||!t)return null;let r=String(e);return/node_modules|[\\/]vite[\\/]|@veluai[\\/]/.test(r)?null:r}function Ie(e,t={}){let{projectDir:r="",knownComponents:n=[],file:o=null}=t,i=null;for(let h=e,S=0;h&&S<6;h=h.cause,S+=1)if(h.veluIssue){i=h.veluIssue;break}if(i)return I({...i,file:i.file||o});let a=Zi(e)||{},s=a.message||String(e||""),l=/Expected component `([^`]+)` to be defined/.exec(s);if(l){let h=l[1],S=/referenced in your code at `(\d+):(\d+)/.exec(s),O=/\bin `([^`]+)`/.exec(s),A=O?qt(O[1],r):null;return I({category:"unknown-component",file:A||o,line:S?Number(S[1]):null,column:S?Number(S[2]):null,title:`<${h}> is not a built-in component`,detail:"",hint:"Components are built in \u2014 check the spelling and capitalization (you don\u2019t import them).",suggestion:nt(h,n)})}let c=a.loc||(a.line!=null?{line:a.line,column:a.column,file:a.file}:null)||es(a.reason||s),u=a.id||c&&c.file||a.file||null,p=qt(u,r)||o,y=!!p&&qt(u,r)!=null,m=rs(a.frame,y||!!o),g=Qi(ts(a.reason||s)),b=ns.test(s),d=a.source==="remark-frontmatter"||/\byaml\b|frontmatter/i.test(s)||c&&c.line===1&&/unexpected|expected/i.test(s)&&/---/.test(s);return c||b||m&&y?I({category:d?"frontmatter":"mdx-syntax",file:p,line:c?c.line:null,column:c?c.column:null,frame:m,title:g||(d?"Invalid frontmatter":"MDX syntax error"),detail:"",hint:d?"Check the YAML between the --- markers \u2014 indentation, quotes, and colons.":"Make sure every <Component> has a matching closing tag and that { } braces are balanced."}):/\.map is not a function|is not iterable|reading '|undefined \(reading/i.test(s)?I({category:"invalid-props",file:p,title:"A component received an invalid value",detail:g,hint:"Check the props/options you passed to a component on this page."}):I({category:"render-crash",file:p,title:"This page failed to render",detail:g,hint:"Set VELU_DEBUG=1 for the full stack trace."})}var wr,ns,Gt=_(()=>{ue();wr=e=>String(e).replace(/\\/g,"/");ns=/closing tag|unexpected closing|could not parse (?:expression|import|export)|unexpected character|unexpected end of|expected a closing|expected the closing|unexpected `|in expression|misnested|before name/i});function os(e){let t=Dt[e.category]||e.category,r=e.file?`${e.file}${e.line?`:${e.line}${e.column?`:${e.column}`:""}`:""}`:"",n=[];return n.push('<div class="velu-err-card">'),n.push('<div class="velu-err-head">'),n.push(`<span class="velu-err-pill">${oe(t)}</span>`),n.push("</div>"),e.title&&n.push(`<div class="velu-err-title">${oe(e.title)}</div>`),r&&n.push(`<a class="velu-err-loc" title="${oe(r)}">${oe(r)}</a>`),e.detail&&n.push(`<div class="velu-err-detail">${oe(e.detail)}</div>`),e.frame&&n.push(`<pre class="velu-err-frame">${oe(e.frame)}</pre>`),e.suggestion&&n.push(`<div class="velu-err-suggest">Did you mean <code>&lt;${oe(e.suggestion)}&gt;</code>?</div>`),e.hint&&n.push(`<div class="velu-err-hint">${oe(e.hint)}</div>`),n.push("</div>"),n.join("")}function Wt(e,t={}){let r=Array.isArray(e)?e:[e],n=t.title||(r.length>1?`${r.length} problems to fix`:"There\u2019s a problem to fix"),o=r.map(os).join(`
109
109
  `);return`<!doctype html>
110
110
  <html lang="en">
111
111
  <head>
@@ -177,16 +177,16 @@ ${h.join(`,
177
177
  <div class="velu-err-foot">Fix the file and save \u2014 this page reloads automatically.</div>
178
178
  </div>
179
179
  </body>
180
- </html>`}var oe,$r=P(()=>{ue();oe=e=>String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")});import rt from"node:fs";import ze from"node:path";import{fileURLToPath as is}from"node:url";import ss from"iso-639-1";function Me(e,t){if(!t)return null;let r=e.indexOf(`"${t}"`);return r===-1?null:e.slice(0,r).split(`
180
+ </html>`}var oe,$r=_(()=>{ue();oe=e=>String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")});import ot from"node:fs";import ze from"node:path";import{fileURLToPath as is}from"node:url";import ss from"iso-639-1";function Me(e,t){if(!t)return null;let r=e.indexOf(`"${t}"`);return r===-1?null:e.slice(0,r).split(`
181
181
  `).length}function cs(e,t){return t==null||t<0?null:e.slice(0,t).split(`
182
- `).length}function Wt(e,t){if(!t)return null;let r=e.indexOf(`"${t}"`);return r===-1?null:e.slice(0,r).split(`
183
- `).length}function us(e,t,r){let n=[];return s(e,t,"",null),n;function o(l){if(l&&l.$ref){let c=l.$ref.replace(/^#\//,"").split("/"),u=r;for(let p of c)u=u?.[p];return u||{}}return l}function i(l){return Array.isArray(l)?"array":l===null?"null":typeof l}function a(l,c){let u=n.length;s(l,c,"",null,!0);let p=n.length===u;return p||(n.length=u),p}function s(l,c,u,p,y){let m=o(c);if(m){if(m.oneOf){m.oneOf.some(b=>a(l,b))||n.push({path:u,key:p,message:"value does not match any allowed shape"});return}if(m.type&&i(l)!==m.type){n.push({path:u,key:p,message:`expected ${m.type}, got ${i(l)}`});return}if(m.type==="string"&&m.minLength!=null&&l.length<m.minLength&&n.push({path:u,key:p,message:"must not be empty"}),m.type==="object"&&i(l)==="object"){for(let b of m.required||[])b in l||n.push({path:u?`${u}.${b}`:b,key:b,message:`missing required "${b}"`});let g=m.properties||{};if(m.additionalProperties===!1)for(let b of Object.keys(l))b in g||n.push({path:u?`${u}.${b}`:b,key:b,message:`unknown field "${b}"`});for(let[b,d]of Object.entries(g))b in l&&s(l[b],d,u?`${u}.${b}`:b,b,y)}m.type==="array"&&Array.isArray(l)&&m.items&&l.forEach((g,b)=>s(g,m.items,`${u}[${b}]`,p,y))}}}function ps(e){if(typeof e!="string")return!1;let t=e.trim();return/^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(t)||/^(rgb|rgba|hsl|hsla|color|oklch|lab|lch)\(/i.test(t)||/^[a-z][a-z0-9-]*$/i.test(t)}function ot(e){let t=[],r=ze.join(e,"velu.json"),n;try{n=rt.readFileSync(r,"utf-8")}catch(s){return s.code==="ENOENT"?t.push(I({category:"config-json",file:"velu.json",title:"No velu.json found",hint:"Run `velu init <name>` to scaffold a project."})):t.push(I({category:"config-json",file:"velu.json",title:"Could not read velu.json"})),t}let o;try{o=JSON.parse(n)}catch(s){let l=/position (\d+)/.exec(s.message||""),c=l?cs(n,Number(l[1])):null;return t.push(I({category:"config-json",file:"velu.json",line:c,title:"velu.json is not valid JSON",detail:String(s.message||"").replace(/\s+in JSON.*$/,""),hint:"Check for a trailing comma, a missing quote, or an unclosed brace."})),t}let i=null;try{i=JSON.parse(rt.readFileSync(ls,"utf-8"))}catch{}if(i)for(let s of us(o,i,i)){let l=/^unknown field/.test(s.message);t.push(I({category:"config-schema",severity:l?"warning":"error",file:"velu.json",line:Me(n,s.key),title:s.path?`${s.path}: ${s.message}`:s.message,hint:l?"Remove it, or check the spelling against the velu.json schema.":""}))}for(let s of["primary","light","dark"]){let l=o.colors?.[s];l!=null&&!ps(l)&&t.push(I({category:"config-schema",severity:"warning",file:"velu.json",line:Me(n,s),title:`colors.${s}: "${l}" doesn\u2019t look like a CSS color`,hint:"Use a hex value like #dc143c, an rgb()/hsl() function, or a CSS color name."}))}if(typeof o.favicon=="string"&&o.favicon.trim()){let s=ze.resolve(e,o.favicon.replace(/^\/+/,""));rt.existsSync(s)||t.push(I({category:"config-asset",file:"velu.json",line:Me(n,"favicon"),title:`favicon not found: ${o.favicon}`,hint:"The path is relative to the project root."}))}let a=_e(o.logo);if(a){let s=new Map;for(let l of["light","dark"]){let c=a[l];c&&s.set(c,[...s.get(c)||[],l])}for(let[l,c]of s)if(!rt.existsSync(ze.resolve(e,l.replace(/^\/+/,"")))){let u=c.length===2?"logo":`logo (${c[0]})`;t.push(I({category:"config-asset",file:"velu.json",line:Wt(n,l),title:`${u} not found: ${l}`,hint:"The path is relative to the project root."}))}}if(o.navigation&&typeof o.navigation=="object"){let s;try{s=X(o.navigation)}catch(l){t.push(I({category:"config-nav",file:"velu.json",line:Me(n,"navigation"),title:"navigation could not be processed",detail:String(l.message||"")})),s=null}if(s){let{pageEntries:l,warnings:c}=ae(s,e);for(let u of c){let p=/not found$/.test(u),y=/page "([^"]+)"/.exec(u),m=y?Wt(n,y[1]):null;t.push(I({category:"config-nav",severity:p?"error":"warning",file:"velu.json",line:m,title:u,hint:p?"Create the .mdx file, or remove the page from navigation.":""}))}fs(s,n,t)}}return t}function fs(e,t,r){let n=new Set,o=i=>{if(!(!i||typeof i!="object")){if(i.language&&!n.has(i.language)){n.add(i.language);let a=String(i.language).toLowerCase();ss.validate(a)||r.push(I({category:"config-nav",severity:"warning",file:"velu.json",line:Wt(t,i.language)||Me(t,"language"),title:`"${i.language}" is not a valid ISO 639-1 language code`,hint:'Use a two-letter code like "en", "fr", or "ja".'}))}for(let a of Object.values(i))Array.isArray(a)?a.forEach(o):a&&typeof a=="object"&&o(a)}};o(e)}var as,ls,Ht=P(()=>{ue();re();Ue();Pe();as=ze.dirname(is(import.meta.url)),ls=ze.resolve(as,"..","..","schema","velu.schema.json")});import ms from"node:fs/promises";import ds from"node:fs";import pe from"node:path";import{fileURLToPath as gs,pathToFileURL as hs}from"node:url";import{compile as ys}from"@mdx-js/mdx";import vs from"remark-frontmatter";import bs from"remark-mdx-frontmatter";import xs from"remark-gfm";import ws from"rehype-slug";import{visit as $s}from"unist-util-visit";function Kt(){if(it)return it;let e=pe.dirname(gs(import.meta.url)),t=[pe.resolve(e,"..","runtime","velu-ui"),pe.resolve(e,"..","..","runtime","velu-ui"),pe.resolve(e,"..","..","..","velu-ui","src")],r=null;for(let n of t){let o=pe.join(n,"lib","component-schemas.js");if(ds.existsSync(o)){r=o;break}}return it=r?import(hs(r).href).then(n=>n.validateProps).catch(()=>null):Promise.resolve(null),it}function Ss(e){let t={};for(let r of e.attributes||[])r.type==="mdxJsxAttribute"&&(r.value==null?t[r.name]=!0:typeof r.value=="string"&&(t[r.name]=r.value));return t}function ks(e,t){return()=>r=>{$s(r,n=>{if((n.type==="mdxJsxFlowElement"||n.type==="mdxJsxTextElement")&&typeof n.name=="string"&&/^[A-Z]/.test(n.name)&&!n.name.includes(".")&&e.push({name:n.name,props:Ss(n),line:n.position?.start?.line??null,column:n.position?.start?.column??null}),n.type==="mdxjsEsm"&&typeof n.value=="string")for(let o of n.value.matchAll(/\b([A-Z][A-Za-z0-9_]*)\b/g))t.add(o[1])})}}async function js(e,t){let r=[],n;try{n=await ms.readFile(t.fileAbsPath,"utf-8")}catch{return r}let o=pe.relative(e,t.fileAbsPath).split(pe.sep).join("/"),i=[],a=new Set;try{await ys({value:n,path:t.fileAbsPath},{remarkPlugins:[vs,bs,xs,Re,ks(i,a)],rehypePlugins:[ws],providerImportSource:"@mdx-js/react"})}catch(u){return r.push(Ie(u,{projectDir:e,knownComponents:te,file:o})),r}let s=new Set(te),l=await Kt(),c=new Set;for(let u of i)if(!a.has(u.name)){if(!s.has(u.name)){if(c.has(u.name))continue;c.add(u.name),r.push(I({category:"unknown-component",file:o,line:u.line,column:u.column,title:`<${u.name}> is not a built-in component`,hint:"Components are built in \u2014 check the spelling and capitalization (you don\u2019t import them).",suggestion:tt(u.name,te)}));continue}if(l){let p=l(u.name,u.props,{checkRequired:!1});p&&r.push(I({...p,file:o,line:u.line,column:u.column}))}}return r}async function Sr(e,t){let r=t.filter(s=>s.exists),n=[],o=8,i=0;async function a(){for(;i<r.length;){let s=r[i++],l=await js(e,s);for(let c of l)n.push(c)}}return await Promise.all(Array.from({length:Math.min(o,r.length)},a)),n}var it,Xt=P(()=>{Ft();ue();qt();De()});import Ve from"node:fs";import Yt from"node:path";import Ar from"js-yaml";function Zt(e,t,r){if(r>24||e===null||typeof e!="object")return r>24&&e&&typeof e=="object"?null:e;if(t.has(e))return null;t.add(e);let n;if(Array.isArray(e))n=e.map(o=>Zt(o,t,r+1));else{n={};for(let[o,i]of Object.entries(e))n[o]=Zt(i,t,r+1)}return t.delete(e),n}function Or(e){return Ar.dump(Zt(e,new Set,0),{noRefs:!0,lineWidth:100,skipInvalid:!0})}function Tr(e){let t=String(e).replace(/\.md$/i,"");return t===""||t==="/"||t==="/index"?"/":t.replace(/\/+$/,"")||"/"}function As(e){return e==="/"?"/index.md":`${e}.md`}function Qt(e,t){if(t==="api")return`# ${kr}
182
+ `).length}function Ht(e,t){if(!t)return null;let r=e.indexOf(`"${t}"`);return r===-1?null:e.slice(0,r).split(`
183
+ `).length}function us(e,t,r){let n=[];return s(e,t,"",null),n;function o(l){if(l&&l.$ref){let c=l.$ref.replace(/^#\//,"").split("/"),u=r;for(let p of c)u=u?.[p];return u||{}}return l}function i(l){return Array.isArray(l)?"array":l===null?"null":typeof l}function a(l,c){let u=n.length;s(l,c,"",null,!0);let p=n.length===u;return p||(n.length=u),p}function s(l,c,u,p,y){let m=o(c);if(m){if(m.oneOf){m.oneOf.some(b=>a(l,b))||n.push({path:u,key:p,message:"value does not match any allowed shape"});return}if(m.type&&i(l)!==m.type){n.push({path:u,key:p,message:`expected ${m.type}, got ${i(l)}`});return}if(m.type==="string"&&m.minLength!=null&&l.length<m.minLength&&n.push({path:u,key:p,message:"must not be empty"}),m.type==="object"&&i(l)==="object"){for(let b of m.required||[])b in l||n.push({path:u?`${u}.${b}`:b,key:b,message:`missing required "${b}"`});let g=m.properties||{};if(m.additionalProperties===!1)for(let b of Object.keys(l))b in g||n.push({path:u?`${u}.${b}`:b,key:b,message:`unknown field "${b}"`});for(let[b,d]of Object.entries(g))b in l&&s(l[b],d,u?`${u}.${b}`:b,b,y)}m.type==="array"&&Array.isArray(l)&&m.items&&l.forEach((g,b)=>s(g,m.items,`${u}[${b}]`,p,y))}}}function ps(e){if(typeof e!="string")return!1;let t=e.trim();return/^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(t)||/^(rgb|rgba|hsl|hsla|color|oklch|lab|lch)\(/i.test(t)||/^[a-z][a-z0-9-]*$/i.test(t)}function it(e){let t=[],r=ze.join(e,"velu.json"),n;try{n=ot.readFileSync(r,"utf-8")}catch(s){return s.code==="ENOENT"?t.push(I({category:"config-json",file:"velu.json",title:"No velu.json found",hint:"Run `velu init <name>` to scaffold a project."})):t.push(I({category:"config-json",file:"velu.json",title:"Could not read velu.json"})),t}let o;try{o=JSON.parse(n)}catch(s){let l=/position (\d+)/.exec(s.message||""),c=l?cs(n,Number(l[1])):null;return t.push(I({category:"config-json",file:"velu.json",line:c,title:"velu.json is not valid JSON",detail:String(s.message||"").replace(/\s+in JSON.*$/,""),hint:"Check for a trailing comma, a missing quote, or an unclosed brace."})),t}let i=null;try{i=JSON.parse(ot.readFileSync(ls,"utf-8"))}catch{}if(i)for(let s of us(o,i,i)){let l=/^unknown field/.test(s.message);t.push(I({category:"config-schema",severity:l?"warning":"error",file:"velu.json",line:Me(n,s.key),title:s.path?`${s.path}: ${s.message}`:s.message,hint:l?"Remove it, or check the spelling against the velu.json schema.":""}))}for(let s of["primary","light","dark"]){let l=o.colors?.[s];l!=null&&!ps(l)&&t.push(I({category:"config-schema",severity:"warning",file:"velu.json",line:Me(n,s),title:`colors.${s}: "${l}" doesn\u2019t look like a CSS color`,hint:"Use a hex value like #dc143c, an rgb()/hsl() function, or a CSS color name."}))}if(typeof o.favicon=="string"&&o.favicon.trim()){let s=ze.resolve(e,o.favicon.replace(/^\/+/,""));ot.existsSync(s)||t.push(I({category:"config-asset",file:"velu.json",line:Me(n,"favicon"),title:`favicon not found: ${o.favicon}`,hint:"The path is relative to the project root."}))}let a=Pe(o.logo);if(a){let s=new Map;for(let l of["light","dark"]){let c=a[l];c&&s.set(c,[...s.get(c)||[],l])}for(let[l,c]of s)if(!ot.existsSync(ze.resolve(e,l.replace(/^\/+/,"")))){let u=c.length===2?"logo":`logo (${c[0]})`;t.push(I({category:"config-asset",file:"velu.json",line:Ht(n,l),title:`${u} not found: ${l}`,hint:"The path is relative to the project root."}))}}if(o.navigation&&typeof o.navigation=="object"){let s;try{s=X(o.navigation)}catch(l){t.push(I({category:"config-nav",file:"velu.json",line:Me(n,"navigation"),title:"navigation could not be processed",detail:String(l.message||"")})),s=null}if(s){let{pageEntries:l,warnings:c}=ae(s,e);for(let u of c){let p=/not found$/.test(u),y=/page "([^"]+)"/.exec(u),m=y?Ht(n,y[1]):null;t.push(I({category:"config-nav",severity:p?"error":"warning",file:"velu.json",line:m,title:u,hint:p?"Create the .mdx file, or remove the page from navigation.":""}))}fs(s,n,t)}}return t}function fs(e,t,r){let n=new Set,o=i=>{if(!(!i||typeof i!="object")){if(i.language&&!n.has(i.language)){n.add(i.language);let a=String(i.language).toLowerCase();ss.validate(a)||r.push(I({category:"config-nav",severity:"warning",file:"velu.json",line:Ht(t,i.language)||Me(t,"language"),title:`"${i.language}" is not a valid ISO 639-1 language code`,hint:'Use a two-letter code like "en", "fr", or "ja".'}))}for(let a of Object.values(i))Array.isArray(a)?a.forEach(o):a&&typeof a=="object"&&o(a)}};o(e)}var as,ls,Kt=_(()=>{ue();re();Ue();_e();as=ze.dirname(is(import.meta.url)),ls=ze.resolve(as,"..","..","schema","velu.schema.json")});import ms from"node:fs/promises";import ds from"node:fs";import pe from"node:path";import{fileURLToPath as gs,pathToFileURL as hs}from"node:url";import{compile as ys}from"@mdx-js/mdx";import vs from"remark-frontmatter";import bs from"remark-mdx-frontmatter";import xs from"remark-gfm";import ws from"rehype-slug";import{visit as $s}from"unist-util-visit";function Xt(){if(st)return st;let e=pe.dirname(gs(import.meta.url)),t=[pe.resolve(e,"..","runtime","velu-ui"),pe.resolve(e,"..","..","runtime","velu-ui"),pe.resolve(e,"..","..","..","velu-ui","src")],r=null;for(let n of t){let o=pe.join(n,"lib","component-schemas.js");if(ds.existsSync(o)){r=o;break}}return st=r?import(hs(r).href).then(n=>n.validateProps).catch(()=>null):Promise.resolve(null),st}function Ss(e){let t={};for(let r of e.attributes||[])r.type==="mdxJsxAttribute"&&(r.value==null?t[r.name]=!0:typeof r.value=="string"&&(t[r.name]=r.value));return t}function ks(e,t){return()=>r=>{$s(r,n=>{if((n.type==="mdxJsxFlowElement"||n.type==="mdxJsxTextElement")&&typeof n.name=="string"&&/^[A-Z]/.test(n.name)&&!n.name.includes(".")&&e.push({name:n.name,props:Ss(n),line:n.position?.start?.line??null,column:n.position?.start?.column??null}),n.type==="mdxjsEsm"&&typeof n.value=="string")for(let o of n.value.matchAll(/\b([A-Z][A-Za-z0-9_]*)\b/g))t.add(o[1])})}}async function js(e,t){let r=[],n;try{n=await ms.readFile(t.fileAbsPath,"utf-8")}catch{return r}let o=pe.relative(e,t.fileAbsPath).split(pe.sep).join("/"),i=[],a=new Set;try{await ys({value:n,path:t.fileAbsPath},{remarkPlugins:[vs,bs,xs,Re,ks(i,a)],rehypePlugins:[ws],providerImportSource:"@mdx-js/react"})}catch(u){return r.push(Ie(u,{projectDir:e,knownComponents:te,file:o})),r}let s=new Set(te),l=await Xt(),c=new Set;for(let u of i)if(!a.has(u.name)){if(!s.has(u.name)){if(c.has(u.name))continue;c.add(u.name),r.push(I({category:"unknown-component",file:o,line:u.line,column:u.column,title:`<${u.name}> is not a built-in component`,hint:"Components are built in \u2014 check the spelling and capitalization (you don\u2019t import them).",suggestion:nt(u.name,te)}));continue}if(l){let p=l(u.name,u.props,{checkRequired:!1});p&&r.push(I({...p,file:o,line:u.line,column:u.column}))}}return r}async function Sr(e,t){let r=t.filter(s=>s.exists),n=[],o=8,i=0;async function a(){for(;i<r.length;){let s=r[i++],l=await js(e,s);for(let c of l)n.push(c)}}return await Promise.all(Array.from({length:Math.min(o,r.length)},a)),n}var st,Yt=_(()=>{It();ue();Gt();Je()});import Be from"node:fs";import Zt from"node:path";import Ar from"js-yaml";function Qt(e,t,r){if(r>24||e===null||typeof e!="object")return r>24&&e&&typeof e=="object"?null:e;if(t.has(e))return null;t.add(e);let n;if(Array.isArray(e))n=e.map(o=>Qt(o,t,r+1));else{n={};for(let[o,i]of Object.entries(e))n[o]=Qt(i,t,r+1)}return t.delete(e),n}function Or(e){return Ar.dump(Qt(e,new Set,0),{noRefs:!0,lineWidth:100,skipInvalid:!0})}function Tr(e){let t=String(e).replace(/\.md$/i,"");return t===""||t==="/"||t==="/index"?"/":t.replace(/\/+$/,"")||"/"}function As(e){return e==="/"?"/index.md":`${e}.md`}function en(e,t){if(t==="api")return`# ${kr}
184
184
  ${e}`;let r=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n/),n=`> ${kr}
185
185
 
186
- `;return r?e.slice(0,r[0].length)+n+e.slice(r[0].length):n+e}function Ts(e){return e.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,"")}function Es(e){try{let t=Ve.readFileSync(e,"utf-8").match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)return{};let r=Ar.load(t[1]);return r&&typeof r=="object"?r:{}}catch{return{}}}async function xe(e){let t={};try{t=JSON.parse(Ve.readFileSync(Yt.join(e,"velu.json"),"utf-8"))}catch{return{name:Yt.basename(e),baseUrl:"",pages:[]}}let r=t.name??Yt.basename(e),n=typeof process.env.VELU_SITE_URL=="string"?process.env.VELU_SITE_URL.replace(/\/+$/,""):"",o=Y(t.api),i=t.navigation??{},a={};try{let p=await Ye(t.navigation??{},{targetDir:e,api:o});i=p.nav,a=p.ops}catch(p){console.warn(`[velu] openapi: ${p.message}`)}let s=X(i),{pageEntries:l}=ae(s,e),c=new Map(l.map(p=>[p.url,p])),u=[];for(let p of ne(s)){if(!p.url)continue;let y=p.ancestors.filter(h=>h.kind==="group").pop(),m=p.ancestors.filter(h=>h.kind==="tab").pop(),g=y?.label||m?.label||"Pages",b=p.ancestors.filter(h=>h.kind==="tab"||h.kind==="group").map(h=>h.label),d=p.ancestors.filter(h=>h.kind==="language").pop()?.code||null;if(p.node?.api){let h=a[p.pagePath];if(!h)continue;let S=h.title||jr(p.url);u.push({url:p.url,title:S,description:h.description||"",group:g,breadcrumb:[...b,S],lang:d,frontmatter:{title:h.title,description:h.description},source:{kind:"api",segment:h.segment}})}else{let h=c.get(p.url);if(!h||!h.exists)continue;let S=Es(h.fileAbsPath),T=S.title||jr(p.url);u.push({url:p.url,title:T,description:S.description||"",group:g,breadcrumb:[...b,T],lang:d,frontmatter:S,source:{kind:"mdx",fileAbsPath:h.fileAbsPath}})}}return{name:r,baseUrl:n,pages:u}}function lt(e){return new Map(e.pages.map(t=>[t.url,{...t.source,title:t.title}]))}async function Cs(e){return lt(await xe(e))}async function en(e,t,r){let o=(r||await Cs(e)).get(t);if(!o)return null;if(o.kind==="mdx")try{return{body:Ve.readFileSync(o.fileAbsPath,"utf-8"),contentType:"text/markdown; charset=utf-8",kind:"mdx"}}catch{return null}return o.segment?{body:Or(o.segment),contentType:"text/yaml; charset=utf-8",kind:"api"}:null}async function Er(e,t){let r=t||await xe(e),n=s=>r.baseUrl?r.baseUrl+s:s,o=[`# ${r.name}`,"",`> Documentation index for ${r.name}. Append \`.md\` to any page URL (or send \`Accept: text/markdown\`) for its Markdown; fetch ${at} for the whole site in one document.`,""],i=[],a=new Map;for(let s of r.pages)a.has(s.group)||(a.set(s.group,[]),i.push(s.group)),a.get(s.group).push(s);for(let s of i){o.push(`## ${s}`,"");for(let l of a.get(s))o.push(`- [${l.title}](${n(As(l.url))})${l.description?`: ${l.description}`:""}`);o.push("")}return o.join(`
187
- `)}async function Cr(e,t){let r=t||await xe(e),n=[`# ${r.name}`,"",`> Full documentation \u2014 every page concatenated. Index: ${ve}`];for(let o of r.pages)if(n.push("","---","",`# ${o.title}`,`Source: ${o.url}`,""),o.source.kind==="mdx")try{n.push(Ts(Ve.readFileSync(o.source.fileAbsPath,"utf-8")).trim())}catch{}else o.source.segment&&n.push("```yaml",Or(o.source.segment).trim(),"```");return n.join(`
186
+ `;return r?e.slice(0,r[0].length)+n+e.slice(r[0].length):n+e}function Ts(e){return e.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,"")}function Es(e){try{let t=Be.readFileSync(e,"utf-8").match(/^---\r?\n([\s\S]*?)\r?\n---/);if(!t)return{};let r=Ar.load(t[1]);return r&&typeof r=="object"?r:{}}catch{return{}}}async function xe(e){let t={};try{t=JSON.parse(Be.readFileSync(Zt.join(e,"velu.json"),"utf-8"))}catch{return{name:Zt.basename(e),baseUrl:"",pages:[]}}let r=t.name??Zt.basename(e),n=typeof process.env.VELU_SITE_URL=="string"?process.env.VELU_SITE_URL.replace(/\/+$/,""):"",o=Y(t.api),i=t.navigation??{},a={};try{let p=await Ze(t.navigation??{},{targetDir:e,api:o});i=p.nav,a=p.ops}catch(p){console.warn(`[velu] openapi: ${p.message}`)}let s=X(i),{pageEntries:l}=ae(s,e),c=new Map(l.map(p=>[p.url,p])),u=[];for(let p of ne(s)){if(!p.url)continue;let y=p.ancestors.filter(h=>h.kind==="group").pop(),m=p.ancestors.filter(h=>h.kind==="tab").pop(),g=y?.label||m?.label||"Pages",b=p.ancestors.filter(h=>h.kind==="tab"||h.kind==="group").map(h=>h.label),d=p.ancestors.filter(h=>h.kind==="language").pop()?.code||null;if(p.node?.api){let h=a[p.pagePath];if(!h)continue;let S=h.title||jr(p.url);u.push({url:p.url,title:S,description:h.description||"",group:g,breadcrumb:[...b,S],lang:d,frontmatter:{title:h.title,description:h.description},source:{kind:"api",segment:h.segment}})}else{let h=c.get(p.url);if(!h||!h.exists)continue;let S=Es(h.fileAbsPath),O=S.title||jr(p.url);u.push({url:p.url,title:O,description:S.description||"",group:g,breadcrumb:[...b,O],lang:d,frontmatter:S,source:{kind:"mdx",fileAbsPath:h.fileAbsPath}})}}return{name:r,baseUrl:n,pages:u}}function lt(e){return new Map(e.pages.map(t=>[t.url,{...t.source,title:t.title}]))}async function Cs(e){return lt(await xe(e))}async function tn(e,t,r){let o=(r||await Cs(e)).get(t);if(!o)return null;if(o.kind==="mdx")try{return{body:Be.readFileSync(o.fileAbsPath,"utf-8"),contentType:"text/markdown; charset=utf-8",kind:"mdx"}}catch{return null}return o.segment?{body:Or(o.segment),contentType:"text/yaml; charset=utf-8",kind:"api"}:null}async function Er(e,t){let r=t||await xe(e),n=s=>r.baseUrl?r.baseUrl+s:s,o=[`# ${r.name}`,"",`> Documentation index for ${r.name}. Append \`.md\` to any page URL (or send \`Accept: text/markdown\`) for its Markdown; fetch ${at} for the whole site in one document.`,""],i=[],a=new Map;for(let s of r.pages)a.has(s.group)||(a.set(s.group,[]),i.push(s.group)),a.get(s.group).push(s);for(let s of i){o.push(`## ${s}`,"");for(let l of a.get(s))o.push(`- [${l.title}](${n(As(l.url))})${l.description?`: ${l.description}`:""}`);o.push("")}return o.join(`
187
+ `)}async function Cr(e,t){let r=t||await xe(e),n=[`# ${r.name}`,"",`> Full documentation \u2014 every page concatenated. Index: ${ve}`];for(let o of r.pages)if(n.push("","---","",`# ${o.title}`,`Source: ${o.url}`,""),o.source.kind==="mdx")try{n.push(Ts(Be.readFileSync(o.source.fileAbsPath,"utf-8")).trim())}catch{}else o.source.segment&&n.push("```yaml",Or(o.source.segment).trim(),"```");return n.join(`
188
188
  `)+`
189
- `}async function Lr(e,t){let r=t||await xe(e),n=r.baseUrl||"",o=[];for(let s of r.pages){if(s.source.kind!=="mdx")continue;let l="";try{l=Ve.readFileSync(s.source.fileAbsPath,"utf-8")}catch{continue}let c=/<Update\b([^>]*)>([\s\S]*?)<\/Update>/gi,u;for(;u=c.exec(l);){let p=u[1]||"",y=u[2]||"",m=st(p,"label")||st(p,"date")||"Update",g=st(p,"description")||_s(y)||m,b=`${n}${s.url}#${Ls(m)}`,d=st(p,"date")||m,h=new Date(d),S=Number.isNaN(h.getTime())?null:h.toUTCString();o.push({title:m,link:b,description:g,pubDate:S})}}if(!o.length)return null;let i=n||"/",a=o.map(s=>` <item>
189
+ `}async function Lr(e,t){let r=t||await xe(e),n=r.baseUrl||"",o=[];for(let s of r.pages){if(s.source.kind!=="mdx")continue;let l="";try{l=Be.readFileSync(s.source.fileAbsPath,"utf-8")}catch{continue}let c=/<Update\b([^>]*)>([\s\S]*?)<\/Update>/gi,u;for(;u=c.exec(l);){let p=u[1]||"",y=u[2]||"",m=Ve(p,"label")||Ve(p,"date")||"Update",g=Ve(p,"description")||Ps(y)||m,b=Ve(p,"description"),d=`${n}${s.url}#${Ls(m,b)}`,h=Ve(p,"date")||m,S=new Date(h),O=Number.isNaN(S.getTime())?null:S.toUTCString();o.push({title:m,link:d,description:g,pubDate:O})}}if(!o.length)return null;let i=n||"/",a=o.map(s=>` <item>
190
190
  <title>${fe(s.title)}</title>
191
191
  <link>${fe(s.link)}</link>
192
192
  <guid isPermaLink="true">${fe(s.link)}</guid>
@@ -203,12 +203,12 @@ ${e}`;let r=e.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n/),n=`> ${kr}
203
203
  `+a+`
204
204
  </channel>
205
205
  </rss>
206
- `}var ve,at,Os,be,kr,jr,fe,Ls,st,_s,_r=P(()=>{re();Ue();Pe();zt();ve="/llms.txt",at="/llms-full.txt",Os=`<${ve}>; rel="llms-txt", <${at}>; rel="llms-full-txt"`,be={Link:Os,"X-Llms-Txt":ve},kr=`Full documentation index: ${ve}`;jr=e=>(e.split("/").filter(Boolean).pop()||"Home").replace(/[-_]+/g," ").replace(/\b\w/g,r=>r.toUpperCase());fe=e=>String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),Ls=e=>`update-${String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"item"}`,st=(e,t)=>{let r=e.match(new RegExp(`${t}\\s*=\\s*["']([^"']*)["']`,"i"));return r?r[1]:void 0},_s=e=>String(e||"").replace(/```[\s\S]*?```/g,"").replace(/<[^>]+>/g," ").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/[#*`_>]/g,"").replace(/\s+/g," ").trim().slice(0,500)});var zr={};$e(zr,{startDevServer:()=>Hs});import Pr from"node:fs/promises";import we from"node:fs";import Ps from"node:http";import{spawn as Rs}from"node:child_process";import G from"node:path";import{fileURLToPath as Us}from"node:url";import Ns from"chokidar";import tn from"express";import{createServer as Fs,createLogger as Is,searchForWorkspaceRoot as Ms}from"vite";function Ds(e){return`<link rel="stylesheet" href="${`https://fonts.googleapis.com/css2?family=${encodeURIComponent(e).replace(/%20/g,"+")}:wght@300;400;500;600;700&display=swap`}" />`}function Ur(e,t){let r=Dt(e,{color:!!process.stderr.isTTY});console.error(`
206
+ `}var ve,at,Os,be,kr,jr,fe,Ls,Ve,Ps,Pr=_(()=>{re();Ue();_e();Vt();ve="/llms.txt",at="/llms-full.txt",Os=`<${ve}>; rel="llms-txt", <${at}>; rel="llms-full-txt"`,be={Link:Os,"X-Llms-Txt":ve},kr=`Full documentation index: ${ve}`;jr=e=>(e.split("/").filter(Boolean).pop()||"Home").replace(/[-_]+/g," ").replace(/\b\w/g,r=>r.toUpperCase());fe=e=>String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),Ls=(e,t)=>{let r=a=>String(a||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),n=r(e),o=t==null||t===""?"":r(t);return`update-${o?n?`${n}-${o}`:o:n||"item"}`},Ve=(e,t)=>{let r=e.match(new RegExp(`${t}\\s*=\\s*["']([^"']*)["']`,"i"));return r?r[1]:void 0},Ps=e=>String(e||"").replace(/```[\s\S]*?```/g,"").replace(/<[^>]+>/g," ").replace(/\[([^\]]+)\]\([^)]*\)/g,"$1").replace(/[#*`_>]/g,"").replace(/\s+/g," ").trim().slice(0,500)});var zr={};$e(zr,{startDevServer:()=>Hs});import _r from"node:fs/promises";import we from"node:fs";import _s from"node:http";import{spawn as Rs}from"node:child_process";import G from"node:path";import{fileURLToPath as Us}from"node:url";import Ns from"chokidar";import nn from"express";import{createServer as Fs,createLogger as Is,searchForWorkspaceRoot as Ms}from"vite";function Ds(e){return`<link rel="stylesheet" href="${`https://fonts.googleapis.com/css2?family=${encodeURIComponent(e).replace(/%20/g,"+")}:wght@300;400;500;600;700&display=swap`}" />`}function Ur(e,t){let r=Jt(e,{color:!!process.stderr.isTTY});console.error(`
207
207
  `+r+`
208
- `),process.env.VELU_DEBUG&&t&&console.error(t)}function Nr(){try{return JSON.parse(we.readFileSync(G.join(ct,"package.json"),"utf8")).version||"unknown"}catch{return"unknown"}}function Js(e,t){let r=G.resolve(e,".velu"),n=G.resolve(r,".velu-version"),o=null;try{o=we.readFileSync(n,"utf8").trim()}catch{}if(o!==t){if(o!==null)try{we.rmSync(G.join(r,"vite-cache"),{recursive:!0,force:!0}),console.log("[velu] new version detected \u2014 refreshing the preview cache\u2026")}catch{}try{we.mkdirSync(r,{recursive:!0}),we.writeFileSync(n,t)}catch{}}}async function Fr(e){try{return await Gn(e)}catch{return Ut({},G.basename(e))}}async function Ir(e,t){let r=await e.moduleGraph.getModuleByUrl(t,!0),n=new Map,o=new Set;async function i(a){if(!(!a||o.has(a.url))){if(o.add(a.url),a.id&&Vs.test(a.id)){let s=a.url.includes("?")?"&":"?",l=await e.transformRequest(`${a.url}${s}direct`);l?.code&&n.set(a.url,l.code)}for(let s of a.importedModules)await i(s)}}return await i(r),[...n.values()].join(`
209
- `)}function Ws(e,t,r){let n=()=>{process.stdout.isTTY&&!process.env.VELU_NO_BELL&&process.stdout.write("\x07")},o=process.stdout.isTTY,i=g=>o&&process.stdout.write(`\x1B]${g}\x1B\\`),a=()=>{i(`0;\u23F3 ${t}`),i("9;4;3;0")},s=()=>{i(`0;${t}`),i("9;4;0;0")};o&&process.once("exit",()=>i("9;4;0;0")),a();let l=r&&r!=="unknown"?`v${r}`:"";if(!e)return console.log(`Starting Velu${l?" "+l:""}\u2026`),{ready:g=>{console.log(`Velu${l?" "+l:""} ready \u2192 ${g}`),s(),n()}};let c="\x1B[38;2;220;20;60m",u="\x1B[0m",p="\x1B[2m";console.log("");for(let g of qs)console.log(`${c}${g}${u}`);l&&console.log(` ${p}${l}${u}`),console.log("");let y=null;try{y=Rs(process.execPath,["-e",Gs],{stdio:["ignore","inherit","ignore"]}),y.on("error",()=>{})}catch{}let m=()=>{if(y){try{y.kill()}catch{}y=null}};return process.once("exit",m),{ready:g=>{m(),process.stdout.write("\x1B[2K\r"),console.log(` \x1B[32m\u2713${u} Velu${l?" "+l:""} ready \u2192 \x1B[36m${g}${u}`),s(),n()}}}async function Hs(e){let t=!!process.env.VELU_PROFILE,r=performance.now(),n=(O,$)=>t&&console.log(`[velu-profile] ${O}: ${(performance.now()-$).toFixed(0)}ms`),o=Ws(!!process.stdout.isTTY&&!t,G.basename(e),Nr()),i=await Fr(e),a=l(),s=Ne(e);function l(){let $=ot(e).filter(E=>E.severity==="error"&&(E.category==="config-json"||E.category==="config-schema"));return $.length&&console.error(`
210
- `+nt($,{color:!!process.stderr.isTTY})+`
211
- `),$}let c=e;try{c=we.realpathSync(e)}catch{}let u=0,p=O=>{let $=performance.now();if($-u<500)return;u=$;let E=Ie(O,{projectDir:c,knownComponents:te});Ur(E,O)};process.on("unhandledRejection",p),process.on("uncaughtException",p);let y=Number(process.env.PORT)||8358,m=await Kt();Js(e,Nr());let g=tn(),b=Ps.createServer(g),d=Is(t?"info":"warn"),h=O=>typeof O=="string"&&O.includes("Failed to load source map"),S=d.warn.bind(d),T=d.warnOnce.bind(d);d.warn=(O,$)=>{h(O)||S(O,$)},d.warnOnce=(O,$)=>{h(O)||T(O,$)};let A=await Fs({...br({targetDir:e,VITE_ROOT:ct,validateProps:m}),appType:"custom",logLevel:t?"info":"warn",customLogger:d,server:{middlewareMode:!0,fs:{allow:[Ms(ct),e,c]},hmr:{server:b}}});n("vite server created",r),g.get(new RegExp(`^${Ze}/`),(O,$,E)=>{let k=lr(s,O.path);if(!k)return E();$.sendFile(k.abs,N=>{N&&$.status(404).end()})}),g.use(A.middlewares);let x=G.join(e,"public");g.use(tn.static(x)),g.get(new RegExp(`^${Rt}(\\.[a-z0-9]+)?$`,"i"),async(O,$)=>{if(!i.favicon)return $.status(404).end();let E=G.resolve(e,i.favicon.replace(/^\//,""));$.sendFile(E,k=>{k&&$.status(404).end()})});let w=O=>($,E)=>{let k=i.logo?.[O];if(!k)return E.status(404).end();E.sendFile(G.resolve(e,k.replace(/^\//,"")),N=>{N&&E.status(404).end()})};g.get(Ke,w("light")),g.get(Xe,w("dark")),g.post("/@velu-api-proxy",tn.json({limit:"8mb"}),async(O,$)=>{let{method:E="GET",url:k,headers:N={},body:R}=O.body||{};if(typeof k!="string"||!/^https?:\/\//i.test(k))return $.status(400).json({error:"A valid http(s) target URL is required."});try{let U=await fetch(k,{method:E,headers:N,body:R!=null&&R!==""?R:void 0}),V=await U.text(),f=U.headers.get("content-type")||"",v={};U.headers.forEach((C,M)=>{v[M]=C});let j=V;if(/json/i.test(f))try{j=JSON.parse(V)}catch{}$.json({status:U.status,statusText:U.statusText,headers:v,body:j})}catch(U){$.json({error:`Request failed: ${U.message}`})}});let L=null,_=async()=>L||=await xe(e);g.get(/\.md$/i,async(O,$,E)=>{try{let k=await _(),N=await en(e,Tr(decodeURIComponent(O.path)),lt(k));if(!N)return E();$.status(200).set({"Content-Type":N.contentType,...be}).end(Qt(N.body,N.kind))}catch{E()}}),g.get(ve,async(O,$,E)=>{try{let k=await Er(e,await _());$.status(200).set({"Content-Type":"text/plain; charset=utf-8",...be}).end(k)}catch{E()}}),g.get(at,async(O,$,E)=>{try{let k=await Cr(e,await _());$.status(200).set({"Content-Type":"text/plain; charset=utf-8",...be}).end(k)}catch{E()}}),g.get("/rss.xml",async(O,$,E)=>{try{let k=await Lr(e,await _());if(!k)return E();$.status(200).set({"Content-Type":"application/rss+xml; charset=utf-8"}).end(k)}catch{E()}}),g.use("*",async(O,$,E)=>{let k=O.originalUrl,N=performance.now();if(/text\/markdown/i.test(O.headers.accept||""))try{let R=await _(),U=await en(e,yt(k),lt(R));if(U)return $.status(200).set({"Content-Type":U.contentType,...be}).end(Qt(U.body,U.kind))}catch{}if(a.length)return $.status(200).set({"Content-Type":"text/html"}).end(Gt(a,{title:"Fix velu.json to continue"}));try{let R=performance.now(),U=await Pr.readFile(Mr,"utf-8");U=await A.transformIndexHtml(k,U),n(`transformIndexHtml ${k}`,R);let V="/src/runtime/server-entry.jsx";R=performance.now();let{render:f}=await A.ssrLoadModule(V);n(`ssrLoadModule ${k} (1st req includes dep pre-bundle)`,R),R=performance.now();let v=await f(k);n(`render ${k}`,R),R=performance.now();let j=await Ir(A,V);n(`collectSsrCss ${k}`,R);let C=j?`<style data-velu-ssr>${j}</style>`:"",M=`<style data-velu-config>
212
- ${Wn(i)}
213
- </style>`,ie=Bs.has(i.font.family)?"":Ds(i.font.family),J=qn(i),se=J?`<link rel="icon"${J.type?` type="${J.type}"`:""} href="${J.url}" />`:"",ft=cr(s),Wr=[C,M,ie,se,ft].filter(Boolean).join(`
214
- `),Hr=U.replace('<html lang="en">',`<html lang="en" data-current-path="${Rr(yt(k))}">`).replace("<!--app-title-->",Rr(i.name)).replace("<!--app-head-->",Wr).replace("<!--app-html-->",v);$.status(200).set({"Content-Type":"text/html",...be}).end(Hr),n(`TOTAL ${k}`,N)}catch(R){A.ssrFixStacktrace(R);let U=Ie(R,{projectDir:c,knownComponents:te});if(/failed to load url|does the file exist|cannot find module|ERR_MODULE_NOT_FOUND/i.test(String(R&&R.message))){try{A.moduleGraph.invalidateAll()}catch{}U.hint="The dev server cache is out of sync \u2014 this usually happens after files are added, removed, or moved. Reload the page; if it persists, stop velu dev, delete the .velu folder in your project, and restart."}Ur(U,R),$.status(200).set({"Content-Type":"text/html"}).end(Gt([U]))}}),Ns.watch(e,{ignoreInitial:!0,ignored:/(^|[\\/])(node_modules|\.git|\.velu)([\\/]|$)/,awaitWriteFinish:{stabilityThreshold:100,pollInterval:20}}).on("all",async(O,$)=>{console.log(`[velu-cli] content ${O}: ${G.relative(e,$)}`);let E=G.basename($)==="velu.json",k=$.endsWith(".mdx"),N=/\.(css|js)$/i.test($),R=!1;if(N){let V=v=>v.scripts.some(j=>j.abs===$),f=V(s);s=Ne(e),R=f||V(s)}let U=E||k&&(O==="add"||O==="unlink")||R;if((U||k||/\.(ya?ml|json)$/i.test($))&&(L=null),E&&(i=await Fr(e),a=l()),U)A.moduleGraph.invalidateAll();else if(k){let V=$.split(G.sep).join("/"),f=A.moduleGraph.getModulesByFile(V);if(f)for(let v of f)A.moduleGraph.invalidateModule(v)}A.ws.send({type:"full-reload"})});async function ee(O){let $=new Set,E=12,k=0,N=[],R=()=>k<E?(k+=1,Promise.resolve()):new Promise(v=>N.push(v)).then(()=>{k+=1}),U=()=>{k-=1,N.shift()?.()},V=v=>/[\\/]\.velu[\\/]vite-cache[\\/]|[\\/]deps[\\/]/.test(v)||/[\\/]node_modules[\\/]/.test(v)&&!/velu-ui/.test(v);async function f(v){if(!(!v||$.has(v)||V(v))){$.add(v);try{await R();try{await A.transformRequest(v,{ssr:!1})}finally{U()}let j=await A.moduleGraph.getModuleByUrl(v,!1);j?.importedModules?.size&&await Promise.all([...j.importedModules].map(C=>f(C.url)))}catch{}}}return await f(O),$.size}b.listen(y,async()=>{let O=performance.now(),$=0;try{let{render:E}=await A.ssrLoadModule("/src/runtime/server-entry.jsx");await ee("/src/runtime/client-entry.jsx"),typeof A.waitForRequestsIdle=="function"&&await A.waitForRequestsIdle();let[k]=await Promise.allSettled([ee("/src/runtime/client-entry.jsx"),E("/"),A.transformIndexHtml("/",await Pr.readFile(Mr,"utf-8")),Ir(A,"/src/runtime/server-entry.jsx")]).then(N=>N.map(R=>R.status==="fulfilled"?R.value:0));$=k}catch(E){t&&console.log("[velu-profile] warmup error:",E?.message)}n(`cold-start warm-up (${$} client modules)`,O),o.ready(`http://localhost:${y}`)})}var zs,Vs,Bs,Rr,ct,Mr,qs,Gs,Vr=P(()=>{Pe();xr();qt();$r();ue();De();Ht();Xt();_r();re();Vt();zs=G.dirname(Us(import.meta.url)),Vs=/\.(css|less|sass|scss|styl|stylus|pcss|postcss)(\?|$)/,Bs=new Set(["Google Sans Flex","Google Sans Code","Outfit"]),Rr=e=>String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");ct=G.resolve(zs,".."),Mr=G.resolve(ct,"src","template.html"),qs=[" _ __ __","| | / /__ / /_ __","| | / / _ \\/ / / / /","| |/ / __/ / /_/ /","|___/\\___/_/\\__,_/"],Gs="const F=['\u280B','\u2819','\u2839','\u2838','\u283C','\u2834','\u2826','\u2827','\u2807','\u280F'],M=['Starting Velu','Setting up your preview','Preparing your docs','Warming things up','Almost ready'];let f=0,m=0;const t=Date.now();const C='\\x1b[38;2;220;20;60m',R='\\x1b[0m',D='\\x1b[2m';const d=()=>{const s=(Date.now()-t)/1000|0;process.stdout.write('\\x1b[2K\\r '+C+F[f]+R+' '+M[m]+'\\u2026 '+D+s+'s'+R);f=(f+1)%F.length;};d();setInterval(d,90);setInterval(()=>{if(m<M.length-1)m++;},4000);"});var Dr={};$e(Dr,{default:()=>Zs,runValidate:()=>Br});import Ks from"node:fs";import Xs from"node:path";function Ys(e){try{let t=JSON.parse(Ks.readFileSync(Xs.join(e,"velu.json"),"utf-8"));if(!t.navigation||typeof t.navigation!="object")return[];let r=X(t.navigation);return ae(r,e).pageEntries}catch{return[]}}async function Br(e){let t=ot(e),r=Ys(e),n=await Sr(e,r),o=[...t,...n],i=!!process.stdout.isTTY;return console.log(nt(o,{color:i})),o.some(s=>s.severity!=="warning"&&s.severity!=="info")?1:0}var Zs,Jr=P(()=>{re();Ue();Ht();Xt();ue();Zs=Br});import ut from"node:path";import D from"node:process";import{readFileSync as Qs}from"node:fs";var[,,qr,pt]=D.argv;function Gr(){try{return JSON.parse(Qs(new URL("../package.json",import.meta.url),"utf8")).version}catch{return"unknown"}}function ea(){let e=D.argv.slice(3);for(let t=0;t<e.length;t++){let r=e[t];if(r==="--out"){t++;continue}if(!r.startsWith("-"))return r}}async function ta(){switch(qr){case"--version":case"-v":case"version":{console.log(Gr());break}case"init":{pt||(console.error("Usage: velu init <project-name>"),D.exit(1));let e=pt,t=ut.resolve(D.cwd(),e),{initProject:r}=await Promise.resolve().then(()=>(on(),rn));await r(t,e);break}case"migrate":{let{runMigrate:e}=await Promise.resolve().then(()=>(In(),Fn));D.exitCode=await e(D.argv.slice(3),Gr());break}case"dev":{let{maybeAutoUpdate:e}=await Promise.resolve().then(()=>(_t(),Lt));await e();let t=ut.resolve(D.cwd(),pt??"."),{startDevServer:r}=await Promise.resolve().then(()=>(Vr(),zr));await r(t);break}case"update":{let{updateCommand:e}=await Promise.resolve().then(()=>(_t(),Lt));await e();break}case"validate":{let e=ut.resolve(D.cwd(),pt??"."),{runValidate:t}=await Promise.resolve().then(()=>(Jr(),Dr)),r=await t(e);D.exit(r);break}case"build":{let e=ut.resolve(D.cwd(),ea()??"."),t=D.argv.indexOf("--out"),r=t>-1?D.argv[t+1]:void 0,n=new URL(["..","src","build","index.js"].join("/"),import.meta.url).href,o=a=>import(a),i;try{({runBuild:i}=await o(n))}catch{console.error("velu build is an internal command, not available in this distribution."),D.exit(1)}await i(e,{out:r});break}default:console.log("Usage:"),console.log(" velu init <project-name> scaffold a new docs project"),console.log(" velu migrate mintlify [dir] migrate a Mintlify project (see --help)"),console.log(" velu dev [dir] start the dev preview server"),console.log(" velu validate [dir] check velu.json + content for problems"),console.log(" velu update update velu to the latest version"),D.exit(qr?1:0)}}ta().catch(e=>{console.error(D.env.VELU_DEBUG?e:`Error: ${e.message}`),D.exit(1)});
208
+ `),process.env.VELU_DEBUG&&t&&console.error(t)}function Nr(){try{return JSON.parse(we.readFileSync(G.join(ct,"package.json"),"utf8")).version||"unknown"}catch{return"unknown"}}function Js(e,t){let r=G.resolve(e,".velu"),n=G.resolve(r,".velu-version"),o=null;try{o=we.readFileSync(n,"utf8").trim()}catch{}if(o!==t){if(o!==null)try{we.rmSync(G.join(r,"vite-cache"),{recursive:!0,force:!0}),console.log("[velu] new version detected \u2014 refreshing the preview cache\u2026")}catch{}try{we.mkdirSync(r,{recursive:!0}),we.writeFileSync(n,t)}catch{}}}async function Fr(e){try{return await Wn(e)}catch{return Ut({},G.basename(e))}}async function Ir(e,t){let r=await e.moduleGraph.getModuleByUrl(t,!0),n=new Map,o=new Set;async function i(a){if(!(!a||o.has(a.url))){if(o.add(a.url),a.id&&Vs.test(a.id)){let s=a.url.includes("?")?"&":"?",l=await e.transformRequest(`${a.url}${s}direct`);l?.code&&n.set(a.url,l.code)}for(let s of a.importedModules)await i(s)}}return await i(r),[...n.values()].join(`
209
+ `)}function Ws(e,t,r){let n=()=>{process.stdout.isTTY&&!process.env.VELU_NO_BELL&&process.stdout.write("\x07")},o=process.stdout.isTTY,i=g=>o&&process.stdout.write(`\x1B]${g}\x1B\\`),a=()=>{i(`0;\u23F3 ${t}`),i("9;4;3;0")},s=()=>{i(`0;${t}`),i("9;4;0;0")};o&&process.once("exit",()=>i("9;4;0;0")),a();let l=r&&r!=="unknown"?`v${r}`:"";if(!e)return console.log(`Starting Velu${l?" "+l:""}\u2026`),{ready:g=>{console.log(`Velu${l?" "+l:""} ready \u2192 ${g}`),s(),n()}};let c="\x1B[38;2;220;20;60m",u="\x1B[0m",p="\x1B[2m";console.log("");for(let g of qs)console.log(`${c}${g}${u}`);l&&console.log(` ${p}${l}${u}`),console.log("");let y=null;try{y=Rs(process.execPath,["-e",Gs],{stdio:["ignore","inherit","ignore"]}),y.on("error",()=>{})}catch{}let m=()=>{if(y){try{y.kill()}catch{}y=null}};return process.once("exit",m),{ready:g=>{m(),process.stdout.write("\x1B[2K\r"),console.log(` \x1B[32m\u2713${u} Velu${l?" "+l:""} ready \u2192 \x1B[36m${g}${u}`),s(),n()}}}async function Hs(e){let t=!!process.env.VELU_PROFILE,r=performance.now(),n=(T,$)=>t&&console.log(`[velu-profile] ${T}: ${(performance.now()-$).toFixed(0)}ms`),o=Ws(!!process.stdout.isTTY&&!t,G.basename(e),Nr()),i=await Fr(e),a=l(),s=Ne(e);function l(){let $=it(e).filter(E=>E.severity==="error"&&(E.category==="config-json"||E.category==="config-schema"));return $.length&&console.error(`
210
+ `+rt($,{color:!!process.stderr.isTTY})+`
211
+ `),$}let c=e;try{c=we.realpathSync(e)}catch{}let u=0,p=T=>{let $=performance.now();if($-u<500)return;u=$;let E=Ie(T,{projectDir:c,knownComponents:te});Ur(E,T)};process.on("unhandledRejection",p),process.on("uncaughtException",p);let y=Number(process.env.PORT)||8358,m=await Xt();Js(e,Nr());let g=nn(),b=_s.createServer(g),d=Is(t?"info":"warn"),h=T=>typeof T=="string"&&T.includes("Failed to load source map"),S=d.warn.bind(d),O=d.warnOnce.bind(d);d.warn=(T,$)=>{h(T)||S(T,$)},d.warnOnce=(T,$)=>{h(T)||O(T,$)};let A=await Fs({...br({targetDir:e,VITE_ROOT:ct,validateProps:m}),appType:"custom",logLevel:t?"info":"warn",customLogger:d,server:{middlewareMode:!0,fs:{allow:[Ms(ct),e,c]},hmr:{server:b}}});n("vite server created",r),g.get(new RegExp(`^${Qe}/`),(T,$,E)=>{let k=lr(s,T.path);if(!k)return E();$.sendFile(k.abs,N=>{N&&$.status(404).end()})}),g.use(A.middlewares);let x=G.join(e,"public");g.use(nn.static(x)),g.get(new RegExp(`^${Rt}(\\.[a-z0-9]+)?$`,"i"),async(T,$)=>{if(!i.favicon)return $.status(404).end();let E=G.resolve(e,i.favicon.replace(/^\//,""));$.sendFile(E,k=>{k&&$.status(404).end()})});let w=T=>($,E)=>{let k=i.logo?.[T];if(!k)return E.status(404).end();E.sendFile(G.resolve(e,k.replace(/^\//,"")),N=>{N&&E.status(404).end()})};g.get(Xe,w("light")),g.get(Ye,w("dark")),g.post("/@velu-api-proxy",nn.json({limit:"8mb"}),async(T,$)=>{let{method:E="GET",url:k,headers:N={},body:R}=T.body||{};if(typeof k!="string"||!/^https?:\/\//i.test(k))return $.status(400).json({error:"A valid http(s) target URL is required."});try{let U=await fetch(k,{method:E,headers:N,body:R!=null&&R!==""?R:void 0}),V=await U.text(),f=U.headers.get("content-type")||"",v={};U.headers.forEach((C,M)=>{v[M]=C});let j=V;if(/json/i.test(f))try{j=JSON.parse(V)}catch{}$.json({status:U.status,statusText:U.statusText,headers:v,body:j})}catch(U){$.json({error:`Request failed: ${U.message}`})}});let L=null,P=async()=>L||=await xe(e);g.get(/\.md$/i,async(T,$,E)=>{try{let k=await P(),N=await tn(e,Tr(decodeURIComponent(T.path)),lt(k));if(!N)return E();$.status(200).set({"Content-Type":N.contentType,...be}).end(en(N.body,N.kind))}catch{E()}}),g.get(ve,async(T,$,E)=>{try{let k=await Er(e,await P());$.status(200).set({"Content-Type":"text/plain; charset=utf-8",...be}).end(k)}catch{E()}}),g.get(at,async(T,$,E)=>{try{let k=await Cr(e,await P());$.status(200).set({"Content-Type":"text/plain; charset=utf-8",...be}).end(k)}catch{E()}}),g.get("/rss.xml",async(T,$,E)=>{try{let k=await Lr(e,await P());if(!k)return E();$.status(200).set({"Content-Type":"application/rss+xml; charset=utf-8"}).end(k)}catch{E()}}),g.use("*",async(T,$,E)=>{let k=T.originalUrl,N=performance.now();if(/text\/markdown/i.test(T.headers.accept||""))try{let R=await P(),U=await tn(e,yt(k),lt(R));if(U)return $.status(200).set({"Content-Type":U.contentType,...be}).end(en(U.body,U.kind))}catch{}if(a.length)return $.status(200).set({"Content-Type":"text/html"}).end(Wt(a,{title:"Fix velu.json to continue"}));try{let R=performance.now(),U=await _r.readFile(Mr,"utf-8");U=await A.transformIndexHtml(k,U),n(`transformIndexHtml ${k}`,R);let V="/src/runtime/server-entry.jsx";R=performance.now();let{render:f}=await A.ssrLoadModule(V);n(`ssrLoadModule ${k} (1st req includes dep pre-bundle)`,R),R=performance.now();let v=await f(k);n(`render ${k}`,R),R=performance.now();let j=await Ir(A,V);n(`collectSsrCss ${k}`,R);let C=j?`<style data-velu-ssr>${j}</style>`:"",M=`<style data-velu-config>
212
+ ${Hn(i)}
213
+ </style>`,ie=Bs.has(i.font.family)?"":Ds(i.font.family),J=Gn(i),se=J?`<link rel="icon"${J.type?` type="${J.type}"`:""} href="${J.url}" />`:"",ft=cr(s),Wr=[C,M,ie,se,ft].filter(Boolean).join(`
214
+ `),Hr=U.replace('<html lang="en">',`<html lang="en" data-current-path="${Rr(yt(k))}">`).replace("<!--app-title-->",Rr(i.name)).replace("<!--app-head-->",Wr).replace("<!--app-html-->",v);$.status(200).set({"Content-Type":"text/html",...be}).end(Hr),n(`TOTAL ${k}`,N)}catch(R){A.ssrFixStacktrace(R);let U=Ie(R,{projectDir:c,knownComponents:te});if(/failed to load url|does the file exist|cannot find module|ERR_MODULE_NOT_FOUND/i.test(String(R&&R.message))){try{A.moduleGraph.invalidateAll()}catch{}U.hint="The dev server cache is out of sync \u2014 this usually happens after files are added, removed, or moved. Reload the page; if it persists, stop velu dev, delete the .velu folder in your project, and restart."}Ur(U,R),$.status(200).set({"Content-Type":"text/html"}).end(Wt([U]))}}),Ns.watch(e,{ignoreInitial:!0,ignored:/(^|[\\/])(node_modules|\.git|\.velu)([\\/]|$)/,awaitWriteFinish:{stabilityThreshold:100,pollInterval:20}}).on("all",async(T,$)=>{console.log(`[velu-cli] content ${T}: ${G.relative(e,$)}`);let E=G.basename($)==="velu.json",k=$.endsWith(".mdx"),N=/\.(css|js)$/i.test($),R=!1;if(N){let V=v=>v.scripts.some(j=>j.abs===$),f=V(s);s=Ne(e),R=f||V(s)}let U=E||k&&(T==="add"||T==="unlink")||R;if((U||k||/\.(ya?ml|json)$/i.test($))&&(L=null),E&&(i=await Fr(e),a=l()),U)A.moduleGraph.invalidateAll();else if(k){let V=$.split(G.sep).join("/"),f=A.moduleGraph.getModulesByFile(V);if(f)for(let v of f)A.moduleGraph.invalidateModule(v)}A.ws.send({type:"full-reload"})});async function ee(T){let $=new Set,E=12,k=0,N=[],R=()=>k<E?(k+=1,Promise.resolve()):new Promise(v=>N.push(v)).then(()=>{k+=1}),U=()=>{k-=1,N.shift()?.()},V=v=>/[\\/]\.velu[\\/]vite-cache[\\/]|[\\/]deps[\\/]/.test(v)||/[\\/]node_modules[\\/]/.test(v)&&!/velu-ui/.test(v);async function f(v){if(!(!v||$.has(v)||V(v))){$.add(v);try{await R();try{await A.transformRequest(v,{ssr:!1})}finally{U()}let j=await A.moduleGraph.getModuleByUrl(v,!1);j?.importedModules?.size&&await Promise.all([...j.importedModules].map(C=>f(C.url)))}catch{}}}return await f(T),$.size}b.listen(y,async()=>{let T=performance.now(),$=0;try{let{render:E}=await A.ssrLoadModule("/src/runtime/server-entry.jsx");await ee("/src/runtime/client-entry.jsx"),typeof A.waitForRequestsIdle=="function"&&await A.waitForRequestsIdle();let[k]=await Promise.allSettled([ee("/src/runtime/client-entry.jsx"),E("/"),A.transformIndexHtml("/",await _r.readFile(Mr,"utf-8")),Ir(A,"/src/runtime/server-entry.jsx")]).then(N=>N.map(R=>R.status==="fulfilled"?R.value:0));$=k}catch(E){t&&console.log("[velu-profile] warmup error:",E?.message)}n(`cold-start warm-up (${$} client modules)`,T),o.ready(`http://localhost:${y}`)})}var zs,Vs,Bs,Rr,ct,Mr,qs,Gs,Vr=_(()=>{_e();xr();Gt();$r();ue();Je();Kt();Yt();Pr();re();Bt();zs=G.dirname(Us(import.meta.url)),Vs=/\.(css|less|sass|scss|styl|stylus|pcss|postcss)(\?|$)/,Bs=new Set(["Google Sans Flex","Google Sans Code","Outfit"]),Rr=e=>String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");ct=G.resolve(zs,".."),Mr=G.resolve(ct,"src","template.html"),qs=[" _ __ __","| | / /__ / /_ __","| | / / _ \\/ / / / /","| |/ / __/ / /_/ /","|___/\\___/_/\\__,_/"],Gs="const F=['\u280B','\u2819','\u2839','\u2838','\u283C','\u2834','\u2826','\u2827','\u2807','\u280F'],M=['Starting Velu','Setting up your preview','Preparing your docs','Warming things up','Almost ready'];let f=0,m=0;const t=Date.now();const C='\\x1b[38;2;220;20;60m',R='\\x1b[0m',D='\\x1b[2m';const d=()=>{const s=(Date.now()-t)/1000|0;process.stdout.write('\\x1b[2K\\r '+C+F[f]+R+' '+M[m]+'\\u2026 '+D+s+'s'+R);f=(f+1)%F.length;};d();setInterval(d,90);setInterval(()=>{if(m<M.length-1)m++;},4000);"});var Dr={};$e(Dr,{default:()=>Zs,runValidate:()=>Br});import Ks from"node:fs";import Xs from"node:path";function Ys(e){try{let t=JSON.parse(Ks.readFileSync(Xs.join(e,"velu.json"),"utf-8"));if(!t.navigation||typeof t.navigation!="object")return[];let r=X(t.navigation);return ae(r,e).pageEntries}catch{return[]}}async function Br(e){let t=it(e),r=Ys(e),n=await Sr(e,r),o=[...t,...n],i=!!process.stdout.isTTY;return console.log(rt(o,{color:i})),o.some(s=>s.severity!=="warning"&&s.severity!=="info")?1:0}var Zs,Jr=_(()=>{re();Ue();Kt();Yt();ue();Zs=Br});import ut from"node:path";import D from"node:process";import{readFileSync as Qs}from"node:fs";var[,,qr,pt]=D.argv;function Gr(){try{return JSON.parse(Qs(new URL("../package.json",import.meta.url),"utf8")).version}catch{return"unknown"}}function ea(){let e=D.argv.slice(3);for(let t=0;t<e.length;t++){let r=e[t];if(r==="--out"){t++;continue}if(!r.startsWith("-"))return r}}async function ta(){switch(qr){case"--version":case"-v":case"version":{console.log(Gr());break}case"init":{pt||(console.error("Usage: velu init <project-name>"),D.exit(1));let e=pt,t=ut.resolve(D.cwd(),e),{initProject:r}=await Promise.resolve().then(()=>(sn(),on));await r(t,e);break}case"migrate":{let{runMigrate:e}=await Promise.resolve().then(()=>(Mn(),In));D.exitCode=await e(D.argv.slice(3),Gr());break}case"dev":{let{maybeAutoUpdate:e}=await Promise.resolve().then(()=>(Pt(),Lt));await e();let t=ut.resolve(D.cwd(),pt??"."),{startDevServer:r}=await Promise.resolve().then(()=>(Vr(),zr));await r(t);break}case"update":{let{updateCommand:e}=await Promise.resolve().then(()=>(Pt(),Lt));await e();break}case"validate":{let e=ut.resolve(D.cwd(),pt??"."),{runValidate:t}=await Promise.resolve().then(()=>(Jr(),Dr)),r=await t(e);D.exit(r);break}case"build":{let e=ut.resolve(D.cwd(),ea()??"."),t=D.argv.indexOf("--out"),r=t>-1?D.argv[t+1]:void 0,n=new URL(["..","src","build","index.js"].join("/"),import.meta.url).href,o=a=>import(a),i;try{({runBuild:i}=await o(n))}catch{console.error("velu build is an internal command, not available in this distribution."),D.exit(1)}await i(e,{out:r});break}default:console.log("Usage:"),console.log(" velu init <project-name> scaffold a new docs project"),console.log(" velu migrate mintlify [dir] migrate a Mintlify project (see --help)"),console.log(" velu dev [dir] start the dev preview server"),console.log(" velu validate [dir] check velu.json + content for problems"),console.log(" velu update update velu to the latest version"),D.exit(qr?1:0)}}ta().catch(e=>{console.error(D.env.VELU_DEBUG?e:`Error: ${e.message}`),D.exit(1)});
package/docs/vepa.md CHANGED
@@ -49,7 +49,8 @@ published package or used at runtime.
49
49
  | Table of contents | 288 px rail with 32 px side padding |
50
50
  | API examples | 472 px rail including a 24 px outer gutter; 448 px sample cards |
51
51
  | API rail breakpoint | Hidden below 1280 px; article reclaims its space |
52
- | Mobile navigation | Below 1024 px; 48 px topbar and 56 px breadcrumb strip |
52
+ | On-page TOC bar | Sticky TocBar below 1280 px (when the right rail hides), same as default Velu |
53
+ | Mobile navigation | Below 640 px; crumbs + burger (tabs stay on tablet with horizontal scroll) |
53
54
  | Title | Inter, 500 weight, 36/40 px; 30/36 px below 640 px |
54
55
 
55
56
  The API rail deliberately has its own width and padding. Applying the normal
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veluai/velu",
3
- "version": "0.2.37",
3
+ "version": "0.2.38",
4
4
  "type": "module",
5
5
  "bin": "./dist/cli.js",
6
6
  "publishConfig": {
@@ -10,9 +10,11 @@ import resolveIcon from '../lib/resolveIcon.jsx';
10
10
  * description and tags) and a right column with the entry body (the MDX
11
11
  * children — usually `##` sub-headings and prose).
12
12
  *
13
- * The section gets a stable `id` derived from the label so it is linkable
14
- * and shows up in the table of contents. The id MUST match the slug the
15
- * `extract-toc` remark plugin computes for the same label (see
13
+ * The section gets a stable `id` derived from description (preferred) or
14
+ * label so each entry is linkable and shows up in the table of contents.
15
+ * Preferring `description` keeps same-month releases unique (e.g. two
16
+ * "September 2026" rows with 0.2.37 / 0.2.36). The id MUST match the slug
17
+ * the `extract-toc` remark plugin computes (see
16
18
  * velu-cli/src/mdx-plugins/extract-toc.js → `slugifyUpdate`), so click→scroll
17
19
  * and scroll-spy line up.
18
20
  *
@@ -25,12 +27,20 @@ import resolveIcon from '../lib/resolveIcon.jsx';
25
27
  * tags?: string | string[], rss?: any, children?: React.ReactNode,
26
28
  * className?: string }} props
27
29
  */
28
- export function slugifyUpdate(value) {
29
- const base = String(value || '')
30
- .toLowerCase()
31
- .replace(/[^a-z0-9]+/g, '-')
32
- .replace(/^-+|-+$/g, '');
33
- return `update-${base || 'item'}`;
30
+ export function slugifyUpdate(label, description) {
31
+ const slugPart = (value) =>
32
+ String(value || '')
33
+ .toLowerCase()
34
+ .replace(/[^a-z0-9]+/g, '-')
35
+ .replace(/^-+|-+$/g, '');
36
+ const labelPart = slugPart(label);
37
+ const descPart = description == null || description === '' ? '' : slugPart(description);
38
+ const base = descPart
39
+ ? labelPart
40
+ ? `${labelPart}-${descPart}`
41
+ : descPart
42
+ : labelPart || 'item';
43
+ return `update-${base}`;
34
44
  }
35
45
 
36
46
  function toTagList(value) {
@@ -51,7 +61,9 @@ export default function Update({
51
61
  }) {
52
62
  void rss;
53
63
  const updateLabel = String(label ?? date ?? 'Update');
54
- const anchorId = slugifyUpdate(updateLabel);
64
+ const updateDescription =
65
+ description == null || description === '' ? undefined : String(description);
66
+ const anchorId = slugifyUpdate(updateLabel, updateDescription);
55
67
  const tagList = toTagList(tags);
56
68
 
57
69
  return (
@@ -116,6 +116,20 @@
116
116
  .velu-vepa-toc ul ul { padding-left: 16px; }
117
117
  .velu-vepa-toc a { display: block; padding-block: 4px; color: var(--text-color); text-decoration: none; }
118
118
  .velu-vepa-toc a[aria-current] { color: var(--accent-color); font-weight: 500; }
119
+ /* Sticky on-page TocBar (used below the right-rail breakpoint). */
120
+ [data-site-theme='vepa'] .velu-toc-bar {
121
+ border-block-end-color: var(--vepa-hairline);
122
+ background: color-mix(in srgb, var(--page-bg) 88%, transparent);
123
+ }
124
+ [data-site-theme='vepa'] .velu-toc-bar__toggle {
125
+ padding-block: 10px;
126
+ padding-inline: 24px;
127
+ font-size: 14px;
128
+ line-height: 20px;
129
+ }
130
+ [data-site-theme='vepa'] .velu-toc-bar[data-expanded='true'] {
131
+ background: var(--page-bg);
132
+ }
119
133
  .velu-theme-menu { position: relative; line-height: 20px; }
120
134
  .velu-theme-menu__trigger { width: 32px; height: 32px; display: grid; place-items: center; border: 0; border-radius: 8px; background: transparent; color: var(--muted-color); cursor: pointer; }
121
135
  .velu-theme-menu__options { position: absolute; z-index: 40; top: 36px; right: 0; width: 144px; padding: 4px; border: 1px solid var(--border-color); border-radius: 12px; background: var(--page-bg); box-shadow: 0 4px 16px #0002; }
@@ -133,6 +147,10 @@
133
147
  @container docs (max-width: 1279px) {
134
148
  [data-site-theme='vepa'] .velu-docs-layout__aside--right { display: none; }
135
149
  [data-site-theme='vepa'] .velu-docs-layout__center { margin-right: 0; }
150
+ /* When the right rail folds away, use Velu's sticky on-page TocBar
151
+ so tab/tablet widths still have a two-pane reading chrome
152
+ (sidebar + in-article TOC), matching the default theme. */
153
+ [data-site-theme='vepa'] .velu-toc-bar { display: block; }
136
154
  }
137
155
  @container docs (max-width: 1023px) {
138
156
  [data-site-theme='vepa'] .velu-header__top { display: grid; grid-template-columns: minmax(0,1fr) auto auto; padding-inline: 16px; gap: 12px !important; }
@@ -140,20 +158,119 @@
140
158
  [data-site-theme='vepa'] .velu-header__wordmark { font-size: 20px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
141
159
  [data-site-theme='vepa'] .velu-header__col--actions { flex-wrap: nowrap !important; gap: 8px !important; }
142
160
  [data-site-theme='vepa'] .velu-header__col--center { padding: 0; }
143
- [data-site-theme='vepa'] .velu-header__actions-list,
144
- [data-site-theme='vepa'] .velu-header__tab { display: none; }
145
- [data-site-theme='vepa'] .velu-header__tabs { height: 56px; padding-inline: 16px; }
146
- [data-site-theme='vepa'] .velu-header__crumbs { display: flex; font-size: 14px; line-height: 20px; }
147
- [data-site-theme='vepa'] .velu-header__menu { display: flex; order: -1; margin: 0; width: 20px; padding: 0; }
161
+ [data-site-theme='vepa'] .velu-header__actions-list { display: none; }
162
+ /* Tablet keeps the tab strip (scrolls sideways when crowded). Burger
163
+ opens the nav drawer; crumbs stay mobile-only below. */
164
+ [data-site-theme='vepa'] .velu-header__tabs {
165
+ height: 48px;
166
+ padding-inline: 16px;
167
+ gap: 4px;
168
+ overflow-x: auto;
169
+ overflow-y: hidden;
170
+ scrollbar-width: none;
171
+ }
172
+ [data-site-theme='vepa'] .velu-header__tabs::-webkit-scrollbar { display: none; }
173
+ [data-site-theme='vepa'] .velu-header__tab {
174
+ display: inline-flex;
175
+ flex: none;
176
+ height: 48px;
177
+ white-space: nowrap;
178
+ }
179
+ [data-site-theme='vepa'] .velu-header__crumbs { display: none; }
180
+ /* Burger leads the tabs row — same edge as the left drawer. */
181
+ [data-site-theme='vepa'] .velu-header__menu {
182
+ display: inline-flex;
183
+ order: -1;
184
+ margin-inline-end: 8px;
185
+ margin-inline-start: 0;
186
+ flex: none;
187
+ width: 32px;
188
+ height: 32px;
189
+ padding: 0;
190
+ align-self: center;
191
+ }
148
192
  [data-site-theme='vepa'] .velu-search__trigger { inline-size: 32px !important; border: 0; background: none; padding: 8px; }
149
193
  [data-site-theme='vepa'] .velu-search__trigger-label,
150
194
  [data-site-theme='vepa'] .velu-search__kbd { display: none; }
151
195
  [data-site-theme='vepa'] .velu-docs-layout__center { margin-inline: 0; }
152
- [data-site-theme='vepa'] .velu-docs-layout__sidebar-toggle,
153
- [data-site-theme='vepa'] .velu-toc-bar { display: none; }
154
- [data-site-theme='vepa'] .velu-docs-layout__aside--left { width: 288px; inset-inline: 0 auto; top: var(--velu-header-height); bottom: 0; padding: 24px 8px; transform: translateX(-100%); z-index: 40; visibility: hidden; }
155
- [data-site-theme='vepa'][data-drawer-open='true'] .velu-docs-layout__aside--left { transform: none; visibility: visible; }
156
- [data-site-theme='vepa'] :is(.velu-docs-layout__drawer-head,.velu-docs-layout__drawer-select) { display: none; }
196
+ [data-site-theme='vepa'] .velu-docs-layout__sidebar-toggle { display: none; }
197
+ /* TocBar stays visible here — see the 1279px block above. */
198
+ /* Full-viewport left drawer covers the header (brand + X live in
199
+ drawer-head). Default Velu starts the rail under the header; Vepa
200
+ needs the Sequoia-style edge-to-top panel instead. */
201
+ [data-site-theme='vepa'] .velu-docs-layout__aside--left {
202
+ width: min(288px, 85vw);
203
+ inset-inline: 0 auto;
204
+ inset-block: 0 0;
205
+ top: 0;
206
+ bottom: 0;
207
+ padding: 12px 8px 16px;
208
+ padding-block-start: 12px;
209
+ transform: translateX(-100%);
210
+ z-index: 40;
211
+ visibility: hidden;
212
+ background: var(--page-bg);
213
+ border-right: 1px solid var(--vepa-hairline);
214
+ box-shadow: none;
215
+ }
216
+ [data-site-theme='vepa'][data-drawer-open='true'] .velu-docs-layout__aside--left {
217
+ transform: none;
218
+ visibility: visible;
219
+ box-shadow: 4px 0 24px #0002;
220
+ }
221
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-head {
222
+ display: flex;
223
+ align-items: center;
224
+ gap: 8px;
225
+ padding: 4px 16px 12px;
226
+ min-height: 40px;
227
+ }
228
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-brand .velu-header__mark { display: none; }
229
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-brand .velu-header__wordmark {
230
+ font-size: 20px;
231
+ line-height: 28px;
232
+ font-weight: 700;
233
+ }
234
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-close {
235
+ width: 32px;
236
+ height: 32px;
237
+ border-radius: 8px;
238
+ color: var(--muted-color);
239
+ margin-inline-start: auto;
240
+ }
241
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-head .velu-theme-menu {
242
+ margin-inline-start: 0;
243
+ }
244
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-close:hover {
245
+ background: var(--surface-color);
246
+ color: var(--vepa-heading);
247
+ }
248
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-docselect {
249
+ display: block;
250
+ margin: 0 8px 12px;
251
+ align-self: stretch;
252
+ }
253
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-docselect-btn {
254
+ height: 36px;
255
+ padding: 8px 12px;
256
+ border-radius: 8px;
257
+ border-color: var(--vepa-hairline);
258
+ background: var(--surface-color);
259
+ font-size: 14px;
260
+ line-height: 20px;
261
+ }
262
+ [data-site-theme='vepa'] .velu-docs-layout__drawer-docselect-menu {
263
+ border-radius: 12px;
264
+ border-color: var(--vepa-hairline);
265
+ box-shadow: 0 4px 16px #0002;
266
+ }
267
+ [data-site-theme='vepa'] .velu-docs-layout__scrim { display: block; }
268
+ [data-site-theme='vepa'][data-drawer-open='true'] .velu-docs-layout__scrim {
269
+ opacity: 1;
270
+ pointer-events: auto;
271
+ visibility: visible;
272
+ transition: opacity 0.25s ease, visibility 0s;
273
+ }
157
274
  [data-site-theme='vepa'] .velu-docs-layout__aside--left .velu-sidebar { opacity: 1; pointer-events: auto; }
158
275
  [data-site-theme='vepa'] .velu-context-bar__actions { position: static; margin-top: 12px; }
159
276
  [data-site-theme='vepa'] .velu-context-bar { display: contents !important; }
@@ -164,6 +281,21 @@
164
281
  [data-site-theme='vepa'] .velu-prose { margin-top: 32px; }
165
282
  }
166
283
  @container docs (max-width: 639px) {
284
+ /* Phone: replace the tab strip with crumbs + leading burger. */
285
+ [data-site-theme='vepa'] .velu-header__tabs { height: 56px; padding-inline: 16px; }
286
+ [data-site-theme='vepa'] .velu-header__tab { display: none !important; }
287
+ [data-site-theme='vepa'] .velu-header__crumbs {
288
+ display: flex;
289
+ font-size: 14px;
290
+ line-height: 20px;
291
+ }
292
+ [data-site-theme='vepa'] .velu-header__menu {
293
+ display: flex;
294
+ order: -1;
295
+ margin: 0;
296
+ width: 20px;
297
+ padding: 0;
298
+ }
167
299
  [data-site-theme='vepa'] .velu-hero h1 { font-size: 30px; line-height: 36px; }
168
300
  [data-site-theme='vepa'] :is(.velu-columns,.velu-card-group) { grid-template-columns: 1fr; }
169
301
  }
@@ -1417,7 +1417,7 @@ function DocsPage() {
1417
1417
  </>
1418
1418
  )}
1419
1419
  </RouterLink>
1420
- <ThemeToggle />
1420
+ <ThemeToggle variant={site.theme === 'vepa' ? 'menu' : undefined} />
1421
1421
  <button
1422
1422
  type="button"
1423
1423
  className="velu-docs-layout__drawer-close"
@@ -1430,7 +1430,9 @@ function DocsPage() {
1430
1430
  {/* Nav dropdown — custom button + menu, fills drawer width.
1431
1431
  Items mirror the desktop tabs (Home / Docs / Blog).
1432
1432
  Click-outside + Escape close (see navOpen useEffect
1433
- above). Chevron rotates 180° on open. */}
1433
+ above). Chevron rotates 180° on open. Shown only when
1434
+ there is more than one tab to switch between. */}
1435
+ {navItems.length > 1 && (
1434
1436
  <div
1435
1437
  ref={navRef}
1436
1438
  className="velu-docs-layout__drawer-docselect"
@@ -1474,6 +1476,7 @@ function DocsPage() {
1474
1476
  ))}
1475
1477
  </ul>
1476
1478
  </div>
1479
+ )}
1477
1480
  {/* Context zone — product switcher + anchors at the top of
1478
1481
  the sidebar (all breakpoints), plus version/language
1479
1482
  switchers that only show on mobile (desktop has them in
@@ -1621,10 +1624,17 @@ function DocsPage() {
1621
1624
  samples={entry.samples}
1622
1625
  responses={entry.operation.responses}
1623
1626
  />
1624
- ) : isChangelog && changelogTags.length ? (
1627
+ ) : isChangelog && changelogTags.length && site.theme !== 'vepa' ? (
1625
1628
  <ChangelogFilters tags={changelogTags} />
1629
+ ) : site.theme === 'vepa' ? (
1630
+ <>
1631
+ {isChangelog && changelogTags.length > 0 ? (
1632
+ <ChangelogFilters tags={changelogTags} />
1633
+ ) : null}
1634
+ <VepaToc items={pageToc} activeId={activeId} onSelect={scrollTo} />
1635
+ </>
1626
1636
  ) : (
1627
- site.theme === 'vepa' ? <VepaToc items={pageToc} activeId={activeId} onSelect={scrollTo} /> : <Toc id="table-of-contents-content" items={toc} activeId={activeId} onSelect={scrollTo} />
1637
+ <Toc id="table-of-contents-content" items={toc} activeId={activeId} onSelect={scrollTo} />
1628
1638
  )}
1629
1639
  </aside>
1630
1640
  )}