[{"data":1,"prerenderedAt":2796},["ShallowReactive",2],{"docs-navigation":3,"docs:\u002Fdocs\u002Fnuxt\u002Fblob":618,"\u002Fdocs\u002Fnuxt\u002Fblob:surround":2793},[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":64,"body":620,"description":66,"extension":2786,"meta":2787,"navigation":2788,"path":497,"seo":2790,"stem":2791,"__hash__":2792},"docs\u002Fdocs\u002Fnuxt\u002Fblob\u002Findex.md",{"type":621,"value":622,"toc":2768},"minimark",[623,627,632,941,944,1060,1150,1284,1287,1291,1413,1420,1422,1426,1432,1459,1467,1471,1474,2000,2004,2007,2096,2099,2145,2156,2160,2172,2530,2534,2539,2542,2764],[624,625,626],"p",{},"Use ViteHub Blob to store images, videos, documents, and other files. ViteHub detects the storage driver from your hosting environment automatically.",[628,629,631],"h2",{"id":630},"getting-started","Getting started",[633,634,635,640,705,709,778,782,789,799],"steps",{},[636,637,639],"h3",{"id":638},"install-the-package","Install the package",[641,642,643,672,689],"tabs",{},[644,645,647],"tabs-item",{"label":646},"pnpm",[648,649,654],"pre",{"className":650,"code":651,"language":652,"meta":653,"style":653},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add https:\u002F\u002Fpkg.pr.new\u002Fvite-hub\u002Fvitehub\u002F@vitehub\u002Fblob@main\n","bash","",[655,656,657],"code",{"__ignoreMap":653},[658,659,662,665,669],"span",{"class":660,"line":661},"line",1,[658,663,646],{"class":664},"sBMFI",[658,666,668],{"class":667},"sfazB"," add",[658,670,671],{"class":667}," https:\u002F\u002Fpkg.pr.new\u002Fvite-hub\u002Fvitehub\u002F@vitehub\u002Fblob@main\n",[644,673,675],{"label":674},"npm",[648,676,678],{"className":650,"code":677,"language":652,"meta":653,"style":653},"npm install https:\u002F\u002Fpkg.pr.new\u002Fvite-hub\u002Fvitehub\u002F@vitehub\u002Fblob@main\n",[655,679,680],{"__ignoreMap":653},[658,681,682,684,687],{"class":660,"line":661},[658,683,674],{"class":664},[658,685,686],{"class":667}," install",[658,688,671],{"class":667},[644,690,692],{"label":691},"yarn",[648,693,695],{"className":650,"code":694,"language":652,"meta":653,"style":653},"yarn add https:\u002F\u002Fpkg.pr.new\u002Fvite-hub\u002Fvitehub\u002F@vitehub\u002Fblob@main\n",[655,696,697],{"__ignoreMap":653},[658,698,699,701,703],{"class":660,"line":661},[658,700,691],{"class":664},[658,702,668],{"class":667},[658,704,671],{"class":667},[636,706,708],{"id":707},"choose-an-integration-surface","Choose an integration surface",[710,711,713],"fw",{"id":712},"nuxt",[648,714,719],{"className":715,"code":716,"filename":717,"language":718,"meta":653,"style":653},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnuxt'],\n})\n","nuxt.config.ts","ts",[655,720,721,742,769],{"__ignoreMap":653},[658,722,723,727,730,734,738],{"class":660,"line":661},[658,724,726],{"class":725},"s7zQu","export",[658,728,729],{"class":725}," default",[658,731,733],{"class":732},"s2Zo4"," defineNuxtConfig",[658,735,737],{"class":736},"sTEyZ","(",[658,739,741],{"class":740},"sMK4o","{\n",[658,743,745,749,752,755,758,761,763,766],{"class":660,"line":744},2,[658,746,748],{"class":747},"swJcz","  modules",[658,750,751],{"class":740},":",[658,753,754],{"class":736}," [",[658,756,757],{"class":740},"'",[658,759,760],{"class":667},"@vitehub\u002Fblob\u002Fnuxt",[658,762,757],{"class":740},[658,764,765],{"class":736},"]",[658,767,768],{"class":740},",\n",[658,770,772,775],{"class":660,"line":771},3,[658,773,774],{"class":740},"}",[658,776,777],{"class":736},")\n",[636,779,781],{"id":780},"set-a-driver","Set a driver",[624,783,784,785,788],{},"ViteHub auto-configures blob storage from your environment or hosting provider. Keep the same top-level ",[655,786,787],{},"blob"," key no matter which integration surface you use.",[790,791,792],"note",{},[624,793,794,795,798],{},"When no provider is detected, ViteHub stores files locally in ",[655,796,797],{},".data\u002Fblob",".",[641,800,802],{"sync":801},"blob-provider",[644,803,804,807,935],{"label":300},[624,805,806],{},"Use the filesystem driver during local development or smoke testing.",[648,808,811],{"className":715,"code":809,"filename":810,"language":718,"meta":653,"style":653},"import { defineNitroConfig } from 'nitro\u002Fconfig'\n\nexport default defineNitroConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnitro'],\n  blob: {\n    driver: 'fs',\n    dir: '.data\u002Fmy-blob-directory',\n  },\n})\n","nitro.config.ts",[655,812,813,839,845,857,877,888,905,922,928],{"__ignoreMap":653},[658,814,815,818,821,824,827,830,833,836],{"class":660,"line":661},[658,816,817],{"class":725},"import",[658,819,820],{"class":740}," {",[658,822,823],{"class":736}," defineNitroConfig",[658,825,826],{"class":740}," }",[658,828,829],{"class":725}," from",[658,831,832],{"class":740}," '",[658,834,835],{"class":667},"nitro\u002Fconfig",[658,837,838],{"class":740},"'\n",[658,840,841],{"class":660,"line":744},[658,842,844],{"emptyLinePlaceholder":843},true,"\n",[658,846,847,849,851,853,855],{"class":660,"line":771},[658,848,726],{"class":725},[658,850,729],{"class":725},[658,852,823],{"class":732},[658,854,737],{"class":736},[658,856,741],{"class":740},[658,858,860,862,864,866,868,871,873,875],{"class":660,"line":859},4,[658,861,748],{"class":747},[658,863,751],{"class":740},[658,865,754],{"class":736},[658,867,757],{"class":740},[658,869,870],{"class":667},"@vitehub\u002Fblob\u002Fnitro",[658,872,757],{"class":740},[658,874,765],{"class":736},[658,876,768],{"class":740},[658,878,880,883,885],{"class":660,"line":879},5,[658,881,882],{"class":747},"  blob",[658,884,751],{"class":740},[658,886,887],{"class":740}," {\n",[658,889,891,894,896,898,901,903],{"class":660,"line":890},6,[658,892,893],{"class":747},"    driver",[658,895,751],{"class":740},[658,897,832],{"class":740},[658,899,900],{"class":667},"fs",[658,902,757],{"class":740},[658,904,768],{"class":740},[658,906,908,911,913,915,918,920],{"class":660,"line":907},7,[658,909,910],{"class":747},"    dir",[658,912,751],{"class":740},[658,914,832],{"class":740},[658,916,917],{"class":667},".data\u002Fmy-blob-directory",[658,919,757],{"class":740},[658,921,768],{"class":740},[658,923,925],{"class":660,"line":924},8,[658,926,927],{"class":740},"  },\n",[658,929,931,933],{"class":660,"line":930},9,[658,932,774],{"class":740},[658,934,777],{"class":736},[936,937,938],"important",{},[624,939,940],{},"The local filesystem driver is not suitable for production deployments.",[624,942,943],{},":::",[644,945,947,954,1002],{"label":946},"S3",[624,948,949,950,953],{},"Install ",[655,951,952],{},"aws4fetch"," and set the S3 environment variables.",[641,955,956,972,987],{},[644,957,958],{"label":646},[648,959,961],{"className":650,"code":960,"language":652,"meta":653,"style":653},"pnpm add aws4fetch\n",[655,962,963],{"__ignoreMap":653},[658,964,965,967,969],{"class":660,"line":661},[658,966,646],{"class":664},[658,968,668],{"class":667},[658,970,971],{"class":667}," aws4fetch\n",[644,973,974],{"label":674},[648,975,977],{"className":650,"code":976,"language":652,"meta":653,"style":653},"npm install aws4fetch\n",[655,978,979],{"__ignoreMap":653},[658,980,981,983,985],{"class":660,"line":661},[658,982,674],{"class":664},[658,984,686],{"class":667},[658,986,971],{"class":667},[644,988,989],{"label":691},[648,990,992],{"className":650,"code":991,"language":652,"meta":653,"style":653},"yarn add aws4fetch\n",[655,993,994],{"__ignoreMap":653},[658,995,996,998,1000],{"class":660,"line":661},[658,997,691],{"class":664},[658,999,668],{"class":667},[658,1001,971],{"class":667},[648,1003,1006],{"className":650,"code":1004,"filename":1005,"language":652,"meta":653,"style":653},"S3_ACCESS_KEY_ID=your-access-key-id\nS3_SECRET_ACCESS_KEY=your-secret-access-key\nS3_BUCKET=your-bucket-name\nS3_REGION=eu-central-1\nS3_ENDPOINT= # optional, required for S3-compatible services\n",".env",[655,1007,1008,1019,1029,1039,1049],{"__ignoreMap":653},[658,1009,1010,1013,1016],{"class":660,"line":661},[658,1011,1012],{"class":736},"S3_ACCESS_KEY_ID",[658,1014,1015],{"class":740},"=",[658,1017,1018],{"class":667},"your-access-key-id\n",[658,1020,1021,1024,1026],{"class":660,"line":744},[658,1022,1023],{"class":736},"S3_SECRET_ACCESS_KEY",[658,1025,1015],{"class":740},[658,1027,1028],{"class":667},"your-secret-access-key\n",[658,1030,1031,1034,1036],{"class":660,"line":771},[658,1032,1033],{"class":736},"S3_BUCKET",[658,1035,1015],{"class":740},[658,1037,1038],{"class":667},"your-bucket-name\n",[658,1040,1041,1044,1046],{"class":660,"line":859},[658,1042,1043],{"class":736},"S3_REGION",[658,1045,1015],{"class":740},[658,1047,1048],{"class":667},"eu-central-1\n",[658,1050,1051,1054,1056],{"class":660,"line":879},[658,1052,1053],{"class":736},"S3_ENDPOINT",[658,1055,1015],{"class":740},[658,1057,1059],{"class":1058},"sHwdD"," # optional, required for S3-compatible services\n",[644,1061,1063,1073,1121,1135,1145],{"label":1062},"Vercel Blob",[624,1064,949,1065,1068,1069,1072],{},[655,1066,1067],{},"@vercel\u002Fblob",", then either deploy on Vercel or set ",[655,1070,1071],{},"BLOB_READ_WRITE_TOKEN"," locally.",[641,1074,1075,1091,1106],{},[644,1076,1077],{"label":646},[648,1078,1080],{"className":650,"code":1079,"language":652,"meta":653,"style":653},"pnpm add @vercel\u002Fblob\n",[655,1081,1082],{"__ignoreMap":653},[658,1083,1084,1086,1088],{"class":660,"line":661},[658,1085,646],{"class":664},[658,1087,668],{"class":667},[658,1089,1090],{"class":667}," @vercel\u002Fblob\n",[644,1092,1093],{"label":674},[648,1094,1096],{"className":650,"code":1095,"language":652,"meta":653,"style":653},"npm install @vercel\u002Fblob\n",[655,1097,1098],{"__ignoreMap":653},[658,1099,1100,1102,1104],{"class":660,"line":661},[658,1101,674],{"class":664},[658,1103,686],{"class":667},[658,1105,1090],{"class":667},[644,1107,1108],{"label":691},[648,1109,1111],{"className":650,"code":1110,"language":652,"meta":653,"style":653},"yarn add @vercel\u002Fblob\n",[655,1112,1113],{"__ignoreMap":653},[658,1114,1115,1117,1119],{"class":660,"line":661},[658,1116,691],{"class":664},[658,1118,668],{"class":667},[658,1120,1090],{"class":667},[648,1122,1124],{"className":650,"code":1123,"filename":1005,"language":652,"meta":653,"style":653},"BLOB_READ_WRITE_TOKEN=your-token\n",[655,1125,1126],{"__ignoreMap":653},[658,1127,1128,1130,1132],{"class":660,"line":661},[658,1129,1071],{"class":736},[658,1131,1015],{"class":740},[658,1133,1134],{"class":667},"your-token\n",[624,1136,1137,1138,1141,1142,1144],{},"ViteHub reads these values from ",[655,1139,1140],{},"process.env",". Nuxt, Nitro, Vite, or your process manager must load ",[655,1143,1005],{}," before startup.",[936,1146,1147],{},[624,1148,1149],{},"Files stored in Vercel Blob are public. Use another driver if you need private object storage.",[644,1151,1153,1156,1279],{"label":1152},"Cloudflare R2",[624,1154,1155],{},"Set the driver explicitly and provide the bucket name. ViteHub generates the Wrangler R2 binding for you.",[648,1157,1159],{"className":715,"code":1158,"filename":810,"language":718,"meta":653,"style":653},"import { defineNitroConfig } from 'nitro\u002Fconfig'\n\nexport default defineNitroConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnitro'],\n  blob: {\n    driver: 'cloudflare-r2',\n    bucketName: 'uploads',\n    jurisdiction: 'eu',\n  },\n})\n",[655,1160,1161,1179,1183,1195,1213,1221,1236,1252,1268,1272],{"__ignoreMap":653},[658,1162,1163,1165,1167,1169,1171,1173,1175,1177],{"class":660,"line":661},[658,1164,817],{"class":725},[658,1166,820],{"class":740},[658,1168,823],{"class":736},[658,1170,826],{"class":740},[658,1172,829],{"class":725},[658,1174,832],{"class":740},[658,1176,835],{"class":667},[658,1178,838],{"class":740},[658,1180,1181],{"class":660,"line":744},[658,1182,844],{"emptyLinePlaceholder":843},[658,1184,1185,1187,1189,1191,1193],{"class":660,"line":771},[658,1186,726],{"class":725},[658,1188,729],{"class":725},[658,1190,823],{"class":732},[658,1192,737],{"class":736},[658,1194,741],{"class":740},[658,1196,1197,1199,1201,1203,1205,1207,1209,1211],{"class":660,"line":859},[658,1198,748],{"class":747},[658,1200,751],{"class":740},[658,1202,754],{"class":736},[658,1204,757],{"class":740},[658,1206,870],{"class":667},[658,1208,757],{"class":740},[658,1210,765],{"class":736},[658,1212,768],{"class":740},[658,1214,1215,1217,1219],{"class":660,"line":879},[658,1216,882],{"class":747},[658,1218,751],{"class":740},[658,1220,887],{"class":740},[658,1222,1223,1225,1227,1229,1232,1234],{"class":660,"line":890},[658,1224,893],{"class":747},[658,1226,751],{"class":740},[658,1228,832],{"class":740},[658,1230,1231],{"class":667},"cloudflare-r2",[658,1233,757],{"class":740},[658,1235,768],{"class":740},[658,1237,1238,1241,1243,1245,1248,1250],{"class":660,"line":907},[658,1239,1240],{"class":747},"    bucketName",[658,1242,751],{"class":740},[658,1244,832],{"class":740},[658,1246,1247],{"class":667},"uploads",[658,1249,757],{"class":740},[658,1251,768],{"class":740},[658,1253,1254,1257,1259,1261,1264,1266],{"class":660,"line":924},[658,1255,1256],{"class":747},"    jurisdiction",[658,1258,751],{"class":740},[658,1260,832],{"class":740},[658,1262,1263],{"class":667},"eu",[658,1265,757],{"class":740},[658,1267,768],{"class":740},[658,1269,1270],{"class":660,"line":930},[658,1271,927],{"class":740},[658,1273,1275,1277],{"class":660,"line":1274},10,[658,1276,774],{"class":740},[658,1278,777],{"class":736},[790,1280,1281],{},[624,1282,1283],{},"When you use R2 outside Cloudflare Workers, use the S3 driver with the R2 S3 API instead.",[624,1285,1286],{},"::",[636,1288,1290],{"id":1289},"upload-a-file","Upload a file",[710,1292,1293],{"id":712},[648,1294,1297],{"className":715,"code":1295,"filename":1296,"language":718,"meta":653,"style":653},"import { blob } from '@vitehub\u002Fblob'\n\nexport default defineEventHandler(async () => {\n  return await blob.put('avatars\u002Fuser-1.txt', 'hello blob', {\n    contentType: 'text\u002Fplain',\n  })\n})\n","server\u002Fapi\u002Ffiles.post.ts",[655,1298,1299,1319,1323,1346,1384,1400,1407],{"__ignoreMap":653},[658,1300,1301,1303,1305,1308,1310,1312,1314,1317],{"class":660,"line":661},[658,1302,817],{"class":725},[658,1304,820],{"class":740},[658,1306,1307],{"class":736}," blob",[658,1309,826],{"class":740},[658,1311,829],{"class":725},[658,1313,832],{"class":740},[658,1315,1316],{"class":667},"@vitehub\u002Fblob",[658,1318,838],{"class":740},[658,1320,1321],{"class":660,"line":744},[658,1322,844],{"emptyLinePlaceholder":843},[658,1324,1325,1327,1329,1332,1334,1338,1341,1344],{"class":660,"line":771},[658,1326,726],{"class":725},[658,1328,729],{"class":725},[658,1330,1331],{"class":732}," defineEventHandler",[658,1333,737],{"class":736},[658,1335,1337],{"class":1336},"spNyl","async",[658,1339,1340],{"class":740}," ()",[658,1342,1343],{"class":1336}," =>",[658,1345,887],{"class":740},[658,1347,1348,1351,1354,1356,1358,1361,1363,1365,1368,1370,1373,1375,1378,1380,1382],{"class":660,"line":859},[658,1349,1350],{"class":725},"  return",[658,1352,1353],{"class":725}," await",[658,1355,1307],{"class":736},[658,1357,798],{"class":740},[658,1359,1360],{"class":732},"put",[658,1362,737],{"class":747},[658,1364,757],{"class":740},[658,1366,1367],{"class":667},"avatars\u002Fuser-1.txt",[658,1369,757],{"class":740},[658,1371,1372],{"class":740},",",[658,1374,832],{"class":740},[658,1376,1377],{"class":667},"hello blob",[658,1379,757],{"class":740},[658,1381,1372],{"class":740},[658,1383,887],{"class":740},[658,1385,1386,1389,1391,1393,1396,1398],{"class":660,"line":879},[658,1387,1388],{"class":747},"    contentType",[658,1390,751],{"class":740},[658,1392,832],{"class":740},[658,1394,1395],{"class":667},"text\u002Fplain",[658,1397,757],{"class":740},[658,1399,768],{"class":740},[658,1401,1402,1405],{"class":660,"line":890},[658,1403,1404],{"class":740},"  }",[658,1406,777],{"class":747},[658,1408,1409,1411],{"class":660,"line":907},[658,1410,774],{"class":740},[658,1412,777],{"class":736},[1414,1415,1417],"tip",{"to":1416},".\u002Fupload",[624,1418,1419],{},"Learn how to validate uploads and handle multipart requests.",[624,1421,1286],{},[628,1423,1425],{"id":1424},"automatic-configuration","Automatic configuration",[624,1427,1428,1429,1431],{},"Registering the integration without a ",[655,1430,787],{}," config object keeps the setup small while following the same provider order as NuxtHub:",[1433,1434,1435,1442,1448,1453,1456],"ol",{},[1436,1437,1438,1439],"li",{},"Explicit ",[655,1440,1441],{},"driver",[1436,1443,1444,1447],{},[655,1445,1446],{},"S3_*"," environment variables",[1436,1449,1450,1451],{},"Vercel hosting or ",[655,1452,1071],{},[1436,1454,1455],{},"Cloudflare hosting",[1436,1457,1458],{},"Local filesystem",[790,1460,1461],{},[624,1462,1463,1464,1466],{},"On hosted runtimes, ViteHub re-reads ",[655,1465,1446],{}," env vars at runtime so masked serialized config does not override the real storage endpoint or credentials.",[628,1468,1470],{"id":1469},"driver-options","Driver options",[624,1472,1473],{},"You can always pin a driver explicitly.",[641,1475,1476,1582,1757,1865],{"sync":801},[644,1477,1478],{"label":300},[648,1479,1481],{"className":715,"code":1480,"filename":810,"language":718,"meta":653,"style":653},"import { defineNitroConfig } from 'nitro\u002Fconfig'\n\nexport default defineNitroConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnitro'],\n  blob: {\n    driver: 'fs',\n    dir: '.data\u002Ffiles',\n  },\n})\n",[655,1482,1483,1501,1505,1517,1535,1543,1557,1572,1576],{"__ignoreMap":653},[658,1484,1485,1487,1489,1491,1493,1495,1497,1499],{"class":660,"line":661},[658,1486,817],{"class":725},[658,1488,820],{"class":740},[658,1490,823],{"class":736},[658,1492,826],{"class":740},[658,1494,829],{"class":725},[658,1496,832],{"class":740},[658,1498,835],{"class":667},[658,1500,838],{"class":740},[658,1502,1503],{"class":660,"line":744},[658,1504,844],{"emptyLinePlaceholder":843},[658,1506,1507,1509,1511,1513,1515],{"class":660,"line":771},[658,1508,726],{"class":725},[658,1510,729],{"class":725},[658,1512,823],{"class":732},[658,1514,737],{"class":736},[658,1516,741],{"class":740},[658,1518,1519,1521,1523,1525,1527,1529,1531,1533],{"class":660,"line":859},[658,1520,748],{"class":747},[658,1522,751],{"class":740},[658,1524,754],{"class":736},[658,1526,757],{"class":740},[658,1528,870],{"class":667},[658,1530,757],{"class":740},[658,1532,765],{"class":736},[658,1534,768],{"class":740},[658,1536,1537,1539,1541],{"class":660,"line":879},[658,1538,882],{"class":747},[658,1540,751],{"class":740},[658,1542,887],{"class":740},[658,1544,1545,1547,1549,1551,1553,1555],{"class":660,"line":890},[658,1546,893],{"class":747},[658,1548,751],{"class":740},[658,1550,832],{"class":740},[658,1552,900],{"class":667},[658,1554,757],{"class":740},[658,1556,768],{"class":740},[658,1558,1559,1561,1563,1565,1568,1570],{"class":660,"line":907},[658,1560,910],{"class":747},[658,1562,751],{"class":740},[658,1564,832],{"class":740},[658,1566,1567],{"class":667},".data\u002Ffiles",[658,1569,757],{"class":740},[658,1571,768],{"class":740},[658,1573,1574],{"class":660,"line":924},[658,1575,927],{"class":740},[658,1577,1578,1580],{"class":660,"line":930},[658,1579,774],{"class":740},[658,1581,777],{"class":736},[644,1583,1584],{"label":946},[648,1585,1587],{"className":715,"code":1586,"filename":810,"language":718,"meta":653,"style":653},"import { defineNitroConfig } from 'nitro\u002Fconfig'\n\nexport default defineNitroConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnitro'],\n  blob: {\n    driver: 's3',\n    accessKeyId: 'your-access-key-id',\n    secretAccessKey: 'your-secret-access-key',\n    bucket: 'your-bucket-name',\n    region: 'eu-central-1',\n    endpoint: 'https:\u002F\u002Fs3.eu-central-1.amazonaws.com',\n  },\n})\n",[655,1588,1589,1607,1611,1623,1641,1649,1664,1680,1696,1712,1728,1745,1750],{"__ignoreMap":653},[658,1590,1591,1593,1595,1597,1599,1601,1603,1605],{"class":660,"line":661},[658,1592,817],{"class":725},[658,1594,820],{"class":740},[658,1596,823],{"class":736},[658,1598,826],{"class":740},[658,1600,829],{"class":725},[658,1602,832],{"class":740},[658,1604,835],{"class":667},[658,1606,838],{"class":740},[658,1608,1609],{"class":660,"line":744},[658,1610,844],{"emptyLinePlaceholder":843},[658,1612,1613,1615,1617,1619,1621],{"class":660,"line":771},[658,1614,726],{"class":725},[658,1616,729],{"class":725},[658,1618,823],{"class":732},[658,1620,737],{"class":736},[658,1622,741],{"class":740},[658,1624,1625,1627,1629,1631,1633,1635,1637,1639],{"class":660,"line":859},[658,1626,748],{"class":747},[658,1628,751],{"class":740},[658,1630,754],{"class":736},[658,1632,757],{"class":740},[658,1634,870],{"class":667},[658,1636,757],{"class":740},[658,1638,765],{"class":736},[658,1640,768],{"class":740},[658,1642,1643,1645,1647],{"class":660,"line":879},[658,1644,882],{"class":747},[658,1646,751],{"class":740},[658,1648,887],{"class":740},[658,1650,1651,1653,1655,1657,1660,1662],{"class":660,"line":890},[658,1652,893],{"class":747},[658,1654,751],{"class":740},[658,1656,832],{"class":740},[658,1658,1659],{"class":667},"s3",[658,1661,757],{"class":740},[658,1663,768],{"class":740},[658,1665,1666,1669,1671,1673,1676,1678],{"class":660,"line":907},[658,1667,1668],{"class":747},"    accessKeyId",[658,1670,751],{"class":740},[658,1672,832],{"class":740},[658,1674,1675],{"class":667},"your-access-key-id",[658,1677,757],{"class":740},[658,1679,768],{"class":740},[658,1681,1682,1685,1687,1689,1692,1694],{"class":660,"line":924},[658,1683,1684],{"class":747},"    secretAccessKey",[658,1686,751],{"class":740},[658,1688,832],{"class":740},[658,1690,1691],{"class":667},"your-secret-access-key",[658,1693,757],{"class":740},[658,1695,768],{"class":740},[658,1697,1698,1701,1703,1705,1708,1710],{"class":660,"line":930},[658,1699,1700],{"class":747},"    bucket",[658,1702,751],{"class":740},[658,1704,832],{"class":740},[658,1706,1707],{"class":667},"your-bucket-name",[658,1709,757],{"class":740},[658,1711,768],{"class":740},[658,1713,1714,1717,1719,1721,1724,1726],{"class":660,"line":1274},[658,1715,1716],{"class":747},"    region",[658,1718,751],{"class":740},[658,1720,832],{"class":740},[658,1722,1723],{"class":667},"eu-central-1",[658,1725,757],{"class":740},[658,1727,768],{"class":740},[658,1729,1731,1734,1736,1738,1741,1743],{"class":660,"line":1730},11,[658,1732,1733],{"class":747},"    endpoint",[658,1735,751],{"class":740},[658,1737,832],{"class":740},[658,1739,1740],{"class":667},"https:\u002F\u002Fs3.eu-central-1.amazonaws.com",[658,1742,757],{"class":740},[658,1744,768],{"class":740},[658,1746,1748],{"class":660,"line":1747},12,[658,1749,927],{"class":740},[658,1751,1753,1755],{"class":660,"line":1752},13,[658,1754,774],{"class":740},[658,1756,777],{"class":736},[644,1758,1759],{"label":1062},[648,1760,1762],{"className":715,"code":1761,"filename":810,"language":718,"meta":653,"style":653},"import { defineNitroConfig } from 'nitro\u002Fconfig'\n\nexport default defineNitroConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnitro'],\n  blob: {\n    driver: 'vercel-blob',\n    token: 'your-token',\n  },\n})\n",[655,1763,1764,1782,1786,1798,1816,1824,1839,1855,1859],{"__ignoreMap":653},[658,1765,1766,1768,1770,1772,1774,1776,1778,1780],{"class":660,"line":661},[658,1767,817],{"class":725},[658,1769,820],{"class":740},[658,1771,823],{"class":736},[658,1773,826],{"class":740},[658,1775,829],{"class":725},[658,1777,832],{"class":740},[658,1779,835],{"class":667},[658,1781,838],{"class":740},[658,1783,1784],{"class":660,"line":744},[658,1785,844],{"emptyLinePlaceholder":843},[658,1787,1788,1790,1792,1794,1796],{"class":660,"line":771},[658,1789,726],{"class":725},[658,1791,729],{"class":725},[658,1793,823],{"class":732},[658,1795,737],{"class":736},[658,1797,741],{"class":740},[658,1799,1800,1802,1804,1806,1808,1810,1812,1814],{"class":660,"line":859},[658,1801,748],{"class":747},[658,1803,751],{"class":740},[658,1805,754],{"class":736},[658,1807,757],{"class":740},[658,1809,870],{"class":667},[658,1811,757],{"class":740},[658,1813,765],{"class":736},[658,1815,768],{"class":740},[658,1817,1818,1820,1822],{"class":660,"line":879},[658,1819,882],{"class":747},[658,1821,751],{"class":740},[658,1823,887],{"class":740},[658,1825,1826,1828,1830,1832,1835,1837],{"class":660,"line":890},[658,1827,893],{"class":747},[658,1829,751],{"class":740},[658,1831,832],{"class":740},[658,1833,1834],{"class":667},"vercel-blob",[658,1836,757],{"class":740},[658,1838,768],{"class":740},[658,1840,1841,1844,1846,1848,1851,1853],{"class":660,"line":907},[658,1842,1843],{"class":747},"    token",[658,1845,751],{"class":740},[658,1847,832],{"class":740},[658,1849,1850],{"class":667},"your-token",[658,1852,757],{"class":740},[658,1854,768],{"class":740},[658,1856,1857],{"class":660,"line":924},[658,1858,927],{"class":740},[658,1860,1861,1863],{"class":660,"line":930},[658,1862,774],{"class":740},[658,1864,777],{"class":736},[644,1866,1867],{"label":1152},[648,1868,1870],{"className":715,"code":1869,"filename":810,"language":718,"meta":653,"style":653},"import { defineNitroConfig } from 'nitro\u002Fconfig'\n\nexport default defineNitroConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnitro'],\n  blob: {\n    driver: 'cloudflare-r2',\n    binding: 'BLOB',\n    bucketName: 'uploads',\n    jurisdiction: 'eu',\n  },\n})\n",[655,1871,1872,1890,1894,1906,1924,1932,1946,1962,1976,1990,1994],{"__ignoreMap":653},[658,1873,1874,1876,1878,1880,1882,1884,1886,1888],{"class":660,"line":661},[658,1875,817],{"class":725},[658,1877,820],{"class":740},[658,1879,823],{"class":736},[658,1881,826],{"class":740},[658,1883,829],{"class":725},[658,1885,832],{"class":740},[658,1887,835],{"class":667},[658,1889,838],{"class":740},[658,1891,1892],{"class":660,"line":744},[658,1893,844],{"emptyLinePlaceholder":843},[658,1895,1896,1898,1900,1902,1904],{"class":660,"line":771},[658,1897,726],{"class":725},[658,1899,729],{"class":725},[658,1901,823],{"class":732},[658,1903,737],{"class":736},[658,1905,741],{"class":740},[658,1907,1908,1910,1912,1914,1916,1918,1920,1922],{"class":660,"line":859},[658,1909,748],{"class":747},[658,1911,751],{"class":740},[658,1913,754],{"class":736},[658,1915,757],{"class":740},[658,1917,870],{"class":667},[658,1919,757],{"class":740},[658,1921,765],{"class":736},[658,1923,768],{"class":740},[658,1925,1926,1928,1930],{"class":660,"line":879},[658,1927,882],{"class":747},[658,1929,751],{"class":740},[658,1931,887],{"class":740},[658,1933,1934,1936,1938,1940,1942,1944],{"class":660,"line":890},[658,1935,893],{"class":747},[658,1937,751],{"class":740},[658,1939,832],{"class":740},[658,1941,1231],{"class":667},[658,1943,757],{"class":740},[658,1945,768],{"class":740},[658,1947,1948,1951,1953,1955,1958,1960],{"class":660,"line":907},[658,1949,1950],{"class":747},"    binding",[658,1952,751],{"class":740},[658,1954,832],{"class":740},[658,1956,1957],{"class":667},"BLOB",[658,1959,757],{"class":740},[658,1961,768],{"class":740},[658,1963,1964,1966,1968,1970,1972,1974],{"class":660,"line":924},[658,1965,1240],{"class":747},[658,1967,751],{"class":740},[658,1969,832],{"class":740},[658,1971,1247],{"class":667},[658,1973,757],{"class":740},[658,1975,768],{"class":740},[658,1977,1978,1980,1982,1984,1986,1988],{"class":660,"line":930},[658,1979,1256],{"class":747},[658,1981,751],{"class":740},[658,1983,832],{"class":740},[658,1985,1263],{"class":667},[658,1987,757],{"class":740},[658,1989,768],{"class":740},[658,1991,1992],{"class":660,"line":1274},[658,1993,927],{"class":740},[658,1995,1996,1998],{"class":660,"line":1730},[658,1997,774],{"class":740},[658,1999,777],{"class":736},[628,2001,2003],{"id":2002},"docker-and-kubernetes-deployments","Docker and Kubernetes deployments",[624,2005,2006],{},"Build container images without blob credentials by deferring S3 environment resolution to runtime.",[648,2008,2010],{"className":715,"code":2009,"filename":810,"language":718,"meta":653,"style":653},"import { defineNitroConfig } from 'nitro\u002Fconfig'\n\nexport default defineNitroConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnitro'],\n  blob: {\n    driver: 's3',\n  },\n})\n",[655,2011,2012,2030,2034,2046,2064,2072,2086,2090],{"__ignoreMap":653},[658,2013,2014,2016,2018,2020,2022,2024,2026,2028],{"class":660,"line":661},[658,2015,817],{"class":725},[658,2017,820],{"class":740},[658,2019,823],{"class":736},[658,2021,826],{"class":740},[658,2023,829],{"class":725},[658,2025,832],{"class":740},[658,2027,835],{"class":667},[658,2029,838],{"class":740},[658,2031,2032],{"class":660,"line":744},[658,2033,844],{"emptyLinePlaceholder":843},[658,2035,2036,2038,2040,2042,2044],{"class":660,"line":771},[658,2037,726],{"class":725},[658,2039,729],{"class":725},[658,2041,823],{"class":732},[658,2043,737],{"class":736},[658,2045,741],{"class":740},[658,2047,2048,2050,2052,2054,2056,2058,2060,2062],{"class":660,"line":859},[658,2049,748],{"class":747},[658,2051,751],{"class":740},[658,2053,754],{"class":736},[658,2055,757],{"class":740},[658,2057,870],{"class":667},[658,2059,757],{"class":740},[658,2061,765],{"class":736},[658,2063,768],{"class":740},[658,2065,2066,2068,2070],{"class":660,"line":879},[658,2067,882],{"class":747},[658,2069,751],{"class":740},[658,2071,887],{"class":740},[658,2073,2074,2076,2078,2080,2082,2084],{"class":660,"line":890},[658,2075,893],{"class":747},[658,2077,751],{"class":740},[658,2079,832],{"class":740},[658,2081,1659],{"class":667},[658,2083,757],{"class":740},[658,2085,768],{"class":740},[658,2087,2088],{"class":660,"line":907},[658,2089,927],{"class":740},[658,2091,2092,2094],{"class":660,"line":924},[658,2093,774],{"class":740},[658,2095,777],{"class":736},[624,2097,2098],{},"Set the credentials when the container starts:",[648,2100,2102],{"className":650,"code":2101,"filename":1005,"language":652,"meta":653,"style":653},"S3_ACCESS_KEY_ID=your-access-key-id\nS3_SECRET_ACCESS_KEY=your-secret-access-key\nS3_BUCKET=your-bucket-name\nS3_REGION=eu-central-1\nS3_ENDPOINT= # optional\n",[655,2103,2104,2112,2120,2128,2136],{"__ignoreMap":653},[658,2105,2106,2108,2110],{"class":660,"line":661},[658,2107,1012],{"class":736},[658,2109,1015],{"class":740},[658,2111,1018],{"class":667},[658,2113,2114,2116,2118],{"class":660,"line":744},[658,2115,1023],{"class":736},[658,2117,1015],{"class":740},[658,2119,1028],{"class":667},[658,2121,2122,2124,2126],{"class":660,"line":771},[658,2123,1033],{"class":736},[658,2125,1015],{"class":740},[658,2127,1038],{"class":667},[658,2129,2130,2132,2134],{"class":660,"line":859},[658,2131,1043],{"class":736},[658,2133,1015],{"class":740},[658,2135,1048],{"class":667},[658,2137,2138,2140,2142],{"class":660,"line":879},[658,2139,1053],{"class":736},[658,2141,1015],{"class":740},[658,2143,2144],{"class":1058}," # optional\n",[790,2146,2147],{},[624,2148,2149,2150,2152,2153,2155],{},"When the default blob config falls back to Local at build time, ViteHub still checks ",[655,2151,1446],{}," first and ",[655,2154,1071],{}," second at runtime before using the filesystem driver.",[628,2157,2159],{"id":2158},"nuxt-image-integration","Nuxt Image integration",[624,2161,2162,2171],{},[2163,2164,2168],"a",{"href":2165,"rel":2166},"https:\u002F\u002Fimage.nuxt.com",[2167],"nofollow",[655,2169,2170],{},"@nuxt\u002Fimage"," can optimize images that you expose through a blob-backed route.",[633,2173,2174,2179,2193,2197,2203,2401,2405,2515],{},[636,2175,949,2177],{"id":2176},"install-nuxtimage",[655,2178,2170],{},[648,2180,2182],{"className":650,"code":2181,"language":652,"meta":653,"style":653},"pnpm add @nuxt\u002Fimage\n",[655,2183,2184],{"__ignoreMap":653},[658,2185,2186,2188,2190],{"class":660,"line":661},[658,2187,646],{"class":664},[658,2189,668],{"class":667},[658,2191,2192],{"class":667}," @nuxt\u002Fimage\n",[636,2194,2196],{"id":2195},"expose-blob-files-on-a-route","Expose blob files on a route",[624,2198,2199,2200,751],{},"Create a route that serves blobs through ",[655,2201,2202],{},"blob.serve()",[710,2204,2205],{"id":712},[648,2206,2209],{"className":715,"code":2207,"filename":2208,"language":718,"meta":653,"style":653},"import { createError, defineEventHandler, getRouterParam } from 'h3'\nimport { blob } from '@vitehub\u002Fblob'\n\nexport default defineEventHandler(async (event) => {\n  const pathname = getRouterParam(event, 'pathname')\n  if (!pathname)\n    throw createError({ statusCode: 404, statusMessage: 'Not Found' })\n\n  return await blob.serve(event, pathname)\n})\n","server\u002Froutes\u002Fimages\u002F[...pathname].get.ts",[655,2210,2211,2239,2257,2261,2287,2315,2329,2368,2372,2395],{"__ignoreMap":653},[658,2212,2213,2215,2217,2220,2222,2224,2226,2229,2231,2233,2235,2237],{"class":660,"line":661},[658,2214,817],{"class":725},[658,2216,820],{"class":740},[658,2218,2219],{"class":736}," createError",[658,2221,1372],{"class":740},[658,2223,1331],{"class":736},[658,2225,1372],{"class":740},[658,2227,2228],{"class":736}," getRouterParam",[658,2230,826],{"class":740},[658,2232,829],{"class":725},[658,2234,832],{"class":740},[658,2236,636],{"class":667},[658,2238,838],{"class":740},[658,2240,2241,2243,2245,2247,2249,2251,2253,2255],{"class":660,"line":744},[658,2242,817],{"class":725},[658,2244,820],{"class":740},[658,2246,1307],{"class":736},[658,2248,826],{"class":740},[658,2250,829],{"class":725},[658,2252,832],{"class":740},[658,2254,1316],{"class":667},[658,2256,838],{"class":740},[658,2258,2259],{"class":660,"line":771},[658,2260,844],{"emptyLinePlaceholder":843},[658,2262,2263,2265,2267,2269,2271,2273,2276,2280,2283,2285],{"class":660,"line":859},[658,2264,726],{"class":725},[658,2266,729],{"class":725},[658,2268,1331],{"class":732},[658,2270,737],{"class":736},[658,2272,1337],{"class":1336},[658,2274,2275],{"class":740}," (",[658,2277,2279],{"class":2278},"sHdIc","event",[658,2281,2282],{"class":740},")",[658,2284,1343],{"class":1336},[658,2286,887],{"class":740},[658,2288,2289,2292,2295,2298,2300,2302,2304,2306,2308,2311,2313],{"class":660,"line":879},[658,2290,2291],{"class":1336},"  const",[658,2293,2294],{"class":736}," pathname",[658,2296,2297],{"class":740}," =",[658,2299,2228],{"class":732},[658,2301,737],{"class":747},[658,2303,2279],{"class":736},[658,2305,1372],{"class":740},[658,2307,832],{"class":740},[658,2309,2310],{"class":667},"pathname",[658,2312,757],{"class":740},[658,2314,777],{"class":747},[658,2316,2317,2320,2322,2325,2327],{"class":660,"line":890},[658,2318,2319],{"class":725},"  if",[658,2321,2275],{"class":747},[658,2323,2324],{"class":740},"!",[658,2326,2310],{"class":736},[658,2328,777],{"class":747},[658,2330,2331,2334,2336,2338,2341,2344,2346,2350,2352,2355,2357,2359,2362,2364,2366],{"class":660,"line":907},[658,2332,2333],{"class":725},"    throw",[658,2335,2219],{"class":732},[658,2337,737],{"class":747},[658,2339,2340],{"class":740},"{",[658,2342,2343],{"class":747}," statusCode",[658,2345,751],{"class":740},[658,2347,2349],{"class":2348},"sbssI"," 404",[658,2351,1372],{"class":740},[658,2353,2354],{"class":747}," statusMessage",[658,2356,751],{"class":740},[658,2358,832],{"class":740},[658,2360,2361],{"class":667},"Not Found",[658,2363,757],{"class":740},[658,2365,826],{"class":740},[658,2367,777],{"class":747},[658,2369,2370],{"class":660,"line":924},[658,2371,844],{"emptyLinePlaceholder":843},[658,2373,2374,2376,2378,2380,2382,2385,2387,2389,2391,2393],{"class":660,"line":930},[658,2375,1350],{"class":725},[658,2377,1353],{"class":725},[658,2379,1307],{"class":736},[658,2381,798],{"class":740},[658,2383,2384],{"class":732},"serve",[658,2386,737],{"class":747},[658,2388,2279],{"class":736},[658,2390,1372],{"class":740},[658,2392,2294],{"class":736},[658,2394,777],{"class":747},[658,2396,2397,2399],{"class":660,"line":1274},[658,2398,774],{"class":740},[658,2400,777],{"class":736},[636,2402,2404],{"id":2403},"use-a-production-image-provider-only-in-production","Use a production image provider only in production",[710,2406,2407],{"id":712},[648,2408,2410],{"className":715,"code":2409,"filename":717,"language":718,"meta":653,"style":653},"export default defineNuxtConfig({\n  modules: ['@vitehub\u002Fblob\u002Fnuxt'],\n  image: { provider: 'none' },\n  $production: {\n    image: {\n      provider: 'cloudflare',\n    },\n  },\n})\n",[655,2411,2412,2424,2442,2466,2475,2484,2500,2505,2509],{"__ignoreMap":653},[658,2413,2414,2416,2418,2420,2422],{"class":660,"line":661},[658,2415,726],{"class":725},[658,2417,729],{"class":725},[658,2419,733],{"class":732},[658,2421,737],{"class":736},[658,2423,741],{"class":740},[658,2425,2426,2428,2430,2432,2434,2436,2438,2440],{"class":660,"line":744},[658,2427,748],{"class":747},[658,2429,751],{"class":740},[658,2431,754],{"class":736},[658,2433,757],{"class":740},[658,2435,760],{"class":667},[658,2437,757],{"class":740},[658,2439,765],{"class":736},[658,2441,768],{"class":740},[658,2443,2444,2447,2449,2451,2454,2456,2458,2461,2463],{"class":660,"line":771},[658,2445,2446],{"class":747},"  image",[658,2448,751],{"class":740},[658,2450,820],{"class":740},[658,2452,2453],{"class":747}," provider",[658,2455,751],{"class":740},[658,2457,832],{"class":740},[658,2459,2460],{"class":667},"none",[658,2462,757],{"class":740},[658,2464,2465],{"class":740}," },\n",[658,2467,2468,2471,2473],{"class":660,"line":859},[658,2469,2470],{"class":747},"  $production",[658,2472,751],{"class":740},[658,2474,887],{"class":740},[658,2476,2477,2480,2482],{"class":660,"line":879},[658,2478,2479],{"class":747},"    image",[658,2481,751],{"class":740},[658,2483,887],{"class":740},[658,2485,2486,2489,2491,2493,2496,2498],{"class":660,"line":890},[658,2487,2488],{"class":747},"      provider",[658,2490,751],{"class":740},[658,2492,832],{"class":740},[658,2494,2495],{"class":667},"cloudflare",[658,2497,757],{"class":740},[658,2499,768],{"class":740},[658,2501,2502],{"class":660,"line":907},[658,2503,2504],{"class":740},"    },\n",[658,2506,2507],{"class":660,"line":924},[658,2508,927],{"class":740},[658,2510,2511,2513],{"class":660,"line":930},[658,2512,774],{"class":740},[658,2514,777],{"class":736},[2516,2517,2519],"warning",{"title":2518},"Development limitation",[624,2520,2521,2522,2525,2526,2529],{},"Cloudflare and Vercel image providers generate production-only URLs. In development, keep ",[655,2523,2524],{},"provider: 'none'"," so routes like ",[655,2527,2528],{},"\u002Fimages\u002F**"," still resolve directly through your Nitro server.",[628,2531,2533],{"id":2532},"serve-blobs-on-a-route","Serve blobs on a route",[936,2535,2536],{},[624,2537,2538],{},"Control the content types you serve from user-generated blobs to avoid XSS issues.",[624,2540,2541],{},"Add a restrictive CSP header on the serving route when you only need raw file delivery:",[710,2543,2544],{"id":712},[648,2545,2548],{"className":715,"code":2546,"filename":2547,"language":718,"meta":653,"style":653},"import { createError, defineEventHandler, getRouterParam, setHeader } from 'h3'\nimport { blob } from '@vitehub\u002Fblob'\n\nexport default defineEventHandler(async (event) => {\n  const pathname = getRouterParam(event, 'pathname')\n  if (!pathname)\n    throw createError({ statusCode: 404, statusMessage: 'Not Found' })\n\n  setHeader(event, 'Content-Security-Policy', 'default-src \\'none\\';')\n  return await blob.serve(event, pathname)\n})\n","server\u002Froutes\u002Ffiles\u002F[...pathname].get.ts",[655,2549,2550,2581,2599,2603,2625,2649,2661,2693,2697,2736,2758],{"__ignoreMap":653},[658,2551,2552,2554,2556,2558,2560,2562,2564,2566,2568,2571,2573,2575,2577,2579],{"class":660,"line":661},[658,2553,817],{"class":725},[658,2555,820],{"class":740},[658,2557,2219],{"class":736},[658,2559,1372],{"class":740},[658,2561,1331],{"class":736},[658,2563,1372],{"class":740},[658,2565,2228],{"class":736},[658,2567,1372],{"class":740},[658,2569,2570],{"class":736}," setHeader",[658,2572,826],{"class":740},[658,2574,829],{"class":725},[658,2576,832],{"class":740},[658,2578,636],{"class":667},[658,2580,838],{"class":740},[658,2582,2583,2585,2587,2589,2591,2593,2595,2597],{"class":660,"line":744},[658,2584,817],{"class":725},[658,2586,820],{"class":740},[658,2588,1307],{"class":736},[658,2590,826],{"class":740},[658,2592,829],{"class":725},[658,2594,832],{"class":740},[658,2596,1316],{"class":667},[658,2598,838],{"class":740},[658,2600,2601],{"class":660,"line":771},[658,2602,844],{"emptyLinePlaceholder":843},[658,2604,2605,2607,2609,2611,2613,2615,2617,2619,2621,2623],{"class":660,"line":859},[658,2606,726],{"class":725},[658,2608,729],{"class":725},[658,2610,1331],{"class":732},[658,2612,737],{"class":736},[658,2614,1337],{"class":1336},[658,2616,2275],{"class":740},[658,2618,2279],{"class":2278},[658,2620,2282],{"class":740},[658,2622,1343],{"class":1336},[658,2624,887],{"class":740},[658,2626,2627,2629,2631,2633,2635,2637,2639,2641,2643,2645,2647],{"class":660,"line":879},[658,2628,2291],{"class":1336},[658,2630,2294],{"class":736},[658,2632,2297],{"class":740},[658,2634,2228],{"class":732},[658,2636,737],{"class":747},[658,2638,2279],{"class":736},[658,2640,1372],{"class":740},[658,2642,832],{"class":740},[658,2644,2310],{"class":667},[658,2646,757],{"class":740},[658,2648,777],{"class":747},[658,2650,2651,2653,2655,2657,2659],{"class":660,"line":890},[658,2652,2319],{"class":725},[658,2654,2275],{"class":747},[658,2656,2324],{"class":740},[658,2658,2310],{"class":736},[658,2660,777],{"class":747},[658,2662,2663,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691],{"class":660,"line":907},[658,2664,2333],{"class":725},[658,2666,2219],{"class":732},[658,2668,737],{"class":747},[658,2670,2340],{"class":740},[658,2672,2343],{"class":747},[658,2674,751],{"class":740},[658,2676,2349],{"class":2348},[658,2678,1372],{"class":740},[658,2680,2354],{"class":747},[658,2682,751],{"class":740},[658,2684,832],{"class":740},[658,2686,2361],{"class":667},[658,2688,757],{"class":740},[658,2690,826],{"class":740},[658,2692,777],{"class":747},[658,2694,2695],{"class":660,"line":924},[658,2696,844],{"emptyLinePlaceholder":843},[658,2698,2699,2702,2704,2706,2708,2710,2713,2715,2717,2719,2722,2725,2727,2729,2732,2734],{"class":660,"line":930},[658,2700,2701],{"class":732},"  setHeader",[658,2703,737],{"class":747},[658,2705,2279],{"class":736},[658,2707,1372],{"class":740},[658,2709,832],{"class":740},[658,2711,2712],{"class":667},"Content-Security-Policy",[658,2714,757],{"class":740},[658,2716,1372],{"class":740},[658,2718,832],{"class":740},[658,2720,2721],{"class":667},"default-src ",[658,2723,2724],{"class":736},"\\'",[658,2726,2460],{"class":667},[658,2728,2724],{"class":736},[658,2730,2731],{"class":667},";",[658,2733,757],{"class":740},[658,2735,777],{"class":747},[658,2737,2738,2740,2742,2744,2746,2748,2750,2752,2754,2756],{"class":660,"line":1274},[658,2739,1350],{"class":725},[658,2741,1353],{"class":725},[658,2743,1307],{"class":736},[658,2745,798],{"class":740},[658,2747,2384],{"class":732},[658,2749,737],{"class":747},[658,2751,2279],{"class":736},[658,2753,1372],{"class":740},[658,2755,2294],{"class":736},[658,2757,777],{"class":747},[658,2759,2760,2762],{"class":660,"line":1730},[658,2761,774],{"class":740},[658,2763,777],{"class":736},[2765,2766,2767],"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 .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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":653,"searchDepth":744,"depth":744,"links":2769},[2770,2776,2777,2778,2779,2785],{"id":630,"depth":744,"text":631,"children":2771},[2772,2773,2774,2775],{"id":638,"depth":771,"text":639},{"id":707,"depth":771,"text":708},{"id":780,"depth":771,"text":781},{"id":1289,"depth":771,"text":1290},{"id":1424,"depth":744,"text":1425},{"id":1469,"depth":744,"text":1470},{"id":2002,"depth":744,"text":2003},{"id":2158,"depth":744,"text":2159,"children":2780},[2781,2783,2784],{"id":2176,"depth":771,"text":2782},"Install @nuxt\u002Fimage",{"id":2195,"depth":771,"text":2196},{"id":2403,"depth":771,"text":2404},{"id":2532,"depth":744,"text":2533},"md",{},{"title":2789},"Overview",{"title":64,"description":66},"docs\u002Fnuxt\u002Fblob\u002Findex","jWlHmLp6JMFZN337db5bEzGog4GLM5BTuHFnd_hB0mM",[2794,2795],{"title":59,"path":495,"description":61},{"title":70,"path":500,"description":72},1775391843879]