puredocs_v2 1.0.1 → 1.0.2

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.
@@ -47,3 +47,4 @@ ${s}
47
47
  `)}return""},f=(E,j)=>{const ae=p(),Le=pn(ae),je=Le[j]||Le[0];je&&E.setValue(je.code,je.language)},h=c("div",{className:"block section tabs-code"}),v=c("div",{className:"body"}),y=c("h2",{textContent:"Request"});h.append(y,v);const b=k.get(),g=c("div",{className:"card"}),A=c("div",{className:"card-head"}),O=c("div",{className:"tabs tabs-code"}),x=[];let L=0,C=null,w=null,$=null,I=null;{const E=vt(u,{active:!0,context:!0});x.push(E),I=c("div",{className:"panel is-request","data-tab":"first"});const j=i.length>1&&(r.length>0||o.length>0),ae=s.length>1;if(j||ae){const P=c("div",{className:"params-group"});P.append(c("h3",{textContent:"Examples"})),j&&P.append(gt({options:i.map(B=>({value:B.name,label:B.summary||B.name})),value:i[0].name,ariaLabel:"Select parameter example",className:"example-select",onChange:B=>{const W=i.find(ve=>ve.name===B);W&&(bs(t,W.values),t.dispatchEvent(new Event("input",{bubbles:!0})))}})),ae&&P.append(gt({options:s.map(B=>({value:B.name,label:ss(B)})),value:s[0].name,ariaLabel:"Select body example",className:"example-select",onChange:B=>{const W=s.find(ve=>ve.name===B);W&&l&&(l.setValue(Ar(W.value),"json"),l.syncLayout(),a?.(Ae(t,e)))}})),I.append(P)}const Le=c("div",{className:"headers-section"}),je=c("div",{className:"field-header"});je.append(c("h3",{textContent:"Headers"}));const it=c("div",{className:"headers-list"});if(e.requestBody){const B=Object.keys(e.requestBody.content||{})[0]||"application/json";it.append(at("Content-Type",B))}if(_(e.resolvedSecurity)&&b.spec){const P=on(e.resolvedSecurity,b.spec.securitySchemes),W={...sn(e.resolvedSecurity,b.spec.securitySchemes),...P};for(const[ve,Ft]of Object.entries(W))it.append(at(ve,Ft))}for(const P of e.parameters.filter(B=>B.in==="header"))it.append(at(P.name,String(P.example||"")));const uc=ce({variant:"icon",icon:T.plus,ariaLabel:"Add header",className:"field-copy-btn",onClick:()=>it.append(at("",""))});if(je.append(uc),Le.append(je,it),I.append(Le),r.length>0||o.length>0){const P=c("div",{className:"params-group"});if(P.append(c("h3",{textContent:"Parameters"})),r.length>0){const B=c("div",{className:"params-group"});o.length>0&&B.append(c("h3",{textContent:"Path"}));for(const W of r)B.append(Pr(W,i[0]?.values[W.name]));P.append(B)}if(o.length>0){const B=c("div",{className:"params-group"});r.length>0&&B.append(c("h3",{textContent:"Query"}));for(const W of o)B.append(Pr(W,i[0]?.values[W.name]));P.append(B)}I.append(P)}{const P=c("div",{className:"route-preview"}),B=c("div",{className:"field-header"});B.append(c("h3",{textContent:"URL"}));const W=ue({ariaLabel:"Copy URL",getText:()=>C?.value||Ae(t,e).url});C=Ne({type:"text",ariaLabel:"Request URL",readOnly:!0,modifiers:["filled"],className:"route-input"});const ve=c("div",{className:"route-input-row"});ve.append(C,W),P.append(B,ve),w=P}if(e.requestBody){const P=c("div",{className:"body-section"}),B=c("div",{className:"field-header"});B.append(c("h3",{textContent:"Body"}));const W=ue({ariaLabel:"Copy body",className:"field-copy-btn",getText:m});B.append(W),P.append(B);const Ft=Object.keys(e.requestBody.content||{})[0]||"application/json",dc=Ft.includes("multipart"),Gr=e.requestBody.content?.[Ft];if(dc&&Gr?.schema){const st=c("div",{className:"multipart","data-field":"multipart"}),_t=Gr.schema,ct=_t.properties||{},pc=_t.required||[];for(const[lt,Be]of Object.entries(ct)){const fc=Be.format==="binary"||Be.format==="base64"||Be.type==="string"&&Be.format==="binary",Kr=pc.includes(lt),wn=c("div",{className:`params row${Kr?" is-required":""}`}),Nn=c("span",{className:"label",textContent:lt});if(Kr&&Nn.append(Rr()),fc){const Sn=c("input",{type:"file",autocomplete:"off","data-multipart-field":lt,"data-multipart-type":"file"});wn.append(Nn,Sn)}else{const Sn=Ne({placeholder:Be.description||lt,value:Be.default!==void 0?String(Be.default):"",dataAttrs:{multipartField:lt,multipartType:"text"}});wn.append(Nn,Sn)}st.append(wn)}P.append(st)}else{const st=s[0],_t=st?Ar(st.value):"",ct=Br(_t,"json",{dataField:"body",onInput:()=>a?.(Ae(t,e))});l=ct,$=ct.syncLayout,P.append(ct.wrap)}P.append($r("body")),I.append(P)}}const R=p(),J=pn(R),Q=Br(J[0]?.code??"",J[0]?.language),ie=c("div",{className:"panel","data-tab":"lang"}),q=c("div",{className:"body-section"}),Y=c("div",{className:"field-header"});Y.append(c("h3",{textContent:"Code Example"}));const de=ue({ariaLabel:"Copy code",className:"field-copy-btn",getText:()=>Q.textarea.value});Y.append(de),q.append(Y,Q.wrap),ie.append(q);for(let E=0;E<d.length;E++){const j=d[E],ae=vt(j.label,{active:!u});x.push(ae)}A.append(O);const ee=I?[I,ie]:[ie],te=(E,j)=>{if(!j){E.style.display="none";return}E.style.display=E.classList.contains("is-request")?"flex":"block"};for(let E=0;E<x.length;E++){O.append(x[E]);const j=E;x[E].addEventListener("click",()=>{x.forEach(ae=>ae.classList.remove("is-active")),x[j].classList.add("is-active"),L=j,I&&te(I,j===0),te(ie,j!==0),j===0&&$?.(),j>0&&f(Q,j-1)})}const Ht=c("div",{className:"card-content flush"}),ot=c("div",{className:"panels"});if(I&&te(I,!0),te(ie,!1),ot.append(...ee),Ht.append(ot),n?.onSendRequest){const E=ce({variant:"primary",icon:T.send,label:"Send Request",className:"send-btn"});E.addEventListener("click",()=>n.onSendRequest(E));{w&&I?.append(w);const j=c("div",{className:"send-inline"});j.append(E),I?.append(j)}}!n?.onSendRequest&&u&&w&&I?.append(w),g.append(A,Ht),v.append(g);const Ie=()=>{C&&(C.value=Ae(t,e).url),a?.(Ae(t,e)),(L>0||!u)&&f(Q,L-1)};return t.addEventListener("input",Ie),t.addEventListener("change",Ie),queueMicrotask(()=>{Ie(),$?.()}),Ce().on("try-it:env-change",()=>{Ie()}),h}function Mr(e,t){return t!==void 0?t:e.example!==void 0&&e.example!==null?String(e.example):e.schema?.example!==void 0&&e.schema.example!==null?String(e.schema.example):e.schema?.default!==void 0&&e.schema.default!==null?String(e.schema.default):e.schema?.enum&&e.schema.enum.length>0?String(e.schema.enum[0]):e.schema?.type==="integer"||e.schema?.type==="number"?"0":e.schema?.type==="boolean"?"true":e.in==="path"?"id":"value"}function bs(e,t){e.querySelectorAll("[data-param-name]").forEach(a=>{const r=a.getAttribute("data-param-name");r&&t[r]!==void 0&&(a.value=t[r])})}function Pr(e,t){const n=c("div",{className:`params row${e.required?" is-required":""}`}),a=c("span",{className:"label",textContent:e.name});e.required&&a.append(Rr());const r=e.schema;let o;if(r?.enum&&r.enum.length>0){const s=e.required?r.enum.map(u=>({value:String(u),label:String(u)})):[{value:"",label:"— select —"},...r.enum.map(u=>({value:String(u),label:String(u)}))];o=gt({options:s,value:Mr(e,t),dataAttrs:{paramName:e.name,paramIn:e.in}})}else{const s=r?.type==="integer"||r?.type==="number"?"number":"text",l=Ne({type:s,placeholder:e.description||e.name,value:Mr(e,t),dataAttrs:{paramName:e.name,paramIn:e.in}});r?.type==="integer"&&l.setAttribute("step","1"),r?.minimum!==void 0&&l.setAttribute("min",String(r.minimum)),r?.maximum!==void 0&&l.setAttribute("max",String(r.maximum)),o=l}const i=$r(e.name);return n.append(a,o,i),n}function Rr(){return c("span",{className:"required-star",textContent:"*","aria-hidden":"true"})}function at(e,t){const n=c("div",{className:"header-row"}),a=Ne({placeholder:"Header name",value:e,dataAttrs:{headerName:"true"}}),r=Ne({placeholder:"Value",value:t,dataAttrs:{headerValue:"true"}}),o=ce({variant:"icon",icon:T.close,ariaLabel:"Remove header",onClick:()=>n.remove()});return n.append(a,r,o),n}function Ae(e,t){const n=k.get(),a=fe(n),r=e.querySelectorAll('[data-param-in="path"]'),o={};r.forEach(f=>{o[f.getAttribute("data-param-name")]=f.value});const i=e.querySelectorAll('[data-param-in="query"]'),s={};if(i.forEach(f=>{const h=f.getAttribute("data-param-name");f.value&&(s[h]=f.value)}),n.spec&&_(t.resolvedSecurity)){const f=Li(t.resolvedSecurity,n.spec.securitySchemes);for(const[h,v]of Object.entries(f))h in s||(s[h]=v)}const l=e.querySelectorAll(".header-row"),u={};if(l.forEach(f=>{const h=f.querySelector("[data-header-name]"),v=f.querySelector("[data-header-value]");h?.value&&v?.value&&(u[h.value]=v.value)}),n.spec&&_(t.resolvedSecurity)){const f=Oi(t.resolvedSecurity,n.spec.securitySchemes),h=Object.entries(f).map(([v,y])=>`${v}=${y}`);if(h.length>0){const v=u.Cookie||u.cookie||"";u.Cookie=v?`${v}; ${h.join("; ")}`:h.join("; "),delete u.cookie}}const d=e.querySelector('[data-field="multipart"]');let p;if(d){const f=new FormData;d.querySelectorAll("[data-multipart-field]").forEach(v=>{const y=v.getAttribute("data-multipart-field"),b=v.getAttribute("data-multipart-type");b==="file"&&v.files&&v.files.length>0?f.append(y,v.files[0]):b==="text"&&v.value&&f.append(y,v.value)}),p=f,delete u["Content-Type"]}else p=e.querySelector('[data-field="body"]')?.value||void 0;const m=es(a,t.path,o,s);return{method:t.method,url:m,headers:u,body:p}}function fn(e,t){z(e);const n=c("div",{className:"card"}),a=c("div",{className:"card-head response-header"}),r=vt("Body",{active:!0}),o=vt(`Headers (${Object.keys(t.headers).length})`),i=c("div",{className:"tabs tabs-code"});i.append(r,o);const s=c("div",{className:"meta",innerHTML:`<span>${pi(t.duration)}</span><span>${di(t.size)}</span>`}),l=N({text:String(t.status),kind:"status",statusCode:String(t.status),size:"m"}),u=ue({ariaLabel:"Copy response",getText:()=>t.body,onCopied:()=>ks("Response copied")});a.append(i,s,l,u),n.append(a);const d=c("div",{className:"card-content flush"}),p=c("div",{className:"response-pane"}),m=c("div",{className:"pane-inner"}),f=c("pre",{className:"code-display"}),h=c("code",{}),v=xs(t.body);h.innerHTML=qr(v,rr(v)?"json":""),f.append(h),m.append(f),p.append(m);const y=c("div",{className:"response-pane",style:"display:none"}),b=c("div",{className:"pane-inner"}),g=c("textarea",{readonly:!0,wrap:"off",spellcheck:"false",autocomplete:"off"});g.value=Object.entries(t.headers).map(([A,O])=>`${A}: ${O}`).join(`
