[{"data":1,"prerenderedAt":2275},["ShallowReactive",2],{"navigation":3,"docs-path-index":340,"-docs-advanced-writing-a-recipe":446,"-docs-advanced-writing-a-recipe-surround":2272},[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":337,"body":448,"description":2266,"extension":2267,"links":2268,"meta":2269,"navigation":68,"path":338,"seo":2270,"stem":339,"__hash__":2271},"docs\u002Fdocs\u002F99.advanced\u002F4.writing-a-recipe.md",{"type":449,"value":450,"toc":2260},"minimark",[451,468,496,501,1425,1432,1541,1558,1562,1572,1754,1761,1765,1778,1989,1993,2002,2256],[452,453,454,455,459,460,463,464,467],"p",{},"A recipe is what ",[456,457,458],"code",{},"vercube init"," and ",[456,461,462],{},"vercube add"," apply to wire a module into a project: its dependencies, its plugin, an example, the environment it reads and the services it needs. The built-in modules have one each, and a package can ship its own at ",[456,465,466],{},"\u003Cpackage>\u002Frecipe",":",[469,470,475],"pre",{"className":471,"code":472,"language":473,"meta":474,"style":474},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ vercube add @acme\u002Fvercube-search\n","bash","",[456,476,477],{"__ignoreMap":474},[478,479,482,486,490,493],"span",{"class":480,"line":481},"line",1,[478,483,485],{"class":484},"sBMFI","$",[478,487,489],{"class":488},"sfazB"," vercube",[478,491,492],{"class":488}," add",[478,494,495],{"class":488}," @acme\u002Fvercube-search\n",[497,498,500],"h2",{"id":499},"a-recipe","A recipe",[469,502,507],{"className":503,"code":504,"filename":505,"language":506,"meta":474,"style":474},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineRecipe } from '@vercube\u002Fcli\u002Frecipe';\n\nconst CONTROLLER = `import { Controller, Get, QueryParam } from '@vercube\u002Fcore';\nimport { Inject } from '@vercube\u002Fdi';\nimport { SearchClient } from '@acme\u002Fvercube-search';\n\n@Controller('\u002Fapi\u002Fsearch')\nexport default class SearchController {\n  @Inject(SearchClient)\n  private gSearch!: SearchClient;\n\n  @Get('\u002F')\n  public async search(@QueryParam({ name: 'q' }) q: string): Promise\u003Cunknown> {\n    return this.gSearch.query(q);\n  }\n}\n`;\n\nexport default defineRecipe\u003C{ engine: string }>({\n  id: 'search',\n  label: 'Search',\n  prompts: [\n    {\n      name: 'engine',\n      flag: 'search-engine',\n      message: 'Search engine?',\n      default: 'meilisearch',\n      options: [\n        { value: 'meilisearch', label: 'Meilisearch' },\n        { value: 'typesense', label: 'Typesense' },\n      ],\n    },\n  ],\n  apply: ({ project, answers }) => {\n    project.addDependencies({ '@acme\u002Fvercube-search': '^1.0.0' });\n    project.addPlugin({\n      name: 'SearchPlugin',\n      from: '@acme\u002Fvercube-search',\n      options: `{ engine: '${answers.engine}', url: process.env.SEARCH_URL }`,\n    });\n    project.createFile('src\u002Fcontroller\u002FSearchController.ts', CONTROLLER);\n    project.bind({\n      name: 'SearchController',\n      from: '@\u002Fcontroller\u002FSearchController',\n      default: true,\n    });\n    project.addEnv({ SEARCH_URL: 'http:\u002F\u002F127.0.0.1:7700' }, 'Search');\n    if (answers.engine === 'meilisearch') {\n      project.addComposeService('meilisearch', {\n        image: 'getmeili\u002Fmeilisearch:v1.15',\n        ports: ['127.0.0.1:7700:7700'],\n      });\n    } else {\n      project.addComposeService('typesense', {\n        image: 'typesense\u002Ftypesense:29.0',\n        ports: ['127.0.0.1:8108:8108'],\n      });\n    }\n\n    project.note('Start the search engine with `docker compose up -d`');\n  },\n});\n","src\u002Frecipe.ts","ts",[456,508,509,541,547,566,572,578,583,589,595,601,607,612,618,624,630,636,642,650,655,688,706,723,734,740,757,774,791,808,818,853,884,892,898,906,935,975,989,1005,1021,1053,1063,1091,1105,1121,1137,1150,1159,1198,1227,1250,1267,1290,1300,1310,1331,1347,1367,1376,1382,1387,1410,1416],{"__ignoreMap":474},[478,510,511,515,519,523,526,529,532,535,538],{"class":480,"line":481},[478,512,514],{"class":513},"s7zQu","import",[478,516,518],{"class":517},"sMK4o"," {",[478,520,522],{"class":521},"sTEyZ"," defineRecipe",[478,524,525],{"class":517}," }",[478,527,528],{"class":513}," from",[478,530,531],{"class":517}," '",[478,533,534],{"class":488},"@vercube\u002Fcli\u002Frecipe",[478,536,537],{"class":517},"'",[478,539,540],{"class":517},";\n",[478,542,544],{"class":480,"line":543},2,[478,545,546],{"emptyLinePlaceholder":68},"\n",[478,548,550,554,557,560,563],{"class":480,"line":549},3,[478,551,553],{"class":552},"spNyl","const",[478,555,556],{"class":521}," CONTROLLER ",[478,558,559],{"class":517},"=",[478,561,562],{"class":517}," `",[478,564,565],{"class":488},"import { Controller, Get, QueryParam } from '@vercube\u002Fcore';\n",[478,567,569],{"class":480,"line":568},4,[478,570,571],{"class":488},"import { Inject } from '@vercube\u002Fdi';\n",[478,573,575],{"class":480,"line":574},5,[478,576,577],{"class":488},"import { SearchClient } from '@acme\u002Fvercube-search';\n",[478,579,581],{"class":480,"line":580},6,[478,582,546],{"emptyLinePlaceholder":68},[478,584,586],{"class":480,"line":585},7,[478,587,588],{"class":488},"@Controller('\u002Fapi\u002Fsearch')\n",[478,590,592],{"class":480,"line":591},8,[478,593,594],{"class":488},"export default class SearchController {\n",[478,596,598],{"class":480,"line":597},9,[478,599,600],{"class":488},"  @Inject(SearchClient)\n",[478,602,604],{"class":480,"line":603},10,[478,605,606],{"class":488},"  private gSearch!: SearchClient;\n",[478,608,610],{"class":480,"line":609},11,[478,611,546],{"emptyLinePlaceholder":68},[478,613,615],{"class":480,"line":614},12,[478,616,617],{"class":488},"  @Get('\u002F')\n",[478,619,621],{"class":480,"line":620},13,[478,622,623],{"class":488},"  public async search(@QueryParam({ name: 'q' }) q: string): Promise\u003Cunknown> {\n",[478,625,627],{"class":480,"line":626},14,[478,628,629],{"class":488},"    return this.gSearch.query(q);\n",[478,631,633],{"class":480,"line":632},15,[478,634,635],{"class":488},"  }\n",[478,637,639],{"class":480,"line":638},16,[478,640,641],{"class":488},"}\n",[478,643,645,648],{"class":480,"line":644},17,[478,646,647],{"class":517},"`",[478,649,540],{"class":517},[478,651,653],{"class":480,"line":652},18,[478,654,546],{"emptyLinePlaceholder":68},[478,656,658,661,664,667,670,674,676,679,682,685],{"class":480,"line":657},19,[478,659,660],{"class":513},"export",[478,662,663],{"class":513}," default",[478,665,522],{"class":666},"s2Zo4",[478,668,669],{"class":517},"\u003C{",[478,671,673],{"class":672},"swJcz"," engine",[478,675,467],{"class":517},[478,677,678],{"class":484}," string",[478,680,681],{"class":517}," }>",[478,683,684],{"class":521},"(",[478,686,687],{"class":517},"{\n",[478,689,691,694,696,698,701,703],{"class":480,"line":690},20,[478,692,693],{"class":672},"  id",[478,695,467],{"class":517},[478,697,531],{"class":517},[478,699,700],{"class":488},"search",[478,702,537],{"class":517},[478,704,705],{"class":517},",\n",[478,707,709,712,714,716,719,721],{"class":480,"line":708},21,[478,710,711],{"class":672},"  label",[478,713,467],{"class":517},[478,715,531],{"class":517},[478,717,718],{"class":488},"Search",[478,720,537],{"class":517},[478,722,705],{"class":517},[478,724,726,729,731],{"class":480,"line":725},22,[478,727,728],{"class":672},"  prompts",[478,730,467],{"class":517},[478,732,733],{"class":521}," [\n",[478,735,737],{"class":480,"line":736},23,[478,738,739],{"class":517},"    {\n",[478,741,743,746,748,750,753,755],{"class":480,"line":742},24,[478,744,745],{"class":672},"      name",[478,747,467],{"class":517},[478,749,531],{"class":517},[478,751,752],{"class":488},"engine",[478,754,537],{"class":517},[478,756,705],{"class":517},[478,758,760,763,765,767,770,772],{"class":480,"line":759},25,[478,761,762],{"class":672},"      flag",[478,764,467],{"class":517},[478,766,531],{"class":517},[478,768,769],{"class":488},"search-engine",[478,771,537],{"class":517},[478,773,705],{"class":517},[478,775,777,780,782,784,787,789],{"class":480,"line":776},26,[478,778,779],{"class":672},"      message",[478,781,467],{"class":517},[478,783,531],{"class":517},[478,785,786],{"class":488},"Search engine?",[478,788,537],{"class":517},[478,790,705],{"class":517},[478,792,794,797,799,801,804,806],{"class":480,"line":793},27,[478,795,796],{"class":672},"      default",[478,798,467],{"class":517},[478,800,531],{"class":517},[478,802,803],{"class":488},"meilisearch",[478,805,537],{"class":517},[478,807,705],{"class":517},[478,809,811,814,816],{"class":480,"line":810},28,[478,812,813],{"class":672},"      options",[478,815,467],{"class":517},[478,817,733],{"class":521},[478,819,821,824,827,829,831,833,835,838,841,843,845,848,850],{"class":480,"line":820},29,[478,822,823],{"class":517},"        {",[478,825,826],{"class":672}," value",[478,828,467],{"class":517},[478,830,531],{"class":517},[478,832,803],{"class":488},[478,834,537],{"class":517},[478,836,837],{"class":517},",",[478,839,840],{"class":672}," label",[478,842,467],{"class":517},[478,844,531],{"class":517},[478,846,847],{"class":488},"Meilisearch",[478,849,537],{"class":517},[478,851,852],{"class":517}," },\n",[478,854,856,858,860,862,864,867,869,871,873,875,877,880,882],{"class":480,"line":855},30,[478,857,823],{"class":517},[478,859,826],{"class":672},[478,861,467],{"class":517},[478,863,531],{"class":517},[478,865,866],{"class":488},"typesense",[478,868,537],{"class":517},[478,870,837],{"class":517},[478,872,840],{"class":672},[478,874,467],{"class":517},[478,876,531],{"class":517},[478,878,879],{"class":488},"Typesense",[478,881,537],{"class":517},[478,883,852],{"class":517},[478,885,887,890],{"class":480,"line":886},31,[478,888,889],{"class":521},"      ]",[478,891,705],{"class":517},[478,893,895],{"class":480,"line":894},32,[478,896,897],{"class":517},"    },\n",[478,899,901,904],{"class":480,"line":900},33,[478,902,903],{"class":521},"  ]",[478,905,705],{"class":517},[478,907,909,912,914,917,921,923,926,929,932],{"class":480,"line":908},34,[478,910,911],{"class":666},"  apply",[478,913,467],{"class":517},[478,915,916],{"class":517}," ({",[478,918,920],{"class":919},"sHdIc"," project",[478,922,837],{"class":517},[478,924,925],{"class":919}," answers",[478,927,928],{"class":517}," })",[478,930,931],{"class":552}," =>",[478,933,934],{"class":517}," {\n",[478,936,938,941,944,947,949,952,954,957,959,961,963,966,968,970,973],{"class":480,"line":937},35,[478,939,940],{"class":521},"    project",[478,942,943],{"class":517},".",[478,945,946],{"class":666},"addDependencies",[478,948,684],{"class":672},[478,950,951],{"class":517},"{",[478,953,531],{"class":517},[478,955,956],{"class":672},"@acme\u002Fvercube-search",[478,958,537],{"class":517},[478,960,467],{"class":517},[478,962,531],{"class":517},[478,964,965],{"class":488},"^1.0.0",[478,967,537],{"class":517},[478,969,525],{"class":517},[478,971,972],{"class":672},")",[478,974,540],{"class":517},[478,976,978,980,982,985,987],{"class":480,"line":977},36,[478,979,940],{"class":521},[478,981,943],{"class":517},[478,983,984],{"class":666},"addPlugin",[478,986,684],{"class":672},[478,988,687],{"class":517},[478,990,992,994,996,998,1001,1003],{"class":480,"line":991},37,[478,993,745],{"class":672},[478,995,467],{"class":517},[478,997,531],{"class":517},[478,999,1000],{"class":488},"SearchPlugin",[478,1002,537],{"class":517},[478,1004,705],{"class":517},[478,1006,1008,1011,1013,1015,1017,1019],{"class":480,"line":1007},38,[478,1009,1010],{"class":672},"      from",[478,1012,467],{"class":517},[478,1014,531],{"class":517},[478,1016,956],{"class":488},[478,1018,537],{"class":517},[478,1020,705],{"class":517},[478,1022,1024,1026,1028,1030,1033,1036,1039,1041,1043,1046,1049,1051],{"class":480,"line":1023},39,[478,1025,813],{"class":672},[478,1027,467],{"class":517},[478,1029,562],{"class":517},[478,1031,1032],{"class":488},"{ engine: '",[478,1034,1035],{"class":517},"${",[478,1037,1038],{"class":521},"answers",[478,1040,943],{"class":517},[478,1042,752],{"class":521},[478,1044,1045],{"class":517},"}",[478,1047,1048],{"class":488},"', url: process.env.SEARCH_URL }",[478,1050,647],{"class":517},[478,1052,705],{"class":517},[478,1054,1056,1059,1061],{"class":480,"line":1055},40,[478,1057,1058],{"class":517},"    }",[478,1060,972],{"class":672},[478,1062,540],{"class":517},[478,1064,1066,1068,1070,1073,1075,1077,1080,1082,1084,1087,1089],{"class":480,"line":1065},41,[478,1067,940],{"class":521},[478,1069,943],{"class":517},[478,1071,1072],{"class":666},"createFile",[478,1074,684],{"class":672},[478,1076,537],{"class":517},[478,1078,1079],{"class":488},"src\u002Fcontroller\u002FSearchController.ts",[478,1081,537],{"class":517},[478,1083,837],{"class":517},[478,1085,1086],{"class":521}," CONTROLLER",[478,1088,972],{"class":672},[478,1090,540],{"class":517},[478,1092,1094,1096,1098,1101,1103],{"class":480,"line":1093},42,[478,1095,940],{"class":521},[478,1097,943],{"class":517},[478,1099,1100],{"class":666},"bind",[478,1102,684],{"class":672},[478,1104,687],{"class":517},[478,1106,1108,1110,1112,1114,1117,1119],{"class":480,"line":1107},43,[478,1109,745],{"class":672},[478,1111,467],{"class":517},[478,1113,531],{"class":517},[478,1115,1116],{"class":488},"SearchController",[478,1118,537],{"class":517},[478,1120,705],{"class":517},[478,1122,1124,1126,1128,1130,1133,1135],{"class":480,"line":1123},44,[478,1125,1010],{"class":672},[478,1127,467],{"class":517},[478,1129,531],{"class":517},[478,1131,1132],{"class":488},"@\u002Fcontroller\u002FSearchController",[478,1134,537],{"class":517},[478,1136,705],{"class":517},[478,1138,1140,1142,1144,1148],{"class":480,"line":1139},45,[478,1141,796],{"class":672},[478,1143,467],{"class":517},[478,1145,1147],{"class":1146},"sfNiH"," true",[478,1149,705],{"class":517},[478,1151,1153,1155,1157],{"class":480,"line":1152},46,[478,1154,1058],{"class":517},[478,1156,972],{"class":672},[478,1158,540],{"class":517},[478,1160,1162,1164,1166,1169,1171,1173,1176,1178,1180,1183,1185,1188,1190,1192,1194,1196],{"class":480,"line":1161},47,[478,1163,940],{"class":521},[478,1165,943],{"class":517},[478,1167,1168],{"class":666},"addEnv",[478,1170,684],{"class":672},[478,1172,951],{"class":517},[478,1174,1175],{"class":672}," SEARCH_URL",[478,1177,467],{"class":517},[478,1179,531],{"class":517},[478,1181,1182],{"class":488},"http:\u002F\u002F127.0.0.1:7700",[478,1184,537],{"class":517},[478,1186,1187],{"class":517}," },",[478,1189,531],{"class":517},[478,1191,718],{"class":488},[478,1193,537],{"class":517},[478,1195,972],{"class":672},[478,1197,540],{"class":517},[478,1199,1201,1204,1207,1209,1211,1213,1216,1218,1220,1222,1225],{"class":480,"line":1200},48,[478,1202,1203],{"class":513},"    if",[478,1205,1206],{"class":672}," (",[478,1208,1038],{"class":521},[478,1210,943],{"class":517},[478,1212,752],{"class":521},[478,1214,1215],{"class":517}," ===",[478,1217,531],{"class":517},[478,1219,803],{"class":488},[478,1221,537],{"class":517},[478,1223,1224],{"class":672},") ",[478,1226,687],{"class":517},[478,1228,1230,1233,1235,1238,1240,1242,1244,1246,1248],{"class":480,"line":1229},49,[478,1231,1232],{"class":521},"      project",[478,1234,943],{"class":517},[478,1236,1237],{"class":666},"addComposeService",[478,1239,684],{"class":672},[478,1241,537],{"class":517},[478,1243,803],{"class":488},[478,1245,537],{"class":517},[478,1247,837],{"class":517},[478,1249,934],{"class":517},[478,1251,1253,1256,1258,1260,1263,1265],{"class":480,"line":1252},50,[478,1254,1255],{"class":672},"        image",[478,1257,467],{"class":517},[478,1259,531],{"class":517},[478,1261,1262],{"class":488},"getmeili\u002Fmeilisearch:v1.15",[478,1264,537],{"class":517},[478,1266,705],{"class":517},[478,1268,1270,1273,1275,1278,1280,1283,1285,1288],{"class":480,"line":1269},51,[478,1271,1272],{"class":672},"        ports",[478,1274,467],{"class":517},[478,1276,1277],{"class":672}," [",[478,1279,537],{"class":517},[478,1281,1282],{"class":488},"127.0.0.1:7700:7700",[478,1284,537],{"class":517},[478,1286,1287],{"class":672},"]",[478,1289,705],{"class":517},[478,1291,1293,1296,1298],{"class":480,"line":1292},52,[478,1294,1295],{"class":517},"      }",[478,1297,972],{"class":672},[478,1299,540],{"class":517},[478,1301,1303,1305,1308],{"class":480,"line":1302},53,[478,1304,1058],{"class":517},[478,1306,1307],{"class":513}," else",[478,1309,934],{"class":517},[478,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329],{"class":480,"line":1312},54,[478,1314,1232],{"class":521},[478,1316,943],{"class":517},[478,1318,1237],{"class":666},[478,1320,684],{"class":672},[478,1322,537],{"class":517},[478,1324,866],{"class":488},[478,1326,537],{"class":517},[478,1328,837],{"class":517},[478,1330,934],{"class":517},[478,1332,1334,1336,1338,1340,1343,1345],{"class":480,"line":1333},55,[478,1335,1255],{"class":672},[478,1337,467],{"class":517},[478,1339,531],{"class":517},[478,1341,1342],{"class":488},"typesense\u002Ftypesense:29.0",[478,1344,537],{"class":517},[478,1346,705],{"class":517},[478,1348,1350,1352,1354,1356,1358,1361,1363,1365],{"class":480,"line":1349},56,[478,1351,1272],{"class":672},[478,1353,467],{"class":517},[478,1355,1277],{"class":672},[478,1357,537],{"class":517},[478,1359,1360],{"class":488},"127.0.0.1:8108:8108",[478,1362,537],{"class":517},[478,1364,1287],{"class":672},[478,1366,705],{"class":517},[478,1368,1370,1372,1374],{"class":480,"line":1369},57,[478,1371,1295],{"class":517},[478,1373,972],{"class":672},[478,1375,540],{"class":517},[478,1377,1379],{"class":480,"line":1378},58,[478,1380,1381],{"class":517},"    }\n",[478,1383,1385],{"class":480,"line":1384},59,[478,1386,546],{"emptyLinePlaceholder":68},[478,1388,1390,1392,1394,1397,1399,1401,1404,1406,1408],{"class":480,"line":1389},60,[478,1391,940],{"class":521},[478,1393,943],{"class":517},[478,1395,1396],{"class":666},"note",[478,1398,684],{"class":672},[478,1400,537],{"class":517},[478,1402,1403],{"class":488},"Start the search engine with `docker compose up -d`",[478,1405,537],{"class":517},[478,1407,972],{"class":672},[478,1409,540],{"class":517},[478,1411,1413],{"class":480,"line":1412},61,[478,1414,1415],{"class":517},"  },\n",[478,1417,1419,1421,1423],{"class":480,"line":1418},62,[478,1420,1045],{"class":517},[478,1422,972],{"class":521},[478,1424,540],{"class":517},[452,1426,1427,1428,1431],{},"Export it from the package, and depend on ",[456,1429,1430],{},"@vercube\u002Fcli"," as a peer, since the project already has it:",[469,1433,1438],{"className":1434,"code":1435,"filename":1436,"language":1437,"meta":474,"style":474},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"exports\": {\n    \".\": \".\u002Fdist\u002Findex.mjs\",\n    \".\u002Frecipe\": \".\u002Fdist\u002Frecipe.mjs\"\n  },\n  \"peerDependencies\": {\n    \"@vercube\u002Fcli\": \"^1.5.0\"\n  }\n}\n","package.json","json",[456,1439,1440,1444,1459,1480,1499,1503,1516,1533,1537],{"__ignoreMap":474},[478,1441,1442],{"class":480,"line":481},[478,1443,687],{"class":517},[478,1445,1446,1449,1452,1455,1457],{"class":480,"line":543},[478,1447,1448],{"class":517},"  \"",[478,1450,1451],{"class":552},"exports",[478,1453,1454],{"class":517},"\"",[478,1456,467],{"class":517},[478,1458,934],{"class":517},[478,1460,1461,1464,1466,1468,1470,1473,1476,1478],{"class":480,"line":549},[478,1462,1463],{"class":517},"    \"",[478,1465,943],{"class":484},[478,1467,1454],{"class":517},[478,1469,467],{"class":517},[478,1471,1472],{"class":517}," \"",[478,1474,1475],{"class":488},".\u002Fdist\u002Findex.mjs",[478,1477,1454],{"class":517},[478,1479,705],{"class":517},[478,1481,1482,1484,1487,1489,1491,1493,1496],{"class":480,"line":568},[478,1483,1463],{"class":517},[478,1485,1486],{"class":484},".\u002Frecipe",[478,1488,1454],{"class":517},[478,1490,467],{"class":517},[478,1492,1472],{"class":517},[478,1494,1495],{"class":488},".\u002Fdist\u002Frecipe.mjs",[478,1497,1498],{"class":517},"\"\n",[478,1500,1501],{"class":480,"line":574},[478,1502,1415],{"class":517},[478,1504,1505,1507,1510,1512,1514],{"class":480,"line":580},[478,1506,1448],{"class":517},[478,1508,1509],{"class":552},"peerDependencies",[478,1511,1454],{"class":517},[478,1513,467],{"class":517},[478,1515,934],{"class":517},[478,1517,1518,1520,1522,1524,1526,1528,1531],{"class":480,"line":585},[478,1519,1463],{"class":517},[478,1521,1430],{"class":484},[478,1523,1454],{"class":517},[478,1525,467],{"class":517},[478,1527,1472],{"class":517},[478,1529,1530],{"class":488},"^1.5.0",[478,1532,1498],{"class":517},[478,1534,1535],{"class":480,"line":591},[478,1536,635],{"class":517},[478,1538,1539],{"class":480,"line":597},[478,1540,641],{"class":517},[452,1542,1543,1546,1547,1550,1551,1554,1555,943],{},[456,1544,1545],{},"vercube add @acme\u002Fvercube-search"," loads the recipe from the project's ",[456,1548,1549],{},"node_modules",", so the package is installed first. The recipe is added under the package name, whatever ",[456,1552,1553],{},"id"," it declares, and its questions take flags like the built-in ones: ",[456,1556,1557],{},"--search-engine typesense",[497,1559,1561],{"id":1560},"what-a-recipe-can-do","What a recipe can do",[452,1563,1564,1565,1568,1569,1571],{},"Every helper on ",[456,1566,1567],{},"project"," checks what is there before it changes anything. That is the one rule a recipe has to keep: applying it twice must change nothing, because ",[456,1570,462],{}," runs on projects that already have it.",[1573,1574,1575,1588],"table",{},[1576,1577,1578],"thead",{},[1579,1580,1581,1585],"tr",{},[1582,1583,1584],"th",{},"Helper",[1582,1586,1587],{},"Does",[1589,1590,1591,1606,1627,1641,1651,1669,1679,1700,1714,1734,1744],"tbody",{},[1579,1592,1593,1599],{},[1594,1595,1596],"td",{},[456,1597,1598],{},"addDependencies(deps, { dev })",[1594,1600,1601,1602,1605],{},"Adds to the app's package.json, keeping what is there; ",[456,1603,1604],{},"@vercube\u002F*"," is pinned to the CLI's version",[1579,1607,1608,1613],{},[1594,1609,1610],{},[456,1611,1612],{},"addPlugin({ name, from, options, imports })",[1594,1614,1615,1616,1619,1620,1623,1624],{},"Imports the plugin and adds ",[456,1617,1618],{},"withPluginOptions(Plugin, options)"," to ",[456,1621,1622],{},"plugins"," in ",[456,1625,1626],{},"vercube.config.ts",[1579,1628,1629,1634],{},[1594,1630,1631],{},[456,1632,1633],{},"bind({ name, from, default })",[1594,1635,1636,1637,1640],{},"Imports a class and adds ",[456,1638,1639],{},"container.bind(Class)"," to the container setup",[1579,1642,1643,1648],{},[1594,1644,1645],{},[456,1646,1647],{},"addToContainer(code, imports)",[1594,1649,1650],{},"Adds a statement to the container setup, such as a storage mount",[1579,1652,1653,1658],{},[1594,1654,1655],{},[456,1656,1657],{},"addToEntry(code, { position, imports })",[1594,1659,1660,1661,1664,1665,1668],{},"Adds a statement to ",[456,1662,1663],{},"src\u002Findex.ts",", before ",[456,1666,1667],{},"createApp()"," or at the end",[1579,1670,1671,1676],{},[1594,1672,1673],{},[456,1674,1675],{},"createFile(path, content)",[1594,1677,1678],{},"Creates a file, never overwriting one",[1579,1680,1681,1686],{},[1594,1682,1683],{},[456,1684,1685],{},"addEnv(vars, comment, example)",[1594,1687,1688,1689,459,1692,1695,1696,1699],{},"Adds to ",[456,1690,1691],{},".env",[456,1693,1694],{},".env.example","; ",[456,1697,1698],{},"example"," keeps a generated secret out of the committed file",[1579,1701,1702,1707],{},[1594,1703,1704],{},[456,1705,1706],{},"addComposeService(name, service)",[1594,1708,1709,1710,1713],{},"Adds a service to ",[456,1711,1712],{},"docker-compose.yml"," at the project root",[1579,1715,1716,1731],{},[1594,1717,1718,1721,1722,1721,1725,1721,1728],{},[456,1719,1720],{},"addScript",", ",[456,1723,1724],{},"addLines",[456,1726,1727],{},"updateJson",[456,1729,1730],{},"setConfig",[1594,1732,1733],{},"package.json scripts, lines of a text file, any JSON file, a top-level config option",[1579,1735,1736,1741],{},[1594,1737,1738],{},[456,1739,1740],{},"allowBuilds(packages)",[1594,1742,1743],{},"Approves install scripts for pnpm, which stops an install with an unapproved one",[1579,1745,1746,1751],{},[1594,1747,1748],{},[456,1749,1750],{},"note(text)",[1594,1752,1753],{},"A line for the summary",[452,1755,1756,1757,1760],{},"Options and statements are code, passed as strings and parsed: a recipe never concatenates into a source file. When a project does not look as expected, a helper throws a ",[456,1758,1759],{},"RecipeError"," that says what to add by hand. A recipe that throws, for that or any other reason, has every file of the run put back as it was, including what earlier helpers and recipes of the same run changed.",[497,1762,1764],{"id":1763},"depending-on-other-recipes","Depending on other recipes",[452,1766,1767,1770,1771,1774,1775,1777],{},[456,1768,1769],{},"requires"," adds another recipe and applies it first; the summary names what was added. ",[456,1772,1773],{},"after"," only orders, for a recipe that adapts when the other one is there. Both take the ids of built-in modules (a recipe from another package is added by naming that package in the same command), and ",[456,1776,1769],{}," can depend on the answers:",[469,1779,1781],{"className":503,"code":1780,"language":506,"meta":474,"style":474},"defineRecipe\u003C{ engine: string }>({\n  id: 'search',\n  label: 'Search',\n  prompts: [\u002F* the engine question above *\u002F],\n  requires: (answers) => (answers.engine === 'meilisearch' ? ['cache'] : []),\n  after: ['telemetry'],\n  apply: ({ project, selected }) => {\n    if (selected.has('telemetry')) {\n      \u002F\u002F add a span around queries\n    }\n  },\n});\n",[456,1782,1783,1802,1816,1830,1846,1900,1920,1941,1968,1973,1977,1981],{"__ignoreMap":474},[478,1784,1785,1788,1790,1792,1794,1796,1798,1800],{"class":480,"line":481},[478,1786,1787],{"class":666},"defineRecipe",[478,1789,669],{"class":517},[478,1791,673],{"class":672},[478,1793,467],{"class":517},[478,1795,678],{"class":484},[478,1797,681],{"class":517},[478,1799,684],{"class":521},[478,1801,687],{"class":517},[478,1803,1804,1806,1808,1810,1812,1814],{"class":480,"line":543},[478,1805,693],{"class":672},[478,1807,467],{"class":517},[478,1809,531],{"class":517},[478,1811,700],{"class":488},[478,1813,537],{"class":517},[478,1815,705],{"class":517},[478,1817,1818,1820,1822,1824,1826,1828],{"class":480,"line":549},[478,1819,711],{"class":672},[478,1821,467],{"class":517},[478,1823,531],{"class":517},[478,1825,718],{"class":488},[478,1827,537],{"class":517},[478,1829,705],{"class":517},[478,1831,1832,1834,1836,1838,1842,1844],{"class":480,"line":568},[478,1833,728],{"class":672},[478,1835,467],{"class":517},[478,1837,1277],{"class":521},[478,1839,1841],{"class":1840},"sHwdD","\u002F* the engine question above *\u002F",[478,1843,1287],{"class":521},[478,1845,705],{"class":517},[478,1847,1848,1851,1853,1855,1857,1859,1861,1864,1866,1869,1872,1874,1876,1878,1881,1883,1885,1888,1890,1893,1895,1898],{"class":480,"line":574},[478,1849,1850],{"class":666},"  requires",[478,1852,467],{"class":517},[478,1854,1206],{"class":517},[478,1856,1038],{"class":919},[478,1858,972],{"class":517},[478,1860,931],{"class":552},[478,1862,1863],{"class":521}," (answers",[478,1865,943],{"class":517},[478,1867,1868],{"class":521},"engine ",[478,1870,1871],{"class":517},"===",[478,1873,531],{"class":517},[478,1875,803],{"class":488},[478,1877,537],{"class":517},[478,1879,1880],{"class":517}," ?",[478,1882,1277],{"class":521},[478,1884,537],{"class":517},[478,1886,1887],{"class":488},"cache",[478,1889,537],{"class":517},[478,1891,1892],{"class":521},"] ",[478,1894,467],{"class":517},[478,1896,1897],{"class":521}," [])",[478,1899,705],{"class":517},[478,1901,1902,1905,1907,1909,1911,1914,1916,1918],{"class":480,"line":580},[478,1903,1904],{"class":672},"  after",[478,1906,467],{"class":517},[478,1908,1277],{"class":521},[478,1910,537],{"class":517},[478,1912,1913],{"class":488},"telemetry",[478,1915,537],{"class":517},[478,1917,1287],{"class":521},[478,1919,705],{"class":517},[478,1921,1922,1924,1926,1928,1930,1932,1935,1937,1939],{"class":480,"line":585},[478,1923,911],{"class":666},[478,1925,467],{"class":517},[478,1927,916],{"class":517},[478,1929,920],{"class":919},[478,1931,837],{"class":517},[478,1933,1934],{"class":919}," selected",[478,1936,928],{"class":517},[478,1938,931],{"class":552},[478,1940,934],{"class":517},[478,1942,1943,1945,1947,1950,1952,1955,1957,1959,1961,1963,1966],{"class":480,"line":591},[478,1944,1203],{"class":513},[478,1946,1206],{"class":672},[478,1948,1949],{"class":521},"selected",[478,1951,943],{"class":517},[478,1953,1954],{"class":666},"has",[478,1956,684],{"class":672},[478,1958,537],{"class":517},[478,1960,1913],{"class":488},[478,1962,537],{"class":517},[478,1964,1965],{"class":672},")) ",[478,1967,687],{"class":517},[478,1969,1970],{"class":480,"line":597},[478,1971,1972],{"class":1840},"      \u002F\u002F add a span around queries\n",[478,1974,1975],{"class":480,"line":603},[478,1976,1381],{"class":517},[478,1978,1979],{"class":480,"line":609},[478,1980,1415],{"class":517},[478,1982,1983,1985,1987],{"class":480,"line":614},[478,1984,1045],{"class":517},[478,1986,972],{"class":521},[478,1988,540],{"class":517},[497,1990,1992],{"id":1991},"testing-it","Testing it",[452,1994,1995,1998,1999,2001],{},[456,1996,1997],{},"applyRecipes"," from ",[456,2000,534],{}," applies recipes to a directory without the CLI. Apply yours to a copy of the starter twice, and check the second run changed nothing:",[469,2003,2005],{"className":503,"code":2004,"language":506,"meta":474,"style":474},"import { applyRecipes, Project } from '@vercube\u002Fcli\u002Frecipe';\nimport recipe from '..\u002Fsrc\u002Frecipe';\n\nconst first = await applyRecipes(\n  new Project(dir, { version: '1.5.0' }),\n  ['search'],\n  [recipe],\n);\nconst second = await applyRecipes(\n  new Project(dir, { version: '1.5.0' }),\n  ['search'],\n  [recipe],\n);\n\nexpect(second).toMatchObject({ created: [], updated: [], dependencies: [] });\n",[456,2006,2007,2033,2052,2056,2073,2105,2120,2127,2133,2148,2176,2190,2196,2202,2206],{"__ignoreMap":474},[478,2008,2009,2011,2013,2016,2018,2021,2023,2025,2027,2029,2031],{"class":480,"line":481},[478,2010,514],{"class":513},[478,2012,518],{"class":517},[478,2014,2015],{"class":521}," applyRecipes",[478,2017,837],{"class":517},[478,2019,2020],{"class":521}," Project",[478,2022,525],{"class":517},[478,2024,528],{"class":513},[478,2026,531],{"class":517},[478,2028,534],{"class":488},[478,2030,537],{"class":517},[478,2032,540],{"class":517},[478,2034,2035,2037,2040,2043,2045,2048,2050],{"class":480,"line":543},[478,2036,514],{"class":513},[478,2038,2039],{"class":521}," recipe ",[478,2041,2042],{"class":513},"from",[478,2044,531],{"class":517},[478,2046,2047],{"class":488},"..\u002Fsrc\u002Frecipe",[478,2049,537],{"class":517},[478,2051,540],{"class":517},[478,2053,2054],{"class":480,"line":549},[478,2055,546],{"emptyLinePlaceholder":68},[478,2057,2058,2060,2063,2065,2068,2070],{"class":480,"line":568},[478,2059,553],{"class":552},[478,2061,2062],{"class":521}," first ",[478,2064,559],{"class":517},[478,2066,2067],{"class":513}," await",[478,2069,2015],{"class":666},[478,2071,2072],{"class":521},"(\n",[478,2074,2075,2078,2080,2083,2085,2087,2090,2092,2094,2097,2099,2101,2103],{"class":480,"line":574},[478,2076,2077],{"class":517},"  new",[478,2079,2020],{"class":666},[478,2081,2082],{"class":521},"(dir",[478,2084,837],{"class":517},[478,2086,518],{"class":517},[478,2088,2089],{"class":672}," version",[478,2091,467],{"class":517},[478,2093,531],{"class":517},[478,2095,2096],{"class":488},"1.5.0",[478,2098,537],{"class":517},[478,2100,525],{"class":517},[478,2102,972],{"class":521},[478,2104,705],{"class":517},[478,2106,2107,2110,2112,2114,2116,2118],{"class":480,"line":580},[478,2108,2109],{"class":521},"  [",[478,2111,537],{"class":517},[478,2113,700],{"class":488},[478,2115,537],{"class":517},[478,2117,1287],{"class":521},[478,2119,705],{"class":517},[478,2121,2122,2125],{"class":480,"line":585},[478,2123,2124],{"class":521},"  [recipe]",[478,2126,705],{"class":517},[478,2128,2129,2131],{"class":480,"line":591},[478,2130,972],{"class":521},[478,2132,540],{"class":517},[478,2134,2135,2137,2140,2142,2144,2146],{"class":480,"line":597},[478,2136,553],{"class":552},[478,2138,2139],{"class":521}," second ",[478,2141,559],{"class":517},[478,2143,2067],{"class":513},[478,2145,2015],{"class":666},[478,2147,2072],{"class":521},[478,2149,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174],{"class":480,"line":603},[478,2151,2077],{"class":517},[478,2153,2020],{"class":666},[478,2155,2082],{"class":521},[478,2157,837],{"class":517},[478,2159,518],{"class":517},[478,2161,2089],{"class":672},[478,2163,467],{"class":517},[478,2165,531],{"class":517},[478,2167,2096],{"class":488},[478,2169,537],{"class":517},[478,2171,525],{"class":517},[478,2173,972],{"class":521},[478,2175,705],{"class":517},[478,2177,2178,2180,2182,2184,2186,2188],{"class":480,"line":609},[478,2179,2109],{"class":521},[478,2181,537],{"class":517},[478,2183,700],{"class":488},[478,2185,537],{"class":517},[478,2187,1287],{"class":521},[478,2189,705],{"class":517},[478,2191,2192,2194],{"class":480,"line":614},[478,2193,2124],{"class":521},[478,2195,705],{"class":517},[478,2197,2198,2200],{"class":480,"line":620},[478,2199,972],{"class":521},[478,2201,540],{"class":517},[478,2203,2204],{"class":480,"line":626},[478,2205,546],{"emptyLinePlaceholder":68},[478,2207,2208,2211,2214,2216,2219,2221,2223,2226,2228,2231,2233,2236,2238,2240,2242,2245,2247,2250,2252,2254],{"class":480,"line":632},[478,2209,2210],{"class":666},"expect",[478,2212,2213],{"class":521},"(second)",[478,2215,943],{"class":517},[478,2217,2218],{"class":666},"toMatchObject",[478,2220,684],{"class":521},[478,2222,951],{"class":517},[478,2224,2225],{"class":672}," created",[478,2227,467],{"class":517},[478,2229,2230],{"class":521}," []",[478,2232,837],{"class":517},[478,2234,2235],{"class":672}," updated",[478,2237,467],{"class":517},[478,2239,2230],{"class":521},[478,2241,837],{"class":517},[478,2243,2244],{"class":672}," dependencies",[478,2246,467],{"class":517},[478,2248,2249],{"class":521}," [] ",[478,2251,1045],{"class":517},[478,2253,972],{"class":521},[478,2255,540],{"class":517},[2257,2258,2259],"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 .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 .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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}",{"title":474,"searchDepth":481,"depth":543,"links":2261},[2262,2263,2264,2265],{"id":499,"depth":543,"text":500},{"id":1560,"depth":543,"text":1561},{"id":1763,"depth":543,"text":1764},{"id":1991,"depth":543,"text":1992},"Ship a recipe with your module so vercube add wires it into a project","md",null,{},{"title":337,"description":2266},"5y8NaNKWcoEqQ77mzdIcYLeZnQAI727nZTtqCr6ut-k",[2273,2268],{"title":333,"path":334,"stem":335,"description":2274,"children":-1},"Learn how to create custom CLI commands in Vercube using class-based decorators, register them in vercube.config.ts, and inject services via the DI container",1794396674662]