[{"data":1,"prerenderedAt":2596},["ShallowReactive",2],{"docs-navigation":3,"docs:\u002Fdocs\u002Fnuxt\u002Fblob\u002Fupload":618,"\u002Fdocs\u002Fnuxt\u002Fblob\u002Fupload:surround":2592},[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":620,"body":621,"description":72,"extension":2586,"meta":2587,"navigation":2588,"path":500,"seo":2589,"stem":2590,"__hash__":2591},"docs\u002Fdocs\u002Fnuxt\u002Fblob\u002Fupload.md","File uploads",{"type":622,"value":623,"toc":2568},"minimark",[624,628,633,645,950,956,964,988,992,1050,1054,1068,1072,1279,1283,1290,1554,1560,1565,1589,1610,1613,1670,1673,1676,1704,1710,1717,2214,2217,2267,2270,2276,2347,2360,2364,2367,2564],[625,626,627],"p",{},"ViteHub Blob supports upload workflows from validated form uploads to large multipart uploads.",[629,630,632],"h2",{"id":631},"simple-upload","Simple upload",[625,634,635,636,640,641,644],{},"For most use cases, use ",[637,638,639],"code",{},"blob.handleUpload()"," in a route that receives ",[637,642,643],{},"FormData",".",[646,647,649],"fw",{"id":648},"nuxt",[650,651,657],"pre",{"className":652,"code":653,"filename":654,"language":655,"meta":656,"style":656},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineEventHandler } from 'h3'\nimport { blob } from '@vitehub\u002Fblob'\n\nexport default defineEventHandler(async (event) => {\n  return await blob.handleUpload(event, {\n    formKey: 'files',\n    multiple: true,\n    ensure: {\n      maxSize: '10MB',\n      types: ['image\u002Fjpeg', 'image\u002Fpng', 'image\u002Fwebp'],\n    },\n    put: {\n      addRandomSuffix: true,\n      prefix: 'images',\n    },\n  })\n})\n","server\u002Fapi\u002Fupload.post.ts","ts","",[637,658,659,692,713,720,755,781,801,815,825,842,883,889,899,911,928,933,942],{"__ignoreMap":656},[660,661,664,668,672,676,679,682,685,689],"span",{"class":662,"line":663},"line",1,[660,665,667],{"class":666},"s7zQu","import",[660,669,671],{"class":670},"sMK4o"," {",[660,673,675],{"class":674},"sTEyZ"," defineEventHandler",[660,677,678],{"class":670}," }",[660,680,681],{"class":666}," from",[660,683,684],{"class":670}," '",[660,686,688],{"class":687},"sfazB","h3",[660,690,691],{"class":670},"'\n",[660,693,695,697,699,702,704,706,708,711],{"class":662,"line":694},2,[660,696,667],{"class":666},[660,698,671],{"class":670},[660,700,701],{"class":674}," blob",[660,703,678],{"class":670},[660,705,681],{"class":666},[660,707,684],{"class":670},[660,709,710],{"class":687},"@vitehub\u002Fblob",[660,712,691],{"class":670},[660,714,716],{"class":662,"line":715},3,[660,717,719],{"emptyLinePlaceholder":718},true,"\n",[660,721,723,726,729,732,735,739,742,746,749,752],{"class":662,"line":722},4,[660,724,725],{"class":666},"export",[660,727,728],{"class":666}," default",[660,730,675],{"class":731},"s2Zo4",[660,733,734],{"class":674},"(",[660,736,738],{"class":737},"spNyl","async",[660,740,741],{"class":670}," (",[660,743,745],{"class":744},"sHdIc","event",[660,747,748],{"class":670},")",[660,750,751],{"class":737}," =>",[660,753,754],{"class":670}," {\n",[660,756,758,761,764,766,768,771,774,776,779],{"class":662,"line":757},5,[660,759,760],{"class":666},"  return",[660,762,763],{"class":666}," await",[660,765,701],{"class":674},[660,767,644],{"class":670},[660,769,770],{"class":731},"handleUpload",[660,772,734],{"class":773},"swJcz",[660,775,745],{"class":674},[660,777,778],{"class":670},",",[660,780,754],{"class":670},[660,782,784,787,790,792,795,798],{"class":662,"line":783},6,[660,785,786],{"class":773},"    formKey",[660,788,789],{"class":670},":",[660,791,684],{"class":670},[660,793,794],{"class":687},"files",[660,796,797],{"class":670},"'",[660,799,800],{"class":670},",\n",[660,802,804,807,809,813],{"class":662,"line":803},7,[660,805,806],{"class":773},"    multiple",[660,808,789],{"class":670},[660,810,812],{"class":811},"sfNiH"," true",[660,814,800],{"class":670},[660,816,818,821,823],{"class":662,"line":817},8,[660,819,820],{"class":773},"    ensure",[660,822,789],{"class":670},[660,824,754],{"class":670},[660,826,828,831,833,835,838,840],{"class":662,"line":827},9,[660,829,830],{"class":773},"      maxSize",[660,832,789],{"class":670},[660,834,684],{"class":670},[660,836,837],{"class":687},"10MB",[660,839,797],{"class":670},[660,841,800],{"class":670},[660,843,845,848,850,853,855,858,860,862,864,867,869,871,873,876,878,881],{"class":662,"line":844},10,[660,846,847],{"class":773},"      types",[660,849,789],{"class":670},[660,851,852],{"class":773}," [",[660,854,797],{"class":670},[660,856,857],{"class":687},"image\u002Fjpeg",[660,859,797],{"class":670},[660,861,778],{"class":670},[660,863,684],{"class":670},[660,865,866],{"class":687},"image\u002Fpng",[660,868,797],{"class":670},[660,870,778],{"class":670},[660,872,684],{"class":670},[660,874,875],{"class":687},"image\u002Fwebp",[660,877,797],{"class":670},[660,879,880],{"class":773},"]",[660,882,800],{"class":670},[660,884,886],{"class":662,"line":885},11,[660,887,888],{"class":670},"    },\n",[660,890,892,895,897],{"class":662,"line":891},12,[660,893,894],{"class":773},"    put",[660,896,789],{"class":670},[660,898,754],{"class":670},[660,900,902,905,907,909],{"class":662,"line":901},13,[660,903,904],{"class":773},"      addRandomSuffix",[660,906,789],{"class":670},[660,908,812],{"class":811},[660,910,800],{"class":670},[660,912,914,917,919,921,924,926],{"class":662,"line":913},14,[660,915,916],{"class":773},"      prefix",[660,918,789],{"class":670},[660,920,684],{"class":670},[660,922,923],{"class":687},"images",[660,925,797],{"class":670},[660,927,800],{"class":670},[660,929,931],{"class":662,"line":930},15,[660,932,888],{"class":670},[660,934,936,939],{"class":662,"line":935},16,[660,937,938],{"class":670},"  }",[660,940,941],{"class":773},")\n",[660,943,945,948],{"class":662,"line":944},17,[660,946,947],{"class":670},"}",[660,949,941],{"class":674},[629,951,953],{"id":952},"handleupload",[637,954,955],{},"handleUpload()",[625,957,958,960,961,644],{},[637,959,639],{}," validates uploaded files and stores them with ",[637,962,963],{},"blob.put()",[650,965,967],{"className":652,"code":966,"language":655,"meta":656,"style":656},"await blob.handleUpload(event, options)\n",[637,968,969],{"__ignoreMap":656},[660,970,971,974,976,978,980,983,985],{"class":662,"line":663},[660,972,973],{"class":666},"await",[660,975,701],{"class":674},[660,977,644],{"class":670},[660,979,770],{"class":731},[660,981,982],{"class":674},"(event",[660,984,778],{"class":670},[660,986,987],{"class":674}," options)\n",[688,989,991],{"id":990},"parameters","Parameters",[993,994,995,1003],"field-group",{},[996,997,1000],"field",{"name":745,"type":998,":required":999},"H3Event","true",[625,1001,1002],{},"The current request event.",[996,1004,1007,1010],{"name":1005,"type":1006},"options","Object",[625,1008,1009],{},"Upload options.",[1011,1012,1013,1022,1031,1041],"collapsible",{},[996,1014,1017],{"name":1015,"type":1016},"formKey","string",[625,1018,1019,1020,644],{},"The form field to read from. Defaults to ",[637,1021,794],{},[996,1023,1026],{"name":1024,"type":1025},"multiple","boolean",[625,1027,1028,1029,644],{},"Accept multiple files. Defaults to ",[637,1030,999],{},[996,1032,1035],{"name":1033,"type":1034},"ensure","BlobEnsureOptions",[625,1036,1037,1038,644],{},"Validation rules passed to ",[637,1039,1040],{},"ensureBlob()",[996,1042,1045],{"name":1043,"type":1044},"put","BlobPutOptions",[625,1046,1047,1048,644],{},"Options forwarded to ",[637,1049,963],{},[688,1051,1053],{"id":1052},"return-value","Return value",[625,1055,1056,1057,1060,1061,1063,1064,1067],{},"Returns an array of ",[637,1058,1059],{},"BlobObject"," items. When ",[637,1062,1024],{}," is ",[637,1065,1066],{},"false",", the array contains a single uploaded blob.",[629,1069,1071],{"id":1070},"full-example","Full example",[646,1073,1074],{"id":648},[650,1075,1077],{"className":652,"code":1076,"filename":654,"language":655,"meta":656,"style":656},"import { defineEventHandler } from 'h3'\nimport { blob } from '@vitehub\u002Fblob'\n\nexport default defineEventHandler(async (event) => {\n  return await blob.handleUpload(event, {\n    formKey: 'files',\n    multiple: true,\n    ensure: {\n      maxSize: '10MB',\n      types: ['image'],\n    },\n    put: {\n      addRandomSuffix: true,\n      prefix: 'avatars',\n    },\n  })\n})\n",[637,1078,1079,1097,1115,1119,1141,1161,1175,1185,1193,1207,1226,1230,1238,1248,1263,1267,1273],{"__ignoreMap":656},[660,1080,1081,1083,1085,1087,1089,1091,1093,1095],{"class":662,"line":663},[660,1082,667],{"class":666},[660,1084,671],{"class":670},[660,1086,675],{"class":674},[660,1088,678],{"class":670},[660,1090,681],{"class":666},[660,1092,684],{"class":670},[660,1094,688],{"class":687},[660,1096,691],{"class":670},[660,1098,1099,1101,1103,1105,1107,1109,1111,1113],{"class":662,"line":694},[660,1100,667],{"class":666},[660,1102,671],{"class":670},[660,1104,701],{"class":674},[660,1106,678],{"class":670},[660,1108,681],{"class":666},[660,1110,684],{"class":670},[660,1112,710],{"class":687},[660,1114,691],{"class":670},[660,1116,1117],{"class":662,"line":715},[660,1118,719],{"emptyLinePlaceholder":718},[660,1120,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139],{"class":662,"line":722},[660,1122,725],{"class":666},[660,1124,728],{"class":666},[660,1126,675],{"class":731},[660,1128,734],{"class":674},[660,1130,738],{"class":737},[660,1132,741],{"class":670},[660,1134,745],{"class":744},[660,1136,748],{"class":670},[660,1138,751],{"class":737},[660,1140,754],{"class":670},[660,1142,1143,1145,1147,1149,1151,1153,1155,1157,1159],{"class":662,"line":757},[660,1144,760],{"class":666},[660,1146,763],{"class":666},[660,1148,701],{"class":674},[660,1150,644],{"class":670},[660,1152,770],{"class":731},[660,1154,734],{"class":773},[660,1156,745],{"class":674},[660,1158,778],{"class":670},[660,1160,754],{"class":670},[660,1162,1163,1165,1167,1169,1171,1173],{"class":662,"line":783},[660,1164,786],{"class":773},[660,1166,789],{"class":670},[660,1168,684],{"class":670},[660,1170,794],{"class":687},[660,1172,797],{"class":670},[660,1174,800],{"class":670},[660,1176,1177,1179,1181,1183],{"class":662,"line":803},[660,1178,806],{"class":773},[660,1180,789],{"class":670},[660,1182,812],{"class":811},[660,1184,800],{"class":670},[660,1186,1187,1189,1191],{"class":662,"line":817},[660,1188,820],{"class":773},[660,1190,789],{"class":670},[660,1192,754],{"class":670},[660,1194,1195,1197,1199,1201,1203,1205],{"class":662,"line":827},[660,1196,830],{"class":773},[660,1198,789],{"class":670},[660,1200,684],{"class":670},[660,1202,837],{"class":687},[660,1204,797],{"class":670},[660,1206,800],{"class":670},[660,1208,1209,1211,1213,1215,1217,1220,1222,1224],{"class":662,"line":844},[660,1210,847],{"class":773},[660,1212,789],{"class":670},[660,1214,852],{"class":773},[660,1216,797],{"class":670},[660,1218,1219],{"class":687},"image",[660,1221,797],{"class":670},[660,1223,880],{"class":773},[660,1225,800],{"class":670},[660,1227,1228],{"class":662,"line":885},[660,1229,888],{"class":670},[660,1231,1232,1234,1236],{"class":662,"line":891},[660,1233,894],{"class":773},[660,1235,789],{"class":670},[660,1237,754],{"class":670},[660,1239,1240,1242,1244,1246],{"class":662,"line":901},[660,1241,904],{"class":773},[660,1243,789],{"class":670},[660,1245,812],{"class":811},[660,1247,800],{"class":670},[660,1249,1250,1252,1254,1256,1259,1261],{"class":662,"line":913},[660,1251,916],{"class":773},[660,1253,789],{"class":670},[660,1255,684],{"class":670},[660,1257,1258],{"class":687},"avatars",[660,1260,797],{"class":670},[660,1262,800],{"class":670},[660,1264,1265],{"class":662,"line":930},[660,1266,888],{"class":670},[660,1268,1269,1271],{"class":662,"line":935},[660,1270,938],{"class":670},[660,1272,941],{"class":773},[660,1274,1275,1277],{"class":662,"line":944},[660,1276,947],{"class":670},[660,1278,941],{"class":674},[629,1280,1282],{"id":1281},"multipart-upload","Multipart upload",[625,1284,1285,1286,1289],{},"For large files, expose ",[637,1287,1288],{},"blob.handleMultipartUpload()"," on a dedicated route and drive the upload flow from your app or service code.",[646,1291,1292],{"id":648},[1293,1294,1296,1428],"tabs",{"sync":1295},"blob-provider",[1297,1298,1300],"tabs-item",{"label":1299},"R2 \u002F S3 \u002F FS",[650,1301,1304],{"className":652,"code":1302,"filename":1303,"language":655,"meta":656,"style":656},"import { defineEventHandler } from 'h3'\nimport { blob } from '@vitehub\u002Fblob'\n\nexport default defineEventHandler(async (event) => {\n  return await blob.handleMultipartUpload(event, {\n    addRandomSuffix: true,\n    prefix: 'uploads',\n  })\n})\n","server\u002Fapi\u002Ffiles\u002Fmultipart\u002F[action]\u002F[...pathname].ts",[637,1305,1306,1324,1342,1346,1368,1389,1400,1416,1422],{"__ignoreMap":656},[660,1307,1308,1310,1312,1314,1316,1318,1320,1322],{"class":662,"line":663},[660,1309,667],{"class":666},[660,1311,671],{"class":670},[660,1313,675],{"class":674},[660,1315,678],{"class":670},[660,1317,681],{"class":666},[660,1319,684],{"class":670},[660,1321,688],{"class":687},[660,1323,691],{"class":670},[660,1325,1326,1328,1330,1332,1334,1336,1338,1340],{"class":662,"line":694},[660,1327,667],{"class":666},[660,1329,671],{"class":670},[660,1331,701],{"class":674},[660,1333,678],{"class":670},[660,1335,681],{"class":666},[660,1337,684],{"class":670},[660,1339,710],{"class":687},[660,1341,691],{"class":670},[660,1343,1344],{"class":662,"line":715},[660,1345,719],{"emptyLinePlaceholder":718},[660,1347,1348,1350,1352,1354,1356,1358,1360,1362,1364,1366],{"class":662,"line":722},[660,1349,725],{"class":666},[660,1351,728],{"class":666},[660,1353,675],{"class":731},[660,1355,734],{"class":674},[660,1357,738],{"class":737},[660,1359,741],{"class":670},[660,1361,745],{"class":744},[660,1363,748],{"class":670},[660,1365,751],{"class":737},[660,1367,754],{"class":670},[660,1369,1370,1372,1374,1376,1378,1381,1383,1385,1387],{"class":662,"line":757},[660,1371,760],{"class":666},[660,1373,763],{"class":666},[660,1375,701],{"class":674},[660,1377,644],{"class":670},[660,1379,1380],{"class":731},"handleMultipartUpload",[660,1382,734],{"class":773},[660,1384,745],{"class":674},[660,1386,778],{"class":670},[660,1388,754],{"class":670},[660,1390,1391,1394,1396,1398],{"class":662,"line":783},[660,1392,1393],{"class":773},"    addRandomSuffix",[660,1395,789],{"class":670},[660,1397,812],{"class":811},[660,1399,800],{"class":670},[660,1401,1402,1405,1407,1409,1412,1414],{"class":662,"line":803},[660,1403,1404],{"class":773},"    prefix",[660,1406,789],{"class":670},[660,1408,684],{"class":670},[660,1410,1411],{"class":687},"uploads",[660,1413,797],{"class":670},[660,1415,800],{"class":670},[660,1417,1418,1420],{"class":662,"line":817},[660,1419,938],{"class":670},[660,1421,941],{"class":773},[660,1423,1424,1426],{"class":662,"line":827},[660,1425,947],{"class":670},[660,1427,941],{"class":674},[1297,1429,1431],{"label":1430},"Vercel Blob",[650,1432,1434],{"className":652,"code":1302,"filename":1433,"language":655,"meta":656,"style":656},"server\u002Fapi\u002Ffiles\u002Fmultipart\u002F[...pathname].ts",[637,1435,1436,1454,1472,1476,1498,1518,1528,1542,1548],{"__ignoreMap":656},[660,1437,1438,1440,1442,1444,1446,1448,1450,1452],{"class":662,"line":663},[660,1439,667],{"class":666},[660,1441,671],{"class":670},[660,1443,675],{"class":674},[660,1445,678],{"class":670},[660,1447,681],{"class":666},[660,1449,684],{"class":670},[660,1451,688],{"class":687},[660,1453,691],{"class":670},[660,1455,1456,1458,1460,1462,1464,1466,1468,1470],{"class":662,"line":694},[660,1457,667],{"class":666},[660,1459,671],{"class":670},[660,1461,701],{"class":674},[660,1463,678],{"class":670},[660,1465,681],{"class":666},[660,1467,684],{"class":670},[660,1469,710],{"class":687},[660,1471,691],{"class":670},[660,1473,1474],{"class":662,"line":715},[660,1475,719],{"emptyLinePlaceholder":718},[660,1477,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496],{"class":662,"line":722},[660,1479,725],{"class":666},[660,1481,728],{"class":666},[660,1483,675],{"class":731},[660,1485,734],{"class":674},[660,1487,738],{"class":737},[660,1489,741],{"class":670},[660,1491,745],{"class":744},[660,1493,748],{"class":670},[660,1495,751],{"class":737},[660,1497,754],{"class":670},[660,1499,1500,1502,1504,1506,1508,1510,1512,1514,1516],{"class":662,"line":757},[660,1501,760],{"class":666},[660,1503,763],{"class":666},[660,1505,701],{"class":674},[660,1507,644],{"class":670},[660,1509,1380],{"class":731},[660,1511,734],{"class":773},[660,1513,745],{"class":674},[660,1515,778],{"class":670},[660,1517,754],{"class":670},[660,1519,1520,1522,1524,1526],{"class":662,"line":783},[660,1521,1393],{"class":773},[660,1523,789],{"class":670},[660,1525,812],{"class":811},[660,1527,800],{"class":670},[660,1529,1530,1532,1534,1536,1538,1540],{"class":662,"line":803},[660,1531,1404],{"class":773},[660,1533,789],{"class":670},[660,1535,684],{"class":670},[660,1537,1411],{"class":687},[660,1539,797],{"class":670},[660,1541,800],{"class":670},[660,1543,1544,1546],{"class":662,"line":817},[660,1545,938],{"class":670},[660,1547,941],{"class":773},[660,1549,1550,1552],{"class":662,"line":827},[660,1551,947],{"class":670},[660,1553,941],{"class":674},[629,1555,1557],{"id":1556},"handlemultipartupload",[637,1558,1559],{},"handleMultipartUpload()",[625,1561,1562,1564],{},[637,1563,1288],{}," handles multipart upload lifecycle actions:",[1566,1567,1568,1574,1579,1584],"ul",{},[1569,1570,1571],"li",{},[637,1572,1573],{},"create",[1569,1575,1576],{},[637,1577,1578],{},"upload",[1569,1580,1581],{},[637,1582,1583],{},"complete",[1569,1585,1586],{},[637,1587,1588],{},"abort",[650,1590,1592],{"className":652,"code":1591,"language":655,"meta":656,"style":656},"await blob.handleMultipartUpload(event, options)\n",[637,1593,1594],{"__ignoreMap":656},[660,1595,1596,1598,1600,1602,1604,1606,1608],{"class":662,"line":663},[660,1597,973],{"class":666},[660,1599,701],{"class":674},[660,1601,644],{"class":670},[660,1603,1380],{"class":731},[660,1605,982],{"class":674},[660,1607,778],{"class":670},[660,1609,987],{"class":674},[688,1611,991],{"id":1612},"parameters-1",[993,1614,1615,1619],{},[996,1616,1617],{"name":745,"type":998,":required":999},[625,1618,1002],{},[996,1620,1621,1624],{"name":1005,"type":1006},[625,1622,1623],{},"Multipart upload options.",[1011,1625,1626,1632,1638,1644,1650,1657,1664],{},[996,1627,1629],{"name":1628,"type":1016},"contentType",[625,1630,1631],{},"The blob content type.",[996,1633,1635],{"name":1634,"type":1016},"contentLength",[625,1636,1637],{},"The blob content length.",[996,1639,1641],{"name":1640,"type":1025},"addRandomSuffix",[625,1642,1643],{},"Adds a random suffix to the final pathname.",[996,1645,1647],{"name":1646,"type":1016},"prefix",[625,1648,1649],{},"Prefix applied to the final pathname.",[996,1651,1654],{"name":1652,"type":1653},"customMetadata","Record\u003Cstring, string>",[625,1655,1656],{},"Custom metadata stored with the blob.",[996,1658,1661],{"name":1659,"type":1660},"onBeforeGenerateToken","Function",[625,1662,1663],{},"Vercel Blob only. Customize the generated upload token payload before the client upload starts.",[996,1665,1667],{"name":1666,"type":1660},"onUploadCompleted",[625,1668,1669],{},"Vercel Blob only. Observe the completed client upload callback payload.",[688,1671,1053],{"id":1672},"return-value-1",[625,1674,1675],{},"The route returns the multipart payload for the current action:",[1566,1677,1678,1686,1693,1699],{},[1569,1679,1680,1682,1683],{},[637,1681,1573],{},": ",[637,1684,1685],{},"{ pathname, uploadId }",[1569,1687,1688,1682,1690],{},[637,1689,1578],{},[637,1691,1692],{},"{ partNumber, etag }",[1569,1694,1695,1682,1697],{},[637,1696,1583],{},[637,1698,1059],{},[1569,1700,1701,1703],{},[637,1702,1588],{},": no content",[629,1705,1707],{"id":1706},"usemultipartupload",[637,1708,1709],{},"useMultipartUpload()",[625,1711,1712,1713,1716],{},"Use the client helper from ",[637,1714,1715],{},"@vitehub\u002Fblob\u002Fclient"," to drive multipart uploads from a Nuxt app or any Vue client that can reach your Nitro routes.",[650,1718,1723],{"className":1719,"code":1720,"filename":1721,"language":1722,"meta":656,"style":656},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { useMultipartUpload } from '@vitehub\u002Fblob\u002Fclient'\n\nconst uploader = useMultipartUpload('\u002Fapi\u002Ffiles\u002Fmultipart', {\n  partSize: 10 * 1024 * 1024,\n  concurrent: 3,\n})\n\nconst file = ref\u003CFile | null>(null)\nconst progress = ref(0)\nconst uploading = ref(false)\nlet abortUpload: null | (() => Promise\u003Cvoid>) = null\n\nasync function startUpload() {\n  if (!file.value)\n    return\n\n  uploading.value = true\n  const { completed, progress: uploadProgress, abort } = uploader(file.value)\n  abortUpload = abort\n\n  watch(uploadProgress, (value) => {\n    progress.value = value\n  }, { immediate: true })\n\n  try {\n    await completed\n  }\n  finally {\n    uploading.value = false\n    abortUpload = null\n  }\n}\n\u003C\u002Fscript>\n","app\u002Fpages\u002Fupload-large.vue","vue",[637,1724,1725,1752,1771,1775,1800,1823,1835,1841,1845,1879,1897,1914,1953,1957,1971,1991,1996,2000,2016,2059,2070,2075,2098,2113,2132,2137,2145,2154,2160,2168,2183,2193,2198,2204],{"__ignoreMap":656},[660,1726,1727,1730,1733,1736,1739,1742,1745,1747,1749],{"class":662,"line":663},[660,1728,1729],{"class":670},"\u003C",[660,1731,1732],{"class":773},"script",[660,1734,1735],{"class":737}," setup",[660,1737,1738],{"class":737}," lang",[660,1740,1741],{"class":670},"=",[660,1743,1744],{"class":670},"\"",[660,1746,655],{"class":687},[660,1748,1744],{"class":670},[660,1750,1751],{"class":670},">\n",[660,1753,1754,1756,1758,1761,1763,1765,1767,1769],{"class":662,"line":694},[660,1755,667],{"class":666},[660,1757,671],{"class":670},[660,1759,1760],{"class":674}," useMultipartUpload",[660,1762,678],{"class":670},[660,1764,681],{"class":666},[660,1766,684],{"class":670},[660,1768,1715],{"class":687},[660,1770,691],{"class":670},[660,1772,1773],{"class":662,"line":715},[660,1774,719],{"emptyLinePlaceholder":718},[660,1776,1777,1780,1783,1785,1787,1789,1791,1794,1796,1798],{"class":662,"line":722},[660,1778,1779],{"class":737},"const",[660,1781,1782],{"class":674}," uploader ",[660,1784,1741],{"class":670},[660,1786,1760],{"class":731},[660,1788,734],{"class":674},[660,1790,797],{"class":670},[660,1792,1793],{"class":687},"\u002Fapi\u002Ffiles\u002Fmultipart",[660,1795,797],{"class":670},[660,1797,778],{"class":670},[660,1799,754],{"class":670},[660,1801,1802,1805,1807,1811,1814,1817,1819,1821],{"class":662,"line":757},[660,1803,1804],{"class":773},"  partSize",[660,1806,789],{"class":670},[660,1808,1810],{"class":1809},"sbssI"," 10",[660,1812,1813],{"class":670}," *",[660,1815,1816],{"class":1809}," 1024",[660,1818,1813],{"class":670},[660,1820,1816],{"class":1809},[660,1822,800],{"class":670},[660,1824,1825,1828,1830,1833],{"class":662,"line":783},[660,1826,1827],{"class":773},"  concurrent",[660,1829,789],{"class":670},[660,1831,1832],{"class":1809}," 3",[660,1834,800],{"class":670},[660,1836,1837,1839],{"class":662,"line":803},[660,1838,947],{"class":670},[660,1840,941],{"class":674},[660,1842,1843],{"class":662,"line":817},[660,1844,719],{"emptyLinePlaceholder":718},[660,1846,1847,1849,1852,1854,1857,1859,1863,1866,1869,1872,1874,1877],{"class":662,"line":827},[660,1848,1779],{"class":737},[660,1850,1851],{"class":674}," file ",[660,1853,1741],{"class":670},[660,1855,1856],{"class":731}," ref",[660,1858,1729],{"class":670},[660,1860,1862],{"class":1861},"sBMFI","File",[660,1864,1865],{"class":670}," |",[660,1867,1868],{"class":1861}," null",[660,1870,1871],{"class":670},">",[660,1873,734],{"class":674},[660,1875,1876],{"class":670},"null",[660,1878,941],{"class":674},[660,1880,1881,1883,1886,1888,1890,1892,1895],{"class":662,"line":844},[660,1882,1779],{"class":737},[660,1884,1885],{"class":674}," progress ",[660,1887,1741],{"class":670},[660,1889,1856],{"class":731},[660,1891,734],{"class":674},[660,1893,1894],{"class":1809},"0",[660,1896,941],{"class":674},[660,1898,1899,1901,1904,1906,1908,1910,1912],{"class":662,"line":885},[660,1900,1779],{"class":737},[660,1902,1903],{"class":674}," uploading ",[660,1905,1741],{"class":670},[660,1907,1856],{"class":731},[660,1909,734],{"class":674},[660,1911,1066],{"class":811},[660,1913,941],{"class":674},[660,1915,1916,1919,1922,1924,1926,1928,1930,1933,1935,1938,1940,1943,1945,1948,1950],{"class":662,"line":891},[660,1917,1918],{"class":737},"let",[660,1920,1921],{"class":674}," abortUpload",[660,1923,789],{"class":670},[660,1925,1868],{"class":1861},[660,1927,1865],{"class":670},[660,1929,741],{"class":674},[660,1931,1932],{"class":670},"()",[660,1934,751],{"class":737},[660,1936,1937],{"class":1861}," Promise",[660,1939,1729],{"class":670},[660,1941,1942],{"class":1861},"void",[660,1944,1871],{"class":670},[660,1946,1947],{"class":674},") ",[660,1949,1741],{"class":670},[660,1951,1952],{"class":670}," null\n",[660,1954,1955],{"class":662,"line":901},[660,1956,719],{"emptyLinePlaceholder":718},[660,1958,1959,1961,1964,1967,1969],{"class":662,"line":913},[660,1960,738],{"class":737},[660,1962,1963],{"class":737}," function",[660,1965,1966],{"class":731}," startUpload",[660,1968,1932],{"class":670},[660,1970,754],{"class":670},[660,1972,1973,1976,1978,1981,1984,1986,1989],{"class":662,"line":930},[660,1974,1975],{"class":666},"  if",[660,1977,741],{"class":773},[660,1979,1980],{"class":670},"!",[660,1982,1983],{"class":674},"file",[660,1985,644],{"class":670},[660,1987,1988],{"class":674},"value",[660,1990,941],{"class":773},[660,1992,1993],{"class":662,"line":935},[660,1994,1995],{"class":666},"    return\n",[660,1997,1998],{"class":662,"line":944},[660,1999,719],{"emptyLinePlaceholder":718},[660,2001,2003,2006,2008,2010,2013],{"class":662,"line":2002},18,[660,2004,2005],{"class":674},"  uploading",[660,2007,644],{"class":670},[660,2009,1988],{"class":674},[660,2011,2012],{"class":670}," =",[660,2014,2015],{"class":811}," true\n",[660,2017,2019,2022,2024,2027,2029,2032,2034,2037,2039,2042,2044,2046,2049,2051,2053,2055,2057],{"class":662,"line":2018},19,[660,2020,2021],{"class":737},"  const",[660,2023,671],{"class":670},[660,2025,2026],{"class":674}," completed",[660,2028,778],{"class":670},[660,2030,2031],{"class":773}," progress",[660,2033,789],{"class":670},[660,2035,2036],{"class":674}," uploadProgress",[660,2038,778],{"class":670},[660,2040,2041],{"class":674}," abort",[660,2043,678],{"class":670},[660,2045,2012],{"class":670},[660,2047,2048],{"class":731}," uploader",[660,2050,734],{"class":773},[660,2052,1983],{"class":674},[660,2054,644],{"class":670},[660,2056,1988],{"class":674},[660,2058,941],{"class":773},[660,2060,2062,2065,2067],{"class":662,"line":2061},20,[660,2063,2064],{"class":674},"  abortUpload",[660,2066,2012],{"class":670},[660,2068,2069],{"class":674}," abort\n",[660,2071,2073],{"class":662,"line":2072},21,[660,2074,719],{"emptyLinePlaceholder":718},[660,2076,2078,2081,2083,2086,2088,2090,2092,2094,2096],{"class":662,"line":2077},22,[660,2079,2080],{"class":731},"  watch",[660,2082,734],{"class":773},[660,2084,2085],{"class":674},"uploadProgress",[660,2087,778],{"class":670},[660,2089,741],{"class":670},[660,2091,1988],{"class":744},[660,2093,748],{"class":670},[660,2095,751],{"class":737},[660,2097,754],{"class":670},[660,2099,2101,2104,2106,2108,2110],{"class":662,"line":2100},23,[660,2102,2103],{"class":674},"    progress",[660,2105,644],{"class":670},[660,2107,1988],{"class":674},[660,2109,2012],{"class":670},[660,2111,2112],{"class":674}," value\n",[660,2114,2116,2119,2121,2124,2126,2128,2130],{"class":662,"line":2115},24,[660,2117,2118],{"class":670},"  },",[660,2120,671],{"class":670},[660,2122,2123],{"class":773}," immediate",[660,2125,789],{"class":670},[660,2127,812],{"class":811},[660,2129,678],{"class":670},[660,2131,941],{"class":773},[660,2133,2135],{"class":662,"line":2134},25,[660,2136,719],{"emptyLinePlaceholder":718},[660,2138,2140,2143],{"class":662,"line":2139},26,[660,2141,2142],{"class":666},"  try",[660,2144,754],{"class":670},[660,2146,2148,2151],{"class":662,"line":2147},27,[660,2149,2150],{"class":666},"    await",[660,2152,2153],{"class":674}," completed\n",[660,2155,2157],{"class":662,"line":2156},28,[660,2158,2159],{"class":670},"  }\n",[660,2161,2163,2166],{"class":662,"line":2162},29,[660,2164,2165],{"class":666},"  finally",[660,2167,754],{"class":670},[660,2169,2171,2174,2176,2178,2180],{"class":662,"line":2170},30,[660,2172,2173],{"class":674},"    uploading",[660,2175,644],{"class":670},[660,2177,1988],{"class":674},[660,2179,2012],{"class":670},[660,2181,2182],{"class":811}," false\n",[660,2184,2186,2189,2191],{"class":662,"line":2185},31,[660,2187,2188],{"class":674},"    abortUpload",[660,2190,2012],{"class":670},[660,2192,1952],{"class":670},[660,2194,2196],{"class":662,"line":2195},32,[660,2197,2159],{"class":670},[660,2199,2201],{"class":662,"line":2200},33,[660,2202,2203],{"class":670},"}\n",[660,2205,2207,2210,2212],{"class":662,"line":2206},34,[660,2208,2209],{"class":670},"\u003C\u002F",[660,2211,1732],{"class":773},[660,2213,1751],{"class":670},[688,2215,991],{"id":2216},"parameters-2",[993,2218,2219,2225],{},[996,2220,2222],{"name":2221,"type":1016,":required":999},"baseURL",[625,2223,2224],{},"The multipart route base URL.",[996,2226,2227],{"name":1005,"type":1006},[1011,2228,2229,2238,2247,2256,2261],{},[996,2230,2233],{"name":2231,"type":2232},"partSize","number",[625,2234,2235,2236,644],{},"Chunk size in bytes. Defaults to ",[637,2237,837],{},[996,2239,2241],{"name":2240,"type":2232},"concurrent",[625,2242,2243,2244,644],{},"Number of concurrent part uploads. Defaults to ",[637,2245,2246],{},"1",[996,2248,2250],{"name":2249,"type":2232},"maxRetry",[625,2251,2252,2253,644],{},"Maximum retry count before the upload aborts. Defaults to ",[637,2254,2255],{},"3",[996,2257,2258],{"name":1646,"type":1016},[625,2259,2260],{},"Prefix to apply when the server creates the multipart upload.",[996,2262,2264],{"name":2263,"type":1016},"provider",[625,2265,2266],{},"Override provider detection when you need to force the Vercel client path.",[688,2268,1053],{"id":2269},"return-value-2",[625,2271,2272,2273,2275],{},"Returns a function that accepts a ",[637,2274,1862],{}," and returns:",[650,2277,2279],{"className":652,"code":2278,"language":655,"meta":656,"style":656},"{\n  completed: Promise\u003CBlobObject | undefined>\n  progress: Readonly\u003CRef\u003Cnumber>>\n  abort: () => Promise\u003Cvoid>\n}\n",[637,2280,2281,2286,2304,2326,2343],{"__ignoreMap":656},[660,2282,2283],{"class":662,"line":663},[660,2284,2285],{"class":670},"{\n",[660,2287,2288,2291,2293,2295,2297,2299,2301],{"class":662,"line":694},[660,2289,2290],{"class":1861},"  completed",[660,2292,789],{"class":670},[660,2294,1937],{"class":1861},[660,2296,1729],{"class":670},[660,2298,1059],{"class":674},[660,2300,1865],{"class":670},[660,2302,2303],{"class":670}," undefined>\n",[660,2305,2306,2309,2311,2314,2316,2319,2321,2323],{"class":662,"line":715},[660,2307,2308],{"class":1861},"  progress",[660,2310,789],{"class":670},[660,2312,2313],{"class":674}," Readonly",[660,2315,1729],{"class":670},[660,2317,2318],{"class":674},"Ref",[660,2320,1729],{"class":670},[660,2322,2232],{"class":674},[660,2324,2325],{"class":670},">>\n",[660,2327,2328,2331,2333,2336,2338,2340],{"class":662,"line":722},[660,2329,2330],{"class":1861},"  abort",[660,2332,789],{"class":670},[660,2334,2335],{"class":670}," ()",[660,2337,751],{"class":737},[660,2339,1937],{"class":1861},[660,2341,2342],{"class":670},"\u003Cvoid>\n",[660,2344,2345],{"class":662,"line":757},[660,2346,2203],{"class":670},[2348,2349,2350],"note",{},[625,2351,2352,2353,2356,2357,2359],{},"When the public runtime config reports ",[637,2354,2355],{},"blobProvider: 'vercel-blob'",", ",[637,2358,1709],{}," switches to the Vercel Blob client upload flow automatically.",[629,2361,2363],{"id":2362},"manual-multipart-flow","Manual multipart flow",[625,2365,2366],{},"You can still use the lower-level blob SDK directly when you need custom upload behavior.",[650,2368,2370],{"className":652,"code":2369,"language":655,"meta":656,"style":656},"const multipart = await blob.createMultipartUpload('videos\u002Fdemo.mp4', {\n  contentType: 'video\u002Fmp4',\n  prefix: 'videos',\n})\n\nawait multipart.uploadPart(1, chunk1)\nawait multipart.uploadPart(2, chunk2)\n\nawait multipart.complete([\n  { partNumber: 1, etag: 'etag-1' },\n  { partNumber: 2, etag: 'etag-2' },\n])\n",[637,2371,2372,2403,2419,2435,2441,2445,2466,2486,2490,2503,2533,2559],{"__ignoreMap":656},[660,2373,2374,2376,2379,2381,2383,2385,2387,2390,2392,2394,2397,2399,2401],{"class":662,"line":663},[660,2375,1779],{"class":737},[660,2377,2378],{"class":674}," multipart ",[660,2380,1741],{"class":670},[660,2382,763],{"class":666},[660,2384,701],{"class":674},[660,2386,644],{"class":670},[660,2388,2389],{"class":731},"createMultipartUpload",[660,2391,734],{"class":674},[660,2393,797],{"class":670},[660,2395,2396],{"class":687},"videos\u002Fdemo.mp4",[660,2398,797],{"class":670},[660,2400,778],{"class":670},[660,2402,754],{"class":670},[660,2404,2405,2408,2410,2412,2415,2417],{"class":662,"line":694},[660,2406,2407],{"class":773},"  contentType",[660,2409,789],{"class":670},[660,2411,684],{"class":670},[660,2413,2414],{"class":687},"video\u002Fmp4",[660,2416,797],{"class":670},[660,2418,800],{"class":670},[660,2420,2421,2424,2426,2428,2431,2433],{"class":662,"line":715},[660,2422,2423],{"class":773},"  prefix",[660,2425,789],{"class":670},[660,2427,684],{"class":670},[660,2429,2430],{"class":687},"videos",[660,2432,797],{"class":670},[660,2434,800],{"class":670},[660,2436,2437,2439],{"class":662,"line":722},[660,2438,947],{"class":670},[660,2440,941],{"class":674},[660,2442,2443],{"class":662,"line":757},[660,2444,719],{"emptyLinePlaceholder":718},[660,2446,2447,2449,2452,2454,2457,2459,2461,2463],{"class":662,"line":783},[660,2448,973],{"class":666},[660,2450,2451],{"class":674}," multipart",[660,2453,644],{"class":670},[660,2455,2456],{"class":731},"uploadPart",[660,2458,734],{"class":674},[660,2460,2246],{"class":1809},[660,2462,778],{"class":670},[660,2464,2465],{"class":674}," chunk1)\n",[660,2467,2468,2470,2472,2474,2476,2478,2481,2483],{"class":662,"line":803},[660,2469,973],{"class":666},[660,2471,2451],{"class":674},[660,2473,644],{"class":670},[660,2475,2456],{"class":731},[660,2477,734],{"class":674},[660,2479,2480],{"class":1809},"2",[660,2482,778],{"class":670},[660,2484,2485],{"class":674}," chunk2)\n",[660,2487,2488],{"class":662,"line":817},[660,2489,719],{"emptyLinePlaceholder":718},[660,2491,2492,2494,2496,2498,2500],{"class":662,"line":827},[660,2493,973],{"class":666},[660,2495,2451],{"class":674},[660,2497,644],{"class":670},[660,2499,1583],{"class":731},[660,2501,2502],{"class":674},"([\n",[660,2504,2505,2508,2511,2513,2516,2518,2521,2523,2525,2528,2530],{"class":662,"line":844},[660,2506,2507],{"class":670},"  {",[660,2509,2510],{"class":773}," partNumber",[660,2512,789],{"class":670},[660,2514,2515],{"class":1809}," 1",[660,2517,778],{"class":670},[660,2519,2520],{"class":773}," etag",[660,2522,789],{"class":670},[660,2524,684],{"class":670},[660,2526,2527],{"class":687},"etag-1",[660,2529,797],{"class":670},[660,2531,2532],{"class":670}," },\n",[660,2534,2535,2537,2539,2541,2544,2546,2548,2550,2552,2555,2557],{"class":662,"line":885},[660,2536,2507],{"class":670},[660,2538,2510],{"class":773},[660,2540,789],{"class":670},[660,2542,2543],{"class":1809}," 2",[660,2545,778],{"class":670},[660,2547,2520],{"class":773},[660,2549,789],{"class":670},[660,2551,684],{"class":670},[660,2553,2554],{"class":687},"etag-2",[660,2556,797],{"class":670},[660,2558,2532],{"class":670},[660,2560,2561],{"class":662,"line":891},[660,2562,2563],{"class":674},"])\n",[2565,2566,2567],"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 .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 .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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":656,"searchDepth":694,"depth":694,"links":2569},[2570,2571,2575,2576,2577,2581,2585],{"id":631,"depth":694,"text":632},{"id":952,"depth":694,"text":955,"children":2572},[2573,2574],{"id":990,"depth":715,"text":991},{"id":1052,"depth":715,"text":1053},{"id":1070,"depth":694,"text":1071},{"id":1281,"depth":694,"text":1282},{"id":1556,"depth":694,"text":1559,"children":2578},[2579,2580],{"id":1612,"depth":715,"text":991},{"id":1672,"depth":715,"text":1053},{"id":1706,"depth":694,"text":1709,"children":2582},[2583,2584],{"id":2216,"depth":715,"text":991},{"id":2269,"depth":715,"text":1053},{"id":2362,"depth":694,"text":2363},"md",{"icon":73},{"title":70},{"title":620,"description":72},"docs\u002Fnuxt\u002Fblob\u002Fupload","1Vb0cogRjay8TroMFP7_BtFev-9qkaW8SzdMHxlC5Co",[2593,2595],{"title":2594,"path":497,"description":66},"Overview",{"title":75,"path":502,"description":77},1775568178527]