48
48
  `),jr(g),b.append(g),y.append(b),d.append(p,y),n.append(d),r.addEventListener("click",()=>{r.classList.add("is-active"),o.classList.remove("is-active"),p.style.display="block",y.style.display="none"}),o.addEventListener("click",()=>{o.classList.add("is-active"),r.classList.remove("is-active"),p.style.display="none",y.style.display="block",requestAnimationFrame(()=>jr(g))}),e.append(n)}function xs(e,t){try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}}function ks(e){const t=document.querySelector(".copy-toast");t&&t.remove();const n=c("div",{className:"copy-toast",textContent:e});document.body.append(n),setTimeout(()=>n.remove(),2e3)}let Cs=0;function qt(e,t,n){if(t?.schema)return{content:Gi(t.schema).body,contentType:e,schemaType:Ge(t.schema),itemsCount:ws(t.schema)};const a=c("div",{className:"schema"}),r=c("div",{className:"body schema-body-plain"});return r.append(c("p",{textContent:n})),a.append(r),{content:a,contentType:e,schemaType:"plain",itemsCount:1}}function mn(e){const t=c("span",{className:"schema-content-meta"});return t.append(N({text:e.contentType,kind:"chip",size:"s"}),N({text:e.schemaType,kind:"chip",color:"primary",size:"s"})),t}function ws(e){let t=0;return e.properties&&(t+=Object.keys(e.properties).length),e.type==="array"&&e.items&&(t+=1),Array.isArray(e.allOf)&&(t+=e.allOf.length),Array.isArray(e.oneOf)&&(t+=e.oneOf.length),Array.isArray(e.anyOf)&&(t+=e.anyOf.length),e.additionalProperties&&typeof e.additionalProperties=="object"&&(t+=1),Math.max(t,1)}function Ee(e){const t=`collapsible-category-${Cs++}`,n=c("div",{className:"collapsible-category"}),a=c("span",{className:"collapsible-category-title",textContent:e.title}),r=c("span",{className:"collapsible-category-meta"});e.trailing&&r.append(c("span",{className:"collapsible-category-trailing"},e.trailing));const o=c("span",{className:"collapsible-category-controls"});e.counter!==void 0&&o.append(N({text:String(e.counter),kind:"chip",size:"s"}));const i=c("span",{className:"collapsible-category-chevron",innerHTML:T.chevronDown});o.append(i),r.append(o);const s=c("button",{className:"collapsible-category-toggle focus-ring",type:"button","aria-expanded":"true","aria-controls":t},a,r),l=c("div",{id:t,className:"collapsible-category-content"});l.append(e.content);const u=d=>{n.classList.toggle("is-expanded",d),s.setAttribute("aria-expanded",d?"true":"false"),l.hidden=!d};return s.addEventListener("click",()=>{const d=s.getAttribute("aria-expanded")==="true";u(!d)}),u(e.expanded!==!1),n.append(s,l),{root:n}}function Hr(e){const t=Object.entries(e);if(t.length===0)return null;const n=t.map(([o,i])=>{const s=i.schema?Ge(i.schema):"string",l=i.example!==void 0?String(i.example):i.schema?.example!==void 0?String(i.schema.example):"—",u=c("div",{className:"schema-row role-flat role-headers"}),d=c("div",{className:"schema-main-row"}),p=c("div",{className:"schema-name-wrapper"});p.append(c("span",{className:"schema-spacer"}),c("span",{textContent:o}));const m=c("div",{className:"schema-meta-wrapper"});m.append(N({text:s,kind:"chip",color:"primary",size:"m"})),i.required&&m.append(N({text:"required",kind:"required",size:"m"})),d.append(p,m),u.append(d);const f=c("div",{className:"schema-desc-col is-root"});i.description&&f.append(c("p",{textContent:i.description}));const h=c("div",{className:"schema-enum-values"});return h.append(N({text:l,kind:"chip",size:"s"})),f.append(h),f.children.length>0&&u.append(f),u}),a=c("div",{className:"params"}),r=c("div",{className:"body role-headers"});return r.append(...n),a.append(r),a}function It(e){const t=c("div",{className:"collapsible-categories"});if(e.headers){const a=Ee({title:"Headers",content:e.headers,counter:e.headersCount});t.append(a.root)}const n=Ee({title:"Body",content:e.body.content,trailing:mn(e.body),counter:e.body.itemsCount});return t.append(n.root),t}function hn(e){const{prev:t,next:n}=Ns(e);if(!t&&!n)return null;const a=c("div",{className:`route-nav${!t||!n?" is-single":""}`});return t&&a.append(Fr(t,"previous")),n&&a.append(Fr(n,"next")),a}function Fr(e,t){const n=H(e.route),a=c("a",{className:`card interactive route-card ${t==="previous"?"is-prev":"is-next"}`,href:n}),r=c("div",{className:"route-meta"});e.kind==="endpoint"?(r.append(N({text:e.operation.method.toUpperCase(),kind:"method",method:e.operation.method})),r.append(c("span",{className:"route-path",textContent:e.operation.path}))):(r.append(N({text:"WEBHOOK",kind:"webhook",size:"s"})),r.append(N({text:e.webhook.method.toUpperCase(),kind:"method",method:e.webhook.method})));const o=c("span",{className:"route-side","aria-hidden":"true"});o.innerHTML=t==="previous"?T.chevronLeft:T.chevronRight;const i=c("div",{className:"route-main"});return i.append(c("span",{className:"route-category",textContent:e.category}),c("span",{className:"route-title",textContent:e.title}),r),t==="previous"?a.append(o,i):a.append(i,o),a.addEventListener("click",s=>{s.preventDefault(),M(n)}),a}function Ns(e){if(!k.get().spec)return{prev:null,next:null};const n=Ss();if(n.length===0)return{prev:null,next:null};const a=As(n,e);return a<0?{prev:null,next:null}:{prev:a>0?n[a-1]:null,next:a<n.length-1?n[a+1]:null}}function Ss(){const e=k.get().spec;if(!e)return[];const t=[],n=new Set;for(const a of e.tags)for(const r of a.operations){const o=`${r.method.toLowerCase()} ${r.path}`;n.has(o)||(n.add(o),t.push({kind:"endpoint",route:{type:"endpoint",tag:a.name,method:r.method,path:r.path,operationId:r.operationId},operation:r,title:r.summary||r.path,category:a.name}))}for(const a of e.webhooks||[])t.push({kind:"webhook",route:{type:"webhook",webhookName:a.name},webhook:a,title:a.summary||a.name,category:"Webhooks"});return t}function As(e,t){if(t.type==="endpoint"){if(t.operationId){const n=e.findIndex(a=>a.kind==="endpoint"&&a.route.operationId===t.operationId);if(n>=0)return n}return e.findIndex(n=>n.kind==="endpoint"&&n.route.method===t.method&&n.route.path===t.path)}return t.type==="webhook"?e.findIndex(n=>n.kind==="webhook"&&n.route.webhookName===t.webhookName):-1}async function Es(e,t,n){z(e),z(t);const a=n.method.toLowerCase()!=="trace",r=t.parentElement;r&&a&&(r.setAttribute("aria-label","Try It"),r.classList.add("try-it"));const o=k.get(),i=gi(o),s=Ue(o),l=i+(n.path.startsWith("/")?"":"/")+n.path,u=[],d=N({text:n.method.toUpperCase(),kind:"method",method:n.method,size:"m"});u.push({label:s||o.spec?.info.title||"Home",href:"/",className:"breadcrumb-item",onClick:q=>{q.preventDefault(),M("/")}});const p=new Set((o.spec?.tags||[]).map(q=>q.name.toLowerCase())),m=(n.path||"/").split("/").filter(Boolean);for(const q of m){const Y=q.startsWith("{")&&q.endsWith("}"),de=!Y&&p.has(q.toLowerCase()),ee=o.spec?.tags.find(te=>te.name.toLowerCase()===q.toLowerCase());de&&ee?u.push({label:q,href:H({type:"tag",tag:ee.name}),className:"breadcrumb-item breadcrumb-segment",onClick:te=>{te.preventDefault(),M(H({type:"tag",tag:ee.name}))}}):u.push({label:q,className:Y?"breadcrumb-param":"breadcrumb-segment"})}const f=ue({ariaLabel:"Copy URL",copiedAriaLabel:"Copied",className:"breadcrumb-copy",getText:()=>`${n.method.toUpperCase()} ${l}`}),h=We(u,{leading:[d],trailing:[f]}),v=c("div",{className:"block header"});v.append(c("h1",{textContent:n.summary||`${n.method.toUpperCase()} ${n.path}`})),n.description&&v.append(c("p",{textContent:n.description}));const y=c("div",{className:"breadcrumb-wrap endpoint-breadcrumb"});y.append(h),v.append(y);const b=c("div",{className:"endpoint-meta-row"});if(n.deprecated){const q=c("span",{className:"icon-muted"});q.innerHTML=T.warning,b.append(c("span",{className:"endpoint-meta deprecated"},q,"Deprecated"))}let g=null;if(_(n.resolvedSecurity)){const q=Dr(o,n),Y=En(n.resolvedSecurity)||"Auth required",de=xt({configured:q,variant:"endpoint",title:Me(n.resolvedSecurity)});g=c("span",{className:`endpoint-meta auth${q?" is-active":" is-missing"}`,"aria-label":Me(n.resolvedSecurity),role:"button",tabindex:"0"},de,Y),g.classList.add("endpoint-auth-trigger","focus-ring"),g.addEventListener("click",()=>{const ee=k.get().spec;if(!ee||!Object.keys(ee.securitySchemes||{}).length)return;const te=e.closest(".root")??void 0;an(ee.securitySchemes,te,Bs(n,o))}),g.addEventListener("keydown",ee=>{const te=ee.key;te!=="Enter"&&te!==" "||(ee.preventDefault(),g&&g.click())}),b.append(g)}b.childElementCount>0&&v.append(b),e.append(v);const A=n.parameters.filter(q=>q.in!=="cookie"),O=U({title:"Request"}),x=Ls(n,A);if(x)O.append(x);else{const q=c("div",{className:"params empty",textContent:"No parameters or request body required"});O.append(q)}e.append(O);let L=!1;Object.keys(n.responses).length>0&&(e.append(Is(n)),L=!0);const C={type:"endpoint",method:n.method,path:n.path,operationId:n.operationId},w=hn(C),$=hn(C),I=()=>{if(w&&e.append(c("div",{className:"route-nav-wrap is-desktop"},w)),$){const q=e.closest(".page");q&&q.append(c("div",{className:"route-nav-wrap is-mobile"},$))}};L&&I(),n.callbacks&&n.callbacks.length>0&&e.append($s(n)),L||I();const R=js(n);n.method.toLowerCase()!=="trace"&&vs(n,t,R);const J=Ce(),Q=h.querySelector(".breadcrumb-item");Q&&J.on("endpoint:breadcrumb",q=>{Q.textContent=Ue(q)||q.spec?.info.title||"Home"}),g&&_(n.resolvedSecurity)&&J.on("endpoint:auth-badge",q=>{const Y=Dr(q,n);g.className=`endpoint-meta auth endpoint-auth-trigger focus-ring${Y?" is-active":" is-missing"}`;const de=g.querySelector(".lock-icon");de&&(de.className=`lock-icon${Y?" is-unlocked":""}`)});const ie=t.querySelector(".content");ie&&_(n.resolvedSecurity)&&J.on("endpoint:auth-headers",q=>{if(!q.spec)return;const Y=ie.querySelector(".headers-list");if(!Y)return;const de=["Authorization","Cookie"];for(const $e of Array.from(Y.querySelectorAll(".header-row"))){const E=$e.querySelector("[data-header-name]");E&&de.includes(E.value)&&$e.remove()}const ee=on(n.resolvedSecurity,q.spec.securitySchemes),Ht={...sn(n.resolvedSecurity,q.spec.securitySchemes),...ee},ot=Array.from(Y.querySelectorAll(".header-row")),Ie=ot.find($e=>{const E=$e.querySelector("[data-header-name]");return E&&E.value==="Content-Type"})||ot[0];for(const[$e,E]of Object.entries(Ht).reverse()){const j=at($e,E);Ie?Ie.insertAdjacentElement("beforebegin",j):Y.prepend(j)}ie.dispatchEvent(new Event("input",{bubbles:!0}))})}function Ls(e,t){const n=t.filter(u=>u.in==="path"),a=t.filter(u=>u.in==="query"),r=Os(e),o=qs(e);if(n.length===0&&a.length===0&&r.length===0&&!o)return null;const i=ne(),s=ze(),l=c("div",{className:"collapsible-categories"});if(n.length>0){const u=Ee({title:"Path",content:_r(n),counter:n.length});l.append(u.root)}if(a.length>0){const u=Ee({title:"Query",content:_r(a),counter:a.length});l.append(u.root)}if(r.length>0){const u=Ee({title:"Headers",content:Ts(r),counter:r.length});l.append(u.root)}if(o){const u=Ee({title:"Body",content:o.content,trailing:o.trailing,counter:o.counter});l.append(u.root)}return s.append(l),i.append(s),i}function _r(e){const t=e.map(r=>{const o=c("div",{className:"schema-row role-flat role-params"}),i=c("div",{className:"schema-main-row"}),s=c("div",{className:"schema-name-wrapper"});s.append(c("span",{className:"schema-spacer"}),c("span",{textContent:r.name}));const l=c("div",{className:"schema-meta-wrapper"});l.append(N({text:r.schema?Ge(r.schema):"unknown",kind:"chip",color:"primary",size:"m"})),r.required&&l.append(N({text:"required",kind:"required",size:"m"})),i.append(s,l),o.append(i);const u=c("div",{className:"schema-desc-col is-root"});r.description&&u.append(c("p",{textContent:r.description}));const d=r.schema?.enum,p=r.schema?.default!==void 0;if(d&&d.length>0||p){const m=c("div",{className:"schema-enum-values"});if(p&&m.append(N({text:`Default: ${JSON.stringify(r.schema.default)}`,kind:"chip",size:"s"})),d)for(const f of d){const h=String(f);h!==r.in&&m.append(N({text:h,kind:"chip",size:"s"}))}u.append(m)}return u.children.length>0&&o.append(u),o}),n=c("div",{className:"params"}),a=c("div",{className:"body role-params"});return a.append(...t),n.append(a),n}function Os(e){const t=[];if(e.requestBody){const n=Object.keys(e.requestBody.content||{});t.push({name:"Content-Type",value:n[0]||"application/json",description:"Media type for request body payload",required:!!e.requestBody.required})}if(_(e.resolvedSecurity)){const n=k.get().spec,a=n?on(e.resolvedSecurity,n.securitySchemes):{},o={...n?sn(e.resolvedSecurity,n.securitySchemes):{},...a};for(const[i,s]of Object.entries(o))t.push({name:i,value:s,description:"Authentication header value",required:!0})}for(const n of e.parameters.filter(a=>a.in==="header"))t.push({name:n.name,value:String(n.schema?.default??n.example??""),description:n.description,required:n.required});return t}function Ts(e){const t=e.map(r=>{const o=c("div",{className:"schema-row role-flat role-headers"}),i=c("div",{className:"schema-main-row"}),s=c("div",{className:"schema-name-wrapper"});s.append(c("span",{className:"schema-spacer"}),c("span",{textContent:r.name}));const l=c("div",{className:"schema-meta-wrapper"});r.required&&l.append(N({text:"required",kind:"required",size:"m"})),i.append(s,l),o.append(i);const u=c("div",{className:"schema-desc-col is-root"});r.description&&u.append(c("p",{textContent:r.description}));const d=c("div",{className:"schema-enum-values"});return d.append(N({text:r.value||"—",kind:"chip",size:"s"})),u.append(d),u.children.length>0&&o.append(u),o}),n=c("div",{className:"params"}),a=c("div",{className:"body role-headers"});return a.append(...t),n.append(a),n}function qs(e){const t=c("div",{className:"request-body-wrap"}),n=Object.entries(e.requestBody?.content||{});if(e.requestBody?.description&&t.append(c("p",{textContent:e.requestBody.description})),n.length===0)return t.childElementCount>0?{content:t}:null;const a=n.map(([o,i])=>qt(o,i,"No schema"));if(a.length===1){const o=a[0];return t.append(o.content),{content:t,trailing:mn(o),counter:o.itemsCount}}const r=c("div",{className:"schema-media-list"});for(const o of a){const i=c("div",{className:"schema-media-header"});i.append(N({text:o.contentType,kind:"chip",size:"s"}),N({text:o.schemaType,kind:"chip",color:"primary",size:"s"}));const s=c("div",{className:"schema-media-item"});s.append(i,o.content),r.append(s)}return t.append(r),{content:t,counter:a.length}}function Is(e){const t=U({titleEl:tt("Responses")}),n=Object.entries(e.responses);if(n.length===0)return t;const a=ne(),r=c("div",{className:"card-row responses-header-row"}),o=c("div",{className:"tabs-code codes"});let i=n[0][0];const s=new Map;for(const[p,m]of n){const f=cr(p,p===i),h=m.content&&Object.keys(m.content)[0]||"application/json",v=m.content?.[h],y=qt(h,v,m.description||"No schema"),b=m.headers?Hr(m.headers):null;s.set(p,{body:y,headers:b,headersCount:m.headers?Object.keys(m.headers).length:0}),o.append(f),f.addEventListener("click",()=>{o.querySelectorAll('[data-badge-group="response-code"]').forEach(A=>yt(A,!1)),yt(f,!0),i=p;const g=s.get(p);u.innerHTML="",u.append(It(g))})}r.append(o),a.append(bt(r));const l=ze(),u=c("div"),d=s.get(i);return d&&u.append(It(d)),l.append(u),a.append(l),t.append(a),t}function $s(e){const t=U({titleEl:tt("Callbacks",N({text:String(e.callbacks.length),kind:"chip",size:"m"}))});for(const n of e.callbacks){const a=c("div",{className:"callback-block"});a.append(c("div",{className:"callback-name",textContent:n.name}));for(const r of n.operations){const o=c("div",{className:"callback-operation"}),i=c("div",{className:"callback-op-header"});if(i.append(N({text:r.method.toUpperCase(),kind:"method",method:r.method}),c("span",{className:"callback-op-path",textContent:r.path})),o.append(i),r.summary&&o.append(c("div",{className:"callback-op-summary",textContent:r.summary})),r.description&&o.append(c("p",{textContent:r.description})),r.requestBody){const s=r.requestBody.content||{};for(const[l,u]of Object.entries(s))u.schema&&o.append(ln(u.schema,`${l} — Request Body`))}if(Object.keys(r.responses).length>0)for(const[s,l]of Object.entries(r.responses)){const u=c("div",{className:"callback-response-row"});if(u.append(N({text:s,kind:"status",statusCode:s})),l.description&&u.append(c("p",{textContent:l.description})),l.content)for(const[d,p]of Object.entries(l.content))p.schema&&u.append(ln(p.schema,`${d}`));o.append(u)}a.append(o)}t.append(a)}return t}function js(e){const t=Object.keys(e.responses).sort((n,a)=>{const r=n.startsWith("2")?0:n.startsWith("4")?1:2,o=a.startsWith("2")?0:a.startsWith("4")?1:2;return r-o||n.localeCompare(a)});for(const n of t){const a=e.responses[n];if(!a?.content)continue;const r=Object.keys(a.content)[0]||"application/json",o=a.content[r],s=(o?Sr(o):[])[0];if(s&&s.value!==void 0){const l=typeof s.value=="string"?s.value:JSON.stringify(s.value,null,2),u=a.description||(n.startsWith("2")?"OK":n.startsWith("4")?"Not Found":"Error");return{statusCode:n,statusText:u,body:l}}if(o?.example!==void 0){const l=typeof o.example=="string"?o.example:JSON.stringify(o.example,null,2);return{statusCode:n,statusText:a.description||"OK",body:l}}}return null}function Dr(e,t){const n=t.resolvedSecurity?.requirements||[];if(!_(t.resolvedSecurity))return!1;const a=(e.auth.token||"").trim(),r=e.auth.schemes||{},o=e.auth.activeScheme,i=s=>String(r[s]||"").trim()?!0:a?!o||o===s:!1;return n.some(s=>{const l=s.map(u=>u.schemeName);return l.length===0?!0:l.every(u=>i(u))})}function Bs(e,t){return(e.resolvedSecurity?.requirements||[])[0]?.[0]?.schemeName||t.auth.activeScheme||void 0}function Ms(e,t,n){z(e);const a=k.get().spec;if(!a)return;const r=Z(n),o=a.tags.find(g=>g.name===n)||a.tags.find(g=>Z(g.name)===r);if(!o||o.operations.length===0){const g=c("div",{className:"block header"});g.append(c("h1",{textContent:"Tag not found"})),e.append(g),e.append(U({title:"Details"},c("p",{textContent:`No operations for tag "${n}"`})));return}const i=c("div",{className:"block header"});i.append(c("h1",{textContent:o.name}));const s=k.get(),l=Ue(s),u=ue({ariaLabel:"Copy category",copiedAriaLabel:"Copied",className:"breadcrumb-copy",getText:()=>o.name}),d=We([{label:l||a.info.title||"Home",href:"/",className:"breadcrumb-item",onClick:g=>{g.preventDefault(),M("/")}},{label:o.name,className:"breadcrumb-current"}],{className:"breadcrumb-tag-page",leading:[N({text:"Tag",kind:"chip",size:"m"})],trailing:[u]}),p=c("div",{className:"breadcrumb-wrap endpoint-breadcrumb"});p.append(d),i.append(p),o.description&&i.append(c("p",{textContent:o.description})),e.append(i);const m=Ps(o),f=o.operations.filter(g=>_(g.resolvedSecurity)).length,h=o.operations.filter(g=>g.deprecated).length;e.append(U({className:"summary"},Et([{label:"Endpoints",value:o.operations.length},{label:"Auth Required",value:f},{label:"Deprecated",value:h}],m)));const v=U({title:"Endpoints"}),y=k.get().route;for(const g of o.operations){const A={type:"endpoint",tag:o.name,method:g.method,path:g.path,operationId:g.operationId},O=y.type==="endpoint"&&(y.operationId&&y.operationId===g.operationId||y.method===g.method&&y.path===g.path),x=ne({interactive:!0,active:O,className:`card-group${g.deprecated?" deprecated":""}`,onClick:()=>M(H(A))}),L=_(g.resolvedSecurity)?xt({configured:wt(g.resolvedSecurity,a.securitySchemes||{}),variant:"tag",title:Me(g.resolvedSecurity)}):null,C=c("div",{className:"card-badges"});C.append(N({text:g.method.toUpperCase(),kind:"method",method:g.method,size:"m"}));const w=c("div",{className:"card-group-top"});L&&w.append(L),w.append(c("h3",{className:"card-group-title"},c("code",{textContent:g.path})),C);const $=g.summary||g.operationId?c("p",{className:"card-group-description",textContent:g.summary||g.operationId}):null;x.append(w),$&&x.append($),v.append(x)}e.append(v);const b=d.querySelector(".breadcrumb-item");b&&Ce().on("tag:breadcrumb",g=>{b.textContent=Ue(g)||g.spec?.info.title||"Home"})}function Ps(e){const t={};for(const n of e.operations)t[n.method]=(t[n.method]||0)+1;return t}async function Rs(e,t){z(e);const n=N({text:"WEBHOOK",kind:"webhook",size:"m"}),a=N({text:t.method.toUpperCase(),kind:"method",method:t.method,size:"m"}),r=k.get(),o=Ue(r),i=ue({ariaLabel:"Copy webhook name",copiedAriaLabel:"Copied",className:"breadcrumb-copy",getText:()=>`${t.method.toUpperCase()} ${t.name}`}),s=We([{label:o||r.spec?.info.title||"Home",href:"/",className:"breadcrumb-item",onClick:h=>{h.preventDefault(),M("/")}},{label:t.name,className:"breadcrumb-current"}],{leading:[n,a],trailing:[i]}),l=c("div",{className:"block header"});t.summary?l.append(c("h1",{textContent:t.summary})):l.append(c("h1",{textContent:t.name}));const u=c("div",{className:"breadcrumb-wrap endpoint-breadcrumb"});u.append(s),l.append(u),t.description&&l.append(c("p",{textContent:t.description})),e.append(l);const d=t.parameters.filter(h=>h.in!=="cookie");if(d.length>0){const h=U({title:"Parameters"},Hs(d));e.append(h)}if(t.requestBody){const h=U({titleEl:tt("Request")}),v=Object.entries(t.requestBody.content||{});if(v.length>0){const y=ne(),b=ze(),g=c("div",{className:"collapsible-categories"}),A=c("div",{className:"request-body-wrap"});t.requestBody.description&&A.append(c("p",{textContent:t.requestBody.description}));const O=v.map(([x,L])=>qt(x,L,"No schema"));if(O.length===1){const x=O[0];A.append(x.content);const L=Ee({title:"Body",content:A,trailing:mn(x),counter:x.itemsCount});g.append(L.root)}else{const x=c("div",{className:"schema-media-list"});for(const C of O){const w=c("div",{className:"schema-media-header"});w.append(N({text:C.contentType,kind:"chip",size:"s"}),N({text:C.schemaType,kind:"chip",color:"primary",size:"s"}));const $=c("div",{className:"schema-media-item"});$.append(w,C.content),x.append($)}A.append(x);const L=Ee({title:"Body",content:A,counter:O.length});g.append(L.root)}b.append(g),y.append(b),h.append(y)}e.append(h)}const p=Object.entries(t.responses);if(p.length>0){const h=U({titleEl:tt("Expected Responses")}),v=ne(),y=c("div",{className:"card-row responses-header-row"}),b=c("div",{className:"tabs-code codes"});let g=p[0][0];const A=new Map;for(const[C,w]of p){const $=cr(C,C===g),I=w.content&&Object.keys(w.content)[0]||"application/json",R=w.content?.[I],J=qt(I,R,w.description||"No schema"),Q=w.headers?Hr(w.headers):null;A.set(C,{body:J,headers:Q,headersCount:w.headers?Object.keys(w.headers).length:0}),b.append($),$.addEventListener("click",()=>{b.querySelectorAll('[data-badge-group="response-code"]').forEach(q=>yt(q,!1)),yt($,!0),g=C;const ie=A.get(C);x.innerHTML="",x.append(It(ie))})}y.append(b),v.append(bt(y));const O=ze(),x=c("div"),L=A.get(g);L&&x.append(It(L)),O.append(x),v.append(O),h.append(v),e.append(h)}const m=hn({type:"webhook",webhookName:t.name});m&&e.append(c("div",{className:"block section"},m));const f=s.querySelector(".breadcrumb-item");f&&Ce().on("webhook:breadcrumb",h=>{f.textContent=Ue(h)||h.spec?.info.title||"Home"})}function Hs(e){const t=e.filter(r=>r.in==="path").length,n=e.filter(r=>r.in==="query").length,a=t>0&&n>0?"Parameters":t>0?"Path":"Query";return Ki(e,{headerTitle:a,withEnumAndDefault:!1})}function Fs(){const e=c("div",{className:"page"}),t=c("div",{className:"main",role:"main"}),n=c("div",{className:"content"});t.append(n);const a=c("div",{className:"aside","aria-label":"Panel"}),r=c("div",{className:"content"});return a.append(r),a.hidden=!0,e.append(t,a),{page:e,main:n,aside:r}}function me(e,t){const n=e.querySelector(".aside");n&&(n.hidden=!t)}function $t(e){const{title:t,message:n,icon:a,variant:r="empty"}=e;if(r==="loading")return c("div",{className:"block header"},c("h2",{textContent:t}),c("div",{className:"loading"},c("div",{className:"spinner"}),c("span",null,n||t)));const o=c("div",{className:"block header"});return a&&o.append(c("span",{innerHTML:a,className:"icon-muted"})),o.append(c("h2",{textContent:t})),n&&o.append(c("p",{className:"error-message",textContent:n})),o}let he=null,re=null,gn=null,vn=null,yn=null,jt=null,Bt=!1,Mt="",Ke=null;const _s=991;function Ds(e,t){he=c("div",{className:"root"});const n={primaryColor:t.primaryColor};nr(he,k.get().theme,n);const a=c("button",{type:"button",className:"sidebar-expand-trigger","aria-label":"Open sidebar"});a.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><line x1="4" x2="20" y1="12" y2="12"/><line x1="4" x2="20" y1="6" y2="6"/><line x1="4" x2="20" y1="18" y2="18"/></svg>',a.addEventListener("click",()=>{k.set({sidebarOpen:!0}),re?.classList.remove("collapsed")}),re=c("aside",{className:"sidebar","aria-label":"Navigation"});const{page:r,main:o,aside:i}=Fs();gn=r,vn=o,yn=i,he.append(a,re,r),e.append(he),Ws(),k.subscribe(s=>{he&&(nr(he,s.theme,n),re?.classList.toggle("collapsed",!s.sidebarOpen),a.classList.toggle("visible",!s.sidebarOpen),Ur(s,t))}),re?.classList.toggle("collapsed",!k.get().sidebarOpen),a.classList.toggle("visible",!k.get().sidebarOpen),Ur(k.get(),t)}function Us(){Ke?.(),Ke=null,ar(),he&&(he.remove(),he=null,re=null,gn=null,vn=null,yn=null,jt=null,Bt=!1)}async function Ur(e,t){const n=!!e.spec;re&&n?(Bt?Ii(re,e.route):ji(re,t),Bt=!0):Bt=!1;const a=vn,r=yn,o=gn;if(!a||!r||!o)return;if(e.loading){me(o,!1),z(r),et(a,$t({title:"Loading...",message:"Loading API specification...",variant:"loading"}));const m=a.parentElement;m&&(m.scrollTop=0);return}if(e.error){me(o,!1),z(r),et(a,$t({title:"Failed to load API specification",message:e.error,icon:T.warning,variant:"error"}));const m=a.parentElement;m&&(m.scrollTop=0);return}if(!e.spec)return;const i=e.route,s=`${e.activeEnvironment}|${e.auth.token}`,l=!!(jt&&Vs(jt,i)),u=l&&Mt!==s,d=a.parentElement,p=d?d.scrollTop:0;if(!(l&&Mt===s)){if(u){Mt=s,mi(e),re&&e.spec&&($i(re),_i(re));return}switch(jt={...i},Mt=s,ar(),o.querySelectorAll(":scope > .route-nav-wrap").forEach(m=>m.remove()),z(a),z(r),i.type){case"overview":me(o,!1),xr(a);break;case"tag":{me(o,!1),Ms(a,r,i.tag||"");break}case"endpoint":{const m=zs(e,i);if(m){const f=m.method.toLowerCase()!=="trace";me(o,f),await Es(a,r,m)}else{me(o,!1);const f=i.operationId?i.operationId:`${i.method?.toUpperCase()||""} ${i.path||""}`.trim();et(a,$t({title:"Endpoint not found",message:f||"Unknown endpoint",variant:"empty"}))}break}case"schema":{if(me(o,!1),i.schemaName){const m=e.spec.schemas[i.schemaName];if(m){const f=fe(e),h=we(f),v=ue({ariaLabel:"Copy schema name",copiedAriaLabel:"Copied",className:"breadcrumb-copy",getText:()=>i.schemaName||""}),y=We([{label:h||e.spec.info.title||"Home",href:"/",className:"breadcrumb-item",onClick:x=>{x.preventDefault(),M("/")}},{label:i.schemaName,className:"breadcrumb-current"}],{leading:[N({text:"Schema",kind:"chip",size:"m"})],trailing:[v]}),b=c("div",{className:"block header"});b.append(c("h1",{textContent:i.schemaName}));const g=c("div",{className:"breadcrumb-wrap endpoint-breadcrumb"});g.append(y),b.append(g),m.description&&b.append(c("p",{textContent:String(m.description)}));const A=c("div",{className:"block section"});A.append(ln(m,"Properties")),et(a,b,A);const O=y.querySelector(".breadcrumb-item");O&&Ce().on("schema:breadcrumb",x=>{O.textContent=we(fe(x))||x.spec?.info.title||"Home"})}}else Gs(a,e);break}case"webhook":{if(me(o,!1),i.webhookName){const m=e.spec.webhooks?.find(f=>f.name===i.webhookName);m?Rs(a,m):et(a,$t({title:"Webhook not found",message:i.webhookName,variant:"empty"}))}else Ys(a,e);break}default:me(o,!1),xr(a)}d&&(d.scrollTop=u?p:0)}}function zs(e,t){if(!e.spec||t.type!=="endpoint")return null;if(t.operationId){const o=e.spec.operations.find(i=>i.operationId===t.operationId);if(o)return o}const n=(t.method||"").toLowerCase();if(!n)return null;const a=t.path||"",r=e.spec.operations.filter(o=>o.method.toLowerCase()===n&&o.path===a);if(r.length===0)return null;if(r.length===1)return r[0];if(t.tag){const o=Z(t.tag),i=r.find(s=>s.tags.some(l=>Z(l)===o));if(i)return i}return r[0]}function Ws(){if(Ke?.(),Ke=null,typeof window>"u"||typeof window.matchMedia!="function")return;const e=window.matchMedia(`(max-width: ${_s}px)`),t=r=>{const o=!r;k.get().sidebarOpen!==o&&k.set({sidebarOpen:o})};t(e.matches);const n=r=>{t(r.matches)};if(typeof e.addEventListener=="function"){e.addEventListener("change",n),Ke=()=>e.removeEventListener("change",n);return}const a=n;e.addListener(a),Ke=()=>e.removeListener(a)}function Vs(e,t){return e.type===t.type&&e.operationId===t.operationId&&e.method===t.method&&e.path===t.path&&e.schemaName===t.schemaName&&e.tag===t.tag&&e.webhookName===t.webhookName}function Ys(e,t){const n=t.spec;if(!n)return;const a=n.webhooks||[],r=fe(t),o=we(r),i=c("div",{className:"block header"});i.append(c("h1",{textContent:"Webhooks"}));const s=We([{label:o||n.info.title||"Home",href:"/",className:"breadcrumb-item",onClick:m=>{m.preventDefault(),M("/")}},{label:"Webhooks",className:"breadcrumb-current"}],{leading:[N({text:"Tag",kind:"chip",size:"m"})],trailing:[ue({ariaLabel:"Copy",copiedAriaLabel:"Copied",className:"breadcrumb-copy",getText:()=>"Webhooks"})]}),l=c("div",{className:"breadcrumb-wrap endpoint-breadcrumb"});l.append(s),i.append(l),e.append(i);const u=s.querySelector(".breadcrumb-item");u&&Ce().on("webhookList:breadcrumb",m=>{u.textContent=we(fe(m))||m.spec?.info.title||"Home"});const d={};for(const m of a)d[m.method]=(d[m.method]||0)+1;e.append(U({className:"summary"},Et([{label:"Webhooks",value:a.length}],d)));const p=U({title:"Webhooks"});for(const m of a){const f={type:"webhook",webhookName:m.name},h=t.route.type==="webhook"&&t.route.webhookName===m.name,v=ne({interactive:!0,active:h,className:"card-group",onClick:()=>M(H(f))}),y=c("div",{className:"card-badges"});y.append(N({text:"WH",kind:"webhook",size:"m"}),N({text:m.method.toUpperCase(),kind:"method",method:m.method,size:"m"}));const b=c("div",{className:"card-group-top"});b.append(c("h3",{className:"card-group-title",textContent:m.name}),y);const g=c("p",{className:"card-group-description",textContent:m.summary||m.description||`${m.method.toUpperCase()} webhook`});v.append(b,g),p.append(v)}e.append(p)}function Gs(e,t){const n=t.spec;if(!n)return;const a=Object.keys(n.schemas),r=fe(t),o=we(r),i=c("div",{className:"block header"});i.append(c("h1",{textContent:"Schemas"}));const s=We([{label:o||n.info.title||"Home",href:"/",className:"breadcrumb-item",onClick:p=>{p.preventDefault(),M("/")}},{label:"Schemas",className:"breadcrumb-current"}],{leading:[N({text:"Tag",kind:"chip",size:"m"})],trailing:[ue({ariaLabel:"Copy",copiedAriaLabel:"Copied",className:"breadcrumb-copy",getText:()=>"Schemas"})]}),l=c("div",{className:"breadcrumb-wrap endpoint-breadcrumb"});l.append(s),i.append(l),e.append(i);const u=s.querySelector(".breadcrumb-item");u&&Ce().on("schemaList:breadcrumb",p=>{u.textContent=we(fe(p))||p.spec?.info.title||"Home"}),e.append(U({className:"summary"},Et([{label:"Schemas",value:a.length}],{})));const d=U({title:"Schemas"});for(const p of a){const m=n.schemas[p],f={type:"schema",schemaName:p},h=t.route.type==="schema"&&t.route.schemaName===p,v=ne({interactive:!0,active:h,className:"card-group",onClick:()=>M(H(f))}),y=c("div",{className:"card-badges"}),b=m.type||(m.allOf?"allOf":m.oneOf?"oneOf":m.anyOf?"anyOf":"object");y.append(N({text:b,kind:"chip",size:"m"})),m.properties&&y.append(N({text:`${Object.keys(m.properties).length} props`,kind:"chip",size:"m"}));const g=c("div",{className:"card-group-top"});g.append(c("h3",{className:"card-group-title",textContent:p}),y);const A=m.description?c("p",{className:"card-group-description",textContent:String(m.description)}):c("p",{className:"card-group-description",textContent:`${b} schema`});v.append(g,A),d.append(v)}e.append(d)}const zr="ap_portal_prefs";function Ks(){try{const e=localStorage.getItem(zr);if(!e)return null;const t=JSON.parse(e);return!t||typeof t!="object"?null:{activeEnvironment:typeof t.activeEnvironment=="string"?t.activeEnvironment:"",environments:Array.isArray(t.environments)?t.environments:[],auth:t.auth&&typeof t.auth=="object"?{schemes:t.auth.schemes&&typeof t.auth.schemes=="object"?t.auth.schemes:{},activeScheme:typeof t.auth.activeScheme=="string"?t.auth.activeScheme:"",token:typeof t.auth.token=="string"?t.auth.token:"",locked:!!t.auth.locked,source:t.auth.source==="manual"||t.auth.source==="auto-body"||t.auth.source==="auto-header"?t.auth.source:"manual"}:{schemes:{},activeScheme:"",token:"",locked:!1,source:"manual"}}}catch{return null}}function Js(e){try{localStorage.setItem(zr,JSON.stringify(e))}catch{}}function Wr(e){if(e.type==="http"){const t=(e.scheme||"").toLowerCase();return t==="bearer"?0:t==="basic"?3:4}return e.type==="oauth2"||e.type==="openIdConnect"?1:e.type==="apiKey"?2:5}function Zs(e){const t=Object.keys(e);if(t.length===0)return"";let n=t[0],a=Wr(e[n]);for(let r=1;r<t.length;r++){const o=t[r],i=Wr(e[o]);i<a&&(a=i,n=o)}return n}function Xs(e,t){if(e.activeScheme!==t.activeScheme||e.token!==t.token||e.locked!==t.locked||e.source!==t.source)return!1;const n=Object.entries(e.schemes),a=Object.entries(t.schemes);if(n.length!==a.length)return!1;for(const[r,o]of n)if(t.schemes[r]!==o)return!1;return!0}function Qs(e,t){const n=Object.keys(t);if(n.length===0)return{...e,schemes:{...e.schemes}};const a={};for(const i of n){const s=e.schemes[i];typeof s=="string"&&s.length>0&&(a[i]=s)}let r=e.activeScheme;(!r||!t[r])&&(r=n.find(i=>!!a[i])||""),!r&&e.token&&(r=Zs(t)),r&&e.token&&!a[r]&&(a[r]=e.token);let o=e.token;return r&&a[r]&&o!==a[r]&&(o=a[r]),!o&&r&&a[r]&&(o=a[r]),{...e,schemes:a,activeScheme:r,token:o}}function ec(e,t){let n;return((...a)=>{clearTimeout(n),n=setTimeout(()=>e(...a),t)})}let Pt=!1,bn=null,xn=null;function tc(e){const t=e.mount;if(t){const o=typeof t=="string"?document.querySelector(t):t;if(!o)throw new Error(`[PureDocs] Mount target not found: ${String(t)}`);return o}const n=e.mountId||"puredocs",a=document.getElementById(n);if(a)return a;const r=document.createElement("div");return r.id=n,document.body.append(r),r}function nc(e){if(Array.from(document.querySelectorAll('link[rel="stylesheet"]')).some(r=>r.getAttribute("href")===e))return;const a=document.createElement("link");a.rel="stylesheet",a.href=e,document.head.append(a)}function rc(e){document.documentElement.style.minHeight="100%",document.body.style.minHeight="100vh",document.body.style.margin="0",e.style.minHeight="100vh",e.style.display="block"}function ac(e){const t=(e||"/").replace(/\/+/g,"/"),n=t.indexOf("/~/");if(n>=0)return`${t.slice(0,n)||""}/`;if(t.endsWith("/~"))return`${t.slice(0,-2)||""}/`;if(t.endsWith("/"))return t;const a=t.split("/").filter(Boolean).pop()||"";if(a&&!a.includes("."))return`${t}/`;const r=t.lastIndexOf("/");return r<0?"/":t.slice(0,r+1)}function oc(e){if(!e||/^(?:[a-zA-Z][a-zA-Z\d+.-]*:)?\/\//.test(e)||e.startsWith("/"))return e;const n=new URL(window.location.href);return n.pathname=ac(window.location.pathname||"/"),n.search="",n.hash="",new URL(e,n.href).toString()}async function kn(e){let t=null;Pt&&(t=k.get().auth,Cn());const n=typeof e.mount=="string"?document.querySelector(e.mount):e.mount;if(!n)throw new Error(`[PureDocs] Mount target not found: ${String(e.mount)}`);k.reset();const a=[{name:"default",baseUrl:""}];k.set({loading:!0,theme:li(e.theme),environments:[...a],initialEnvironments:[...a],activeEnvironment:"default"});const r=Ks();r?k.set({activeEnvironment:r.activeEnvironment||"default",auth:r.auth}):t&&k.setAuth(t);const o=ec(()=>{const i=k.get();Js({activeEnvironment:i.activeEnvironment,environments:i.environments,auth:i.auth})},300);k.subscribe(()=>o()),Zr(""),xn=qi(),Ds(n,e),Pt=!0;try{let i;const s=e.specUrl;if(e.spec)i=e.spec;else if(s)i=await oi(oc(s));else throw new Error("Either spec or specUrl must be provided");const l=Go(i);if(l.servers.length>0){const p=l.servers.map((h,v)=>({name:h.description||(v===0?"default":`Server ${v+1}`),baseUrl:h.url}));k.set({environments:p,initialEnvironments:p.map(h=>({...h}))});const m=k.get();p.some(h=>h.name===m.activeEnvironment)||k.set({activeEnvironment:p[0]?.name||"default"})}const u=k.get().auth,d=Qs(u,l.securitySchemes);Xs(u,d)||k.setAuth(d),ii(l),k.set({spec:l,loading:!1,error:null})}catch(i){k.set({loading:!1,error:i.message||"Failed to load specification"})}return bn=sc(),bn}async function ic(e){if(typeof document>"u")throw new Error("[PureDocs] bootstrap() requires a browser environment");const t=tc(e);e.cssHref&&nc(e.cssHref),e.fullPage!==!1&&rc(t);const{mount:n,mountId:a,cssHref:r,fullPage:o,...i}=e;return kn({...i,mount:t})}function Cn(){Pt&&(xn?.(),xn=null,Xr(),Us(),k.reset(),Pt=!1,bn=null)}function sc(){return{getState:()=>k.get(),subscribe:e=>k.subscribe(e),setToken:e=>{const t=k.get().auth.activeScheme;t?k.setSchemeValue(t,e):k.setAuth({token:e,source:"manual"})},setEnvironment:e=>k.setActiveEnvironment(e),navigate:e=>M(e)}}const Vr=["spec-url","spec-json","theme","primary-color","title"],ge=class ge extends HTMLElement{constructor(){super(...arguments),this.api=null,this.reloadTimer=null}static get observedAttributes(){return[...Vr]}async connectedCallback(){if(ge.activeElement&&ge.activeElement!==this){this.renderSingletonError();return}ge.activeElement=this,await this.mountFromAttributes()}disconnectedCallback(){ge.activeElement===this&&(this.api=null,Cn(),ge.activeElement=null)}attributeChangedCallback(t,n,a){this.isConnected&&n!==a&&Vr.includes(t)&&(this.reloadTimer&&clearTimeout(this.reloadTimer),this.reloadTimer=setTimeout(()=>{this.reload()},80))}async reload(){ge.activeElement===this&&await this.mountFromAttributes()}getState(){return this.api?.getState()||null}subscribe(t){return this.api?.subscribe(t)||(()=>{})}navigate(t){this.api?.navigate(t)}setToken(t){this.api?.setToken(t)}setEnvironment(t){this.api?.setEnvironment(t)}async mountFromAttributes(){try{this.innerHTML="";const t=this.parseConfig();this.removeAttribute("title"),this.api=await kn({...t,mount:this})}catch(t){const n=t instanceof Error?t.message:String(t);this.innerHTML=`<div style="padding:12px;border:1px solid #ef4444;border-radius:8px;color:#ef4444;background:#fff1f2;font-family:system-ui,sans-serif">[PureDocs] ${n}</div>`}}parseConfig(){const t=this.getAttribute("spec-json");return{specUrl:this.getAttribute("spec-url")||void 0,spec:t?cc(t,"spec-json"):void 0,theme:lc(this.getAttribute("theme")),primaryColor:this.getAttribute("primary-color")||void 0,title:this.getAttribute("title")||void 0}}renderSingletonError(){this.innerHTML='<div style="padding:12px;border:1px solid #f59e0b;border-radius:8px;color:#92400e;background:#fffbeb;font-family:system-ui,sans-serif">Only one &lt;pure-docs&gt; instance can be mounted at a time.</div>'}};ge.activeElement=null;let Rt=ge;function cc(e,t){try{return JSON.parse(e)}catch{throw new Error(`Invalid JSON in ${t}`)}}function lc(e){if(e&&(e==="light"||e==="dark"||e==="auto"))return e}customElements.get("pure-docs")||customElements.define("pure-docs",Rt);const Yr={mount:kn,bootstrap:ic,unmount:Cn,version:"1.0.0"};ye.PureDocs=Yr,ye.PureDocsElement=Rt,ye.default=Yr,Object.defineProperties(ye,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
49
49
  //# sourceMappingURL=puredocs.umd.js.map
50
+ ;(function(g){var m=g.PureDocs;if(m&&(m.default||m.PureDocs)&&!m.bootstrap){var s=m.default||m.PureDocs;m.bootstrap=s.bootstrap;m.mount=s.mount;m.unmount=s.unmount;m.version=s.version;}})(typeof globalThis!=='undefined'?globalThis:typeof window!=='undefined'?window:this);
package/dist/server.cjs CHANGED
@@ -59,7 +59,7 @@ function pureDocsHtml(options, template) {
59
59
  const { css, umd } = getInlineAssets();
60
60
  const clientConfig = buildClientConfig(options);
61
61
  const pageTitle = options.title ? `${options.title} — pureDocs` : "pureDocs";
62
- const bootstrapScript = `PureDocs.bootstrap(${toSafeJson(clientConfig)});`;
62
+ const bootstrapScript = `(PureDocs.default||PureDocs.PureDocs||PureDocs).bootstrap(${toSafeJson(clientConfig)});`;
63
63
  const payload = {
64
64
  css,
65
65
  script: umd,
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","sources":["../src/server.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface PureDocsOptions {\n specUrl?: string;\n spec?: Record<string, unknown>;\n title?: string;\n theme?: 'light' | 'dark' | 'auto';\n primaryColor?: string;\n}\n\nexport interface PureDocsRouteOptions extends PureDocsOptions {\n route?: string;\n}\n\nexport interface PureDocsHtmlPayload {\n css: string;\n script: string;\n bootstrapScript: string;\n pageTitle: string;\n}\n\nexport type PureDocsHtmlTemplate = (payload: PureDocsHtmlPayload) => string;\n\ninterface ExpressLikeResponse {\n type?: (value: string) => unknown;\n setHeader?: (name: string, value: string) => unknown;\n send?: (body: string) => unknown;\n end?: (body?: string) => unknown;\n}\n\ninterface ExpressLikeApp {\n get: (path: string, handler: (_req: unknown, res: ExpressLikeResponse) => unknown) => unknown;\n}\n\ninterface FastifyLikeReply {\n type?: (value: string) => FastifyLikeReply;\n header?: (name: string, value: string) => FastifyLikeReply;\n send?: (body: string) => unknown;\n}\n\ninterface FastifyLikeApp {\n get: (path: string, handler: (_request: unknown, reply: FastifyLikeReply) => unknown) => unknown;\n}\n\ninterface PureDocsClientConfig {\n specUrl?: string;\n spec?: Record<string, unknown>;\n title?: string;\n theme?: 'light' | 'dark' | 'auto';\n primaryColor?: string;\n}\n\ninterface InlineAssets {\n css: string;\n umd: string;\n}\n\nconst currentDir = typeof __dirname === 'string'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n\nconst cssPath = path.resolve(currentDir, 'puredocs_v2.css');\nconst umdPath = path.resolve(currentDir, 'puredocs.umd.js');\n\nlet inlineAssetsCache: InlineAssets | null = null;\n\nfunction getInlineAssets(): InlineAssets {\n if (!inlineAssetsCache) {\n const css = readFileSync(cssPath, 'utf8');\n const umd = readFileSync(umdPath, 'utf8');\n\n inlineAssetsCache = {\n css: css.replace(/<\\/style>/gi, '<\\\\/style>'),\n umd: umd.replace(/<\\/script>/gi, '<\\\\/script>'),\n };\n }\n\n return inlineAssetsCache;\n}\n\nfunction toSafeJson(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction buildClientConfig(options: PureDocsOptions): PureDocsClientConfig {\n if (!options.specUrl && !options.spec) {\n throw new Error('[PureDocs] pureDocs.html() requires either \"specUrl\" or \"spec\".');\n }\n\n return {\n specUrl: options.specUrl,\n spec: options.spec,\n title: options.title,\n theme: options.theme ?? 'auto',\n primaryColor: options.primaryColor,\n };\n}\n\nfunction sendHtmlResponse(res: ExpressLikeResponse, html: string): unknown {\n if (typeof res.type === 'function') {\n res.type('text/html');\n } else if (typeof res.setHeader === 'function') {\n res.setHeader('content-type', 'text/html; charset=utf-8');\n }\n\n if (typeof res.send === 'function') {\n return res.send(html);\n }\n if (typeof res.end === 'function') {\n return res.end(html);\n }\n\n throw new Error('[PureDocs] Unsupported response object: expected res.send() or res.end().');\n}\n\nfunction resolveRoute(options: PureDocsRouteOptions): string {\n const route = options.route || '/docs';\n return route.startsWith('/') ? route : `/${route}`;\n}\n\nexport function pureDocsHtml(options: PureDocsOptions, template?: PureDocsHtmlTemplate): string {\n const { css, umd } = getInlineAssets();\n const clientConfig = buildClientConfig(options);\n const pageTitle = options.title ? `${options.title} — pureDocs` : 'pureDocs';\n const bootstrapScript = `PureDocs.bootstrap(${toSafeJson(clientConfig)});`;\n\n const payload: PureDocsHtmlPayload = {\n css,\n script: umd,\n bootstrapScript,\n pageTitle,\n };\n\n if (template) {\n return template(payload);\n }\n\n return [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head>',\n ' <meta charset=\"utf-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n ` <title>${escapeHtml(pageTitle)}</title>`,\n ` <style>${css}</style>`,\n '</head>',\n '<body>',\n ` <script>${umd}</script>`,\n ` <script>${bootstrapScript}</script>`,\n '</body>',\n '</html>',\n ].join('\\n');\n}\n\nexport function pureDocsExpress(app: ExpressLikeApp, options: PureDocsRouteOptions): string {\n const html = pureDocsHtml(options);\n const route = resolveRoute(options);\n\n app.get(route, (_req, res) => sendHtmlResponse(res, html));\n return html;\n}\n\nexport function pureDocsFastify(app: FastifyLikeApp, options: PureDocsRouteOptions): string {\n const html = pureDocsHtml(options);\n const route = resolveRoute(options);\n\n app.get(route, (_request, reply) => {\n if (typeof reply.type === 'function') {\n reply.type('text/html');\n } else if (typeof reply.header === 'function') {\n reply.header('content-type', 'text/html; charset=utf-8');\n }\n return reply.send ? reply.send(html) : html;\n });\n\n return html;\n}\n\nexport const pureDocs = {\n html: pureDocsHtml,\n express: pureDocsExpress,\n fastify: pureDocsFastify,\n};\n\nexport default pureDocs;\n"],"names":["fileURLToPath","readFileSync"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs","sources":["../src/server.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface PureDocsOptions {\n specUrl?: string;\n spec?: Record<string, unknown>;\n title?: string;\n theme?: 'light' | 'dark' | 'auto';\n primaryColor?: string;\n}\n\nexport interface PureDocsRouteOptions extends PureDocsOptions {\n route?: string;\n}\n\nexport interface PureDocsHtmlPayload {\n css: string;\n script: string;\n bootstrapScript: string;\n pageTitle: string;\n}\n\nexport type PureDocsHtmlTemplate = (payload: PureDocsHtmlPayload) => string;\n\ninterface ExpressLikeResponse {\n type?: (value: string) => unknown;\n setHeader?: (name: string, value: string) => unknown;\n send?: (body: string) => unknown;\n end?: (body?: string) => unknown;\n}\n\ninterface ExpressLikeApp {\n get: (path: string, handler: (_req: unknown, res: ExpressLikeResponse) => unknown) => unknown;\n}\n\ninterface FastifyLikeReply {\n type?: (value: string) => FastifyLikeReply;\n header?: (name: string, value: string) => FastifyLikeReply;\n send?: (body: string) => unknown;\n}\n\ninterface FastifyLikeApp {\n get: (path: string, handler: (_request: unknown, reply: FastifyLikeReply) => unknown) => unknown;\n}\n\ninterface PureDocsClientConfig {\n specUrl?: string;\n spec?: Record<string, unknown>;\n title?: string;\n theme?: 'light' | 'dark' | 'auto';\n primaryColor?: string;\n}\n\ninterface InlineAssets {\n css: string;\n umd: string;\n}\n\nconst currentDir = typeof __dirname === 'string'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n\nconst cssPath = path.resolve(currentDir, 'puredocs_v2.css');\nconst umdPath = path.resolve(currentDir, 'puredocs.umd.js');\n\nlet inlineAssetsCache: InlineAssets | null = null;\n\nfunction getInlineAssets(): InlineAssets {\n if (!inlineAssetsCache) {\n const css = readFileSync(cssPath, 'utf8');\n const umd = readFileSync(umdPath, 'utf8');\n\n inlineAssetsCache = {\n css: css.replace(/<\\/style>/gi, '<\\\\/style>'),\n umd: umd.replace(/<\\/script>/gi, '<\\\\/script>'),\n };\n }\n\n return inlineAssetsCache;\n}\n\nfunction toSafeJson(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction buildClientConfig(options: PureDocsOptions): PureDocsClientConfig {\n if (!options.specUrl && !options.spec) {\n throw new Error('[PureDocs] pureDocs.html() requires either \"specUrl\" or \"spec\".');\n }\n\n return {\n specUrl: options.specUrl,\n spec: options.spec,\n title: options.title,\n theme: options.theme ?? 'auto',\n primaryColor: options.primaryColor,\n };\n}\n\nfunction sendHtmlResponse(res: ExpressLikeResponse, html: string): unknown {\n if (typeof res.type === 'function') {\n res.type('text/html');\n } else if (typeof res.setHeader === 'function') {\n res.setHeader('content-type', 'text/html; charset=utf-8');\n }\n\n if (typeof res.send === 'function') {\n return res.send(html);\n }\n if (typeof res.end === 'function') {\n return res.end(html);\n }\n\n throw new Error('[PureDocs] Unsupported response object: expected res.send() or res.end().');\n}\n\nfunction resolveRoute(options: PureDocsRouteOptions): string {\n const route = options.route || '/docs';\n return route.startsWith('/') ? route : `/${route}`;\n}\n\nexport function pureDocsHtml(options: PureDocsOptions, template?: PureDocsHtmlTemplate): string {\n const { css, umd } = getInlineAssets();\n const clientConfig = buildClientConfig(options);\n const pageTitle = options.title ? `${options.title} — pureDocs` : 'pureDocs';\n const bootstrapScript = `(PureDocs.default||PureDocs.PureDocs||PureDocs).bootstrap(${toSafeJson(clientConfig)});`;\n\n const payload: PureDocsHtmlPayload = {\n css,\n script: umd,\n bootstrapScript,\n pageTitle,\n };\n\n if (template) {\n return template(payload);\n }\n\n return [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head>',\n ' <meta charset=\"utf-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n ` <title>${escapeHtml(pageTitle)}</title>`,\n ` <style>${css}</style>`,\n '</head>',\n '<body>',\n ` <script>${umd}</script>`,\n ` <script>${bootstrapScript}</script>`,\n '</body>',\n '</html>',\n ].join('\\n');\n}\n\nexport function pureDocsExpress(app: ExpressLikeApp, options: PureDocsRouteOptions): string {\n const html = pureDocsHtml(options);\n const route = resolveRoute(options);\n\n app.get(route, (_req, res) => sendHtmlResponse(res, html));\n return html;\n}\n\nexport function pureDocsFastify(app: FastifyLikeApp, options: PureDocsRouteOptions): string {\n const html = pureDocsHtml(options);\n const route = resolveRoute(options);\n\n app.get(route, (_request, reply) => {\n if (typeof reply.type === 'function') {\n reply.type('text/html');\n } else if (typeof reply.header === 'function') {\n reply.header('content-type', 'text/html; charset=utf-8');\n }\n return reply.send ? reply.send(html) : html;\n });\n\n return html;\n}\n\nexport const pureDocs = {\n html: pureDocsHtml,\n express: pureDocsExpress,\n fastify: pureDocsFastify,\n};\n\nexport default pureDocs;\n"],"names":["fileURLToPath","readFileSync"],"mappings":";;;;;;AA2DA,MAAM,aAAa,OAAO,cAAc,WACpC,YACA,KAAK,QAAQA,uBAAc,OAAA,aAAA,cAAA,QAAA,KAAA,EAAA,cAAA,UAAA,EAAA,OAAA,0BAAA,uBAAA,QAAA,YAAA,MAAA,YAAA,uBAAA,OAAA,IAAA,IAAA,cAAA,SAAA,OAAA,EAAA,IAAe,CAAC;AAE/C,MAAM,UAAU,KAAK,QAAQ,YAAY,iBAAiB;AAC1D,MAAM,UAAU,KAAK,QAAQ,YAAY,iBAAiB;AAE1D,IAAI,oBAAyC;AAE7C,SAAS,kBAAgC;AACvC,MAAI,CAAC,mBAAmB;AACtB,UAAM,MAAMC,QAAAA,aAAa,SAAS,MAAM;AACxC,UAAM,MAAMA,QAAAA,aAAa,SAAS,MAAM;AAExC,wBAAoB;AAAA,MAClB,KAAK,IAAI,QAAQ,eAAe,YAAY;AAAA,MAC5C,KAAK,IAAI,QAAQ,gBAAgB,aAAa;AAAA,IAAA;AAAA,EAElD;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,OAAwB;AAC1C,SAAO,KAAK,UAAU,KAAK,EACxB,QAAQ,MAAM,SAAS,EACvB,QAAQ,MAAM,SAAS,EACvB,QAAQ,MAAM,SAAS,EACvB,QAAQ,WAAW,SAAS,EAC5B,QAAQ,WAAW,SAAS;AACjC;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAEA,SAAS,kBAAkB,SAAgD;AACzE,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,MAAM;AACrC,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAEA,SAAO;AAAA,IACL,SAAS,QAAQ;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ,SAAS;AAAA,IACxB,cAAc,QAAQ;AAAA,EAAA;AAE1B;AAEA,SAAS,iBAAiB,KAA0B,MAAuB;AACzE,MAAI,OAAO,IAAI,SAAS,YAAY;AAClC,QAAI,KAAK,WAAW;AAAA,EACtB,WAAW,OAAO,IAAI,cAAc,YAAY;AAC9C,QAAI,UAAU,gBAAgB,0BAA0B;AAAA,EAC1D;AAEA,MAAI,OAAO,IAAI,SAAS,YAAY;AAClC,WAAO,IAAI,KAAK,IAAI;AAAA,EACtB;AACA,MAAI,OAAO,IAAI,QAAQ,YAAY;AACjC,WAAO,IAAI,IAAI,IAAI;AAAA,EACrB;AAEA,QAAM,IAAI,MAAM,2EAA2E;AAC7F;AAEA,SAAS,aAAa,SAAuC;AAC3D,QAAM,QAAQ,QAAQ,SAAS;AAC/B,SAAO,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,KAAK;AAClD;AAEO,SAAS,aAAa,SAA0B,UAAyC;AAC9F,QAAM,EAAE,KAAK,IAAA,IAAQ,gBAAA;AACrB,QAAM,eAAe,kBAAkB,OAAO;AAC9C,QAAM,YAAY,QAAQ,QAAQ,GAAG,QAAQ,KAAK,gBAAgB;AAClE,QAAM,kBAAkB,6DAA6D,WAAW,YAAY,CAAC;AAE7G,QAAM,UAA+B;AAAA,IACnC;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EAAA;AAGF,MAAI,UAAU;AACZ,WAAO,SAAS,OAAO;AAAA,EACzB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,WAAW,SAAS,CAAC;AAAA,IACjC,YAAY,GAAG;AAAA,IACf;AAAA,IACA;AAAA,IACA,aAAa,GAAG;AAAA,IAChB,aAAa,eAAe;AAAA,IAC5B;AAAA,IACA;AAAA,EAAA,EACA,KAAK,IAAI;AACb;AAEO,SAAS,gBAAgB,KAAqB,SAAuC;AAC1F,QAAM,OAAO,aAAa,OAAO;AACjC,QAAM,QAAQ,aAAa,OAAO;AAElC,MAAI,IAAI,OAAO,CAAC,MAAM,QAAQ,iBAAiB,KAAK,IAAI,CAAC;AACzD,SAAO;AACT;AAEO,SAAS,gBAAgB,KAAqB,SAAuC;AAC1F,QAAM,OAAO,aAAa,OAAO;AACjC,QAAM,QAAQ,aAAa,OAAO;AAElC,MAAI,IAAI,OAAO,CAAC,UAAU,UAAU;AAClC,QAAI,OAAO,MAAM,SAAS,YAAY;AACpC,YAAM,KAAK,WAAW;AAAA,IACxB,WAAW,OAAO,MAAM,WAAW,YAAY;AAC7C,YAAM,OAAO,gBAAgB,0BAA0B;AAAA,IACzD;AACA,WAAO,MAAM,OAAO,MAAM,KAAK,IAAI,IAAI;AAAA,EACzC,CAAC;AAED,SAAO;AACT;AAEO,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AACX;;;;;;"}
package/dist/server.js CHANGED
@@ -56,7 +56,7 @@ function pureDocsHtml(options, template) {
56
56
  const { css, umd } = getInlineAssets();
57
57
  const clientConfig = buildClientConfig(options);
58
58
  const pageTitle = options.title ? `${options.title} — pureDocs` : "pureDocs";
59
- const bootstrapScript = `PureDocs.bootstrap(${toSafeJson(clientConfig)});`;
59
+ const bootstrapScript = `(PureDocs.default||PureDocs.PureDocs||PureDocs).bootstrap(${toSafeJson(clientConfig)});`;
60
60
  const payload = {
61
61
  css,
62
62
  script: umd,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../src/server.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface PureDocsOptions {\n specUrl?: string;\n spec?: Record<string, unknown>;\n title?: string;\n theme?: 'light' | 'dark' | 'auto';\n primaryColor?: string;\n}\n\nexport interface PureDocsRouteOptions extends PureDocsOptions {\n route?: string;\n}\n\nexport interface PureDocsHtmlPayload {\n css: string;\n script: string;\n bootstrapScript: string;\n pageTitle: string;\n}\n\nexport type PureDocsHtmlTemplate = (payload: PureDocsHtmlPayload) => string;\n\ninterface ExpressLikeResponse {\n type?: (value: string) => unknown;\n setHeader?: (name: string, value: string) => unknown;\n send?: (body: string) => unknown;\n end?: (body?: string) => unknown;\n}\n\ninterface ExpressLikeApp {\n get: (path: string, handler: (_req: unknown, res: ExpressLikeResponse) => unknown) => unknown;\n}\n\ninterface FastifyLikeReply {\n type?: (value: string) => FastifyLikeReply;\n header?: (name: string, value: string) => FastifyLikeReply;\n send?: (body: string) => unknown;\n}\n\ninterface FastifyLikeApp {\n get: (path: string, handler: (_request: unknown, reply: FastifyLikeReply) => unknown) => unknown;\n}\n\ninterface PureDocsClientConfig {\n specUrl?: string;\n spec?: Record<string, unknown>;\n title?: string;\n theme?: 'light' | 'dark' | 'auto';\n primaryColor?: string;\n}\n\ninterface InlineAssets {\n css: string;\n umd: string;\n}\n\nconst currentDir = typeof __dirname === 'string'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n\nconst cssPath = path.resolve(currentDir, 'puredocs_v2.css');\nconst umdPath = path.resolve(currentDir, 'puredocs.umd.js');\n\nlet inlineAssetsCache: InlineAssets | null = null;\n\nfunction getInlineAssets(): InlineAssets {\n if (!inlineAssetsCache) {\n const css = readFileSync(cssPath, 'utf8');\n const umd = readFileSync(umdPath, 'utf8');\n\n inlineAssetsCache = {\n css: css.replace(/<\\/style>/gi, '<\\\\/style>'),\n umd: umd.replace(/<\\/script>/gi, '<\\\\/script>'),\n };\n }\n\n return inlineAssetsCache;\n}\n\nfunction toSafeJson(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction buildClientConfig(options: PureDocsOptions): PureDocsClientConfig {\n if (!options.specUrl && !options.spec) {\n throw new Error('[PureDocs] pureDocs.html() requires either \"specUrl\" or \"spec\".');\n }\n\n return {\n specUrl: options.specUrl,\n spec: options.spec,\n title: options.title,\n theme: options.theme ?? 'auto',\n primaryColor: options.primaryColor,\n };\n}\n\nfunction sendHtmlResponse(res: ExpressLikeResponse, html: string): unknown {\n if (typeof res.type === 'function') {\n res.type('text/html');\n } else if (typeof res.setHeader === 'function') {\n res.setHeader('content-type', 'text/html; charset=utf-8');\n }\n\n if (typeof res.send === 'function') {\n return res.send(html);\n }\n if (typeof res.end === 'function') {\n return res.end(html);\n }\n\n throw new Error('[PureDocs] Unsupported response object: expected res.send() or res.end().');\n}\n\nfunction resolveRoute(options: PureDocsRouteOptions): string {\n const route = options.route || '/docs';\n return route.startsWith('/') ? route : `/${route}`;\n}\n\nexport function pureDocsHtml(options: PureDocsOptions, template?: PureDocsHtmlTemplate): string {\n const { css, umd } = getInlineAssets();\n const clientConfig = buildClientConfig(options);\n const pageTitle = options.title ? `${options.title} — pureDocs` : 'pureDocs';\n const bootstrapScript = `PureDocs.bootstrap(${toSafeJson(clientConfig)});`;\n\n const payload: PureDocsHtmlPayload = {\n css,\n script: umd,\n bootstrapScript,\n pageTitle,\n };\n\n if (template) {\n return template(payload);\n }\n\n return [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head>',\n ' <meta charset=\"utf-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n ` <title>${escapeHtml(pageTitle)}</title>`,\n ` <style>${css}</style>`,\n '</head>',\n '<body>',\n ` <script>${umd}</script>`,\n ` <script>${bootstrapScript}</script>`,\n '</body>',\n '</html>',\n ].join('\\n');\n}\n\nexport function pureDocsExpress(app: ExpressLikeApp, options: PureDocsRouteOptions): string {\n const html = pureDocsHtml(options);\n const route = resolveRoute(options);\n\n app.get(route, (_req, res) => sendHtmlResponse(res, html));\n return html;\n}\n\nexport function pureDocsFastify(app: FastifyLikeApp, options: PureDocsRouteOptions): string {\n const html = pureDocsHtml(options);\n const route = resolveRoute(options);\n\n app.get(route, (_request, reply) => {\n if (typeof reply.type === 'function') {\n reply.type('text/html');\n } else if (typeof reply.header === 'function') {\n reply.header('content-type', 'text/html; charset=utf-8');\n }\n return reply.send ? reply.send(html) : html;\n });\n\n return html;\n}\n\nexport const pureDocs = {\n html: pureDocsHtml,\n express: pureDocsExpress,\n fastify: pureDocsFastify,\n};\n\nexport default pureDocs;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sources":["../src/server.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface PureDocsOptions {\n specUrl?: string;\n spec?: Record<string, unknown>;\n title?: string;\n theme?: 'light' | 'dark' | 'auto';\n primaryColor?: string;\n}\n\nexport interface PureDocsRouteOptions extends PureDocsOptions {\n route?: string;\n}\n\nexport interface PureDocsHtmlPayload {\n css: string;\n script: string;\n bootstrapScript: string;\n pageTitle: string;\n}\n\nexport type PureDocsHtmlTemplate = (payload: PureDocsHtmlPayload) => string;\n\ninterface ExpressLikeResponse {\n type?: (value: string) => unknown;\n setHeader?: (name: string, value: string) => unknown;\n send?: (body: string) => unknown;\n end?: (body?: string) => unknown;\n}\n\ninterface ExpressLikeApp {\n get: (path: string, handler: (_req: unknown, res: ExpressLikeResponse) => unknown) => unknown;\n}\n\ninterface FastifyLikeReply {\n type?: (value: string) => FastifyLikeReply;\n header?: (name: string, value: string) => FastifyLikeReply;\n send?: (body: string) => unknown;\n}\n\ninterface FastifyLikeApp {\n get: (path: string, handler: (_request: unknown, reply: FastifyLikeReply) => unknown) => unknown;\n}\n\ninterface PureDocsClientConfig {\n specUrl?: string;\n spec?: Record<string, unknown>;\n title?: string;\n theme?: 'light' | 'dark' | 'auto';\n primaryColor?: string;\n}\n\ninterface InlineAssets {\n css: string;\n umd: string;\n}\n\nconst currentDir = typeof __dirname === 'string'\n ? __dirname\n : path.dirname(fileURLToPath(import.meta.url));\n\nconst cssPath = path.resolve(currentDir, 'puredocs_v2.css');\nconst umdPath = path.resolve(currentDir, 'puredocs.umd.js');\n\nlet inlineAssetsCache: InlineAssets | null = null;\n\nfunction getInlineAssets(): InlineAssets {\n if (!inlineAssetsCache) {\n const css = readFileSync(cssPath, 'utf8');\n const umd = readFileSync(umdPath, 'utf8');\n\n inlineAssetsCache = {\n css: css.replace(/<\\/style>/gi, '<\\\\/style>'),\n umd: umd.replace(/<\\/script>/gi, '<\\\\/script>'),\n };\n }\n\n return inlineAssetsCache;\n}\n\nfunction toSafeJson(value: unknown): string {\n return JSON.stringify(value)\n .replace(/</g, '\\\\u003c')\n .replace(/>/g, '\\\\u003e')\n .replace(/&/g, '\\\\u0026')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nfunction buildClientConfig(options: PureDocsOptions): PureDocsClientConfig {\n if (!options.specUrl && !options.spec) {\n throw new Error('[PureDocs] pureDocs.html() requires either \"specUrl\" or \"spec\".');\n }\n\n return {\n specUrl: options.specUrl,\n spec: options.spec,\n title: options.title,\n theme: options.theme ?? 'auto',\n primaryColor: options.primaryColor,\n };\n}\n\nfunction sendHtmlResponse(res: ExpressLikeResponse, html: string): unknown {\n if (typeof res.type === 'function') {\n res.type('text/html');\n } else if (typeof res.setHeader === 'function') {\n res.setHeader('content-type', 'text/html; charset=utf-8');\n }\n\n if (typeof res.send === 'function') {\n return res.send(html);\n }\n if (typeof res.end === 'function') {\n return res.end(html);\n }\n\n throw new Error('[PureDocs] Unsupported response object: expected res.send() or res.end().');\n}\n\nfunction resolveRoute(options: PureDocsRouteOptions): string {\n const route = options.route || '/docs';\n return route.startsWith('/') ? route : `/${route}`;\n}\n\nexport function pureDocsHtml(options: PureDocsOptions, template?: PureDocsHtmlTemplate): string {\n const { css, umd } = getInlineAssets();\n const clientConfig = buildClientConfig(options);\n const pageTitle = options.title ? `${options.title} — pureDocs` : 'pureDocs';\n const bootstrapScript = `(PureDocs.default||PureDocs.PureDocs||PureDocs).bootstrap(${toSafeJson(clientConfig)});`;\n\n const payload: PureDocsHtmlPayload = {\n css,\n script: umd,\n bootstrapScript,\n pageTitle,\n };\n\n if (template) {\n return template(payload);\n }\n\n return [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head>',\n ' <meta charset=\"utf-8\" />',\n ' <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />',\n ` <title>${escapeHtml(pageTitle)}</title>`,\n ` <style>${css}</style>`,\n '</head>',\n '<body>',\n ` <script>${umd}</script>`,\n ` <script>${bootstrapScript}</script>`,\n '</body>',\n '</html>',\n ].join('\\n');\n}\n\nexport function pureDocsExpress(app: ExpressLikeApp, options: PureDocsRouteOptions): string {\n const html = pureDocsHtml(options);\n const route = resolveRoute(options);\n\n app.get(route, (_req, res) => sendHtmlResponse(res, html));\n return html;\n}\n\nexport function pureDocsFastify(app: FastifyLikeApp, options: PureDocsRouteOptions): string {\n const html = pureDocsHtml(options);\n const route = resolveRoute(options);\n\n app.get(route, (_request, reply) => {\n if (typeof reply.type === 'function') {\n reply.type('text/html');\n } else if (typeof reply.header === 'function') {\n reply.header('content-type', 'text/html; charset=utf-8');\n }\n return reply.send ? reply.send(html) : html;\n });\n\n return html;\n}\n\nexport const pureDocs = {\n html: pureDocsHtml,\n express: pureDocsExpress,\n fastify: pureDocsFastify,\n};\n\nexport default pureDocs;\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "puredocs_v2",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "Beautiful API documentation portal from any OpenAPI 3.1 spec. One-liner for Express & Fastify. Standard Web Component for everything else.",
5
5
  "author": "esurkov1",
6
6
  "license": "SEE LICENSE IN LICENSE",