[{"data":1,"prerenderedAt":1563},["ShallowReactive",2],{"docs-navigation":3,"docs:\u002Fdocs\u002Fnuxt\u002Fcache\u002Fusage":618,"\u002Fdocs\u002Fnuxt\u002Fcache\u002Fusage:surround":1559},[4],{"title":5,"path":6,"children":7},"Docs","\u002Fdocs",[8,316,467],{"title":9,"path":10,"children":11},"Vite","\u002Fdocs\u002Fvite",[12,30,52,63,78,100,174,183,219,238,255,273,304],{"title":13,"path":14,"description":15,"icon":16,"children":17},"Getting Started","\u002Fdocs\u002Fvite\u002Fgetting-started","Learn the ViteHub package model, pick a starting path, and get to a working feature quickly.","i-lucide-rocket",[18,22,26],{"title":19,"path":20,"description":21},"Choose a Package","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Fchoose-a-package","Pick the right ViteHub feature by the job you need to solve on the server.",{"title":23,"path":24,"description":25},"Entrypoints","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Fentrypoints","Understand what belongs on the package root and what each framework-specific entrypoint owns.",{"title":27,"path":28,"description":29},"Architecture","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Farchitecture","How ViteHub keeps one shared feature bridge across Vite, Nitro, and Nuxt.",{"title":31,"path":32,"description":33,"icon":34,"children":35},"Database","\u002Fdocs\u002Fvite\u002Fdatabase","Set up Drizzle or Prisma with `@vitehub\u002Fdb` and explicit ORM runtime imports.","i-lucide-database",[36,40,44,48],{"title":37,"path":38,"description":39},"Drizzle","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fdrizzle","Configure Drizzle with `@vitehub\u002Fdb\u002Fdrizzle`, schema discovery, and committed SQL migrations.",{"title":41,"path":42,"description":43},"Prisma","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fprisma","Configure Prisma with `@vitehub\u002Fdb\u002Fprisma`, generated client output, and native Prisma migrations.",{"title":45,"path":46,"description":47},"Migrations","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fmigrations","Understand when ViteHub applies committed Drizzle and Prisma migrations during development and build.",{"title":49,"path":50,"description":51},"Platform notes","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fplatform-notes","Review driver defaults, hosting behavior, and current runtime limits for Drizzle and Prisma.",{"title":53,"path":54,"description":55,"icon":56,"children":57},"KV","\u002Fdocs\u002Fvite\u002Fkv","Set up key-value storage with the same provider detection used by NuxtHub.","i-lucide-database-zap",[58],{"title":59,"path":60,"description":61,"icon":62},"Usage","\u002Fdocs\u002Fvite\u002Fkv\u002Fusage","Use the KV SDK to set, get, delete, clear, and list key-value pairs.","i-lucide-code",{"title":64,"path":65,"description":66,"icon":67,"children":68},"Blob","\u002Fdocs\u002Fvite\u002Fblob","Add blob storage for images, videos, documents, and other files with `@vitehub\u002Fblob`.","i-lucide-shapes",[69,74],{"title":70,"path":71,"description":72,"icon":73},"Upload","\u002Fdocs\u002Fvite\u002Fblob\u002Fupload","Upload files with validation, simple form handlers, and multipart flows using `@vitehub\u002Fblob`.","i-lucide-upload",{"title":75,"path":76,"description":77,"icon":62},"Blob SDK","\u002Fdocs\u002Fvite\u002Fblob\u002Fusage","Store, read, list, validate, serve, and delete files with `@vitehub\u002Fblob`.",{"title":79,"path":80,"description":81,"icon":82,"children":83},"Vector","\u002Fdocs\u002Fvite\u002Fvector","Add provider-agnostic named vector indexes with similarity search.","i-lucide-scan-search",[84,90,95],{"title":85,"path":86,"description":87,"icon":88,"group":89},"Cloudflare","\u002Fdocs\u002Fvite\u002Fvector\u002Fcloudflare","Configure @vitehub\u002Fvector against Cloudflare Vectorize.","i-simple-icons-cloudflare","Providers",{"title":91,"path":92,"description":93,"icon":94,"group":89},"Postgres","\u002Fdocs\u002Fvite\u002Fvector\u002Fpostgres","Configure @vitehub\u002Fvector against a pgvector-backed Postgres database.","i-simple-icons-postgresql",{"title":96,"path":97,"description":98,"icon":99,"group":89},"Upstash","\u002Fdocs\u002Fvite\u002Fvector\u002Fupstash","Configure @vitehub\u002Fvector against the Upstash Vector HTTP API.","i-simple-icons-upstash",{"title":101,"path":102,"description":103,"icon":104,"children":105},"Queue","\u002Fdocs\u002Fvite\u002Fqueue","Send background jobs through Platformatic, Cloudflare, Vercel, Netlify, Upstash QStash, or Memory.","i-lucide-layers",[106,110,114,118,123,127,131,135,139,144,147,152,157,161,166,170],{"title":107,"path":108,"description":109},"Quickstart","\u002Fdocs\u002Fvite\u002Fqueue\u002Fquickstart","Get a first queue working locally with the memory provider.",{"title":111,"path":112,"description":113},"Runtime API","\u002Fdocs\u002Fvite\u002Fqueue\u002Fruntime-api","Reference for defineQueue, runQueue, deferQueue, getQueue, and the core Queue types.",{"title":115,"path":116,"description":117},"When to use Queue","\u002Fdocs\u002Fvite\u002Fqueue\u002Fwhen-to-use","Decide when Queue is the right primitive compared with Workflow, Cron, or inline request handling.",{"title":119,"path":120,"description":121,"group":122},"Send a job","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fsend-a-job","Enqueue payloads with runQueue and the common delivery patterns.","Guides",{"title":124,"path":125,"description":126,"group":122},"Defer after response","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fdefer-after-response","Use deferQueue when the queue send should happen after the current response is committed.",{"title":128,"path":129,"description":130,"group":122},"Validate payloads","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fvalidate-payloads","Validate payloads before enqueueing and before running queue handlers.",{"title":132,"path":133,"description":134,"group":122},"Local development","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Flocal-development","Use the memory provider for local development and understand how auto-selection works.",{"title":136,"path":137,"description":138,"group":122},"Native handles","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fnative-handles","Know when to use getQueue and provider-native methods instead of the portable runtime API.",{"title":140,"path":141,"description":142,"icon":143,"group":89},"Platformatic","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fplatformatic","Configure Platformatic Job Queue with local or self-hosted workers.","i-brand-platformatic",{"title":85,"path":145,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fcloudflare","Configure Cloudflare Queues and process named queues in Workers.",{"title":148,"path":149,"description":150,"icon":151,"group":89},"Vercel","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fvercel","Configure Vercel Queue and send named jobs through Vercel.","i-simple-icons-vercel",{"title":153,"path":154,"description":155,"icon":156,"group":89},"Netlify","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fnetlify","Configure Netlify Async Workloads and run named queues on Netlify.","i-simple-icons-netlify",{"title":158,"path":159,"description":160,"icon":99,"group":89},"Upstash QStash","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fupstash-qstash","Configure Upstash QStash for queues and signed callback delivery.",{"title":162,"path":163,"description":164,"icon":165,"group":89},"Memory","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fmemory","Process queue jobs in-memory for local development and testing.","i-lucide-memory-stick",{"title":167,"path":168,"description":169},"Troubleshooting","\u002Fdocs\u002Fvite\u002Fqueue\u002Ftroubleshooting","Diagnose common Queue setup and runtime problems across local and hosted providers.",{"title":171,"path":172,"description":173},"Playground","\u002Fdocs\u002Fvite\u002Fqueue\u002Fplayground","Explore the existing Queue playground app and the files that show the end-to-end runtime flow.",{"title":175,"path":176,"description":177,"icon":178,"children":179},"Cache","\u002Fdocs\u002Fvite\u002Fcache","Configure Nitro cache storage for local development, Vercel, and Cloudflare deployments.","i-lucide-timer-reset",[180],{"title":59,"path":181,"description":182,"icon":62},"\u002Fdocs\u002Fvite\u002Fcache\u002Fusage","Cache routes and server functions with practical invalidation examples.",{"title":184,"path":185,"description":186,"icon":187,"children":188},"Email","\u002Fdocs\u002Fvite\u002Femail","Render markdown email files and send them through Resend, SendGrid, or Postmark.","i-lucide-mail",[189,194,199,204,209,214],{"title":190,"path":191,"description":192,"icon":193},"Frontmatter","\u002Fdocs\u002Fvite\u002Femail\u002Ffrontmatter","Define subject lines, recipients, metadata, and delivery defaults directly in the Markdown email file.","i-lucide-file-text",{"title":195,"path":196,"description":197,"icon":198},"Input Schemas","\u002Fdocs\u002Fvite\u002Femail\u002Finput-schemas","Add an embedded schema block when you want email input validation and stronger TypeScript inference.","i-brand-standard-schema",{"title":200,"path":201,"description":202,"icon":203},"i18n","\u002Fdocs\u002Fvite\u002Femail\u002Fi18n","Localize Markdown emails with locale-specific template files and ICU message formatting.","i-lucide-languages",{"title":205,"path":206,"description":207,"icon":208,"group":89},"Resend","\u002Fdocs\u002Fvite\u002Femail\u002Fresend","Configure Resend for transactional delivery and native batch sending.","i-provider-resend",{"title":210,"path":211,"description":212,"icon":213,"group":89},"SendGrid","\u002Fdocs\u002Fvite\u002Femail\u002Fsendgrid","Configure SendGrid when you need advanced delivery controls and template support.","i-provider-sendgrid",{"title":215,"path":216,"description":217,"icon":218,"group":89},"Postmark","\u002Fdocs\u002Fvite\u002Femail\u002Fpostmark","Configure Postmark for transactional streams and template-first sends.","i-provider-postmark",{"title":220,"path":221,"description":222,"icon":223,"children":224},"Workflow","\u002Fdocs\u002Fvite\u002Fworkflow","Run durable workflows on Cloudflare, Netlify, Vercel, or OpenWorkflow.","i-lucide-workflow",[225,228,231,235],{"title":85,"path":226,"description":227,"icon":88},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fcloudflare","Configure Cloudflare Workflows and inspect runs from your app.",{"title":148,"path":229,"description":230,"icon":151},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fvercel","Configure Vercel Workflow and run durable workflows on Vercel.",{"title":232,"path":233,"description":234,"icon":223},"OpenWorkflow","\u002Fdocs\u002Fvite\u002Fworkflow\u002Fopenworkflow","Connect OpenWorkflow and use your own workflow backend behind the ViteHub API.",{"title":153,"path":236,"description":237,"icon":156},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fnetlify","Configure Netlify Async Workloads and run discovered workflows on Netlify.",{"title":239,"path":240,"description":241,"icon":242,"children":243},"Cron","\u002Fdocs\u002Fvite\u002Fcron","Schedule crons with Node, Cloudflare, or Vercel.","i-lucide-list-check",[244,249,252],{"title":245,"path":246,"description":247,"icon":248},"Node","\u002Fdocs\u002Fvite\u002Fcron\u002Fnode","Configure in-process scheduling for local crons and lightweight cron tasks.","i-simple-icons-nodedotjs",{"title":85,"path":250,"description":251,"icon":88},"\u002Fdocs\u002Fvite\u002Fcron\u002Fcloudflare","Configure Cloudflare-triggered schedules for your crons.",{"title":148,"path":253,"description":254,"icon":151},"\u002Fdocs\u002Fvite\u002Fcron\u002Fvercel","Generate Vercel cron config from discovered crons.",{"title":256,"path":257,"description":258,"icon":259,"children":260},"Browser","\u002Fdocs\u002Fvite\u002Fbrowser","Run named browser automations against Playwright, Browserbase, or Cloudflare Browser Rendering.","i-lucide-monitor-play",[261,264,269],{"title":85,"path":262,"description":263,"icon":88},"\u002Fdocs\u002Fvite\u002Fbrowser\u002Fcloudflare","Configure Cloudflare Browser Rendering through the official `cloudflare` package.",{"title":265,"path":266,"description":267,"icon":268},"Browserbase","\u002Fdocs\u002Fvite\u002Fbrowser\u002Fbrowserbase","Configure Browserbase for managed CDP sessions and session-aware browser calls.","i-lucide-orbit",{"title":270,"path":271,"description":272,"icon":259},"Playwright","\u002Fdocs\u002Fvite\u002Fbrowser\u002Fplaywright","Configure remote Playwright browser sessions over a WebSocket endpoint.",{"title":274,"path":275,"description":276,"icon":277,"children":278},"Sandbox","\u002Fdocs\u002Fvite\u002Fsandbox","Run isolated sandboxes on Cloudflare Durable Objects, Cloudflare Dynamic Workers, Vercel, Deno, Docker, or locally.","i-lucide-box",[279,282,286,289,294,299],{"title":85,"path":280,"description":281,"icon":88},"\u002Fdocs\u002Fvite\u002Fsandbox\u002Fcloudflare","Configure Cloudflare Sandbox on top of Durable Objects.",{"title":283,"path":284,"description":285,"icon":88},"Cloudflare Dynamic","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fcloudflare-dynamic","Configure Cloudflare Dynamic Workers with the Worker Loader API.",{"title":148,"path":287,"description":288,"icon":151},"\u002Fdocs\u002Fvite\u002Fsandbox\u002Fvercel","Configure Vercel Sandbox and run isolated sandboxes on Vercel.",{"title":290,"path":291,"description":292,"icon":293},"Deno","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fdeno","Configure Deno Sandbox and run isolated sandboxes on Deno Deploy.","i-simple-icons-deno",{"title":295,"path":296,"description":297,"icon":298},"Docker","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fdocker","Configure Docker Sandbox and run isolated sandboxes locally.","i-simple-icons-docker",{"title":300,"path":301,"description":302,"icon":303},"Local","\u002Fdocs\u002Fvite\u002Fsandbox\u002Flocal","Run sandboxes locally with OS-level isolation using platform primitives.","i-lucide-monitor",{"title":305,"path":306,"description":307,"icon":308,"children":309},"Analytics","\u002Fdocs\u002Fvite\u002Fanalytics","Integrate explicit analytics backends with a small shared runtime API.","i-lucide-megaphone",[310,313],{"title":148,"path":311,"description":312,"icon":151},"\u002Fdocs\u002Fvite\u002Fanalytics\u002Fvercel","Configure Vercel Analytics through the official SDK and keep a small portable runtime API.",{"title":85,"path":314,"description":315,"icon":88},"\u002Fdocs\u002Fvite\u002Fanalytics\u002Fcloudflare","Configure first-party analytics ingestion on Cloudflare and query a semantic event shape on top of Analytics Engine slots.",{"title":317,"path":318,"children":319},"Nitro","\u002Fdocs\u002Fnitro",[320,329,340,345,352,361,396,401,416,427,436,445,460],{"title":13,"path":321,"description":15,"icon":16,"children":322},"\u002Fdocs\u002Fnitro\u002Fgetting-started",[323,325,327],{"title":19,"path":324,"description":21},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Fchoose-a-package",{"title":23,"path":326,"description":25},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Fentrypoints",{"title":27,"path":328,"description":29},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Farchitecture",{"title":31,"path":330,"description":33,"icon":34,"children":331},"\u002Fdocs\u002Fnitro\u002Fdatabase",[332,334,336,338],{"title":37,"path":333,"description":39},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fdrizzle",{"title":41,"path":335,"description":43},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fprisma",{"title":45,"path":337,"description":47},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fmigrations",{"title":49,"path":339,"description":51},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fplatform-notes",{"title":53,"path":341,"description":55,"icon":56,"children":342},"\u002Fdocs\u002Fnitro\u002Fkv",[343],{"title":59,"path":344,"description":61,"icon":62},"\u002Fdocs\u002Fnitro\u002Fkv\u002Fusage",{"title":64,"path":346,"description":66,"icon":67,"children":347},"\u002Fdocs\u002Fnitro\u002Fblob",[348,350],{"title":70,"path":349,"description":72,"icon":73},"\u002Fdocs\u002Fnitro\u002Fblob\u002Fupload",{"title":75,"path":351,"description":77,"icon":62},"\u002Fdocs\u002Fnitro\u002Fblob\u002Fusage",{"title":79,"path":353,"description":81,"icon":82,"children":354},"\u002Fdocs\u002Fnitro\u002Fvector",[355,357,359],{"title":85,"path":356,"description":87,"icon":88,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fcloudflare",{"title":91,"path":358,"description":93,"icon":94,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fpostgres",{"title":96,"path":360,"description":98,"icon":99,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fupstash",{"title":101,"path":362,"description":103,"icon":104,"children":363},"\u002Fdocs\u002Fnitro\u002Fqueue",[364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394],{"title":107,"path":365,"description":109},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fquickstart",{"title":111,"path":367,"description":113},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fruntime-api",{"title":115,"path":369,"description":117},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fwhen-to-use",{"title":119,"path":371,"description":121,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fsend-a-job",{"title":124,"path":373,"description":126,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fdefer-after-response",{"title":128,"path":375,"description":130,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fvalidate-payloads",{"title":132,"path":377,"description":134,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Flocal-development",{"title":136,"path":379,"description":138,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fnative-handles",{"title":140,"path":381,"description":142,"icon":143,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fplatformatic",{"title":85,"path":383,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fcloudflare",{"title":148,"path":385,"description":150,"icon":151,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fvercel",{"title":153,"path":387,"description":155,"icon":156,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fnetlify",{"title":158,"path":389,"description":160,"icon":99,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fupstash-qstash",{"title":162,"path":391,"description":164,"icon":165,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fmemory",{"title":167,"path":393,"description":169},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Ftroubleshooting",{"title":171,"path":395,"description":173},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fplayground",{"title":175,"path":397,"description":177,"icon":178,"children":398},"\u002Fdocs\u002Fnitro\u002Fcache",[399],{"title":59,"path":400,"description":182,"icon":62},"\u002Fdocs\u002Fnitro\u002Fcache\u002Fusage",{"title":184,"path":402,"description":186,"icon":187,"children":403},"\u002Fdocs\u002Fnitro\u002Femail",[404,406,408,410,412,414],{"title":190,"path":405,"description":192,"icon":193},"\u002Fdocs\u002Fnitro\u002Femail\u002Ffrontmatter",{"title":195,"path":407,"description":197,"icon":198},"\u002Fdocs\u002Fnitro\u002Femail\u002Finput-schemas",{"title":200,"path":409,"description":202,"icon":203},"\u002Fdocs\u002Fnitro\u002Femail\u002Fi18n",{"title":205,"path":411,"description":207,"icon":208,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fresend",{"title":210,"path":413,"description":212,"icon":213,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fsendgrid",{"title":215,"path":415,"description":217,"icon":218,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fpostmark",{"title":220,"path":417,"description":222,"icon":223,"children":418},"\u002Fdocs\u002Fnitro\u002Fworkflow",[419,421,423,425],{"title":85,"path":420,"description":227,"icon":88},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fcloudflare",{"title":148,"path":422,"description":230,"icon":151},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fvercel",{"title":232,"path":424,"description":234,"icon":223},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fopenworkflow",{"title":153,"path":426,"description":237,"icon":156},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fnetlify",{"title":239,"path":428,"description":241,"icon":242,"children":429},"\u002Fdocs\u002Fnitro\u002Fcron",[430,432,434],{"title":245,"path":431,"description":247,"icon":248},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fnode",{"title":85,"path":433,"description":251,"icon":88},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fcloudflare",{"title":148,"path":435,"description":254,"icon":151},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fvercel",{"title":256,"path":437,"description":258,"icon":259,"children":438},"\u002Fdocs\u002Fnitro\u002Fbrowser",[439,441,443],{"title":85,"path":440,"description":263,"icon":88},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fcloudflare",{"title":265,"path":442,"description":267,"icon":268},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fbrowserbase",{"title":270,"path":444,"description":272,"icon":259},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fplaywright",{"title":274,"path":446,"description":276,"icon":277,"children":447},"\u002Fdocs\u002Fnitro\u002Fsandbox",[448,450,452,454,456,458],{"title":85,"path":449,"description":281,"icon":88},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fcloudflare",{"title":283,"path":451,"description":285,"icon":88},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fcloudflare-dynamic",{"title":148,"path":453,"description":288,"icon":151},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fvercel",{"title":290,"path":455,"description":292,"icon":293},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fdeno",{"title":295,"path":457,"description":297,"icon":298},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fdocker",{"title":300,"path":459,"description":302,"icon":303},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Flocal",{"title":305,"path":461,"description":307,"icon":308,"children":462},"\u002Fdocs\u002Fnitro\u002Fanalytics",[463,465],{"title":148,"path":464,"description":312,"icon":151},"\u002Fdocs\u002Fnitro\u002Fanalytics\u002Fvercel",{"title":85,"path":466,"description":315,"icon":88},"\u002Fdocs\u002Fnitro\u002Fanalytics\u002Fcloudflare",{"title":468,"path":469,"children":470},"Nuxt","\u002Fdocs\u002Fnuxt",[471,480,491,496,503,512,547,552,567,578,587,596,611],{"title":13,"path":472,"description":15,"icon":16,"children":473},"\u002Fdocs\u002Fnuxt\u002Fgetting-started",[474,476,478],{"title":19,"path":475,"description":21},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Fchoose-a-package",{"title":23,"path":477,"description":25},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Fentrypoints",{"title":27,"path":479,"description":29},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Farchitecture",{"title":31,"path":481,"description":33,"icon":34,"children":482},"\u002Fdocs\u002Fnuxt\u002Fdatabase",[483,485,487,489],{"title":37,"path":484,"description":39},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fdrizzle",{"title":41,"path":486,"description":43},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fprisma",{"title":45,"path":488,"description":47},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fmigrations",{"title":49,"path":490,"description":51},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fplatform-notes",{"title":53,"path":492,"description":55,"icon":56,"children":493},"\u002Fdocs\u002Fnuxt\u002Fkv",[494],{"title":59,"path":495,"description":61,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fkv\u002Fusage",{"title":64,"path":497,"description":66,"icon":67,"children":498},"\u002Fdocs\u002Fnuxt\u002Fblob",[499,501],{"title":70,"path":500,"description":72,"icon":73},"\u002Fdocs\u002Fnuxt\u002Fblob\u002Fupload",{"title":75,"path":502,"description":77,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fblob\u002Fusage",{"title":79,"path":504,"description":81,"icon":82,"children":505},"\u002Fdocs\u002Fnuxt\u002Fvector",[506,508,510],{"title":85,"path":507,"description":87,"icon":88,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fcloudflare",{"title":91,"path":509,"description":93,"icon":94,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fpostgres",{"title":96,"path":511,"description":98,"icon":99,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fupstash",{"title":101,"path":513,"description":103,"icon":104,"children":514},"\u002Fdocs\u002Fnuxt\u002Fqueue",[515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545],{"title":107,"path":516,"description":109},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fquickstart",{"title":111,"path":518,"description":113},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fruntime-api",{"title":115,"path":520,"description":117},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fwhen-to-use",{"title":119,"path":522,"description":121,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fsend-a-job",{"title":124,"path":524,"description":126,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fdefer-after-response",{"title":128,"path":526,"description":130,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fvalidate-payloads",{"title":132,"path":528,"description":134,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Flocal-development",{"title":136,"path":530,"description":138,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fnative-handles",{"title":140,"path":532,"description":142,"icon":143,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fplatformatic",{"title":85,"path":534,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fcloudflare",{"title":148,"path":536,"description":150,"icon":151,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fvercel",{"title":153,"path":538,"description":155,"icon":156,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fnetlify",{"title":158,"path":540,"description":160,"icon":99,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fupstash-qstash",{"title":162,"path":542,"description":164,"icon":165,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fmemory",{"title":167,"path":544,"description":169},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Ftroubleshooting",{"title":171,"path":546,"description":173},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fplayground",{"title":175,"path":548,"description":177,"icon":178,"children":549},"\u002Fdocs\u002Fnuxt\u002Fcache",[550],{"title":59,"path":551,"description":182,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fcache\u002Fusage",{"title":184,"path":553,"description":186,"icon":187,"children":554},"\u002Fdocs\u002Fnuxt\u002Femail",[555,557,559,561,563,565],{"title":190,"path":556,"description":192,"icon":193},"\u002Fdocs\u002Fnuxt\u002Femail\u002Ffrontmatter",{"title":195,"path":558,"description":197,"icon":198},"\u002Fdocs\u002Fnuxt\u002Femail\u002Finput-schemas",{"title":200,"path":560,"description":202,"icon":203},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fi18n",{"title":205,"path":562,"description":207,"icon":208,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fresend",{"title":210,"path":564,"description":212,"icon":213,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fsendgrid",{"title":215,"path":566,"description":217,"icon":218,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fpostmark",{"title":220,"path":568,"description":222,"icon":223,"children":569},"\u002Fdocs\u002Fnuxt\u002Fworkflow",[570,572,574,576],{"title":85,"path":571,"description":227,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fcloudflare",{"title":148,"path":573,"description":230,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fvercel",{"title":232,"path":575,"description":234,"icon":223},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fopenworkflow",{"title":153,"path":577,"description":237,"icon":156},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fnetlify",{"title":239,"path":579,"description":241,"icon":242,"children":580},"\u002Fdocs\u002Fnuxt\u002Fcron",[581,583,585],{"title":245,"path":582,"description":247,"icon":248},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fnode",{"title":85,"path":584,"description":251,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fcloudflare",{"title":148,"path":586,"description":254,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fvercel",{"title":256,"path":588,"description":258,"icon":259,"children":589},"\u002Fdocs\u002Fnuxt\u002Fbrowser",[590,592,594],{"title":85,"path":591,"description":263,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fcloudflare",{"title":265,"path":593,"description":267,"icon":268},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fbrowserbase",{"title":270,"path":595,"description":272,"icon":259},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fplaywright",{"title":274,"path":597,"description":276,"icon":277,"children":598},"\u002Fdocs\u002Fnuxt\u002Fsandbox",[599,601,603,605,607,609],{"title":85,"path":600,"description":281,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fcloudflare",{"title":283,"path":602,"description":285,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fcloudflare-dynamic",{"title":148,"path":604,"description":288,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fvercel",{"title":290,"path":606,"description":292,"icon":293},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fdeno",{"title":295,"path":608,"description":297,"icon":298},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fdocker",{"title":300,"path":610,"description":302,"icon":303},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Flocal",{"title":305,"path":612,"description":307,"icon":308,"children":613},"\u002Fdocs\u002Fnuxt\u002Fanalytics",[614,616],{"title":148,"path":615,"description":312,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fvercel",{"title":85,"path":617,"description":315,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fcloudflare",{"id":619,"title":59,"body":620,"description":182,"extension":1553,"meta":1554,"navigation":1555,"path":551,"seo":1556,"stem":1557,"__hash__":1558},"docs\u002Fdocs\u002Fnuxt\u002Fcache\u002Fusage.md",{"type":621,"value":622,"toc":1546},"minimark",[623,628,641,851,855,861,1067,1080,1084,1087,1198,1202,1205,1252,1255,1283,1288,1327,1330,1367,1371,1381,1384,1461,1529,1542],[624,625,627],"h2",{"id":626},"api-routes-caching","API routes caching",[629,630,631,632,636,637,640],"p",{},"Use ",[633,634,635],"code",{},"cachedEventHandler"," to cache a route response in the ",[633,638,639],{},"cache"," storage mount.",[642,643,645],"fw",{"id":644},"nuxt",[646,647,653],"pre",{"className":648,"code":649,"filename":650,"language":651,"meta":652,"style":652},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { H3Event } from 'h3'\n\nexport default cachedEventHandler((event: H3Event) => {\n  return {\n    success: true,\n    date: new Date().toISOString(),\n  }\n}, {\n  maxAge: 60 * 60,\n  getKey: event => event.path,\n})\n","server\u002Fapi\u002Fcached-route.get.ts","ts","",[633,654,655,691,698,736,744,760,787,793,801,820,842],{"__ignoreMap":652},[656,657,660,664,667,671,675,678,681,684,688],"span",{"class":658,"line":659},"line",1,[656,661,663],{"class":662},"s7zQu","import",[656,665,666],{"class":662}," type",[656,668,670],{"class":669},"sMK4o"," {",[656,672,674],{"class":673},"sTEyZ"," H3Event",[656,676,677],{"class":669}," }",[656,679,680],{"class":662}," from",[656,682,683],{"class":669}," '",[656,685,687],{"class":686},"sfazB","h3",[656,689,690],{"class":669},"'\n",[656,692,694],{"class":658,"line":693},2,[656,695,697],{"emptyLinePlaceholder":696},true,"\n",[656,699,701,704,707,711,714,716,720,723,726,729,733],{"class":658,"line":700},3,[656,702,703],{"class":662},"export",[656,705,706],{"class":662}," default",[656,708,710],{"class":709},"s2Zo4"," cachedEventHandler",[656,712,713],{"class":673},"(",[656,715,713],{"class":669},[656,717,719],{"class":718},"sHdIc","event",[656,721,722],{"class":669},":",[656,724,674],{"class":725},"sBMFI",[656,727,728],{"class":669},")",[656,730,732],{"class":731},"spNyl"," =>",[656,734,735],{"class":669}," {\n",[656,737,739,742],{"class":658,"line":738},4,[656,740,741],{"class":662},"  return",[656,743,735],{"class":669},[656,745,747,751,753,757],{"class":658,"line":746},5,[656,748,750],{"class":749},"swJcz","    success",[656,752,722],{"class":669},[656,754,756],{"class":755},"sfNiH"," true",[656,758,759],{"class":669},",\n",[656,761,763,766,768,771,774,777,780,783,785],{"class":658,"line":762},6,[656,764,765],{"class":749},"    date",[656,767,722],{"class":669},[656,769,770],{"class":669}," new",[656,772,773],{"class":709}," Date",[656,775,776],{"class":749},"()",[656,778,779],{"class":669},".",[656,781,782],{"class":709},"toISOString",[656,784,776],{"class":749},[656,786,759],{"class":669},[656,788,790],{"class":658,"line":789},7,[656,791,792],{"class":669},"  }\n",[656,794,796,799],{"class":658,"line":795},8,[656,797,798],{"class":669},"},",[656,800,735],{"class":669},[656,802,804,807,809,813,816,818],{"class":658,"line":803},9,[656,805,806],{"class":749},"  maxAge",[656,808,722],{"class":669},[656,810,812],{"class":811},"sbssI"," 60",[656,814,815],{"class":669}," *",[656,817,812],{"class":811},[656,819,759],{"class":669},[656,821,823,826,828,831,833,835,837,840],{"class":658,"line":822},10,[656,824,825],{"class":709},"  getKey",[656,827,722],{"class":669},[656,829,830],{"class":718}," event",[656,832,732],{"class":731},[656,834,830],{"class":673},[656,836,779],{"class":669},[656,838,839],{"class":673},"path",[656,841,759],{"class":669},[656,843,845,848],{"class":658,"line":844},11,[656,846,847],{"class":669},"}",[656,849,850],{"class":673},")\n",[624,852,854],{"id":853},"server-functions-caching","Server functions caching",[629,856,631,857,860],{},[633,858,859],{},"defineCachedFunction"," for reusable computations that should share cached results across routes.",[642,862,863],{"id":644},[646,864,867],{"className":648,"code":865,"filename":866,"language":651,"meta":652,"style":652},"import type { H3Event } from 'h3'\n\nexport const getRepoStarCount = defineCachedFunction(async (_event: H3Event, repo: string) => {\n  const data = await $fetch\u003C{ stargazers_count: number }>(`https:\u002F\u002Fapi.github.com\u002Frepos\u002F${repo}`)\n  return data.stargazers_count\n}, {\n  maxAge: 60 * 60,\n  name: 'ghStars',\n  getKey: (_event, repo) => repo,\n})\n","server\u002Futils\u002Frepo-stars.ts",[633,868,869,889,893,941,991,1002,1008,1022,1039,1061],{"__ignoreMap":652},[656,870,871,873,875,877,879,881,883,885,887],{"class":658,"line":659},[656,872,663],{"class":662},[656,874,666],{"class":662},[656,876,670],{"class":669},[656,878,674],{"class":673},[656,880,677],{"class":669},[656,882,680],{"class":662},[656,884,683],{"class":669},[656,886,687],{"class":686},[656,888,690],{"class":669},[656,890,891],{"class":658,"line":693},[656,892,697],{"emptyLinePlaceholder":696},[656,894,895,897,900,903,906,909,911,914,917,920,922,924,927,930,932,935,937,939],{"class":658,"line":700},[656,896,703],{"class":662},[656,898,899],{"class":731}," const",[656,901,902],{"class":673}," getRepoStarCount ",[656,904,905],{"class":669},"=",[656,907,908],{"class":709}," defineCachedFunction",[656,910,713],{"class":673},[656,912,913],{"class":731},"async",[656,915,916],{"class":669}," (",[656,918,919],{"class":718},"_event",[656,921,722],{"class":669},[656,923,674],{"class":725},[656,925,926],{"class":669},",",[656,928,929],{"class":718}," repo",[656,931,722],{"class":669},[656,933,934],{"class":725}," string",[656,936,728],{"class":669},[656,938,732],{"class":731},[656,940,735],{"class":669},[656,942,943,946,949,952,955,958,961,964,966,969,972,974,977,980,983,986,989],{"class":658,"line":738},[656,944,945],{"class":731},"  const",[656,947,948],{"class":673}," data",[656,950,951],{"class":669}," =",[656,953,954],{"class":662}," await",[656,956,957],{"class":709}," $fetch",[656,959,960],{"class":669},"\u003C{",[656,962,963],{"class":749}," stargazers_count",[656,965,722],{"class":669},[656,967,968],{"class":725}," number",[656,970,971],{"class":669}," }>",[656,973,713],{"class":749},[656,975,976],{"class":669},"`",[656,978,979],{"class":686},"https:\u002F\u002Fapi.github.com\u002Frepos\u002F",[656,981,982],{"class":669},"${",[656,984,985],{"class":673},"repo",[656,987,988],{"class":669},"}`",[656,990,850],{"class":749},[656,992,993,995,997,999],{"class":658,"line":746},[656,994,741],{"class":662},[656,996,948],{"class":673},[656,998,779],{"class":669},[656,1000,1001],{"class":673},"stargazers_count\n",[656,1003,1004,1006],{"class":658,"line":762},[656,1005,798],{"class":669},[656,1007,735],{"class":669},[656,1009,1010,1012,1014,1016,1018,1020],{"class":658,"line":789},[656,1011,806],{"class":749},[656,1013,722],{"class":669},[656,1015,812],{"class":811},[656,1017,815],{"class":669},[656,1019,812],{"class":811},[656,1021,759],{"class":669},[656,1023,1024,1027,1029,1031,1034,1037],{"class":658,"line":795},[656,1025,1026],{"class":749},"  name",[656,1028,722],{"class":669},[656,1030,683],{"class":669},[656,1032,1033],{"class":686},"ghStars",[656,1035,1036],{"class":669},"'",[656,1038,759],{"class":669},[656,1040,1041,1043,1045,1047,1049,1051,1053,1055,1057,1059],{"class":658,"line":803},[656,1042,825],{"class":709},[656,1044,722],{"class":669},[656,1046,916],{"class":669},[656,1048,919],{"class":718},[656,1050,926],{"class":669},[656,1052,929],{"class":718},[656,1054,728],{"class":669},[656,1056,732],{"class":731},[656,1058,929],{"class":673},[656,1060,759],{"class":669},[656,1062,1063,1065],{"class":658,"line":822},[656,1064,847],{"class":669},[656,1066,850],{"class":673},[1068,1069,1070],"important",{},[629,1071,1072,1073,1075,1076,1079],{},"When you cache a server function in an edge environment, keep the ",[633,1074,719],{}," as the first argument so Nitro can use ",[633,1077,1078],{},"event.waitUntil()"," while the cache updates.",[624,1081,1083],{"id":1082},"route-rules-caching","Route rules caching",[629,1085,1086],{},"You can also enable caching directly through Nitro route rules.",[646,1088,1091],{"className":648,"code":1089,"filename":1090,"language":651,"meta":652,"style":652},"import { defineNitroConfig } from 'nitro\u002Fconfig'\n\nexport default defineNitroConfig({\n  routeRules: {\n    '\u002Fblog\u002F**': {\n      cache: {\n        maxAge: 60 * 60,\n      },\n    },\n  },\n})\n","nitro.config.ts",[633,1092,1093,1113,1117,1130,1139,1153,1162,1177,1182,1187,1192],{"__ignoreMap":652},[656,1094,1095,1097,1099,1102,1104,1106,1108,1111],{"class":658,"line":659},[656,1096,663],{"class":662},[656,1098,670],{"class":669},[656,1100,1101],{"class":673}," defineNitroConfig",[656,1103,677],{"class":669},[656,1105,680],{"class":662},[656,1107,683],{"class":669},[656,1109,1110],{"class":686},"nitro\u002Fconfig",[656,1112,690],{"class":669},[656,1114,1115],{"class":658,"line":693},[656,1116,697],{"emptyLinePlaceholder":696},[656,1118,1119,1121,1123,1125,1127],{"class":658,"line":700},[656,1120,703],{"class":662},[656,1122,706],{"class":662},[656,1124,1101],{"class":709},[656,1126,713],{"class":673},[656,1128,1129],{"class":669},"{\n",[656,1131,1132,1135,1137],{"class":658,"line":738},[656,1133,1134],{"class":749},"  routeRules",[656,1136,722],{"class":669},[656,1138,735],{"class":669},[656,1140,1141,1144,1147,1149,1151],{"class":658,"line":746},[656,1142,1143],{"class":669},"    '",[656,1145,1146],{"class":749},"\u002Fblog\u002F**",[656,1148,1036],{"class":669},[656,1150,722],{"class":669},[656,1152,735],{"class":669},[656,1154,1155,1158,1160],{"class":658,"line":762},[656,1156,1157],{"class":749},"      cache",[656,1159,722],{"class":669},[656,1161,735],{"class":669},[656,1163,1164,1167,1169,1171,1173,1175],{"class":658,"line":789},[656,1165,1166],{"class":749},"        maxAge",[656,1168,722],{"class":669},[656,1170,812],{"class":811},[656,1172,815],{"class":669},[656,1174,812],{"class":811},[656,1176,759],{"class":669},[656,1178,1179],{"class":658,"line":795},[656,1180,1181],{"class":669},"      },\n",[656,1183,1184],{"class":658,"line":803},[656,1185,1186],{"class":669},"    },\n",[656,1188,1189],{"class":658,"line":822},[656,1190,1191],{"class":669},"  },\n",[656,1193,1194,1196],{"class":658,"line":844},[656,1195,847],{"class":669},[656,1197,850],{"class":673},[624,1199,1201],{"id":1200},"cache-invalidation","Cache invalidation",[629,1203,1204],{},"Nitro stores cached entries with a key shaped like this:",[646,1206,1208],{"className":648,"code":1207,"language":651,"meta":652,"style":652},"`${group}:${name}:${getKey(...args)}.json`\n",[633,1209,1210],{"__ignoreMap":652},[656,1211,1212,1215,1218,1220,1222,1224,1227,1229,1231,1233,1236,1238,1241,1244,1246,1249],{"class":658,"line":659},[656,1213,1214],{"class":669},"`${",[656,1216,1217],{"class":673},"group",[656,1219,847],{"class":669},[656,1221,722],{"class":686},[656,1223,982],{"class":669},[656,1225,1226],{"class":673},"name",[656,1228,847],{"class":669},[656,1230,722],{"class":686},[656,1232,982],{"class":669},[656,1234,1235],{"class":709},"getKey",[656,1237,713],{"class":673},[656,1239,1240],{"class":669},"...",[656,1242,1243],{"class":673},"args)",[656,1245,847],{"class":669},[656,1247,1248],{"class":686},".json",[656,1250,1251],{"class":669},"`\n",[629,1253,1254],{},"The defaults are:",[1256,1257,1258,1267],"ul",{},[1259,1260,1261,1263,1264],"li",{},[633,1262,1217],{},": ",[633,1265,1266],{},"nitro",[1259,1268,1269,1263,1271,1274,1275,1278,1279,1282],{},[633,1270,1226],{},[633,1272,1273],{},"handlers"," for API routes, ",[633,1276,1277],{},"functions"," for cached functions, and ",[633,1280,1281],{},"routes"," for route rules",[629,1284,1285,1286,640],{},"If you need to invalidate one entry manually, remove it from the ",[633,1287,639],{},[646,1289,1291],{"className":648,"code":1290,"language":651,"meta":652,"style":652},"await useStorage('cache').removeItem('nitro:functions:getAccessToken:default.json')\n",[633,1292,1293],{"__ignoreMap":652},[656,1294,1295,1298,1301,1303,1305,1307,1309,1311,1313,1316,1318,1320,1323,1325],{"class":658,"line":659},[656,1296,1297],{"class":662},"await",[656,1299,1300],{"class":709}," useStorage",[656,1302,713],{"class":673},[656,1304,1036],{"class":669},[656,1306,639],{"class":686},[656,1308,1036],{"class":669},[656,1310,728],{"class":673},[656,1312,779],{"class":669},[656,1314,1315],{"class":709},"removeItem",[656,1317,713],{"class":673},[656,1319,1036],{"class":669},[656,1321,1322],{"class":686},"nitro:functions:getAccessToken:default.json",[656,1324,1036],{"class":669},[656,1326,850],{"class":673},[629,1328,1329],{},"If you need to invalidate a prefix, clear it from the same mount.",[646,1331,1333],{"className":648,"code":1332,"language":651,"meta":652,"style":652},"await useStorage('cache').clear('nitro:handlers')\n",[633,1334,1335],{"__ignoreMap":652},[656,1336,1337,1339,1341,1343,1345,1347,1349,1351,1353,1356,1358,1360,1363,1365],{"class":658,"line":659},[656,1338,1297],{"class":662},[656,1340,1300],{"class":709},[656,1342,713],{"class":673},[656,1344,1036],{"class":669},[656,1346,639],{"class":686},[656,1348,1036],{"class":669},[656,1350,728],{"class":673},[656,1352,779],{"class":669},[656,1354,1355],{"class":709},"clear",[656,1357,713],{"class":673},[656,1359,1036],{"class":669},[656,1361,1362],{"class":686},"nitro:handlers",[656,1364,1036],{"class":669},[656,1366,850],{"class":673},[624,1368,1370],{"id":1369},"normalizing-cache-keys","Normalizing cache keys",[629,1372,1373,1374,1377,1378,779],{},"Nitro normalizes cache keys so they stay portable across storage backends. A route-like key such as ",[633,1375,1376],{},"\u002Fapi\u002Fproducts\u002Fsale-items"," becomes ",[633,1379,1380],{},"apiproductssaleitems",[629,1382,1383],{},"If you want to reproduce the same normalization when invalidating a key manually, use the same pattern Nitro applies internally:",[646,1385,1387],{"className":648,"code":1386,"language":651,"meta":652,"style":652},"function escapeKey(key: string | string[]) {\n  return String(key).replace(\u002F\\W\u002Fg, '')\n}\n",[633,1388,1389,1418,1456],{"__ignoreMap":652},[656,1390,1391,1394,1397,1399,1402,1404,1406,1409,1411,1414,1416],{"class":658,"line":659},[656,1392,1393],{"class":731},"function",[656,1395,1396],{"class":709}," escapeKey",[656,1398,713],{"class":669},[656,1400,1401],{"class":718},"key",[656,1403,722],{"class":669},[656,1405,934],{"class":725},[656,1407,1408],{"class":669}," |",[656,1410,934],{"class":725},[656,1412,1413],{"class":673},"[]",[656,1415,728],{"class":669},[656,1417,735],{"class":669},[656,1419,1420,1422,1425,1427,1429,1431,1433,1436,1438,1441,1444,1446,1449,1451,1454],{"class":658,"line":693},[656,1421,741],{"class":662},[656,1423,1424],{"class":709}," String",[656,1426,713],{"class":749},[656,1428,1401],{"class":673},[656,1430,728],{"class":749},[656,1432,779],{"class":669},[656,1434,1435],{"class":709},"replace",[656,1437,713],{"class":749},[656,1439,1440],{"class":669},"\u002F",[656,1442,1443],{"class":686},"\\W",[656,1445,1440],{"class":669},[656,1447,1448],{"class":811},"g",[656,1450,926],{"class":669},[656,1452,1453],{"class":669}," ''",[656,1455,850],{"class":749},[656,1457,1458],{"class":658,"line":700},[656,1459,1460],{"class":669},"}\n",[646,1462,1464],{"className":648,"code":1463,"language":651,"meta":652,"style":652},"const normalizedKey = escapeKey('product\u002F123\u002Fdetails')\nawait useStorage('cache').removeItem(`nitro:functions:getProductDetails:${normalizedKey}.json`)\n",[633,1465,1466,1489],{"__ignoreMap":652},[656,1467,1468,1471,1474,1476,1478,1480,1482,1485,1487],{"class":658,"line":659},[656,1469,1470],{"class":731},"const",[656,1472,1473],{"class":673}," normalizedKey ",[656,1475,905],{"class":669},[656,1477,1396],{"class":709},[656,1479,713],{"class":673},[656,1481,1036],{"class":669},[656,1483,1484],{"class":686},"product\u002F123\u002Fdetails",[656,1486,1036],{"class":669},[656,1488,850],{"class":673},[656,1490,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511,1513,1516,1518,1521,1523,1525,1527],{"class":658,"line":693},[656,1492,1297],{"class":662},[656,1494,1300],{"class":709},[656,1496,713],{"class":673},[656,1498,1036],{"class":669},[656,1500,639],{"class":686},[656,1502,1036],{"class":669},[656,1504,728],{"class":673},[656,1506,779],{"class":669},[656,1508,1315],{"class":709},[656,1510,713],{"class":673},[656,1512,976],{"class":669},[656,1514,1515],{"class":686},"nitro:functions:getProductDetails:",[656,1517,982],{"class":669},[656,1519,1520],{"class":673},"normalizedKey",[656,1522,847],{"class":669},[656,1524,1248],{"class":686},[656,1526,976],{"class":669},[656,1528,850],{"class":673},[1530,1531,1533],"note",{"to":1532},"https:\u002F\u002Fnitro.build\u002Fguide\u002Fcache",[629,1534,1535,1536,779],{},"Read more about Nitro cache behavior in the ",[1537,1538,1541],"a",{"href":1532,"rel":1539},[1540],"nofollow","Nitro cache guide",[1543,1544,1545],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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":652,"searchDepth":693,"depth":693,"links":1547},[1548,1549,1550,1551,1552],{"id":626,"depth":693,"text":627},{"id":853,"depth":693,"text":854},{"id":1082,"depth":693,"text":1083},{"id":1200,"depth":693,"text":1201},{"id":1369,"depth":693,"text":1370},"md",{"icon":62},{"title":59},{"title":59,"description":182},"docs\u002Fnuxt\u002Fcache\u002Fusage","k5wG8xtrEJQSeUhOyl_brGt0ZLgB-3fm3jqcZfvuopU",[1560,1562],{"title":1561,"path":548,"description":177},"Overview",{"title":1561,"path":553,"description":186},1775568181130]