[{"data":1,"prerenderedAt":1327},["ShallowReactive",2],{"navigation":3,"docs-path-index":340,"-docs-getting-started-project-generator":446,"-docs-getting-started-project-generator-surround":1322},[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":26,"body":448,"description":1316,"extension":1317,"links":1318,"meta":1319,"navigation":68,"path":27,"seo":1320,"stem":28,"__hash__":1321},"docs\u002Fdocs\u002F1.getting-started\u002F4.project-generator.md",{"type":449,"value":450,"toc":1309},"minimark",[451,467,530,535,610,619,622,814,817,820,901,926,939,943,1018,1028,1032,1170,1176,1184,1188,1209,1250,1264,1270,1298,1305],[452,453,454,458,459,462,463,466],"p",{},[455,456,457],"code",{},"create-vercube"," is ",[455,460,461],{},"vercube init",": it downloads a template, pins every ",[455,464,465],{},"@vercube\u002F*"," package to its own version, applies a recipe per module and per deploy target, installs the dependencies and initializes git. A project created today keeps building when the next release ships.",[468,469,474],"pre",{"className":470,"code":471,"language":472,"meta":473,"style":473},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ pnpm create vercube my-app \\\n    --template fullstack-vue \\\n    --modules schema,auth,testing \\\n    --yes\n","bash","",[455,475,476,502,513,524],{"__ignoreMap":473},[477,478,481,485,489,492,495,498],"span",{"class":479,"line":480},"line",1,[477,482,484],{"class":483},"sBMFI","$",[477,486,488],{"class":487},"sfazB"," pnpm",[477,490,491],{"class":487}," create",[477,493,494],{"class":487}," vercube",[477,496,497],{"class":487}," my-app",[477,499,501],{"class":500},"sTEyZ"," \\\n",[477,503,505,508,511],{"class":479,"line":504},2,[477,506,507],{"class":487},"    --template",[477,509,510],{"class":487}," fullstack-vue",[477,512,501],{"class":500},[477,514,516,519,522],{"class":479,"line":515},3,[477,517,518],{"class":487},"    --modules",[477,520,521],{"class":487}," schema,auth,testing",[477,523,501],{"class":500},[477,525,527],{"class":479,"line":526},4,[477,528,529],{"class":487},"    --yes\n",[531,532,534],"h2",{"id":533},"templates","Templates",[536,537,538,551],"table",{},[539,540,541],"thead",{},[542,543,544,548],"tr",{},[545,546,547],"th",{},"Template",[545,549,550],{},"What you get",[552,553,554,573],"tbody",{},[542,555,556,562],{},[557,558,559],"td",{},[455,560,561],{},"api",[557,563,564,565,568,569,572],{},"A Vercube API: ",[455,566,567],{},"src\u002Findex.ts",", ",[455,570,571],{},"src\u002Fboot\u002FContainer.ts",", one controller, oxlint and oxfmt. The default",[542,574,575,580],{},[557,576,577],{},[455,578,579],{},"fullstack-vue",[557,581,582,583,586,587,590,591,594,595,598,599,602,603,609],{},"A workspace: ",[455,584,585],{},"apps\u002Fapi"," (the API) and ",[455,588,589],{},"apps\u002Fweb"," (Vue on Vite), with ",[455,592,593],{},"packages\u002F"," for shared code. One ",[455,596,597],{},"dev"," at the root starts both, Vite proxies ",[455,600,601],{},"\u002Fapi"," to the API, and the web app calls it through ",[604,605,606],"a",{"href":183},[455,607,608],{},"@vercube\u002Fclient",", typed by the API's controllers",[452,611,612,613,615,616,618],{},"In the fullstack template the modules are added to ",[455,614,585],{},". A React template is planned; Deno supports the ",[455,617,561],{}," template only.",[531,620,66],{"id":621},"modules",[536,623,624,637],{},[539,625,626],{},[542,627,628,631,634],{},[545,629,630],{},"Module",[545,632,633],{},"Flag value",[545,635,636],{},"What the recipe adds",[552,638,639,658,681,696,715,730,745,764,779,798],{},[542,640,641,644,649],{},[557,642,643],{},"Schema \u002F OpenAPI",[557,645,646],{},[455,647,648],{},"schema",[557,650,651,654,655],{},[455,652,653],{},"SchemaPlugin",", a validated route documented at ",[455,656,657],{},"\u002F_schema\u002Fdocs",[542,659,660,662,667],{},[557,661,73],{},[557,663,664],{},[455,665,666],{},"auth",[557,668,669,670,673,674,677,678],{},"An API key provider (",[455,671,672],{},"API_KEY",", generated into ",[455,675,676],{},".env","), a route behind ",[455,679,680],{},"@Auth()",[542,682,683,685,690],{},[557,684,215],{},[557,686,687],{},[455,688,689],{},"storage",[557,691,692,695],{},[455,693,694],{},"StorageManager"," with a memory or S3 mount, a read\u002Fwrite route",[542,697,698,700,705],{},[557,699,283],{},[557,701,702],{},[455,703,704],{},"cache",[557,706,707,710,711,714],{},[455,708,709],{},"CacheManager"," on a storage mount (adds Storage), a ",[455,712,713],{},"@Cache()"," route",[542,716,717,719,724],{},[557,718,117],{},[557,720,721],{},[455,722,723],{},"queue",[557,725,726,729],{},[455,727,728],{},"QueuePlugin"," with the chosen driver, a consumer and a route that publishes to it",[542,731,732,734,739],{},[557,733,136],{},[557,735,736],{},[455,737,738],{},"scheduler",[557,740,741,744],{},[455,742,743],{},"SchedulerPlugin"," with the chosen store, an interval job (and a cron job with a shared store)",[542,746,747,750,755],{},[557,748,749],{},"WebSockets",[557,751,752],{},[455,753,754],{},"ws",[557,756,757,760,761],{},[455,758,759],{},"WebsocketPlugin",", a gateway at ",[455,762,763],{},"\u002Fchat",[542,765,766,768,773],{},[557,767,101],{},[557,769,770],{},[455,771,772],{},"telemetry",[557,774,775,778],{},[455,776,777],{},"TelemetryPlugin",", OpenTelemetry started before the app, the OTLP exporter",[542,780,781,783,788],{},[557,782,90],{},[557,784,785],{},[455,786,787],{},"devtools",[557,789,790,793,794,797],{},[455,791,792],{},"DevtoolsPlugin"," at ",[455,795,796],{},"\u002F_devtools",", with a token for production",[542,799,800,802,807],{},[557,801,155],{},[557,803,804],{},[455,805,806],{},"testing",[557,808,809,810,813],{},"vitest, ",[455,811,812],{},"@vercube\u002Ftesting",", a test for the starter controller",[452,815,816],{},"Schema, Testing and Devtools are selected by default. A module another one needs is added with it and named in the summary: Cache adds Storage.",[452,818,819],{},"Modules with a choice ask for it, or take a flag:",[536,821,822,835],{},[539,823,824],{},[542,825,826,829,832],{},[545,827,828],{},"Flag",[545,830,831],{},"Values",[545,833,834],{},"Default",[552,836,837,862,883],{},[542,838,839,844,858],{},[557,840,841],{},[455,842,843],{},"--queue",[557,845,846,568,849,568,852,568,855],{},[455,847,848],{},"bullmq",[455,850,851],{},"rabbitmq",[455,853,854],{},"kafka",[455,856,857],{},"memory",[557,859,860],{},[455,861,848],{},[542,863,864,869,879],{},[557,865,866],{},[455,867,868],{},"--scheduler-store",[557,870,871,568,873,568,876],{},[455,872,857],{},[455,874,875],{},"redis",[455,877,878],{},"postgres",[557,880,881],{},[455,882,857],{},[542,884,885,890,897],{},[557,886,887],{},[455,888,889],{},"--storage",[557,891,892,568,894],{},[455,893,857],{},[455,895,896],{},"s3",[557,898,899],{},[455,900,857],{},[452,902,903,904,906,907,910,911,914,915,917,918,921,922,925],{},"S3 is the exception: no local service is added, set the bucket, region and credentials (and an endpoint for an S3-compatible service such as MinIO) in ",[455,905,676],{},". Any other driver with a server behind it adds the server to ",[455,908,909],{},"docker-compose.yml",", published on ",[455,912,913],{},"127.0.0.1"," only, and its URL to ",[455,916,676],{}," and ",[455,919,920],{},".env.example",". Redis is added once when both the queue and the scheduler use it. The queue and the scheduler also turn on ",[455,923,924],{},"shutdown.handleSignals",": an open broker or store connection would otherwise keep the process running after SIGTERM or Ctrl-C.",[452,927,928,929,931,932,934,935,938],{},"With ",[455,930,461],{},", a flag for a module that is not selected, such as ",[455,933,843],{}," with ",[455,936,937],{},"--modules none",", fails rather than being ignored, and so does a mistyped flag.",[531,940,942],{"id":941},"deploy-targets","Deploy targets",[536,944,945,954],{},[539,946,947],{},[542,948,949,951],{},[545,950,633],{},[545,952,953],{},"What changes",[552,955,956,974,999],{},[542,957,958,963],{},[557,959,960],{},[455,961,962],{},"node",[557,964,965,966,969,970,973],{},"Nothing: ",[455,967,968],{},"vercube build",", then ",[455,971,972],{},"node dist\u002Findex.mjs"," (or Bun, or Deno). The default",[542,975,976,981],{},[557,977,978],{},[455,979,980],{},"aws-lambda",[557,982,983,986,987,568,989,568,992,917,995,998],{},[455,984,985],{},"export const handler"," in ",[455,988,567],{},[455,990,991],{},"serverless.yml",[455,993,994],{},"offline",[455,996,997],{},"deploy"," scripts",[542,1000,1001,1006],{},[557,1002,1003],{},[455,1004,1005],{},"azure-functions",[557,1007,1008,568,1011,568,1014,1017],{},[455,1009,1010],{},"src\u002Ffunctions\u002FhttpTrigger.ts",[455,1012,1013],{},"host.json",[455,1015,1016],{},"local.settings.json"," (gitignored), a second build entry",[452,1019,1020,1023,1024,1027],{},[455,1021,1022],{},"app.listen()"," stays in the entry for both serverless targets: ",[455,1025,1026],{},"vercube dev"," needs it, and it binds no port on Lambda or Azure.",[531,1029,1031],{"id":1030},"flags","Flags",[536,1033,1034,1042],{},[539,1035,1036],{},[542,1037,1038,1040],{},[545,1039,828],{},[545,1041],{},[552,1043,1044,1054,1068,1081,1096,1121,1134,1147,1157],{},[542,1045,1046,1051],{},[557,1047,1048],{},[455,1049,1050],{},"\u003Cdir>",[557,1052,1053],{},"Where to create the project",[542,1055,1056,1061],{},[557,1057,1058],{},[455,1059,1060],{},"--template",[557,1062,1063,1065,1066],{},[455,1064,561],{}," or ",[455,1067,579],{},[542,1069,1070,1075],{},[557,1071,1072],{},[455,1073,1074],{},"--modules",[557,1076,1077,1078],{},"Comma separated, or ",[455,1079,1080],{},"none",[542,1082,1083,1088],{},[557,1084,1085],{},[455,1086,1087],{},"--deploy",[557,1089,1090,568,1092,1065,1094],{},[455,1091,962],{},[455,1093,980],{},[455,1095,1005],{},[542,1097,1098,1103],{},[557,1099,1100],{},[455,1101,1102],{},"--package-manager",[557,1104,1105,568,1108,568,1111,568,1114,1065,1117,1120],{},[455,1106,1107],{},"pnpm",[455,1109,1110],{},"npm",[455,1112,1113],{},"yarn",[455,1115,1116],{},"bun",[455,1118,1119],{},"deno","; the one running the CLI by default",[542,1122,1123,1128],{},[557,1124,1125],{},[455,1126,1127],{},"--yes",[557,1129,1130,1131],{},"Take the default for every question no flag answers; a non-empty directory still needs ",[455,1132,1133],{},"--force",[542,1135,1136,1140],{},[557,1137,1138],{},[455,1139,1133],{},[557,1141,1142,1143,1146],{},"Replace the contents of a directory that is not empty (its ",[455,1144,1145],{},".git"," stays)",[542,1148,1149,1154],{},[557,1150,1151],{},[455,1152,1153],{},"--no-install",[557,1155,1156],{},"Skip installing dependencies",[542,1158,1159,1164],{},[557,1160,1161],{},[455,1162,1163],{},"--no-git-init",[557,1165,1166,1167],{},"Skip ",[455,1168,1169],{},"git init",[452,1171,1172,1173,1175],{},"Without a terminal (CI, an agent) and without ",[455,1174,1127],{},", a missing answer fails with every flag still needed, instead of waiting for input:",[468,1177,1182],{"className":1178,"code":1180,"language":1181},[1179],"language-text","ERROR  Missing --template, --queue, --deploy, --package-manager.\n       Pass them, or --yes for the defaults, when there is no terminal to ask in.\n\nExample:\n  vercube init my-app --template api --modules schema,testing --deploy node --yes\n","text",[455,1183,1180],{"__ignoreMap":473},[531,1185,1187],{"id":1186},"adding-modules-to-a-project","Adding modules to a project",[452,1189,1190,1193,1194,568,1196,568,1198,1200,1201,568,1203,917,1205,1208],{},[455,1191,1192],{},"vercube add"," applies the same recipes to an existing project. It takes the module question flags (",[455,1195,843],{},[455,1197,868],{},[455,1199,889],{},"), ",[455,1202,1127],{},[455,1204,1153],{},[455,1206,1207],{},"--cwd",":",[468,1210,1212],{"className":470,"code":1211,"language":472,"meta":473,"style":473},"$ pnpm vercube add queue --queue rabbitmq\n$ pnpm vercube add cache,ws --yes\n",[455,1213,1214,1234],{"__ignoreMap":473},[477,1215,1216,1218,1220,1222,1225,1228,1231],{"class":479,"line":480},[477,1217,484],{"class":483},[477,1219,488],{"class":487},[477,1221,494],{"class":487},[477,1223,1224],{"class":487}," add",[477,1226,1227],{"class":487}," queue",[477,1229,1230],{"class":487}," --queue",[477,1232,1233],{"class":487}," rabbitmq\n",[477,1235,1236,1238,1240,1242,1244,1247],{"class":479,"line":504},[477,1237,484],{"class":483},[477,1239,488],{"class":487},[477,1241,494],{"class":487},[477,1243,1224],{"class":487},[477,1245,1246],{"class":487}," cache,ws",[477,1248,1249],{"class":487}," --yes\n",[452,1251,1252,1253,1256,1257,1260,1261,1263],{},"Every recipe checks what is there before it adds anything, so adding a module twice changes nothing, and a file you edited is never overwritten. Code is edited through its syntax tree: a plugin goes into the ",[455,1254,1255],{},"plugins"," of ",[455,1258,1259],{},"vercube.config.ts",", a binding into the exported function of ",[455,1262,571],{}," that takes the container. When a recipe cannot find either, it stops and says what to add by hand.",[452,1265,1266,1267,1208],{},"A package can ship a recipe of its own, see ",[604,1268,1269],{"href":338},"Writing a recipe",[468,1271,1273],{"className":470,"code":1272,"language":472,"meta":473,"style":473},"$ pnpm add @acme\u002Fvercube-search\n$ pnpm vercube add @acme\u002Fvercube-search\n",[455,1274,1275,1286],{"__ignoreMap":473},[477,1276,1277,1279,1281,1283],{"class":479,"line":480},[477,1278,484],{"class":483},[477,1280,488],{"class":487},[477,1282,1224],{"class":487},[477,1284,1285],{"class":487}," @acme\u002Fvercube-search\n",[477,1287,1288,1290,1292,1294,1296],{"class":479,"line":504},[477,1289,484],{"class":483},[477,1291,488],{"class":487},[477,1293,494],{"class":487},[477,1295,1224],{"class":487},[477,1297,1285],{"class":487},[452,1299,1300,1301,1304],{},"In a fullstack project, install the package with ",[455,1302,1303],{},"pnpm --filter api add",".",[1306,1307,1308],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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);}",{"title":473,"searchDepth":480,"depth":504,"links":1310},[1311,1312,1313,1314,1315],{"id":533,"depth":504,"text":534},{"id":621,"depth":504,"text":66},{"id":941,"depth":504,"text":942},{"id":1030,"depth":504,"text":1031},{"id":1186,"depth":504,"text":1187},"Templates, modules, deploy targets and flags of create-vercube, vercube init and vercube add","md",null,{},{"title":26,"description":1316},"_JpGwzW0yCy-HcQAtrNlTSQXaDVIup32HbUobAZbWro",[1323,1325],{"title":22,"path":23,"stem":24,"description":1324,"children":-1},"Explore example Vercube applications to learn common patterns and best practices.",{"title":37,"path":38,"stem":39,"description":1326,"children":-1},"Configure your Vercube application",1794396671155]