@sansenjian/qq-music-api 2.2.9 → 2.3.1
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/CHANGELOG.md +28 -1
- package/README.md +10 -11
- package/dist/api/index.js +9 -0
- package/dist/app.js +8 -43
- package/dist/index.js +13 -1
- package/dist/koaApp.js +49 -0
- package/dist/module/apis/downloadQQMusic.js +2 -1
- package/dist/module/apis/music/getLyric.js +220 -16
- package/dist/module/apis/music/getMusicPlay.js +3 -2
- package/dist/package.json +19 -15
- package/dist/routers/context/getLyric.js +12 -2
- package/dist/routers/context/getNewDisks.js +4 -0
- package/dist/routers/context/getRecommend.js +4 -0
- package/dist/routers/context/getTicketInfo.js +4 -0
- package/dist/util/cookieResolver.js +10 -4
- package/docs-dist/404.html +6 -6
- package/docs-dist/CHANGELOG-ARCHITECTURE.html +14 -14
- package/docs-dist/COOKIE_CONFIG_GUIDE.html +13 -13
- package/docs-dist/DEGRADE_EXAMPLES.html +109 -0
- package/docs-dist/FALLBACK_MODE_GUIDE.html +21 -21
- package/docs-dist/QUICK_START.html +62 -0
- package/docs-dist/README.html +17 -17
- package/docs-dist/TEST_USER_PLAYLISTS.html +14 -14
- package/docs-dist/USER_AVATAR_GUIDE.html +16 -16
- package/docs-dist/api/comments.html +12 -12
- package/docs-dist/api/index.html +10 -10
- package/docs-dist/api/music.html +15 -13
- package/docs-dist/api/other.html +13 -13
- package/docs-dist/api/playground.html +27 -0
- package/docs-dist/api/playlist.html +15 -15
- package/docs-dist/api/rank.html +12 -12
- package/docs-dist/api/search.html +13 -13
- package/docs-dist/api/singer.html +12 -12
- package/docs-dist/api/user.html +16 -16
- package/docs-dist/assets/{CHANGELOG-ARCHITECTURE.md.r40JGJZK.js → CHANGELOG-ARCHITECTURE.md.CYHmaBdY.js} +5 -5
- package/docs-dist/assets/CHANGELOG-ARCHITECTURE.md.CYHmaBdY.lean.js +1 -0
- package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.Nvywo7CW.js +13 -0
- package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.Nvywo7CW.lean.js +1 -0
- package/docs-dist/assets/DEGRADE_EXAMPLES.md.Cz2J-qwE.js +83 -0
- package/docs-dist/assets/DEGRADE_EXAMPLES.md.Cz2J-qwE.lean.js +1 -0
- package/docs-dist/assets/{FALLBACK_MODE_GUIDE.md.BBdcIdh_.js → FALLBACK_MODE_GUIDE.md.wKA9yqoI.js} +12 -12
- package/docs-dist/assets/FALLBACK_MODE_GUIDE.md.wKA9yqoI.lean.js +1 -0
- package/docs-dist/assets/QUICK_START.md.D5KfDgbs.js +36 -0
- package/docs-dist/assets/QUICK_START.md.D5KfDgbs.lean.js +1 -0
- package/docs-dist/assets/README.md.CHbArqA7.js +421 -0
- package/docs-dist/assets/README.md.CHbArqA7.lean.js +1 -0
- package/docs-dist/assets/TEST_USER_PLAYLISTS.md.BfBxYbaM.js +16 -0
- package/docs-dist/assets/TEST_USER_PLAYLISTS.md.BfBxYbaM.lean.js +1 -0
- package/docs-dist/assets/{USER_AVATAR_GUIDE.md.CVHPs2Dn.js → USER_AVATAR_GUIDE.md.D5Rti1Gg.js} +7 -7
- package/docs-dist/assets/USER_AVATAR_GUIDE.md.D5Rti1Gg.lean.js +1 -0
- package/docs-dist/assets/{api_comments.md.79Q_C8Qp.js → api_comments.md.5nDhrWa8.js} +3 -3
- package/docs-dist/assets/api_comments.md.5nDhrWa8.lean.js +1 -0
- package/docs-dist/assets/api_index.md.DdG1WHkZ.js +1 -0
- package/docs-dist/assets/api_index.md.DdG1WHkZ.lean.js +1 -0
- package/docs-dist/assets/{api_music.md.B1AzLePX.js → api_music.md.D66hq-_4.js} +6 -4
- package/docs-dist/assets/api_music.md.D66hq-_4.lean.js +1 -0
- package/docs-dist/assets/api_other.md.9KhspVEM.js +7 -0
- package/docs-dist/assets/api_other.md.9KhspVEM.lean.js +1 -0
- package/docs-dist/assets/api_playground.md.BZBvYMm2.js +11 -0
- package/docs-dist/assets/api_playground.md.BZBvYMm2.lean.js +11 -0
- package/docs-dist/assets/{api_playlist.md.8ACJ3QqD.js → api_playlist.md.BQK32ZyE.js} +6 -6
- package/docs-dist/assets/api_playlist.md.BQK32ZyE.lean.js +1 -0
- package/docs-dist/assets/{api_rank.md.B8IP2ZRy.js → api_rank.md.z7YBwVgw.js} +3 -3
- package/docs-dist/assets/api_rank.md.z7YBwVgw.lean.js +1 -0
- package/docs-dist/assets/{api_search.md.DO9J6nvp.js → api_search.md.GfzIBRfc.js} +4 -4
- package/docs-dist/assets/api_search.md.GfzIBRfc.lean.js +1 -0
- package/docs-dist/assets/api_singer.md.BDR-_qDH.js +21 -0
- package/docs-dist/assets/api_singer.md.BDR-_qDH.lean.js +1 -0
- package/docs-dist/assets/{api_user.md.Cb7Ky3Sn.js → api_user.md.Dx8BWGrb.js} +7 -7
- package/docs-dist/assets/api_user.md.Dx8BWGrb.lean.js +1 -0
- package/docs-dist/assets/app.CxuIZ1W7.js +1 -0
- package/docs-dist/assets/chunks/@localSearchIndexroot.ygoKgu27.js +1 -0
- package/docs-dist/assets/chunks/VPLocalSearchBox.BqgkAhNM.js +3 -0
- package/docs-dist/assets/chunks/framework.BUY3a635.js +4 -0
- package/docs-dist/assets/chunks/theme.C-Z3DN0r.js +2 -0
- package/docs-dist/assets/{guide_architecture.md.CzgqynmB.js → guide_architecture.md.SHnKkzwb.js} +20 -20
- package/docs-dist/assets/guide_architecture.md.SHnKkzwb.lean.js +1 -0
- package/docs-dist/assets/guide_authentication.md.CZCKocgR.js +4 -0
- package/docs-dist/assets/guide_authentication.md.CZCKocgR.lean.js +1 -0
- package/docs-dist/assets/guide_index.md.CkJ-jjL0.js +1 -0
- package/docs-dist/assets/guide_index.md.CkJ-jjL0.lean.js +1 -0
- package/docs-dist/assets/guide_installation.md.D2TBzILh.js +7 -0
- package/docs-dist/assets/guide_installation.md.D2TBzILh.lean.js +1 -0
- package/docs-dist/assets/guide_quickstart.md.J7Sib8wg.js +13 -0
- package/docs-dist/assets/guide_quickstart.md.J7Sib8wg.lean.js +1 -0
- package/docs-dist/assets/index.md.ClwYf6Qc.js +1 -0
- package/docs-dist/assets/index.md.ClwYf6Qc.lean.js +1 -0
- package/docs-dist/assets/inter-italic-cyrillic-ext._dlW9xFb.woff2 +0 -0
- package/docs-dist/assets/inter-italic-cyrillic.D7dRslh9.woff2 +0 -0
- package/docs-dist/assets/inter-italic-greek-ext.Ct-Tf2bq.woff2 +0 -0
- package/docs-dist/assets/inter-italic-greek.DNcpQ8QC.woff2 +0 -0
- package/docs-dist/assets/inter-italic-latin-ext.DytegdRQ.woff2 +0 -0
- package/docs-dist/assets/inter-italic-latin.COaG5lWR.woff2 +0 -0
- package/docs-dist/assets/inter-italic-vietnamese.BI5UxJD-.woff2 +0 -0
- package/docs-dist/assets/inter-roman-cyrillic-ext.BeNbU08G.woff2 +0 -0
- package/docs-dist/assets/inter-roman-cyrillic.CD0kT8R4.woff2 +0 -0
- package/docs-dist/assets/inter-roman-greek-ext.CFAEQ5Ow.woff2 +0 -0
- package/docs-dist/assets/inter-roman-greek.Dsf7YjP7.woff2 +0 -0
- package/docs-dist/assets/inter-roman-latin-ext.Dl_ayf4-.woff2 +0 -0
- package/docs-dist/assets/inter-roman-latin.Cy4MYw_J.woff2 +0 -0
- package/docs-dist/assets/inter-roman-vietnamese.CpqCnS2H.woff2 +0 -0
- package/docs-dist/assets/reference_response-format.md.BrGoGoPV.js +12 -0
- package/docs-dist/assets/reference_response-format.md.BrGoGoPV.lean.js +1 -0
- package/docs-dist/assets/style.D_YoXH3a.css +1 -0
- package/docs-dist/guide/architecture.html +29 -29
- package/docs-dist/guide/authentication.html +12 -12
- package/docs-dist/guide/index.html +10 -10
- package/docs-dist/guide/installation.html +13 -13
- package/docs-dist/guide/quickstart.html +15 -15
- package/docs-dist/hashmap.json +1 -1
- package/docs-dist/index.html +10 -10
- package/docs-dist/reference/response-format.html +13 -13
- package/docs-dist/version.json +3 -3
- package/package.json +19 -15
- package/public/index.html +966 -0
- package/public/playground-utils.js +150 -0
- package/dist/jest.config.js +0 -52
- package/dist/scripts/run-tests-with-flags.js +0 -139
- package/dist/types/api.js +0 -55
- package/docs-dist/assets/CHANGELOG-ARCHITECTURE.md.r40JGJZK.lean.js +0 -1
- package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.BVXl7WHu.js +0 -13
- package/docs-dist/assets/COOKIE_CONFIG_GUIDE.md.BVXl7WHu.lean.js +0 -1
- package/docs-dist/assets/FALLBACK_MODE_GUIDE.md.BBdcIdh_.lean.js +0 -1
- package/docs-dist/assets/README.md.D6Tw0nRd.js +0 -421
- package/docs-dist/assets/README.md.D6Tw0nRd.lean.js +0 -1
- package/docs-dist/assets/TEST_USER_PLAYLISTS.md.DSt20Igj.js +0 -16
- package/docs-dist/assets/TEST_USER_PLAYLISTS.md.DSt20Igj.lean.js +0 -1
- package/docs-dist/assets/USER_AVATAR_GUIDE.md.CVHPs2Dn.lean.js +0 -1
- package/docs-dist/assets/api_comments.md.79Q_C8Qp.lean.js +0 -1
- package/docs-dist/assets/api_index.md.CU3By8tw.js +0 -1
- package/docs-dist/assets/api_index.md.CU3By8tw.lean.js +0 -1
- package/docs-dist/assets/api_music.md.B1AzLePX.lean.js +0 -1
- package/docs-dist/assets/api_other.md.DCg4bzA7.js +0 -7
- package/docs-dist/assets/api_other.md.DCg4bzA7.lean.js +0 -1
- package/docs-dist/assets/api_playlist.md.8ACJ3QqD.lean.js +0 -1
- package/docs-dist/assets/api_rank.md.B8IP2ZRy.lean.js +0 -1
- package/docs-dist/assets/api_search.md.DO9J6nvp.lean.js +0 -1
- package/docs-dist/assets/api_singer.md.CcL32xuN.js +0 -21
- package/docs-dist/assets/api_singer.md.CcL32xuN.lean.js +0 -1
- package/docs-dist/assets/api_user.md.Cb7Ky3Sn.lean.js +0 -1
- package/docs-dist/assets/app.CSainqD9.js +0 -1
- package/docs-dist/assets/chunks/@localSearchIndexroot.BKleDIv-.js +0 -1
- package/docs-dist/assets/chunks/VPLocalSearchBox.BUBaq7tw.js +0 -9
- package/docs-dist/assets/chunks/framework.aJbMEiY9.js +0 -19
- package/docs-dist/assets/chunks/theme.CzMhU0Ps.js +0 -2
- package/docs-dist/assets/guide_architecture.md.CzgqynmB.lean.js +0 -1
- package/docs-dist/assets/guide_authentication.md.a8yTA8Xe.js +0 -4
- package/docs-dist/assets/guide_authentication.md.a8yTA8Xe.lean.js +0 -1
- package/docs-dist/assets/guide_index.md.BgUUL6fI.js +0 -1
- package/docs-dist/assets/guide_index.md.BgUUL6fI.lean.js +0 -1
- package/docs-dist/assets/guide_installation.md.BCZ4jBl_.js +0 -7
- package/docs-dist/assets/guide_installation.md.BCZ4jBl_.lean.js +0 -1
- package/docs-dist/assets/guide_quickstart.md.9-4dA6wS.js +0 -13
- package/docs-dist/assets/guide_quickstart.md.9-4dA6wS.lean.js +0 -1
- package/docs-dist/assets/index.md.z0hAJioN.js +0 -1
- package/docs-dist/assets/index.md.z0hAJioN.lean.js +0 -1
- package/docs-dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/docs-dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/docs-dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/docs-dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/docs-dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/docs-dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/docs-dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/docs-dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/docs-dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/docs-dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/docs-dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/docs-dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/docs-dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/docs-dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/docs-dist/assets/reference_response-format.md.VvQTLDZr.js +0 -12
- package/docs-dist/assets/reference_response-format.md.VvQTLDZr.lean.js +0 -1
- package/docs-dist/assets/style.DM4qKDd4.css +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.BqgkAhNM.js","assets/chunks/framework.BUY3a635.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as m,j as u,Z as c,I as P,S as o,n as U,a5 as L,h as k,aA as v,b as ve,i as h,c as b,ae as Ke,z as Re,a8 as Ue,az as fe,d as p,g as f,aa as i,y as D,ah as $e,O as R,Q as je,P as he,t as We,ax as te,X as V,av as H,ay as Ve,v as Y,ak as ne,a1 as ye,a2 as ae,M as Se,F as S,Y as w,$ as j,o as _,a0 as C,E as Ne,ap as ze,ai as qe,G as O,x as se,J as Te,as as Je,N as ie,H as Ae,ar as Me,W as Ye,A as Pe,q as Xe,_ as Qe,am as we,V as Ie,a6 as Ze,aC as et,L as tt,aD as nt,ao as at}from"./framework.BUY3a635.js";const st=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(e){return(t,n)=>(o(),u("span",{class:P(["VPBadge",e.type])},[c(t.$slots,"default",{},()=>[U(L(e.text),1)])],2))}}),ot={key:0,class:"VPBackdrop"},rt=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(e){return(t,n)=>(o(),k(ve,{name:"fade"},{default:v(()=>[e.show?(o(),u("div",ot)):h("",!0)]),_:1}))}}),it=b(rt,[["__scopeId","data-v-c79a1216"]]),$=Ke;function lt(e,t){let n,a=!1;return()=>{n&&clearTimeout(n),a?n=setTimeout(e,t):(e(),(a=!0)&&setTimeout(()=>a=!1,t))}}function le(e){return e.startsWith("/")?e:`/${e}`}function me(e){const{pathname:t,search:n,hash:a,protocol:s}=new URL(e,"http://a.com");if(Re(e)||e.startsWith("#")||!s.startsWith("http")||!Ue(t))return e;const{site:r}=$(),d=t.endsWith("/")||t.endsWith(".html")?e:e.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${n}${a}`);return fe(d)}function X({correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:a,theme:s,hash:r}=$(),d=p(()=>({label:t.value.locales[n.value]?.label,link:t.value.locales[n.value]?.link||(n.value==="root"?"/":`/${n.value}/`)}));return{localeLinks:p(()=>Object.entries(t.value.locales).flatMap(([g,y])=>d.value.label===y.label?[]:{text:y.label,link:ct(y.link||(g==="root"?"/":`/${g}/`),s.value.i18nRouting!==!1&&e,a.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)+r.value,lang:y.lang,dir:y.dir})),currentLang:d}}function ct(e,t,n,a){return t?e.replace(/\/$/,"")+le(n.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,a?".html":"")):e}const ut={class:"NotFound"},dt={class:"code"},vt={class:"title"},ft={class:"quote"},ht={class:"action"},mt=["href","aria-label"],pt=m({__name:"NotFound",setup(e){const{theme:t}=$(),{currentLang:n}=X();return(a,s)=>(o(),u("div",ut,[f("p",dt,L(i(t).notFound?.code??"404"),1),f("h1",vt,L(i(t).notFound?.title??"PAGE NOT FOUND"),1),s[0]||(s[0]=f("div",{class:"divider"},null,-1)),f("blockquote",ft,L(i(t).notFound?.quote??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),f("div",ht,[f("a",{class:"link",href:i(fe)(i(t).notFound?.link??i(n).link),"aria-label":i(t).notFound?.linkLabel??"go to home"},L(i(t).notFound?.linkText??"Take me home"),9,mt)])]))}}),kt=b(pt,[["__scopeId","data-v-829df670"]]);function xe(e,t){if(Array.isArray(e))return Q(e);if(e==null)return[];t=le(t);const n=Object.keys(e).sort((s,r)=>r.split("/").length-s.split("/").length).find(s=>t.startsWith(le(s))),a=n?e[n]:[];return Array.isArray(a)?Q(a):Q(a.items,a.base)}function gt(e){const t=[];let n=0;for(const a in e){const s=e[a];if(s.items){n=t.push(s);continue}t[n]||t.push({items:[]}),t[n].items.push(s)}return t}function _t(e){const t=[];function n(a){for(const s of a)s.text&&s.link&&t.push({text:s.text,link:s.link,docFooterText:s.docFooterText}),s.items&&n(s.items)}return n(e),t}function ce(e,t){return Array.isArray(t)?t.some(n=>ce(e,n)):D(e,t.link)?!0:t.items?ce(e,t.items):!1}function Q(e,t){return[...e].map(n=>{const a={...n},s=a.base||t;return s&&a.link&&(a.link=s+a.link.replace(/^\//,s.endsWith("/")?"":"/")),a.items&&(a.items=Q(a.items,s)),a})}function bt(){const{hasSidebar:e}=G(),t=$e("(min-width: 960px)"),n=$e("(min-width: 1280px)");return{isAsideEnabled:p(()=>!n.value&&!t.value?!1:e.value?n.value:t.value)}}const $t=/\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/,ue=[];function He(e){return typeof e.outline=="object"&&!Array.isArray(e.outline)&&e.outline.label||e.outlineTitle||"On this page"}function yt(e){const t=[...document.querySelectorAll(".VPDoc h1, .VPDoc h2, .VPDoc h3, .VPDoc h4, .VPDoc h5, .VPDoc h6")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const a=Number(n.tagName[1]);return{element:n,title:Pt(n),link:"#"+n.id,level:a}});return Lt(t,e)}function Pt(e){let t="";for(const n of e.childNodes)if(n.nodeType===1){if($t.test(n.className))continue;t+=n.textContent}else n.nodeType===3&&(t+=n.textContent);return t.trim()}function Lt(e,t){if(t===!1)return[];const n=(typeof t=="object"&&!Array.isArray(t)?t.level:t)||2,[a,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;return Nt(e,a,s)}function Vt(e,t){const{isAsideEnabled:n}=bt(),a=lt(r,100);let s=null;R(()=>{requestAnimationFrame(r),window.addEventListener("scroll",a)}),je(()=>{d(location.hash)}),he(()=>{window.removeEventListener("scroll",a)});function r(){if(!n.value)return;const l=window.scrollY,g=window.innerHeight,y=document.body.offsetHeight,N=Math.abs(l+g-y)<1,A=ue.map(({element:I,link:x})=>({link:x,top:St(I)})).filter(({top:I})=>!Number.isNaN(I)).sort((I,x)=>I.top-x.top);if(!A.length){d(null);return}if(l<1){d(null);return}if(N){d(A[A.length-1].link);return}let E=null;for(const{link:I,top:x}of A){if(x>l+We()+4)break;E=I}d(E)}function d(l){s&&s.classList.remove("active"),l==null?s=null:s=e.value.querySelector(`a[href="${decodeURIComponent(l)}"]`);const g=s;g?(g.classList.add("active"),t.value.style.top=g.offsetTop+39+"px",t.value.style.opacity="1"):(t.value.style.top="33px",t.value.style.opacity="0")}}function St(e){let t=0;for(;e!==document.body;){if(e===null)return NaN;t+=e.offsetTop,e=e.offsetParent}return t}function Nt(e,t,n){ue.length=0;const a=[],s=[];return e.forEach(r=>{const d={...r,children:[]};let l=s[s.length-1];for(;l&&l.level>=d.level;)s.pop(),l=s[s.length-1];if(d.element.classList.contains("ignore-header")||l&&"shouldIgnore"in l){s.push({level:d.level,shouldIgnore:!0});return}d.level>n||d.level<t||(ue.push({element:d.element,link:d.link}),l?l.children.push(d):a.push(d),s.push(d))}),a}const q=V(!1);function Tt(e){let t;te(()=>{t=q.value?document.activeElement:void 0}),R(()=>{window.addEventListener("keyup",n)}),he(()=>{window.removeEventListener("keyup",n)});function n(a){a.key==="Escape"&&q.value&&(e(),t?.focus())}}function At(){function e(){q.value=!0}function t(){q.value=!1}function n(){q.value?t():e()}return{isOpen:q,open:e,close:t,toggle:n}}function Mt(e){const{page:t,hash:n}=$(),a=V(!1),s=p(()=>e.value.collapsed!=null),r=p(()=>!!e.value.link),d=V(!1),l=()=>{d.value=D(t.value.relativePath,e.value.link)};H([t,e,n],l),R(l);const g=p(()=>d.value?!0:e.value.items?ce(t.value.relativePath,e.value.items):!1),y=p(()=>!!(e.value.items&&e.value.items.length));te(()=>{a.value=!!(s.value&&e.value.collapsed)}),Ve(()=>{(d.value||g.value)&&(a.value=!1)});function N(){s.value&&(a.value=!a.value)}return{collapsed:a,collapsible:s,isLink:r,isActiveLink:d,hasActiveLink:g,hasChildren:y,toggle:N}}const de=ae([]),J=ae([]),Z=ae(!1);function G(){const{frontmatter:e,theme:t}=$(),n=p(()=>!!(e.value.isHome??e.value.layout==="home")),a=p(()=>e.value.sidebar!==!1&&J.value.length>0&&!n.value),s=p(()=>a.value&&Z.value),r=p(()=>a.value?gt(J.value):[]),d=p(()=>n.value?!1:e.value.aside!=null?!!e.value.aside:t.value.aside!==!1),l=p(()=>d.value?e.value.aside==null?t.value.aside==="left":e.value.aside==="left":!1),g=p(()=>de.value.length>0);return{isHome:n,sidebar:ye(J),sidebarGroups:r,hasSidebar:a,isSidebarEnabled:s,hasAside:d,leftAside:l,headers:ye(de),hasLocalNav:g}}function wt({closeSidebar:e}){const{frontmatter:t,page:n,theme:a}=$();H(()=>[n.value.relativePath,a.value.sidebar],([r,d])=>{const l=d?xe(d,r):[];JSON.stringify(l)!==JSON.stringify(J.value)&&(J.value=l)},{immediate:!0,deep:!0,flush:"sync"}),Se(()=>{de.value=yt(t.value.outline??a.value.outline)}),Y&&(Z.value=window.innerWidth>=960,window.addEventListener("resize",()=>{Z.value=window.innerWidth>=960},{passive:!0}));const s=ne();H(()=>s.path,e),H(Z,e),Tt(e)}const Ce=Symbol("layout-info"),It=["href","title"],xt=m({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(e){return(t,n)=>{const a=j("VPDocOutlineItem",!0);return o(),u("ul",{class:P(["VPDocOutlineItem",e.root?"root":"nested"])},[(o(!0),u(S,null,w(e.headers,({children:s,link:r,title:d})=>(o(),u("li",null,[f("a",{class:"outline-link",href:r,title:d},L(d),9,It),s?.length?(o(),k(a,{key:0,headers:s},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Be=b(xt,[["__scopeId","data-v-1ce71065"]]),Ht={class:"content"},Ct={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Bt=m({__name:"VPDocAsideOutline",setup(e){const{theme:t}=$(),n=V(),a=V(),{headers:s,hasLocalNav:r}=G();return Vt(n,a),(d,l)=>(o(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:P(["VPDocAsideOutline",{"has-outline":i(r)}]),ref_key:"container",ref:n},[f("div",Ht,[f("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),f("div",Ct,L(i(He)(i(t))),1),_(Be,{headers:i(s),root:!0},null,8,["headers"])])],2))}}),Et=b(Bt,[["__scopeId","data-v-60d5052e"]]),Ft={class:"VPDocAsideCarbonAds"},Ot=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(e){const t=()=>null;return(n,a)=>(o(),u("div",Ft,[_(i(t),{"carbon-ads":e.carbonAds},null,8,["carbon-ads"])]))}}),Dt={class:"VPDocAside"},Gt=m({__name:"VPDocAside",setup(e){const{theme:t}=$();return(n,a)=>(o(),u("div",Dt,[c(n.$slots,"aside-top",{},void 0,!0),c(n.$slots,"aside-outline-before",{},void 0,!0),_(Et),c(n.$slots,"aside-outline-after",{},void 0,!0),a[0]||(a[0]=f("div",{class:"spacer"},null,-1)),c(n.$slots,"aside-ads-before",{},void 0,!0),i(t).carbonAds?(o(),k(Ot,{key:0,"carbon-ads":i(t).carbonAds},null,8,["carbon-ads"])):h("",!0),c(n.$slots,"aside-ads-after",{},void 0,!0),c(n.$slots,"aside-bottom",{},void 0,!0)]))}}),Kt=b(Gt,[["__scopeId","data-v-3f215769"]]);function Rt(){const{theme:e,page:t}=$();return p(()=>{const{text:n="Edit this page",pattern:a=""}=e.value.editLink||{};let s;return typeof a=="function"?s=a(t.value):s=a.replace(/:path/g,t.value.filePath),{url:s,text:n}})}function Ut(){const{page:e,theme:t,frontmatter:n}=$();return p(()=>{const a=xe(t.value.sidebar,e.value.relativePath),s=_t(a),r=jt(s,y=>y.link.replace(/[?#].*$/,"")),d=r.findIndex(y=>D(e.value.relativePath,y.link)),l=t.value.docFooter?.prev===!1&&!n.value.prev||n.value.prev===!1,g=t.value.docFooter?.next===!1&&!n.value.next||n.value.next===!1;return{prev:l?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??r[d-1]?.docFooterText??r[d-1]?.text,link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??r[d-1]?.link},next:g?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??r[d+1]?.docFooterText??r[d+1]?.text,link:(typeof n.value.next=="object"?n.value.next.link:void 0)??r[d+1]?.link}}})}function jt(e,t){const n=new Set;return e.filter(a=>{const s=t(a);return n.has(s)?!1:n.add(s)})}const B=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(e){const t=e,n=p(()=>t.tag??(t.href?"a":"span")),a=p(()=>t.href&&Ne.test(t.href)||t.target==="_blank");return(s,r)=>(o(),k(C(n.value),{class:P(["VPLink",{link:e.href,"vp-external-link-icon":a.value,"no-icon":e.noIcon}]),href:e.href?i(me)(e.href):void 0,target:e.target??(a.value?"_blank":void 0),rel:e.rel??(a.value?"noreferrer":void 0)},{default:v(()=>[c(s.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Wt={class:"VPLastUpdated"},zt=["datetime"],qt=m({__name:"VPDocFooterLastUpdated",setup(e){const{theme:t,page:n,lang:a}=$(),{language:s}=qe(),r=ze("timeRef"),d=p(()=>new Date(n.value.lastUpdated)),l=p(()=>d.value.toISOString()),g=ae("");return R(()=>{te(()=>{const y=t.value.lastUpdated?.formatOptions?.forceLocale?a.value:s.value;g.value=new Intl.DateTimeFormat(y,t.value.lastUpdated?.formatOptions??{dateStyle:"medium",timeStyle:"medium"}).format(d.value),y&&a.value!==y?r.value?.setAttribute("lang",y):r.value?.removeAttribute("lang")})}),(y,N)=>(o(),u("p",Wt,[U(L(i(t).lastUpdated?.text||i(t).lastUpdatedText||"Last updated")+": ",1),f("time",{ref_key:"timeRef",ref:r,datetime:l.value},L(g.value),9,zt)]))}}),Jt=b(qt,[["__scopeId","data-v-3c637f39"]]),Yt={key:0,class:"VPDocFooter"},Xt={key:0,class:"edit-info"},Qt={key:0,class:"edit-link"},Zt={key:1,class:"last-updated"},en={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},tn={class:"pager"},nn=["innerHTML"],an=["innerHTML"],sn={class:"pager"},on=["innerHTML"],rn=["innerHTML"],ln=m({__name:"VPDocFooter",setup(e){const{theme:t,page:n,frontmatter:a}=$(),s=Rt(),r=Ut(),d=p(()=>t.value.editLink&&a.value.editLink!==!1),l=p(()=>n.value.lastUpdated),g=p(()=>d.value||l.value||r.value.prev||r.value.next);return(y,N)=>g.value?(o(),u("footer",Yt,[c(y.$slots,"doc-footer-before",{},void 0,!0),d.value||l.value?(o(),u("div",Xt,[d.value?(o(),u("div",Qt,[_(B,{class:"edit-link-button",href:i(s).url,"no-icon":!0},{default:v(()=>[N[0]||(N[0]=f("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),U(" "+L(i(s).text),1)]),_:1},8,["href"])])):h("",!0),l.value?(o(),u("div",Zt,[_(Jt)])):h("",!0)])):h("",!0),i(r).prev?.link||i(r).next?.link?(o(),u("nav",en,[N[1]||(N[1]=f("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),f("div",tn,[i(r).prev?.link?(o(),k(B,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:v(()=>[f("span",{class:"desc",innerHTML:i(t).docFooter?.prev||"Previous page"},null,8,nn),f("span",{class:"title",innerHTML:i(r).prev.text},null,8,an)]),_:1},8,["href"])):h("",!0)]),f("div",sn,[i(r).next?.link?(o(),k(B,{key:0,class:"pager-link next",href:i(r).next.link},{default:v(()=>[f("span",{class:"desc",innerHTML:i(t).docFooter?.next||"Next page"},null,8,on),f("span",{class:"title",innerHTML:i(r).next.text},null,8,rn)]),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}),cn=b(ln,[["__scopeId","data-v-e257564d"]]),un={class:"container"},dn={class:"aside-container"},vn={class:"aside-content"},fn={class:"content"},hn={class:"content-container"},mn={class:"main"},pn=m({__name:"VPDoc",setup(e){const{theme:t}=$(),n=ne(),{hasSidebar:a,hasAside:s,leftAside:r}=G(),d=p(()=>n.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(l,g)=>{const y=j("Content");return o(),u("div",{class:P(["VPDoc",{"has-sidebar":i(a),"has-aside":i(s)}])},[c(l.$slots,"doc-top",{},void 0,!0),f("div",un,[i(s)?(o(),u("div",{key:0,class:P(["aside",{"left-aside":i(r)}])},[g[0]||(g[0]=f("div",{class:"aside-curtain"},null,-1)),f("div",dn,[f("div",vn,[_(Kt,null,{"aside-top":v(()=>[c(l.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[c(l.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[c(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(l.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),f("div",fn,[f("div",hn,[c(l.$slots,"doc-before",{},void 0,!0),f("main",mn,[_(y,{class:P(["vp-doc",[d.value,i(t).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(cn,null,{"doc-footer-before":v(()=>[c(l.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(l.$slots,"doc-after",{},void 0,!0)])])]),c(l.$slots,"doc-bottom",{},void 0,!0)],2)}}}),kn=b(pn,[["__scopeId","data-v-7011f0d8"]]),gn=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(e){const t=e,n=p(()=>t.href&&Ne.test(t.href)),a=p(()=>t.tag||(t.href?"a":"button"));return(s,r)=>(o(),k(C(a.value),{class:P(["VPButton",[e.size,e.theme]]),href:e.href?i(me)(e.href):void 0,target:t.target??(n.value?"_blank":void 0),rel:t.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[c(s.$slots,"default",{},()=>[U(L(e.text),1)],!0)]),_:3},8,["class","href","target","rel"]))}}),_n=b(gn,[["__scopeId","data-v-01bff58b"]]),bn=["src","alt"],$n=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(e){return(t,n)=>{const a=j("VPImage",!0);return e.image?(o(),u(S,{key:0},[typeof e.image=="string"||"src"in e.image?(o(),u("img",O({key:0,class:"VPImage"},typeof e.image=="string"?t.$attrs:{...e.image,...t.$attrs},{src:i(fe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,bn)):(o(),u(S,{key:1},[_(a,O({class:"dark",image:e.image.dark,alt:e.image.alt},t.$attrs),null,16,["image","alt"]),_(a,O({class:"light",image:e.image.light,alt:e.image.alt},t.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),ee=b($n,[["__scopeId","data-v-8426fc1a"]]),yn={class:"container"},Pn={class:"main"},Ln={class:"heading"},Vn=["innerHTML"],Sn=["innerHTML"],Nn=["innerHTML"],Tn={key:0,class:"actions"},An={key:0,class:"image"},Mn={class:"image-container"},wn=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(e){const{heroImageSlotExists:t}=se(Ce,{heroImageSlotExists:p(()=>!1)});return(n,a)=>(o(),u("div",{class:P(["VPHero",{"has-image":e.image||i(t)}])},[f("div",yn,[f("div",Pn,[c(n.$slots,"home-hero-info-before",{},void 0,!0),c(n.$slots,"home-hero-info",{},()=>[f("h1",Ln,[e.name?(o(),u("span",{key:0,innerHTML:e.name,class:"name clip"},null,8,Vn)):h("",!0),e.text?(o(),u("span",{key:1,innerHTML:e.text,class:"text"},null,8,Sn)):h("",!0)]),e.tagline?(o(),u("p",{key:0,innerHTML:e.tagline,class:"tagline"},null,8,Nn)):h("",!0)],!0),c(n.$slots,"home-hero-info-after",{},void 0,!0),e.actions?(o(),u("div",Tn,[c(n.$slots,"home-hero-actions-before-actions",{},void 0,!0),(o(!0),u(S,null,w(e.actions,s=>(o(),u("div",{key:s.link,class:"action"},[_(_n,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link,target:s.target,rel:s.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),e.image||i(t)?(o(),u("div",An,[f("div",Mn,[a[0]||(a[0]=f("div",{class:"image-bg"},null,-1)),c(n.$slots,"home-hero-image",{},()=>[e.image?(o(),k(ee,{key:0,class:"image-src",image:e.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),In=b(wn,[["__scopeId","data-v-e62e4946"]]),xn=m({__name:"VPHomeHero",setup(e){const{frontmatter:t}=$();return(n,a)=>i(t).hero?(o(),k(In,{key:0,class:"VPHomeHero",name:i(t).hero.name,text:i(t).hero.text,tagline:i(t).hero.tagline,image:i(t).hero.image,actions:i(t).hero.actions},{"home-hero-info-before":v(()=>[c(n.$slots,"home-hero-info-before")]),"home-hero-info":v(()=>[c(n.$slots,"home-hero-info")]),"home-hero-info-after":v(()=>[c(n.$slots,"home-hero-info-after")]),"home-hero-actions-after":v(()=>[c(n.$slots,"home-hero-actions-after")]),"home-hero-actions-before-actions":v(()=>[c(n.$slots,"home-hero-actions-before-actions")]),"home-hero-image":v(()=>[c(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),Hn={class:"box"},Cn={key:0,class:"icon"},Bn=["innerHTML"],En=["innerHTML"],Fn={key:3,class:"details"},On=["innerHTML"],Dn=["innerHTML"],Gn={key:5,class:"link-text"},Kn={class:"link-text-value"},Rn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(e){return(t,n)=>(o(),k(B,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[f("article",Hn,[typeof e.icon=="object"&&e.icon.wrap?(o(),u("div",Cn,[_(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(o(),k(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(o(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Bn)):h("",!0),f("h2",{class:"title",innerHTML:e.title},null,8,En),Array.isArray(e.details)?(o(),u("ul",Fn,[(o(!0),u(S,null,w(e.details,a=>(o(),u("li",{key:a,innerHTML:a},null,8,On))),128))])):e.details?(o(),u("p",{key:4,class:"details",innerHTML:e.details},null,8,Dn)):h("",!0),e.linkText?(o(),u("div",Gn,[f("p",Kn,[U(L(e.linkText)+" ",1),n[0]||(n[0]=f("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Un=b(Rn,[["__scopeId","data-v-e5511d04"]]),jn={key:0,class:"VPFeatures"},Wn={class:"container"},zn={class:"items"},qn=m({__name:"VPFeatures",props:{features:{}},setup(e){const t=e,n=p(()=>{const a=t.features.length;if(a){if(a===2)return"grid-2";if(a===3)return"grid-3";if(a%3===0)return"grid-6";if(a>3)return"grid-4"}else return});return(a,s)=>e.features?(o(),u("div",jn,[f("div",Wn,[f("div",zn,[(o(!0),u(S,null,w(e.features,r=>(o(),u("div",{key:r.title,class:P(["item",[n.value]])},[_(Un,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),Jn=b(qn,[["__scopeId","data-v-a6181336"]]),Yn=m({__name:"VPHomeFeatures",setup(e){const{frontmatter:t}=$();return(n,a)=>i(t).features?(o(),k(Jn,{key:0,class:"VPHomeFeatures",features:i(t).features},null,8,["features"])):h("",!0)}}),Xn=m({__name:"VPHomeContent",setup(e){const{width:t}=Je({initialWidth:0,includeScrollbar:!1});return(n,a)=>(o(),u("div",{class:"vp-doc container",style:Te(i(t)?{"--vp-offset":`calc(50% - ${i(t)/2}px)`}:{})},[c(n.$slots,"default",{},void 0,!0)],4))}}),Qn=b(Xn,[["__scopeId","data-v-8e2d4988"]]),Zn=m({__name:"VPHome",setup(e){const{frontmatter:t,theme:n}=$();return(a,s)=>{const r=j("Content");return o(),u("div",{class:P(["VPHome",{"external-link-icon-enabled":i(n).externalLinkIcon}])},[c(a.$slots,"home-hero-before",{},void 0,!0),_(xn,null,{"home-hero-info-before":v(()=>[c(a.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(a.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(a.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-actions-before-actions":v(()=>[c(a.$slots,"home-hero-actions-before-actions",{},void 0,!0)]),"home-hero-image":v(()=>[c(a.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(a.$slots,"home-hero-after",{},void 0,!0),c(a.$slots,"home-features-before",{},void 0,!0),_(Yn),c(a.$slots,"home-features-after",{},void 0,!0),i(t).markdownStyles!==!1?(o(),k(Qn,{key:0},{default:v(()=>[_(r)]),_:1})):(o(),k(r,{key:1}))],2)}}}),ea=b(Zn,[["__scopeId","data-v-bb6342a6"]]),ta={},na={class:"VPPage"};function aa(e,t){const n=j("Content");return o(),u("div",na,[c(e.$slots,"page-top"),_(n),c(e.$slots,"page-bottom")])}const sa=b(ta,[["render",aa]]),oa=m({__name:"VPContent",setup(e){const{page:t,frontmatter:n}=$(),{isHome:a,hasSidebar:s}=G();return(r,d)=>(o(),u("div",{class:P(["VPContent",{"has-sidebar":i(s),"is-home":i(a)}]),id:"VPContent"},[i(t).isNotFound?c(r.$slots,"not-found",{key:0},()=>[_(kt)],!0):i(n).layout==="page"?(o(),k(sa,{key:1},{"page-top":v(()=>[c(r.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[c(r.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(n).layout==="home"?(o(),k(ea,{key:2},{"home-hero-before":v(()=>[c(r.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[c(r.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(r.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(r.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(r.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-actions-before-actions":v(()=>[c(r.$slots,"home-hero-actions-before-actions",{},void 0,!0)]),"home-hero-image":v(()=>[c(r.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[c(r.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[c(r.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[c(r.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(n).layout&&i(n).layout!=="doc"?(o(),k(C(i(n).layout),{key:3})):(o(),k(kn,{key:4},{"doc-top":v(()=>[c(r.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[c(r.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[c(r.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[c(r.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[c(r.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[c(r.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[c(r.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(r.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(r.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(r.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[c(r.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ra=b(oa,[["__scopeId","data-v-9dc86fcc"]]),ia={class:"container"},la=["innerHTML"],ca=["innerHTML"],ua=m({__name:"VPFooter",setup(e){const{theme:t,frontmatter:n}=$(),{hasSidebar:a}=G();return(s,r)=>i(t).footer&&i(n).footer!==!1?(o(),u("footer",{key:0,class:P(["VPFooter",{"has-sidebar":i(a)}])},[f("div",ia,[i(t).footer.message?(o(),u("p",{key:0,class:"message",innerHTML:i(t).footer.message},null,8,la)):h("",!0),i(t).footer.copyright?(o(),u("p",{key:1,class:"copyright",innerHTML:i(t).footer.copyright},null,8,ca)):h("",!0)])],2)):h("",!0)}}),da=b(ua,[["__scopeId","data-v-c3855bb3"]]),va={class:"menu-text"},fa={class:"header"},ha={class:"outline"},ma=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(e){const t=e,{theme:n}=$(),a=V(!1),s=V(0),r=V(),d=V();function l(A){r.value?.contains(A.target)||(a.value=!1)}H(a,A=>{if(A){document.addEventListener("click",l);return}document.removeEventListener("click",l)}),ie("Escape",()=>{a.value=!1}),Se(()=>{a.value=!1});function g(){a.value=!a.value,s.value=window.innerHeight+Math.min(window.scrollY-t.navHeight,0)}function y(A){A.target.classList.contains("outline-link")&&(d.value&&(d.value.style.transition="none"),Ae(()=>{a.value=!1}))}function N(){a.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(A,E)=>(o(),u("div",{class:"VPLocalNavOutlineDropdown",style:Te({"--vp-vh":s.value+"px"}),ref_key:"main",ref:r},[e.headers.length>0?(o(),u("button",{key:0,onClick:g,class:P({open:a.value})},[f("span",va,L(i(He)(i(n))),1),E[0]||(E[0]=f("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(o(),u("button",{key:1,onClick:N},L(i(n).returnToTopLabel||"Return to top"),1)),_(ve,{name:"flyout"},{default:v(()=>[a.value?(o(),u("div",{key:0,ref_key:"items",ref:d,class:"items",onClick:y},[f("div",fa,[f("a",{class:"top-link",href:"#",onClick:N},L(i(n).returnToTopLabel||"Return to top"),1)]),f("div",ha,[_(Be,{headers:e.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),pa=b(ma,[["__scopeId","data-v-0bf0e06f"]]),ka={class:"container"},ga=["aria-expanded"],_a={class:"menu-text"},ba=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(e){const{theme:t}=$(),{isHome:n,hasSidebar:a,headers:s,hasLocalNav:r}=G(),{y:d}=Me(),l=V(0);R(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))});const g=p(()=>({VPLocalNav:!0,"has-sidebar":a.value,empty:!r.value,fixed:!r.value&&!a.value}));return(y,N)=>!i(n)&&(i(r)||i(a)||i(d)>=l.value)?(o(),u("div",{key:0,class:P(g.value)},[f("div",ka,[i(a)?(o(),u("button",{key:0,class:"menu","aria-expanded":e.open,"aria-controls":"VPSidebarNav",onClick:N[0]||(N[0]=A=>y.$emit("open-menu"))},[N[1]||(N[1]=f("span",{class:"vpi-align-left menu-icon"},null,-1)),f("span",_a,L(i(t).sidebarMenuLabel||"Menu"),1)],8,ga)):h("",!0),_(pa,{headers:i(s),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),$a=b(ba,[["__scopeId","data-v-db738f89"]]);function ya(){const e=V(!1);function t(){e.value=!0,window.addEventListener("resize",s)}function n(){e.value=!1,window.removeEventListener("resize",s)}function a(){e.value?n():t()}function s(){window.outerWidth>=768&&n()}const r=ne();return H(()=>r.path,n),{isScreenOpen:e,openScreen:t,closeScreen:n,toggleScreen:a}}const pe=Symbol("nav"),Pa={},La={class:"VPSwitch",type:"button",role:"switch"},Va={class:"check"},Sa={key:0,class:"icon"};function Na(e,t){return o(),u("button",La,[f("span",Va,[e.$slots.default?(o(),u("span",Sa,[c(e.$slots,"default",{},void 0,!0)])):h("",!0)])])}const Ta=b(Pa,[["render",Na],["__scopeId","data-v-1d5665e3"]]),Aa=m({__name:"VPSwitchAppearance",setup(e){const{isDark:t,theme:n}=$(),a=se("toggle-appearance",()=>{t.value=!t.value}),s=V("");return Ve(()=>{s.value=t.value?n.value.lightModeSwitchTitle||"Switch to light theme":n.value.darkModeSwitchTitle||"Switch to dark theme"}),(r,d)=>(o(),k(Ta,{title:s.value,class:"VPSwitchAppearance","aria-checked":i(t),onClick:i(a)},{default:v(()=>[...d[0]||(d[0]=[f("span",{class:"vpi-sun sun"},null,-1),f("span",{class:"vpi-moon moon"},null,-1)])]),_:1},8,["title","aria-checked","onClick"]))}}),ke=b(Aa,[["__scopeId","data-v-5337faa4"]]),Ma={key:0,class:"VPNavBarAppearance"},wa=m({__name:"VPNavBarAppearance",setup(e){const{site:t}=$();return(n,a)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(o(),u("div",Ma,[_(ke)])):h("",!0)}}),Ia=b(wa,[["__scopeId","data-v-6c893767"]]),ge=V();let Ee=!1,re=0;function xa(e){const t=V(!1);if(Y){!Ee&&Ha(),re++;const n=H(ge,a=>{a===e.el.value||e.el.value?.contains(a)?(t.value=!0,e.onFocus?.()):(t.value=!1,e.onBlur?.())});he(()=>{n(),re--,re||Ca()})}return Ye(t)}function Ha(){document.addEventListener("focusin",Fe),Ee=!0,ge.value=document.activeElement}function Ca(){document.removeEventListener("focusin",Fe)}function Fe(){ge.value=document.activeElement}const Ba={class:"VPMenuLink"},Ea=["innerHTML"],Fa=m({inheritAttrs:!1,__name:"VPMenuLink",props:{item:{},rel:{}},setup(e){const t=e,{page:n}=$(),a=p(()=>typeof t.item.link=="function"?t.item.link(n.value):t.item.link),s=p(()=>D(n.value.relativePath,t.item.activeMatch||a.value,!!t.item.activeMatch));return(r,d)=>(o(),u("div",Ba,[_(B,O(r.$attrs,{class:{active:s.value},href:a.value,target:e.item.target,rel:t.rel??e.item.rel,"no-icon":e.item.noIcon}),{default:v(()=>[f("span",{innerHTML:e.item.text},null,8,Ea)]),_:1},16,["class","href","target","rel","no-icon"])]))}}),oe=b(Fa,[["__scopeId","data-v-867c295f"]]),Oa={class:"VPMenuGroup"},Da={key:0,class:"title"},Ga=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(e){return(t,n)=>(o(),u("div",Oa,[e.text?(o(),u("p",Da,L(e.text),1)):h("",!0),(o(!0),u(S,null,w(e.items,a=>(o(),u(S,{key:JSON.stringify(a)},["link"in a?(o(),k(oe,{key:0,item:a},null,8,["item"])):h("",!0)],64))),128))]))}}),Ka=b(Ga,[["__scopeId","data-v-1963e1bb"]]),Ra={class:"VPMenu"},Ua={key:0,class:"items"},ja=m({__name:"VPMenu",props:{items:{}},setup(e){return(t,n)=>(o(),u("div",Ra,[e.items?(o(),u("div",Ua,[(o(!0),u(S,null,w(e.items,a=>(o(),u(S,{key:JSON.stringify(a)},["link"in a?(o(),k(oe,{key:0,item:a},null,8,["item"])):"component"in a?(o(),k(C(a.component),O({key:1,ref_for:!0},a.props),null,16)):(o(),k(Ka,{key:2,text:a.text,items:a.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(t.$slots,"default",{},void 0,!0)]))}}),Wa=b(ja,[["__scopeId","data-v-25a6cce8"]]),za=["aria-expanded","aria-label"],qa={key:0,class:"text"},Ja=["innerHTML"],Ya={key:1,class:"vpi-more-horizontal icon"},Xa={class:"menu"},Qa=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(e){const t=V(!1),n=V();xa({el:n,onBlur:a});function a(){t.value=!1}return(s,r)=>(o(),u("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=d=>t.value=!0),onMouseleave:r[2]||(r[2]=d=>t.value=!1)},[f("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":t.value,"aria-label":e.label,onClick:r[0]||(r[0]=d=>t.value=!t.value)},[e.button||e.icon?(o(),u("span",qa,[e.icon?(o(),u("span",{key:0,class:P([e.icon,"option-icon"])},null,2)):h("",!0),e.button?(o(),u("span",{key:1,innerHTML:e.button},null,8,Ja)):h("",!0),r[3]||(r[3]=f("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(o(),u("span",Ya))],8,za),f("div",Xa,[_(Wa,{items:e.items},{default:v(()=>[c(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),_e=b(Qa,[["__scopeId","data-v-42cb505d"]]),Za=["href","aria-label","rel","innerHTML"],es=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{},me:{type:Boolean}},setup(e){const t=e,n=V();R(async()=>{await Ae();const s=n.value?.children[0];s instanceof HTMLElement&&s.className.startsWith("vpi-social-")&&(getComputedStyle(s).maskImage||getComputedStyle(s).webkitMaskImage)==="none"&&s.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${t.icon}.svg')`)});const a=p(()=>typeof t.icon=="object"?t.icon.svg:`<span class="vpi-social-${t.icon}"></span>`);return(s,r)=>(o(),u("a",{ref_key:"el",ref:n,class:"VPSocialLink no-icon",href:e.link,"aria-label":e.ariaLabel??(typeof e.icon=="string"?e.icon:""),target:"_blank",rel:e.me?"me noopener":"noopener",innerHTML:a.value},null,8,Za))}}),ts=b(es,[["__scopeId","data-v-591a6b30"]]),ns={class:"VPSocialLinks"},as=m({__name:"VPSocialLinks",props:{links:{},me:{type:Boolean,default:!0}},setup(e){return(t,n)=>(o(),u("div",ns,[(o(!0),u(S,null,w(e.links,({link:a,icon:s,ariaLabel:r})=>(o(),k(ts,{key:a,icon:s,link:a,ariaLabel:r,me:e.me},null,8,["icon","link","ariaLabel","me"]))),128))]))}}),be=b(as,[["__scopeId","data-v-d07f11e6"]]),ss={key:0,class:"group translations"},os={class:"trans-title"},rs={key:1,class:"group"},is={class:"item appearance"},ls={class:"label"},cs={class:"appearance-action"},us={key:2,class:"group"},ds={class:"item social-links"},vs=m({__name:"VPNavBarExtra",setup(e){const{site:t,theme:n}=$(),{localeLinks:a,currentLang:s}=X({correspondingLink:!0}),r=p(()=>a.value.length&&s.value.label||t.value.appearance||n.value.socialLinks);return(d,l)=>r.value?(o(),k(_e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[i(a).length&&i(s).label?(o(),u("div",ss,[f("p",os,L(i(s).label),1),(o(!0),u(S,null,w(i(a),g=>(o(),k(oe,{key:g.link,item:g,lang:g.lang,hreflang:g.lang,rel:"alternate",dir:g.dir},null,8,["item","lang","hreflang","dir"]))),128))])):h("",!0),i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(o(),u("div",rs,[f("div",is,[f("p",ls,L(i(n).darkModeSwitchLabel||"Appearance"),1),f("div",cs,[_(ke)])])])):h("",!0),i(n).socialLinks?(o(),u("div",us,[f("div",ds,[_(be,{class:"social-links-list",links:i(n).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),fs=b(vs,[["__scopeId","data-v-562c832a"]]),hs=["aria-expanded"],ms=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(e){return(t,n)=>(o(),u("button",{type:"button",class:P(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=a=>t.$emit("click"))},[...n[1]||(n[1]=[f("span",{class:"container"},[f("span",{class:"top"}),f("span",{class:"middle"}),f("span",{class:"bottom"})],-1)])],10,hs))}}),ps=b(ms,[["__scopeId","data-v-e5dd9c1c"]]),ks=["innerHTML"],gs=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(e){const t=e,{page:n}=$(),a=p(()=>typeof t.item.link=="function"?t.item.link(n.value):t.item.link),s=p(()=>D(n.value.relativePath,t.item.activeMatch||a.value,!!t.item.activeMatch));return(r,d)=>(o(),k(B,{class:P({VPNavBarMenuLink:!0,active:s.value}),href:a.value,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,tabindex:"0"},{default:v(()=>[f("span",{innerHTML:e.item.text},null,8,ks)]),_:1},8,["class","href","target","rel","no-icon"]))}}),_s=b(gs,[["__scopeId","data-v-6dd25bb8"]]),bs=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(e){const t=e,{page:n}=$(),a=p(()=>t.item.activeMatch?D(n.value.relativePath,t.item.activeMatch,!0):s(t.item));function s(r){if("component"in r)return!1;if("link"in r){const d=typeof r.link=="function"?r.link(n.value):r.link;return D(n.value.relativePath,r.activeMatch||d,!!r.activeMatch)}return r.items.some(s)}return(r,d)=>(o(),k(_e,{class:P({VPNavBarMenuGroup:!0,active:a.value}),button:e.item.text,items:e.item.items},null,8,["class","button","items"]))}}),$s={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},ys=m({__name:"VPNavBarMenu",setup(e){const{theme:t}=$();return(n,a)=>i(t).nav?(o(),u("nav",$s,[a[0]||(a[0]=f("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(o(!0),u(S,null,w(i(t).nav,s=>(o(),u(S,{key:JSON.stringify(s)},["link"in s?(o(),k(_s,{key:0,item:s},null,8,["item"])):"component"in s?(o(),k(C(s.component),O({key:1,ref_for:!0},s.props),null,16)):(o(),k(bs,{key:2,item:s},null,8,["item"]))],64))),128))])):h("",!0)}}),Ps=b(ys,[["__scopeId","data-v-39714824"]]);function Ls(e){const t=e.mode??"auto",n=Vs(e),a=e.askAi,s=!!(a&&typeof a=="object"&&a.sidePanel);switch(t){case"sidePanel":return{mode:t,showKeywordSearch:!1,useSidePanel:!0};case"hybrid":return n||console.error('[vitepress] mode: "hybrid" requires keyword search credentials (appId, apiKey, indexName).'),{mode:t,showKeywordSearch:n,useSidePanel:!0};case"modal":return{mode:t,showKeywordSearch:n,useSidePanel:!1};default:return{mode:"auto",showKeywordSearch:n,useSidePanel:s}}}function Vs(e){return!!(e.appId&&e.apiKey&&e.indexName)}function Oe(e,t){return[...(Array.isArray(e)?e:e?[e]:[]).map(s=>Array.isArray(s)?s.filter(r=>typeof r=="string"&&!r.startsWith("lang:")):s).filter(s=>typeof s=="string"?!s.startsWith("lang:"):Array.isArray(s)&&s.length>0),`lang:${t}`]}function Ss(e,t,n){const a=typeof e=="string",s=!a&&e.searchParameters?{...e.searchParameters}:void 0,r=s?.facetFilters??t.searchParameters?.facetFilters,d=Oe(r,n),l={...s,facetFilters:d.length?d:void 0},g={...a?{}:e,indexName:a?t.indexName:e.indexName,apiKey:a?t.apiKey:e.apiKey,appId:a?t.appId:e.appId,assistantId:a?e:e.assistantId};return Object.values(l).some(y=>y!=null)&&(g.searchParameters=l),g}function Ns(e,t,n){e=De(e,e.locales?.[t]||{});const a=Oe(e.searchParameters?.facetFilters,n),s=e.askAi?Ss(e.askAi,e,n):void 0;return{...e,searchParameters:{...e.searchParameters,facetFilters:a},askAi:s}}function De(e,t){const n={...e};for(const a in t){const s=t[a];if(s!==void 0){if(a==="searchParameters"){n[a]=s;continue}Pe(s)&&Pe(n[a])?n[a]=De(n[a],s):n[a]=s}}return delete n.locales,n}function Ts(e,t=(n,a)=>JSON.stringify(n)===JSON.stringify(a)){return p(n=>{const a=e();return n===void 0||!t(n,a)?a:n})}const As={},Ms={type:"button",class:"VPNavBarAskAiButton"};function ws(e,t){return o(),u("button",Ms,[...t[0]||(t[0]=[f("span",{class:"vpi-sparkles","aria-hidden":"true"},null,-1)])])}const Is=b(As,[["render",ws],["__scopeId","data-v-4eb17e89"]]),xs={type:"button",class:"VPNavBarSearchButton"},Hs={class:"text"},Cs=m({__name:"VPNavBarSearchButton",props:{text:{}},setup(e){return(t,n)=>(o(),u("button",xs,[n[0]||(n[0]=f("span",{class:"vpi-search","aria-hidden":"true"},null,-1)),f("span",Hs,L(e.text),1),n[1]||(n[1]=f("span",{class:"keys","aria-hidden":"true"},[f("kbd",{class:"key-cmd"},"⌘"),f("kbd",{class:"key-ctrl"},"Ctrl"),f("kbd",null,"K")],-1))]))}}),Le=b(Cs,[["__scopeId","data-v-baa3be99"]]),Bs={class:"VPNavBarSearch"},Es=m({__name:"VPNavBarSearch",setup(e){const t=Xe(()=>Qe(()=>import("./VPLocalSearchBox.BqgkAhNM.js"),__vite__mapDeps([0,1]))),n=()=>null,{theme:a,localeIndex:s,lang:r}=$(),d="local",l=Ts(()=>Ns(a.value.search?.options||{},s.value,r.value)),g=p(()=>Ls(l.value)),y=p(()=>{if(!g.value.useSidePanel)return null;const T=l.value.askAi;return!T||typeof T=="string"||!T.sidePanel?null:T.sidePanel===!0?{}:T.sidePanel}),N=p(()=>y.value?.keyboardShortcuts?.["Ctrl/Cmd+I"]!==!1),A=V(null);let E=0;const I=V(!1),x=V(!1);R(()=>{});function W(T){I.value||(I.value=!0),A.value={target:T,nonce:++E}}const F=V(!1);ie("k",T=>{(T.ctrlKey||T.metaKey)&&(T.preventDefault(),F.value=!0)}),ie("/",T=>{z(T)||(T.preventDefault(),F.value=!0)});function z(T){const M=T.target,K=M.tagName;return M.isContentEditable||K==="INPUT"||K==="SELECT"||K==="TEXTAREA"}return(T,M)=>(o(),u("div",Bs,[i(d)==="algolia"?(o(),u(S,{key:0},[g.value.showKeywordSearch?(o(),k(Le,{key:0,text:i(l).translations?.button?.buttonText||"Search","aria-label":i(l).translations?.button?.buttonAriaLabel||"Search","aria-keyshortcuts":"/ control+k meta+k",onClick:M[0]||(M[0]=K=>W("search"))},null,8,["text","aria-label"])):h("",!0),y.value?(o(),k(Is,{key:1,"aria-label":y.value.button?.translations?.buttonAriaLabel||"Ask AI","aria-keyshortcuts":N.value?"control+i meta+i":void 0,onClick:M[1]||(M[1]=K=>x.value?W("toggleAskAi"):W("askAi"))},null,8,["aria-label","aria-keyshortcuts"])):h("",!0),I.value?(o(),k(i(n),{key:2,"algolia-options":i(l),"open-request":A.value,onVnodeBeforeMount:M[2]||(M[2]=K=>x.value=!0)},null,8,["algolia-options","open-request"])):h("",!0)],64)):i(d)==="local"?(o(),u(S,{key:1},[_(Le,{text:i(l).translations?.button?.buttonText||"Search","aria-label":i(l).translations?.button?.buttonAriaLabel||"Search","aria-keyshortcuts":"/ control+k meta+k",onClick:M[3]||(M[3]=K=>F.value=!0)},null,8,["text","aria-label"]),F.value?(o(),k(i(t),{key:0,onClose:M[4]||(M[4]=K=>F.value=!1)})):h("",!0)],64)):h("",!0)]))}}),Fs=b(Es,[["__scopeId","data-v-2fc7f2c6"]]),Os=m({__name:"VPNavBarSocialLinks",setup(e){const{theme:t}=$();return(n,a)=>i(t).socialLinks?(o(),k(be,{key:0,class:"VPNavBarSocialLinks",links:i(t).socialLinks},null,8,["links"])):h("",!0)}}),Ds=b(Os,[["__scopeId","data-v-0394ad82"]]),Gs=["href","rel","target"],Ks=["innerHTML"],Rs={key:2},Us=m({__name:"VPNavBarTitle",setup(e){const{site:t,theme:n}=$(),{hasSidebar:a}=G(),{currentLang:s}=X(),r=p(()=>typeof n.value.logoLink=="string"?n.value.logoLink:n.value.logoLink?.link),d=p(()=>typeof n.value.logoLink=="string"?void 0:n.value.logoLink?.rel),l=p(()=>typeof n.value.logoLink=="string"?void 0:n.value.logoLink?.target);return(g,y)=>(o(),u("div",{class:P(["VPNavBarTitle",{"has-sidebar":i(a)}])},[f("a",{class:"title",href:r.value??i(me)(i(s).link),rel:d.value,target:l.value},[c(g.$slots,"nav-bar-title-before",{},void 0,!0),i(n).logo?(o(),k(ee,{key:0,class:"logo",image:i(n).logo},null,8,["image"])):h("",!0),i(n).siteTitle?(o(),u("span",{key:1,innerHTML:i(n).siteTitle},null,8,Ks)):i(n).siteTitle===void 0?(o(),u("span",Rs,L(i(t).title),1)):h("",!0),c(g.$slots,"nav-bar-title-after",{},void 0,!0)],8,Gs)],2))}}),js=b(Us,[["__scopeId","data-v-1e38c6bc"]]),Ws={class:"items"},zs={class:"title"},qs=m({__name:"VPNavBarTranslations",setup(e){const{theme:t}=$(),{localeLinks:n,currentLang:a}=X({correspondingLink:!0});return(s,r)=>i(n).length&&i(a).label?(o(),k(_e,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(t).langMenuLabel||"Change language"},{default:v(()=>[f("div",Ws,[f("p",zs,L(i(a).label),1),(o(!0),u(S,null,w(i(n),d=>(o(),k(oe,{key:d.link,item:d,lang:d.lang,hreflang:d.lang,rel:"alternate",dir:d.dir},null,8,["item","lang","hreflang","dir"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Js=b(qs,[["__scopeId","data-v-fafa8c23"]]),Ys={class:"wrapper"},Xs={class:"container"},Qs={class:"title"},Zs={class:"content"},eo={class:"content-body"},to=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(e){const{y:t}=Me(),{isHome:n,hasSidebar:a}=G();return(s,r)=>(o(),u("div",{class:P(["VPNavBar",{"has-sidebar":i(a),home:i(n),top:i(t)===0,"screen-open":e.isScreenOpen}])},[f("div",Ys,[f("div",Xs,[f("div",Qs,[_(js,null,{"nav-bar-title-before":v(()=>[c(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(s.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),f("div",Zs,[f("div",eo,[c(s.$slots,"nav-bar-content-before",{},void 0,!0),_(Fs,{class:"search"}),_(Ps,{class:"menu"}),_(Js,{class:"translations"}),_(Ia,{class:"appearance"}),_(Ds,{class:"social-links"}),_(fs,{class:"extra"}),c(s.$slots,"nav-bar-content-after",{},void 0,!0),_(ps,{class:"hamburger",active:e.isScreenOpen,onClick:r[0]||(r[0]=d=>s.$emit("toggle-screen"))},null,8,["active"])])])])]),r[1]||(r[1]=f("div",{class:"divider"},[f("div",{class:"divider-line"})],-1))],2))}}),no=b(to,[["__scopeId","data-v-9ca1369d"]]),ao={key:0,class:"VPNavScreenAppearance"},so={class:"text"},oo=m({__name:"VPNavScreenAppearance",setup(e){const{site:t,theme:n}=$();return(a,s)=>i(t).appearance&&i(t).appearance!=="force-dark"&&i(t).appearance!=="force-auto"?(o(),u("div",ao,[f("p",so,L(i(n).darkModeSwitchLabel||"Appearance"),1),_(ke)])):h("",!0)}}),ro=b(oo,[["__scopeId","data-v-b44890b2"]]),io=["innerHTML"],lo=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(e){const t=e,{page:n}=$(),a=p(()=>typeof t.item.link=="function"?t.item.link(n.value):t.item.link),s=p(()=>D(n.value.relativePath,t.item.activeMatch||a.value,!!t.item.activeMatch)),{closeScreen:r}=se(pe);return(d,l)=>(o(),k(B,{class:P({VPNavScreenMenuLink:!0,active:s.value}),href:a.value,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(r)},{default:v(()=>[f("span",{innerHTML:e.item.text},null,8,io)]),_:1},8,["class","href","target","rel","no-icon","onClick"]))}}),co=b(lo,[["__scopeId","data-v-b924ab8a"]]),uo=["innerHTML"],vo=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(e){const t=e,{page:n}=$(),a=p(()=>typeof t.item.link=="function"?t.item.link(n.value):t.item.link),s=p(()=>D(n.value.relativePath,t.item.activeMatch||a.value,!!t.item.activeMatch)),{closeScreen:r}=se(pe);return(d,l)=>(o(),k(B,{class:P({VPNavScreenMenuGroupLink:!0,active:s.value}),href:a.value,target:e.item.target,rel:e.item.rel,"no-icon":e.item.noIcon,onClick:i(r)},{default:v(()=>[f("span",{innerHTML:e.item.text},null,8,uo)]),_:1},8,["class","href","target","rel","no-icon","onClick"]))}}),Ge=b(vo,[["__scopeId","data-v-ecf4b472"]]),fo={class:"VPNavScreenMenuGroupSection"},ho={key:0,class:"title"},mo=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(e){return(t,n)=>(o(),u("div",fo,[e.text?(o(),u("p",ho,L(e.text),1)):h("",!0),(o(!0),u(S,null,w(e.items,a=>(o(),k(Ge,{key:a.text,item:a},null,8,["item"]))),128))]))}}),po=b(mo,[["__scopeId","data-v-4b7a798b"]]),ko=["aria-controls","aria-expanded"],go=["innerHTML"],_o=["id"],bo={key:0,class:"item"},$o={key:1,class:"item"},yo={key:2,class:"group"},Po=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(e){const t=e,n=V(!1),a=p(()=>`NavScreenGroup-${t.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(r,d)=>(o(),u("div",{class:P(["VPNavScreenMenuGroup",{open:n.value}])},[f("button",{class:"button","aria-controls":a.value,"aria-expanded":n.value,onClick:s},[f("span",{class:"button-text",innerHTML:e.text},null,8,go),d[0]||(d[0]=f("span",{class:"vpi-plus button-icon"},null,-1))],8,ko),f("div",{id:a.value,class:"items"},[(o(!0),u(S,null,w(e.items,l=>(o(),u(S,{key:JSON.stringify(l)},["link"in l?(o(),u("div",bo,[_(Ge,{item:l},null,8,["item"])])):"component"in l?(o(),u("div",$o,[(o(),k(C(l.component),O({ref_for:!0},l.props,{"screen-menu":""}),null,16))])):(o(),u("div",yo,[_(po,{text:l.text,items:l.items},null,8,["text","items"])]))],64))),128))],8,_o)],2))}}),Lo=b(Po,[["__scopeId","data-v-956364f9"]]),Vo={key:0,class:"VPNavScreenMenu"},So=m({__name:"VPNavScreenMenu",setup(e){const{theme:t}=$();return(n,a)=>i(t).nav?(o(),u("nav",Vo,[(o(!0),u(S,null,w(i(t).nav,s=>(o(),u(S,{key:JSON.stringify(s)},["link"in s?(o(),k(co,{key:0,item:s},null,8,["item"])):"component"in s?(o(),k(C(s.component),O({key:1,ref_for:!0},s.props,{"screen-menu":""}),null,16)):(o(),k(Lo,{key:2,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),No=m({__name:"VPNavScreenSocialLinks",setup(e){const{theme:t}=$();return(n,a)=>i(t).socialLinks?(o(),k(be,{key:0,class:"VPNavScreenSocialLinks",links:i(t).socialLinks},null,8,["links"])):h("",!0)}}),To={class:"list"},Ao=m({__name:"VPNavScreenTranslations",setup(e){const{localeLinks:t,currentLang:n}=X({correspondingLink:!0}),a=V(!1);function s(){a.value=!a.value}return(r,d)=>i(t).length&&i(n).label?(o(),u("div",{key:0,class:P(["VPNavScreenTranslations",{open:a.value}])},[f("button",{class:"title",onClick:s},[d[0]||(d[0]=f("span",{class:"vpi-languages icon lang"},null,-1)),U(" "+L(i(n).label)+" ",1),d[1]||(d[1]=f("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),f("ul",To,[(o(!0),u(S,null,w(i(t),l=>(o(),u("li",{key:l.link,class:"item"},[_(B,{class:"link",href:l.link,lang:l.lang,dir:l.dir},{default:v(()=>[U(L(l.text),1)]),_:2},1032,["href","lang","dir"])]))),128))])],2)):h("",!0)}}),Mo=b(Ao,[["__scopeId","data-v-a4d9b172"]]),wo={key:0,class:"VPNavScreen",id:"VPNavScreen"},Io={class:"container"},xo=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(e){const t=we(Y?document.body:null);return(n,a)=>(o(),k(ve,{name:"fade",onEnter:a[0]||(a[0]=s=>t.value=!0),onAfterLeave:a[1]||(a[1]=s=>t.value=!1)},{default:v(()=>[e.open?(o(),u("div",wo,[f("div",Io,[c(n.$slots,"nav-screen-content-before",{},void 0,!0),_(So,{class:"menu"}),_(Mo,{class:"translations"}),_(ro,{class:"appearance"}),_(No,{class:"social-links"}),c(n.$slots,"nav-screen-content-after",{},void 0,!0)])])):h("",!0)]),_:3}))}}),Ho=b(xo,[["__scopeId","data-v-05f3d7bc"]]),Co={key:0,class:"VPNav"},Bo=m({__name:"VPNav",setup(e){const{isScreenOpen:t,closeScreen:n,toggleScreen:a}=ya(),{frontmatter:s}=$(),r=p(()=>s.value.navbar!==!1);return Ie(pe,{closeScreen:n}),te(()=>{Y&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(d,l)=>r.value?(o(),u("header",Co,[_(no,{"is-screen-open":i(t),onToggleScreen:i(a)},{"nav-bar-title-before":v(()=>[c(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[c(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[c(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(Ho,{open:i(t)},{"nav-screen-content-before":v(()=>[c(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[c(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),Eo=b(Bo,[["__scopeId","data-v-9f75dce3"]]),Fo=["role","tabindex"],Oo={key:1,class:"items"},Do=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(e){const t=e,{collapsed:n,collapsible:a,isLink:s,isActiveLink:r,hasActiveLink:d,hasChildren:l,toggle:g}=Mt(p(()=>t.item)),y=p(()=>l.value?"section":"div"),N=p(()=>s.value?"a":"div"),A=p(()=>l.value?t.depth+2===7?"p":`h${t.depth+2}`:"p"),E=p(()=>s.value?void 0:"button"),I=p(()=>[[`level-${t.depth}`],{collapsible:a.value},{collapsed:n.value},{"is-link":s.value},{"is-active":r.value},{"has-active":d.value}]);function x(F){"key"in F&&F.key!=="Enter"||!t.item.link&&g()}function W(){t.item.link&&g()}return(F,z)=>{const T=j("VPSidebarItem",!0);return o(),k(C(y.value),{class:P(["VPSidebarItem",I.value])},{default:v(()=>[e.item.text?(o(),u("div",O({key:0,class:"item",role:E.value},Ze(e.item.items?{click:x,keydown:x}:{},!0),{tabindex:e.item.items&&0}),[z[1]||(z[1]=f("div",{class:"indicator"},null,-1)),e.item.link?(o(),k(B,{key:0,tag:N.value,class:"link",href:e.item.link,rel:e.item.rel,target:e.item.target},{default:v(()=>[(o(),k(C(A.value),{class:"text",innerHTML:e.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(o(),k(C(A.value),{key:1,class:"text",innerHTML:e.item.text},null,8,["innerHTML"])),e.item.collapsed!=null&&e.item.items&&e.item.items.length?(o(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:W,onKeydown:et(W,["enter"]),tabindex:"0"},[...z[0]||(z[0]=[f("span",{class:"vpi-chevron-right caret-icon"},null,-1)])],32)):h("",!0)],16,Fo)):h("",!0),e.item.items&&e.item.items.length?(o(),u("div",Oo,[e.depth<5?(o(!0),u(S,{key:0},w(e.item.items,M=>(o(),k(T,{key:M.text,item:M,depth:e.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),Go=b(Do,[["__scopeId","data-v-d81de50c"]]),Ko=m({__name:"VPSidebarGroup",props:{items:{}},setup(e){const t=V(!0);let n=null;return R(()=>{n=setTimeout(()=>{n=null,t.value=!1},300)}),tt(()=>{n!=null&&(clearTimeout(n),n=null)}),(a,s)=>(o(!0),u(S,null,w(e.items,r=>(o(),u("div",{key:r.text,class:P(["group",{"no-transition":t.value}])},[_(Go,{item:r,depth:0},null,8,["item"])],2))),128))}}),Ro=b(Ko,[["__scopeId","data-v-8d50c081"]]),Uo={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},jo=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(e){const{sidebarGroups:t,hasSidebar:n}=G(),a=e,s=V(null),r=we(Y?document.body:null);H([a,s],()=>{a.open?(r.value=!0,s.value?.focus()):r.value=!1},{immediate:!0,flush:"post"});const d=V(0);return H(t,()=>{d.value+=1},{deep:!0}),(l,g)=>i(n)?(o(),u("aside",{key:0,class:P(["VPSidebar",{open:e.open}]),ref_key:"navEl",ref:s,onClick:g[0]||(g[0]=nt(()=>{},["stop"]))},[g[2]||(g[2]=f("div",{class:"curtain"},null,-1)),f("nav",Uo,[g[1]||(g[1]=f("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(l.$slots,"sidebar-nav-before",{},void 0,!0),(o(),k(Ro,{items:i(t),key:d.value},null,8,["items"])),c(l.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),Wo=b(jo,[["__scopeId","data-v-af661f50"]]),zo={href:"#VPContent",class:"VPSkipLink visually-hidden"},qo=m({__name:"VPSkipLink",setup(e){const{theme:t}=$(),n=ne(),a=V();return H(()=>n.path,()=>a.value.focus()),(s,r)=>(o(),u(S,null,[f("span",{ref_key:"backToTop",ref:a,tabindex:"-1"},null,512),f("a",zo,L(i(t).skipToContentLabel||"Skip to content"),1)],64))}}),Jo=b(qo,[["__scopeId","data-v-331ec75c"]]),Yo=m({__name:"Layout",setup(e){const{isOpen:t,open:n,close:a}=At();wt({closeSidebar:a});const{frontmatter:s}=$(),r=at(),d=p(()=>!!r["home-hero-image"]);return Ie(Ce,{heroImageSlotExists:d}),(l,g)=>{const y=j("Content");return i(s).layout!==!1?(o(),u("div",{key:0,class:P(["Layout",i(s).pageClass])},[c(l.$slots,"layout-top",{},void 0,!0),_(Jo),_(it,{class:"backdrop",show:i(t),onClick:i(a)},null,8,["show","onClick"]),_(Eo,null,{"nav-bar-title-before":v(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_($a,{open:i(t),onOpenMenu:i(n)},null,8,["open","onOpenMenu"]),_(Wo,{open:i(t)},{"sidebar-nav-before":v(()=>[c(l.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[c(l.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(ra,null,{"page-top":v(()=>[c(l.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[c(l.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[c(l.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[c(l.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":v(()=>[c(l.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":v(()=>[c(l.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":v(()=>[c(l.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":v(()=>[c(l.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-actions-before-actions":v(()=>[c(l.$slots,"home-hero-actions-before-actions",{},void 0,!0)]),"home-hero-image":v(()=>[c(l.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[c(l.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[c(l.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[c(l.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[c(l.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[c(l.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[c(l.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[c(l.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[c(l.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[c(l.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[c(l.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[c(l.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[c(l.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[c(l.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[c(l.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(da),c(l.$slots,"layout-bottom",{},void 0,!0)],2)):(o(),k(y,{key:1}))}}}),Xo=b(Yo,[["__scopeId","data-v-0cf61682"]]),Zo={Layout:Xo,enhanceApp:({app:e})=>{e.component("Badge",st)}};export{Zo as t,$ as u};
|
package/docs-dist/assets/{guide_architecture.md.CzgqynmB.js → guide_architecture.md.SHnKkzwb.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{c as i,S as a,j as n,m as h}from"./chunks/framework.BUY3a635.js";const y=JSON.parse('{"title":"代码架构说明","description":"","frontmatter":{},"headers":[],"relativePath":"guide/architecture.md","filePath":"guide/architecture.md","lastUpdated":1779031768000}'),k={name:"guide/architecture.md"};function l(p,s,t,e,r,d){return a(),n("div",null,[...s[0]||(s[0]=[h(`<h1 id="代码架构说明" tabindex="-1">代码架构说明 <a class="header-anchor" href="#代码架构说明" aria-label="Permalink to “代码架构说明”"></a></h1><p>本文档介绍项目的代码架构和抽象设计。</p><h2 id="代码抽象" tabindex="-1">代码抽象 <a class="header-anchor" href="#代码抽象" aria-label="Permalink to “代码抽象”"></a></h2><p>为了提高代码的可维护性和开发效率,项目进行了以下代码抽象:</p><h3 id="_1-统一的-api-类型定义" tabindex="-1">1. 统一的 API 类型定义 <a class="header-anchor" href="#_1-统一的-api-类型定义" aria-label="Permalink to “1. 统一的 API 类型定义”"></a></h3><p><strong>文件位置</strong>: <a href="../../types/api.ts"><code>types/api.ts</code></a></p><p>定义了项目中所有 API 函数使用的通用类型:</p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// API 响应结构</span></span>
|
|
2
2
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> interface</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> ApiResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
|
|
3
3
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> status</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">number</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
4
4
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> body</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: {</span></span>
|
|
@@ -24,15 +24,15 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
24
24
|
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// API 函数类型定义</span></span>
|
|
25
25
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> type</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> ApiFunction</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"><</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">T</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> extends</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">></span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> (</span></span>
|
|
26
26
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> options</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">T</span></span>
|
|
27
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =></span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> Promise</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"><</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">ApiResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">>;</span></span></code></pre></div><p><strong>优势</strong>:</p><ul><li>✅ 单一事实来源,避免重复定义</li><li>✅ 类型安全,减少类型错误</li><li>✅ 易于维护和修改</li></ul><h3 id="_2-api-响应工具函数" tabindex="-1">2. API 响应工具函数 <a class="header-anchor" href="#_2-api-响应工具函数" aria-label="Permalink to
|
|
27
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =></span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> Promise</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"><</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">ApiResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">>;</span></span></code></pre></div><p><strong>优势</strong>:</p><ul><li>✅ 单一事实来源,避免重复定义</li><li>✅ 类型安全,减少类型错误</li><li>✅ 易于维护和修改</li></ul><h3 id="_2-api-响应工具函数" tabindex="-1">2. API 响应工具函数 <a class="header-anchor" href="#_2-api-响应工具函数" aria-label="Permalink to “2. API 响应工具函数”"></a></h3><p><strong>文件位置</strong>: <a href="../../util/apiResponse.ts"><code>util/apiResponse.ts</code></a></p><p>提供了统一的 API 响应处理工具:</p><h4 id="successresponse-data-status" tabindex="-1"><code>successResponse(data, status?)</code> <a class="header-anchor" href="#successresponse-data-status" aria-label="Permalink to “successResponse(data, status?)”"></a></h4><p>创建成功的 API 响应</p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> successResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./util/apiResponse</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
28
28
|
<span class="line"></span>
|
|
29
29
|
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 使用示例</span></span>
|
|
30
30
|
<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">const </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">response</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> successResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">({ </span><span style="--shiki-light:#998418;--shiki-dark:#B8A965;">id</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;">1</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">, </span><span style="--shiki-light:#998418;--shiki-dark:#B8A965;">name</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">test</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> });</span></span>
|
|
31
|
-
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 返回:{ status: 200, body: { response: { id: 1, name: 'test' } } }</span></span></code></pre></div><h4 id="errorresponse-error-status" tabindex="-1"><code>errorResponse(error, status?)</code> <a class="header-anchor" href="#errorresponse-error-status" aria-label="Permalink to
|
|
31
|
+
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 返回:{ status: 200, body: { response: { id: 1, name: 'test' } } }</span></span></code></pre></div><h4 id="errorresponse-error-status" tabindex="-1"><code>errorResponse(error, status?)</code> <a class="header-anchor" href="#errorresponse-error-status" aria-label="Permalink to “errorResponse(error, status?)”"></a></h4><p>创建错误的 API 响应</p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> errorResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./util/apiResponse</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
32
32
|
<span class="line"></span>
|
|
33
33
|
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 使用示例</span></span>
|
|
34
34
|
<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">const </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">response</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> errorResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">Not found</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;"> 404</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
|
|
35
|
-
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 返回:{ status: 404, body: { error: 'Not found' } }</span></span></code></pre></div><h4 id="handleapi-promise-options" tabindex="-1"><code>handleApi(promise, options?)</code> <a class="header-anchor" href="#handleapi-promise-options" aria-label="Permalink to
|
|
35
|
+
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 返回:{ status: 404, body: { error: 'Not found' } }</span></span></code></pre></div><h4 id="handleapi-promise-options" tabindex="-1"><code>handleApi(promise, options?)</code> <a class="header-anchor" href="#handleapi-promise-options" aria-label="Permalink to “handleApi(promise, options?)”"></a></h4><p>处理 API Promise,自动包装成功和错误响应</p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> handleApi</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./util/apiResponse</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
36
36
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> request</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./request</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
37
37
|
<span class="line"></span>
|
|
38
38
|
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 基本使用</span></span>
|
|
@@ -57,7 +57,7 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
57
57
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
58
58
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
59
59
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> );</span></span>
|
|
60
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><p><strong>优势</strong>:</p><ul><li>✅ 消除重复的 try-catch 代码</li><li>✅ 统一的错误处理</li><li>✅ 代码更简洁,每个 API 文件减少约 15-20 行代码</li></ul><h3 id="_3-controller-工厂函数" tabindex="-1">3. Controller 工厂函数 <a class="header-anchor" href="#_3-controller-工厂函数" aria-label="Permalink to
|
|
60
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><p><strong>优势</strong>:</p><ul><li>✅ 消除重复的 try-catch 代码</li><li>✅ 统一的错误处理</li><li>✅ 代码更简洁,每个 API 文件减少约 15-20 行代码</li></ul><h3 id="_3-controller-工厂函数" tabindex="-1">3. Controller 工厂函数 <a class="header-anchor" href="#_3-controller-工厂函数" aria-label="Permalink to “3. Controller 工厂函数”"></a></h3><p><strong>文件位置</strong>: <a href="../../routers/util.ts"><code>routers/util.ts</code></a></p><p>提供了创建 Controller 的工厂函数:</p><h4 id="createcontroller-apifunction-options" tabindex="-1"><code>createController(apiFunction, options?)</code> <a class="header-anchor" href="#createcontroller-apifunction-options" aria-label="Permalink to “createController(apiFunction, options?)”"></a></h4><p>创建 GET 请求的 Controller</p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> createController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> validateRequired</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./util</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
61
61
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> getSingerDesc</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../module</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
62
62
|
<span class="line"></span>
|
|
63
63
|
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 基本使用</span></span>
|
|
@@ -70,17 +70,17 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
70
70
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> validator</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">validateRequired</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">([</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">singermid</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">]),</span></span>
|
|
71
71
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> errorMessage</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">缺少 singermid 参数</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span></span>
|
|
72
72
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
73
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><h4 id="createpostcontroller-apifunction-options" tabindex="-1"><code>createPostController(apiFunction, options?)</code> <a class="header-anchor" href="#createpostcontroller-apifunction-options" aria-label="Permalink to
|
|
73
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><h4 id="createpostcontroller-apifunction-options" tabindex="-1"><code>createPostController(apiFunction, options?)</code> <a class="header-anchor" href="#createpostcontroller-apifunction-options" aria-label="Permalink to “createPostController(apiFunction, options?)”"></a></h4><p>创建 POST 请求的 Controller</p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> createPostController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./util</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
74
74
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> batchGetSongLists</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../module</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
75
75
|
<span class="line"></span>
|
|
76
|
-
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> default</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> createPostController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">batchGetSongLists</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><h4 id="validaterequired-fields" tabindex="-1"><code>validateRequired(fields)</code> <a class="header-anchor" href="#validaterequired-fields" aria-label="Permalink to
|
|
76
|
+
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> default</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> createPostController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">batchGetSongLists</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><h4 id="validaterequired-fields" tabindex="-1"><code>validateRequired(fields)</code> <a class="header-anchor" href="#validaterequired-fields" aria-label="Permalink to “validateRequired(fields)”"></a></h4><p>参数验证工具</p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> createController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> validateRequired</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./util</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
77
77
|
<span class="line"></span>
|
|
78
78
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> default</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> createController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span></span>
|
|
79
79
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> someApiFunction</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span></span>
|
|
80
80
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
|
|
81
81
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> validator</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">validateRequired</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">([</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">singermid</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">, </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">songmid</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">])</span></span>
|
|
82
82
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
83
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><p><strong>优势</strong>:</p><ul><li>✅ 减少 Controller 代码重复</li><li>✅ 统一的错误处理</li><li>✅ 参数验证标准化</li></ul><h3 id="_4-统一的全局类型" tabindex="-1">4. 统一的全局类型 <a class="header-anchor" href="#_4-统一的全局类型" aria-label="Permalink to
|
|
83
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><p><strong>优势</strong>:</p><ul><li>✅ 减少 Controller 代码重复</li><li>✅ 统一的错误处理</li><li>✅ 参数验证标准化</li></ul><h3 id="_4-统一的全局类型" tabindex="-1">4. 统一的全局类型 <a class="header-anchor" href="#_4-统一的全局类型" aria-label="Permalink to “4. 统一的全局类型”"></a></h3><p><strong>文件位置</strong>: <a href="../../types/global.d.ts"><code>types/global.d.ts</code></a></p><p>定义了全局 <code>userInfo</code> 对象的类型:</p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> interface</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> UserInfo</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
|
|
84
84
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> loginUin</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">string</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
85
85
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> uin</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">?</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">string</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
86
86
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> cookie</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">string</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
@@ -92,7 +92,7 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
92
92
|
<span class="line"></span>
|
|
93
93
|
<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">declare</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> global</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
|
|
94
94
|
<span class="line"><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> var </span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">userInfo</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">UserInfo</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
95
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre></div><p><strong>优势</strong>:</p><ul><li>✅ 类型定义集中管理</li><li>✅ 避免类型冲突</li><li>✅ 全局类型安全</li></ul><h2 id="重构前后对比" tabindex="-1">重构前后对比 <a class="header-anchor" href="#重构前后对比" aria-label="Permalink to
|
|
95
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">}</span></span></code></pre></div><p><strong>优势</strong>:</p><ul><li>✅ 类型定义集中管理</li><li>✅ 避免类型冲突</li><li>✅ 全局类型安全</li></ul><h2 id="重构前后对比" tabindex="-1">重构前后对比 <a class="header-anchor" href="#重构前后对比" aria-label="Permalink to “重构前后对比”"></a></h2><h3 id="重构前-旧代码" tabindex="-1">重构前(旧代码) <a class="header-anchor" href="#重构前-旧代码" aria-label="Permalink to “重构前(旧代码)”"></a></h3><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> request</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../util/request</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
96
96
|
<span class="line"></span>
|
|
97
97
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> interface</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
|
|
98
98
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> method</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;">?</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">string</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
@@ -141,7 +141,7 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
141
141
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
142
142
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> };</span></span>
|
|
143
143
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> });</span></span>
|
|
144
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><p><strong>代码行数</strong>: 约 35 行</p><h3 id="重构后-新代码" tabindex="-1">重构后(新代码) <a class="header-anchor" href="#重构后-新代码" aria-label="Permalink to
|
|
144
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><p><strong>代码行数</strong>: 约 35 行</p><h3 id="重构后-新代码" tabindex="-1">重构后(新代码) <a class="header-anchor" href="#重构后-新代码" aria-label="Permalink to “重构后(新代码)”"></a></h3><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> request</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../util/request</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
145
145
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> handleApi</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../util/apiResponse</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
146
146
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> type</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../types/api</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
147
147
|
<span class="line"></span>
|
|
@@ -162,7 +162,7 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
162
162
|
<span class="line"><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> options</span></span>
|
|
163
163
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> })</span></span>
|
|
164
164
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> );</span></span>
|
|
165
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><p><strong>代码行数</strong>: 约 18 行</p><p><strong>改进</strong>:</p><ul><li>✅ 减少 17 行代码(减少约 48%)</li><li>✅ 移除重复的类型定义</li><li>✅ 移除重复的 try-catch 逻辑</li><li>✅ 使用 async/await 语法更清晰</li></ul><h2 id="controller-重构示例" tabindex="-1">Controller 重构示例 <a class="header-anchor" href="#controller-重构示例" aria-label="Permalink to
|
|
165
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><p><strong>代码行数</strong>: 约 18 行</p><p><strong>改进</strong>:</p><ul><li>✅ 减少 17 行代码(减少约 48%)</li><li>✅ 移除重复的类型定义</li><li>✅ 移除重复的 try-catch 逻辑</li><li>✅ 使用 async/await 语法更清晰</li></ul><h2 id="controller-重构示例" tabindex="-1">Controller 重构示例 <a class="header-anchor" href="#controller-重构示例" aria-label="Permalink to “Controller 重构示例”"></a></h2><h3 id="重构前" tabindex="-1">重构前 <a class="header-anchor" href="#重构前" aria-label="Permalink to “重构前”"></a></h3><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> Context</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> Next</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">koa</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
166
166
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> getSingerDesc</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../module</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
167
167
|
<span class="line"></span>
|
|
168
168
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> default</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> async</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> (</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">ctx</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">Context</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> next</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">Next</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =></span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
|
|
@@ -184,7 +184,7 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
184
184
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> response</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">no singermid</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span></span>
|
|
185
185
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> };</span></span>
|
|
186
186
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
187
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><h3 id="重构后" tabindex="-1">重构后 <a class="header-anchor" href="#重构后" aria-label="Permalink to
|
|
187
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><h3 id="重构后" tabindex="-1">重构后 <a class="header-anchor" href="#重构后" aria-label="Permalink to “重构后”"></a></h3><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> createController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> validateRequired</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./util</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
188
188
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> getSingerDesc</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../module</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
189
189
|
<span class="line"></span>
|
|
190
190
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> default</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> createController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span></span>
|
|
@@ -193,7 +193,7 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
193
193
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> validator</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">validateRequired</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">([</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">singermid</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">]),</span></span>
|
|
194
194
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> errorMessage</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">no singermid</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span></span>
|
|
195
195
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
196
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><p><strong>改进</strong>:</p><ul><li>✅ 从 25 行减少到 8 行</li><li>✅ 参数验证逻辑抽象</li><li>✅ 错误处理统一</li></ul><h2 id="已重构的文件" tabindex="-1">已重构的文件 <a class="header-anchor" href="#已重构的文件" aria-label="Permalink to
|
|
196
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><p><strong>改进</strong>:</p><ul><li>✅ 从 25 行减少到 8 行</li><li>✅ 参数验证逻辑抽象</li><li>✅ 错误处理统一</li></ul><h2 id="已重构的文件" tabindex="-1">已重构的文件 <a class="header-anchor" href="#已重构的文件" aria-label="Permalink to “已重构的文件”"></a></h2><h3 id="module-apis-目录-16-个文件" tabindex="-1">Module/APIs 目录(16 个文件) <a class="header-anchor" href="#module-apis-目录-16-个文件" aria-label="Permalink to “Module/APIs 目录(16 个文件)”"></a></h3><ul><li><code>module/apis/singers/getSimilarSinger.ts</code></li><li><code>module/apis/singers/getSingerDesc.ts</code></li><li><code>module/apis/singers/getSingerMv.ts</code></li><li><code>module/apis/singers/getSingerStarNum.ts</code></li><li><code>module/apis/radio/getRadioLists.ts</code></li><li><code>module/apis/rank/getTopLists.ts</code></li><li><code>module/apis/music/getLyric.ts</code></li><li><code>module/apis/mv/getMvByTag.ts</code></li><li><code>module/apis/digitalAlbum/getDigitalAlbumLists.ts</code></li><li><code>module/apis/search/getHotKey.ts</code></li><li><code>module/apis/search/getSearchByKey.ts</code></li><li><code>module/apis/songLists/songLists.ts</code></li><li><code>module/apis/songLists/songListCategories.ts</code></li><li><code>module/apis/songLists/songListDetail.ts</code></li><li><code>module/apis/album/getAlbumInfo.ts</code></li><li><code>module/apis/comments/getComments.ts</code></li></ul><h3 id="routers-context-目录-部分文件" tabindex="-1">Routers/Context 目录(部分文件) <a class="header-anchor" href="#routers-context-目录-部分文件" aria-label="Permalink to “Routers/Context 目录(部分文件)”"></a></h3><ul><li><code>routers/context/getDownloadQQMusic.ts</code></li><li><code>routers/context/getSmartbox.ts</code></li><li><code>routers/context/cookies.ts</code></li></ul><h3 id="其他文件" tabindex="-1">其他文件 <a class="header-anchor" href="#其他文件" aria-label="Permalink to “其他文件”"></a></h3><ul><li><code>routers/types.ts</code> - 移除重复类型定义</li><li><code>config/user-info.ts</code> - 统一类型定义</li><li><code>app.ts</code> - 类型修复</li><li><code>module/config.ts</code> - 类型修复</li></ul><h2 id="统计" tabindex="-1">统计 <a class="header-anchor" href="#统计" aria-label="Permalink to “统计”"></a></h2><ul><li><strong>代码量减少</strong>: 约 30-40% 的重复代码被移除</li><li><strong>类型安全</strong>: 统一的类型定义减少类型错误</li><li><strong>可维护性</strong>: 类型定义集中,易于修改</li><li><strong>开发效率</strong>: 新增 API 时代码更简洁</li></ul><h2 id="最佳实践" tabindex="-1">最佳实践 <a class="header-anchor" href="#最佳实践" aria-label="Permalink to “最佳实践”"></a></h2><h3 id="_1-创建新的-api-函数" tabindex="-1">1. 创建新的 API 函数 <a class="header-anchor" href="#_1-创建新的-api-函数" aria-label="Permalink to “1. 创建新的 API 函数”"></a></h3><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> request</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../util/request</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
197
197
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> handleApi</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../util/apiResponse</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
198
198
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> type</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../types/api</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
199
199
|
<span class="line"></span>
|
|
@@ -221,7 +221,7 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
221
221
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
222
222
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
223
223
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> );</span></span>
|
|
224
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><h3 id="_2-创建新的-controller" tabindex="-1">2. 创建新的 Controller <a class="header-anchor" href="#_2-创建新的-controller" aria-label="Permalink to
|
|
224
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><h3 id="_2-创建新的-controller" tabindex="-1">2. 创建新的 Controller <a class="header-anchor" href="#_2-创建新的-controller" aria-label="Permalink to “2. 创建新的 Controller”"></a></h3><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> createController</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> validateRequired</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">./util</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
225
225
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> someApiFunction</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../module</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
226
226
|
<span class="line"></span>
|
|
227
227
|
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 简单情况</span></span>
|
|
@@ -234,7 +234,7 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
234
234
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> validator</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">validateRequired</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">([</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">requiredParam1</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">, </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">requiredParam2</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">]),</span></span>
|
|
235
235
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> errorMessage</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">缺少必需参数</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span></span>
|
|
236
236
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
237
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><h3 id="_3-处理特殊响应" tabindex="-1">3. 处理特殊响应 <a class="header-anchor" href="#_3-处理特殊响应" aria-label="Permalink to
|
|
237
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span></code></pre></div><h3 id="_3-处理特殊响应" tabindex="-1">3. 处理特殊响应 <a class="header-anchor" href="#_3-处理特殊响应" aria-label="Permalink to “3. 处理特殊响应”"></a></h3><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> handleApi</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">,</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> customResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../util/apiResponse</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
238
238
|
<span class="line"></span>
|
|
239
239
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> default</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> async</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> (</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;">options</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;">ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">)</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> =></span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
|
|
240
240
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> try</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span></span>
|
|
@@ -247,12 +247,12 @@ import{_ as i,o as a,c as n,ag as h}from"./chunks/framework.aJbMEiY9.js";const y
|
|
|
247
247
|
<span class="line"><span style="--shiki-light:#998418;--shiki-dark:#B8A965;"> code</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">: </span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">CUSTOM_ERROR</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span></span>
|
|
248
248
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> },</span><span style="--shiki-light:#2F798A;--shiki-dark:#4C9A91;"> 500</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">);</span></span>
|
|
249
249
|
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
250
|
-
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><h2 id="迁移指南" tabindex="-1">迁移指南 <a class="header-anchor" href="#迁移指南" aria-label="Permalink to
|
|
250
|
+
<span class="line"><span style="--shiki-light:#999999;--shiki-dark:#666666;">};</span></span></code></pre></div><h2 id="迁移指南" tabindex="-1">迁移指南 <a class="header-anchor" href="#迁移指南" aria-label="Permalink to “迁移指南”"></a></h2><p>如果你需要将旧的 API 文件迁移到新的架构:</p><ol><li><p><strong>移除重复的类型定义</strong></p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 删除这些定义</span></span>
|
|
251
251
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> interface</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> ...</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span>
|
|
252
|
-
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> interface</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> ApiResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> ...</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span></code></pre></div></li><li><p><strong>导入统一的类型和工具</strong></p><div class="language-typescript
|
|
253
|
-
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> type</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../types/api</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span></code></pre></div></li><li><p><strong>重构为 async/await 语法</strong></p><div class="language-typescript
|
|
252
|
+
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">export</span><span style="--shiki-light:#AB5959;--shiki-dark:#CB7676;"> interface</span><span style="--shiki-light:#2E8F82;--shiki-dark:#5DA994;"> ApiResponse</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> ...</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span></span></code></pre></div></li><li><p><strong>导入统一的类型和工具</strong></p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> handleApi</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../util/apiResponse</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span>
|
|
253
|
+
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">import</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> type</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> {</span><span style="--shiki-light:#B07D48;--shiki-dark:#BD976A;"> ApiOptions</span><span style="--shiki-light:#999999;--shiki-dark:#666666;"> }</span><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;"> from</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;"> '</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;">../../../types/api</span><span style="--shiki-light:#B5695977;--shiki-dark:#C98A7D77;">'</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">;</span></span></code></pre></div></li><li><p><strong>重构为 async/await 语法</strong></p><div class="language-typescript"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 旧代码</span></span>
|
|
254
254
|
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">return</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> request</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(...).</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">then</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(...).</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">catch</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(...);</span></span>
|
|
255
255
|
<span class="line"></span>
|
|
256
256
|
<span class="line"><span style="--shiki-light:#A0ADA0;--shiki-dark:#758575DD;">// 新代码</span></span>
|
|
257
|
-
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">return</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> handleApi</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">request</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(...));</span></span></code></pre></div></li><li><p><strong>测试验证</strong></p><div class="language-bash
|
|
258
|
-
<span class="line"><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">npm</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;"> run</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;"> dev</span></span></code></pre></div></li></ol><h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to
|
|
257
|
+
<span class="line"><span style="--shiki-light:#1E754F;--shiki-dark:#4D9375;">return</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;"> handleApi</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(</span><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">request</span><span style="--shiki-light:#999999;--shiki-dark:#666666;">(...));</span></span></code></pre></div></li><li><p><strong>测试验证</strong></p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes vitesse-light vitesse-dark" style="--shiki-light:#393a34;--shiki-dark:#dbd7caee;--shiki-light-bg:#ffffff;--shiki-dark-bg:#121212;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">npx</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;"> tsc</span><span style="--shiki-light:#A65E2B;--shiki-dark:#C99076;"> --noEmit</span></span>
|
|
258
|
+
<span class="line"><span style="--shiki-light:#59873A;--shiki-dark:#80A665;">npm</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;"> run</span><span style="--shiki-light:#B56959;--shiki-dark:#C98A7D;"> dev</span></span></code></pre></div></li></ol><h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to “总结”"></a></h2><p>通过代码抽象,我们实现了:</p><ul><li>✅ <strong>统一的类型系统</strong> - 所有 API 使用相同的类型定义</li><li>✅ <strong>一致的错误处理</strong> - 统一的 try-catch 模式</li><li>✅ <strong>简洁的代码结构</strong> - 减少 30-40% 的重复代码</li><li>✅ <strong>更好的可维护性</strong> - 类型定义集中管理</li><li>✅ <strong>更高的开发效率</strong> - 新增 API 时代码更简洁</li></ul><p>这些改进使得项目更易于维护和扩展,同时也提高了开发效率。</p>`,83)])])}const o=i(k,[["render",l]]);export{y as __pageData,o as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as i,S as a,j as n,m as h}from"./chunks/framework.BUY3a635.js";const y=JSON.parse('{"title":"代码架构说明","description":"","frontmatter":{},"headers":[],"relativePath":"guide/architecture.md","filePath":"guide/architecture.md","lastUpdated":1779031768000}'),k={name:"guide/architecture.md"};function l(p,s,t,e,r,d){return a(),n("div",null,[...s[0]||(s[0]=[h("",83)])])}const o=i(k,[["render",l]]);export{y as __pageData,o as default};
|