[{"data":1,"prerenderedAt":1680},["ShallowReactive",2],{"navigation":3,"docs-path-index":340,"-docs-modules-client-overview":446,"-docs-modules-client-overview-surround":1675},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":64},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,30,65,293,318],{"title":11,"path":12,"stem":13,"children":14,"icon":29},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21,25],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples",{"title":26,"path":27,"stem":28},"Project Generator","\u002Fdocs\u002Fgetting-started\u002Fproject-generator","docs\u002F1.getting-started\u002F4.project-generator","i-lucide-rocket",{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":64},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[36,40,44,48,52,56,60],{"title":37,"path":38,"stem":39},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":41,"path":42,"stem":43},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":45,"path":46,"stem":47},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":49,"path":50,"stem":51},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":53,"path":54,"stem":55},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",{"title":57,"path":58,"stem":59},"Introspection","\u002Fdocs\u002Fcore-features\u002Fintrospection","docs\u002F2.core-features\u002F5.introspection",{"title":61,"path":62,"stem":63},"Health Checks","\u002Fdocs\u002Fcore-features\u002Fhealth","docs\u002F2.core-features\u002F6.health",false,{"title":66,"icon":67,"defaultOpen":68,"path":69,"stem":70,"children":71,"page":64},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[72,89,100,116,135,154,177,191,206,214,229,240,255,274,282],{"title":73,"icon":64,"defaultOpen":64,"path":74,"stem":75,"children":76,"page":64},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[77,81,85],{"title":78,"path":79,"stem":80},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":82,"path":83,"stem":84},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":86,"path":87,"stem":88},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":90,"icon":64,"defaultOpen":64,"path":91,"stem":92,"children":93,"page":64},"Devtools","\u002Fdocs\u002Fmodules\u002Fdevtools","docs\u002F3.modules\u002F10.devtools",[94,97],{"title":78,"path":95,"stem":96},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Foverview","docs\u002F3.modules\u002F10.devtools\u002F0.overview",{"title":37,"path":98,"stem":99},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Fconfiguration","docs\u002F3.modules\u002F10.devtools\u002F1.configuration",{"title":101,"icon":64,"defaultOpen":64,"path":102,"stem":103,"children":104,"page":64},"Telemetry","\u002Fdocs\u002Fmodules\u002Ftelemetry","docs\u002F3.modules\u002F11.telemetry",[105,108,112],{"title":78,"path":106,"stem":107},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Foverview","docs\u002F3.modules\u002F11.telemetry\u002F0.overview",{"title":109,"path":110,"stem":111},"API","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Fapi","docs\u002F3.modules\u002F11.telemetry\u002F1.api",{"title":113,"path":114,"stem":115},"Instrumentation","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Finstrumentation","docs\u002F3.modules\u002F11.telemetry\u002F2.instrumentation",{"title":117,"icon":64,"defaultOpen":64,"path":118,"stem":119,"children":120,"page":64},"Queue","\u002Fdocs\u002Fmodules\u002Fqueue","docs\u002F3.modules\u002F12.queue",[121,124,128,132],{"title":78,"path":122,"stem":123},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Foverview","docs\u002F3.modules\u002F12.queue\u002F0.overview",{"title":125,"path":126,"stem":127},"Consumers","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fconsumers","docs\u002F3.modules\u002F12.queue\u002F1.consumers",{"title":129,"path":130,"stem":131},"Strategies","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fstrategies","docs\u002F3.modules\u002F12.queue\u002F2.strategies",{"title":109,"path":133,"stem":134},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Fapi","docs\u002F3.modules\u002F12.queue\u002F3.api",{"title":136,"icon":64,"defaultOpen":64,"path":137,"stem":138,"children":139,"page":64},"Scheduler","\u002Fdocs\u002Fmodules\u002Fscheduler","docs\u002F3.modules\u002F13.scheduler",[140,143,147,151],{"title":78,"path":141,"stem":142},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Foverview","docs\u002F3.modules\u002F13.scheduler\u002F0.overview",{"title":144,"path":145,"stem":146},"Jobs","\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fjobs","docs\u002F3.modules\u002F13.scheduler\u002F1.jobs",{"title":148,"path":149,"stem":150},"Clustering","\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fclustering","docs\u002F3.modules\u002F13.scheduler\u002F2.clustering",{"title":109,"path":152,"stem":153},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fapi","docs\u002F3.modules\u002F13.scheduler\u002F3.api",{"title":155,"icon":64,"defaultOpen":64,"path":156,"stem":157,"children":158,"page":64},"Testing","\u002Fdocs\u002Fmodules\u002Ftesting","docs\u002F3.modules\u002F14.testing",[159,162,166,170,174],{"title":78,"path":160,"stem":161},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Foverview","docs\u002F3.modules\u002F14.testing\u002F0.overview",{"title":163,"path":164,"stem":165},"Requests","\u002Fdocs\u002Fmodules\u002Ftesting\u002Frequests","docs\u002F3.modules\u002F14.testing\u002F1.requests",{"title":167,"path":168,"stem":169},"Dependencies","\u002Fdocs\u002Fmodules\u002Ftesting\u002Fdependencies","docs\u002F3.modules\u002F14.testing\u002F2.dependencies",{"title":171,"path":172,"stem":173},"Extensions","\u002Fdocs\u002Fmodules\u002Ftesting\u002Fextensions","docs\u002F3.modules\u002F14.testing\u002F3.extensions",{"title":109,"path":175,"stem":176},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Fapi","docs\u002F3.modules\u002F14.testing\u002F4.api",{"title":178,"icon":64,"defaultOpen":64,"path":179,"stem":180,"children":181,"page":64},"Client","\u002Fdocs\u002Fmodules\u002Fclient","docs\u002F3.modules\u002F15.client",[182,185,188],{"title":78,"path":183,"stem":184},"\u002Fdocs\u002Fmodules\u002Fclient\u002Foverview","docs\u002F3.modules\u002F15.client\u002F0.overview",{"title":163,"path":186,"stem":187},"\u002Fdocs\u002Fmodules\u002Fclient\u002Frequests","docs\u002F3.modules\u002F15.client\u002F1.requests",{"title":109,"path":189,"stem":190},"\u002Fdocs\u002Fmodules\u002Fclient\u002Fapi","docs\u002F3.modules\u002F15.client\u002F2.api",{"title":192,"icon":64,"defaultOpen":64,"path":193,"stem":194,"children":195,"page":64},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[196,199,203],{"title":78,"path":197,"stem":198},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":200,"path":201,"stem":202},"Drains & Adapters","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":109,"path":204,"stem":205},"\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":207,"icon":64,"defaultOpen":64,"path":208,"stem":209,"children":210,"page":64},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[211],{"title":78,"path":212,"stem":213},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":215,"icon":64,"defaultOpen":64,"path":216,"stem":217,"children":218,"page":64},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[219,222,226],{"title":78,"path":220,"stem":221},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":223,"path":224,"stem":225},"Drivers","\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":109,"path":227,"stem":228},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":230,"icon":64,"defaultOpen":64,"path":231,"stem":232,"children":233,"page":64},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[234,237],{"title":78,"path":235,"stem":236},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":109,"path":238,"stem":239},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":241,"icon":64,"defaultOpen":64,"path":242,"stem":243,"children":244,"page":64},"Schema","\u002Fdocs\u002Fmodules\u002Fschema","docs\u002F3.modules\u002F6.schema",[245,248,251],{"title":78,"path":246,"stem":247},"\u002Fdocs\u002Fmodules\u002Fschema\u002Foverview","docs\u002F3.modules\u002F6.schema\u002F0.overview",{"title":82,"path":249,"stem":250},"\u002Fdocs\u002Fmodules\u002Fschema\u002Fdecorators","docs\u002F3.modules\u002F6.schema\u002F1.decorators",{"title":252,"path":253,"stem":254},"Scalar","\u002Fdocs\u002Fmodules\u002Fschema\u002Fscalar","docs\u002F3.modules\u002F6.schema\u002F2.scalar",{"title":256,"icon":64,"defaultOpen":64,"path":257,"stem":258,"children":259,"page":64},"Nitro","\u002Fdocs\u002Fmodules\u002Fnitro","docs\u002F3.modules\u002F7.nitro",[260,263,266,270],{"title":78,"path":261,"stem":262},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Foverview","docs\u002F3.modules\u002F7.nitro\u002F0.overview",{"title":215,"path":264,"stem":265},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Fstorage","docs\u002F3.modules\u002F7.nitro\u002F1.storage",{"title":267,"path":268,"stem":269},"File-Based Routes","\u002Fdocs\u002Fmodules\u002Fnitro\u002Ffile-based-routes","docs\u002F3.modules\u002F7.nitro\u002F2.file-based-routes",{"title":271,"path":272,"stem":273},"Middleware","\u002Fdocs\u002Fmodules\u002Fnitro\u002Fmiddleware","docs\u002F3.modules\u002F7.nitro\u002F3.middleware",{"title":275,"icon":64,"defaultOpen":64,"path":276,"stem":277,"children":278,"page":64},"Vite","\u002Fdocs\u002Fmodules\u002Fvite","docs\u002F3.modules\u002F8.vite",[279],{"title":78,"path":280,"stem":281},"\u002Fdocs\u002Fmodules\u002Fvite\u002Foverview","docs\u002F3.modules\u002F8.vite\u002F0.overview",{"title":283,"icon":64,"defaultOpen":64,"path":284,"stem":285,"children":286,"page":64},"Cache","\u002Fdocs\u002Fmodules\u002Fcache","docs\u002F3.modules\u002F9.cache",[287,290],{"title":78,"path":288,"stem":289},"\u002Fdocs\u002Fmodules\u002Fcache\u002Foverview","docs\u002F3.modules\u002F9.cache\u002F0.overview",{"title":109,"path":291,"stem":292},"\u002Fdocs\u002Fmodules\u002Fcache\u002Fapi","docs\u002F3.modules\u002F9.cache\u002F1.api",{"title":294,"icon":295,"path":296,"stem":297,"children":298,"page":64},"Deployment","i-lucide-cloud-upload","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[299,302,306,310,314],{"title":78,"path":300,"stem":301},"\u002Fdocs\u002Fdeployment\u002Foverview","docs\u002F4.deployment\u002F0.overview",{"title":303,"path":304,"stem":305},"Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F4.deployment\u002F1.vercel",{"title":307,"path":308,"stem":309},"AWS Lambda","\u002Fdocs\u002Fdeployment\u002Faws-lambda","docs\u002F4.deployment\u002F2.aws-lambda",{"title":311,"path":312,"stem":313},"Azure Functions","\u002Fdocs\u002Fdeployment\u002Fazure-functions","docs\u002F4.deployment\u002F3.azure-functions",{"title":315,"path":316,"stem":317},"Node.js Server","\u002Fdocs\u002Fdeployment\u002Fnode-server","docs\u002F4.deployment\u002F4.node-server",{"title":319,"icon":320,"path":321,"stem":322,"children":323,"page":64},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[324,328,332,336],{"title":325,"path":326,"stem":327},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":329,"path":330,"stem":331},"Plugins","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",{"title":333,"path":334,"stem":335},"Custom CLI Command","\u002Fdocs\u002Fadvanced\u002Fcustom-cli-command","docs\u002F99.advanced\u002F3.custom-cli-command",{"title":337,"path":338,"stem":339},"Writing a Recipe","\u002Fdocs\u002Fadvanced\u002Fwriting-a-recipe","docs\u002F99.advanced\u002F4.writing-a-recipe",[341,343,345,346,347,348,349,351,352,353,354,355,356,357,358,360,362,363,364,365,367,368,369,371,372,373,374,376,377,378,379,380,382,383,384,385,386,388,389,390,391,392,393,395,396,397,398,400,401,402,403,405,406,408,409,410,411,413,414,415,417,418,419,420,422,423,424,425,426,428,429,431,432,433,435,436,437,438,439,440,442,443,444,445],{"path":342},"\u002Fdocs\u002F.navigation",{"path":344},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":27},{"path":350},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":38},{"path":42},{"path":46},{"path":50},{"path":54},{"path":58},{"path":62},{"path":359},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":361},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":79},{"path":83},{"path":87},{"path":366},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002F.navigation",{"path":95},{"path":98},{"path":370},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002F.navigation",{"path":106},{"path":110},{"path":114},{"path":375},"\u002Fdocs\u002Fmodules\u002Fqueue\u002F.navigation",{"path":122},{"path":126},{"path":130},{"path":133},{"path":381},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002F.navigation",{"path":141},{"path":145},{"path":149},{"path":152},{"path":387},"\u002Fdocs\u002Fmodules\u002Ftesting\u002F.navigation",{"path":160},{"path":164},{"path":168},{"path":172},{"path":175},{"path":394},"\u002Fdocs\u002Fmodules\u002Fclient\u002F.navigation",{"path":183},{"path":186},{"path":189},{"path":399},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":197},{"path":201},{"path":204},{"path":404},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":212},{"path":407},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":220},{"path":224},{"path":227},{"path":412},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":235},{"path":238},{"path":416},"\u002Fdocs\u002Fmodules\u002Fschema\u002F.navigation",{"path":246},{"path":249},{"path":253},{"path":421},"\u002Fdocs\u002Fmodules\u002Fnitro\u002F.navigation",{"path":261},{"path":264},{"path":268},{"path":272},{"path":427},"\u002Fdocs\u002Fmodules\u002Fvite\u002F.navigation",{"path":280},{"path":430},"\u002Fdocs\u002Fmodules\u002Fcache\u002F.navigation",{"path":288},{"path":291},{"path":434},"\u002Fdocs\u002Fdeployment\u002F.navigation",{"path":300},{"path":304},{"path":308},{"path":312},{"path":316},{"path":441},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":326},{"path":330},{"path":334},{"path":338},{"id":447,"title":78,"body":448,"description":1669,"extension":1670,"links":1671,"meta":1672,"navigation":68,"path":183,"seo":1673,"stem":184,"__hash__":1674},"docs\u002Fdocs\u002F3.modules\u002F15.client\u002F0.overview.md",{"type":449,"value":450,"toc":1662},"minimark",[451,468,731,737,751,755,758,818,822,832,1011,1018,1024,1091,1112,1131,1134,1207,1213,1216,1224,1228,1333,1355,1386,1390,1396,1640,1644,1658],[452,453,454,455,459,460,463,464,467],"p",{},"The Client module is a small ",[456,457,458],"code",{},"fetch"," wrapper whose types come from your controller methods. Nothing is written by hand: the response is what the handler returns, the body is what its ",[456,461,462],{},"@Body()"," parameter accepts, and the path parameters are the ",[456,465,466],{},":segments"," of the route. Change a handler on the server and every call that no longer fits stops compiling.",[469,470,475],"pre",{"className":471,"code":472,"language":473,"meta":474,"style":474},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createClient } from '@vercube\u002Fclient';\nimport type { VercubeRoutes } from '..\u002F.vercube\u002Froutes.js';\n\nconst api = createClient\u003CVercubeRoutes>({ baseURL: 'http:\u002F\u002Flocalhost:3000' });\n\nconst user = await api.get('\u002Fusers\u002F:id', { params: { id: '42' } });\n\u002F\u002F    ^? { id: string; name: string; createdAt: string }\n\nawait api.post('\u002Fusers', { body: { name: 'Ada' } });\n","ts","",[456,476,477,513,539,545,598,603,666,673,678],{"__ignoreMap":474},[478,479,482,486,490,494,497,500,503,507,510],"span",{"class":480,"line":481},"line",1,[478,483,485],{"class":484},"s7zQu","import",[478,487,489],{"class":488},"sMK4o"," {",[478,491,493],{"class":492},"sTEyZ"," createClient",[478,495,496],{"class":488}," }",[478,498,499],{"class":484}," from",[478,501,502],{"class":488}," '",[478,504,506],{"class":505},"sfazB","@vercube\u002Fclient",[478,508,509],{"class":488},"'",[478,511,512],{"class":488},";\n",[478,514,516,518,521,523,526,528,530,532,535,537],{"class":480,"line":515},2,[478,517,485],{"class":484},[478,519,520],{"class":484}," type",[478,522,489],{"class":488},[478,524,525],{"class":492}," VercubeRoutes",[478,527,496],{"class":488},[478,529,499],{"class":484},[478,531,502],{"class":488},[478,533,534],{"class":505},"..\u002F.vercube\u002Froutes.js",[478,536,509],{"class":488},[478,538,512],{"class":488},[478,540,542],{"class":480,"line":541},3,[478,543,544],{"emptyLinePlaceholder":68},"\n",[478,546,548,552,555,558,561,564,568,571,574,577,581,584,586,589,591,593,596],{"class":480,"line":547},4,[478,549,551],{"class":550},"spNyl","const",[478,553,554],{"class":492}," api ",[478,556,557],{"class":488},"=",[478,559,493],{"class":560},"s2Zo4",[478,562,563],{"class":488},"\u003C",[478,565,567],{"class":566},"sBMFI","VercubeRoutes",[478,569,570],{"class":488},">",[478,572,573],{"class":492},"(",[478,575,576],{"class":488},"{",[478,578,580],{"class":579},"swJcz"," baseURL",[478,582,583],{"class":488},":",[478,585,502],{"class":488},[478,587,588],{"class":505},"http:\u002F\u002Flocalhost:3000",[478,590,509],{"class":488},[478,592,496],{"class":488},[478,594,595],{"class":492},")",[478,597,512],{"class":488},[478,599,601],{"class":480,"line":600},5,[478,602,544],{"emptyLinePlaceholder":68},[478,604,606,608,611,613,616,619,622,625,627,629,632,634,637,639,642,644,646,649,651,653,656,658,660,662,664],{"class":480,"line":605},6,[478,607,551],{"class":550},[478,609,610],{"class":492}," user ",[478,612,557],{"class":488},[478,614,615],{"class":484}," await",[478,617,618],{"class":492}," api",[478,620,621],{"class":488},".",[478,623,624],{"class":560},"get",[478,626,573],{"class":492},[478,628,509],{"class":488},[478,630,631],{"class":505},"\u002Fusers\u002F:id",[478,633,509],{"class":488},[478,635,636],{"class":488},",",[478,638,489],{"class":488},[478,640,641],{"class":579}," params",[478,643,583],{"class":488},[478,645,489],{"class":488},[478,647,648],{"class":579}," id",[478,650,583],{"class":488},[478,652,502],{"class":488},[478,654,655],{"class":505},"42",[478,657,509],{"class":488},[478,659,496],{"class":488},[478,661,496],{"class":488},[478,663,595],{"class":492},[478,665,512],{"class":488},[478,667,669],{"class":480,"line":668},7,[478,670,672],{"class":671},"sHwdD","\u002F\u002F    ^? { id: string; name: string; createdAt: string }\n",[478,674,676],{"class":480,"line":675},8,[478,677,544],{"emptyLinePlaceholder":68},[478,679,681,684,686,688,691,693,695,698,700,702,704,707,709,711,714,716,718,721,723,725,727,729],{"class":480,"line":680},9,[478,682,683],{"class":484},"await",[478,685,618],{"class":492},[478,687,621],{"class":488},[478,689,690],{"class":560},"post",[478,692,573],{"class":492},[478,694,509],{"class":488},[478,696,697],{"class":505},"\u002Fusers",[478,699,509],{"class":488},[478,701,636],{"class":488},[478,703,489],{"class":488},[478,705,706],{"class":579}," body",[478,708,583],{"class":488},[478,710,489],{"class":488},[478,712,713],{"class":579}," name",[478,715,583],{"class":488},[478,717,502],{"class":488},[478,719,720],{"class":505},"Ada",[478,722,509],{"class":488},[478,724,496],{"class":488},[478,726,496],{"class":488},[478,728,595],{"class":492},[478,730,512],{"class":488},[452,732,733,734,736],{},"It has no dependencies, weighs about 1.5 kB minified and gzipped, and runs anywhere ",[456,735,458],{}," does: browsers, workers, Node, Bun and Deno.",[452,738,739,740,747,748,621],{},"A complete project, a server with a script that calls it, is in ",[741,742,746],"a",{"href":743,"rel":744},"https:\u002F\u002Fgithub.com\u002Fvercube\u002Fvercube\u002Ftree\u002Fmain\u002Fexamples\u002Fclient",[745],"nofollow","examples\u002Fclient",": ",[456,749,750],{},"npx giget gh:vercube\u002Fvercube\u002Fexamples\u002Fclient vercube-client",[752,753,18],"h2",{"id":754},"installation",[452,756,757],{},"Install it where the calls are made. In a single repository that is the server project itself.",[759,760,761,783,801],"code-group",{},[469,762,767],{"className":763,"code":764,"filename":765,"language":766,"meta":474,"style":474},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ pnpm add @vercube\u002Fclient\n","pnpm","bash",[456,768,769],{"__ignoreMap":474},[478,770,771,774,777,780],{"class":480,"line":481},[478,772,773],{"class":566},"$",[478,775,776],{"class":505}," pnpm",[478,778,779],{"class":505}," add",[478,781,782],{"class":505}," @vercube\u002Fclient\n",[469,784,787],{"className":763,"code":785,"filename":786,"language":766,"meta":474,"style":474},"$ npm install @vercube\u002Fclient\n","npm",[456,788,789],{"__ignoreMap":474},[478,790,791,793,796,799],{"class":480,"line":481},[478,792,773],{"class":566},[478,794,795],{"class":505}," npm",[478,797,798],{"class":505}," install",[478,800,782],{"class":505},[469,802,805],{"className":763,"code":803,"filename":804,"language":766,"meta":474,"style":474},"$ bun add @vercube\u002Fclient\n","bun",[456,806,807],{"__ignoreMap":474},[478,808,809,811,814,816],{"class":480,"line":481},[478,810,773],{"class":566},[478,812,813],{"class":505}," bun",[478,815,779],{"class":505},[478,817,782],{"class":505},[752,819,821],{"id":820},"the-route-map","The route map",[452,823,824,827,828,831],{},[456,825,826],{},".vercube\u002Froutes.d.ts"," tells the client which routes exist. It is generated from the running application, so it lists exactly what the router serves, including controllers mounted elsewhere with ",[456,829,830],{},"setControllerPath()"," and routes registered by plugins.",[469,833,835],{"className":471,"code":834,"filename":826,"language":473,"meta":474,"style":474},"\u002F\u002F Generated by Vercube from your controllers. Do not edit: `vercube typegen`\n\u002F\u002F rewrites it.\n\nimport type { RouteDef } from '@vercube\u002Fclient';\nimport type { UserController } from '..\u002Fsrc\u002FControllers\u002FUserController.js';\n\nexport interface VercubeRoutes {\n  'GET \u002Fusers\u002F:id': RouteDef\u003CUserController, 'getUser', { param: { id: 0 } }>;\n  'POST \u002Fusers': RouteDef\u003CUserController, 'create', { body: 0 }>;\n}\n",[456,836,837,842,847,851,874,898,902,915,967,1005],{"__ignoreMap":474},[478,838,839],{"class":480,"line":481},[478,840,841],{"class":671},"\u002F\u002F Generated by Vercube from your controllers. Do not edit: `vercube typegen`\n",[478,843,844],{"class":480,"line":515},[478,845,846],{"class":671},"\u002F\u002F rewrites it.\n",[478,848,849],{"class":480,"line":541},[478,850,544],{"emptyLinePlaceholder":68},[478,852,853,855,857,859,862,864,866,868,870,872],{"class":480,"line":547},[478,854,485],{"class":484},[478,856,520],{"class":484},[478,858,489],{"class":488},[478,860,861],{"class":492}," RouteDef",[478,863,496],{"class":488},[478,865,499],{"class":484},[478,867,502],{"class":488},[478,869,506],{"class":505},[478,871,509],{"class":488},[478,873,512],{"class":488},[478,875,876,878,880,882,885,887,889,891,894,896],{"class":480,"line":600},[478,877,485],{"class":484},[478,879,520],{"class":484},[478,881,489],{"class":488},[478,883,884],{"class":492}," UserController",[478,886,496],{"class":488},[478,888,499],{"class":484},[478,890,502],{"class":488},[478,892,893],{"class":505},"..\u002Fsrc\u002FControllers\u002FUserController.js",[478,895,509],{"class":488},[478,897,512],{"class":488},[478,899,900],{"class":480,"line":605},[478,901,544],{"emptyLinePlaceholder":68},[478,903,904,907,910,912],{"class":480,"line":668},[478,905,906],{"class":484},"export",[478,908,909],{"class":550}," interface",[478,911,525],{"class":566},[478,913,914],{"class":488}," {\n",[478,916,917,920,923,925,927,929,931,934,936,938,941,943,945,947,950,952,954,956,958,962,964],{"class":480,"line":675},[478,918,919],{"class":488},"  '",[478,921,922],{"class":505},"GET \u002Fusers\u002F:id",[478,924,509],{"class":488},[478,926,583],{"class":488},[478,928,861],{"class":566},[478,930,563],{"class":488},[478,932,933],{"class":566},"UserController",[478,935,636],{"class":488},[478,937,502],{"class":488},[478,939,940],{"class":505},"getUser",[478,942,509],{"class":488},[478,944,636],{"class":488},[478,946,489],{"class":488},[478,948,949],{"class":579}," param",[478,951,583],{"class":488},[478,953,489],{"class":488},[478,955,648],{"class":579},[478,957,583],{"class":488},[478,959,961],{"class":960},"sbssI"," 0",[478,963,496],{"class":488},[478,965,966],{"class":488}," }>;\n",[478,968,969,971,974,976,978,980,982,984,986,988,991,993,995,997,999,1001,1003],{"class":480,"line":680},[478,970,919],{"class":488},[478,972,973],{"class":505},"POST \u002Fusers",[478,975,509],{"class":488},[478,977,583],{"class":488},[478,979,861],{"class":566},[478,981,563],{"class":488},[478,983,933],{"class":566},[478,985,636],{"class":488},[478,987,502],{"class":488},[478,989,990],{"class":505},"create",[478,992,509],{"class":488},[478,994,636],{"class":488},[478,996,489],{"class":488},[478,998,706],{"class":579},[478,1000,583],{"class":488},[478,1002,961],{"class":960},[478,1004,966],{"class":488},[478,1006,1008],{"class":480,"line":1007},10,[478,1009,1010],{"class":488},"}\n",[452,1012,1013,1014,1017],{},"The file holds no types of its own. Each entry names a controller, a method and the position of each parameter decorator, and ",[456,1015,1016],{},"RouteDef"," asks the compiler for the rest. That is why it only changes when routes are added, removed or moved: editing a handler's signature changes the client's types without touching the file.",[452,1019,1020,1021,1023],{},"Once the project depends on ",[456,1022,506],{},", the file is kept up to date for you:",[1025,1026,1027,1040],"table",{},[1028,1029,1030],"thead",{},[1031,1032,1033,1037],"tr",{},[1034,1035,1036],"th",{},"Command",[1034,1038,1039],{},"When the route map is written",[1041,1042,1043,1054,1064,1076],"tbody",{},[1031,1044,1045,1051],{},[1046,1047,1048],"td",{},[456,1049,1050],{},"vercube dev",[1046,1052,1053],{},"When the dev worker starts and on every restart, if the map it would write differs from the file (a route changed, a controller moved, or the file was deleted)",[1031,1055,1056,1061],{},[1046,1057,1058],{},[456,1059,1060],{},"vercube build",[1046,1062,1063],{},"After the build",[1031,1065,1066,1071],{},[1046,1067,1068],{},[456,1069,1070],{},"vercube typegen",[1046,1072,1073,1074],{},"On demand, also in projects that do not list ",[456,1075,506],{},[1031,1077,1078,1081],{},[1046,1079,1080],{},"Vite plugin",[1046,1082,1083,1084,1087,1088],{},"In ",[456,1085,1086],{},"vite dev"," after every reload, with the same rule, and after ",[456,1089,1090],{},"vite build",[452,1092,1093,1094,1100,1101,1104,1105,1108,1109,1111],{},"To generate the map, the built entry is run with introspection on, the same way ",[741,1095,1097],{"href":1096},"\u002Fdocs\u002Fcore-features\u002Fintrospection#from-the-command-line",[456,1098,1099],{},"vercube inspect"," does, and stopped before it binds a port. Your ",[456,1102,1103],{},"setup"," runs, ",[456,1106,1107],{},"onStart()"," hooks do not. A ",[456,1110,1103],{}," that has not finished after 60 seconds (waiting on a database that is not there, say) is stopped: the build carries on with a warning and leaves the previous map alone.",[452,1113,1114,1115,1118,1119,1122,1123,1126,1127,1130],{},"Commit the file. A frontend in another package, or CI running ",[456,1116,1117],{},"tsc",", can then type-check without booting the server, and a pull request shows API changes as a diff. The output is sorted, so the same application always produces the same file. Add ",[456,1120,1121],{},".vercube\u002F"," to your formatter's ignore list (",[456,1124,1125],{},"ignorePatterns"," for oxfmt, ",[456,1128,1129],{},".prettierignore"," for Prettier), otherwise a formatter that sorts imports and the next typegen run keep rewriting each other.",[452,1132,1133],{},"To write it somewhere else, or to turn it off:",[469,1135,1138],{"className":471,"code":1136,"filename":1137,"language":473,"meta":474,"style":474},"export default defineConfig({\n  build: {\n    typegen: { output: 'web\u002Fsrc\u002Fapi\u002Froutes.d.ts' },\n    \u002F\u002F or: typegen: false\n  },\n});\n","vercube.config.ts",[456,1139,1140,1155,1164,1188,1193,1198],{"__ignoreMap":474},[478,1141,1142,1144,1147,1150,1152],{"class":480,"line":481},[478,1143,906],{"class":484},[478,1145,1146],{"class":484}," default",[478,1148,1149],{"class":560}," defineConfig",[478,1151,573],{"class":492},[478,1153,1154],{"class":488},"{\n",[478,1156,1157,1160,1162],{"class":480,"line":515},[478,1158,1159],{"class":579},"  build",[478,1161,583],{"class":488},[478,1163,914],{"class":488},[478,1165,1166,1169,1171,1173,1176,1178,1180,1183,1185],{"class":480,"line":541},[478,1167,1168],{"class":579},"    typegen",[478,1170,583],{"class":488},[478,1172,489],{"class":488},[478,1174,1175],{"class":579}," output",[478,1177,583],{"class":488},[478,1179,502],{"class":488},[478,1181,1182],{"class":505},"web\u002Fsrc\u002Fapi\u002Froutes.d.ts",[478,1184,509],{"class":488},[478,1186,1187],{"class":488}," },\n",[478,1189,1190],{"class":480,"line":547},[478,1191,1192],{"class":671},"    \u002F\u002F or: typegen: false\n",[478,1194,1195],{"class":480,"line":600},[478,1196,1197],{"class":488},"  },\n",[478,1199,1200,1203,1205],{"class":480,"line":605},[478,1201,1202],{"class":488},"}",[478,1204,595],{"class":492},[478,1206,512],{"class":488},[452,1208,1209,1210,621],{},"With the Vite plugin, pass the same option to ",[456,1211,1212],{},"vercube({ typegen: ... })",[452,1214,1215],{},"A route whose controller cannot be imported is left out with one warning, for instance a controller class that is not exported:",[469,1217,1222],{"className":1218,"code":1220,"language":1221},[1219],"language-text","[typegen] Skipped GET \u002Finternal\u002Fhealth:\n  HealthController is not exported from ..\u002Fsrc\u002FControllers\u002FHealthController.ts\n","text",[456,1223,1220],{"__ignoreMap":474},[752,1225,1227],{"id":1226},"what-is-typed","What is typed",[1025,1229,1230,1243],{},[1028,1231,1232],{},[1031,1233,1234,1237,1240],{},[1034,1235,1236],{},"Request part",[1034,1238,1239],{},"Comes from",[1034,1241,1242],{},"Required when",[1041,1244,1245,1264,1286,1302,1317],{},[1031,1246,1247,1252,1261],{},[1046,1248,1249],{},[456,1250,1251],{},"params",[1046,1253,1254,1255,1257,1258],{},"the ",[456,1256,466],{}," of the path, typed by ",[456,1259,1260],{},"@Param()",[1046,1262,1263],{},"always, every segment",[1031,1265,1266,1271,1280],{},[1046,1267,1268],{},[456,1269,1270],{},"query",[1046,1272,1273,1276,1277],{},[456,1274,1275],{},"@QueryParam()"," and ",[456,1278,1279],{},"@QueryParams()",[1046,1281,1282,1283],{},"the parameter type does not allow ",[456,1284,1285],{},"undefined",[1031,1287,1288,1293,1298],{},[1046,1289,1290],{},[456,1291,1292],{},"headers",[1046,1294,1295],{},[456,1296,1297],{},"@Header()",[1046,1299,1282,1300],{},[456,1301,1285],{},[1031,1303,1304,1309,1313],{},[1046,1305,1306],{},[456,1307,1308],{},"body",[1046,1310,1311],{},[456,1312,462],{},[1046,1314,1282,1315],{},[456,1316,1285],{},[1031,1318,1319,1324,1329],{},[1046,1320,1321],{},[456,1322,1323],{},"form",[1046,1325,1326],{},[456,1327,1328],{},"@MultipartFormData()",[1046,1330,1282,1331],{},[456,1332,1285],{},[452,1334,1335,1336,1339,1340,1343,1344,1347,1348,1351,1352,621],{},"The types are those of the handler's parameters, so they are what the handler receives after validation. A schema that transforms its input (",[456,1337,1338],{},"z.coerce.number()",", ",[456,1341,1342],{},".default()",") types the call by its output: ",[456,1345,1346],{},"@QueryParam({ name: 'page', validationSchema: z.coerce.number() }) page: number"," accepts ",[456,1349,1350],{},"page: 2",", which is sent as ",[456,1353,1354],{},"?page=2",[452,1356,1357,1358,1361,1362,1365,1366,1369,1370,1339,1373,1369,1376,1378,1379,1382,1383,621],{},"The response is what the handler returns, awaited and as JSON would carry it: a ",[456,1359,1360],{},"Date"," becomes a ",[456,1363,1364],{},"string",", methods are dropped. A handler that returns a raw ",[456,1367,1368],{},"Response"," gives ",[456,1371,1372],{},"unknown",[456,1374,1375],{},"void",[456,1377,1285],{},", and an ",[456,1380,1381],{},"@Sse()"," route gives a stream of typed events, see ",[741,1384,163],{"href":1385},"\u002Fdocs\u002Fmodules\u002Fclient\u002Frequests#server-sent-events",[752,1387,1389],{"id":1388},"in-tests","In tests",[452,1391,1392,1395],{},[456,1393,1394],{},"@vercube\u002Ftesting"," exposes the same client on every test app. Its requests go to the app in memory, without a port:",[469,1397,1400],{"className":471,"code":1398,"filename":1399,"language":473,"meta":474,"style":474},"import { createTestApp } from '@vercube\u002Ftesting';\nimport type { VercubeRoutes } from '..\u002F.vercube\u002Froutes';\n\nit('creates a user', async () => {\n  await using app = await createTestApp\u003CVercubeRoutes>({\n    controllers: [UserController],\n  });\n\n  const user = await app.client.post('\u002Fusers', { body: { name: 'Ada' } });\n\n  expect(user.name).toBe('Ada');\n});\n","test\u002Fusers.test.ts",[456,1401,1402,1423,1446,1450,1477,1502,1520,1529,1533,1592,1596,1631],{"__ignoreMap":474},[478,1403,1404,1406,1408,1411,1413,1415,1417,1419,1421],{"class":480,"line":481},[478,1405,485],{"class":484},[478,1407,489],{"class":488},[478,1409,1410],{"class":492}," createTestApp",[478,1412,496],{"class":488},[478,1414,499],{"class":484},[478,1416,502],{"class":488},[478,1418,1394],{"class":505},[478,1420,509],{"class":488},[478,1422,512],{"class":488},[478,1424,1425,1427,1429,1431,1433,1435,1437,1439,1442,1444],{"class":480,"line":515},[478,1426,485],{"class":484},[478,1428,520],{"class":484},[478,1430,489],{"class":488},[478,1432,525],{"class":492},[478,1434,496],{"class":488},[478,1436,499],{"class":484},[478,1438,502],{"class":488},[478,1440,1441],{"class":505},"..\u002F.vercube\u002Froutes",[478,1443,509],{"class":488},[478,1445,512],{"class":488},[478,1447,1448],{"class":480,"line":541},[478,1449,544],{"emptyLinePlaceholder":68},[478,1451,1452,1455,1457,1459,1462,1464,1466,1469,1472,1475],{"class":480,"line":547},[478,1453,1454],{"class":560},"it",[478,1456,573],{"class":492},[478,1458,509],{"class":488},[478,1460,1461],{"class":505},"creates a user",[478,1463,509],{"class":488},[478,1465,636],{"class":488},[478,1467,1468],{"class":550}," async",[478,1470,1471],{"class":488}," ()",[478,1473,1474],{"class":550}," =>",[478,1476,914],{"class":488},[478,1478,1479,1482,1485,1488,1490,1492,1494,1496,1498,1500],{"class":480,"line":600},[478,1480,1481],{"class":550},"  await using",[478,1483,1484],{"class":492}," app",[478,1486,1487],{"class":488}," =",[478,1489,615],{"class":484},[478,1491,1410],{"class":560},[478,1493,563],{"class":488},[478,1495,567],{"class":566},[478,1497,570],{"class":488},[478,1499,573],{"class":579},[478,1501,1154],{"class":488},[478,1503,1504,1507,1509,1512,1514,1517],{"class":480,"line":605},[478,1505,1506],{"class":579},"    controllers",[478,1508,583],{"class":488},[478,1510,1511],{"class":579}," [",[478,1513,933],{"class":492},[478,1515,1516],{"class":579},"]",[478,1518,1519],{"class":488},",\n",[478,1521,1522,1525,1527],{"class":480,"line":668},[478,1523,1524],{"class":488},"  }",[478,1526,595],{"class":579},[478,1528,512],{"class":488},[478,1530,1531],{"class":480,"line":675},[478,1532,544],{"emptyLinePlaceholder":68},[478,1534,1535,1538,1541,1543,1545,1547,1549,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588,1590],{"class":480,"line":680},[478,1536,1537],{"class":550},"  const",[478,1539,1540],{"class":492}," user",[478,1542,1487],{"class":488},[478,1544,615],{"class":484},[478,1546,1484],{"class":492},[478,1548,621],{"class":488},[478,1550,1551],{"class":492},"client",[478,1553,621],{"class":488},[478,1555,690],{"class":560},[478,1557,573],{"class":579},[478,1559,509],{"class":488},[478,1561,697],{"class":505},[478,1563,509],{"class":488},[478,1565,636],{"class":488},[478,1567,489],{"class":488},[478,1569,706],{"class":579},[478,1571,583],{"class":488},[478,1573,489],{"class":488},[478,1575,713],{"class":579},[478,1577,583],{"class":488},[478,1579,502],{"class":488},[478,1581,720],{"class":505},[478,1583,509],{"class":488},[478,1585,496],{"class":488},[478,1587,496],{"class":488},[478,1589,595],{"class":579},[478,1591,512],{"class":488},[478,1593,1594],{"class":480,"line":1007},[478,1595,544],{"emptyLinePlaceholder":68},[478,1597,1599,1602,1604,1607,1609,1612,1614,1616,1619,1621,1623,1625,1627,1629],{"class":480,"line":1598},11,[478,1600,1601],{"class":560},"  expect",[478,1603,573],{"class":579},[478,1605,1606],{"class":492},"user",[478,1608,621],{"class":488},[478,1610,1611],{"class":492},"name",[478,1613,595],{"class":579},[478,1615,621],{"class":488},[478,1617,1618],{"class":560},"toBe",[478,1620,573],{"class":579},[478,1622,509],{"class":488},[478,1624,720],{"class":505},[478,1626,509],{"class":488},[478,1628,595],{"class":579},[478,1630,512],{"class":488},[478,1632,1634,1636,1638],{"class":480,"line":1633},12,[478,1635,1202],{"class":488},[478,1637,595],{"class":492},[478,1639,512],{"class":488},[752,1641,1643],{"id":1642},"where-to-go-next","Where to go next",[1645,1646,1647,1653],"ul",{},[1648,1649,1650,1652],"li",{},[741,1651,163],{"href":186},": bodies, query strings, headers, hooks, errors, server-sent events and aborting.",[1648,1654,1655,1657],{},[741,1656,109],{"href":189},": every option, method and type.",[1659,1660,1661],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":474,"searchDepth":481,"depth":515,"links":1663},[1664,1665,1666,1667,1668],{"id":754,"depth":515,"text":18},{"id":820,"depth":515,"text":821},{"id":1226,"depth":515,"text":1227},{"id":1388,"depth":515,"text":1389},{"id":1642,"depth":515,"text":1643},"Call your Vercube API from a frontend, another service or a test, typed by your controllers","md",null,{},{"title":78,"description":1669},"zm2rvb4CDUK0MVzUdE-tkK97scZDGxccEywKSnsG2Fg",[1676,1678],{"title":109,"path":175,"stem":176,"description":1677,"children":-1},"Reference for createTestApp, TestApp, the request builder, responses, createTestContainer, stub and TestLogger",{"title":163,"path":186,"stem":187,"description":1679,"children":-1},"Bodies, query strings, headers, hooks, typed errors, server-sent events and aborting",1794396675019]