[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f30r277ag21rfj":3,"module-api-shield":2411,"versions":10127},[4,1159,1643,2205],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":106},"Docs","i-lucide-book-marked","\u002Fdocs\u002F5.x","1.getting-started\u002F01.introduction",[10,107,258,493,1017,1054,1105],{"title":11,"titleTemplate":12,"icon":13,"path":14,"stem":8,"children":15,"page":106},"Get Started","%s · Get Started with Nuxt","i-lucide-rocket","\u002Fdocs\u002F5.x\u002Fgetting-started",[16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101],{"title":17,"description":18,"path":19,"stem":8,"icon":20},"Introduction","Nuxt's goal is to make web development intuitive and performant with a great Developer Experience in mind.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fintroduction","i-lucide-info",{"title":22,"description":23,"path":24,"stem":25},"Installation","Get started with Nuxt quickly with our online starters or start locally with your terminal.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Finstallation","1.getting-started\u002F02.installation",{"title":27,"description":28,"path":29,"stem":30},"Configuration","Nuxt is configured with sensible defaults to make you productive.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F03.configuration",{"title":32,"description":33,"path":34,"stem":35},"Views","Nuxt provides several component layers to implement the user interface of your application.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fviews","1.getting-started\u002F04.views",{"title":37,"description":38,"path":39,"stem":40},"Assets","Nuxt offers two options for your assets.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fassets","1.getting-started\u002F05.assets",{"title":42,"description":43,"path":44,"stem":45},"Styling","Learn how to style your Nuxt application.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fstyling","1.getting-started\u002F06.styling",{"title":47,"description":48,"path":49,"stem":50},"Routing","Nuxt file-system routing creates a route for every file in the pages\u002F directory.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Frouting","1.getting-started\u002F07.routing",{"title":52,"description":53,"path":54,"stem":55},"SEO and Meta","Improve your Nuxt app's SEO with powerful head config, composables and components.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fseo-meta","1.getting-started\u002F08.seo-meta",{"title":57,"description":58,"path":59,"stem":60},"Transitions","Apply transitions between pages and layouts with Vue or native browser View Transitions.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Ftransitions","1.getting-started\u002F09.transitions",{"title":62,"description":63,"path":64,"stem":65},"Data Fetching","Nuxt provides composables to handle data fetching within your application.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fdata-fetching","1.getting-started\u002F10.data-fetching",{"title":67,"description":68,"path":69,"stem":70},"State Management","Nuxt provides powerful state management libraries and the useState composable to create a reactive and SSR-friendly shared state.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fstate-management","1.getting-started\u002F11.state-management",{"title":72,"description":73,"path":74,"stem":75},"Error Handling","Learn how to catch and handle errors in Nuxt.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Ferror-handling","1.getting-started\u002F12.error-handling",{"title":77,"description":78,"path":79,"stem":80},"Server","Build full-stack applications with Nuxt's server framework. You can fetch data from your database or another server, create APIs, or even generate static server-side content like a sitemap or a RSS feed - all from a single codebase.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fserver","1.getting-started\u002F13.server",{"title":82,"description":83,"path":84,"stem":85},"Layers","Nuxt provides a powerful system that allows you to extend the default files, configs, and much more.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Flayers","1.getting-started\u002F14.layers",{"title":87,"description":88,"path":89,"stem":90},"Prerendering","Nuxt allows pages to be statically rendered at build time to improve certain performance or SEO metrics","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fprerendering","1.getting-started\u002F15.prerendering",{"title":92,"description":93,"path":94,"stem":95},"Deployment","Learn how to deploy your Nuxt application to any hosting provider.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fdeployment","1.getting-started\u002F16.deployment",{"title":97,"description":98,"path":99,"stem":100},"Testing","How to test your Nuxt application.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Ftesting","1.getting-started\u002F17.testing",{"title":102,"description":103,"path":104,"stem":105},"Upgrade Guide","Learn how to upgrade to the latest Nuxt version.","\u002Fdocs\u002F5.x\u002Fgetting-started\u002Fupgrade","1.getting-started\u002F18.upgrade",false,{"title":108,"titleTemplate":109,"icon":110,"path":111,"stem":112,"children":113,"page":106},"Directory Structure","%s · Nuxt Directory Structure","i-vscode-icons-default-folder","\u002Fdocs\u002F5.x\u002Fdirectory-structure","2.directory-structure\u002F0.nuxt",[114,118,123,183,188,193,198,203,208,213,218,223,228,233,238,243,248,253],{"title":115,"description":116,"path":117,"stem":112},".nuxt","Nuxt uses the .nuxt\u002F directory in development to generate your Vue application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fnuxt",{"title":119,"description":120,"path":121,"stem":122},".output","Nuxt creates the .output\u002F directory when building your application for production.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Foutput","2.directory-structure\u002F0.output",{"title":124,"titleTemplate":109,"icon":125,"path":126,"stem":127,"children":128,"page":106},"app","i-vscode-icons-folder-type-app","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp","2.directory-structure\u002F1.app\u002F1.assets",[129,133,138,143,148,153,158,163,168,173,178],{"title":130,"description":131,"path":132,"stem":127},"assets","The assets\u002F directory is used to add all the website's assets that the build tool will process.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Fassets",{"title":134,"description":135,"path":136,"stem":137},"components","The components\u002F directory is where you put all your Vue components.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Fcomponents","2.directory-structure\u002F1.app\u002F1.components",{"title":139,"description":140,"path":141,"stem":142},"composables","Use the composables\u002F directory to auto-import your Vue composables into your application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Fcomposables","2.directory-structure\u002F1.app\u002F1.composables",{"title":144,"description":145,"path":146,"stem":147},"layouts","Nuxt provides a layouts framework to extract common UI patterns into reusable layouts.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Flayouts","2.directory-structure\u002F1.app\u002F1.layouts",{"title":149,"description":150,"path":151,"stem":152},"middleware","Nuxt provides middleware to run code before navigating to a particular route.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Fmiddleware","2.directory-structure\u002F1.app\u002F1.middleware",{"title":154,"description":155,"path":156,"stem":157},"pages","Nuxt provides file-based routing to create routes within your web application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Fpages","2.directory-structure\u002F1.app\u002F1.pages",{"title":159,"description":160,"path":161,"stem":162},"plugins","Nuxt has a plugins system to use Vue plugins and more at the creation of your Vue application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Fplugins","2.directory-structure\u002F1.app\u002F1.plugins",{"title":164,"description":165,"path":166,"stem":167},"utils","Use the utils\u002F directory to auto-import your utility functions throughout your application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Futils","2.directory-structure\u002F1.app\u002F1.utils",{"title":169,"description":170,"path":171,"stem":172},"app.vue","The app.vue file is the main component of your Nuxt application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Fapp","2.directory-structure\u002F1.app\u002F3.app",{"title":174,"description":175,"path":176,"stem":177},"app.config.ts","Expose reactive configuration within your application with the App Config file.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Fapp-config","2.directory-structure\u002F1.app\u002F3.app-config",{"title":179,"description":180,"path":181,"stem":182},"error.vue","The error.vue file is the error page in your Nuxt application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fapp\u002Ferror","2.directory-structure\u002F1.app\u002F3.error",{"title":184,"description":185,"path":186,"stem":187},"content","Use the content\u002F directory to create a file-based CMS for your application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fcontent","2.directory-structure\u002F1.content",{"title":189,"description":190,"path":191,"stem":192},"layers","Use the layers\u002F directory to organize and auto-register local layers within your application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Flayers","2.directory-structure\u002F1.layers",{"title":194,"description":195,"path":196,"stem":197},"modules","Use the modules\u002F directory to automatically register local modules within your application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fmodules","2.directory-structure\u002F1.modules",{"title":199,"description":200,"path":201,"stem":202},"node_modules","The package manager stores the dependencies of your project in the node_modules\u002F directory.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fnode_modules","2.directory-structure\u002F1.node_modules",{"title":204,"description":205,"path":206,"stem":207},"public","The public\u002F directory is used to serve your website's static assets.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fpublic","2.directory-structure\u002F1.public",{"title":209,"description":210,"path":211,"stem":212},"server","The server\u002F directory is used to register API and server handlers to your application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fserver","2.directory-structure\u002F1.server",{"title":214,"description":215,"path":216,"stem":217},"shared","Use the shared\u002F directory to share functionality between the Vue app and the Nitro server.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fshared","2.directory-structure\u002F1.shared",{"title":219,"description":220,"path":221,"stem":222},"test","Use the test\u002F directory to organize unit, Nuxt, and end-to-end tests for your application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Ftest","2.directory-structure\u002F1.test",{"title":224,"description":225,"path":226,"stem":227},".env","A .env file specifies your build\u002Fdev-time environment variables.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fenv","2.directory-structure\u002F2.env",{"title":229,"description":230,"path":231,"stem":232},".gitignore","A .gitignore file specifies intentionally untracked files that git should ignore.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fgitignore","2.directory-structure\u002F2.gitignore",{"title":234,"description":235,"path":236,"stem":237},".nuxtignore","The .nuxtignore file lets Nuxt ignore files in your project’s root directory during the build phase.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fnuxtignore","2.directory-structure\u002F2.nuxtignore",{"title":239,"description":240,"path":241,"stem":242},".nuxtrc","The .nuxtrc file allows you to define nuxt configurations in a flat syntax.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fnuxtrc","2.directory-structure\u002F2.nuxtrc",{"title":244,"description":245,"path":246,"stem":247},"nuxt.config.ts","Nuxt can be easily configured with a single nuxt.config file.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fnuxt-config","2.directory-structure\u002F3.nuxt-config",{"title":249,"description":250,"path":251,"stem":252},"package.json","The package.json file contains all the dependencies and scripts for your application.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Fpackage","2.directory-structure\u002F3.package",{"title":254,"description":255,"path":256,"stem":257},"tsconfig.json","Learn how Nuxt manages TypeScript configuration across different parts of your project.","\u002Fdocs\u002F5.x\u002Fdirectory-structure\u002Ftsconfig","2.directory-structure\u002F3.tsconfig",{"title":259,"icon":260,"path":261,"stem":262,"children":263,"page":106},"Guide","i-lucide-book-open","\u002Fdocs\u002F5.x\u002Fguide","3.guide\u002F1.concepts\u002F1.rendering",[264,309,340,356,402,433],{"title":265,"titleTemplate":266,"icon":267,"path":268,"stem":262,"children":269,"page":106},"Key Concepts","%s · Nuxt Concepts","i-lucide-medal","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts",[270,274,279,284,289,294,299,304],{"title":271,"description":272,"path":273,"stem":262},"Rendering Modes","Learn about the different rendering modes available in Nuxt.","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts\u002Frendering",{"title":275,"description":276,"path":277,"stem":278},"Nuxt Lifecycle","Understanding the lifecycle of Nuxt applications can help you gain deeper insights into how the framework operates, especially for both server-side and client-side rendering.","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts\u002Fnuxt-lifecycle","3.guide\u002F1.concepts\u002F2.nuxt-lifecycle",{"title":280,"description":281,"path":282,"stem":283},"Auto-imports","Nuxt auto-imports components, composables, helper functions and Vue APIs.","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts\u002Fauto-imports","3.guide\u002F1.concepts\u002F3.auto-imports",{"title":285,"description":286,"path":287,"stem":288},"Server Engine","Nuxt is powered by a new server engine: Nitro.","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts\u002Fserver-engine","3.guide\u002F1.concepts\u002F4.server-engine",{"title":290,"description":291,"path":292,"stem":293},"Modules","Nuxt provides a module system to extend the framework core and simplify integrations.","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts\u002Fmodules","3.guide\u002F1.concepts\u002F5.modules",{"title":295,"description":296,"path":297,"stem":298},"Server Components","Render individual components on the server only, keeping their JavaScript out of your client bundle.","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts\u002Fserver-components","3.guide\u002F1.concepts\u002F6.server-components",{"title":300,"description":301,"path":302,"stem":303},"TypeScript","Nuxt is fully typed and provides helpful shortcuts to ensure you have access to accurate type information when you are coding.","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts\u002Ftypescript","3.guide\u002F1.concepts\u002F8.typescript",{"title":305,"description":306,"path":307,"stem":308},"Code Style","Nuxt supports ESLint out of the box","\u002Fdocs\u002F5.x\u002Fguide\u002Fconcepts\u002Fcode-style","3.guide\u002F1.concepts\u002F9.code-style",{"title":310,"titleTemplate":311,"icon":312,"path":313,"stem":314,"children":315,"page":106},"Best Practices","%s · Best Practices","i-lucide-square-check","\u002Fdocs\u002F5.x\u002Fguide\u002Fbest-practices","3.guide\u002F2.best-practices\u002Faccessibility",[316,320,325,330,335],{"title":317,"description":318,"path":319,"stem":314},"Nuxt accessibility","Best practices for accessibility in Nuxt apps.","\u002Fdocs\u002F5.x\u002Fguide\u002Fbest-practices\u002Faccessibility",{"title":321,"description":322,"path":323,"stem":324},"Dev Containers","Set up or open a Nuxt project in a dev container for a consistent development environment.","\u002Fdocs\u002F5.x\u002Fguide\u002Fbest-practices\u002Fdevcontainers","3.guide\u002F2.best-practices\u002Fdevcontainers",{"title":326,"description":327,"path":328,"stem":329},"Nuxt and Hydration","Why fixing hydration issues is important","\u002Fdocs\u002F5.x\u002Fguide\u002Fbest-practices\u002Fhydration","3.guide\u002F2.best-practices\u002Fhydration",{"title":331,"description":332,"path":333,"stem":334},"Nuxt performance","Best practices for improving performance of Nuxt apps.","\u002Fdocs\u002F5.x\u002Fguide\u002Fbest-practices\u002Fperformance","3.guide\u002F2.best-practices\u002Fperformance",{"title":336,"description":337,"path":338,"stem":339},"Nuxt Plugins","Best practices when using Nuxt plugins.","\u002Fdocs\u002F5.x\u002Fguide\u002Fbest-practices\u002Fplugins","3.guide\u002F2.best-practices\u002Fplugins",{"title":341,"titleTemplate":342,"icon":343,"path":344,"stem":345,"children":346,"page":106},"Working with AI","Working with AI: %s","i-lucide-bot","\u002Fdocs\u002F5.x\u002Fguide\u002Fai","3.guide\u002F3.ai\u002F1.mcp",[347,351],{"title":348,"description":349,"path":350,"stem":345},"Nuxt MCP Server","Use Nuxt documentation in your AI assistants with Model Context Protocol support.","\u002Fdocs\u002F5.x\u002Fguide\u002Fai\u002Fmcp",{"title":352,"description":353,"path":354,"stem":355},"Nuxt LLMs.txt","How to get AI tools like Cursor, Windsurf, GitHub Copilot, ChatGPT, and Claude to understand Nuxt concepts, APIs, and best practices.","\u002Fdocs\u002F5.x\u002Fguide\u002Fai\u002Fllms-txt","3.guide\u002F3.ai\u002F2.llms-txt",{"title":357,"titleTemplate":358,"icon":359,"path":360,"stem":361,"children":362,"page":106},"Module Author Guide","%s · Nuxt Modules Author Guide","i-lucide-box","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules","3.guide\u002F4.modules\u002F1.getting-started",[363,367,372,377,382,387,392,397],{"title":364,"description":365,"path":366,"stem":361},"Create Your First Module","Learn how to create your first Nuxt module using the official starter template.","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules\u002Fgetting-started",{"title":368,"description":369,"path":370,"stem":371},"Understand Module Structure","Learn how Nuxt modules are structured and how to define them.","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules\u002Fmodule-anatomy","3.guide\u002F4.modules\u002F2.module-anatomy",{"title":373,"description":374,"path":375,"stem":376},"Add Plugins, Components & More","Learn how to inject plugins, components, composables and server routes from your module.","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules\u002Frecipes-basics","3.guide\u002F4.modules\u002F3.recipes-basics",{"title":378,"description":379,"path":380,"stem":381},"Module Dependencies","Declare dependencies on other modules with version constraints and configuration merging.","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules\u002Fmodule-dependencies","3.guide\u002F4.modules\u002F4.module-dependencies",{"title":383,"description":384,"path":385,"stem":386},"Use Hooks & Extend Types","Master lifecycle hooks, virtual files and TypeScript declarations in your modules.","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules\u002Frecipes-advanced","3.guide\u002F4.modules\u002F5.recipes-advanced",{"title":388,"description":389,"path":390,"stem":391},"Test Your Module","Learn how to test your Nuxt module with unit, integration and E2E tests.","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules\u002Ftesting","3.guide\u002F4.modules\u002F6.testing",{"title":393,"description":394,"path":395,"stem":396},"Follow Best Practices","Build performant and maintainable Nuxt modules with these guidelines.","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules\u002Fbest-practices","3.guide\u002F4.modules\u002F7.best-practices",{"title":398,"description":399,"path":400,"stem":401},"Publish & Share Your Module","Join the Nuxt module ecosystem and publish your module to npm.","\u002Fdocs\u002F5.x\u002Fguide\u002Fmodules\u002Fecosystem","3.guide\u002F4.modules\u002F8.ecosystem",{"title":403,"titleTemplate":404,"icon":405,"path":406,"stem":407,"children":408,"page":106},"Recipes","%s · Recipes","i-lucide-cooking-pot","\u002Fdocs\u002F5.x\u002Fguide\u002Frecipes","3.guide\u002F5.recipes\u002F1.custom-routing",[409,413,418,423,428],{"title":410,"description":411,"path":412,"stem":407},"Custom Routing","In Nuxt, your routing is defined by the structure of your files inside the pages directory. However, since it uses vue-router under the hood, Nuxt offers you several ways to add custom routes in your project.","\u002Fdocs\u002F5.x\u002Fguide\u002Frecipes\u002Fcustom-routing",{"title":414,"description":415,"path":416,"stem":417},"Using Vite Plugins in Nuxt","Learn how to integrate Vite plugins into your Nuxt project.","\u002Fdocs\u002F5.x\u002Fguide\u002Frecipes\u002Fvite-plugin","3.guide\u002F5.recipes\u002F2.vite-plugin",{"title":419,"description":420,"path":421,"stem":422},"Custom useFetch in Nuxt","How to create a custom fetcher for calling your external API in Nuxt.","\u002Fdocs\u002F5.x\u002Fguide\u002Frecipes\u002Fcustom-usefetch","3.guide\u002F5.recipes\u002F3.custom-usefetch",{"title":424,"description":425,"path":426,"stem":427},"Sessions and Authentication","Authentication is an extremely common requirement in web apps. This recipe will show you how to implement basic user registration and authentication in your Nuxt app.","\u002Fdocs\u002F5.x\u002Fguide\u002Frecipes\u002Fsessions-and-authentication","3.guide\u002F5.recipes\u002F4.sessions-and-authentication",{"title":429,"description":430,"path":431,"stem":432},"Mostly-Static Sites","Ship near-zero JavaScript for content and marketing sites while keeping islands of interactivity.","\u002Fdocs\u002F5.x\u002Fguide\u002Frecipes\u002Fmostly-static-sites","3.guide\u002F5.recipes\u002F5.mostly-static-sites",{"title":434,"titleTemplate":435,"icon":436,"path":437,"stem":438,"children":439,"page":106},"Going Further","%s · Nuxt Advanced","i-lucide-star","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further","3.guide\u002F6.going-further\u002F1.events",[440,444,449,454,459,464,469,473,478,483,488],{"title":441,"description":442,"path":443,"stem":438},"Creating Custom Events","Nuxt provides a powerful event system powered by hookable.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fevents",{"title":445,"description":446,"path":447,"stem":448},"Experimental Features","Enable Nuxt experimental features to unlock new possibilities.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fexperimental-features","3.guide\u002F6.going-further\u002F1.experimental-features",{"title":450,"description":451,"path":452,"stem":453},"Features","Enable or disable optional Nuxt features to unlock new possibilities.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Ffeatures","3.guide\u002F6.going-further\u002F1.features",{"title":455,"description":456,"path":457,"stem":458},"Lifecycle Hooks","Nuxt provides a powerful hooking system to expand almost every aspect using hooks.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fhooks","3.guide\u002F6.going-further\u002F2.hooks",{"title":460,"description":461,"path":462,"stem":463},"Nuxt Kit","@nuxt\u002Fkit provides features for module authors.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fkit","3.guide\u002F6.going-further\u002F4.kit",{"title":465,"description":466,"path":467,"stem":468},"NuxtApp","In Nuxt, you can access runtime app context within composables, components and plugins.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fnuxt-app","3.guide\u002F6.going-further\u002F6.nuxt-app",{"title":470,"description":83,"path":471,"stem":472},"Authoring Nuxt Layers","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Flayers","3.guide\u002F6.going-further\u002F7.layers",{"title":474,"description":475,"path":476,"stem":477},"Creating a Builder","Learn how Nuxt builders work and how to author your own.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fbuilders","3.guide\u002F6.going-further\u002F8.builders",{"title":479,"description":480,"path":481,"stem":482},"Debugging","In Nuxt, you can get started with debugging your application directly in the browser as well as in your IDE.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fdebugging","3.guide\u002F6.going-further\u002F9.debugging",{"title":484,"description":485,"path":486,"stem":487},"Runtime Config","Nuxt provides a runtime config API to expose configuration and secrets within your application.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fruntime-config","3.guide\u002F6.going-further\u002F10.runtime-config",{"title":489,"description":490,"path":491,"stem":492},"Nightly Release Channel","The nightly release channel allows using Nuxt built directly from the latest commits to the repository.","\u002Fdocs\u002F5.x\u002Fguide\u002Fgoing-further\u002Fnightly-release-channel","3.guide\u002F6.going-further\u002F11.nightly-release-channel",{"title":494,"titleTemplate":495,"icon":496,"path":497,"stem":498,"children":499,"page":106},"API","%s · Nuxt API","i-lucide-code-xml","\u002Fdocs\u002F5.x\u002Fapi","4.api\u002F1.components\u002F1.client-only",[500,584,755,905,999,1012],{"title":501,"titleTemplate":502,"icon":359,"path":503,"stem":498,"children":504,"page":106},"Components","%s · Nuxt Components","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents",[505,509,514,519,524,529,534,539,544,549,554,559,564,569,574,579],{"title":506,"description":507,"path":508,"stem":498},"\u003CClientOnly>","Render components only in client-side with the \u003CClientOnly> component.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fclient-only",{"title":510,"description":511,"path":512,"stem":513},"\u003CDevOnly>","Render components only during development with the \u003CDevOnly> component.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fdev-only","4.api\u002F1.components\u002F1.dev-only",{"title":515,"description":516,"path":517,"stem":518},"\u003CNuxtClientFallback>","Nuxt provides the \u003CNuxtClientFallback> component to render its content on the client if any of its children trigger an error in SSR","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-client-fallback","4.api\u002F1.components\u002F1.nuxt-client-fallback",{"title":520,"description":521,"path":522,"stem":523},"\u003CNuxtPage>","The \u003CNuxtPage> component is required to display pages located in the pages\u002F directory.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-page","4.api\u002F1.components\u002F2.nuxt-page",{"title":525,"description":526,"path":527,"stem":528},"\u003CNuxtLayout>","Nuxt provides the \u003CNuxtLayout> component to show layouts on pages and error pages.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-layout","4.api\u002F1.components\u002F3.nuxt-layout",{"title":530,"description":531,"path":532,"stem":533},"\u003CNuxtLink>","Nuxt provides \u003CNuxtLink> component to handle any kind of links within your application.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-link","4.api\u002F1.components\u002F4.nuxt-link",{"title":535,"description":536,"path":537,"stem":538},"\u003CNuxtLoadingIndicator>","Display a progress bar between page navigations.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-loading-indicator","4.api\u002F1.components\u002F5.nuxt-loading-indicator",{"title":540,"description":541,"path":542,"stem":543},"\u003CNuxtErrorBoundary>","The \u003CNuxtErrorBoundary> component handles client-side errors happening in its default slot.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-error-boundary","4.api\u002F1.components\u002F6.nuxt-error-boundary",{"title":545,"description":546,"path":547,"stem":548},"\u003CNuxtWelcome>","The \u003CNuxtWelcome> component greets users in new projects made from the starter template.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-welcome","4.api\u002F1.components\u002F7.nuxt-welcome",{"title":550,"description":551,"path":552,"stem":553},"\u003CNuxtIsland>","Nuxt provides the \u003CNuxtIsland> component to render a non-interactive component without any client JS.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-island","4.api\u002F1.components\u002F8.nuxt-island",{"title":555,"description":556,"path":557,"stem":558},"\u003CNuxtImg>","Nuxt provides a \u003CNuxtImg> component to handle automatic image optimization.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-img","4.api\u002F1.components\u002F9.nuxt-img",{"title":560,"description":561,"path":562,"stem":563},"\u003CNuxtPicture>","Nuxt provides a \u003CNuxtPicture> component to handle automatic image optimization.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-picture","4.api\u002F1.components\u002F10.nuxt-picture",{"title":565,"description":566,"path":567,"stem":568},"\u003CTeleport>","The \u003CTeleport> component teleports a component to a different location in the DOM.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fteleports","4.api\u002F1.components\u002F11.teleports",{"title":570,"description":571,"path":572,"stem":573},"\u003CNuxtRouteAnnouncer>","The \u003CNuxtRouteAnnouncer> component adds a hidden element with the page title to announce route changes to assistive technologies.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-route-announcer","4.api\u002F1.components\u002F12.nuxt-route-announcer",{"title":575,"description":576,"path":577,"stem":578},"\u003CNuxtTime>","The \u003CNuxtTime> component displays time in a locale-friendly format with server-client consistency.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-time","4.api\u002F1.components\u002F13.nuxt-time",{"title":580,"description":581,"path":582,"stem":583},"\u003CNuxtAnnouncer>","The \u003CNuxtAnnouncer> component adds a hidden element to announce dynamic content changes to assistive technologies.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomponents\u002Fnuxt-announcer","4.api\u002F1.components\u002F14.nuxt-announcer",{"title":585,"titleTemplate":586,"icon":587,"path":588,"stem":589,"children":590,"page":106},"Composables","%s · Nuxt Composables","i-lucide-arrow-left-right","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables","4.api\u002F2.composables\u002Fcreate-use-async-data",[591,595,600,605,610,615,620,625,630,635,640,645,650,655,660,665,670,675,680,685,690,695,700,705,710,715,720,725,730,735,740,745,750],{"title":592,"description":593,"path":594,"stem":589},"createUseAsyncData","A factory function to create a custom useAsyncData composable with pre-defined default options.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fcreate-use-async-data",{"title":596,"description":597,"path":598,"stem":599},"createUseFetch","A factory function to create a custom useFetch composable with pre-defined default options.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fcreate-use-fetch","4.api\u002F2.composables\u002Fcreate-use-fetch",{"title":601,"description":602,"path":603,"stem":604},"onPrehydrate","Use onPrehydrate to run a callback on the client immediately before Nuxt hydrates the page.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fon-prehydrate","4.api\u002F2.composables\u002Fon-prehydrate",{"title":606,"description":607,"path":608,"stem":609},"useAnnouncer","A composable for announcing messages to screen readers.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-announcer","4.api\u002F2.composables\u002Fuse-announcer",{"title":611,"description":612,"path":613,"stem":614},"useAppConfig","Access the reactive app config defined in the project.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-app-config","4.api\u002F2.composables\u002Fuse-app-config",{"title":616,"description":617,"path":618,"stem":619},"useAsyncData","useAsyncData provides access to data that resolves asynchronously in an SSR-friendly composable.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-async-data","4.api\u002F2.composables\u002Fuse-async-data",{"title":621,"description":622,"path":623,"stem":624},"useCookie","useCookie is an SSR-friendly composable to read and write cookies.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-cookie","4.api\u002F2.composables\u002Fuse-cookie",{"title":626,"description":627,"path":628,"stem":629},"useError","useError composable returns the global Nuxt error that is being handled.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-error","4.api\u002F2.composables\u002Fuse-error",{"title":631,"description":632,"path":633,"stem":634},"useFetch","Fetch data from an API endpoint with an SSR-friendly composable.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-fetch","4.api\u002F2.composables\u002Fuse-fetch",{"title":636,"description":637,"path":638,"stem":639},"useHead","useHead customizes the head properties of individual pages of your Nuxt app.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-head","4.api\u002F2.composables\u002Fuse-head",{"title":641,"description":642,"path":643,"stem":644},"useHeadSafe","The recommended way to provide head data with user input.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-head-safe","4.api\u002F2.composables\u002Fuse-head-safe",{"title":646,"description":647,"path":648,"stem":649},"useHydration","Allows full control of the hydration cycle to set and receive data from the server.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-hydration","4.api\u002F2.composables\u002Fuse-hydration",{"title":651,"description":652,"path":653,"stem":654},"useLayout","useLayout returns the layout resolved for the current route.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-layout","4.api\u002F2.composables\u002Fuse-layout",{"title":656,"description":657,"path":658,"stem":659},"useLazyAsyncData","This wrapper around useAsyncData triggers navigation immediately.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-lazy-async-data","4.api\u002F2.composables\u002Fuse-lazy-async-data",{"title":661,"description":662,"path":663,"stem":664},"useLazyFetch","This wrapper around useFetch triggers navigation immediately.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-lazy-fetch","4.api\u002F2.composables\u002Fuse-lazy-fetch",{"title":666,"description":667,"path":668,"stem":669},"useLoadingIndicator","This composable gives you access to the loading state of the app page.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-loading-indicator","4.api\u002F2.composables\u002Fuse-loading-indicator",{"title":671,"description":672,"path":673,"stem":674},"useNuxtApp","Access the shared runtime context of the Nuxt Application.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-nuxt-app","4.api\u002F2.composables\u002Fuse-nuxt-app",{"title":676,"description":677,"path":678,"stem":679},"useNuxtData","Access the current cached value of data fetching composables.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-nuxt-data","4.api\u002F2.composables\u002Fuse-nuxt-data",{"title":681,"description":682,"path":683,"stem":684},"usePreviewMode","Use usePreviewMode to check and control preview mode in Nuxt","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-preview-mode","4.api\u002F2.composables\u002Fuse-preview-mode",{"title":686,"description":687,"path":688,"stem":689},"useRequestEvent","Access the incoming request event with the useRequestEvent composable.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-request-event","4.api\u002F2.composables\u002Fuse-request-event",{"title":691,"description":692,"path":693,"stem":694},"useRequestFetch","Forward the request context and headers for server-side fetch requests with the useRequestFetch composable.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-request-fetch","4.api\u002F2.composables\u002Fuse-request-fetch",{"title":696,"description":697,"path":698,"stem":699},"useRequestHeader","Use useRequestHeader to access a certain incoming request header.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-request-header","4.api\u002F2.composables\u002Fuse-request-header",{"title":701,"description":702,"path":703,"stem":704},"useRequestHeaders","Use useRequestHeaders to access the incoming request headers.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-request-headers","4.api\u002F2.composables\u002Fuse-request-headers",{"title":706,"description":707,"path":708,"stem":709},"useRequestURL","Access the incoming request URL with the useRequestURL composable.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-request-url","4.api\u002F2.composables\u002Fuse-request-url",{"title":711,"description":712,"path":713,"stem":714},"useResponseHeader","Use useResponseHeader to set a server response header.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-response-header","4.api\u002F2.composables\u002Fuse-response-header",{"title":716,"description":717,"path":718,"stem":719},"useRoute","The useRoute composable returns the current route.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-route","4.api\u002F2.composables\u002Fuse-route",{"title":721,"description":722,"path":723,"stem":724},"useRouteAnnouncer","This composable observes the page title changes and updates the announcer message accordingly.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-route-announcer","4.api\u002F2.composables\u002Fuse-route-announcer",{"title":726,"description":727,"path":728,"stem":729},"useRouter","The useRouter composable returns the router instance.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-router","4.api\u002F2.composables\u002Fuse-router",{"title":731,"description":732,"path":733,"stem":734},"useRuntimeConfig","Access runtime config variables with the useRuntimeConfig composable.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-runtime-config","4.api\u002F2.composables\u002Fuse-runtime-config",{"title":736,"description":737,"path":738,"stem":739},"useRuntimeHook","Registers a runtime hook in a Nuxt application and ensures it is properly disposed of when the scope is destroyed.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-runtime-hook","4.api\u002F2.composables\u002Fuse-runtime-hook",{"title":741,"description":742,"path":743,"stem":744},"useSeoMeta","The useSeoMeta composable lets you define your site's SEO meta tags as a flat object with full TypeScript support.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-seo-meta","4.api\u002F2.composables\u002Fuse-seo-meta",{"title":746,"description":747,"path":748,"stem":749},"useServerSeoMeta","The useServerSeoMeta composable lets you define your site's SEO meta tags as a flat object with full TypeScript support.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-server-seo-meta","4.api\u002F2.composables\u002Fuse-server-seo-meta",{"title":751,"description":752,"path":753,"stem":754},"useState","The useState composable creates a reactive and SSR-friendly shared state.","\u002Fdocs\u002F5.x\u002Fapi\u002Fcomposables\u002Fuse-state","4.api\u002F2.composables\u002Fuse-state",{"title":756,"titleTemplate":757,"path":758,"stem":759,"children":760,"page":106},"Utils","%s · Nuxt Utils","\u002Fdocs\u002F5.x\u002Fapi\u002Futils","4.api\u002F3.utils\u002F$fetch",[761,765,770,775,780,785,790,795,800,805,810,815,820,825,830,835,840,845,850,855,860,865,870,875,880,885,890,895,900],{"title":762,"description":763,"path":764,"stem":759},"$fetch","Nuxt uses ofetch to expose globally the $fetch helper for making HTTP requests.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fdollarfetch",{"title":766,"description":767,"path":768,"stem":769},"abortNavigation","abortNavigation is a helper function that prevents navigation from taking place and throws an error if one is set as a parameter.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fabort-navigation","4.api\u002F3.utils\u002Fabort-navigation",{"title":771,"description":772,"path":773,"stem":774},"addRouteMiddleware","addRouteMiddleware() is a helper function to dynamically add middleware in your application.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fadd-route-middleware","4.api\u002F3.utils\u002Fadd-route-middleware",{"title":776,"description":777,"path":778,"stem":779},"callOnce","Run a given function or block of code once during SSR or CSR.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fcall-once","4.api\u002F3.utils\u002Fcall-once",{"title":781,"description":782,"path":783,"stem":784},"clearError","The clearError composable clears all handled errors.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fclear-error","4.api\u002F3.utils\u002Fclear-error",{"title":786,"description":787,"path":788,"stem":789},"clearNuxtData","Delete cached data, error status and pending promises of useAsyncData and useFetch.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fclear-nuxt-data","4.api\u002F3.utils\u002Fclear-nuxt-data",{"title":791,"description":792,"path":793,"stem":794},"clearNuxtState","Delete the cached state of useState.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fclear-nuxt-state","4.api\u002F3.utils\u002Fclear-nuxt-state",{"title":796,"description":797,"path":798,"stem":799},"createError","Create an error object with additional metadata.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fcreate-error","4.api\u002F3.utils\u002Fcreate-error",{"title":801,"description":802,"path":803,"stem":804},"defineLazyHydrationComponent","Define a lazy hydration component with a specific strategy.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fdefine-lazy-hydration-component","4.api\u002F3.utils\u002Fdefine-lazy-hydration-component",{"title":806,"description":807,"path":808,"stem":809},"defineNuxtComponent","defineNuxtComponent() is a helper function for defining type safe components with Options API.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fdefine-nuxt-component","4.api\u002F3.utils\u002Fdefine-nuxt-component",{"title":811,"description":812,"path":813,"stem":814},"defineNuxtPlugin","defineNuxtPlugin() is a helper function for creating Nuxt plugins.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fdefine-nuxt-plugin","4.api\u002F3.utils\u002Fdefine-nuxt-plugin",{"title":816,"description":817,"path":818,"stem":819},"defineNuxtRouteMiddleware","Create named route middleware using defineNuxtRouteMiddleware helper function.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fdefine-nuxt-route-middleware","4.api\u002F3.utils\u002Fdefine-nuxt-route-middleware",{"title":821,"description":822,"path":823,"stem":824},"definePageMeta","Define metadata for your page components.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fdefine-page-meta","4.api\u002F3.utils\u002Fdefine-page-meta",{"title":826,"description":827,"path":828,"stem":829},"defineRouteRules","Define route rules for hybrid rendering at the page level.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fdefine-route-rules","4.api\u002F3.utils\u002Fdefine-route-rules",{"title":831,"description":832,"path":833,"stem":834},"navigateTo","navigateTo is a helper function that programmatically navigates users.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fnavigate-to","4.api\u002F3.utils\u002Fnavigate-to",{"title":836,"description":837,"path":838,"stem":839},"onBeforeRouteLeave","The onBeforeRouteLeave composable allows registering a route guard within a component.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fon-before-route-leave","4.api\u002F3.utils\u002Fon-before-route-leave",{"title":841,"description":842,"path":843,"stem":844},"onBeforeRouteUpdate","The onBeforeRouteUpdate composable allows registering a route guard within a component.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fon-before-route-update","4.api\u002F3.utils\u002Fon-before-route-update",{"title":846,"description":847,"path":848,"stem":849},"onNuxtReady","The onNuxtReady composable allows running a callback after your app has finished initializing.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fon-nuxt-ready","4.api\u002F3.utils\u002Fon-nuxt-ready",{"title":851,"description":852,"path":853,"stem":854},"prefetchComponents","Nuxt provides utilities to give you control over prefetching components.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fprefetch-components","4.api\u002F3.utils\u002Fprefetch-components",{"title":856,"description":857,"path":858,"stem":859},"preloadComponents","Nuxt provides utilities to give you control over preloading components.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fpreload-components","4.api\u002F3.utils\u002Fpreload-components",{"title":861,"description":862,"path":863,"stem":864},"preloadRouteComponents","preloadRouteComponents allows you to manually preload individual pages in your Nuxt app.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fpreload-route-components","4.api\u002F3.utils\u002Fpreload-route-components",{"title":866,"description":867,"path":868,"stem":869},"prerenderRoutes","prerenderRoutes hints to Nitro to prerender an additional route.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fprerender-routes","4.api\u002F3.utils\u002Fprerender-routes",{"title":871,"description":872,"path":873,"stem":874},"refreshCookie","Refresh useCookie values manually when a cookie has changed","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Frefresh-cookie","4.api\u002F3.utils\u002Frefresh-cookie",{"title":876,"description":877,"path":878,"stem":879},"refreshNuxtData","Refresh all or specific asyncData instances in Nuxt","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Frefresh-nuxt-data","4.api\u002F3.utils\u002Frefresh-nuxt-data",{"title":881,"description":882,"path":883,"stem":884},"reloadNuxtApp","reloadNuxtApp will perform a hard reload of the page.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Freload-nuxt-app","4.api\u002F3.utils\u002Freload-nuxt-app",{"title":886,"description":887,"path":888,"stem":889},"setPageLayout","setPageLayout allows you to dynamically change the layout of a page.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fset-page-layout","4.api\u002F3.utils\u002Fset-page-layout",{"title":891,"description":892,"path":893,"stem":894},"setResponseStatus","setResponseStatus sets the status (and optionally the statusText) of the response.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fset-response-status","4.api\u002F3.utils\u002Fset-response-status",{"title":896,"description":897,"path":898,"stem":899},"showError","Nuxt provides a quick and simple way to show a full screen error page if needed.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fshow-error","4.api\u002F3.utils\u002Fshow-error",{"title":901,"description":902,"path":903,"stem":904},"updateAppConfig","Update the App Config at runtime.","\u002Fdocs\u002F5.x\u002Fapi\u002Futils\u002Fupdate-app-config","4.api\u002F3.utils\u002Fupdate-app-config",{"title":460,"titleTemplate":906,"path":907,"stem":908,"children":909,"page":106},"%s · Nuxt Kit","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit","4.api\u002F5.kit\u002F1.modules",[910,913,918,923,927,931,936,941,946,951,956,960,965,970,975,980,985,990,995],{"title":290,"description":911,"path":912,"stem":908},"Nuxt Kit provides a set of utilities to help you create and use modules. You can use these utilities to create your own modules or to reuse existing modules.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fmodules",{"title":914,"description":915,"path":916,"stem":917},"Programmatic Usage","Nuxt Kit provides a set of utilities to help you work with Nuxt programmatically. These functions allow you to load Nuxt, build Nuxt, and load Nuxt configuration.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fprogrammatic","4.api\u002F5.kit\u002F2.programmatic",{"title":919,"description":920,"path":921,"stem":922},"Compatibility","Nuxt Kit provides a set of utilities to help you check the compatibility of your modules with different Nuxt versions.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fcompatibility","4.api\u002F5.kit\u002F3.compatibility",{"title":280,"description":924,"path":925,"stem":926},"Nuxt Kit provides a set of utilities to help you work with auto-imports. These functions allow you to register your own utils, composables and Vue APIs.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fautoimports","4.api\u002F5.kit\u002F4.autoimports",{"title":501,"description":928,"path":929,"stem":930},"Nuxt Kit provides a set of utilities to help you work with components. You can register components globally or locally, and also add directories to be scanned for components.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fcomponents","4.api\u002F5.kit\u002F5.components",{"title":932,"description":933,"path":934,"stem":935},"Context","Nuxt Kit provides a set of utilities to help you work with context.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fcontext","4.api\u002F5.kit\u002F6.context",{"title":937,"description":938,"path":939,"stem":940},"Pages","Nuxt Kit provides a set of utilities to help you create and use pages. You can use these utilities to manipulate the pages configuration or to define route rules.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fpages","4.api\u002F5.kit\u002F7.pages",{"title":942,"description":943,"path":944,"stem":945},"Layout","Nuxt Kit provides a set of utilities to help you work with layouts.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Flayout","4.api\u002F5.kit\u002F8.layout",{"title":947,"description":948,"path":949,"stem":950},"Head","Nuxt Kit provides utilities to help you manage head configuration in modules.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fhead","4.api\u002F5.kit\u002F9.head",{"title":952,"description":953,"path":954,"stem":955},"Plugins","Nuxt Kit provides a set of utilities to help you create and use plugins. You can add plugins or plugin templates to your module using these functions.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fplugins","4.api\u002F5.kit\u002F9.plugins",{"title":484,"description":957,"path":958,"stem":959},"Nuxt Kit provides a set of utilities to help you access and modify Nuxt runtime configuration.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fruntime-config","4.api\u002F5.kit\u002F10.runtime-config",{"title":961,"description":962,"path":963,"stem":964},"Templates","Nuxt Kit provides a set of utilities to help you work with templates. These functions allow you to generate extra files during development and build time.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Ftemplates","4.api\u002F5.kit\u002F10.templates",{"title":966,"description":967,"path":968,"stem":969},"App Config","Nuxt Kit provides a set of utilities to help you access and modify Nuxt app configuration.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fapp-config","4.api\u002F5.kit\u002F11.app-config",{"title":971,"description":972,"path":973,"stem":974},"Nitro","Nuxt Kit provides a set of utilities to help you work with Nitro. These functions allow you to add server handlers, plugins, and prerender routes.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fnitro","4.api\u002F5.kit\u002F12.nitro",{"title":976,"description":977,"path":978,"stem":979},"Resolving","Nuxt Kit provides utilities to resolve paths from the Nuxt root directory or a custom base.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fresolving","4.api\u002F5.kit\u002F13.resolving",{"title":981,"description":982,"path":983,"stem":984},"Logging","Nuxt Kit provides a set of utilities to help you work with logging. These functions allow you to log messages with extra features.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Flogging","4.api\u002F5.kit\u002F14.logging",{"title":986,"description":987,"path":988,"stem":989},"Builder","Nuxt Kit provides a set of utilities to help you work with the builder. These functions allow you to extend the Vite and webpack configurations.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fbuilder","4.api\u002F5.kit\u002F15.builder",{"title":991,"description":992,"path":993,"stem":994},"Examples","Examples of Nuxt Kit utilities in use.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Fexamples","4.api\u002F5.kit\u002F16.examples",{"title":82,"description":996,"path":997,"stem":998},"Nuxt Kit provides utilities to help you work with layers and their directory structures.","\u002Fdocs\u002F5.x\u002Fapi\u002Fkit\u002Flayers","4.api\u002F5.kit\u002F17.layers",{"icon":1000,"title":1001,"path":1002,"stem":1003,"children":1004,"page":106},"i-lucide-brain","Advanced","\u002Fdocs\u002F5.x\u002Fapi\u002Fadvanced","4.api\u002F6.advanced\u002F1.hooks",[1005,1007],{"title":455,"description":456,"path":1006,"stem":1003},"\u002Fdocs\u002F5.x\u002Fapi\u002Fadvanced\u002Fhooks",{"title":1008,"description":1009,"path":1010,"stem":1011},"Import meta","Understand where your code is running using `import.meta`.","\u002Fdocs\u002F5.x\u002Fapi\u002Fadvanced\u002Fimport-meta","4.api\u002F6.advanced\u002F2.import-meta",{"title":1013,"description":1014,"path":1015,"stem":1016},"Nuxt Configuration","Discover all the options you can use in your nuxt.config.ts file.","\u002Fdocs\u002F5.x\u002Fapi\u002Fnuxt-config","4.api\u002F6.nuxt-config",{"title":1018,"titleTemplate":1019,"icon":1020,"path":1021,"stem":1022,"children":1023,"page":106},"Community","%s · Nuxt Community","i-lucide-messages-square","\u002Fdocs\u002F5.x\u002Fcommunity","5.community\u002F2.getting-help",[1024,1029,1034,1039,1044,1049],{"title":1025,"description":1026,"path":1027,"stem":1022,"icon":1028},"Getting Help","We're a friendly community of developers and we'd love to help.","\u002Fdocs\u002F5.x\u002Fcommunity\u002Fgetting-help","i-lucide-life-buoy",{"title":1030,"description":1031,"path":1032,"stem":1033},"Reporting Bugs","One of the most valuable roles in open source is taking the time to report bugs helpfully.","\u002Fdocs\u002F5.x\u002Fcommunity\u002Freporting-bugs","5.community\u002F3.reporting-bugs",{"title":1035,"description":1036,"path":1037,"stem":1038},"Contribution","Nuxt is a community project - and so we love contributions of all kinds! ❤️","\u002Fdocs\u002F5.x\u002Fcommunity\u002Fcontribution","5.community\u002F4.contribution",{"title":1040,"description":1041,"path":1042,"stem":1043},"Framework","Some specific points about contributions to the framework repository.","\u002Fdocs\u002F5.x\u002Fcommunity\u002Fframework-contribution","5.community\u002F5.framework-contribution",{"title":1045,"description":1046,"path":1047,"stem":1048},"Roadmap","Nuxt is constantly evolving, with new features and modules being added all the time.","\u002Fdocs\u002F5.x\u002Fcommunity\u002Froadmap","5.community\u002F6.roadmap",{"title":1050,"description":1051,"path":1052,"stem":1053},"Releases","Discover the latest releases of Nuxt & Nuxt official modules.","\u002Fdocs\u002F5.x\u002Fcommunity\u002Fchangelog","5.community\u002F7.changelog",{"title":1055,"titleTemplate":1056,"icon":1057,"path":1058,"stem":1059,"children":1060,"page":106},"Migrate to Nuxt Bridge","Migrate to Nuxt Bridge: %s","i-lucide-ship","\u002Fdocs\u002F5.x\u002Fbridge","6.bridge\u002F1.overview",[1061,1065,1069,1074,1079,1084,1089,1092,1096,1101],{"title":1062,"description":1063,"path":1064,"stem":1059},"Overview","Reduce the differences with Nuxt 3 and reduce the burden of migration to Nuxt 3.","\u002Fdocs\u002F5.x\u002Fbridge\u002Foverview",{"title":300,"description":1066,"path":1067,"stem":1068},"Learn how to use TypeScript with Nuxt Bridge.","\u002Fdocs\u002F5.x\u002Fbridge\u002Ftypescript","6.bridge\u002F2.typescript",{"title":1070,"description":1071,"path":1072,"stem":1073},"Legacy Composition API","Learn how to migrate to Composition API with Nuxt Bridge.","\u002Fdocs\u002F5.x\u002Fbridge\u002Fbridge-composition-api","6.bridge\u002F3.bridge-composition-api",{"title":1075,"description":1076,"path":1077,"stem":1078},"Plugins and Middleware","Learn how to migrate from Nuxt 2 to Nuxt Bridge new plugins and middleware.","\u002Fdocs\u002F5.x\u002Fbridge\u002Fplugins-and-middleware","6.bridge\u002F4.plugins-and-middleware",{"title":1080,"description":1081,"path":1082,"stem":1083},"New Composition API","Nuxt Bridge implements composables compatible with Nuxt 3.","\u002Fdocs\u002F5.x\u002Fbridge\u002Fnuxt3-compatible-api","6.bridge\u002F5.nuxt3-compatible-api",{"title":1085,"description":1086,"path":1087,"stem":1088},"Meta Tags","Learn how to migrate from Nuxt 2 to Nuxt Bridge new meta tags.","\u002Fdocs\u002F5.x\u002Fbridge\u002Fmeta","6.bridge\u002F6.meta",{"title":484,"description":485,"path":1090,"stem":1091},"\u002Fdocs\u002F5.x\u002Fbridge\u002Fruntime-config","6.bridge\u002F7.runtime-config",{"title":971,"description":1093,"path":1094,"stem":1095},"Activate Nitro to your Nuxt 2 application with Nuxt Bridge.","\u002Fdocs\u002F5.x\u002Fbridge\u002Fnitro","6.bridge\u002F8.nitro",{"title":1097,"description":1098,"path":1099,"stem":1100},"Vite","Activate Vite to your Nuxt 2 application with Nuxt Bridge.","\u002Fdocs\u002F5.x\u002Fbridge\u002Fvite","6.bridge\u002F9.vite",{"title":27,"description":1102,"path":1103,"stem":1104},"Learn how to configure Nuxt Bridge to your own needs.","\u002Fdocs\u002F5.x\u002Fbridge\u002Fconfiguration","6.bridge\u002F10.configuration",{"title":1106,"titleTemplate":1107,"icon":1108,"path":1109,"stem":1110,"children":1111,"page":106},"Migrate to Nuxt 3","Migrate to Nuxt 3: %s","i-lucide-circle-arrow-up","\u002Fdocs\u002F5.x\u002Fmigration","7.migration\u002F1.overview",[1112,1115,1119,1124,1128,1132,1137,1142,1146,1151,1155],{"title":1062,"description":1113,"path":1114,"stem":1110},"Nuxt 3 is a complete rewrite of Nuxt 2, and also based on a new set of underlying technologies.","\u002Fdocs\u002F5.x\u002Fmigration\u002Foverview",{"title":27,"description":1116,"path":1117,"stem":1118},"Learn how to migrate from Nuxt 2 to Nuxt 3 new configuration.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fconfiguration","7.migration\u002F2.configuration",{"title":1120,"description":1121,"path":1122,"stem":1123},"Auto Imports","Nuxt 3 adopts a minimal friction approach, meaning wherever possible components and composables are auto-imported.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fauto-imports","7.migration\u002F3.auto-imports",{"title":1085,"description":1125,"path":1126,"stem":1127},"Manage your meta tags, from Nuxt 2 to Nuxt 3.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fmeta","7.migration\u002F4.meta",{"title":1075,"description":1129,"path":1130,"stem":1131},"Learn how to migrate from Nuxt 2 to Nuxt 3 plugins and middleware.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fplugins-and-middleware","7.migration\u002F5.plugins-and-middleware",{"title":1133,"description":1134,"path":1135,"stem":1136},"Pages and Layouts","Learn how to migrate from Nuxt 2 to Nuxt 3 pages and layouts.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fpages-and-layouts","7.migration\u002F6.pages-and-layouts",{"title":1138,"description":1139,"path":1140,"stem":1141},"Component Options","Learn how to migrate from Nuxt 2 components options to Nuxt 3 composables.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fcomponent-options","7.migration\u002F7.component-options",{"title":484,"description":1143,"path":1144,"stem":1145},"Learn how to migrate from Nuxt 2 to Nuxt 3 runtime config.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fruntime-config","7.migration\u002F8.runtime-config",{"title":1147,"description":1148,"path":1149,"stem":1150},"Build Tooling","Learn how to migrate from Nuxt 2 to Nuxt 3 build tooling.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fbundling","7.migration\u002F10.bundling",{"title":77,"description":1152,"path":1153,"stem":1154},"Learn how to migrate from Nuxt 2 to Nuxt 3 server.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fserver","7.migration\u002F11.server",{"title":290,"description":1156,"path":1157,"stem":1158},"Learn how to migrate from Nuxt 2 to Nuxt 3 modules.","\u002Fdocs\u002F5.x\u002Fmigration\u002Fmodule-authors","7.migration\u002F20.module-authors",{"title":5,"icon":6,"path":1160,"stem":8,"children":1161,"page":106},"\u002Fdocs\u002F4.x",[1162,1201,1263,1362,1580,1595,1618],{"title":11,"titleTemplate":12,"icon":13,"path":1163,"stem":8,"children":1164,"page":106},"\u002Fdocs\u002F4.x\u002Fgetting-started",[1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199],{"title":17,"description":18,"path":1166,"stem":8,"icon":20},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fintroduction",{"title":22,"description":23,"path":1168,"stem":25},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Finstallation",{"title":27,"description":28,"path":1170,"stem":30},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fconfiguration",{"title":32,"description":33,"path":1172,"stem":35},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fviews",{"title":37,"description":38,"path":1174,"stem":40},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fassets",{"title":42,"description":43,"path":1176,"stem":45},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fstyling",{"title":47,"description":48,"path":1178,"stem":50},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Frouting",{"title":52,"description":53,"path":1180,"stem":55},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fseo-meta",{"title":57,"description":58,"path":1182,"stem":60},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Ftransitions",{"title":62,"description":63,"path":1184,"stem":65},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fdata-fetching",{"title":67,"description":68,"path":1186,"stem":70},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fstate-management",{"title":72,"description":73,"path":1188,"stem":75},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Ferror-handling",{"title":77,"description":78,"path":1190,"stem":80},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fserver",{"title":82,"description":83,"path":1192,"stem":85},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Flayers",{"title":87,"description":88,"path":1194,"stem":90},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fprerendering",{"title":92,"description":93,"path":1196,"stem":95},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fdeployment",{"title":97,"description":98,"path":1198,"stem":100},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Ftesting",{"title":102,"description":103,"path":1200,"stem":105},"\u002Fdocs\u002F4.x\u002Fgetting-started\u002Fupgrade",{"title":108,"titleTemplate":109,"icon":110,"path":1202,"stem":112,"children":1203,"page":106},"\u002Fdocs\u002F4.x\u002Fdirectory-structure",[1204,1206,1208,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261],{"title":115,"description":116,"path":1205,"stem":112},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fnuxt",{"title":119,"description":120,"path":1207,"stem":122},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Foutput",{"title":124,"titleTemplate":109,"icon":125,"path":1209,"stem":127,"children":1210,"page":106},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp",[1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1231],{"title":130,"description":131,"path":1212,"stem":127},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fassets",{"title":134,"description":135,"path":1214,"stem":137},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fcomponents",{"title":139,"description":140,"path":1216,"stem":142},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fcomposables",{"title":144,"description":145,"path":1218,"stem":147},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Flayouts",{"title":149,"description":150,"path":1220,"stem":152},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fmiddleware",{"title":154,"description":155,"path":1222,"stem":157},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fpages",{"title":159,"description":160,"path":1224,"stem":162},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fplugins",{"title":164,"description":165,"path":1226,"stem":167},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Futils",{"title":169,"description":170,"path":1228,"stem":172},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fapp",{"title":174,"description":175,"path":1230,"stem":177},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Fapp-config",{"title":179,"description":180,"path":1232,"stem":182},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fapp\u002Ferror",{"title":184,"description":185,"path":1234,"stem":187},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fcontent",{"title":189,"description":190,"path":1236,"stem":192},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Flayers",{"title":194,"description":195,"path":1238,"stem":197},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fmodules",{"title":199,"description":200,"path":1240,"stem":202},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fnode_modules",{"title":204,"description":205,"path":1242,"stem":207},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fpublic",{"title":209,"description":210,"path":1244,"stem":212},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fserver",{"title":214,"description":215,"path":1246,"stem":217},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fshared",{"title":219,"description":220,"path":1248,"stem":222},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Ftest",{"title":224,"description":225,"path":1250,"stem":227},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fenv",{"title":229,"description":230,"path":1252,"stem":232},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fgitignore",{"title":234,"description":235,"path":1254,"stem":237},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fnuxtignore",{"title":239,"description":240,"path":1256,"stem":242},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fnuxtrc",{"title":244,"description":245,"path":1258,"stem":247},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fnuxt-config",{"title":249,"description":250,"path":1260,"stem":252},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Fpackage",{"title":254,"description":255,"path":1262,"stem":257},"\u002Fdocs\u002F4.x\u002Fdirectory-structure\u002Ftsconfig",{"title":259,"icon":260,"path":1264,"stem":262,"children":1265,"page":106},"\u002Fdocs\u002F4.x\u002Fguide",[1266,1285,1298,1305,1324,1337],{"title":265,"titleTemplate":266,"icon":267,"path":1267,"stem":262,"children":1268,"page":106},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts",[1269,1271,1273,1275,1277,1279,1281,1283],{"title":271,"description":272,"path":1270,"stem":262},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Frendering",{"title":275,"description":276,"path":1272,"stem":278},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Fnuxt-lifecycle",{"title":280,"description":281,"path":1274,"stem":283},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Fauto-imports",{"title":285,"description":286,"path":1276,"stem":288},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Fserver-engine",{"title":290,"description":291,"path":1278,"stem":293},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Fmodules",{"title":295,"description":296,"path":1280,"stem":298},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Fserver-components",{"title":300,"description":301,"path":1282,"stem":303},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Ftypescript",{"title":305,"description":306,"path":1284,"stem":308},"\u002Fdocs\u002F4.x\u002Fguide\u002Fconcepts\u002Fcode-style",{"title":310,"titleTemplate":311,"icon":312,"path":1286,"stem":314,"children":1287,"page":106},"\u002Fdocs\u002F4.x\u002Fguide\u002Fbest-practices",[1288,1290,1292,1294,1296],{"title":317,"description":318,"path":1289,"stem":314},"\u002Fdocs\u002F4.x\u002Fguide\u002Fbest-practices\u002Faccessibility",{"title":321,"description":322,"path":1291,"stem":324},"\u002Fdocs\u002F4.x\u002Fguide\u002Fbest-practices\u002Fdevcontainers",{"title":326,"description":327,"path":1293,"stem":329},"\u002Fdocs\u002F4.x\u002Fguide\u002Fbest-practices\u002Fhydration",{"title":331,"description":332,"path":1295,"stem":334},"\u002Fdocs\u002F4.x\u002Fguide\u002Fbest-practices\u002Fperformance",{"title":336,"description":337,"path":1297,"stem":339},"\u002Fdocs\u002F4.x\u002Fguide\u002Fbest-practices\u002Fplugins",{"title":341,"titleTemplate":342,"icon":343,"path":1299,"stem":345,"children":1300,"page":106},"\u002Fdocs\u002F4.x\u002Fguide\u002Fai",[1301,1303],{"title":348,"description":349,"path":1302,"stem":345},"\u002Fdocs\u002F4.x\u002Fguide\u002Fai\u002Fmcp",{"title":352,"description":353,"path":1304,"stem":355},"\u002Fdocs\u002F4.x\u002Fguide\u002Fai\u002Fllms-txt",{"title":357,"titleTemplate":358,"icon":359,"path":1306,"stem":361,"children":1307,"page":106},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules",[1308,1310,1312,1314,1316,1318,1320,1322],{"title":364,"description":365,"path":1309,"stem":361},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules\u002Fgetting-started",{"title":368,"description":369,"path":1311,"stem":371},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules\u002Fmodule-anatomy",{"title":373,"description":374,"path":1313,"stem":376},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules\u002Frecipes-basics",{"title":378,"description":379,"path":1315,"stem":381},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules\u002Fmodule-dependencies",{"title":383,"description":384,"path":1317,"stem":386},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules\u002Frecipes-advanced",{"title":388,"description":389,"path":1319,"stem":391},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules\u002Ftesting",{"title":393,"description":394,"path":1321,"stem":396},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules\u002Fbest-practices",{"title":398,"description":399,"path":1323,"stem":401},"\u002Fdocs\u002F4.x\u002Fguide\u002Fmodules\u002Fecosystem",{"title":403,"titleTemplate":404,"icon":405,"path":1325,"stem":407,"children":1326,"page":106},"\u002Fdocs\u002F4.x\u002Fguide\u002Frecipes",[1327,1329,1331,1333,1335],{"title":410,"description":411,"path":1328,"stem":407},"\u002Fdocs\u002F4.x\u002Fguide\u002Frecipes\u002Fcustom-routing",{"title":414,"description":415,"path":1330,"stem":417},"\u002Fdocs\u002F4.x\u002Fguide\u002Frecipes\u002Fvite-plugin",{"title":419,"description":420,"path":1332,"stem":422},"\u002Fdocs\u002F4.x\u002Fguide\u002Frecipes\u002Fcustom-usefetch",{"title":424,"description":425,"path":1334,"stem":427},"\u002Fdocs\u002F4.x\u002Fguide\u002Frecipes\u002Fsessions-and-authentication",{"title":429,"description":430,"path":1336,"stem":432},"\u002Fdocs\u002F4.x\u002Fguide\u002Frecipes\u002Fmostly-static-sites",{"title":434,"titleTemplate":435,"icon":436,"path":1338,"stem":438,"children":1339,"page":106},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further",[1340,1342,1344,1346,1348,1350,1352,1354,1356,1358,1360],{"title":441,"description":442,"path":1341,"stem":438},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fevents",{"title":445,"description":446,"path":1343,"stem":448},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fexperimental-features",{"title":450,"description":451,"path":1345,"stem":453},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Ffeatures",{"title":455,"description":456,"path":1347,"stem":458},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fhooks",{"title":460,"description":461,"path":1349,"stem":463},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fkit",{"title":465,"description":466,"path":1351,"stem":468},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fnuxt-app",{"title":470,"description":83,"path":1353,"stem":472},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Flayers",{"title":474,"description":475,"path":1355,"stem":477},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fbuilders",{"title":479,"description":480,"path":1357,"stem":482},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fdebugging",{"title":484,"description":485,"path":1359,"stem":487},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fruntime-config",{"title":489,"description":490,"path":1361,"stem":492},"\u002Fdocs\u002F4.x\u002Fguide\u002Fgoing-further\u002Fnightly-release-channel",{"title":494,"titleTemplate":495,"icon":496,"path":1363,"stem":498,"children":1364,"page":106},"\u002Fdocs\u002F4.x\u002Fapi",[1365,1400,1469,1530,1571,1578],{"title":501,"titleTemplate":502,"icon":359,"path":1366,"stem":498,"children":1367,"page":106},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents",[1368,1370,1372,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392,1394,1396,1398],{"title":506,"description":507,"path":1369,"stem":498},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fclient-only",{"title":510,"description":511,"path":1371,"stem":513},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fdev-only",{"title":515,"description":516,"path":1373,"stem":518},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-client-fallback",{"title":520,"description":521,"path":1375,"stem":523},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-page",{"title":525,"description":526,"path":1377,"stem":528},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-layout",{"title":530,"description":531,"path":1379,"stem":533},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-link",{"title":535,"description":536,"path":1381,"stem":538},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-loading-indicator",{"title":540,"description":541,"path":1383,"stem":543},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-error-boundary",{"title":545,"description":546,"path":1385,"stem":548},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-welcome",{"title":550,"description":551,"path":1387,"stem":553},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-island",{"title":555,"description":556,"path":1389,"stem":558},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-img",{"title":560,"description":561,"path":1391,"stem":563},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-picture",{"title":565,"description":566,"path":1393,"stem":568},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fteleports",{"title":570,"description":571,"path":1395,"stem":573},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-route-announcer",{"title":575,"description":576,"path":1397,"stem":578},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-time",{"title":580,"description":581,"path":1399,"stem":583},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomponents\u002Fnuxt-announcer",{"title":585,"titleTemplate":586,"icon":587,"path":1401,"stem":589,"children":1402,"page":106},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables",[1403,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467],{"title":592,"description":593,"path":1404,"stem":589},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fcreate-use-async-data",{"title":596,"description":597,"path":1406,"stem":599},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fcreate-use-fetch",{"title":601,"description":602,"path":1408,"stem":604},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fon-prehydrate",{"title":606,"description":607,"path":1410,"stem":609},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-announcer",{"title":611,"description":612,"path":1412,"stem":614},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-app-config",{"title":616,"description":617,"path":1414,"stem":619},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-async-data",{"title":621,"description":622,"path":1416,"stem":624},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-cookie",{"title":626,"description":627,"path":1418,"stem":629},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-error",{"title":631,"description":632,"path":1420,"stem":634},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-fetch",{"title":636,"description":637,"path":1422,"stem":639},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-head",{"title":641,"description":642,"path":1424,"stem":644},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-head-safe",{"title":646,"description":647,"path":1426,"stem":649},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-hydration",{"title":651,"description":652,"path":1428,"stem":654},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-layout",{"title":656,"description":657,"path":1430,"stem":659},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-lazy-async-data",{"title":661,"description":662,"path":1432,"stem":664},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-lazy-fetch",{"title":666,"description":667,"path":1434,"stem":669},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-loading-indicator",{"title":671,"description":672,"path":1436,"stem":674},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-nuxt-app",{"title":676,"description":677,"path":1438,"stem":679},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-nuxt-data",{"title":681,"description":682,"path":1440,"stem":684},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-preview-mode",{"title":686,"description":687,"path":1442,"stem":689},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-request-event",{"title":691,"description":692,"path":1444,"stem":694},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-request-fetch",{"title":696,"description":697,"path":1446,"stem":699},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-request-header",{"title":701,"description":702,"path":1448,"stem":704},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-request-headers",{"title":706,"description":707,"path":1450,"stem":709},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-request-url",{"title":711,"description":712,"path":1452,"stem":714},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-response-header",{"title":716,"description":717,"path":1454,"stem":719},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-route",{"title":721,"description":722,"path":1456,"stem":724},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-route-announcer",{"title":726,"description":727,"path":1458,"stem":729},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-router",{"title":731,"description":732,"path":1460,"stem":734},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-runtime-config",{"title":736,"description":737,"path":1462,"stem":739},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-runtime-hook",{"title":741,"description":742,"path":1464,"stem":744},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-seo-meta",{"title":746,"description":747,"path":1466,"stem":749},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-server-seo-meta",{"title":751,"description":752,"path":1468,"stem":754},"\u002Fdocs\u002F4.x\u002Fapi\u002Fcomposables\u002Fuse-state",{"title":756,"titleTemplate":757,"path":1470,"stem":759,"children":1471,"page":106},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils",[1472,1474,1476,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528],{"title":762,"description":763,"path":1473,"stem":759},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fdollarfetch",{"title":766,"description":767,"path":1475,"stem":769},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fabort-navigation",{"title":771,"description":772,"path":1477,"stem":774},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fadd-route-middleware",{"title":776,"description":777,"path":1479,"stem":779},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fcall-once",{"title":781,"description":782,"path":1481,"stem":784},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fclear-error",{"title":786,"description":787,"path":1483,"stem":789},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fclear-nuxt-data",{"title":791,"description":792,"path":1485,"stem":794},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fclear-nuxt-state",{"title":796,"description":797,"path":1487,"stem":799},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fcreate-error",{"title":801,"description":802,"path":1489,"stem":804},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fdefine-lazy-hydration-component",{"title":806,"description":807,"path":1491,"stem":809},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fdefine-nuxt-component",{"title":811,"description":812,"path":1493,"stem":814},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fdefine-nuxt-plugin",{"title":816,"description":817,"path":1495,"stem":819},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fdefine-nuxt-route-middleware",{"title":821,"description":822,"path":1497,"stem":824},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fdefine-page-meta",{"title":826,"description":827,"path":1499,"stem":829},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fdefine-route-rules",{"title":831,"description":832,"path":1501,"stem":834},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fnavigate-to",{"title":836,"description":837,"path":1503,"stem":839},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fon-before-route-leave",{"title":841,"description":842,"path":1505,"stem":844},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fon-before-route-update",{"title":846,"description":847,"path":1507,"stem":849},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fon-nuxt-ready",{"title":851,"description":852,"path":1509,"stem":854},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fprefetch-components",{"title":856,"description":857,"path":1511,"stem":859},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fpreload-components",{"title":861,"description":862,"path":1513,"stem":864},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fpreload-route-components",{"title":866,"description":867,"path":1515,"stem":869},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fprerender-routes",{"title":871,"description":872,"path":1517,"stem":874},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Frefresh-cookie",{"title":876,"description":877,"path":1519,"stem":879},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Frefresh-nuxt-data",{"title":881,"description":882,"path":1521,"stem":884},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Freload-nuxt-app",{"title":886,"description":887,"path":1523,"stem":889},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fset-page-layout",{"title":891,"description":892,"path":1525,"stem":894},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fset-response-status",{"title":896,"description":897,"path":1527,"stem":899},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fshow-error",{"title":901,"description":902,"path":1529,"stem":904},"\u002Fdocs\u002F4.x\u002Fapi\u002Futils\u002Fupdate-app-config",{"title":460,"titleTemplate":906,"path":1531,"stem":908,"children":1532,"page":106},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit",[1533,1535,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1559,1561,1563,1565,1567,1569],{"title":290,"description":911,"path":1534,"stem":908},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fmodules",{"title":914,"description":915,"path":1536,"stem":917},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fprogrammatic",{"title":919,"description":920,"path":1538,"stem":922},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fcompatibility",{"title":280,"description":924,"path":1540,"stem":926},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fautoimports",{"title":501,"description":928,"path":1542,"stem":930},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fcomponents",{"title":932,"description":933,"path":1544,"stem":935},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fcontext",{"title":937,"description":938,"path":1546,"stem":940},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fpages",{"title":942,"description":943,"path":1548,"stem":945},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Flayout",{"title":947,"description":948,"path":1550,"stem":950},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fhead",{"title":952,"description":953,"path":1552,"stem":955},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fplugins",{"title":484,"description":957,"path":1554,"stem":959},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fruntime-config",{"title":961,"description":962,"path":1556,"stem":964},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Ftemplates",{"title":966,"description":967,"path":1558,"stem":969},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fapp-config",{"title":971,"description":972,"path":1560,"stem":974},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fnitro",{"title":976,"description":977,"path":1562,"stem":979},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fresolving",{"title":981,"description":982,"path":1564,"stem":984},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Flogging",{"title":986,"description":987,"path":1566,"stem":989},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fbuilder",{"title":991,"description":992,"path":1568,"stem":994},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Fexamples",{"title":82,"description":996,"path":1570,"stem":998},"\u002Fdocs\u002F4.x\u002Fapi\u002Fkit\u002Flayers",{"icon":1000,"title":1001,"path":1572,"stem":1003,"children":1573,"page":106},"\u002Fdocs\u002F4.x\u002Fapi\u002Fadvanced",[1574,1576],{"title":455,"description":456,"path":1575,"stem":1003},"\u002Fdocs\u002F4.x\u002Fapi\u002Fadvanced\u002Fhooks",{"title":1008,"description":1009,"path":1577,"stem":1011},"\u002Fdocs\u002F4.x\u002Fapi\u002Fadvanced\u002Fimport-meta",{"title":1013,"description":1014,"path":1579,"stem":1016},"\u002Fdocs\u002F4.x\u002Fapi\u002Fnuxt-config",{"title":1018,"titleTemplate":1019,"icon":1020,"path":1581,"stem":1022,"children":1582,"page":106},"\u002Fdocs\u002F4.x\u002Fcommunity",[1583,1585,1587,1589,1591,1593],{"title":1025,"description":1026,"path":1584,"stem":1022,"icon":1028},"\u002Fdocs\u002F4.x\u002Fcommunity\u002Fgetting-help",{"title":1030,"description":1031,"path":1586,"stem":1033},"\u002Fdocs\u002F4.x\u002Fcommunity\u002Freporting-bugs",{"title":1035,"description":1036,"path":1588,"stem":1038},"\u002Fdocs\u002F4.x\u002Fcommunity\u002Fcontribution",{"title":1040,"description":1041,"path":1590,"stem":1043},"\u002Fdocs\u002F4.x\u002Fcommunity\u002Fframework-contribution",{"title":1045,"description":1046,"path":1592,"stem":1048},"\u002Fdocs\u002F4.x\u002Fcommunity\u002Froadmap",{"title":1050,"description":1051,"path":1594,"stem":1053},"\u002Fdocs\u002F4.x\u002Fcommunity\u002Fchangelog",{"title":1055,"titleTemplate":1056,"icon":1057,"path":1596,"stem":1059,"children":1597,"page":106},"\u002Fdocs\u002F4.x\u002Fbridge",[1598,1600,1602,1604,1606,1608,1610,1612,1614,1616],{"title":1062,"description":1063,"path":1599,"stem":1059},"\u002Fdocs\u002F4.x\u002Fbridge\u002Foverview",{"title":300,"description":1066,"path":1601,"stem":1068},"\u002Fdocs\u002F4.x\u002Fbridge\u002Ftypescript",{"title":1070,"description":1071,"path":1603,"stem":1073},"\u002Fdocs\u002F4.x\u002Fbridge\u002Fbridge-composition-api",{"title":1075,"description":1076,"path":1605,"stem":1078},"\u002Fdocs\u002F4.x\u002Fbridge\u002Fplugins-and-middleware",{"title":1080,"description":1081,"path":1607,"stem":1083},"\u002Fdocs\u002F4.x\u002Fbridge\u002Fnuxt3-compatible-api",{"title":1085,"description":1086,"path":1609,"stem":1088},"\u002Fdocs\u002F4.x\u002Fbridge\u002Fmeta",{"title":484,"description":485,"path":1611,"stem":1091},"\u002Fdocs\u002F4.x\u002Fbridge\u002Fruntime-config",{"title":971,"description":1093,"path":1613,"stem":1095},"\u002Fdocs\u002F4.x\u002Fbridge\u002Fnitro",{"title":1097,"description":1098,"path":1615,"stem":1100},"\u002Fdocs\u002F4.x\u002Fbridge\u002Fvite",{"title":27,"description":1102,"path":1617,"stem":1104},"\u002Fdocs\u002F4.x\u002Fbridge\u002Fconfiguration",{"title":1106,"titleTemplate":1107,"icon":1108,"path":1619,"stem":1110,"children":1620,"page":106},"\u002Fdocs\u002F4.x\u002Fmigration",[1621,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641],{"title":1062,"description":1113,"path":1622,"stem":1110},"\u002Fdocs\u002F4.x\u002Fmigration\u002Foverview",{"title":27,"description":1116,"path":1624,"stem":1118},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fconfiguration",{"title":1120,"description":1121,"path":1626,"stem":1123},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fauto-imports",{"title":1085,"description":1125,"path":1628,"stem":1127},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fmeta",{"title":1075,"description":1129,"path":1630,"stem":1131},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fplugins-and-middleware",{"title":1133,"description":1134,"path":1632,"stem":1136},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fpages-and-layouts",{"title":1138,"description":1139,"path":1634,"stem":1141},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fcomponent-options",{"title":484,"description":1143,"path":1636,"stem":1145},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fruntime-config",{"title":1147,"description":1148,"path":1638,"stem":1150},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fbundling",{"title":77,"description":1152,"path":1640,"stem":1154},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fserver",{"title":290,"description":1156,"path":1642,"stem":1158},"\u002Fdocs\u002F4.x\u002Fmigration\u002Fmodule-authors",{"title":5,"icon":6,"path":1644,"stem":8,"children":1645,"page":106},"\u002Fdocs\u002F3.x",[1646,1685,1753,1843,2142,2157,2180],{"title":11,"titleTemplate":12,"icon":13,"path":1647,"stem":8,"children":1648,"page":106},"\u002Fdocs\u002F3.x\u002Fgetting-started",[1649,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683],{"title":17,"description":18,"path":1650,"stem":8,"icon":20},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fintroduction",{"title":22,"description":23,"path":1652,"stem":25},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Finstallation",{"title":27,"description":28,"path":1654,"stem":30},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fconfiguration",{"title":32,"description":33,"path":1656,"stem":35},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fviews",{"title":37,"description":38,"path":1658,"stem":40},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fassets",{"title":42,"description":43,"path":1660,"stem":45},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fstyling",{"title":47,"description":48,"path":1662,"stem":50},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Frouting",{"title":52,"description":53,"path":1664,"stem":55},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fseo-meta",{"title":57,"description":58,"path":1666,"stem":60},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Ftransitions",{"title":62,"description":63,"path":1668,"stem":65},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fdata-fetching",{"title":67,"description":68,"path":1670,"stem":70},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fstate-management",{"title":72,"description":73,"path":1672,"stem":75},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Ferror-handling",{"title":77,"description":78,"path":1674,"stem":80},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fserver",{"title":82,"description":83,"path":1676,"stem":85},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Flayers",{"title":87,"description":88,"path":1678,"stem":90},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fprerendering",{"title":92,"description":93,"path":1680,"stem":95},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fdeployment",{"title":97,"description":98,"path":1682,"stem":100},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Ftesting",{"title":102,"description":103,"path":1684,"stem":105},"\u002Fdocs\u002F3.x\u002Fgetting-started\u002Fupgrade",{"title":108,"titleTemplate":109,"icon":110,"path":1686,"stem":112,"children":1687,"page":106},"\u002Fdocs\u002F3.x\u002Fdirectory-structure",[1688,1690,1692,1695,1698,1701,1703,1705,1708,1711,1713,1715,1718,1721,1723,1725,1727,1730,1732,1734,1736,1738,1741,1744,1747,1749,1751],{"title":115,"description":116,"path":1689,"stem":112},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fnuxt",{"title":119,"description":120,"path":1691,"stem":122},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Foutput",{"title":130,"description":131,"path":1693,"stem":1694},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fassets","2.directory-structure\u002F1.assets",{"title":134,"description":135,"path":1696,"stem":1697},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fcomponents","2.directory-structure\u002F1.components",{"title":139,"description":140,"path":1699,"stem":1700},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fcomposables","2.directory-structure\u002F1.composables",{"title":184,"description":185,"path":1702,"stem":187},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fcontent",{"title":189,"description":190,"path":1704,"stem":192},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Flayers",{"title":144,"description":145,"path":1706,"stem":1707},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Flayouts","2.directory-structure\u002F1.layouts",{"title":149,"description":150,"path":1709,"stem":1710},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fmiddleware","2.directory-structure\u002F1.middleware",{"title":194,"description":195,"path":1712,"stem":197},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fmodules",{"title":199,"description":200,"path":1714,"stem":202},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fnode_modules",{"title":154,"description":155,"path":1716,"stem":1717},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fpages","2.directory-structure\u002F1.pages",{"title":159,"description":160,"path":1719,"stem":1720},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fplugins","2.directory-structure\u002F1.plugins",{"title":204,"description":205,"path":1722,"stem":207},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fpublic",{"title":209,"description":210,"path":1724,"stem":212},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fserver",{"title":214,"description":215,"path":1726,"stem":217},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fshared",{"title":164,"description":165,"path":1728,"stem":1729},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Futils","2.directory-structure\u002F1.utils",{"title":224,"description":225,"path":1731,"stem":227},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fenv",{"title":229,"description":230,"path":1733,"stem":232},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fgitignore",{"title":234,"description":235,"path":1735,"stem":237},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fnuxtignore",{"title":239,"description":240,"path":1737,"stem":242},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fnuxtrc",{"title":169,"description":170,"path":1739,"stem":1740},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fapp","2.directory-structure\u002F3.app",{"title":174,"description":175,"path":1742,"stem":1743},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fapp-config","2.directory-structure\u002F3.app-config",{"title":179,"description":180,"path":1745,"stem":1746},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Ferror","2.directory-structure\u002F3.error",{"title":244,"description":245,"path":1748,"stem":247},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fnuxt-config",{"title":249,"description":250,"path":1750,"stem":252},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Fpackage",{"title":254,"description":255,"path":1752,"stem":257},"\u002Fdocs\u002F3.x\u002Fdirectory-structure\u002Ftsconfig",{"title":259,"icon":260,"path":1754,"stem":262,"children":1755,"page":106},"\u002Fdocs\u002F3.x\u002Fguide",[1756,1773,1783,1790,1809,1820],{"title":265,"titleTemplate":266,"icon":267,"path":1757,"stem":262,"children":1758,"page":106},"\u002Fdocs\u002F3.x\u002Fguide\u002Fconcepts",[1759,1761,1763,1765,1767,1769,1771],{"title":271,"description":272,"path":1760,"stem":262},"\u002Fdocs\u002F3.x\u002Fguide\u002Fconcepts\u002Frendering",{"title":275,"description":276,"path":1762,"stem":278},"\u002Fdocs\u002F3.x\u002Fguide\u002Fconcepts\u002Fnuxt-lifecycle",{"title":280,"description":281,"path":1764,"stem":283},"\u002Fdocs\u002F3.x\u002Fguide\u002Fconcepts\u002Fauto-imports",{"title":285,"description":286,"path":1766,"stem":288},"\u002Fdocs\u002F3.x\u002Fguide\u002Fconcepts\u002Fserver-engine",{"title":290,"description":291,"path":1768,"stem":293},"\u002Fdocs\u002F3.x\u002Fguide\u002Fconcepts\u002Fmodules",{"title":300,"description":301,"path":1770,"stem":303},"\u002Fdocs\u002F3.x\u002Fguide\u002Fconcepts\u002Ftypescript",{"title":305,"description":306,"path":1772,"stem":308},"\u002Fdocs\u002F3.x\u002Fguide\u002Fconcepts\u002Fcode-style",{"title":310,"titleTemplate":311,"icon":312,"path":1774,"stem":329,"children":1775,"page":106},"\u002Fdocs\u002F3.x\u002Fguide\u002Fbest-practices",[1776,1779,1781],{"title":1777,"description":327,"path":1778,"stem":329},"Nuxt and hydration","\u002Fdocs\u002F3.x\u002Fguide\u002Fbest-practices\u002Fhydration",{"title":331,"description":332,"path":1780,"stem":334},"\u002Fdocs\u002F3.x\u002Fguide\u002Fbest-practices\u002Fperformance",{"title":336,"description":337,"path":1782,"stem":339},"\u002Fdocs\u002F3.x\u002Fguide\u002Fbest-practices\u002Fplugins",{"title":341,"titleTemplate":342,"icon":343,"path":1784,"stem":345,"children":1785,"page":106},"\u002Fdocs\u002F3.x\u002Fguide\u002Fai",[1786,1788],{"title":348,"description":349,"path":1787,"stem":345},"\u002Fdocs\u002F3.x\u002Fguide\u002Fai\u002Fmcp",{"title":352,"description":353,"path":1789,"stem":355},"\u002Fdocs\u002F3.x\u002Fguide\u002Fai\u002Fllms-txt",{"title":357,"titleTemplate":358,"icon":359,"path":1791,"stem":361,"children":1792,"page":106},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules",[1793,1795,1797,1799,1801,1803,1805,1807],{"title":364,"description":365,"path":1794,"stem":361},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules\u002Fgetting-started",{"title":368,"description":369,"path":1796,"stem":371},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules\u002Fmodule-anatomy",{"title":373,"description":374,"path":1798,"stem":376},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules\u002Frecipes-basics",{"title":378,"description":379,"path":1800,"stem":381},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules\u002Fmodule-dependencies",{"title":383,"description":384,"path":1802,"stem":386},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules\u002Frecipes-advanced",{"title":388,"description":389,"path":1804,"stem":391},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules\u002Ftesting",{"title":393,"description":394,"path":1806,"stem":396},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules\u002Fbest-practices",{"title":398,"description":399,"path":1808,"stem":401},"\u002Fdocs\u002F3.x\u002Fguide\u002Fmodules\u002Fecosystem",{"title":403,"titleTemplate":404,"icon":405,"path":1810,"stem":407,"children":1811,"page":106},"\u002Fdocs\u002F3.x\u002Fguide\u002Frecipes",[1812,1814,1816,1818],{"title":410,"description":411,"path":1813,"stem":407},"\u002Fdocs\u002F3.x\u002Fguide\u002Frecipes\u002Fcustom-routing",{"title":414,"description":415,"path":1815,"stem":417},"\u002Fdocs\u002F3.x\u002Fguide\u002Frecipes\u002Fvite-plugin",{"title":419,"description":420,"path":1817,"stem":422},"\u002Fdocs\u002F3.x\u002Fguide\u002Frecipes\u002Fcustom-usefetch",{"title":424,"description":425,"path":1819,"stem":427},"\u002Fdocs\u002F3.x\u002Fguide\u002Frecipes\u002Fsessions-and-authentication",{"title":434,"titleTemplate":435,"icon":436,"path":1821,"stem":438,"children":1822,"page":106},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further",[1823,1825,1827,1829,1831,1833,1835,1837,1839,1841],{"title":441,"description":442,"path":1824,"stem":438},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Fevents",{"title":445,"description":446,"path":1826,"stem":448},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Fexperimental-features",{"title":450,"description":451,"path":1828,"stem":453},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Ffeatures",{"title":455,"description":456,"path":1830,"stem":458},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Fhooks",{"title":460,"description":461,"path":1832,"stem":463},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Fkit",{"title":465,"description":466,"path":1834,"stem":468},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Fnuxt-app",{"title":470,"description":83,"path":1836,"stem":472},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Flayers",{"title":479,"description":480,"path":1838,"stem":482},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Fdebugging",{"title":484,"description":485,"path":1840,"stem":487},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Fruntime-config",{"title":489,"description":490,"path":1842,"stem":492},"\u002Fdocs\u002F3.x\u002Fguide\u002Fgoing-further\u002Fnightly-release-channel",{"title":494,"titleTemplate":495,"icon":496,"path":1844,"stem":498,"children":1845,"page":106},"\u002Fdocs\u002F3.x\u002Fapi",[1846,1879,1940,2001,2087,2133,2140],{"title":501,"titleTemplate":502,"icon":359,"path":1847,"stem":498,"children":1848,"page":106},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents",[1849,1851,1853,1855,1857,1859,1861,1863,1865,1867,1869,1871,1873,1875,1877],{"title":506,"description":507,"path":1850,"stem":498},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fclient-only",{"title":510,"description":511,"path":1852,"stem":513},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fdev-only",{"title":515,"description":516,"path":1854,"stem":518},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-client-fallback",{"title":520,"description":521,"path":1856,"stem":523},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-page",{"title":525,"description":526,"path":1858,"stem":528},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-layout",{"title":530,"description":531,"path":1860,"stem":533},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-link",{"title":535,"description":536,"path":1862,"stem":538},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-loading-indicator",{"title":540,"description":541,"path":1864,"stem":543},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-error-boundary",{"title":545,"description":546,"path":1866,"stem":548},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-welcome",{"title":550,"description":551,"path":1868,"stem":553},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-island",{"title":555,"description":556,"path":1870,"stem":558},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-img",{"title":560,"description":561,"path":1872,"stem":563},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-picture",{"title":565,"description":566,"path":1874,"stem":568},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fteleports",{"title":570,"description":571,"path":1876,"stem":573},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-route-announcer",{"title":575,"description":576,"path":1878,"stem":578},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomponents\u002Fnuxt-time",{"title":585,"titleTemplate":586,"icon":587,"path":1880,"stem":604,"children":1881,"page":106},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables",[1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934,1936,1938],{"title":601,"description":602,"path":1883,"stem":604},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fon-prehydrate",{"title":611,"description":612,"path":1885,"stem":614},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-app-config",{"title":616,"description":617,"path":1887,"stem":619},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-async-data",{"title":621,"description":622,"path":1889,"stem":624},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-cookie",{"title":626,"description":627,"path":1891,"stem":629},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-error",{"title":631,"description":632,"path":1893,"stem":634},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-fetch",{"title":636,"description":637,"path":1895,"stem":639},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-head",{"title":641,"description":642,"path":1897,"stem":644},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-head-safe",{"title":646,"description":647,"path":1899,"stem":649},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-hydration",{"title":656,"description":657,"path":1901,"stem":659},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-lazy-async-data",{"title":661,"description":662,"path":1903,"stem":664},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-lazy-fetch",{"title":666,"description":667,"path":1905,"stem":669},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-loading-indicator",{"title":671,"description":672,"path":1907,"stem":674},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-nuxt-app",{"title":676,"description":677,"path":1909,"stem":679},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-nuxt-data",{"title":681,"description":682,"path":1911,"stem":684},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-preview-mode",{"title":686,"description":687,"path":1913,"stem":689},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-request-event",{"title":691,"description":692,"path":1915,"stem":694},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-request-fetch",{"title":696,"description":697,"path":1917,"stem":699},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-request-header",{"title":701,"description":702,"path":1919,"stem":704},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-request-headers",{"title":706,"description":707,"path":1921,"stem":709},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-request-url",{"title":711,"description":712,"path":1923,"stem":714},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-response-header",{"title":716,"description":717,"path":1925,"stem":719},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-route",{"title":721,"description":722,"path":1927,"stem":724},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-route-announcer",{"title":726,"description":727,"path":1929,"stem":729},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-router",{"title":731,"description":732,"path":1931,"stem":734},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-runtime-config",{"title":736,"description":737,"path":1933,"stem":739},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-runtime-hook",{"title":741,"description":742,"path":1935,"stem":744},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-seo-meta",{"title":746,"description":747,"path":1937,"stem":749},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-server-seo-meta",{"title":751,"description":752,"path":1939,"stem":754},"\u002Fdocs\u002F3.x\u002Fapi\u002Fcomposables\u002Fuse-state",{"title":756,"titleTemplate":757,"path":1941,"stem":759,"children":1942,"page":106},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils",[1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999],{"title":762,"description":763,"path":1944,"stem":759},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fdollarfetch",{"title":766,"description":767,"path":1946,"stem":769},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fabort-navigation",{"title":771,"description":772,"path":1948,"stem":774},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fadd-route-middleware",{"title":776,"description":777,"path":1950,"stem":779},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fcall-once",{"title":781,"description":782,"path":1952,"stem":784},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fclear-error",{"title":786,"description":787,"path":1954,"stem":789},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fclear-nuxt-data",{"title":791,"description":792,"path":1956,"stem":794},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fclear-nuxt-state",{"title":796,"description":797,"path":1958,"stem":799},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fcreate-error",{"title":801,"description":802,"path":1960,"stem":804},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fdefine-lazy-hydration-component",{"title":806,"description":807,"path":1962,"stem":809},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fdefine-nuxt-component",{"title":811,"description":812,"path":1964,"stem":814},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fdefine-nuxt-plugin",{"title":816,"description":817,"path":1966,"stem":819},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fdefine-nuxt-route-middleware",{"title":821,"description":822,"path":1968,"stem":824},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fdefine-page-meta",{"title":826,"description":827,"path":1970,"stem":829},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fdefine-route-rules",{"title":831,"description":832,"path":1972,"stem":834},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fnavigate-to",{"title":836,"description":837,"path":1974,"stem":839},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fon-before-route-leave",{"title":841,"description":842,"path":1976,"stem":844},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fon-before-route-update",{"title":846,"description":847,"path":1978,"stem":849},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fon-nuxt-ready",{"title":851,"description":852,"path":1980,"stem":854},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fprefetch-components",{"title":856,"description":857,"path":1982,"stem":859},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fpreload-components",{"title":861,"description":862,"path":1984,"stem":864},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fpreload-route-components",{"title":866,"description":867,"path":1986,"stem":869},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fprerender-routes",{"title":871,"description":872,"path":1988,"stem":874},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Frefresh-cookie",{"title":876,"description":877,"path":1990,"stem":879},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Frefresh-nuxt-data",{"title":881,"description":882,"path":1992,"stem":884},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Freload-nuxt-app",{"title":886,"description":887,"path":1994,"stem":889},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fset-page-layout",{"title":891,"description":892,"path":1996,"stem":894},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fset-response-status",{"title":896,"description":897,"path":1998,"stem":899},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fshow-error",{"title":901,"description":902,"path":2000,"stem":904},"\u002Fdocs\u002F3.x\u002Fapi\u002Futils\u002Fupdate-app-config",{"title":2002,"titleTemplate":2003,"icon":2004,"path":2005,"stem":2006,"children":2007,"page":106},"Commands","%s · Nuxt Commands","i-lucide-square-terminal","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands","4.api\u002F4.commands\u002Fadd",[2008,2012,2017,2022,2027,2032,2037,2042,2047,2052,2057,2062,2067,2072,2077,2082],{"title":2009,"description":2010,"path":2011,"stem":2006},"nuxt add","Scaffold an entity into your Nuxt application.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fadd",{"title":2013,"description":2014,"path":2015,"stem":2016},"nuxt analyze","Analyze the production bundle or your Nuxt application.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fanalyze","4.api\u002F4.commands\u002Fanalyze",{"title":2018,"description":2019,"path":2020,"stem":2021},"nuxt build","Build your Nuxt application.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fbuild","4.api\u002F4.commands\u002Fbuild",{"title":2023,"description":2024,"path":2025,"stem":2026},"nuxt build-module","Nuxt command to build your Nuxt module before publishing.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fbuild-module","4.api\u002F4.commands\u002Fbuild-module",{"title":2028,"description":2029,"path":2030,"stem":2031},"nuxt cleanup","Remove common generated Nuxt files and caches.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fcleanup","4.api\u002F4.commands\u002Fcleanup",{"title":2033,"description":2034,"path":2035,"stem":2036},"nuxt dev","The dev command starts a development server with hot module replacement at http:\u002F\u002Flocalhost:3000","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fdev","4.api\u002F4.commands\u002Fdev",{"title":2038,"description":2039,"path":2040,"stem":2041},"nuxt devtools","The devtools command allows you to enable or disable Nuxt DevTools on a per-project basis.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fdevtools","4.api\u002F4.commands\u002Fdevtools",{"title":2043,"description":2044,"path":2045,"stem":2046},"nuxt generate","Pre-renders every route of the application and stores the result in plain HTML files.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fgenerate","4.api\u002F4.commands\u002Fgenerate",{"title":2048,"description":2049,"path":2050,"stem":2051},"nuxt info","The info command logs information about the current or specified Nuxt project.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Finfo","4.api\u002F4.commands\u002Finfo",{"title":2053,"description":2054,"path":2055,"stem":2056},"create nuxt","The init command initializes a fresh Nuxt project.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Finit","4.api\u002F4.commands\u002Finit",{"title":2058,"description":2059,"path":2060,"stem":2061},"nuxt module","Search and add modules to your Nuxt application with the command line.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fmodule","4.api\u002F4.commands\u002Fmodule",{"title":2063,"description":2064,"path":2065,"stem":2066},"nuxt prepare","The prepare command creates a .nuxt directory in your application and generates types.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fprepare","4.api\u002F4.commands\u002Fprepare",{"title":2068,"description":2069,"path":2070,"stem":2071},"nuxt preview","The preview command starts a server to preview your application after the build command.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fpreview","4.api\u002F4.commands\u002Fpreview",{"title":2073,"description":2074,"path":2075,"stem":2076},"nuxt test","The test command runs tests using @nuxt\u002Ftest-utils.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Ftest","4.api\u002F4.commands\u002Ftest",{"title":2078,"description":2079,"path":2080,"stem":2081},"nuxt typecheck","The typecheck command runs vue-tsc to check types throughout your app.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Ftypecheck","4.api\u002F4.commands\u002Ftypecheck",{"title":2083,"description":2084,"path":2085,"stem":2086},"nuxt upgrade","The upgrade command upgrades Nuxt to the latest version.","\u002Fdocs\u002F3.x\u002Fapi\u002Fcommands\u002Fupgrade","4.api\u002F4.commands\u002Fupgrade",{"title":460,"titleTemplate":906,"path":2088,"stem":908,"children":2089,"page":106},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit",[2090,2092,2094,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2117,2121,2124,2127,2130],{"title":290,"description":911,"path":2091,"stem":908},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fmodules",{"title":914,"description":915,"path":2093,"stem":917},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fprogrammatic",{"title":919,"description":920,"path":2095,"stem":922},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fcompatibility",{"title":280,"description":924,"path":2097,"stem":926},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fautoimports",{"title":501,"description":928,"path":2099,"stem":930},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fcomponents",{"title":932,"description":933,"path":2101,"stem":935},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fcontext",{"title":937,"description":938,"path":2103,"stem":940},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fpages",{"title":942,"description":943,"path":2105,"stem":945},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Flayout",{"title":947,"description":948,"path":2107,"stem":950},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fhead",{"title":952,"description":953,"path":2109,"stem":955},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fplugins",{"title":484,"description":957,"path":2111,"stem":959},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fruntime-config",{"title":961,"description":962,"path":2113,"stem":964},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Ftemplates",{"title":971,"description":972,"path":2115,"stem":2116},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fnitro","4.api\u002F5.kit\u002F11.nitro",{"title":976,"description":2118,"path":2119,"stem":2120},"Nuxt Kit provides a set of utilities to help you resolve paths. These functions allow you to resolve paths relative to the current module, with unknown name or extension.","\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fresolving","4.api\u002F5.kit\u002F12.resolving",{"title":981,"description":982,"path":2122,"stem":2123},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Flogging","4.api\u002F5.kit\u002F13.logging",{"title":986,"description":987,"path":2125,"stem":2126},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fbuilder","4.api\u002F5.kit\u002F14.builder",{"title":991,"description":992,"path":2128,"stem":2129},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Fexamples","4.api\u002F5.kit\u002F15.examples",{"title":82,"description":996,"path":2131,"stem":2132},"\u002Fdocs\u002F3.x\u002Fapi\u002Fkit\u002Flayers","4.api\u002F5.kit\u002F16.layers",{"icon":1000,"title":1001,"path":2134,"stem":1003,"children":2135,"page":106},"\u002Fdocs\u002F3.x\u002Fapi\u002Fadvanced",[2136,2138],{"title":455,"description":456,"path":2137,"stem":1003},"\u002Fdocs\u002F3.x\u002Fapi\u002Fadvanced\u002Fhooks",{"title":1008,"description":1009,"path":2139,"stem":1011},"\u002Fdocs\u002F3.x\u002Fapi\u002Fadvanced\u002Fimport-meta",{"title":1013,"description":1014,"path":2141,"stem":1016},"\u002Fdocs\u002F3.x\u002Fapi\u002Fnuxt-config",{"title":1018,"titleTemplate":1019,"icon":1020,"path":2143,"stem":1022,"children":2144,"page":106},"\u002Fdocs\u002F3.x\u002Fcommunity",[2145,2147,2149,2151,2153,2155],{"title":1025,"description":1026,"path":2146,"stem":1022,"icon":1028},"\u002Fdocs\u002F3.x\u002Fcommunity\u002Fgetting-help",{"title":1030,"description":1031,"path":2148,"stem":1033},"\u002Fdocs\u002F3.x\u002Fcommunity\u002Freporting-bugs",{"title":1035,"description":1036,"path":2150,"stem":1038},"\u002Fdocs\u002F3.x\u002Fcommunity\u002Fcontribution",{"title":1040,"description":1041,"path":2152,"stem":1043},"\u002Fdocs\u002F3.x\u002Fcommunity\u002Fframework-contribution",{"title":1045,"description":1046,"path":2154,"stem":1048},"\u002Fdocs\u002F3.x\u002Fcommunity\u002Froadmap",{"title":1050,"description":1051,"path":2156,"stem":1053},"\u002Fdocs\u002F3.x\u002Fcommunity\u002Fchangelog",{"title":1055,"titleTemplate":1056,"icon":1057,"path":2158,"stem":1059,"children":2159,"page":106},"\u002Fdocs\u002F3.x\u002Fbridge",[2160,2162,2164,2166,2168,2170,2172,2174,2176,2178],{"title":1062,"description":1063,"path":2161,"stem":1059},"\u002Fdocs\u002F3.x\u002Fbridge\u002Foverview",{"title":300,"description":1066,"path":2163,"stem":1068},"\u002Fdocs\u002F3.x\u002Fbridge\u002Ftypescript",{"title":1070,"description":1071,"path":2165,"stem":1073},"\u002Fdocs\u002F3.x\u002Fbridge\u002Fbridge-composition-api",{"title":1075,"description":1076,"path":2167,"stem":1078},"\u002Fdocs\u002F3.x\u002Fbridge\u002Fplugins-and-middleware",{"title":1080,"description":1081,"path":2169,"stem":1083},"\u002Fdocs\u002F3.x\u002Fbridge\u002Fnuxt3-compatible-api",{"title":1085,"description":1086,"path":2171,"stem":1088},"\u002Fdocs\u002F3.x\u002Fbridge\u002Fmeta",{"title":484,"description":485,"path":2173,"stem":1091},"\u002Fdocs\u002F3.x\u002Fbridge\u002Fruntime-config",{"title":971,"description":1093,"path":2175,"stem":1095},"\u002Fdocs\u002F3.x\u002Fbridge\u002Fnitro",{"title":1097,"description":1098,"path":2177,"stem":1100},"\u002Fdocs\u002F3.x\u002Fbridge\u002Fvite",{"title":27,"description":1102,"path":2179,"stem":1104},"\u002Fdocs\u002F3.x\u002Fbridge\u002Fconfiguration",{"title":1106,"titleTemplate":1107,"icon":1108,"path":2181,"stem":1110,"children":2182,"page":106},"\u002Fdocs\u002F3.x\u002Fmigration",[2183,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203],{"title":1062,"description":1113,"path":2184,"stem":1110},"\u002Fdocs\u002F3.x\u002Fmigration\u002Foverview",{"title":27,"description":1116,"path":2186,"stem":1118},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fconfiguration",{"title":1120,"description":1121,"path":2188,"stem":1123},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fauto-imports",{"title":1085,"description":1125,"path":2190,"stem":1127},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fmeta",{"title":1075,"description":1129,"path":2192,"stem":1131},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fplugins-and-middleware",{"title":1133,"description":1134,"path":2194,"stem":1136},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fpages-and-layouts",{"title":1138,"description":1139,"path":2196,"stem":1141},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fcomponent-options",{"title":484,"description":1143,"path":2198,"stem":1145},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fruntime-config",{"title":1147,"description":1148,"path":2200,"stem":1150},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fbundling",{"title":77,"description":1152,"path":2202,"stem":1154},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fserver",{"title":290,"description":1156,"path":2204,"stem":1158},"\u002Fdocs\u002F3.x\u002Fmigration\u002Fmodule-authors",{"title":2206,"icon":2207,"path":2208,"stem":2209,"children":2210,"page":106},"Blog","i-lucide-newspaper","\u002Fblog","blog",[2211,2215,2219,2223,2227,2231,2235,2239,2243,2247,2251,2255,2259,2263,2267,2271,2275,2279,2283,2287,2291,2295,2299,2303,2307,2311,2315,2319,2323,2327,2331,2335,2339,2343,2347,2351,2355,2359,2363,2367,2371,2375,2379,2383,2387,2391,2395,2399,2403,2407],{"title":2212,"path":2213,"stem":2214},"Announcing 3.0","\u002Fblog\u002Fv3","blog\u002F1.v3",{"title":2216,"path":2217,"stem":2218},"Nuxt 3.3","\u002Fblog\u002Fv3-3","blog\u002F10.v3-3",{"title":2220,"path":2221,"stem":2222},"Nuxt 3.4","\u002Fblog\u002Fv3-4","blog\u002F11.v3-4",{"title":2224,"path":2225,"stem":2226},"Nuxt 3.5","\u002Fblog\u002Fv3-5","blog\u002F12.v3-5",{"title":2228,"path":2229,"stem":2230},"Nuxt 3.6","\u002Fblog\u002Fv3-6","blog\u002F13.v3-6",{"title":2232,"path":2233,"stem":2234},"Nuxt on the Edge","\u002Fblog\u002Fnuxt-on-the-edge","blog\u002F14.nuxt-on-the-edge",{"title":2236,"path":2237,"stem":2238},"Nuxt 3.7","\u002Fblog\u002Fv3-7","blog\u002F15.v3-7",{"title":2240,"path":2241,"stem":2242},"A New Website","\u002Fblog\u002Fnew-website","blog\u002F16.new-website",{"title":2244,"path":2245,"stem":2246},"Nuxt 3.8","\u002Fblog\u002Fv3-8","blog\u002F17.v3-8",{"title":2248,"path":2249,"stem":2250},"Nuxt DevTools v1.0","\u002Fblog\u002Fnuxt-devtools-v1-0","blog\u002F18.nuxt-devtools-v1-0",{"title":2252,"path":2253,"stem":2254},"Nuxt 3.9","\u002Fblog\u002Fv3-9","blog\u002F19.v3-9",{"title":2256,"path":2257,"stem":2258},"Nuxt: A vision for 2023","\u002Fblog\u002Fvision-2023","blog\u002F2.vision-2023",{"title":2260,"path":2261,"stem":2262},"Nuxt 3.10","\u002Fblog\u002Fv3-10","blog\u002F20.v3-10",{"title":2264,"path":2265,"stem":2266},"The Evolution of Shiki v1.0","\u002Fblog\u002Fshiki-v1","blog\u002F21.shiki-v1",{"title":2268,"path":2269,"stem":2270},"Nuxt 3.11","\u002Fblog\u002Fv3-11","blog\u002F22.v3-11",{"title":2272,"path":2273,"stem":2274},"Nuxt: Looking forward","\u002Fblog\u002Flooking-forward-2024","blog\u002F23.looking-forward-2024",{"title":2276,"path":2277,"stem":2278},"Refreshed Nuxt ESLint Integrations","\u002Fblog\u002Feslint-module","blog\u002F24.eslint-module",{"title":2280,"path":2281,"stem":2282},"Nuxt 3.12","\u002Fblog\u002Fv3-12","blog\u002F25.v3-12",{"title":2284,"path":2285,"stem":2286},"Introducing Nuxt Scripts","\u002Fblog\u002Fnuxt-scripts","blog\u002F26.nuxt-scripts",{"title":2288,"path":2289,"stem":2290},"Nuxt 3.13","\u002Fblog\u002Fv3-13","blog\u002F27.v3-13",{"title":2292,"path":2293,"stem":2294},"Nuxt 3.14","\u002Fblog\u002Fv3-14","blog\u002F27.v3-14",{"title":2296,"path":2297,"stem":2298},"Introducing Nuxt Icon v1","\u002Fblog\u002Fnuxt-icon-v1-0","blog\u002F29.nuxt-icon-v1-0",{"title":2300,"path":2301,"stem":2302},"Introducing Nuxt DevTools","\u002Fblog\u002Fintroducing-nuxt-devtools","blog\u002F3.introducing-nuxt-devtools",{"title":2304,"path":2305,"stem":2306},"Announcing Nuxt 3 Release Candidate","\u002Fblog\u002Fnuxt3-rc","blog\u002F3.nuxt3-rc",{"title":2308,"path":2309,"stem":2310},"Nuxt 3.15","\u002Fblog\u002Fv3-15","blog\u002F30.v3-15",{"title":2312,"path":2313,"stem":2314},"Nuxt 3.16","\u002Fblog\u002Fv3-16","blog\u002F31.v3-16",{"title":2316,"path":2317,"stem":2318},"Nuxt UI v3","\u002Fblog\u002Fnuxt-ui-v3","blog\u002F32.nuxt-ui-v3",{"title":2320,"path":2321,"stem":2322},"Nuxt 3.17","\u002Fblog\u002Fv3-17","blog\u002F33.v3-17",{"title":2324,"path":2325,"stem":2326},"Roadmap to v4","\u002Fblog\u002Froadmap-v4","blog\u002F34.roadmap-v4",{"title":2328,"path":2329,"stem":2330},"Building a Privacy-First Feedback Widget","\u002Fblog\u002Fbuilding-a-feedback-widget","blog\u002F35.building-a-feedback-widget",{"title":2332,"path":2333,"stem":2334},"Announcing Nuxt 4.0","\u002Fblog\u002Fv4","blog\u002F36.v4",{"title":2336,"path":2337,"stem":2338},"Nuxt 3.18","\u002Fblog\u002Fv3-18","blog\u002F37.v3-18",{"title":2340,"path":2341,"stem":2342},"Nuxt 4.1","\u002Fblog\u002Fv4-1","blog\u002F38.v4-1",{"title":2344,"path":2345,"stem":2346},"Nuxt UI v4","\u002Fblog\u002Fnuxt-ui-v4","blog\u002F39.nuxt-ui-v4",{"title":2348,"path":2349,"stem":2350},"Nuxt 2 End-of-Life (EOL)","\u002Fblog\u002Fnuxt2-eol","blog\u002F4.nuxt2-eol",{"title":2352,"path":2353,"stem":2354},"Introducing Nuxt 3 Beta","\u002Fblog\u002Fnuxt3-beta","blog\u002F4.nuxt3-beta",{"title":2356,"path":2357,"stem":2358},"Building an MCP Server for Nuxt","\u002Fblog\u002Fbuilding-nuxt-mcp","blog\u002F40.building-nuxt-mcp",{"title":2360,"path":2361,"stem":2362},"Nuxt 4.2","\u002Fblog\u002Fv4-2","blog\u002F40.v4-2",{"title":2364,"path":2365,"stem":2366},"Nuxt Image v2","\u002Fblog\u002Fnuxt-image-v2","blog\u002F41.nuxt-image-v2",{"title":2368,"path":2369,"stem":2370},"Nuxt 4.3","\u002Fblog\u002Fv4-3","blog\u002F42.v4-3",{"title":2372,"path":2373,"stem":2374},"Nuxt 4.4","\u002Fblog\u002Fv4-4","blog\u002F43.v4-4",{"title":2376,"path":2377,"stem":2378},"Introducing the Nuxt Agent","\u002Fblog\u002Fintroducing-nuxt-agent","blog\u002F44.introducing-nuxt-agent",{"title":2380,"path":2381,"stem":2382},"Meet Nuxi","\u002Fblog\u002Fmeet-nuxi","blog\u002F45.meet-nuxi",{"title":2384,"path":2385,"stem":2386},"Nuxt 4.5","\u002Fblog\u002Fv4-5","blog\u002F46.v4-5",{"title":2388,"path":2389,"stem":2390},"Nuxt Security Patch Releases","\u002Fblog\u002Fv4-5-security","blog\u002F47.v4-5-security",{"title":2392,"path":2393,"stem":2394},"Going Full Static","\u002Fblog\u002Fgoing-full-static","blog\u002F5.going-full-static",{"title":2396,"path":2397,"stem":2398},"Introducing Smart Prefetching","\u002Fblog\u002Fintroducing-smart-prefetching","blog\u002F6.introducing-smart-prefetching",{"title":2400,"path":2401,"stem":2402},"Understanding how fetch works in Nuxt 2.12","\u002Fblog\u002Funderstanding-how-fetch-works-in-nuxt-2-12","blog\u002F7.understanding-how-fetch-works-in-nuxt-2-12",{"title":2404,"path":2405,"stem":2406},"Nuxt 2 Static Improvements","\u002Fblog\u002Fnuxt-static-improvements","blog\u002F8.nuxt-static-improvements",{"title":2408,"path":2409,"stem":2410},"Nuxt 2: From Terminal to Browser","\u002Fblog\u002Fnuxtjs-from-terminal-to-browser","blog\u002F9.nuxtjs-from-terminal-to-browser",{"name":2412,"description":2413,"repo":2414,"npm":2415,"icon":2416,"github":2417,"website":2417,"learn_more":2418,"category":2419,"type":2420,"maintainers":2421,"compatibility":2427,"generatedAt":2430,"contributors":2431,"stats":2459,"readme":2467},"api-shield","Nuxt API Shield - Rate Limiting","rrd108\u002Fnuxt-api-shield","nuxt-api-shield","api-shield.png","https:\u002F\u002Fgithub.com\u002Frrd108\u002Fnuxt-api-shield","","Security","3rd-party",[2422],{"name":2423,"github":2424,"twitter":2425,"bluesky":2426},"rrd","rrd108","radharadhya","rrd108.bsky.social",{"nuxt":2428,"requires":2429},">=3.0.0",{},"2026-08-30T21:31:10.317Z",[2432,2435,2439,2443,2447,2450,2453,2456],{"id":2433,"username":2424,"contributions":2434},3147489,282,{"id":2436,"username":2437,"contributions":2438},31929574,"ravesandstorm",5,{"id":2440,"username":2441,"contributions":2442},28706372,"danielroe",2,{"id":2444,"username":2445,"contributions":2446},20068593,"kschnekenburger",1,{"id":2448,"username":2449,"contributions":2446},32599710,"simonmaass",{"id":2451,"username":2452,"contributions":2446},125942725,"nd2024",{"id":2454,"username":2455,"contributions":2446},10197526,"chachew",{"id":2457,"username":2458,"contributions":2446},55457896,"LeeKrane",{"version":2460,"downloads":2461,"stars":2462,"watchers":2446,"forks":2463,"defaultBranch":2464,"publishedAt":2465,"createdAt":2466},"1.0.0",13916,56,8,"main",1782038138831,1711731542236,{"data":2468,"body":2470,"toc":10082},{"title":2469,"description":2418},"Nuxt API Shield",{"type":2471,"children":2472},"root",[2473,2480,2525,2530,2556,2562,2813,2819,2833,2943,2968,2973,3388,3406,3827,3841,3870,3975,3994,4006,4170,4175,4384,4395,4461,4680,4685,4691,4710,4717,4730,4743,5412,5436,5442,5471,5482,6707,6747,6774,6780,6786,6812,6954,6973,7176,7190,7209,7226,7244,7249,7255,7275,7281,7307,7514,7519,7529,7535,7547,7581,7587,7599,7749,7791,7796,7826,7847,7853,7858,7870,7881,7988,7996,8410,8421,8426,8477,8483,8500,8528,8532,8538,8550,9028,9034,9047,9053,9144,9150,9179,9185,9223,9229,9248,9253,9258,9550,9556,9602,9608,9614,9624,9720,9726,9817,9830,9841,9861,9867,10076],{"type":2474,"tag":2475,"props":2476,"children":2477},"element","h1",{"id":2415},[2478],{"type":2479,"value":2469},"text",{"type":2474,"tag":2481,"props":2482,"children":2483},"p",{},[2484,2497,2506,2515],{"type":2474,"tag":2485,"props":2486,"children":2490},"a",{"href":2487,"rel":2488},"https:\u002F\u002Fnpmjs.com\u002Fpackage\u002Fnuxt-api-shield",[2489],"nofollow",[2491],{"type":2474,"tag":2492,"props":2493,"children":2496},"img",{"alt":2494,"src":2495},"npm version","https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fnuxt-api-shield\u002Flatest.svg?style=flat&colorA=020420&colorB=00DC82",[],{"type":2474,"tag":2485,"props":2498,"children":2500},{"href":2487,"rel":2499},[2489],[2501],{"type":2474,"tag":2492,"props":2502,"children":2505},{"alt":2503,"src":2504},"npm downloads","https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002Fnuxt-api-shield.svg?style=flat&colorA=020420&colorB=00DC82",[],{"type":2474,"tag":2485,"props":2507,"children":2509},{"href":2487,"rel":2508},[2489],[2510],{"type":2474,"tag":2492,"props":2511,"children":2514},{"alt":2512,"src":2513},"License","https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fl\u002Fnuxt-api-shield.svg?style=flat&colorA=020420&colorB=00DC82",[],{"type":2474,"tag":2485,"props":2516,"children":2519},{"href":2517,"rel":2518},"https:\u002F\u002Fnuxt.com",[2489],[2520],{"type":2474,"tag":2492,"props":2521,"children":2524},{"alt":2522,"src":2523},"Nuxt","https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FNuxt-020420?logo=nuxt.js",[],{"type":2474,"tag":2481,"props":2526,"children":2527},{},[2528],{"type":2479,"value":2529},"This Nuxt module implements a rate limiting middleware to protect your API endpoints from excessive requests.",{"type":2474,"tag":2531,"props":2532,"children":2533},"ul",{},[2534],{"type":2474,"tag":2535,"props":2536,"children":2537},"li",{},[2538,2544],{"type":2474,"tag":2485,"props":2539,"children":2541},{"href":2540},"\u002FCHANGELOG.md",[2542],{"type":2479,"value":2543},"✨  Release Notes",{"type":2474,"tag":2531,"props":2545,"children":2546},{},[2547],{"type":2474,"tag":2535,"props":2548,"children":2549},{},[2550],{"type":2474,"tag":2485,"props":2551,"children":2553},{"href":2417,"rel":2552},[2489],[2554],{"type":2479,"value":2555},"📖  Documentation",{"type":2474,"tag":2557,"props":2558,"children":2560},"h2",{"id":2559},"features",[2561],{"type":2479,"value":450},{"type":2474,"tag":2531,"props":2563,"children":2564},{},[2565,2587,2644,2665,2686,2707,2739,2773],{"type":2474,"tag":2535,"props":2566,"children":2567},{},[2568,2574],{"type":2474,"tag":2569,"props":2570,"children":2571},"strong",{},[2572],{"type":2479,"value":2573},"IP-Based Rate limiting and Brute Force Protection",{"type":2474,"tag":2531,"props":2575,"children":2576},{},[2577,2582],{"type":2474,"tag":2535,"props":2578,"children":2579},{},[2580],{"type":2479,"value":2581},"Tracks and enforces rate limits for individual IP addresses.",{"type":2474,"tag":2535,"props":2583,"children":2584},{},[2585],{"type":2479,"value":2586},"Prevents malicious actors or excessive requests from a single source from overwhelming your API.",{"type":2474,"tag":2535,"props":2588,"children":2589},{},[2590,2595],{"type":2474,"tag":2569,"props":2591,"children":2592},{},[2593],{"type":2479,"value":2594},"Customizable Rate Limits",{"type":2474,"tag":2531,"props":2596,"children":2597},{},[2598,2603,2615,2620,2625,2639],{"type":2474,"tag":2535,"props":2599,"children":2600},{},[2601],{"type":2479,"value":2602},"Configure maximum request count, duration within which the limit applies, and a ban period for exceeding the limit.",{"type":2474,"tag":2535,"props":2604,"children":2605},{},[2606,2608,2613],{"type":2479,"value":2607},"If the request limit is exceeded, the user is banned for the configured ban period. During the ban period, ",{"type":2474,"tag":2569,"props":2609,"children":2610},{},[2611],{"type":2479,"value":2612},"all requests are blocked with a 429 error",{"type":2479,"value":2614},", regardless of the rate limit window.",{"type":2474,"tag":2535,"props":2616,"children":2617},{},[2618],{"type":2479,"value":2619},"Add a delay to responses when a user is banned to discourage further abuse (optional).",{"type":2474,"tag":2535,"props":2621,"children":2622},{},[2623],{"type":2479,"value":2624},"Customize the error message for banned users.",{"type":2474,"tag":2535,"props":2626,"children":2627},{},[2628,2630,2637],{"type":2479,"value":2629},"Optionally include the ",{"type":2474,"tag":2631,"props":2632,"children":2634},"code",{"className":2633},[],[2635],{"type":2479,"value":2636},"Retry-After",{"type":2479,"value":2638}," header in responses when a user is banned.",{"type":2474,"tag":2535,"props":2640,"children":2641},{},[2642],{"type":2479,"value":2643},"Tailor the rate-limiting behavior to align with your API's specific needs and usage patterns.",{"type":2474,"tag":2535,"props":2645,"children":2646},{},[2647,2652],{"type":2474,"tag":2569,"props":2648,"children":2649},{},[2650],{"type":2479,"value":2651},"Event-Driven Handling",{"type":2474,"tag":2531,"props":2653,"children":2654},{},[2655,2660],{"type":2474,"tag":2535,"props":2656,"children":2657},{},[2658],{"type":2479,"value":2659},"Intercepts incoming API requests efficiently using Nuxt's event system.",{"type":2474,"tag":2535,"props":2661,"children":2662},{},[2663],{"type":2479,"value":2664},"Ensures seamless integration with your Nuxt application's request lifecycle.",{"type":2474,"tag":2535,"props":2666,"children":2667},{},[2668,2673],{"type":2474,"tag":2569,"props":2669,"children":2670},{},[2671],{"type":2479,"value":2672},"Flexible Storage",{"type":2474,"tag":2531,"props":2674,"children":2675},{},[2676,2681],{"type":2474,"tag":2535,"props":2677,"children":2678},{},[2679],{"type":2479,"value":2680},"Utilizes Nuxt's unstorage abstraction for versatile storage options.",{"type":2474,"tag":2535,"props":2682,"children":2683},{},[2684],{"type":2479,"value":2685},"Store rate-limiting data in various storage providers (filesystem, memory, databases, etc.) based on your project's requirements.",{"type":2474,"tag":2535,"props":2687,"children":2688},{},[2689,2694],{"type":2474,"tag":2569,"props":2690,"children":2691},{},[2692],{"type":2479,"value":2693},"Configurable with Runtime Config",{"type":2474,"tag":2531,"props":2695,"children":2696},{},[2697,2702],{"type":2474,"tag":2535,"props":2698,"children":2699},{},[2700],{"type":2479,"value":2701},"Easily adjust rate-limiting parameters without code changes.",{"type":2474,"tag":2535,"props":2703,"children":2704},{},[2705],{"type":2479,"value":2706},"Adapt to dynamic needs and maintain control over rate-limiting behavior through Nuxt's runtime configuration.",{"type":2474,"tag":2535,"props":2708,"children":2709},{},[2710,2715],{"type":2474,"tag":2569,"props":2711,"children":2712},{},[2713],{"type":2479,"value":2714},"Bundled cleanup tasks",{"type":2474,"tag":2531,"props":2716,"children":2717},{},[2718],{"type":2474,"tag":2535,"props":2719,"children":2720},{},[2721,2723,2729,2731,2737],{"type":2479,"value":2722},"Registers Nitro tasks ",{"type":2474,"tag":2631,"props":2724,"children":2726},{"className":2725},[],[2727],{"type":2479,"value":2728},"shield:cleanBans",{"type":2479,"value":2730}," and ",{"type":2474,"tag":2631,"props":2732,"children":2734},{"className":2733},[],[2735],{"type":2479,"value":2736},"shield:cleanIpData",{"type":2479,"value":2738}," so you can schedule maintenance without adding task files (see setup step 4).",{"type":2474,"tag":2535,"props":2740,"children":2741},{},[2742,2747],{"type":2474,"tag":2569,"props":2743,"children":2744},{},[2745],{"type":2479,"value":2746},"Clear Error Handling",{"type":2474,"tag":2531,"props":2748,"children":2749},{},[2750,2755,2768],{"type":2474,"tag":2535,"props":2751,"children":2752},{},[2753],{"type":2479,"value":2754},"Returns a standardized 429 \"Too Many Requests\" error response when rate limits are exceeded or when a user is banned.",{"type":2474,"tag":2535,"props":2756,"children":2757},{},[2758,2760,2766],{"type":2479,"value":2759},"The 429 body is JSON (",{"type":2474,"tag":2631,"props":2761,"children":2763},{"className":2762},[],[2764],{"type":2479,"value":2765},"{ error, retryAfter }",{"type":2479,"value":2767},") for predictable client-side handling.",{"type":2474,"tag":2535,"props":2769,"children":2770},{},[2771],{"type":2479,"value":2772},"Facilitates proper error handling in client-side applications for a smooth user experience.",{"type":2474,"tag":2535,"props":2774,"children":2775},{},[2776,2781],{"type":2474,"tag":2569,"props":2777,"children":2778},{},[2779],{"type":2479,"value":2780},"Standard Rate-Limit Headers",{"type":2474,"tag":2531,"props":2782,"children":2783},{},[2784],{"type":2474,"tag":2535,"props":2785,"children":2786},{},[2787,2789,2795,2797,2803,2805,2811],{"type":2479,"value":2788},"Every response includes ",{"type":2474,"tag":2631,"props":2790,"children":2792},{"className":2791},[],[2793],{"type":2479,"value":2794},"X-RateLimit-Limit",{"type":2479,"value":2796},", ",{"type":2474,"tag":2631,"props":2798,"children":2800},{"className":2799},[],[2801],{"type":2479,"value":2802},"X-RateLimit-Remaining",{"type":2479,"value":2804},", and ",{"type":2474,"tag":2631,"props":2806,"children":2808},{"className":2807},[],[2809],{"type":2479,"value":2810},"X-RateLimit-Reset",{"type":2479,"value":2812}," headers so clients and CDNs can track usage without parsing response bodies.",{"type":2474,"tag":2557,"props":2814,"children":2816},{"id":2815},"quick-setup",[2817],{"type":2479,"value":2818},"Quick Setup",{"type":2474,"tag":2820,"props":2821,"children":2823},"h3",{"id":2822},"_1-add-nuxt-api-shield-dependency-to-your-project",[2824,2826,2831],{"type":2479,"value":2825},"1. Add ",{"type":2474,"tag":2631,"props":2827,"children":2829},{"className":2828},[],[2830],{"type":2479,"value":2415},{"type":2479,"value":2832}," dependency to your project",{"type":2474,"tag":2834,"props":2835,"children":2839},"pre",{"className":2836,"code":2837,"language":2838,"meta":2418,"style":2418},"language-bash shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","# Using pnpm\npnpm add nuxt-api-shield\n\n# Using yarn\nyarn add nuxt-api-shield\n\n# Using npm\nnpm install nuxt-api-shield\n","bash",[2840],{"type":2474,"tag":2631,"props":2841,"children":2842},{"__ignoreMap":2418},[2843,2854,2874,2884,2893,2909,2917,2926],{"type":2474,"tag":2844,"props":2845,"children":2847},"span",{"class":2846,"line":2446},"line",[2848],{"type":2474,"tag":2844,"props":2849,"children":2851},{"style":2850},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#90A4AE;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[2852],{"type":2479,"value":2853},"# Using pnpm\n",{"type":2474,"tag":2844,"props":2855,"children":2856},{"class":2846,"line":2442},[2857,2863,2869],{"type":2474,"tag":2844,"props":2858,"children":2860},{"style":2859},"--shiki-light:#E2931D;--shiki-default:#E2931D;--shiki-dark:#FFCB6B",[2861],{"type":2479,"value":2862},"pnpm",{"type":2474,"tag":2844,"props":2864,"children":2866},{"style":2865},"--shiki-light:#91B859;--shiki-default:#91B859;--shiki-dark:#C3E88D",[2867],{"type":2479,"value":2868}," add",{"type":2474,"tag":2844,"props":2870,"children":2871},{"style":2865},[2872],{"type":2479,"value":2873}," nuxt-api-shield\n",{"type":2474,"tag":2844,"props":2875,"children":2877},{"class":2846,"line":2876},3,[2878],{"type":2474,"tag":2844,"props":2879,"children":2881},{"emptyLinePlaceholder":2880},true,[2882],{"type":2479,"value":2883},"\n",{"type":2474,"tag":2844,"props":2885,"children":2887},{"class":2846,"line":2886},4,[2888],{"type":2474,"tag":2844,"props":2889,"children":2890},{"style":2850},[2891],{"type":2479,"value":2892},"# Using yarn\n",{"type":2474,"tag":2844,"props":2894,"children":2895},{"class":2846,"line":2438},[2896,2901,2905],{"type":2474,"tag":2844,"props":2897,"children":2898},{"style":2859},[2899],{"type":2479,"value":2900},"yarn",{"type":2474,"tag":2844,"props":2902,"children":2903},{"style":2865},[2904],{"type":2479,"value":2868},{"type":2474,"tag":2844,"props":2906,"children":2907},{"style":2865},[2908],{"type":2479,"value":2873},{"type":2474,"tag":2844,"props":2910,"children":2912},{"class":2846,"line":2911},6,[2913],{"type":2474,"tag":2844,"props":2914,"children":2915},{"emptyLinePlaceholder":2880},[2916],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":2918,"children":2920},{"class":2846,"line":2919},7,[2921],{"type":2474,"tag":2844,"props":2922,"children":2923},{"style":2850},[2924],{"type":2479,"value":2925},"# Using npm\n",{"type":2474,"tag":2844,"props":2927,"children":2928},{"class":2846,"line":2463},[2929,2934,2939],{"type":2474,"tag":2844,"props":2930,"children":2931},{"style":2859},[2932],{"type":2479,"value":2933},"npm",{"type":2474,"tag":2844,"props":2935,"children":2936},{"style":2865},[2937],{"type":2479,"value":2938}," install",{"type":2474,"tag":2844,"props":2940,"children":2941},{"style":2865},[2942],{"type":2479,"value":2873},{"type":2474,"tag":2820,"props":2944,"children":2946},{"id":2945},"_2-add-nuxt-api-shield-to-the-modules-section-of-nuxtconfigts",[2947,2949,2954,2956,2961,2963],{"type":2479,"value":2948},"2. Add ",{"type":2474,"tag":2631,"props":2950,"children":2952},{"className":2951},[],[2953],{"type":2479,"value":2415},{"type":2479,"value":2955}," to the ",{"type":2474,"tag":2631,"props":2957,"children":2959},{"className":2958},[],[2960],{"type":2479,"value":194},{"type":2479,"value":2962}," section of ",{"type":2474,"tag":2631,"props":2964,"children":2966},{"className":2965},[],[2967],{"type":2479,"value":244},{"type":2474,"tag":2481,"props":2969,"children":2970},{},[2971],{"type":2479,"value":2972},"You should add only the values you want to use differently from the default values.",{"type":2474,"tag":2834,"props":2974,"children":2978},{"className":2975,"code":2976,"language":2977,"meta":2418,"style":2418},"language-js shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","export default defineNuxtConfig({\n  modules: [\"nuxt-api-shield\"],\n  nuxtApiShield: {\n    \u002F*limit: {\n      max: 12,        \u002F\u002F maximum requests per duration time, default is 12\u002Fduration\n      duration: 108,   \u002F\u002F duration time in seconds, default is 108 seconds\n      ban: 3600,      \u002F\u002F ban time in seconds, default is 3600 seconds = 1 hour\n      \u002F\u002F If the request limit is exceeded, the user is banned for this period. During the ban, all requests are blocked with 429.\n    },\n    delayOnBan: true  \u002F\u002F delay every response with +1sec when the user is banned, default is true\n    errorMessage: \"Too Many Requests\",  \u002F\u002F error message when the user is banned, default is \"Too Many Requests\"\n    retryAfterHeader: false, \u002F\u002F when the user is banned add the Retry-After header to the response, default is false\n    log: {\n      path: \"\", \u002F\u002F path to the log file, every day a new log file will be created, use \"\" to disable logging\n      attempts: 0,    \u002F\u002F if an IP reach 0 requests (disabled), all the requests will be logged, can be used for further analysis or blocking for example with fail2ban, use 0 to disable logging\n      fail2ban: false, \u002F\u002F enable fail2ban-compatible log format for ban events (see fail2ban section)\n    },\n    routes: [], \u002F\u002F specify routes to apply rate limiting to, default is an empty array meaning all routes are protected.\n    \u002F\u002F Example:\n    \u002F\u002F routes: [\"\u002Fapi\u002Fv2\u002F\", \"\u002Fapi\u002Fv3\u002F\"], \u002F\u002F \u002Fapi\u002Fv1 will not be protected, \u002Fapi\u002Fv2\u002F and \u002Fapi\u002Fv3\u002F will be protected *\u002F\n    skipRoutes: [], \u002F\u002F specify routes to skip\u002Fexempt from rate limiting, supports wildcard patterns (*\u002F**)\n    \u002F\u002F Example:\n    \u002F\u002F skipRoutes: [\"\u002Fapi\u002Fhealth\", \"\u002Fapi\u002F_nuxt\u002F**\", \"\u002Fapi\u002Fwebhooks\u002Fstripe\"],\n    ipTTL: 604800, \u002F\u002F Optional: Time-to-live in seconds for IP tracking entries (default: 7 days). Set to 0 or negative to disable this specific cleanup.\n    security: {\n      \u002F\u002F Optional: Security-related configurations\n      trustXForwardedFor: false, \u002F\u002F Default: false. Whether to trust X-Forwarded-For headers. See warning below.\n    },\n  },\n});\n","js",[2979],{"type":2474,"tag":2631,"props":2980,"children":2981},{"__ignoreMap":2418},[2982,3014,3056,3073,3081,3089,3097,3105,3113,3122,3131,3140,3149,3158,3167,3176,3185,3193,3202,3211,3225,3253,3261,3270,3298,3315,3324,3352,3360,3369],{"type":2474,"tag":2844,"props":2983,"children":2984},{"class":2846,"line":2446},[2985,2991,2996,3002,3008],{"type":2474,"tag":2844,"props":2986,"children":2988},{"style":2987},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#39ADB5;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[2989],{"type":2479,"value":2990},"export",{"type":2474,"tag":2844,"props":2992,"children":2993},{"style":2987},[2994],{"type":2479,"value":2995}," default",{"type":2474,"tag":2844,"props":2997,"children":2999},{"style":2998},"--shiki-light:#6182B8;--shiki-default:#6182B8;--shiki-dark:#82AAFF",[3000],{"type":2479,"value":3001}," defineNuxtConfig",{"type":2474,"tag":2844,"props":3003,"children":3005},{"style":3004},"--shiki-light:#90A4AE;--shiki-default:#90A4AE;--shiki-dark:#BABED8",[3006],{"type":2479,"value":3007},"(",{"type":2474,"tag":2844,"props":3009,"children":3011},{"style":3010},"--shiki-light:#39ADB5;--shiki-default:#39ADB5;--shiki-dark:#89DDFF",[3012],{"type":2479,"value":3013},"{\n",{"type":2474,"tag":2844,"props":3015,"children":3016},{"class":2846,"line":2442},[3017,3023,3028,3033,3038,3042,3046,3051],{"type":2474,"tag":2844,"props":3018,"children":3020},{"style":3019},"--shiki-light:#E53935;--shiki-default:#E53935;--shiki-dark:#F07178",[3021],{"type":2479,"value":3022},"  modules",{"type":2474,"tag":2844,"props":3024,"children":3025},{"style":3010},[3026],{"type":2479,"value":3027},":",{"type":2474,"tag":2844,"props":3029,"children":3030},{"style":3004},[3031],{"type":2479,"value":3032}," [",{"type":2474,"tag":2844,"props":3034,"children":3035},{"style":3010},[3036],{"type":2479,"value":3037},"\"",{"type":2474,"tag":2844,"props":3039,"children":3040},{"style":2865},[3041],{"type":2479,"value":2415},{"type":2474,"tag":2844,"props":3043,"children":3044},{"style":3010},[3045],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":3047,"children":3048},{"style":3004},[3049],{"type":2479,"value":3050},"]",{"type":2474,"tag":2844,"props":3052,"children":3053},{"style":3010},[3054],{"type":2479,"value":3055},",\n",{"type":2474,"tag":2844,"props":3057,"children":3058},{"class":2846,"line":2876},[3059,3064,3068],{"type":2474,"tag":2844,"props":3060,"children":3061},{"style":3019},[3062],{"type":2479,"value":3063},"  nuxtApiShield",{"type":2474,"tag":2844,"props":3065,"children":3066},{"style":3010},[3067],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3069,"children":3070},{"style":3010},[3071],{"type":2479,"value":3072}," {\n",{"type":2474,"tag":2844,"props":3074,"children":3075},{"class":2846,"line":2886},[3076],{"type":2474,"tag":2844,"props":3077,"children":3078},{"style":2850},[3079],{"type":2479,"value":3080},"    \u002F*limit: {\n",{"type":2474,"tag":2844,"props":3082,"children":3083},{"class":2846,"line":2438},[3084],{"type":2474,"tag":2844,"props":3085,"children":3086},{"style":2850},[3087],{"type":2479,"value":3088},"      max: 12,        \u002F\u002F maximum requests per duration time, default is 12\u002Fduration\n",{"type":2474,"tag":2844,"props":3090,"children":3091},{"class":2846,"line":2911},[3092],{"type":2474,"tag":2844,"props":3093,"children":3094},{"style":2850},[3095],{"type":2479,"value":3096},"      duration: 108,   \u002F\u002F duration time in seconds, default is 108 seconds\n",{"type":2474,"tag":2844,"props":3098,"children":3099},{"class":2846,"line":2919},[3100],{"type":2474,"tag":2844,"props":3101,"children":3102},{"style":2850},[3103],{"type":2479,"value":3104},"      ban: 3600,      \u002F\u002F ban time in seconds, default is 3600 seconds = 1 hour\n",{"type":2474,"tag":2844,"props":3106,"children":3107},{"class":2846,"line":2463},[3108],{"type":2474,"tag":2844,"props":3109,"children":3110},{"style":2850},[3111],{"type":2479,"value":3112},"      \u002F\u002F If the request limit is exceeded, the user is banned for this period. During the ban, all requests are blocked with 429.\n",{"type":2474,"tag":2844,"props":3114,"children":3116},{"class":2846,"line":3115},9,[3117],{"type":2474,"tag":2844,"props":3118,"children":3119},{"style":2850},[3120],{"type":2479,"value":3121},"    },\n",{"type":2474,"tag":2844,"props":3123,"children":3125},{"class":2846,"line":3124},10,[3126],{"type":2474,"tag":2844,"props":3127,"children":3128},{"style":2850},[3129],{"type":2479,"value":3130},"    delayOnBan: true  \u002F\u002F delay every response with +1sec when the user is banned, default is true\n",{"type":2474,"tag":2844,"props":3132,"children":3134},{"class":2846,"line":3133},11,[3135],{"type":2474,"tag":2844,"props":3136,"children":3137},{"style":2850},[3138],{"type":2479,"value":3139},"    errorMessage: \"Too Many Requests\",  \u002F\u002F error message when the user is banned, default is \"Too Many Requests\"\n",{"type":2474,"tag":2844,"props":3141,"children":3143},{"class":2846,"line":3142},12,[3144],{"type":2474,"tag":2844,"props":3145,"children":3146},{"style":2850},[3147],{"type":2479,"value":3148},"    retryAfterHeader: false, \u002F\u002F when the user is banned add the Retry-After header to the response, default is false\n",{"type":2474,"tag":2844,"props":3150,"children":3152},{"class":2846,"line":3151},13,[3153],{"type":2474,"tag":2844,"props":3154,"children":3155},{"style":2850},[3156],{"type":2479,"value":3157},"    log: {\n",{"type":2474,"tag":2844,"props":3159,"children":3161},{"class":2846,"line":3160},14,[3162],{"type":2474,"tag":2844,"props":3163,"children":3164},{"style":2850},[3165],{"type":2479,"value":3166},"      path: \"\", \u002F\u002F path to the log file, every day a new log file will be created, use \"\" to disable logging\n",{"type":2474,"tag":2844,"props":3168,"children":3170},{"class":2846,"line":3169},15,[3171],{"type":2474,"tag":2844,"props":3172,"children":3173},{"style":2850},[3174],{"type":2479,"value":3175},"      attempts: 0,    \u002F\u002F if an IP reach 0 requests (disabled), all the requests will be logged, can be used for further analysis or blocking for example with fail2ban, use 0 to disable logging\n",{"type":2474,"tag":2844,"props":3177,"children":3179},{"class":2846,"line":3178},16,[3180],{"type":2474,"tag":2844,"props":3181,"children":3182},{"style":2850},[3183],{"type":2479,"value":3184},"      fail2ban: false, \u002F\u002F enable fail2ban-compatible log format for ban events (see fail2ban section)\n",{"type":2474,"tag":2844,"props":3186,"children":3188},{"class":2846,"line":3187},17,[3189],{"type":2474,"tag":2844,"props":3190,"children":3191},{"style":2850},[3192],{"type":2479,"value":3121},{"type":2474,"tag":2844,"props":3194,"children":3196},{"class":2846,"line":3195},18,[3197],{"type":2474,"tag":2844,"props":3198,"children":3199},{"style":2850},[3200],{"type":2479,"value":3201},"    routes: [], \u002F\u002F specify routes to apply rate limiting to, default is an empty array meaning all routes are protected.\n",{"type":2474,"tag":2844,"props":3203,"children":3205},{"class":2846,"line":3204},19,[3206],{"type":2474,"tag":2844,"props":3207,"children":3208},{"style":2850},[3209],{"type":2479,"value":3210},"    \u002F\u002F Example:\n",{"type":2474,"tag":2844,"props":3212,"children":3214},{"class":2846,"line":3213},20,[3215,3220],{"type":2474,"tag":2844,"props":3216,"children":3217},{"style":2850},[3218],{"type":2479,"value":3219},"    \u002F\u002F routes: [\"\u002Fapi\u002Fv2\u002F\", \"\u002Fapi\u002Fv3\u002F\"],",{"type":2474,"tag":2844,"props":3221,"children":3222},{"style":2850},[3223],{"type":2479,"value":3224}," \u002F\u002F \u002Fapi\u002Fv1 will not be protected, \u002Fapi\u002Fv2\u002F and \u002Fapi\u002Fv3\u002F will be protected *\u002F\n",{"type":2474,"tag":2844,"props":3226,"children":3228},{"class":2846,"line":3227},21,[3229,3234,3238,3243,3248],{"type":2474,"tag":2844,"props":3230,"children":3231},{"style":3019},[3232],{"type":2479,"value":3233},"    skipRoutes",{"type":2474,"tag":2844,"props":3235,"children":3236},{"style":3010},[3237],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3239,"children":3240},{"style":3004},[3241],{"type":2479,"value":3242}," []",{"type":2474,"tag":2844,"props":3244,"children":3245},{"style":3010},[3246],{"type":2479,"value":3247},",",{"type":2474,"tag":2844,"props":3249,"children":3250},{"style":2850},[3251],{"type":2479,"value":3252}," \u002F\u002F specify routes to skip\u002Fexempt from rate limiting, supports wildcard patterns (*\u002F**)\n",{"type":2474,"tag":2844,"props":3254,"children":3256},{"class":2846,"line":3255},22,[3257],{"type":2474,"tag":2844,"props":3258,"children":3259},{"style":2850},[3260],{"type":2479,"value":3210},{"type":2474,"tag":2844,"props":3262,"children":3264},{"class":2846,"line":3263},23,[3265],{"type":2474,"tag":2844,"props":3266,"children":3267},{"style":2850},[3268],{"type":2479,"value":3269},"    \u002F\u002F skipRoutes: [\"\u002Fapi\u002Fhealth\", \"\u002Fapi\u002F_nuxt\u002F**\", \"\u002Fapi\u002Fwebhooks\u002Fstripe\"],\n",{"type":2474,"tag":2844,"props":3271,"children":3273},{"class":2846,"line":3272},24,[3274,3279,3283,3289,3293],{"type":2474,"tag":2844,"props":3275,"children":3276},{"style":3019},[3277],{"type":2479,"value":3278},"    ipTTL",{"type":2474,"tag":2844,"props":3280,"children":3281},{"style":3010},[3282],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3284,"children":3286},{"style":3285},"--shiki-light:#F76D47;--shiki-default:#F76D47;--shiki-dark:#F78C6C",[3287],{"type":2479,"value":3288}," 604800",{"type":2474,"tag":2844,"props":3290,"children":3291},{"style":3010},[3292],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":3294,"children":3295},{"style":2850},[3296],{"type":2479,"value":3297}," \u002F\u002F Optional: Time-to-live in seconds for IP tracking entries (default: 7 days). Set to 0 or negative to disable this specific cleanup.\n",{"type":2474,"tag":2844,"props":3299,"children":3301},{"class":2846,"line":3300},25,[3302,3307,3311],{"type":2474,"tag":2844,"props":3303,"children":3304},{"style":3019},[3305],{"type":2479,"value":3306},"    security",{"type":2474,"tag":2844,"props":3308,"children":3309},{"style":3010},[3310],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3312,"children":3313},{"style":3010},[3314],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":3316,"children":3318},{"class":2846,"line":3317},26,[3319],{"type":2474,"tag":2844,"props":3320,"children":3321},{"style":2850},[3322],{"type":2479,"value":3323},"      \u002F\u002F Optional: Security-related configurations\n",{"type":2474,"tag":2844,"props":3325,"children":3327},{"class":2846,"line":3326},27,[3328,3333,3337,3343,3347],{"type":2474,"tag":2844,"props":3329,"children":3330},{"style":3019},[3331],{"type":2479,"value":3332},"      trustXForwardedFor",{"type":2474,"tag":2844,"props":3334,"children":3335},{"style":3010},[3336],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3338,"children":3340},{"style":3339},"--shiki-light:#FF5370;--shiki-default:#FF5370;--shiki-dark:#FF9CAC",[3341],{"type":2479,"value":3342}," false",{"type":2474,"tag":2844,"props":3344,"children":3345},{"style":3010},[3346],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":3348,"children":3349},{"style":2850},[3350],{"type":2479,"value":3351}," \u002F\u002F Default: false. Whether to trust X-Forwarded-For headers. See warning below.\n",{"type":2474,"tag":2844,"props":3353,"children":3355},{"class":2846,"line":3354},28,[3356],{"type":2474,"tag":2844,"props":3357,"children":3358},{"style":3010},[3359],{"type":2479,"value":3121},{"type":2474,"tag":2844,"props":3361,"children":3363},{"class":2846,"line":3362},29,[3364],{"type":2474,"tag":2844,"props":3365,"children":3366},{"style":3010},[3367],{"type":2479,"value":3368},"  },\n",{"type":2474,"tag":2844,"props":3370,"children":3372},{"class":2846,"line":3371},30,[3373,3378,3383],{"type":2474,"tag":2844,"props":3374,"children":3375},{"style":3010},[3376],{"type":2479,"value":3377},"}",{"type":2474,"tag":2844,"props":3379,"children":3380},{"style":3004},[3381],{"type":2479,"value":3382},")",{"type":2474,"tag":2844,"props":3384,"children":3385},{"style":3010},[3386],{"type":2479,"value":3387},";\n",{"type":2474,"tag":2481,"props":3389,"children":3390},{},[3391,3396,3398,3404],{"type":2474,"tag":2569,"props":3392,"children":3393},{},[3394],{"type":2479,"value":3395},"Default Configuration Values:",{"type":2479,"value":3397},"\n(These are applied by the module if not specified in your ",{"type":2474,"tag":2631,"props":3399,"children":3401},{"className":3400},[],[3402],{"type":2479,"value":3403},"nuxtApiShield",{"type":2479,"value":3405}," config)",{"type":2474,"tag":2834,"props":3407,"children":3409},{"className":2975,"code":3408,"language":2977,"meta":2418,"style":2418},"{\n  limit: {\n    max: 12,\n    duration: 108, \u002F\u002F seconds\n    ban: 3600,     \u002F\u002F seconds\n  },\n  delayOnBan: true,\n  errorMessage: \"Too Many Requests\",\n  retryAfterHeader: false,\n  log: {\n    path: \"\", \u002F\u002F Logging is disabled if path is empty\n    attempts: 0, \u002F\u002F Logging per IP is disabled if attempts is 0\n    fail2ban: false,\n  },\n  routes: [],\n  skipRoutes: [],\n  ipTTL: 7 * 24 * 60 * 60, \u002F\u002F 7 days in seconds\n  security: {\n    trustXForwardedFor: false,\n  }\n}\n",[3410],{"type":2474,"tag":2631,"props":3411,"children":3412},{"__ignoreMap":2418},[3413,3420,3436,3457,3483,3509,3516,3537,3567,3587,3603,3629,3655,3675,3682,3702,3722,3775,3791,3811,3819],{"type":2474,"tag":2844,"props":3414,"children":3415},{"class":2846,"line":2446},[3416],{"type":2474,"tag":2844,"props":3417,"children":3418},{"style":3010},[3419],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":3421,"children":3422},{"class":2846,"line":2442},[3423,3428,3432],{"type":2474,"tag":2844,"props":3424,"children":3425},{"style":2859},[3426],{"type":2479,"value":3427},"  limit",{"type":2474,"tag":2844,"props":3429,"children":3430},{"style":3010},[3431],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3433,"children":3434},{"style":3010},[3435],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":3437,"children":3438},{"class":2846,"line":2876},[3439,3444,3448,3453],{"type":2474,"tag":2844,"props":3440,"children":3441},{"style":2859},[3442],{"type":2479,"value":3443},"    max",{"type":2474,"tag":2844,"props":3445,"children":3446},{"style":3010},[3447],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3449,"children":3450},{"style":3285},[3451],{"type":2479,"value":3452}," 12",{"type":2474,"tag":2844,"props":3454,"children":3455},{"style":3010},[3456],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":3458,"children":3459},{"class":2846,"line":2886},[3460,3465,3469,3474,3478],{"type":2474,"tag":2844,"props":3461,"children":3462},{"style":2859},[3463],{"type":2479,"value":3464},"    duration",{"type":2474,"tag":2844,"props":3466,"children":3467},{"style":3010},[3468],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3470,"children":3471},{"style":3285},[3472],{"type":2479,"value":3473}," 108",{"type":2474,"tag":2844,"props":3475,"children":3476},{"style":3010},[3477],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":3479,"children":3480},{"style":2850},[3481],{"type":2479,"value":3482}," \u002F\u002F seconds\n",{"type":2474,"tag":2844,"props":3484,"children":3485},{"class":2846,"line":2438},[3486,3491,3495,3500,3504],{"type":2474,"tag":2844,"props":3487,"children":3488},{"style":2859},[3489],{"type":2479,"value":3490},"    ban",{"type":2474,"tag":2844,"props":3492,"children":3493},{"style":3010},[3494],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3496,"children":3497},{"style":3285},[3498],{"type":2479,"value":3499}," 3600",{"type":2474,"tag":2844,"props":3501,"children":3502},{"style":3010},[3503],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":3505,"children":3506},{"style":2850},[3507],{"type":2479,"value":3508},"     \u002F\u002F seconds\n",{"type":2474,"tag":2844,"props":3510,"children":3511},{"class":2846,"line":2911},[3512],{"type":2474,"tag":2844,"props":3513,"children":3514},{"style":3010},[3515],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":3517,"children":3518},{"class":2846,"line":2919},[3519,3524,3528,3533],{"type":2474,"tag":2844,"props":3520,"children":3521},{"style":2859},[3522],{"type":2479,"value":3523},"  delayOnBan",{"type":2474,"tag":2844,"props":3525,"children":3526},{"style":3010},[3527],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3529,"children":3530},{"style":3339},[3531],{"type":2479,"value":3532}," true",{"type":2474,"tag":2844,"props":3534,"children":3535},{"style":3010},[3536],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":3538,"children":3539},{"class":2846,"line":2463},[3540,3545,3549,3554,3559,3563],{"type":2474,"tag":2844,"props":3541,"children":3542},{"style":2859},[3543],{"type":2479,"value":3544},"  errorMessage",{"type":2474,"tag":2844,"props":3546,"children":3547},{"style":3010},[3548],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3550,"children":3551},{"style":3010},[3552],{"type":2479,"value":3553}," \"",{"type":2474,"tag":2844,"props":3555,"children":3556},{"style":2865},[3557],{"type":2479,"value":3558},"Too Many Requests",{"type":2474,"tag":2844,"props":3560,"children":3561},{"style":3010},[3562],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":3564,"children":3565},{"style":3010},[3566],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":3568,"children":3569},{"class":2846,"line":3115},[3570,3575,3579,3583],{"type":2474,"tag":2844,"props":3571,"children":3572},{"style":2859},[3573],{"type":2479,"value":3574},"  retryAfterHeader",{"type":2474,"tag":2844,"props":3576,"children":3577},{"style":3010},[3578],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3580,"children":3581},{"style":3339},[3582],{"type":2479,"value":3342},{"type":2474,"tag":2844,"props":3584,"children":3585},{"style":3010},[3586],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":3588,"children":3589},{"class":2846,"line":3124},[3590,3595,3599],{"type":2474,"tag":2844,"props":3591,"children":3592},{"style":2859},[3593],{"type":2479,"value":3594},"  log",{"type":2474,"tag":2844,"props":3596,"children":3597},{"style":3010},[3598],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3600,"children":3601},{"style":3010},[3602],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":3604,"children":3605},{"class":2846,"line":3133},[3606,3611,3615,3620,3624],{"type":2474,"tag":2844,"props":3607,"children":3608},{"style":2859},[3609],{"type":2479,"value":3610},"    path",{"type":2474,"tag":2844,"props":3612,"children":3613},{"style":3010},[3614],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3616,"children":3617},{"style":3010},[3618],{"type":2479,"value":3619}," \"\"",{"type":2474,"tag":2844,"props":3621,"children":3622},{"style":3010},[3623],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":3625,"children":3626},{"style":2850},[3627],{"type":2479,"value":3628}," \u002F\u002F Logging is disabled if path is empty\n",{"type":2474,"tag":2844,"props":3630,"children":3631},{"class":2846,"line":3142},[3632,3637,3641,3646,3650],{"type":2474,"tag":2844,"props":3633,"children":3634},{"style":2859},[3635],{"type":2479,"value":3636},"    attempts",{"type":2474,"tag":2844,"props":3638,"children":3639},{"style":3010},[3640],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3642,"children":3643},{"style":3285},[3644],{"type":2479,"value":3645}," 0",{"type":2474,"tag":2844,"props":3647,"children":3648},{"style":3010},[3649],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":3651,"children":3652},{"style":2850},[3653],{"type":2479,"value":3654}," \u002F\u002F Logging per IP is disabled if attempts is 0\n",{"type":2474,"tag":2844,"props":3656,"children":3657},{"class":2846,"line":3151},[3658,3663,3667,3671],{"type":2474,"tag":2844,"props":3659,"children":3660},{"style":2859},[3661],{"type":2479,"value":3662},"    fail2ban",{"type":2474,"tag":2844,"props":3664,"children":3665},{"style":3010},[3666],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3668,"children":3669},{"style":3339},[3670],{"type":2479,"value":3342},{"type":2474,"tag":2844,"props":3672,"children":3673},{"style":3010},[3674],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":3676,"children":3677},{"class":2846,"line":3160},[3678],{"type":2474,"tag":2844,"props":3679,"children":3680},{"style":3010},[3681],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":3683,"children":3684},{"class":2846,"line":3169},[3685,3690,3694,3698],{"type":2474,"tag":2844,"props":3686,"children":3687},{"style":2859},[3688],{"type":2479,"value":3689},"  routes",{"type":2474,"tag":2844,"props":3691,"children":3692},{"style":3010},[3693],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3695,"children":3696},{"style":3019},[3697],{"type":2479,"value":3242},{"type":2474,"tag":2844,"props":3699,"children":3700},{"style":3010},[3701],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":3703,"children":3704},{"class":2846,"line":3178},[3705,3710,3714,3718],{"type":2474,"tag":2844,"props":3706,"children":3707},{"style":2859},[3708],{"type":2479,"value":3709},"  skipRoutes",{"type":2474,"tag":2844,"props":3711,"children":3712},{"style":3010},[3713],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3715,"children":3716},{"style":3019},[3717],{"type":2479,"value":3242},{"type":2474,"tag":2844,"props":3719,"children":3720},{"style":3010},[3721],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":3723,"children":3724},{"class":2846,"line":3187},[3725,3730,3734,3739,3744,3749,3753,3758,3762,3766,3770],{"type":2474,"tag":2844,"props":3726,"children":3727},{"style":2859},[3728],{"type":2479,"value":3729},"  ipTTL",{"type":2474,"tag":2844,"props":3731,"children":3732},{"style":3010},[3733],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3735,"children":3736},{"style":3285},[3737],{"type":2479,"value":3738}," 7",{"type":2474,"tag":2844,"props":3740,"children":3741},{"style":3010},[3742],{"type":2479,"value":3743}," *",{"type":2474,"tag":2844,"props":3745,"children":3746},{"style":3285},[3747],{"type":2479,"value":3748}," 24",{"type":2474,"tag":2844,"props":3750,"children":3751},{"style":3010},[3752],{"type":2479,"value":3743},{"type":2474,"tag":2844,"props":3754,"children":3755},{"style":3285},[3756],{"type":2479,"value":3757}," 60",{"type":2474,"tag":2844,"props":3759,"children":3760},{"style":3010},[3761],{"type":2479,"value":3743},{"type":2474,"tag":2844,"props":3763,"children":3764},{"style":3285},[3765],{"type":2479,"value":3757},{"type":2474,"tag":2844,"props":3767,"children":3768},{"style":3010},[3769],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":3771,"children":3772},{"style":2850},[3773],{"type":2479,"value":3774}," \u002F\u002F 7 days in seconds\n",{"type":2474,"tag":2844,"props":3776,"children":3777},{"class":2846,"line":3195},[3778,3783,3787],{"type":2474,"tag":2844,"props":3779,"children":3780},{"style":2859},[3781],{"type":2479,"value":3782},"  security",{"type":2474,"tag":2844,"props":3784,"children":3785},{"style":3010},[3786],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3788,"children":3789},{"style":3010},[3790],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":3792,"children":3793},{"class":2846,"line":3204},[3794,3799,3803,3807],{"type":2474,"tag":2844,"props":3795,"children":3796},{"style":2859},[3797],{"type":2479,"value":3798},"    trustXForwardedFor",{"type":2474,"tag":2844,"props":3800,"children":3801},{"style":3010},[3802],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":3804,"children":3805},{"style":3339},[3806],{"type":2479,"value":3342},{"type":2474,"tag":2844,"props":3808,"children":3809},{"style":3010},[3810],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":3812,"children":3813},{"class":2846,"line":3213},[3814],{"type":2474,"tag":2844,"props":3815,"children":3816},{"style":3010},[3817],{"type":2479,"value":3818},"  }\n",{"type":2474,"tag":2844,"props":3820,"children":3821},{"class":2846,"line":3227},[3822],{"type":2474,"tag":2844,"props":3823,"children":3824},{"style":3010},[3825],{"type":2479,"value":3826},"}\n",{"type":2474,"tag":2481,"props":3828,"children":3829},{},[3830],{"type":2474,"tag":2569,"props":3831,"children":3832},{},[3833,3835],{"type":2479,"value":3834},"Security Warning: ",{"type":2474,"tag":2631,"props":3836,"children":3838},{"className":3837},[],[3839],{"type":2479,"value":3840},"trustXForwardedFor",{"type":2474,"tag":2481,"props":3842,"children":3843},{},[3844,3846,3852,3854,3860,3862,3868],{"type":2479,"value":3845},"The ",{"type":2474,"tag":2631,"props":3847,"children":3849},{"className":3848},[],[3850],{"type":2479,"value":3851},"security.trustXForwardedFor",{"type":2479,"value":3853}," option (default is ",{"type":2474,"tag":2631,"props":3855,"children":3857},{"className":3856},[],[3858],{"type":2479,"value":3859},"false",{"type":2479,"value":3861},", set by the module) determines if the module uses the ",{"type":2474,"tag":2631,"props":3863,"children":3865},{"className":3864},[],[3866],{"type":2479,"value":3867},"X-Forwarded-For",{"type":2479,"value":3869}," HTTP header to identify the client's IP address.",{"type":2474,"tag":2531,"props":3871,"children":3872},{},[3873,3893,3931,3950],{"type":2474,"tag":2535,"props":3874,"children":3875},{},[3876,3878,3884,3886,3891],{"type":2479,"value":3877},"If set to ",{"type":2474,"tag":2631,"props":3879,"children":3881},{"className":3880},[],[3882],{"type":2479,"value":3883},"true",{"type":2479,"value":3885},": The module will use the IP address provided in the ",{"type":2474,"tag":2631,"props":3887,"children":3889},{"className":3888},[],[3890],{"type":2479,"value":3867},{"type":2479,"value":3892}," header. This is common when your Nuxt application is behind a trusted reverse proxy, load balancer, or CDN (like Nginx, Cloudflare, AWS ELB\u002FALB) that correctly sets this header with the real client IP.",{"type":2474,"tag":2535,"props":3894,"children":3895},{},[3896,3901,3903,3908,3910,3915,3917,3922,3924,3929],{"type":2474,"tag":2569,"props":3897,"children":3898},{},[3899],{"type":2479,"value":3900},"WARNING:",{"type":2479,"value":3902}," If ",{"type":2474,"tag":2631,"props":3904,"children":3906},{"className":3905},[],[3907],{"type":2479,"value":3840},{"type":2479,"value":3909}," is ",{"type":2474,"tag":2631,"props":3911,"children":3913},{"className":3912},[],[3914],{"type":2479,"value":3883},{"type":2479,"value":3916}," and your application is directly internet-facing OR your proxy is not configured to strip incoming ",{"type":2474,"tag":2631,"props":3918,"children":3920},{"className":3919},[],[3921],{"type":2479,"value":3867},{"type":2479,"value":3923}," headers from clients, malicious users can spoof their IP address by sending a fake ",{"type":2474,"tag":2631,"props":3925,"children":3927},{"className":3926},[],[3928],{"type":2479,"value":3867},{"type":2479,"value":3930}," header. This would allow them to bypass rate limits or cause other users to be incorrectly rate-limited.",{"type":2474,"tag":2535,"props":3932,"children":3933},{},[3934,3935,3940,3942,3948],{"type":2479,"value":3877},{"type":2474,"tag":2631,"props":3936,"children":3938},{"className":3937},[],[3939],{"type":2479,"value":3859},{"type":2479,"value":3941},": The module will use the direct IP address of the incoming connection (i.e., ",{"type":2474,"tag":2631,"props":3943,"children":3945},{"className":3944},[],[3946],{"type":2479,"value":3947},"event.node.req.socket.remoteAddress",{"type":2479,"value":3949},"). Use this setting if your application is directly internet-facing or if you are unsure about your proxy's configuration.",{"type":2474,"tag":2535,"props":3951,"children":3952},{},[3953,3958,3960,3966,3968,3973],{"type":2474,"tag":2569,"props":3954,"children":3955},{},[3956],{"type":2479,"value":3957},"Recommendation:",{"type":2479,"value":3959}," Only enable ",{"type":2474,"tag":2631,"props":3961,"children":3963},{"className":3962},[],[3964],{"type":2479,"value":3965},"trustXForwardedFor: true",{"type":2479,"value":3967}," if you are certain your reverse proxy is correctly configured to set this header and strip any client-sent versions of it. Otherwise, set it to ",{"type":2474,"tag":2631,"props":3969,"children":3971},{"className":3970},[],[3972],{"type":2479,"value":3859},{"type":2479,"value":3974},".",{"type":2474,"tag":2820,"props":3976,"children":3978},{"id":3977},"_3-add-nitrostorage-to-nuxtconfigts",[3979,3981,3987,3989],{"type":2479,"value":3980},"3. Add ",{"type":2474,"tag":2631,"props":3982,"children":3984},{"className":3983},[],[3985],{"type":2479,"value":3986},"nitro\u002Fstorage",{"type":2479,"value":3988}," to ",{"type":2474,"tag":2631,"props":3990,"children":3992},{"className":3991},[],[3993],{"type":2479,"value":244},{"type":2474,"tag":2481,"props":3995,"children":3996},{},[3997,3999,4004],{"type":2479,"value":3998},"You can use any storage you want, but you have to use ",{"type":2474,"tag":2569,"props":4000,"children":4001},{},[4002],{"type":2479,"value":4003},"shield",{"type":2479,"value":4005}," as the name of the storage.",{"type":2474,"tag":2834,"props":4007,"children":4011},{"className":4008,"code":4009,"language":4010,"meta":2418,"style":2418},"language-json shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","{\n  \"nitro\": {\n    \"storage\": {\n      \"shield\": {\n        \u002F\u002F storage name, you **must** use \"shield\" as the name\n        \"driver\": \"memory\"\n      }\n    }\n  }\n}\n","json",[4012],{"type":2474,"tag":2631,"props":4013,"children":4014},{"__ignoreMap":2418},[4015,4022,4048,4073,4097,4105,4140,4148,4156,4163],{"type":2474,"tag":2844,"props":4016,"children":4017},{"class":2846,"line":2446},[4018],{"type":2474,"tag":2844,"props":4019,"children":4020},{"style":3010},[4021],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":4023,"children":4024},{"class":2846,"line":2442},[4025,4030,4036,4040,4044],{"type":2474,"tag":2844,"props":4026,"children":4027},{"style":3010},[4028],{"type":2479,"value":4029},"  \"",{"type":2474,"tag":2844,"props":4031,"children":4033},{"style":4032},"--shiki-light:#9C3EDA;--shiki-default:#9C3EDA;--shiki-dark:#C792EA",[4034],{"type":2479,"value":4035},"nitro",{"type":2474,"tag":2844,"props":4037,"children":4038},{"style":3010},[4039],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4041,"children":4042},{"style":3010},[4043],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4045,"children":4046},{"style":3010},[4047],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4049,"children":4050},{"class":2846,"line":2876},[4051,4056,4061,4065,4069],{"type":2474,"tag":2844,"props":4052,"children":4053},{"style":3010},[4054],{"type":2479,"value":4055},"    \"",{"type":2474,"tag":2844,"props":4057,"children":4058},{"style":2859},[4059],{"type":2479,"value":4060},"storage",{"type":2474,"tag":2844,"props":4062,"children":4063},{"style":3010},[4064],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4066,"children":4067},{"style":3010},[4068],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4070,"children":4071},{"style":3010},[4072],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4074,"children":4075},{"class":2846,"line":2886},[4076,4081,4085,4089,4093],{"type":2474,"tag":2844,"props":4077,"children":4078},{"style":3010},[4079],{"type":2479,"value":4080},"      \"",{"type":2474,"tag":2844,"props":4082,"children":4083},{"style":3285},[4084],{"type":2479,"value":4003},{"type":2474,"tag":2844,"props":4086,"children":4087},{"style":3010},[4088],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4090,"children":4091},{"style":3010},[4092],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4094,"children":4095},{"style":3010},[4096],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4098,"children":4099},{"class":2846,"line":2438},[4100],{"type":2474,"tag":2844,"props":4101,"children":4102},{"style":2850},[4103],{"type":2479,"value":4104},"        \u002F\u002F storage name, you **must** use \"shield\" as the name\n",{"type":2474,"tag":2844,"props":4106,"children":4107},{"class":2846,"line":2911},[4108,4113,4118,4122,4126,4130,4135],{"type":2474,"tag":2844,"props":4109,"children":4110},{"style":3010},[4111],{"type":2479,"value":4112},"        \"",{"type":2474,"tag":2844,"props":4114,"children":4115},{"style":3019},[4116],{"type":2479,"value":4117},"driver",{"type":2474,"tag":2844,"props":4119,"children":4120},{"style":3010},[4121],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4123,"children":4124},{"style":3010},[4125],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4127,"children":4128},{"style":3010},[4129],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":4131,"children":4132},{"style":2865},[4133],{"type":2479,"value":4134},"memory",{"type":2474,"tag":2844,"props":4136,"children":4137},{"style":3010},[4138],{"type":2479,"value":4139},"\"\n",{"type":2474,"tag":2844,"props":4141,"children":4142},{"class":2846,"line":2919},[4143],{"type":2474,"tag":2844,"props":4144,"children":4145},{"style":3010},[4146],{"type":2479,"value":4147},"      }\n",{"type":2474,"tag":2844,"props":4149,"children":4150},{"class":2846,"line":2463},[4151],{"type":2474,"tag":2844,"props":4152,"children":4153},{"style":3010},[4154],{"type":2479,"value":4155},"    }\n",{"type":2474,"tag":2844,"props":4157,"children":4158},{"class":2846,"line":3115},[4159],{"type":2474,"tag":2844,"props":4160,"children":4161},{"style":3010},[4162],{"type":2479,"value":3818},{"type":2474,"tag":2844,"props":4164,"children":4165},{"class":2846,"line":3124},[4166],{"type":2474,"tag":2844,"props":4167,"children":4168},{"style":3010},[4169],{"type":2479,"value":3826},{"type":2474,"tag":2481,"props":4171,"children":4172},{},[4173],{"type":2479,"value":4174},"If you use for example redis, you can use the following configuration, define the host and port.",{"type":2474,"tag":2834,"props":4176,"children":4178},{"className":4008,"code":4177,"language":4010,"meta":2418,"style":2418},"{\n  \"nitro\": {\n    \"storage\": {\n      \"shield\": {\n        \"driver\": \"redis\",\n        \"host\": \"localhost\",\n        \"port\": 6379\n      }\n    }\n  }\n}\n",[4179],{"type":2474,"tag":2631,"props":4180,"children":4181},{"__ignoreMap":2418},[4182,4189,4212,4235,4258,4294,4331,4356,4363,4370,4377],{"type":2474,"tag":2844,"props":4183,"children":4184},{"class":2846,"line":2446},[4185],{"type":2474,"tag":2844,"props":4186,"children":4187},{"style":3010},[4188],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":4190,"children":4191},{"class":2846,"line":2442},[4192,4196,4200,4204,4208],{"type":2474,"tag":2844,"props":4193,"children":4194},{"style":3010},[4195],{"type":2479,"value":4029},{"type":2474,"tag":2844,"props":4197,"children":4198},{"style":4032},[4199],{"type":2479,"value":4035},{"type":2474,"tag":2844,"props":4201,"children":4202},{"style":3010},[4203],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4205,"children":4206},{"style":3010},[4207],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4209,"children":4210},{"style":3010},[4211],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4213,"children":4214},{"class":2846,"line":2876},[4215,4219,4223,4227,4231],{"type":2474,"tag":2844,"props":4216,"children":4217},{"style":3010},[4218],{"type":2479,"value":4055},{"type":2474,"tag":2844,"props":4220,"children":4221},{"style":2859},[4222],{"type":2479,"value":4060},{"type":2474,"tag":2844,"props":4224,"children":4225},{"style":3010},[4226],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4228,"children":4229},{"style":3010},[4230],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4232,"children":4233},{"style":3010},[4234],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4236,"children":4237},{"class":2846,"line":2886},[4238,4242,4246,4250,4254],{"type":2474,"tag":2844,"props":4239,"children":4240},{"style":3010},[4241],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":4243,"children":4244},{"style":3285},[4245],{"type":2479,"value":4003},{"type":2474,"tag":2844,"props":4247,"children":4248},{"style":3010},[4249],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4251,"children":4252},{"style":3010},[4253],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4255,"children":4256},{"style":3010},[4257],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4259,"children":4260},{"class":2846,"line":2438},[4261,4265,4269,4273,4277,4281,4286,4290],{"type":2474,"tag":2844,"props":4262,"children":4263},{"style":3010},[4264],{"type":2479,"value":4112},{"type":2474,"tag":2844,"props":4266,"children":4267},{"style":3019},[4268],{"type":2479,"value":4117},{"type":2474,"tag":2844,"props":4270,"children":4271},{"style":3010},[4272],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4274,"children":4275},{"style":3010},[4276],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4278,"children":4279},{"style":3010},[4280],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":4282,"children":4283},{"style":2865},[4284],{"type":2479,"value":4285},"redis",{"type":2474,"tag":2844,"props":4287,"children":4288},{"style":3010},[4289],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4291,"children":4292},{"style":3010},[4293],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":4295,"children":4296},{"class":2846,"line":2911},[4297,4301,4306,4310,4314,4318,4323,4327],{"type":2474,"tag":2844,"props":4298,"children":4299},{"style":3010},[4300],{"type":2479,"value":4112},{"type":2474,"tag":2844,"props":4302,"children":4303},{"style":3019},[4304],{"type":2479,"value":4305},"host",{"type":2474,"tag":2844,"props":4307,"children":4308},{"style":3010},[4309],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4311,"children":4312},{"style":3010},[4313],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4315,"children":4316},{"style":3010},[4317],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":4319,"children":4320},{"style":2865},[4321],{"type":2479,"value":4322},"localhost",{"type":2474,"tag":2844,"props":4324,"children":4325},{"style":3010},[4326],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4328,"children":4329},{"style":3010},[4330],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":4332,"children":4333},{"class":2846,"line":2919},[4334,4338,4343,4347,4351],{"type":2474,"tag":2844,"props":4335,"children":4336},{"style":3010},[4337],{"type":2479,"value":4112},{"type":2474,"tag":2844,"props":4339,"children":4340},{"style":3019},[4341],{"type":2479,"value":4342},"port",{"type":2474,"tag":2844,"props":4344,"children":4345},{"style":3010},[4346],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4348,"children":4349},{"style":3010},[4350],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4352,"children":4353},{"style":3285},[4354],{"type":2479,"value":4355}," 6379\n",{"type":2474,"tag":2844,"props":4357,"children":4358},{"class":2846,"line":2463},[4359],{"type":2474,"tag":2844,"props":4360,"children":4361},{"style":3010},[4362],{"type":2479,"value":4147},{"type":2474,"tag":2844,"props":4364,"children":4365},{"class":2846,"line":3115},[4366],{"type":2474,"tag":2844,"props":4367,"children":4368},{"style":3010},[4369],{"type":2479,"value":4155},{"type":2474,"tag":2844,"props":4371,"children":4372},{"class":2846,"line":3124},[4373],{"type":2474,"tag":2844,"props":4374,"children":4375},{"style":3010},[4376],{"type":2479,"value":3818},{"type":2474,"tag":2844,"props":4378,"children":4379},{"class":2846,"line":3133},[4380],{"type":2474,"tag":2844,"props":4381,"children":4382},{"style":3010},[4383],{"type":2479,"value":3826},{"type":2474,"tag":2820,"props":4385,"children":4387},{"id":4386},"_4-schedule-bundled-cleanup-tasks-in-nuxtconfigts",[4388,4390],{"type":2479,"value":4389},"4. Schedule bundled cleanup tasks in ",{"type":2474,"tag":2631,"props":4391,"children":4393},{"className":4392},[],[4394],{"type":2479,"value":244},{"type":2474,"tag":2481,"props":4396,"children":4397},{},[4398,4400,4405,4407,4413,4415,4420,4422,4428,4430,4436,4438,4444,4446,4451,4453,4459],{"type":2479,"value":4399},"The module registers two Nitro tasks for you: ",{"type":2474,"tag":2631,"props":4401,"children":4403},{"className":4402},[],[4404],{"type":2479,"value":2728},{"type":2479,"value":4406}," (removes expired ",{"type":2474,"tag":2631,"props":4408,"children":4410},{"className":4409},[],[4411],{"type":2479,"value":4412},"ban:*",{"type":2479,"value":4414}," keys) and ",{"type":2474,"tag":2631,"props":4416,"children":4418},{"className":4417},[],[4419],{"type":2479,"value":2736},{"type":2479,"value":4421}," (removes stale ",{"type":2474,"tag":2631,"props":4423,"children":4425},{"className":4424},[],[4426],{"type":2479,"value":4427},"ip:*",{"type":2479,"value":4429}," keys using ",{"type":2474,"tag":2631,"props":4431,"children":4433},{"className":4432},[],[4434],{"type":2479,"value":4435},"ipTTL",{"type":2479,"value":4437},"). Turn on Nitro tasks and add ",{"type":2474,"tag":2631,"props":4439,"children":4441},{"className":4440},[],[4442],{"type":2479,"value":4443},"scheduledTasks",{"type":2479,"value":4445}," so they run on a cadence you choose. You do ",{"type":2474,"tag":2569,"props":4447,"children":4448},{},[4449],{"type":2479,"value":4450},"not",{"type":2479,"value":4452}," need files under ",{"type":2474,"tag":2631,"props":4454,"children":4456},{"className":4455},[],[4457],{"type":2479,"value":4458},"server\u002Ftasks\u002F",{"type":2479,"value":4460}," for this default setup.",{"type":2474,"tag":2834,"props":4462,"children":4464},{"className":4008,"code":4463,"language":4010,"meta":2418,"style":2418},"{\n  \"nitro\": {\n    \"experimental\": {\n      \"tasks\": true\n    },\n    \"scheduledTasks\": {\n      \"*\u002F15 * * * *\": [\"shield:cleanBans\"],\n      \"0 0 * * *\": [\"shield:cleanIpData\"]\n    }\n  }\n}\n",[4465],{"type":2474,"tag":2631,"props":4466,"children":4467},{"__ignoreMap":2418},[4468,4475,4498,4522,4547,4554,4577,4618,4659,4666,4673],{"type":2474,"tag":2844,"props":4469,"children":4470},{"class":2846,"line":2446},[4471],{"type":2474,"tag":2844,"props":4472,"children":4473},{"style":3010},[4474],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":4476,"children":4477},{"class":2846,"line":2442},[4478,4482,4486,4490,4494],{"type":2474,"tag":2844,"props":4479,"children":4480},{"style":3010},[4481],{"type":2479,"value":4029},{"type":2474,"tag":2844,"props":4483,"children":4484},{"style":4032},[4485],{"type":2479,"value":4035},{"type":2474,"tag":2844,"props":4487,"children":4488},{"style":3010},[4489],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4491,"children":4492},{"style":3010},[4493],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4495,"children":4496},{"style":3010},[4497],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4499,"children":4500},{"class":2846,"line":2876},[4501,4505,4510,4514,4518],{"type":2474,"tag":2844,"props":4502,"children":4503},{"style":3010},[4504],{"type":2479,"value":4055},{"type":2474,"tag":2844,"props":4506,"children":4507},{"style":2859},[4508],{"type":2479,"value":4509},"experimental",{"type":2474,"tag":2844,"props":4511,"children":4512},{"style":3010},[4513],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4515,"children":4516},{"style":3010},[4517],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4519,"children":4520},{"style":3010},[4521],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4523,"children":4524},{"class":2846,"line":2886},[4525,4529,4534,4538,4542],{"type":2474,"tag":2844,"props":4526,"children":4527},{"style":3010},[4528],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":4530,"children":4531},{"style":3285},[4532],{"type":2479,"value":4533},"tasks",{"type":2474,"tag":2844,"props":4535,"children":4536},{"style":3010},[4537],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4539,"children":4540},{"style":3010},[4541],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4543,"children":4544},{"style":3010},[4545],{"type":2479,"value":4546}," true\n",{"type":2474,"tag":2844,"props":4548,"children":4549},{"class":2846,"line":2438},[4550],{"type":2474,"tag":2844,"props":4551,"children":4552},{"style":3010},[4553],{"type":2479,"value":3121},{"type":2474,"tag":2844,"props":4555,"children":4556},{"class":2846,"line":2911},[4557,4561,4565,4569,4573],{"type":2474,"tag":2844,"props":4558,"children":4559},{"style":3010},[4560],{"type":2479,"value":4055},{"type":2474,"tag":2844,"props":4562,"children":4563},{"style":2859},[4564],{"type":2479,"value":4443},{"type":2474,"tag":2844,"props":4566,"children":4567},{"style":3010},[4568],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4570,"children":4571},{"style":3010},[4572],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4574,"children":4575},{"style":3010},[4576],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4578,"children":4579},{"class":2846,"line":2919},[4580,4584,4589,4593,4597,4601,4605,4609,4613],{"type":2474,"tag":2844,"props":4581,"children":4582},{"style":3010},[4583],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":4585,"children":4586},{"style":3285},[4587],{"type":2479,"value":4588},"*\u002F15 * * * *",{"type":2474,"tag":2844,"props":4590,"children":4591},{"style":3010},[4592],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4594,"children":4595},{"style":3010},[4596],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4598,"children":4599},{"style":3010},[4600],{"type":2479,"value":3032},{"type":2474,"tag":2844,"props":4602,"children":4603},{"style":3010},[4604],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4606,"children":4607},{"style":2865},[4608],{"type":2479,"value":2728},{"type":2474,"tag":2844,"props":4610,"children":4611},{"style":3010},[4612],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4614,"children":4615},{"style":3010},[4616],{"type":2479,"value":4617},"],\n",{"type":2474,"tag":2844,"props":4619,"children":4620},{"class":2846,"line":2463},[4621,4625,4630,4634,4638,4642,4646,4650,4654],{"type":2474,"tag":2844,"props":4622,"children":4623},{"style":3010},[4624],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":4626,"children":4627},{"style":3285},[4628],{"type":2479,"value":4629},"0 0 * * *",{"type":2474,"tag":2844,"props":4631,"children":4632},{"style":3010},[4633],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4635,"children":4636},{"style":3010},[4637],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4639,"children":4640},{"style":3010},[4641],{"type":2479,"value":3032},{"type":2474,"tag":2844,"props":4643,"children":4644},{"style":3010},[4645],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4647,"children":4648},{"style":2865},[4649],{"type":2479,"value":2736},{"type":2474,"tag":2844,"props":4651,"children":4652},{"style":3010},[4653],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4655,"children":4656},{"style":3010},[4657],{"type":2479,"value":4658},"]\n",{"type":2474,"tag":2844,"props":4660,"children":4661},{"class":2846,"line":3115},[4662],{"type":2474,"tag":2844,"props":4663,"children":4664},{"style":3010},[4665],{"type":2479,"value":4155},{"type":2474,"tag":2844,"props":4667,"children":4668},{"class":2846,"line":3124},[4669],{"type":2474,"tag":2844,"props":4670,"children":4671},{"style":3010},[4672],{"type":2479,"value":3818},{"type":2474,"tag":2844,"props":4674,"children":4675},{"class":2846,"line":3133},[4676],{"type":2474,"tag":2844,"props":4677,"children":4678},{"style":3010},[4679],{"type":2479,"value":3826},{"type":2474,"tag":2481,"props":4681,"children":4682},{},[4683],{"type":2479,"value":4684},"Cron expressions are examples only: for instance, clean expired bans every 15 minutes and IP tracking data daily at midnight.",{"type":2474,"tag":2820,"props":4686,"children":4688},{"id":4687},"_5-optional-custom-cleanup-task-implementations",[4689],{"type":2479,"value":4690},"5. Optional: custom cleanup task implementations",{"type":2474,"tag":2481,"props":4692,"children":4693},{},[4694,4696,4701,4703,4708],{"type":2479,"value":4695},"Skip this unless you need behavior different from the bundled handlers (for example extra logging, metrics, or storage layout). The snippets below mirror what the module already ships; they are useful as a reference or if you define ",{"type":2474,"tag":2569,"props":4697,"children":4698},{},[4699],{"type":2479,"value":4700},"another",{"type":2479,"value":4702}," task name and point ",{"type":2474,"tag":2631,"props":4704,"children":4706},{"className":4705},[],[4707],{"type":2479,"value":4443},{"type":2479,"value":4709}," at that name instead.",{"type":2474,"tag":4711,"props":4712,"children":4714},"h4",{"id":4713},"a-task-for-cleaning-expired-bans",[4715],{"type":2479,"value":4716},"a) Task for cleaning expired bans",{"type":2474,"tag":2481,"props":4718,"children":4719},{},[4720,4722,4728],{"type":2479,"value":4721},"Removes ban entries (",{"type":2474,"tag":2631,"props":4723,"children":4725},{"className":4724},[],[4726],{"type":2479,"value":4727},"ban:xxx.xxx.xxx.xxx",{"type":2479,"value":4729},") after the ban timestamp has passed.",{"type":2474,"tag":2481,"props":4731,"children":4732},{},[4733,4735,4741],{"type":2479,"value":4734},"Example ",{"type":2474,"tag":2631,"props":4736,"children":4738},{"className":4737},[],[4739],{"type":2479,"value":4740},"server\u002Ftasks\u002Fshield\u002FcleanBans.ts",{"type":2479,"value":4742}," (task name must match what you schedule):",{"type":2474,"tag":2834,"props":4744,"children":4748},{"className":4745,"code":4746,"language":4747,"meta":2418,"style":2418},"language-ts shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","import { isActualBanTimestampExpired } from \"#imports\"; \u002F\u002F Auto-imported utility from nuxt-api-shield\n\nexport default defineTask({\n  meta: {\n    name: \"shield:cleanBans\", \u002F\u002F Match the name in scheduledTasks\n    description: \"Clean expired bans from nuxt-api-shield storage.\",\n  },\n  async run() {\n    const shieldStorage = useStorage(\"shield\"); \u002F\u002F Use your configured storage name\n\n    \u002F\u002F Only fetch keys that start with the 'ban:' prefix\n    const banKeys = await shieldStorage.getKeys(\"ban:\");\n\n    let cleanedCount = 0;\n    for (const key of banKeys) {\n      const bannedUntilRaw = await shieldStorage.getItem(key);\n      if (isActualBanTimestampExpired(bannedUntilRaw)) {\n        await shieldStorage.removeItem(key);\n        cleanedCount++;\n      }\n    }\n    console.log(`[nuxt-api-shield] Cleaned ${cleanedCount} expired ban(s).`);\n    return { result: { cleanedCount } };\n  },\n});\n","ts",[4749],{"type":2474,"tag":2631,"props":4750,"children":4751},{"__ignoreMap":2418},[4752,4803,4810,4834,4850,4883,4912,4919,4941,4993,5000,5008,5067,5074,5099,5140,5191,5226,5263,5276,5283,5290,5352,5390,5397],{"type":2474,"tag":2844,"props":4753,"children":4754},{"class":2846,"line":2446},[4755,4760,4765,4770,4775,4780,4784,4789,4793,4798],{"type":2474,"tag":2844,"props":4756,"children":4757},{"style":2987},[4758],{"type":2479,"value":4759},"import",{"type":2474,"tag":2844,"props":4761,"children":4762},{"style":3010},[4763],{"type":2479,"value":4764}," {",{"type":2474,"tag":2844,"props":4766,"children":4767},{"style":3004},[4768],{"type":2479,"value":4769}," isActualBanTimestampExpired",{"type":2474,"tag":2844,"props":4771,"children":4772},{"style":3010},[4773],{"type":2479,"value":4774}," }",{"type":2474,"tag":2844,"props":4776,"children":4777},{"style":2987},[4778],{"type":2479,"value":4779}," from",{"type":2474,"tag":2844,"props":4781,"children":4782},{"style":3010},[4783],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":4785,"children":4786},{"style":2865},[4787],{"type":2479,"value":4788},"#imports",{"type":2474,"tag":2844,"props":4790,"children":4791},{"style":3010},[4792],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4794,"children":4795},{"style":3010},[4796],{"type":2479,"value":4797},";",{"type":2474,"tag":2844,"props":4799,"children":4800},{"style":2850},[4801],{"type":2479,"value":4802}," \u002F\u002F Auto-imported utility from nuxt-api-shield\n",{"type":2474,"tag":2844,"props":4804,"children":4805},{"class":2846,"line":2442},[4806],{"type":2474,"tag":2844,"props":4807,"children":4808},{"emptyLinePlaceholder":2880},[4809],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":4811,"children":4812},{"class":2846,"line":2876},[4813,4817,4821,4826,4830],{"type":2474,"tag":2844,"props":4814,"children":4815},{"style":2987},[4816],{"type":2479,"value":2990},{"type":2474,"tag":2844,"props":4818,"children":4819},{"style":2987},[4820],{"type":2479,"value":2995},{"type":2474,"tag":2844,"props":4822,"children":4823},{"style":2998},[4824],{"type":2479,"value":4825}," defineTask",{"type":2474,"tag":2844,"props":4827,"children":4828},{"style":3004},[4829],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":4831,"children":4832},{"style":3010},[4833],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":4835,"children":4836},{"class":2846,"line":2886},[4837,4842,4846],{"type":2474,"tag":2844,"props":4838,"children":4839},{"style":3019},[4840],{"type":2479,"value":4841},"  meta",{"type":2474,"tag":2844,"props":4843,"children":4844},{"style":3010},[4845],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4847,"children":4848},{"style":3010},[4849],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4851,"children":4852},{"class":2846,"line":2438},[4853,4858,4862,4866,4870,4874,4878],{"type":2474,"tag":2844,"props":4854,"children":4855},{"style":3019},[4856],{"type":2479,"value":4857},"    name",{"type":2474,"tag":2844,"props":4859,"children":4860},{"style":3010},[4861],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4863,"children":4864},{"style":3010},[4865],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":4867,"children":4868},{"style":2865},[4869],{"type":2479,"value":2728},{"type":2474,"tag":2844,"props":4871,"children":4872},{"style":3010},[4873],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4875,"children":4876},{"style":3010},[4877],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":4879,"children":4880},{"style":2850},[4881],{"type":2479,"value":4882}," \u002F\u002F Match the name in scheduledTasks\n",{"type":2474,"tag":2844,"props":4884,"children":4885},{"class":2846,"line":2911},[4886,4891,4895,4899,4904,4908],{"type":2474,"tag":2844,"props":4887,"children":4888},{"style":3019},[4889],{"type":2479,"value":4890},"    description",{"type":2474,"tag":2844,"props":4892,"children":4893},{"style":3010},[4894],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":4896,"children":4897},{"style":3010},[4898],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":4900,"children":4901},{"style":2865},[4902],{"type":2479,"value":4903},"Clean expired bans from nuxt-api-shield storage.",{"type":2474,"tag":2844,"props":4905,"children":4906},{"style":3010},[4907],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4909,"children":4910},{"style":3010},[4911],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":4913,"children":4914},{"class":2846,"line":2919},[4915],{"type":2474,"tag":2844,"props":4916,"children":4917},{"style":3010},[4918],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":4920,"children":4921},{"class":2846,"line":2463},[4922,4927,4932,4937],{"type":2474,"tag":2844,"props":4923,"children":4924},{"style":4032},[4925],{"type":2479,"value":4926},"  async",{"type":2474,"tag":2844,"props":4928,"children":4929},{"style":3019},[4930],{"type":2479,"value":4931}," run",{"type":2474,"tag":2844,"props":4933,"children":4934},{"style":3010},[4935],{"type":2479,"value":4936},"()",{"type":2474,"tag":2844,"props":4938,"children":4939},{"style":3010},[4940],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":4942,"children":4943},{"class":2846,"line":3115},[4944,4949,4954,4959,4964,4968,4972,4976,4980,4984,4988],{"type":2474,"tag":2844,"props":4945,"children":4946},{"style":4032},[4947],{"type":2479,"value":4948},"    const",{"type":2474,"tag":2844,"props":4950,"children":4951},{"style":3004},[4952],{"type":2479,"value":4953}," shieldStorage",{"type":2474,"tag":2844,"props":4955,"children":4956},{"style":3010},[4957],{"type":2479,"value":4958}," =",{"type":2474,"tag":2844,"props":4960,"children":4961},{"style":2998},[4962],{"type":2479,"value":4963}," useStorage",{"type":2474,"tag":2844,"props":4965,"children":4966},{"style":3019},[4967],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":4969,"children":4970},{"style":3010},[4971],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4973,"children":4974},{"style":2865},[4975],{"type":2479,"value":4003},{"type":2474,"tag":2844,"props":4977,"children":4978},{"style":3010},[4979],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":4981,"children":4982},{"style":3019},[4983],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":4985,"children":4986},{"style":3010},[4987],{"type":2479,"value":4797},{"type":2474,"tag":2844,"props":4989,"children":4990},{"style":2850},[4991],{"type":2479,"value":4992}," \u002F\u002F Use your configured storage name\n",{"type":2474,"tag":2844,"props":4994,"children":4995},{"class":2846,"line":3124},[4996],{"type":2474,"tag":2844,"props":4997,"children":4998},{"emptyLinePlaceholder":2880},[4999],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":5001,"children":5002},{"class":2846,"line":3133},[5003],{"type":2474,"tag":2844,"props":5004,"children":5005},{"style":2850},[5006],{"type":2479,"value":5007},"    \u002F\u002F Only fetch keys that start with the 'ban:' prefix\n",{"type":2474,"tag":2844,"props":5009,"children":5010},{"class":2846,"line":3142},[5011,5015,5020,5024,5029,5033,5037,5042,5046,5050,5055,5059,5063],{"type":2474,"tag":2844,"props":5012,"children":5013},{"style":4032},[5014],{"type":2479,"value":4948},{"type":2474,"tag":2844,"props":5016,"children":5017},{"style":3004},[5018],{"type":2479,"value":5019}," banKeys",{"type":2474,"tag":2844,"props":5021,"children":5022},{"style":3010},[5023],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":5025,"children":5026},{"style":2987},[5027],{"type":2479,"value":5028}," await",{"type":2474,"tag":2844,"props":5030,"children":5031},{"style":3004},[5032],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":5034,"children":5035},{"style":3010},[5036],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":5038,"children":5039},{"style":2998},[5040],{"type":2479,"value":5041},"getKeys",{"type":2474,"tag":2844,"props":5043,"children":5044},{"style":3019},[5045],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":5047,"children":5048},{"style":3010},[5049],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":5051,"children":5052},{"style":2865},[5053],{"type":2479,"value":5054},"ban:",{"type":2474,"tag":2844,"props":5056,"children":5057},{"style":3010},[5058],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":5060,"children":5061},{"style":3019},[5062],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":5064,"children":5065},{"style":3010},[5066],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5068,"children":5069},{"class":2846,"line":3151},[5070],{"type":2474,"tag":2844,"props":5071,"children":5072},{"emptyLinePlaceholder":2880},[5073],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":5075,"children":5076},{"class":2846,"line":3160},[5077,5082,5087,5091,5095],{"type":2474,"tag":2844,"props":5078,"children":5079},{"style":4032},[5080],{"type":2479,"value":5081},"    let",{"type":2474,"tag":2844,"props":5083,"children":5084},{"style":3004},[5085],{"type":2479,"value":5086}," cleanedCount",{"type":2474,"tag":2844,"props":5088,"children":5089},{"style":3010},[5090],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":5092,"children":5093},{"style":3285},[5094],{"type":2479,"value":3645},{"type":2474,"tag":2844,"props":5096,"children":5097},{"style":3010},[5098],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5100,"children":5101},{"class":2846,"line":3169},[5102,5107,5112,5117,5122,5127,5131,5136],{"type":2474,"tag":2844,"props":5103,"children":5104},{"style":2987},[5105],{"type":2479,"value":5106},"    for",{"type":2474,"tag":2844,"props":5108,"children":5109},{"style":3019},[5110],{"type":2479,"value":5111}," (",{"type":2474,"tag":2844,"props":5113,"children":5114},{"style":4032},[5115],{"type":2479,"value":5116},"const",{"type":2474,"tag":2844,"props":5118,"children":5119},{"style":3004},[5120],{"type":2479,"value":5121}," key",{"type":2474,"tag":2844,"props":5123,"children":5124},{"style":3010},[5125],{"type":2479,"value":5126}," of",{"type":2474,"tag":2844,"props":5128,"children":5129},{"style":3004},[5130],{"type":2479,"value":5019},{"type":2474,"tag":2844,"props":5132,"children":5133},{"style":3019},[5134],{"type":2479,"value":5135},") ",{"type":2474,"tag":2844,"props":5137,"children":5138},{"style":3010},[5139],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":5141,"children":5142},{"class":2846,"line":3178},[5143,5148,5153,5157,5161,5165,5169,5174,5178,5183,5187],{"type":2474,"tag":2844,"props":5144,"children":5145},{"style":4032},[5146],{"type":2479,"value":5147},"      const",{"type":2474,"tag":2844,"props":5149,"children":5150},{"style":3004},[5151],{"type":2479,"value":5152}," bannedUntilRaw",{"type":2474,"tag":2844,"props":5154,"children":5155},{"style":3010},[5156],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":5158,"children":5159},{"style":2987},[5160],{"type":2479,"value":5028},{"type":2474,"tag":2844,"props":5162,"children":5163},{"style":3004},[5164],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":5166,"children":5167},{"style":3010},[5168],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":5170,"children":5171},{"style":2998},[5172],{"type":2479,"value":5173},"getItem",{"type":2474,"tag":2844,"props":5175,"children":5176},{"style":3019},[5177],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":5179,"children":5180},{"style":3004},[5181],{"type":2479,"value":5182},"key",{"type":2474,"tag":2844,"props":5184,"children":5185},{"style":3019},[5186],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":5188,"children":5189},{"style":3010},[5190],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5192,"children":5193},{"class":2846,"line":3187},[5194,5199,5203,5208,5212,5217,5222],{"type":2474,"tag":2844,"props":5195,"children":5196},{"style":2987},[5197],{"type":2479,"value":5198},"      if",{"type":2474,"tag":2844,"props":5200,"children":5201},{"style":3019},[5202],{"type":2479,"value":5111},{"type":2474,"tag":2844,"props":5204,"children":5205},{"style":2998},[5206],{"type":2479,"value":5207},"isActualBanTimestampExpired",{"type":2474,"tag":2844,"props":5209,"children":5210},{"style":3019},[5211],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":5213,"children":5214},{"style":3004},[5215],{"type":2479,"value":5216},"bannedUntilRaw",{"type":2474,"tag":2844,"props":5218,"children":5219},{"style":3019},[5220],{"type":2479,"value":5221},")) ",{"type":2474,"tag":2844,"props":5223,"children":5224},{"style":3010},[5225],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":5227,"children":5228},{"class":2846,"line":3195},[5229,5234,5238,5242,5247,5251,5255,5259],{"type":2474,"tag":2844,"props":5230,"children":5231},{"style":2987},[5232],{"type":2479,"value":5233},"        await",{"type":2474,"tag":2844,"props":5235,"children":5236},{"style":3004},[5237],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":5239,"children":5240},{"style":3010},[5241],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":5243,"children":5244},{"style":2998},[5245],{"type":2479,"value":5246},"removeItem",{"type":2474,"tag":2844,"props":5248,"children":5249},{"style":3019},[5250],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":5252,"children":5253},{"style":3004},[5254],{"type":2479,"value":5182},{"type":2474,"tag":2844,"props":5256,"children":5257},{"style":3019},[5258],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":5260,"children":5261},{"style":3010},[5262],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5264,"children":5265},{"class":2846,"line":3204},[5266,5271],{"type":2474,"tag":2844,"props":5267,"children":5268},{"style":3004},[5269],{"type":2479,"value":5270},"        cleanedCount",{"type":2474,"tag":2844,"props":5272,"children":5273},{"style":3010},[5274],{"type":2479,"value":5275},"++;\n",{"type":2474,"tag":2844,"props":5277,"children":5278},{"class":2846,"line":3213},[5279],{"type":2474,"tag":2844,"props":5280,"children":5281},{"style":3010},[5282],{"type":2479,"value":4147},{"type":2474,"tag":2844,"props":5284,"children":5285},{"class":2846,"line":3227},[5286],{"type":2474,"tag":2844,"props":5287,"children":5288},{"style":3010},[5289],{"type":2479,"value":4155},{"type":2474,"tag":2844,"props":5291,"children":5292},{"class":2846,"line":3255},[5293,5298,5302,5307,5311,5316,5321,5326,5331,5335,5340,5344,5348],{"type":2474,"tag":2844,"props":5294,"children":5295},{"style":3004},[5296],{"type":2479,"value":5297},"    console",{"type":2474,"tag":2844,"props":5299,"children":5300},{"style":3010},[5301],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":5303,"children":5304},{"style":2998},[5305],{"type":2479,"value":5306},"log",{"type":2474,"tag":2844,"props":5308,"children":5309},{"style":3019},[5310],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":5312,"children":5313},{"style":3010},[5314],{"type":2479,"value":5315},"`",{"type":2474,"tag":2844,"props":5317,"children":5318},{"style":2865},[5319],{"type":2479,"value":5320},"[nuxt-api-shield] Cleaned ",{"type":2474,"tag":2844,"props":5322,"children":5323},{"style":3010},[5324],{"type":2479,"value":5325},"${",{"type":2474,"tag":2844,"props":5327,"children":5328},{"style":3004},[5329],{"type":2479,"value":5330},"cleanedCount",{"type":2474,"tag":2844,"props":5332,"children":5333},{"style":3010},[5334],{"type":2479,"value":3377},{"type":2474,"tag":2844,"props":5336,"children":5337},{"style":2865},[5338],{"type":2479,"value":5339}," expired ban(s).",{"type":2474,"tag":2844,"props":5341,"children":5342},{"style":3010},[5343],{"type":2479,"value":5315},{"type":2474,"tag":2844,"props":5345,"children":5346},{"style":3019},[5347],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":5349,"children":5350},{"style":3010},[5351],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5353,"children":5354},{"class":2846,"line":3263},[5355,5360,5364,5369,5373,5377,5381,5385],{"type":2474,"tag":2844,"props":5356,"children":5357},{"style":2987},[5358],{"type":2479,"value":5359},"    return",{"type":2474,"tag":2844,"props":5361,"children":5362},{"style":3010},[5363],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":5365,"children":5366},{"style":3019},[5367],{"type":2479,"value":5368}," result",{"type":2474,"tag":2844,"props":5370,"children":5371},{"style":3010},[5372],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":5374,"children":5375},{"style":3010},[5376],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":5378,"children":5379},{"style":3004},[5380],{"type":2479,"value":5086},{"type":2474,"tag":2844,"props":5382,"children":5383},{"style":3010},[5384],{"type":2479,"value":4774},{"type":2474,"tag":2844,"props":5386,"children":5387},{"style":3010},[5388],{"type":2479,"value":5389}," };\n",{"type":2474,"tag":2844,"props":5391,"children":5392},{"class":2846,"line":3272},[5393],{"type":2474,"tag":2844,"props":5394,"children":5395},{"style":3010},[5396],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":5398,"children":5399},{"class":2846,"line":3300},[5400,5404,5408],{"type":2474,"tag":2844,"props":5401,"children":5402},{"style":3010},[5403],{"type":2479,"value":3377},{"type":2474,"tag":2844,"props":5405,"children":5406},{"style":3004},[5407],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":5409,"children":5410},{"style":3010},[5411],{"type":2479,"value":3387},{"type":2474,"tag":2481,"props":5413,"children":5414},{},[5415,5416,5421,5423,5428,5430,5435],{"type":2479,"value":3845},{"type":2474,"tag":2631,"props":5417,"children":5419},{"className":5418},[],[5420],{"type":2479,"value":5207},{"type":2479,"value":5422}," utility is provided by ",{"type":2474,"tag":2631,"props":5424,"children":5426},{"className":5425},[],[5427],{"type":2479,"value":2415},{"type":2479,"value":5429}," and should be available via ",{"type":2474,"tag":2631,"props":5431,"children":5433},{"className":5432},[],[5434],{"type":2479,"value":4788},{"type":2479,"value":3974},{"type":2474,"tag":4711,"props":5437,"children":5439},{"id":5438},"b-task-for-cleaning-old-ip-tracking-data",[5440],{"type":2479,"value":5441},"b) Task for cleaning old IP tracking data",{"type":2474,"tag":2481,"props":5443,"children":5444},{},[5445,5447,5453,5455,5461,5463,5469],{"type":2479,"value":5446},"Cleans IP tracking entries (",{"type":2474,"tag":2631,"props":5448,"children":5450},{"className":5449},[],[5451],{"type":2479,"value":5452},"ip:xxx.xxx.xxx.xxx",{"type":2479,"value":5454},") whose ",{"type":2474,"tag":2631,"props":5456,"children":5458},{"className":5457},[],[5459],{"type":2479,"value":5460},"time",{"type":2479,"value":5462}," is older than ",{"type":2474,"tag":2631,"props":5464,"children":5466},{"className":5465},[],[5467],{"type":2479,"value":5468},"nuxtApiShield.ipTTL",{"type":2479,"value":5470}," (default 7 days), and drops malformed entries. That keeps storage from growing with one-off IPs that were never banned.",{"type":2474,"tag":2481,"props":5472,"children":5473},{},[5474,5475,5481],{"type":2479,"value":4734},{"type":2474,"tag":2631,"props":5476,"children":5478},{"className":5477},[],[5479],{"type":2479,"value":5480},"server\u002Ftasks\u002Fshield\u002FcleanIpData.ts",{"type":2479,"value":3027},{"type":2474,"tag":2834,"props":5483,"children":5485},{"className":4745,"code":5484,"language":4747,"meta":2418,"style":2418},"import type { RateLimit } from \"nuxt-api-shield\";\nimport { useRuntimeConfig } from \"#imports\";\n\nexport default defineTask({\n  meta: {\n    name: \"shield:cleanIpData\", \u002F\u002F Match the name in scheduledTasks\n    description: \"Clean old IP tracking data from nuxt-api-shield storage.\",\n  },\n  async run() {\n    const shieldStorage = useStorage(\"shield\");\n    const config = useRuntimeConfig().public.nuxtApiShield;\n\n    \u002F\u002F ipTTL is expected to be in seconds from config (module applies default if not set by user)\n    const ipTTLseconds = config.ipTTL;\n\n    if (!ipTTLseconds || ipTTLseconds \u003C= 0) {\n      console.log(\n        \"[nuxt-api-shield] IP data cleanup (ipTTL) is disabled or invalid.\"\n      );\n      return { result: { cleanedCount: 0 }, status: \"disabled_or_invalid_ttl\" };\n    }\n    const ipTTLms = ipTTLseconds * 1000;\n\n    const ipKeys = await shieldStorage.getKeys(\"ip:\");\n    const currentTime = Date.now();\n    let cleanedCount = 0;\n\n    for (const key of ipKeys) {\n      const entry = (await shieldStorage.getItem(key)) as RateLimit | null;\n\n      \u002F\u002F Check if entry exists and has a numeric 'time' property\n      if (entry && typeof entry.time === \"number\") {\n        if (currentTime - entry.time > ipTTLms) {\n          await shieldStorage.removeItem(key);\n          cleanedCount++;\n        }\n      } else {\n        \u002F\u002F Clean up entries that are null, not an object, or missing a numeric 'time'\n        await shieldStorage.removeItem(key);\n        cleanedCount++;\n      }\n    }\n\n    console.log(\n      `[nuxt-api-shield] Cleaned ${cleanedCount} old\u002Fmalformed IP data entries.`\n    );\n    return { result: { cleanedCount } };\n  },\n});\n",[5486],{"type":2474,"tag":2631,"props":5487,"children":5488},{"__ignoreMap":2418},[5489,5534,5574,5581,5604,5619,5650,5678,5685,5704,5747,5791,5798,5806,5838,5845,5893,5914,5930,5942,6009,6016,6049,6056,6113,6151,6174,6181,6216,6288,6295,6304,6369,6421,6458,6471,6480,6498,6507,6543,6555,6563,6571,6579,6599,6634,6647,6683,6691],{"type":2474,"tag":2844,"props":5490,"children":5491},{"class":2846,"line":2446},[5492,5496,5501,5505,5510,5514,5518,5522,5526,5530],{"type":2474,"tag":2844,"props":5493,"children":5494},{"style":2987},[5495],{"type":2479,"value":4759},{"type":2474,"tag":2844,"props":5497,"children":5498},{"style":2987},[5499],{"type":2479,"value":5500}," type",{"type":2474,"tag":2844,"props":5502,"children":5503},{"style":3010},[5504],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":5506,"children":5507},{"style":3004},[5508],{"type":2479,"value":5509}," RateLimit",{"type":2474,"tag":2844,"props":5511,"children":5512},{"style":3010},[5513],{"type":2479,"value":4774},{"type":2474,"tag":2844,"props":5515,"children":5516},{"style":2987},[5517],{"type":2479,"value":4779},{"type":2474,"tag":2844,"props":5519,"children":5520},{"style":3010},[5521],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":5523,"children":5524},{"style":2865},[5525],{"type":2479,"value":2415},{"type":2474,"tag":2844,"props":5527,"children":5528},{"style":3010},[5529],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":5531,"children":5532},{"style":3010},[5533],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5535,"children":5536},{"class":2846,"line":2442},[5537,5541,5545,5550,5554,5558,5562,5566,5570],{"type":2474,"tag":2844,"props":5538,"children":5539},{"style":2987},[5540],{"type":2479,"value":4759},{"type":2474,"tag":2844,"props":5542,"children":5543},{"style":3010},[5544],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":5546,"children":5547},{"style":3004},[5548],{"type":2479,"value":5549}," useRuntimeConfig",{"type":2474,"tag":2844,"props":5551,"children":5552},{"style":3010},[5553],{"type":2479,"value":4774},{"type":2474,"tag":2844,"props":5555,"children":5556},{"style":2987},[5557],{"type":2479,"value":4779},{"type":2474,"tag":2844,"props":5559,"children":5560},{"style":3010},[5561],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":5563,"children":5564},{"style":2865},[5565],{"type":2479,"value":4788},{"type":2474,"tag":2844,"props":5567,"children":5568},{"style":3010},[5569],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":5571,"children":5572},{"style":3010},[5573],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5575,"children":5576},{"class":2846,"line":2876},[5577],{"type":2474,"tag":2844,"props":5578,"children":5579},{"emptyLinePlaceholder":2880},[5580],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":5582,"children":5583},{"class":2846,"line":2886},[5584,5588,5592,5596,5600],{"type":2474,"tag":2844,"props":5585,"children":5586},{"style":2987},[5587],{"type":2479,"value":2990},{"type":2474,"tag":2844,"props":5589,"children":5590},{"style":2987},[5591],{"type":2479,"value":2995},{"type":2474,"tag":2844,"props":5593,"children":5594},{"style":2998},[5595],{"type":2479,"value":4825},{"type":2474,"tag":2844,"props":5597,"children":5598},{"style":3004},[5599],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":5601,"children":5602},{"style":3010},[5603],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":5605,"children":5606},{"class":2846,"line":2438},[5607,5611,5615],{"type":2474,"tag":2844,"props":5608,"children":5609},{"style":3019},[5610],{"type":2479,"value":4841},{"type":2474,"tag":2844,"props":5612,"children":5613},{"style":3010},[5614],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":5616,"children":5617},{"style":3010},[5618],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":5620,"children":5621},{"class":2846,"line":2911},[5622,5626,5630,5634,5638,5642,5646],{"type":2474,"tag":2844,"props":5623,"children":5624},{"style":3019},[5625],{"type":2479,"value":4857},{"type":2474,"tag":2844,"props":5627,"children":5628},{"style":3010},[5629],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":5631,"children":5632},{"style":3010},[5633],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":5635,"children":5636},{"style":2865},[5637],{"type":2479,"value":2736},{"type":2474,"tag":2844,"props":5639,"children":5640},{"style":3010},[5641],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":5643,"children":5644},{"style":3010},[5645],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":5647,"children":5648},{"style":2850},[5649],{"type":2479,"value":4882},{"type":2474,"tag":2844,"props":5651,"children":5652},{"class":2846,"line":2919},[5653,5657,5661,5665,5670,5674],{"type":2474,"tag":2844,"props":5654,"children":5655},{"style":3019},[5656],{"type":2479,"value":4890},{"type":2474,"tag":2844,"props":5658,"children":5659},{"style":3010},[5660],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":5662,"children":5663},{"style":3010},[5664],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":5666,"children":5667},{"style":2865},[5668],{"type":2479,"value":5669},"Clean old IP tracking data from nuxt-api-shield storage.",{"type":2474,"tag":2844,"props":5671,"children":5672},{"style":3010},[5673],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":5675,"children":5676},{"style":3010},[5677],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":5679,"children":5680},{"class":2846,"line":2463},[5681],{"type":2474,"tag":2844,"props":5682,"children":5683},{"style":3010},[5684],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":5686,"children":5687},{"class":2846,"line":3115},[5688,5692,5696,5700],{"type":2474,"tag":2844,"props":5689,"children":5690},{"style":4032},[5691],{"type":2479,"value":4926},{"type":2474,"tag":2844,"props":5693,"children":5694},{"style":3019},[5695],{"type":2479,"value":4931},{"type":2474,"tag":2844,"props":5697,"children":5698},{"style":3010},[5699],{"type":2479,"value":4936},{"type":2474,"tag":2844,"props":5701,"children":5702},{"style":3010},[5703],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":5705,"children":5706},{"class":2846,"line":3124},[5707,5711,5715,5719,5723,5727,5731,5735,5739,5743],{"type":2474,"tag":2844,"props":5708,"children":5709},{"style":4032},[5710],{"type":2479,"value":4948},{"type":2474,"tag":2844,"props":5712,"children":5713},{"style":3004},[5714],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":5716,"children":5717},{"style":3010},[5718],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":5720,"children":5721},{"style":2998},[5722],{"type":2479,"value":4963},{"type":2474,"tag":2844,"props":5724,"children":5725},{"style":3019},[5726],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":5728,"children":5729},{"style":3010},[5730],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":5732,"children":5733},{"style":2865},[5734],{"type":2479,"value":4003},{"type":2474,"tag":2844,"props":5736,"children":5737},{"style":3010},[5738],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":5740,"children":5741},{"style":3019},[5742],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":5744,"children":5745},{"style":3010},[5746],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5748,"children":5749},{"class":2846,"line":3133},[5750,5754,5759,5763,5767,5771,5775,5779,5783,5787],{"type":2474,"tag":2844,"props":5751,"children":5752},{"style":4032},[5753],{"type":2479,"value":4948},{"type":2474,"tag":2844,"props":5755,"children":5756},{"style":3004},[5757],{"type":2479,"value":5758}," config",{"type":2474,"tag":2844,"props":5760,"children":5761},{"style":3010},[5762],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":5764,"children":5765},{"style":2998},[5766],{"type":2479,"value":5549},{"type":2474,"tag":2844,"props":5768,"children":5769},{"style":3019},[5770],{"type":2479,"value":4936},{"type":2474,"tag":2844,"props":5772,"children":5773},{"style":3010},[5774],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":5776,"children":5777},{"style":3004},[5778],{"type":2479,"value":204},{"type":2474,"tag":2844,"props":5780,"children":5781},{"style":3010},[5782],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":5784,"children":5785},{"style":3004},[5786],{"type":2479,"value":3403},{"type":2474,"tag":2844,"props":5788,"children":5789},{"style":3010},[5790],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5792,"children":5793},{"class":2846,"line":3142},[5794],{"type":2474,"tag":2844,"props":5795,"children":5796},{"emptyLinePlaceholder":2880},[5797],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":5799,"children":5800},{"class":2846,"line":3151},[5801],{"type":2474,"tag":2844,"props":5802,"children":5803},{"style":2850},[5804],{"type":2479,"value":5805},"    \u002F\u002F ipTTL is expected to be in seconds from config (module applies default if not set by user)\n",{"type":2474,"tag":2844,"props":5807,"children":5808},{"class":2846,"line":3160},[5809,5813,5818,5822,5826,5830,5834],{"type":2474,"tag":2844,"props":5810,"children":5811},{"style":4032},[5812],{"type":2479,"value":4948},{"type":2474,"tag":2844,"props":5814,"children":5815},{"style":3004},[5816],{"type":2479,"value":5817}," ipTTLseconds",{"type":2474,"tag":2844,"props":5819,"children":5820},{"style":3010},[5821],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":5823,"children":5824},{"style":3004},[5825],{"type":2479,"value":5758},{"type":2474,"tag":2844,"props":5827,"children":5828},{"style":3010},[5829],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":5831,"children":5832},{"style":3004},[5833],{"type":2479,"value":4435},{"type":2474,"tag":2844,"props":5835,"children":5836},{"style":3010},[5837],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5839,"children":5840},{"class":2846,"line":3169},[5841],{"type":2474,"tag":2844,"props":5842,"children":5843},{"emptyLinePlaceholder":2880},[5844],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":5846,"children":5847},{"class":2846,"line":3178},[5848,5853,5857,5862,5867,5872,5876,5881,5885,5889],{"type":2474,"tag":2844,"props":5849,"children":5850},{"style":2987},[5851],{"type":2479,"value":5852},"    if",{"type":2474,"tag":2844,"props":5854,"children":5855},{"style":3019},[5856],{"type":2479,"value":5111},{"type":2474,"tag":2844,"props":5858,"children":5859},{"style":3010},[5860],{"type":2479,"value":5861},"!",{"type":2474,"tag":2844,"props":5863,"children":5864},{"style":3004},[5865],{"type":2479,"value":5866},"ipTTLseconds",{"type":2474,"tag":2844,"props":5868,"children":5869},{"style":3010},[5870],{"type":2479,"value":5871}," ||",{"type":2474,"tag":2844,"props":5873,"children":5874},{"style":3004},[5875],{"type":2479,"value":5817},{"type":2474,"tag":2844,"props":5877,"children":5878},{"style":3010},[5879],{"type":2479,"value":5880}," \u003C=",{"type":2474,"tag":2844,"props":5882,"children":5883},{"style":3285},[5884],{"type":2479,"value":3645},{"type":2474,"tag":2844,"props":5886,"children":5887},{"style":3019},[5888],{"type":2479,"value":5135},{"type":2474,"tag":2844,"props":5890,"children":5891},{"style":3010},[5892],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":5894,"children":5895},{"class":2846,"line":3187},[5896,5901,5905,5909],{"type":2474,"tag":2844,"props":5897,"children":5898},{"style":3004},[5899],{"type":2479,"value":5900},"      console",{"type":2474,"tag":2844,"props":5902,"children":5903},{"style":3010},[5904],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":5906,"children":5907},{"style":2998},[5908],{"type":2479,"value":5306},{"type":2474,"tag":2844,"props":5910,"children":5911},{"style":3019},[5912],{"type":2479,"value":5913},"(\n",{"type":2474,"tag":2844,"props":5915,"children":5916},{"class":2846,"line":3195},[5917,5921,5926],{"type":2474,"tag":2844,"props":5918,"children":5919},{"style":3010},[5920],{"type":2479,"value":4112},{"type":2474,"tag":2844,"props":5922,"children":5923},{"style":2865},[5924],{"type":2479,"value":5925},"[nuxt-api-shield] IP data cleanup (ipTTL) is disabled or invalid.",{"type":2474,"tag":2844,"props":5927,"children":5928},{"style":3010},[5929],{"type":2479,"value":4139},{"type":2474,"tag":2844,"props":5931,"children":5932},{"class":2846,"line":3204},[5933,5938],{"type":2474,"tag":2844,"props":5934,"children":5935},{"style":3019},[5936],{"type":2479,"value":5937},"      )",{"type":2474,"tag":2844,"props":5939,"children":5940},{"style":3010},[5941],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":5943,"children":5944},{"class":2846,"line":3213},[5945,5950,5954,5958,5962,5966,5970,5974,5978,5983,5988,5992,5996,6001,6005],{"type":2474,"tag":2844,"props":5946,"children":5947},{"style":2987},[5948],{"type":2479,"value":5949},"      return",{"type":2474,"tag":2844,"props":5951,"children":5952},{"style":3010},[5953],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":5955,"children":5956},{"style":3019},[5957],{"type":2479,"value":5368},{"type":2474,"tag":2844,"props":5959,"children":5960},{"style":3010},[5961],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":5963,"children":5964},{"style":3010},[5965],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":5967,"children":5968},{"style":3019},[5969],{"type":2479,"value":5086},{"type":2474,"tag":2844,"props":5971,"children":5972},{"style":3010},[5973],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":5975,"children":5976},{"style":3285},[5977],{"type":2479,"value":3645},{"type":2474,"tag":2844,"props":5979,"children":5980},{"style":3010},[5981],{"type":2479,"value":5982}," },",{"type":2474,"tag":2844,"props":5984,"children":5985},{"style":3019},[5986],{"type":2479,"value":5987}," status",{"type":2474,"tag":2844,"props":5989,"children":5990},{"style":3010},[5991],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":5993,"children":5994},{"style":3010},[5995],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":5997,"children":5998},{"style":2865},[5999],{"type":2479,"value":6000},"disabled_or_invalid_ttl",{"type":2474,"tag":2844,"props":6002,"children":6003},{"style":3010},[6004],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":6006,"children":6007},{"style":3010},[6008],{"type":2479,"value":5389},{"type":2474,"tag":2844,"props":6010,"children":6011},{"class":2846,"line":3227},[6012],{"type":2474,"tag":2844,"props":6013,"children":6014},{"style":3010},[6015],{"type":2479,"value":4155},{"type":2474,"tag":2844,"props":6017,"children":6018},{"class":2846,"line":3255},[6019,6023,6028,6032,6036,6040,6045],{"type":2474,"tag":2844,"props":6020,"children":6021},{"style":4032},[6022],{"type":2479,"value":4948},{"type":2474,"tag":2844,"props":6024,"children":6025},{"style":3004},[6026],{"type":2479,"value":6027}," ipTTLms",{"type":2474,"tag":2844,"props":6029,"children":6030},{"style":3010},[6031],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":6033,"children":6034},{"style":3004},[6035],{"type":2479,"value":5817},{"type":2474,"tag":2844,"props":6037,"children":6038},{"style":3010},[6039],{"type":2479,"value":3743},{"type":2474,"tag":2844,"props":6041,"children":6042},{"style":3285},[6043],{"type":2479,"value":6044}," 1000",{"type":2474,"tag":2844,"props":6046,"children":6047},{"style":3010},[6048],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":6050,"children":6051},{"class":2846,"line":3263},[6052],{"type":2474,"tag":2844,"props":6053,"children":6054},{"emptyLinePlaceholder":2880},[6055],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":6057,"children":6058},{"class":2846,"line":3272},[6059,6063,6068,6072,6076,6080,6084,6088,6092,6096,6101,6105,6109],{"type":2474,"tag":2844,"props":6060,"children":6061},{"style":4032},[6062],{"type":2479,"value":4948},{"type":2474,"tag":2844,"props":6064,"children":6065},{"style":3004},[6066],{"type":2479,"value":6067}," ipKeys",{"type":2474,"tag":2844,"props":6069,"children":6070},{"style":3010},[6071],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":6073,"children":6074},{"style":2987},[6075],{"type":2479,"value":5028},{"type":2474,"tag":2844,"props":6077,"children":6078},{"style":3004},[6079],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":6081,"children":6082},{"style":3010},[6083],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":6085,"children":6086},{"style":2998},[6087],{"type":2479,"value":5041},{"type":2474,"tag":2844,"props":6089,"children":6090},{"style":3019},[6091],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":6093,"children":6094},{"style":3010},[6095],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":6097,"children":6098},{"style":2865},[6099],{"type":2479,"value":6100},"ip:",{"type":2474,"tag":2844,"props":6102,"children":6103},{"style":3010},[6104],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":6106,"children":6107},{"style":3019},[6108],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":6110,"children":6111},{"style":3010},[6112],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":6114,"children":6115},{"class":2846,"line":3300},[6116,6120,6125,6129,6134,6138,6143,6147],{"type":2474,"tag":2844,"props":6117,"children":6118},{"style":4032},[6119],{"type":2479,"value":4948},{"type":2474,"tag":2844,"props":6121,"children":6122},{"style":3004},[6123],{"type":2479,"value":6124}," currentTime",{"type":2474,"tag":2844,"props":6126,"children":6127},{"style":3010},[6128],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":6130,"children":6131},{"style":3004},[6132],{"type":2479,"value":6133}," Date",{"type":2474,"tag":2844,"props":6135,"children":6136},{"style":3010},[6137],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":6139,"children":6140},{"style":2998},[6141],{"type":2479,"value":6142},"now",{"type":2474,"tag":2844,"props":6144,"children":6145},{"style":3019},[6146],{"type":2479,"value":4936},{"type":2474,"tag":2844,"props":6148,"children":6149},{"style":3010},[6150],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":6152,"children":6153},{"class":2846,"line":3317},[6154,6158,6162,6166,6170],{"type":2474,"tag":2844,"props":6155,"children":6156},{"style":4032},[6157],{"type":2479,"value":5081},{"type":2474,"tag":2844,"props":6159,"children":6160},{"style":3004},[6161],{"type":2479,"value":5086},{"type":2474,"tag":2844,"props":6163,"children":6164},{"style":3010},[6165],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":6167,"children":6168},{"style":3285},[6169],{"type":2479,"value":3645},{"type":2474,"tag":2844,"props":6171,"children":6172},{"style":3010},[6173],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":6175,"children":6176},{"class":2846,"line":3326},[6177],{"type":2474,"tag":2844,"props":6178,"children":6179},{"emptyLinePlaceholder":2880},[6180],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":6182,"children":6183},{"class":2846,"line":3354},[6184,6188,6192,6196,6200,6204,6208,6212],{"type":2474,"tag":2844,"props":6185,"children":6186},{"style":2987},[6187],{"type":2479,"value":5106},{"type":2474,"tag":2844,"props":6189,"children":6190},{"style":3019},[6191],{"type":2479,"value":5111},{"type":2474,"tag":2844,"props":6193,"children":6194},{"style":4032},[6195],{"type":2479,"value":5116},{"type":2474,"tag":2844,"props":6197,"children":6198},{"style":3004},[6199],{"type":2479,"value":5121},{"type":2474,"tag":2844,"props":6201,"children":6202},{"style":3010},[6203],{"type":2479,"value":5126},{"type":2474,"tag":2844,"props":6205,"children":6206},{"style":3004},[6207],{"type":2479,"value":6067},{"type":2474,"tag":2844,"props":6209,"children":6210},{"style":3019},[6211],{"type":2479,"value":5135},{"type":2474,"tag":2844,"props":6213,"children":6214},{"style":3010},[6215],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":6217,"children":6218},{"class":2846,"line":3362},[6219,6223,6228,6232,6236,6241,6245,6249,6253,6257,6261,6265,6270,6274,6279,6284],{"type":2474,"tag":2844,"props":6220,"children":6221},{"style":4032},[6222],{"type":2479,"value":5147},{"type":2474,"tag":2844,"props":6224,"children":6225},{"style":3004},[6226],{"type":2479,"value":6227}," entry",{"type":2474,"tag":2844,"props":6229,"children":6230},{"style":3010},[6231],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":6233,"children":6234},{"style":3019},[6235],{"type":2479,"value":5111},{"type":2474,"tag":2844,"props":6237,"children":6238},{"style":2987},[6239],{"type":2479,"value":6240},"await",{"type":2474,"tag":2844,"props":6242,"children":6243},{"style":3004},[6244],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":6246,"children":6247},{"style":3010},[6248],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":6250,"children":6251},{"style":2998},[6252],{"type":2479,"value":5173},{"type":2474,"tag":2844,"props":6254,"children":6255},{"style":3019},[6256],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":6258,"children":6259},{"style":3004},[6260],{"type":2479,"value":5182},{"type":2474,"tag":2844,"props":6262,"children":6263},{"style":3019},[6264],{"type":2479,"value":5221},{"type":2474,"tag":2844,"props":6266,"children":6267},{"style":2987},[6268],{"type":2479,"value":6269},"as",{"type":2474,"tag":2844,"props":6271,"children":6272},{"style":2859},[6273],{"type":2479,"value":5509},{"type":2474,"tag":2844,"props":6275,"children":6276},{"style":3010},[6277],{"type":2479,"value":6278}," |",{"type":2474,"tag":2844,"props":6280,"children":6281},{"style":2859},[6282],{"type":2479,"value":6283}," null",{"type":2474,"tag":2844,"props":6285,"children":6286},{"style":3010},[6287],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":6289,"children":6290},{"class":2846,"line":3371},[6291],{"type":2474,"tag":2844,"props":6292,"children":6293},{"emptyLinePlaceholder":2880},[6294],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":6296,"children":6298},{"class":2846,"line":6297},31,[6299],{"type":2474,"tag":2844,"props":6300,"children":6301},{"style":2850},[6302],{"type":2479,"value":6303},"      \u002F\u002F Check if entry exists and has a numeric 'time' property\n",{"type":2474,"tag":2844,"props":6305,"children":6307},{"class":2846,"line":6306},32,[6308,6312,6316,6321,6326,6331,6335,6339,6343,6348,6352,6357,6361,6365],{"type":2474,"tag":2844,"props":6309,"children":6310},{"style":2987},[6311],{"type":2479,"value":5198},{"type":2474,"tag":2844,"props":6313,"children":6314},{"style":3019},[6315],{"type":2479,"value":5111},{"type":2474,"tag":2844,"props":6317,"children":6318},{"style":3004},[6319],{"type":2479,"value":6320},"entry",{"type":2474,"tag":2844,"props":6322,"children":6323},{"style":3010},[6324],{"type":2479,"value":6325}," &&",{"type":2474,"tag":2844,"props":6327,"children":6328},{"style":3010},[6329],{"type":2479,"value":6330}," typeof",{"type":2474,"tag":2844,"props":6332,"children":6333},{"style":3004},[6334],{"type":2479,"value":6227},{"type":2474,"tag":2844,"props":6336,"children":6337},{"style":3010},[6338],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":6340,"children":6341},{"style":3004},[6342],{"type":2479,"value":5460},{"type":2474,"tag":2844,"props":6344,"children":6345},{"style":3010},[6346],{"type":2479,"value":6347}," ===",{"type":2474,"tag":2844,"props":6349,"children":6350},{"style":3010},[6351],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":6353,"children":6354},{"style":2865},[6355],{"type":2479,"value":6356},"number",{"type":2474,"tag":2844,"props":6358,"children":6359},{"style":3010},[6360],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":6362,"children":6363},{"style":3019},[6364],{"type":2479,"value":5135},{"type":2474,"tag":2844,"props":6366,"children":6367},{"style":3010},[6368],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":6370,"children":6372},{"class":2846,"line":6371},33,[6373,6378,6382,6387,6392,6396,6400,6404,6409,6413,6417],{"type":2474,"tag":2844,"props":6374,"children":6375},{"style":2987},[6376],{"type":2479,"value":6377},"        if",{"type":2474,"tag":2844,"props":6379,"children":6380},{"style":3019},[6381],{"type":2479,"value":5111},{"type":2474,"tag":2844,"props":6383,"children":6384},{"style":3004},[6385],{"type":2479,"value":6386},"currentTime",{"type":2474,"tag":2844,"props":6388,"children":6389},{"style":3010},[6390],{"type":2479,"value":6391}," -",{"type":2474,"tag":2844,"props":6393,"children":6394},{"style":3004},[6395],{"type":2479,"value":6227},{"type":2474,"tag":2844,"props":6397,"children":6398},{"style":3010},[6399],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":6401,"children":6402},{"style":3004},[6403],{"type":2479,"value":5460},{"type":2474,"tag":2844,"props":6405,"children":6406},{"style":3010},[6407],{"type":2479,"value":6408}," >",{"type":2474,"tag":2844,"props":6410,"children":6411},{"style":3004},[6412],{"type":2479,"value":6027},{"type":2474,"tag":2844,"props":6414,"children":6415},{"style":3019},[6416],{"type":2479,"value":5135},{"type":2474,"tag":2844,"props":6418,"children":6419},{"style":3010},[6420],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":6422,"children":6424},{"class":2846,"line":6423},34,[6425,6430,6434,6438,6442,6446,6450,6454],{"type":2474,"tag":2844,"props":6426,"children":6427},{"style":2987},[6428],{"type":2479,"value":6429},"          await",{"type":2474,"tag":2844,"props":6431,"children":6432},{"style":3004},[6433],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":6435,"children":6436},{"style":3010},[6437],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":6439,"children":6440},{"style":2998},[6441],{"type":2479,"value":5246},{"type":2474,"tag":2844,"props":6443,"children":6444},{"style":3019},[6445],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":6447,"children":6448},{"style":3004},[6449],{"type":2479,"value":5182},{"type":2474,"tag":2844,"props":6451,"children":6452},{"style":3019},[6453],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":6455,"children":6456},{"style":3010},[6457],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":6459,"children":6461},{"class":2846,"line":6460},35,[6462,6467],{"type":2474,"tag":2844,"props":6463,"children":6464},{"style":3004},[6465],{"type":2479,"value":6466},"          cleanedCount",{"type":2474,"tag":2844,"props":6468,"children":6469},{"style":3010},[6470],{"type":2479,"value":5275},{"type":2474,"tag":2844,"props":6472,"children":6474},{"class":2846,"line":6473},36,[6475],{"type":2474,"tag":2844,"props":6476,"children":6477},{"style":3010},[6478],{"type":2479,"value":6479},"        }\n",{"type":2474,"tag":2844,"props":6481,"children":6483},{"class":2846,"line":6482},37,[6484,6489,6494],{"type":2474,"tag":2844,"props":6485,"children":6486},{"style":3010},[6487],{"type":2479,"value":6488},"      }",{"type":2474,"tag":2844,"props":6490,"children":6491},{"style":2987},[6492],{"type":2479,"value":6493}," else",{"type":2474,"tag":2844,"props":6495,"children":6496},{"style":3010},[6497],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":6499,"children":6501},{"class":2846,"line":6500},38,[6502],{"type":2474,"tag":2844,"props":6503,"children":6504},{"style":2850},[6505],{"type":2479,"value":6506},"        \u002F\u002F Clean up entries that are null, not an object, or missing a numeric 'time'\n",{"type":2474,"tag":2844,"props":6508,"children":6510},{"class":2846,"line":6509},39,[6511,6515,6519,6523,6527,6531,6535,6539],{"type":2474,"tag":2844,"props":6512,"children":6513},{"style":2987},[6514],{"type":2479,"value":5233},{"type":2474,"tag":2844,"props":6516,"children":6517},{"style":3004},[6518],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":6520,"children":6521},{"style":3010},[6522],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":6524,"children":6525},{"style":2998},[6526],{"type":2479,"value":5246},{"type":2474,"tag":2844,"props":6528,"children":6529},{"style":3019},[6530],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":6532,"children":6533},{"style":3004},[6534],{"type":2479,"value":5182},{"type":2474,"tag":2844,"props":6536,"children":6537},{"style":3019},[6538],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":6540,"children":6541},{"style":3010},[6542],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":6544,"children":6546},{"class":2846,"line":6545},40,[6547,6551],{"type":2474,"tag":2844,"props":6548,"children":6549},{"style":3004},[6550],{"type":2479,"value":5270},{"type":2474,"tag":2844,"props":6552,"children":6553},{"style":3010},[6554],{"type":2479,"value":5275},{"type":2474,"tag":2844,"props":6556,"children":6558},{"class":2846,"line":6557},41,[6559],{"type":2474,"tag":2844,"props":6560,"children":6561},{"style":3010},[6562],{"type":2479,"value":4147},{"type":2474,"tag":2844,"props":6564,"children":6566},{"class":2846,"line":6565},42,[6567],{"type":2474,"tag":2844,"props":6568,"children":6569},{"style":3010},[6570],{"type":2479,"value":4155},{"type":2474,"tag":2844,"props":6572,"children":6574},{"class":2846,"line":6573},43,[6575],{"type":2474,"tag":2844,"props":6576,"children":6577},{"emptyLinePlaceholder":2880},[6578],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":6580,"children":6582},{"class":2846,"line":6581},44,[6583,6587,6591,6595],{"type":2474,"tag":2844,"props":6584,"children":6585},{"style":3004},[6586],{"type":2479,"value":5297},{"type":2474,"tag":2844,"props":6588,"children":6589},{"style":3010},[6590],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":6592,"children":6593},{"style":2998},[6594],{"type":2479,"value":5306},{"type":2474,"tag":2844,"props":6596,"children":6597},{"style":3019},[6598],{"type":2479,"value":5913},{"type":2474,"tag":2844,"props":6600,"children":6602},{"class":2846,"line":6601},45,[6603,6608,6612,6616,6620,6624,6629],{"type":2474,"tag":2844,"props":6604,"children":6605},{"style":3010},[6606],{"type":2479,"value":6607},"      `",{"type":2474,"tag":2844,"props":6609,"children":6610},{"style":2865},[6611],{"type":2479,"value":5320},{"type":2474,"tag":2844,"props":6613,"children":6614},{"style":3010},[6615],{"type":2479,"value":5325},{"type":2474,"tag":2844,"props":6617,"children":6618},{"style":3004},[6619],{"type":2479,"value":5330},{"type":2474,"tag":2844,"props":6621,"children":6622},{"style":3010},[6623],{"type":2479,"value":3377},{"type":2474,"tag":2844,"props":6625,"children":6626},{"style":2865},[6627],{"type":2479,"value":6628}," old\u002Fmalformed IP data entries.",{"type":2474,"tag":2844,"props":6630,"children":6631},{"style":3010},[6632],{"type":2479,"value":6633},"`\n",{"type":2474,"tag":2844,"props":6635,"children":6637},{"class":2846,"line":6636},46,[6638,6643],{"type":2474,"tag":2844,"props":6639,"children":6640},{"style":3019},[6641],{"type":2479,"value":6642},"    )",{"type":2474,"tag":2844,"props":6644,"children":6645},{"style":3010},[6646],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":6648,"children":6650},{"class":2846,"line":6649},47,[6651,6655,6659,6663,6667,6671,6675,6679],{"type":2474,"tag":2844,"props":6652,"children":6653},{"style":2987},[6654],{"type":2479,"value":5359},{"type":2474,"tag":2844,"props":6656,"children":6657},{"style":3010},[6658],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":6660,"children":6661},{"style":3019},[6662],{"type":2479,"value":5368},{"type":2474,"tag":2844,"props":6664,"children":6665},{"style":3010},[6666],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":6668,"children":6669},{"style":3010},[6670],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":6672,"children":6673},{"style":3004},[6674],{"type":2479,"value":5086},{"type":2474,"tag":2844,"props":6676,"children":6677},{"style":3010},[6678],{"type":2479,"value":4774},{"type":2474,"tag":2844,"props":6680,"children":6681},{"style":3010},[6682],{"type":2479,"value":5389},{"type":2474,"tag":2844,"props":6684,"children":6686},{"class":2846,"line":6685},48,[6687],{"type":2474,"tag":2844,"props":6688,"children":6689},{"style":3010},[6690],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":6692,"children":6694},{"class":2846,"line":6693},49,[6695,6699,6703],{"type":2474,"tag":2844,"props":6696,"children":6697},{"style":3010},[6698],{"type":2479,"value":3377},{"type":2474,"tag":2844,"props":6700,"children":6701},{"style":3004},[6702],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":6704,"children":6705},{"style":3010},[6706],{"type":2479,"value":3387},{"type":2474,"tag":2481,"props":6708,"children":6709},{},[6710,6712,6717,6719,6724,6726,6731,6732,6738,6740,6745],{"type":2479,"value":6711},"Configure ",{"type":2474,"tag":2631,"props":6713,"children":6715},{"className":6714},[],[6716],{"type":2479,"value":4435},{"type":2479,"value":6718}," under ",{"type":2474,"tag":2631,"props":6720,"children":6722},{"className":6721},[],[6723],{"type":2479,"value":3403},{"type":2479,"value":6725}," if you want a TTL other than the default. Setting ",{"type":2474,"tag":2631,"props":6727,"children":6729},{"className":6728},[],[6730],{"type":2479,"value":4435},{"type":2479,"value":3988},{"type":2474,"tag":2631,"props":6733,"children":6735},{"className":6734},[],[6736],{"type":2479,"value":6737},"0",{"type":2479,"value":6739}," (or any non-positive value) makes the bundled ",{"type":2474,"tag":2631,"props":6741,"children":6743},{"className":6742},[],[6744],{"type":2479,"value":2736},{"type":2479,"value":6746}," task skip IP cleanup (it logs and exits).",{"type":2474,"tag":2481,"props":6748,"children":6749},{},[6750,6752,6758,6760,6765,6767,6772],{"type":2479,"value":6751},"If you add your own task file with the same ",{"type":2474,"tag":2631,"props":6753,"children":6755},{"className":6754},[],[6756],{"type":2479,"value":6757},"meta.name",{"type":2479,"value":6759}," as a bundled task (",{"type":2474,"tag":2631,"props":6761,"children":6763},{"className":6762},[],[6764],{"type":2479,"value":2728},{"type":2479,"value":6766}," or ",{"type":2474,"tag":2631,"props":6768,"children":6770},{"className":6769},[],[6771],{"type":2479,"value":2736},{"type":2479,"value":6773},"), Nitro may prefer your project file over the module—avoid duplicate names unless you intend to override.",{"type":2474,"tag":2557,"props":6775,"children":6777},{"id":6776},"production-deployment",[6778],{"type":2479,"value":6779},"Production Deployment",{"type":2474,"tag":2820,"props":6781,"children":6783},{"id":6782},"use-redis-as-the-storage-driver",[6784],{"type":2479,"value":6785},"Use Redis as the storage driver",{"type":2474,"tag":2481,"props":6787,"children":6788},{},[6789,6791,6796,6798,6803,6804,6810],{"type":2479,"value":6790},"For production deployments — especially with multiple server instances or significant traffic — ",{"type":2474,"tag":2569,"props":6792,"children":6793},{},[6794],{"type":2479,"value":6795},"Redis is the recommended storage driver",{"type":2479,"value":6797},". The ",{"type":2474,"tag":2631,"props":6799,"children":6801},{"className":6800},[],[6802],{"type":2479,"value":4134},{"type":2479,"value":2730},{"type":2474,"tag":2631,"props":6805,"children":6807},{"className":6806},[],[6808],{"type":2479,"value":6809},"fs",{"type":2479,"value":6811}," drivers have important limitations:",{"type":2474,"tag":6813,"props":6814,"children":6815},"table",{},[6816,6850],{"type":2474,"tag":6817,"props":6818,"children":6819},"thead",{},[6820],{"type":2474,"tag":6821,"props":6822,"children":6823},"tr",{},[6824,6830,6845],{"type":2474,"tag":6825,"props":6826,"children":6827},"th",{},[6828],{"type":2479,"value":6829},"Area",{"type":2474,"tag":6825,"props":6831,"children":6832},{},[6833,6838,6840],{"type":2474,"tag":2631,"props":6834,"children":6836},{"className":6835},[],[6837],{"type":2479,"value":4134},{"type":2479,"value":6839}," \u002F ",{"type":2474,"tag":2631,"props":6841,"children":6843},{"className":6842},[],[6844],{"type":2479,"value":6809},{"type":2474,"tag":6825,"props":6846,"children":6847},{},[6848],{"type":2479,"value":6849},"Redis",{"type":2474,"tag":6851,"props":6852,"children":6853},"tbody",{},[6854,6876,6897],{"type":2474,"tag":6821,"props":6855,"children":6856},{},[6857,6866,6871],{"type":2474,"tag":6858,"props":6859,"children":6860},"td",{},[6861],{"type":2474,"tag":2569,"props":6862,"children":6863},{},[6864],{"type":2479,"value":6865},"Multi-instance",{"type":2474,"tag":6858,"props":6867,"children":6868},{},[6869],{"type":2479,"value":6870},"Each process has its own isolated state. Rate limits reset per instance, allowing bypass.",{"type":2474,"tag":6858,"props":6872,"children":6873},{},[6874],{"type":2479,"value":6875},"Shared state across all instances.",{"type":2474,"tag":6821,"props":6877,"children":6878},{},[6879,6887,6892],{"type":2474,"tag":6858,"props":6880,"children":6881},{},[6882],{"type":2474,"tag":2569,"props":6883,"children":6884},{},[6885],{"type":2479,"value":6886},"Atomic operations",{"type":2474,"tag":6858,"props":6888,"children":6889},{},[6890],{"type":2479,"value":6891},"Read → increment → write is not atomic. Concurrent requests can both read the same count and exceed the limit simultaneously.",{"type":2474,"tag":6858,"props":6893,"children":6894},{},[6895],{"type":2479,"value":6896},"Single-threaded — reads and writes are naturally atomic. No race conditions.",{"type":2474,"tag":6821,"props":6898,"children":6899},{},[6900,6908,6934],{"type":2474,"tag":6858,"props":6901,"children":6902},{},[6903],{"type":2474,"tag":2569,"props":6904,"children":6905},{},[6906],{"type":2479,"value":6907},"Cleanup",{"type":2474,"tag":6858,"props":6909,"children":6910},{},[6911,6913,6918,6919,6924,6926,6932],{"type":2479,"value":6912},"Cleanup tasks (",{"type":2474,"tag":2631,"props":6914,"children":6916},{"className":6915},[],[6917],{"type":2479,"value":2728},{"type":2479,"value":2796},{"type":2474,"tag":2631,"props":6920,"children":6922},{"className":6921},[],[6923],{"type":2479,"value":2736},{"type":2479,"value":6925},") must scan all keys with ",{"type":2474,"tag":2631,"props":6927,"children":6929},{"className":6928},[],[6930],{"type":2479,"value":6931},"getKeys()",{"type":2479,"value":6933},". At scale this blocks the event loop.",{"type":2474,"tag":6858,"props":6935,"children":6936},{},[6937,6939,6945,6946,6952],{"type":2479,"value":6938},"Use ",{"type":2474,"tag":2631,"props":6940,"children":6942},{"className":6941},[],[6943],{"type":2479,"value":6944},"EXPIRE",{"type":2479,"value":6766},{"type":2474,"tag":2631,"props":6947,"children":6949},{"className":6948},[],[6950],{"type":2479,"value":6951},"TTL",{"type":2479,"value":6953}," natively — expired keys are reclaimed automatically without scanning.",{"type":2474,"tag":2481,"props":6955,"children":6956},{},[6957,6959,6964,6966,6971],{"type":2479,"value":6958},"To use Redis, configure the ",{"type":2474,"tag":2631,"props":6960,"children":6962},{"className":6961},[],[6963],{"type":2479,"value":4003},{"type":2479,"value":6965}," storage with the ",{"type":2474,"tag":2631,"props":6967,"children":6969},{"className":6968},[],[6970],{"type":2479,"value":4285},{"type":2479,"value":6972}," driver:",{"type":2474,"tag":2834,"props":6974,"children":6975},{"className":4008,"code":4177,"language":4010,"meta":2418,"style":2418},[6976],{"type":2474,"tag":2631,"props":6977,"children":6978},{"__ignoreMap":2418},[6979,6986,7009,7032,7055,7090,7125,7148,7155,7162,7169],{"type":2474,"tag":2844,"props":6980,"children":6981},{"class":2846,"line":2446},[6982],{"type":2474,"tag":2844,"props":6983,"children":6984},{"style":3010},[6985],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":6987,"children":6988},{"class":2846,"line":2442},[6989,6993,6997,7001,7005],{"type":2474,"tag":2844,"props":6990,"children":6991},{"style":3010},[6992],{"type":2479,"value":4029},{"type":2474,"tag":2844,"props":6994,"children":6995},{"style":4032},[6996],{"type":2479,"value":4035},{"type":2474,"tag":2844,"props":6998,"children":6999},{"style":3010},[7000],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7002,"children":7003},{"style":3010},[7004],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7006,"children":7007},{"style":3010},[7008],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":7010,"children":7011},{"class":2846,"line":2876},[7012,7016,7020,7024,7028],{"type":2474,"tag":2844,"props":7013,"children":7014},{"style":3010},[7015],{"type":2479,"value":4055},{"type":2474,"tag":2844,"props":7017,"children":7018},{"style":2859},[7019],{"type":2479,"value":4060},{"type":2474,"tag":2844,"props":7021,"children":7022},{"style":3010},[7023],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7025,"children":7026},{"style":3010},[7027],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7029,"children":7030},{"style":3010},[7031],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":7033,"children":7034},{"class":2846,"line":2886},[7035,7039,7043,7047,7051],{"type":2474,"tag":2844,"props":7036,"children":7037},{"style":3010},[7038],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":7040,"children":7041},{"style":3285},[7042],{"type":2479,"value":4003},{"type":2474,"tag":2844,"props":7044,"children":7045},{"style":3010},[7046],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7048,"children":7049},{"style":3010},[7050],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7052,"children":7053},{"style":3010},[7054],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":7056,"children":7057},{"class":2846,"line":2438},[7058,7062,7066,7070,7074,7078,7082,7086],{"type":2474,"tag":2844,"props":7059,"children":7060},{"style":3010},[7061],{"type":2479,"value":4112},{"type":2474,"tag":2844,"props":7063,"children":7064},{"style":3019},[7065],{"type":2479,"value":4117},{"type":2474,"tag":2844,"props":7067,"children":7068},{"style":3010},[7069],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7071,"children":7072},{"style":3010},[7073],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7075,"children":7076},{"style":3010},[7077],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":7079,"children":7080},{"style":2865},[7081],{"type":2479,"value":4285},{"type":2474,"tag":2844,"props":7083,"children":7084},{"style":3010},[7085],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7087,"children":7088},{"style":3010},[7089],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":7091,"children":7092},{"class":2846,"line":2911},[7093,7097,7101,7105,7109,7113,7117,7121],{"type":2474,"tag":2844,"props":7094,"children":7095},{"style":3010},[7096],{"type":2479,"value":4112},{"type":2474,"tag":2844,"props":7098,"children":7099},{"style":3019},[7100],{"type":2479,"value":4305},{"type":2474,"tag":2844,"props":7102,"children":7103},{"style":3010},[7104],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7106,"children":7107},{"style":3010},[7108],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7110,"children":7111},{"style":3010},[7112],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":7114,"children":7115},{"style":2865},[7116],{"type":2479,"value":4322},{"type":2474,"tag":2844,"props":7118,"children":7119},{"style":3010},[7120],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7122,"children":7123},{"style":3010},[7124],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":7126,"children":7127},{"class":2846,"line":2919},[7128,7132,7136,7140,7144],{"type":2474,"tag":2844,"props":7129,"children":7130},{"style":3010},[7131],{"type":2479,"value":4112},{"type":2474,"tag":2844,"props":7133,"children":7134},{"style":3019},[7135],{"type":2479,"value":4342},{"type":2474,"tag":2844,"props":7137,"children":7138},{"style":3010},[7139],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7141,"children":7142},{"style":3010},[7143],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7145,"children":7146},{"style":3285},[7147],{"type":2479,"value":4355},{"type":2474,"tag":2844,"props":7149,"children":7150},{"class":2846,"line":2463},[7151],{"type":2474,"tag":2844,"props":7152,"children":7153},{"style":3010},[7154],{"type":2479,"value":4147},{"type":2474,"tag":2844,"props":7156,"children":7157},{"class":2846,"line":3115},[7158],{"type":2474,"tag":2844,"props":7159,"children":7160},{"style":3010},[7161],{"type":2479,"value":4155},{"type":2474,"tag":2844,"props":7163,"children":7164},{"class":2846,"line":3124},[7165],{"type":2474,"tag":2844,"props":7166,"children":7167},{"style":3010},[7168],{"type":2479,"value":3818},{"type":2474,"tag":2844,"props":7170,"children":7171},{"class":2846,"line":3133},[7172],{"type":2474,"tag":2844,"props":7173,"children":7174},{"style":3010},[7175],{"type":2479,"value":3826},{"type":2474,"tag":2481,"props":7177,"children":7178},{},[7179,7181,7188],{"type":2479,"value":7180},"See the ",{"type":2474,"tag":2485,"props":7182,"children":7185},{"href":7183,"rel":7184},"https:\u002F\u002Funstorage.unjs.io\u002Fdrivers\u002Fredis",[2489],[7186],{"type":2479,"value":7187},"unstorage Redis driver docs",{"type":2479,"value":7189}," for all available options.",{"type":2474,"tag":2820,"props":7191,"children":7193},{"id":7192},"when-memory-fs-is-acceptable",[7194,7196,7201,7202,7207],{"type":2479,"value":7195},"When ",{"type":2474,"tag":2631,"props":7197,"children":7199},{"className":7198},[],[7200],{"type":2479,"value":4134},{"type":2479,"value":6839},{"type":2474,"tag":2631,"props":7203,"children":7205},{"className":7204},[],[7206],{"type":2479,"value":6809},{"type":2479,"value":7208}," is acceptable",{"type":2474,"tag":2481,"props":7210,"children":7211},{},[7212,7213,7218,7219,7224],{"type":2479,"value":3845},{"type":2474,"tag":2631,"props":7214,"children":7216},{"className":7215},[],[7217],{"type":2479,"value":4134},{"type":2479,"value":2730},{"type":2474,"tag":2631,"props":7220,"children":7222},{"className":7221},[],[7223],{"type":2479,"value":6809},{"type":2479,"value":7225}," drivers are fine for:",{"type":2474,"tag":2531,"props":7227,"children":7228},{},[7229,7234,7239],{"type":2474,"tag":2535,"props":7230,"children":7231},{},[7232],{"type":2479,"value":7233},"Single-instance deployments",{"type":2474,"tag":2535,"props":7235,"children":7236},{},[7237],{"type":2479,"value":7238},"Development environments",{"type":2474,"tag":2535,"props":7240,"children":7241},{},[7242],{"type":2479,"value":7243},"Low-traffic applications where occasional race conditions are acceptable",{"type":2474,"tag":2481,"props":7245,"children":7246},{},[7247],{"type":2479,"value":7248},"For everything else, use Redis.",{"type":2474,"tag":2557,"props":7250,"children":7252},{"id":7251},"fail2ban-integration",[7253],{"type":2479,"value":7254},"Fail2ban Integration",{"type":2474,"tag":2481,"props":7256,"children":7257},{},[7258,7260,7265,7267,7273],{"type":2479,"value":7259},"When a user exceeds the rate limit and gets banned, ",{"type":2474,"tag":2631,"props":7261,"children":7263},{"className":7262},[],[7264],{"type":2479,"value":2415},{"type":2479,"value":7266}," can write ban events to the log file in a ",{"type":2474,"tag":2631,"props":7268,"children":7270},{"className":7269},[],[7271],{"type":2479,"value":7272},"fail2ban",{"type":2479,"value":7274},"-compatible format. You can then configure fail2ban to watch these logs and automatically block the IP at the firewall level.",{"type":2474,"tag":2820,"props":7276,"children":7278},{"id":7277},"setup",[7279],{"type":2479,"value":7280},"Setup",{"type":2474,"tag":2481,"props":7282,"children":7283},{},[7284,7286,7292,7293,7298,7300,7306],{"type":2479,"value":7285},"Enable fail2ban logging by setting ",{"type":2474,"tag":2631,"props":7287,"children":7289},{"className":7288},[],[7290],{"type":2479,"value":7291},"log.fail2ban",{"type":2479,"value":3988},{"type":2474,"tag":2631,"props":7294,"children":7296},{"className":7295},[],[7297],{"type":2479,"value":3883},{"type":2479,"value":7299}," and configuring the ",{"type":2474,"tag":2631,"props":7301,"children":7303},{"className":7302},[],[7304],{"type":2479,"value":7305},"log.path",{"type":2479,"value":3027},{"type":2474,"tag":2834,"props":7308,"children":7310},{"className":2975,"code":7309,"language":2977,"meta":2418,"style":2418},"export default defineNuxtConfig({\n  modules: [\"nuxt-api-shield\"],\n  nuxtApiShield: {\n    log: {\n      path: \"\u002Fvar\u002Flog\u002Fnuxt-api-shield\", \u002F\u002F required — must be set\n      attempts: 1,                       \u002F\u002F optional — threshold for regular request logging\n      fail2ban: true,                     \u002F\u002F enable fail2ban format\n    },\n  },\n})\n",[7311],{"type":2474,"tag":2631,"props":7312,"children":7313},{"__ignoreMap":2418},[7314,7337,7372,7387,7403,7437,7463,7488,7495,7502],{"type":2474,"tag":2844,"props":7315,"children":7316},{"class":2846,"line":2446},[7317,7321,7325,7329,7333],{"type":2474,"tag":2844,"props":7318,"children":7319},{"style":2987},[7320],{"type":2479,"value":2990},{"type":2474,"tag":2844,"props":7322,"children":7323},{"style":2987},[7324],{"type":2479,"value":2995},{"type":2474,"tag":2844,"props":7326,"children":7327},{"style":2998},[7328],{"type":2479,"value":3001},{"type":2474,"tag":2844,"props":7330,"children":7331},{"style":3004},[7332],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":7334,"children":7335},{"style":3010},[7336],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":7338,"children":7339},{"class":2846,"line":2442},[7340,7344,7348,7352,7356,7360,7364,7368],{"type":2474,"tag":2844,"props":7341,"children":7342},{"style":3019},[7343],{"type":2479,"value":3022},{"type":2474,"tag":2844,"props":7345,"children":7346},{"style":3010},[7347],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7349,"children":7350},{"style":3004},[7351],{"type":2479,"value":3032},{"type":2474,"tag":2844,"props":7353,"children":7354},{"style":3010},[7355],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7357,"children":7358},{"style":2865},[7359],{"type":2479,"value":2415},{"type":2474,"tag":2844,"props":7361,"children":7362},{"style":3010},[7363],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7365,"children":7366},{"style":3004},[7367],{"type":2479,"value":3050},{"type":2474,"tag":2844,"props":7369,"children":7370},{"style":3010},[7371],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":7373,"children":7374},{"class":2846,"line":2876},[7375,7379,7383],{"type":2474,"tag":2844,"props":7376,"children":7377},{"style":3019},[7378],{"type":2479,"value":3063},{"type":2474,"tag":2844,"props":7380,"children":7381},{"style":3010},[7382],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7384,"children":7385},{"style":3010},[7386],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":7388,"children":7389},{"class":2846,"line":2886},[7390,7395,7399],{"type":2474,"tag":2844,"props":7391,"children":7392},{"style":3019},[7393],{"type":2479,"value":7394},"    log",{"type":2474,"tag":2844,"props":7396,"children":7397},{"style":3010},[7398],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7400,"children":7401},{"style":3010},[7402],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":7404,"children":7405},{"class":2846,"line":2438},[7406,7411,7415,7419,7424,7428,7432],{"type":2474,"tag":2844,"props":7407,"children":7408},{"style":3019},[7409],{"type":2479,"value":7410},"      path",{"type":2474,"tag":2844,"props":7412,"children":7413},{"style":3010},[7414],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7416,"children":7417},{"style":3010},[7418],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":7420,"children":7421},{"style":2865},[7422],{"type":2479,"value":7423},"\u002Fvar\u002Flog\u002Fnuxt-api-shield",{"type":2474,"tag":2844,"props":7425,"children":7426},{"style":3010},[7427],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7429,"children":7430},{"style":3010},[7431],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":7433,"children":7434},{"style":2850},[7435],{"type":2479,"value":7436}," \u002F\u002F required — must be set\n",{"type":2474,"tag":2844,"props":7438,"children":7439},{"class":2846,"line":2911},[7440,7445,7449,7454,7458],{"type":2474,"tag":2844,"props":7441,"children":7442},{"style":3019},[7443],{"type":2479,"value":7444},"      attempts",{"type":2474,"tag":2844,"props":7446,"children":7447},{"style":3010},[7448],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7450,"children":7451},{"style":3285},[7452],{"type":2479,"value":7453}," 1",{"type":2474,"tag":2844,"props":7455,"children":7456},{"style":3010},[7457],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":7459,"children":7460},{"style":2850},[7461],{"type":2479,"value":7462},"                       \u002F\u002F optional — threshold for regular request logging\n",{"type":2474,"tag":2844,"props":7464,"children":7465},{"class":2846,"line":2919},[7466,7471,7475,7479,7483],{"type":2474,"tag":2844,"props":7467,"children":7468},{"style":3019},[7469],{"type":2479,"value":7470},"      fail2ban",{"type":2474,"tag":2844,"props":7472,"children":7473},{"style":3010},[7474],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":7476,"children":7477},{"style":3339},[7478],{"type":2479,"value":3532},{"type":2474,"tag":2844,"props":7480,"children":7481},{"style":3010},[7482],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":7484,"children":7485},{"style":2850},[7486],{"type":2479,"value":7487},"                     \u002F\u002F enable fail2ban format\n",{"type":2474,"tag":2844,"props":7489,"children":7490},{"class":2846,"line":2463},[7491],{"type":2474,"tag":2844,"props":7492,"children":7493},{"style":3010},[7494],{"type":2479,"value":3121},{"type":2474,"tag":2844,"props":7496,"children":7497},{"class":2846,"line":3115},[7498],{"type":2474,"tag":2844,"props":7499,"children":7500},{"style":3010},[7501],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":7503,"children":7504},{"class":2846,"line":3124},[7505,7509],{"type":2474,"tag":2844,"props":7506,"children":7507},{"style":3010},[7508],{"type":2479,"value":3377},{"type":2474,"tag":2844,"props":7510,"children":7511},{"style":3004},[7512],{"type":2479,"value":7513},")\n",{"type":2474,"tag":2481,"props":7515,"children":7516},{},[7517],{"type":2479,"value":7518},"When enabled, every ban event writes a line like:",{"type":2474,"tag":2834,"props":7520,"children":7524},{"className":7521,"code":7523,"language":2479},[7522],"language-text","2026-06-21 12:34:56,789 nuxt-api-shield ban 192.168.1.100 — \u002Fapi\u002Fv3\u002Flogin exceeded limit (12 requests in 108s)\n",[7525],{"type":2474,"tag":2631,"props":7526,"children":7527},{"__ignoreMap":2418},[7528],{"type":2479,"value":7523},{"type":2474,"tag":2820,"props":7530,"children":7532},{"id":7531},"fail2ban-filter-configuration",[7533],{"type":2479,"value":7534},"Fail2ban filter configuration",{"type":2474,"tag":2481,"props":7536,"children":7537},{},[7538,7540,7546],{"type":2479,"value":7539},"Create ",{"type":2474,"tag":2631,"props":7541,"children":7543},{"className":7542},[],[7544],{"type":2479,"value":7545},"\u002Fetc\u002Ffail2ban\u002Ffilter.d\u002Fnuxt-api-shield.conf",{"type":2479,"value":3027},{"type":2474,"tag":2834,"props":7548,"children":7552},{"className":7549,"code":7550,"language":7551,"meta":2418,"style":2418},"language-ini shiki shiki-themes material-theme-lighter material-theme-lighter material-theme-palenight","[Definition]\nfailregex = ^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3} nuxt-api-shield ban \u003CHOST>\n","ini",[7553],{"type":2474,"tag":2631,"props":7554,"children":7555},{"__ignoreMap":2418},[7556,7564],{"type":2474,"tag":2844,"props":7557,"children":7558},{"class":2846,"line":2446},[7559],{"type":2474,"tag":2844,"props":7560,"children":7561},{"style":3010},[7562],{"type":2479,"value":7563},"[Definition]\n",{"type":2474,"tag":2844,"props":7565,"children":7566},{"class":2846,"line":2442},[7567,7572,7576],{"type":2474,"tag":2844,"props":7568,"children":7569},{"style":3019},[7570],{"type":2479,"value":7571},"failregex",{"type":2474,"tag":2844,"props":7573,"children":7574},{"style":3010},[7575],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":7577,"children":7578},{"style":3004},[7579],{"type":2479,"value":7580}," ^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3} nuxt-api-shield ban \u003CHOST>\n",{"type":2474,"tag":2820,"props":7582,"children":7584},{"id":7583},"jail-configuration",[7585],{"type":2479,"value":7586},"Jail configuration",{"type":2474,"tag":2481,"props":7588,"children":7589},{},[7590,7592,7598],{"type":2479,"value":7591},"Add a jail entry in ",{"type":2474,"tag":2631,"props":7593,"children":7595},{"className":7594},[],[7596],{"type":2479,"value":7597},"\u002Fetc\u002Ffail2ban\u002Fjail.local",{"type":2479,"value":3027},{"type":2474,"tag":2834,"props":7600,"children":7602},{"className":7549,"code":7601,"language":7551,"meta":2418,"style":2418},"[nuxt-api-shield]\nenabled  = true\nfilter   = nuxt-api-shield\nlogpath  = \u002Fvar\u002Flog\u002Fnuxt-api-shield\u002Fshield-*.log\nport     = http,https\nbanaction = iptables-multiport\nmaxretry = 1\nfindtime = 1\nbantime  = 3600\n",[7603],{"type":2474,"tag":2631,"props":7604,"children":7605},{"__ignoreMap":2418},[7606,7614,7631,7648,7665,7682,7699,7716,7732],{"type":2474,"tag":2844,"props":7607,"children":7608},{"class":2846,"line":2446},[7609],{"type":2474,"tag":2844,"props":7610,"children":7611},{"style":3010},[7612],{"type":2479,"value":7613},"[nuxt-api-shield]\n",{"type":2474,"tag":2844,"props":7615,"children":7616},{"class":2846,"line":2442},[7617,7622,7627],{"type":2474,"tag":2844,"props":7618,"children":7619},{"style":3019},[7620],{"type":2479,"value":7621},"enabled",{"type":2474,"tag":2844,"props":7623,"children":7624},{"style":3010},[7625],{"type":2479,"value":7626},"  =",{"type":2474,"tag":2844,"props":7628,"children":7629},{"style":3004},[7630],{"type":2479,"value":4546},{"type":2474,"tag":2844,"props":7632,"children":7633},{"class":2846,"line":2876},[7634,7639,7644],{"type":2474,"tag":2844,"props":7635,"children":7636},{"style":3019},[7637],{"type":2479,"value":7638},"filter",{"type":2474,"tag":2844,"props":7640,"children":7641},{"style":3010},[7642],{"type":2479,"value":7643},"   =",{"type":2474,"tag":2844,"props":7645,"children":7646},{"style":3004},[7647],{"type":2479,"value":2873},{"type":2474,"tag":2844,"props":7649,"children":7650},{"class":2846,"line":2886},[7651,7656,7660],{"type":2474,"tag":2844,"props":7652,"children":7653},{"style":3019},[7654],{"type":2479,"value":7655},"logpath",{"type":2474,"tag":2844,"props":7657,"children":7658},{"style":3010},[7659],{"type":2479,"value":7626},{"type":2474,"tag":2844,"props":7661,"children":7662},{"style":3004},[7663],{"type":2479,"value":7664}," \u002Fvar\u002Flog\u002Fnuxt-api-shield\u002Fshield-*.log\n",{"type":2474,"tag":2844,"props":7666,"children":7667},{"class":2846,"line":2438},[7668,7672,7677],{"type":2474,"tag":2844,"props":7669,"children":7670},{"style":3019},[7671],{"type":2479,"value":4342},{"type":2474,"tag":2844,"props":7673,"children":7674},{"style":3010},[7675],{"type":2479,"value":7676},"     =",{"type":2474,"tag":2844,"props":7678,"children":7679},{"style":3004},[7680],{"type":2479,"value":7681}," http,https\n",{"type":2474,"tag":2844,"props":7683,"children":7684},{"class":2846,"line":2911},[7685,7690,7694],{"type":2474,"tag":2844,"props":7686,"children":7687},{"style":3019},[7688],{"type":2479,"value":7689},"banaction",{"type":2474,"tag":2844,"props":7691,"children":7692},{"style":3010},[7693],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":7695,"children":7696},{"style":3004},[7697],{"type":2479,"value":7698}," iptables-multiport\n",{"type":2474,"tag":2844,"props":7700,"children":7701},{"class":2846,"line":2919},[7702,7707,7711],{"type":2474,"tag":2844,"props":7703,"children":7704},{"style":3019},[7705],{"type":2479,"value":7706},"maxretry",{"type":2474,"tag":2844,"props":7708,"children":7709},{"style":3010},[7710],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":7712,"children":7713},{"style":3004},[7714],{"type":2479,"value":7715}," 1\n",{"type":2474,"tag":2844,"props":7717,"children":7718},{"class":2846,"line":2463},[7719,7724,7728],{"type":2474,"tag":2844,"props":7720,"children":7721},{"style":3019},[7722],{"type":2479,"value":7723},"findtime",{"type":2474,"tag":2844,"props":7725,"children":7726},{"style":3010},[7727],{"type":2479,"value":4958},{"type":2474,"tag":2844,"props":7729,"children":7730},{"style":3004},[7731],{"type":2479,"value":7715},{"type":2474,"tag":2844,"props":7733,"children":7734},{"class":2846,"line":3115},[7735,7740,7744],{"type":2474,"tag":2844,"props":7736,"children":7737},{"style":3019},[7738],{"type":2479,"value":7739},"bantime",{"type":2474,"tag":2844,"props":7741,"children":7742},{"style":3010},[7743],{"type":2479,"value":7626},{"type":2474,"tag":2844,"props":7745,"children":7746},{"style":3004},[7747],{"type":2479,"value":7748}," 3600\n",{"type":2474,"tag":2481,"props":7750,"children":7751},{},[7752,7754,7759,7761,7767,7769,7775,7776,7782,7784,7789],{"type":2479,"value":7753},"Since ",{"type":2474,"tag":2631,"props":7755,"children":7757},{"className":7756},[],[7758],{"type":2479,"value":2415},{"type":2479,"value":7760}," already applies its own ban logic (configurable via ",{"type":2474,"tag":2631,"props":7762,"children":7764},{"className":7763},[],[7765],{"type":2479,"value":7766},"limit.ban",{"type":2479,"value":7768},"), set ",{"type":2474,"tag":2631,"props":7770,"children":7772},{"className":7771},[],[7773],{"type":2479,"value":7774},"maxretry = 1",{"type":2479,"value":2730},{"type":2474,"tag":2631,"props":7777,"children":7779},{"className":7778},[],[7780],{"type":2479,"value":7781},"findtime = 1",{"type":2479,"value":7783}," so fail2ban acts immediately on each ban log entry. Adjust ",{"type":2474,"tag":2631,"props":7785,"children":7787},{"className":7786},[],[7788],{"type":2479,"value":7739},{"type":2479,"value":7790}," to match or extend your module-level ban duration.",{"type":2474,"tag":2481,"props":7792,"children":7793},{},[7794],{"type":2479,"value":7795},"Restart fail2ban after adding the config:",{"type":2474,"tag":2834,"props":7797,"children":7799},{"className":2836,"code":7798,"language":2838,"meta":2418,"style":2418},"sudo systemctl restart fail2ban\n",[7800],{"type":2474,"tag":2631,"props":7801,"children":7802},{"__ignoreMap":2418},[7803],{"type":2474,"tag":2844,"props":7804,"children":7805},{"class":2846,"line":2446},[7806,7811,7816,7821],{"type":2474,"tag":2844,"props":7807,"children":7808},{"style":2859},[7809],{"type":2479,"value":7810},"sudo",{"type":2474,"tag":2844,"props":7812,"children":7813},{"style":2865},[7814],{"type":2479,"value":7815}," systemctl",{"type":2474,"tag":2844,"props":7817,"children":7818},{"style":2865},[7819],{"type":2479,"value":7820}," restart",{"type":2474,"tag":2844,"props":7822,"children":7823},{"style":2865},[7824],{"type":2479,"value":7825}," fail2ban\n",{"type":2474,"tag":7827,"props":7828,"children":7829},"blockquote",{},[7830],{"type":2474,"tag":2481,"props":7831,"children":7832},{},[7833,7838,7840,7845],{"type":2474,"tag":2569,"props":7834,"children":7835},{},[7836],{"type":2479,"value":7837},"Note:",{"type":2479,"value":7839}," The ",{"type":2474,"tag":2631,"props":7841,"children":7843},{"className":7842},[],[7844],{"type":2479,"value":7305},{"type":2479,"value":7846}," directory must be readable by the fail2ban service. Ensure permissions are set accordingly.",{"type":2474,"tag":2557,"props":7848,"children":7850},{"id":7849},"typescript-types",[7851],{"type":2479,"value":7852},"TypeScript Types",{"type":2474,"tag":2481,"props":7854,"children":7855},{},[7856],{"type":2479,"value":7857},"The module exports TypeScript types that you can use in your application:",{"type":2474,"tag":2820,"props":7859,"children":7861},{"id":7860},"ratelimit-type",[7862,7868],{"type":2474,"tag":2631,"props":7863,"children":7865},{"className":7864},[],[7866],{"type":2479,"value":7867},"RateLimit",{"type":2479,"value":7869}," Type",{"type":2474,"tag":2481,"props":7871,"children":7872},{},[7873,7874,7879],{"type":2479,"value":3845},{"type":2474,"tag":2631,"props":7875,"children":7877},{"className":7876},[],[7878],{"type":2479,"value":7867},{"type":2479,"value":7880}," type represents the structure of rate limit data stored for each IP address:",{"type":2474,"tag":2834,"props":7882,"children":7884},{"className":4745,"code":7883,"language":4747,"meta":2418,"style":2418},"import type { RateLimit } from \"nuxt-api-shield\";\n\n\u002F\u002F RateLimit structure:\n\u002F\u002F {\n\u002F\u002F   count: number  \u002F\u002F Number of requests made\n\u002F\u002F   time: number   \u002F\u002F Timestamp of the last request\n\u002F\u002F }\n",[7885],{"type":2474,"tag":2631,"props":7886,"children":7887},{"__ignoreMap":2418},[7888,7931,7938,7946,7954,7967,7980],{"type":2474,"tag":2844,"props":7889,"children":7890},{"class":2846,"line":2446},[7891,7895,7899,7903,7907,7911,7915,7919,7923,7927],{"type":2474,"tag":2844,"props":7892,"children":7893},{"style":2987},[7894],{"type":2479,"value":4759},{"type":2474,"tag":2844,"props":7896,"children":7897},{"style":2987},[7898],{"type":2479,"value":5500},{"type":2474,"tag":2844,"props":7900,"children":7901},{"style":3010},[7902],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":7904,"children":7905},{"style":3004},[7906],{"type":2479,"value":5509},{"type":2474,"tag":2844,"props":7908,"children":7909},{"style":3010},[7910],{"type":2479,"value":4774},{"type":2474,"tag":2844,"props":7912,"children":7913},{"style":2987},[7914],{"type":2479,"value":4779},{"type":2474,"tag":2844,"props":7916,"children":7917},{"style":3010},[7918],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":7920,"children":7921},{"style":2865},[7922],{"type":2479,"value":2415},{"type":2474,"tag":2844,"props":7924,"children":7925},{"style":3010},[7926],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":7928,"children":7929},{"style":3010},[7930],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":7932,"children":7933},{"class":2846,"line":2442},[7934],{"type":2474,"tag":2844,"props":7935,"children":7936},{"emptyLinePlaceholder":2880},[7937],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":7939,"children":7940},{"class":2846,"line":2876},[7941],{"type":2474,"tag":2844,"props":7942,"children":7943},{"style":2850},[7944],{"type":2479,"value":7945},"\u002F\u002F RateLimit structure:\n",{"type":2474,"tag":2844,"props":7947,"children":7948},{"class":2846,"line":2886},[7949],{"type":2474,"tag":2844,"props":7950,"children":7951},{"style":2850},[7952],{"type":2479,"value":7953},"\u002F\u002F {\n",{"type":2474,"tag":2844,"props":7955,"children":7956},{"class":2846,"line":2438},[7957,7962],{"type":2474,"tag":2844,"props":7958,"children":7959},{"style":2850},[7960],{"type":2479,"value":7961},"\u002F\u002F   count: number",{"type":2474,"tag":2844,"props":7963,"children":7964},{"style":2850},[7965],{"type":2479,"value":7966},"  \u002F\u002F Number of requests made\n",{"type":2474,"tag":2844,"props":7968,"children":7969},{"class":2846,"line":2911},[7970,7975],{"type":2474,"tag":2844,"props":7971,"children":7972},{"style":2850},[7973],{"type":2479,"value":7974},"\u002F\u002F   time: number",{"type":2474,"tag":2844,"props":7976,"children":7977},{"style":2850},[7978],{"type":2479,"value":7979},"   \u002F\u002F Timestamp of the last request\n",{"type":2474,"tag":2844,"props":7981,"children":7982},{"class":2846,"line":2919},[7983],{"type":2474,"tag":2844,"props":7984,"children":7985},{"style":2850},[7986],{"type":2479,"value":7987},"\u002F\u002F }\n",{"type":2474,"tag":2481,"props":7989,"children":7990},{},[7991],{"type":2474,"tag":2569,"props":7992,"children":7993},{},[7994],{"type":2479,"value":7995},"Usage Example:",{"type":2474,"tag":2834,"props":7997,"children":7999},{"className":4745,"code":7998,"language":4747,"meta":2418,"style":2418},"import type { RateLimit } from \"nuxt-api-shield\";\nimport { useStorage } from \"#imports\";\n\nconst shieldStorage = useStorage(\"shield\");\nconst ipKey = \"ip:192.168.1.1\";\nconst entry = (await shieldStorage.getItem(ipKey)) as RateLimit | null;\n\nif (entry) {\n  console.log(`IP has made ${entry.count} requests`);\n  console.log(`Last request at: ${new Date(entry.time).toISOString()}`);\n}\n",[8000],{"type":2474,"tag":2631,"props":8001,"children":8002},{"__ignoreMap":2418},[8003,8046,8085,8092,8137,8170,8231,8238,8255,8322,8403],{"type":2474,"tag":2844,"props":8004,"children":8005},{"class":2846,"line":2446},[8006,8010,8014,8018,8022,8026,8030,8034,8038,8042],{"type":2474,"tag":2844,"props":8007,"children":8008},{"style":2987},[8009],{"type":2479,"value":4759},{"type":2474,"tag":2844,"props":8011,"children":8012},{"style":2987},[8013],{"type":2479,"value":5500},{"type":2474,"tag":2844,"props":8015,"children":8016},{"style":3010},[8017],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":8019,"children":8020},{"style":3004},[8021],{"type":2479,"value":5509},{"type":2474,"tag":2844,"props":8023,"children":8024},{"style":3010},[8025],{"type":2479,"value":4774},{"type":2474,"tag":2844,"props":8027,"children":8028},{"style":2987},[8029],{"type":2479,"value":4779},{"type":2474,"tag":2844,"props":8031,"children":8032},{"style":3010},[8033],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":8035,"children":8036},{"style":2865},[8037],{"type":2479,"value":2415},{"type":2474,"tag":2844,"props":8039,"children":8040},{"style":3010},[8041],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8043,"children":8044},{"style":3010},[8045],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":8047,"children":8048},{"class":2846,"line":2442},[8049,8053,8057,8061,8065,8069,8073,8077,8081],{"type":2474,"tag":2844,"props":8050,"children":8051},{"style":2987},[8052],{"type":2479,"value":4759},{"type":2474,"tag":2844,"props":8054,"children":8055},{"style":3010},[8056],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":8058,"children":8059},{"style":3004},[8060],{"type":2479,"value":4963},{"type":2474,"tag":2844,"props":8062,"children":8063},{"style":3010},[8064],{"type":2479,"value":4774},{"type":2474,"tag":2844,"props":8066,"children":8067},{"style":2987},[8068],{"type":2479,"value":4779},{"type":2474,"tag":2844,"props":8070,"children":8071},{"style":3010},[8072],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":8074,"children":8075},{"style":2865},[8076],{"type":2479,"value":4788},{"type":2474,"tag":2844,"props":8078,"children":8079},{"style":3010},[8080],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8082,"children":8083},{"style":3010},[8084],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":8086,"children":8087},{"class":2846,"line":2876},[8088],{"type":2474,"tag":2844,"props":8089,"children":8090},{"emptyLinePlaceholder":2880},[8091],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":8093,"children":8094},{"class":2846,"line":2886},[8095,8099,8104,8109,8113,8117,8121,8125,8129,8133],{"type":2474,"tag":2844,"props":8096,"children":8097},{"style":4032},[8098],{"type":2479,"value":5116},{"type":2474,"tag":2844,"props":8100,"children":8101},{"style":3004},[8102],{"type":2479,"value":8103}," shieldStorage ",{"type":2474,"tag":2844,"props":8105,"children":8106},{"style":3010},[8107],{"type":2479,"value":8108},"=",{"type":2474,"tag":2844,"props":8110,"children":8111},{"style":2998},[8112],{"type":2479,"value":4963},{"type":2474,"tag":2844,"props":8114,"children":8115},{"style":3004},[8116],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":8118,"children":8119},{"style":3010},[8120],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8122,"children":8123},{"style":2865},[8124],{"type":2479,"value":4003},{"type":2474,"tag":2844,"props":8126,"children":8127},{"style":3010},[8128],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8130,"children":8131},{"style":3004},[8132],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":8134,"children":8135},{"style":3010},[8136],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":8138,"children":8139},{"class":2846,"line":2438},[8140,8144,8149,8153,8157,8162,8166],{"type":2474,"tag":2844,"props":8141,"children":8142},{"style":4032},[8143],{"type":2479,"value":5116},{"type":2474,"tag":2844,"props":8145,"children":8146},{"style":3004},[8147],{"type":2479,"value":8148}," ipKey ",{"type":2474,"tag":2844,"props":8150,"children":8151},{"style":3010},[8152],{"type":2479,"value":8108},{"type":2474,"tag":2844,"props":8154,"children":8155},{"style":3010},[8156],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":8158,"children":8159},{"style":2865},[8160],{"type":2479,"value":8161},"ip:192.168.1.1",{"type":2474,"tag":2844,"props":8163,"children":8164},{"style":3010},[8165],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8167,"children":8168},{"style":3010},[8169],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":8171,"children":8172},{"class":2846,"line":2911},[8173,8177,8182,8186,8190,8194,8198,8202,8206,8211,8215,8219,8223,8227],{"type":2474,"tag":2844,"props":8174,"children":8175},{"style":4032},[8176],{"type":2479,"value":5116},{"type":2474,"tag":2844,"props":8178,"children":8179},{"style":3004},[8180],{"type":2479,"value":8181}," entry ",{"type":2474,"tag":2844,"props":8183,"children":8184},{"style":3010},[8185],{"type":2479,"value":8108},{"type":2474,"tag":2844,"props":8187,"children":8188},{"style":3004},[8189],{"type":2479,"value":5111},{"type":2474,"tag":2844,"props":8191,"children":8192},{"style":2987},[8193],{"type":2479,"value":6240},{"type":2474,"tag":2844,"props":8195,"children":8196},{"style":3004},[8197],{"type":2479,"value":4953},{"type":2474,"tag":2844,"props":8199,"children":8200},{"style":3010},[8201],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":8203,"children":8204},{"style":2998},[8205],{"type":2479,"value":5173},{"type":2474,"tag":2844,"props":8207,"children":8208},{"style":3004},[8209],{"type":2479,"value":8210},"(ipKey)) ",{"type":2474,"tag":2844,"props":8212,"children":8213},{"style":2987},[8214],{"type":2479,"value":6269},{"type":2474,"tag":2844,"props":8216,"children":8217},{"style":2859},[8218],{"type":2479,"value":5509},{"type":2474,"tag":2844,"props":8220,"children":8221},{"style":3010},[8222],{"type":2479,"value":6278},{"type":2474,"tag":2844,"props":8224,"children":8225},{"style":2859},[8226],{"type":2479,"value":6283},{"type":2474,"tag":2844,"props":8228,"children":8229},{"style":3010},[8230],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":8232,"children":8233},{"class":2846,"line":2919},[8234],{"type":2474,"tag":2844,"props":8235,"children":8236},{"emptyLinePlaceholder":2880},[8237],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":8239,"children":8240},{"class":2846,"line":2463},[8241,8246,8251],{"type":2474,"tag":2844,"props":8242,"children":8243},{"style":2987},[8244],{"type":2479,"value":8245},"if",{"type":2474,"tag":2844,"props":8247,"children":8248},{"style":3004},[8249],{"type":2479,"value":8250}," (entry) ",{"type":2474,"tag":2844,"props":8252,"children":8253},{"style":3010},[8254],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":8256,"children":8257},{"class":2846,"line":3115},[8258,8263,8267,8271,8275,8279,8284,8288,8292,8296,8301,8305,8310,8314,8318],{"type":2474,"tag":2844,"props":8259,"children":8260},{"style":3004},[8261],{"type":2479,"value":8262},"  console",{"type":2474,"tag":2844,"props":8264,"children":8265},{"style":3010},[8266],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":8268,"children":8269},{"style":2998},[8270],{"type":2479,"value":5306},{"type":2474,"tag":2844,"props":8272,"children":8273},{"style":3019},[8274],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":8276,"children":8277},{"style":3010},[8278],{"type":2479,"value":5315},{"type":2474,"tag":2844,"props":8280,"children":8281},{"style":2865},[8282],{"type":2479,"value":8283},"IP has made ",{"type":2474,"tag":2844,"props":8285,"children":8286},{"style":3010},[8287],{"type":2479,"value":5325},{"type":2474,"tag":2844,"props":8289,"children":8290},{"style":3004},[8291],{"type":2479,"value":6320},{"type":2474,"tag":2844,"props":8293,"children":8294},{"style":3010},[8295],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":8297,"children":8298},{"style":3004},[8299],{"type":2479,"value":8300},"count",{"type":2474,"tag":2844,"props":8302,"children":8303},{"style":3010},[8304],{"type":2479,"value":3377},{"type":2474,"tag":2844,"props":8306,"children":8307},{"style":2865},[8308],{"type":2479,"value":8309}," requests",{"type":2474,"tag":2844,"props":8311,"children":8312},{"style":3010},[8313],{"type":2479,"value":5315},{"type":2474,"tag":2844,"props":8315,"children":8316},{"style":3019},[8317],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":8319,"children":8320},{"style":3010},[8321],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":8323,"children":8324},{"class":2846,"line":3124},[8325,8329,8333,8337,8341,8345,8350,8354,8359,8363,8368,8372,8377,8381,8386,8390,8395,8399],{"type":2474,"tag":2844,"props":8326,"children":8327},{"style":3004},[8328],{"type":2479,"value":8262},{"type":2474,"tag":2844,"props":8330,"children":8331},{"style":3010},[8332],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":8334,"children":8335},{"style":2998},[8336],{"type":2479,"value":5306},{"type":2474,"tag":2844,"props":8338,"children":8339},{"style":3019},[8340],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":8342,"children":8343},{"style":3010},[8344],{"type":2479,"value":5315},{"type":2474,"tag":2844,"props":8346,"children":8347},{"style":2865},[8348],{"type":2479,"value":8349},"Last request at: ",{"type":2474,"tag":2844,"props":8351,"children":8352},{"style":3010},[8353],{"type":2479,"value":5325},{"type":2474,"tag":2844,"props":8355,"children":8356},{"style":3010},[8357],{"type":2479,"value":8358},"new",{"type":2474,"tag":2844,"props":8360,"children":8361},{"style":2998},[8362],{"type":2479,"value":6133},{"type":2474,"tag":2844,"props":8364,"children":8365},{"style":3004},[8366],{"type":2479,"value":8367},"(entry",{"type":2474,"tag":2844,"props":8369,"children":8370},{"style":3010},[8371],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":8373,"children":8374},{"style":3004},[8375],{"type":2479,"value":8376},"time)",{"type":2474,"tag":2844,"props":8378,"children":8379},{"style":3010},[8380],{"type":2479,"value":3974},{"type":2474,"tag":2844,"props":8382,"children":8383},{"style":2998},[8384],{"type":2479,"value":8385},"toISOString",{"type":2474,"tag":2844,"props":8387,"children":8388},{"style":3004},[8389],{"type":2479,"value":4936},{"type":2474,"tag":2844,"props":8391,"children":8392},{"style":3010},[8393],{"type":2479,"value":8394},"}`",{"type":2474,"tag":2844,"props":8396,"children":8397},{"style":3019},[8398],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":8400,"children":8401},{"style":3010},[8402],{"type":2479,"value":3387},{"type":2474,"tag":2844,"props":8404,"children":8405},{"class":2846,"line":3133},[8406],{"type":2474,"tag":2844,"props":8407,"children":8408},{"style":3010},[8409],{"type":2479,"value":3826},{"type":2474,"tag":2820,"props":8411,"children":8413},{"id":8412},"moduleoptions-type",[8414,8420],{"type":2474,"tag":2631,"props":8415,"children":8417},{"className":8416},[],[8418],{"type":2479,"value":8419},"ModuleOptions",{"type":2479,"value":7869},{"type":2474,"tag":2481,"props":8422,"children":8423},{},[8424],{"type":2479,"value":8425},"You can also import the module configuration type:",{"type":2474,"tag":2834,"props":8427,"children":8429},{"className":4745,"code":8428,"language":4747,"meta":2418,"style":2418},"import type { ModuleOptions } from \"nuxt-api-shield\";\n",[8430],{"type":2474,"tag":2631,"props":8431,"children":8432},{"__ignoreMap":2418},[8433],{"type":2474,"tag":2844,"props":8434,"children":8435},{"class":2846,"line":2446},[8436,8440,8444,8448,8453,8457,8461,8465,8469,8473],{"type":2474,"tag":2844,"props":8437,"children":8438},{"style":2987},[8439],{"type":2479,"value":4759},{"type":2474,"tag":2844,"props":8441,"children":8442},{"style":2987},[8443],{"type":2479,"value":5500},{"type":2474,"tag":2844,"props":8445,"children":8446},{"style":3010},[8447],{"type":2479,"value":4764},{"type":2474,"tag":2844,"props":8449,"children":8450},{"style":3004},[8451],{"type":2479,"value":8452}," ModuleOptions",{"type":2474,"tag":2844,"props":8454,"children":8455},{"style":3010},[8456],{"type":2479,"value":4774},{"type":2474,"tag":2844,"props":8458,"children":8459},{"style":2987},[8460],{"type":2479,"value":4779},{"type":2474,"tag":2844,"props":8462,"children":8463},{"style":3010},[8464],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":8466,"children":8467},{"style":2865},[8468],{"type":2479,"value":2415},{"type":2474,"tag":2844,"props":8470,"children":8471},{"style":3010},[8472],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8474,"children":8475},{"style":3010},[8476],{"type":2479,"value":3387},{"type":2474,"tag":2557,"props":8478,"children":8480},{"id":8479},"per-route-rate-limiting",[8481],{"type":2479,"value":8482},"Per-Route Rate Limiting",{"type":2474,"tag":2481,"props":8484,"children":8485},{},[8486,8491,8493,8498],{"type":2474,"tag":2631,"props":8487,"children":8489},{"className":8488},[],[8490],{"type":2479,"value":2415},{"type":2479,"value":8492}," supports ",{"type":2474,"tag":2569,"props":8494,"children":8495},{},[8496],{"type":2479,"value":8497},"per-route rate limiting",{"type":2479,"value":8499},", allowing you to define custom limits for specific API endpoints while keeping a global default configuration for all other routes.",{"type":2474,"tag":2481,"props":8501,"children":8502},{},[8503,8505,8511,8512,8518,8520,8526],{"type":2479,"value":8504},"This is useful when certain endpoints (such as ",{"type":2474,"tag":2631,"props":8506,"children":8508},{"className":8507},[],[8509],{"type":2479,"value":8510},"\u002Fapi\u002Flogin",{"type":2479,"value":2796},{"type":2474,"tag":2631,"props":8513,"children":8515},{"className":8514},[],[8516],{"type":2479,"value":8517},"\u002Fapi\u002Fauth",{"type":2479,"value":8519},", or ",{"type":2474,"tag":2631,"props":8521,"children":8523},{"className":8522},[],[8524],{"type":2479,"value":8525},"\u002Fapi\u002Fpayment",{"type":2479,"value":8527},") require stricter protection.",{"type":2474,"tag":8529,"props":8530,"children":8531},"hr",{},[],{"type":2474,"tag":2820,"props":8533,"children":8535},{"id":8534},"configuration-example",[8536],{"type":2479,"value":8537},"Configuration Example",{"type":2474,"tag":2481,"props":8539,"children":8540},{},[8541,8542,8548],{"type":2479,"value":3845},{"type":2474,"tag":2631,"props":8543,"children":8545},{"className":8544},[],[8546],{"type":2479,"value":8547},"routes",{"type":2479,"value":8549}," option accepts a mixed array of strings (exact matches) and objects (custom limits or patterns).",{"type":2474,"tag":2834,"props":8551,"children":8553},{"className":4745,"code":8552,"language":4747,"meta":2418,"style":2418},"export default defineNuxtConfig({\n  modules: [\"nuxt-api-shield\"],\n\n  nuxtApiShield: {\n    limit: {\n      max: 12,\n      duration: 108,\n      ban: 3600,\n    },\n\n    routes: [\n      \u002F\u002F 1. String: uses the global default limit (exact match)\n      \"\u002Fapi\u002Fexample\",\n\n      \u002F\u002F 2. Object: custom rate limit for a specific route (exact match)\n      {\n        path: \"\u002Fapi\u002Fexample-per-route\",\n        max: 5,\n        duration: 10,\n        \u002F\u002F \"ban\" can also be overridden per route\n      },\n\n      \u002F\u002F 3. Object: Wildcard pattern\n      {\n        path: \"\u002Fapi\u002Fusers\u002F*\u002Fprofile\",\n        pattern: true,\n        max: 10,\n        duration: 60\n      }\n    ],\n  },\n});\n",[8554],{"type":2474,"tag":2631,"props":8555,"children":8556},{"__ignoreMap":2418},[8557,8580,8615,8622,8637,8653,8673,8693,8713,8720,8727,8744,8752,8772,8779,8787,8795,8824,8845,8866,8874,8882,8889,8897,8904,8932,8952,8971,8987,8994,9006,9013],{"type":2474,"tag":2844,"props":8558,"children":8559},{"class":2846,"line":2446},[8560,8564,8568,8572,8576],{"type":2474,"tag":2844,"props":8561,"children":8562},{"style":2987},[8563],{"type":2479,"value":2990},{"type":2474,"tag":2844,"props":8565,"children":8566},{"style":2987},[8567],{"type":2479,"value":2995},{"type":2474,"tag":2844,"props":8569,"children":8570},{"style":2998},[8571],{"type":2479,"value":3001},{"type":2474,"tag":2844,"props":8573,"children":8574},{"style":3004},[8575],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":8577,"children":8578},{"style":3010},[8579],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":8581,"children":8582},{"class":2846,"line":2442},[8583,8587,8591,8595,8599,8603,8607,8611],{"type":2474,"tag":2844,"props":8584,"children":8585},{"style":3019},[8586],{"type":2479,"value":3022},{"type":2474,"tag":2844,"props":8588,"children":8589},{"style":3010},[8590],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8592,"children":8593},{"style":3004},[8594],{"type":2479,"value":3032},{"type":2474,"tag":2844,"props":8596,"children":8597},{"style":3010},[8598],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8600,"children":8601},{"style":2865},[8602],{"type":2479,"value":2415},{"type":2474,"tag":2844,"props":8604,"children":8605},{"style":3010},[8606],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8608,"children":8609},{"style":3004},[8610],{"type":2479,"value":3050},{"type":2474,"tag":2844,"props":8612,"children":8613},{"style":3010},[8614],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8616,"children":8617},{"class":2846,"line":2876},[8618],{"type":2474,"tag":2844,"props":8619,"children":8620},{"emptyLinePlaceholder":2880},[8621],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":8623,"children":8624},{"class":2846,"line":2886},[8625,8629,8633],{"type":2474,"tag":2844,"props":8626,"children":8627},{"style":3019},[8628],{"type":2479,"value":3063},{"type":2474,"tag":2844,"props":8630,"children":8631},{"style":3010},[8632],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8634,"children":8635},{"style":3010},[8636],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":8638,"children":8639},{"class":2846,"line":2438},[8640,8645,8649],{"type":2474,"tag":2844,"props":8641,"children":8642},{"style":3019},[8643],{"type":2479,"value":8644},"    limit",{"type":2474,"tag":2844,"props":8646,"children":8647},{"style":3010},[8648],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8650,"children":8651},{"style":3010},[8652],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":8654,"children":8655},{"class":2846,"line":2911},[8656,8661,8665,8669],{"type":2474,"tag":2844,"props":8657,"children":8658},{"style":3019},[8659],{"type":2479,"value":8660},"      max",{"type":2474,"tag":2844,"props":8662,"children":8663},{"style":3010},[8664],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8666,"children":8667},{"style":3285},[8668],{"type":2479,"value":3452},{"type":2474,"tag":2844,"props":8670,"children":8671},{"style":3010},[8672],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8674,"children":8675},{"class":2846,"line":2919},[8676,8681,8685,8689],{"type":2474,"tag":2844,"props":8677,"children":8678},{"style":3019},[8679],{"type":2479,"value":8680},"      duration",{"type":2474,"tag":2844,"props":8682,"children":8683},{"style":3010},[8684],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8686,"children":8687},{"style":3285},[8688],{"type":2479,"value":3473},{"type":2474,"tag":2844,"props":8690,"children":8691},{"style":3010},[8692],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8694,"children":8695},{"class":2846,"line":2463},[8696,8701,8705,8709],{"type":2474,"tag":2844,"props":8697,"children":8698},{"style":3019},[8699],{"type":2479,"value":8700},"      ban",{"type":2474,"tag":2844,"props":8702,"children":8703},{"style":3010},[8704],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8706,"children":8707},{"style":3285},[8708],{"type":2479,"value":3499},{"type":2474,"tag":2844,"props":8710,"children":8711},{"style":3010},[8712],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8714,"children":8715},{"class":2846,"line":3115},[8716],{"type":2474,"tag":2844,"props":8717,"children":8718},{"style":3010},[8719],{"type":2479,"value":3121},{"type":2474,"tag":2844,"props":8721,"children":8722},{"class":2846,"line":3124},[8723],{"type":2474,"tag":2844,"props":8724,"children":8725},{"emptyLinePlaceholder":2880},[8726],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":8728,"children":8729},{"class":2846,"line":3133},[8730,8735,8739],{"type":2474,"tag":2844,"props":8731,"children":8732},{"style":3019},[8733],{"type":2479,"value":8734},"    routes",{"type":2474,"tag":2844,"props":8736,"children":8737},{"style":3010},[8738],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8740,"children":8741},{"style":3004},[8742],{"type":2479,"value":8743}," [\n",{"type":2474,"tag":2844,"props":8745,"children":8746},{"class":2846,"line":3142},[8747],{"type":2474,"tag":2844,"props":8748,"children":8749},{"style":2850},[8750],{"type":2479,"value":8751},"      \u002F\u002F 1. String: uses the global default limit (exact match)\n",{"type":2474,"tag":2844,"props":8753,"children":8754},{"class":2846,"line":3151},[8755,8759,8764,8768],{"type":2474,"tag":2844,"props":8756,"children":8757},{"style":3010},[8758],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":8760,"children":8761},{"style":2865},[8762],{"type":2479,"value":8763},"\u002Fapi\u002Fexample",{"type":2474,"tag":2844,"props":8765,"children":8766},{"style":3010},[8767],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8769,"children":8770},{"style":3010},[8771],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8773,"children":8774},{"class":2846,"line":3160},[8775],{"type":2474,"tag":2844,"props":8776,"children":8777},{"emptyLinePlaceholder":2880},[8778],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":8780,"children":8781},{"class":2846,"line":3169},[8782],{"type":2474,"tag":2844,"props":8783,"children":8784},{"style":2850},[8785],{"type":2479,"value":8786},"      \u002F\u002F 2. Object: custom rate limit for a specific route (exact match)\n",{"type":2474,"tag":2844,"props":8788,"children":8789},{"class":2846,"line":3178},[8790],{"type":2474,"tag":2844,"props":8791,"children":8792},{"style":3010},[8793],{"type":2479,"value":8794},"      {\n",{"type":2474,"tag":2844,"props":8796,"children":8797},{"class":2846,"line":3187},[8798,8803,8807,8811,8816,8820],{"type":2474,"tag":2844,"props":8799,"children":8800},{"style":3019},[8801],{"type":2479,"value":8802},"        path",{"type":2474,"tag":2844,"props":8804,"children":8805},{"style":3010},[8806],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8808,"children":8809},{"style":3010},[8810],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":8812,"children":8813},{"style":2865},[8814],{"type":2479,"value":8815},"\u002Fapi\u002Fexample-per-route",{"type":2474,"tag":2844,"props":8817,"children":8818},{"style":3010},[8819],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8821,"children":8822},{"style":3010},[8823],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8825,"children":8826},{"class":2846,"line":3195},[8827,8832,8836,8841],{"type":2474,"tag":2844,"props":8828,"children":8829},{"style":3019},[8830],{"type":2479,"value":8831},"        max",{"type":2474,"tag":2844,"props":8833,"children":8834},{"style":3010},[8835],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8837,"children":8838},{"style":3285},[8839],{"type":2479,"value":8840}," 5",{"type":2474,"tag":2844,"props":8842,"children":8843},{"style":3010},[8844],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8846,"children":8847},{"class":2846,"line":3204},[8848,8853,8857,8862],{"type":2474,"tag":2844,"props":8849,"children":8850},{"style":3019},[8851],{"type":2479,"value":8852},"        duration",{"type":2474,"tag":2844,"props":8854,"children":8855},{"style":3010},[8856],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8858,"children":8859},{"style":3285},[8860],{"type":2479,"value":8861}," 10",{"type":2474,"tag":2844,"props":8863,"children":8864},{"style":3010},[8865],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8867,"children":8868},{"class":2846,"line":3213},[8869],{"type":2474,"tag":2844,"props":8870,"children":8871},{"style":2850},[8872],{"type":2479,"value":8873},"        \u002F\u002F \"ban\" can also be overridden per route\n",{"type":2474,"tag":2844,"props":8875,"children":8876},{"class":2846,"line":3227},[8877],{"type":2474,"tag":2844,"props":8878,"children":8879},{"style":3010},[8880],{"type":2479,"value":8881},"      },\n",{"type":2474,"tag":2844,"props":8883,"children":8884},{"class":2846,"line":3255},[8885],{"type":2474,"tag":2844,"props":8886,"children":8887},{"emptyLinePlaceholder":2880},[8888],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":8890,"children":8891},{"class":2846,"line":3263},[8892],{"type":2474,"tag":2844,"props":8893,"children":8894},{"style":2850},[8895],{"type":2479,"value":8896},"      \u002F\u002F 3. Object: Wildcard pattern\n",{"type":2474,"tag":2844,"props":8898,"children":8899},{"class":2846,"line":3272},[8900],{"type":2474,"tag":2844,"props":8901,"children":8902},{"style":3010},[8903],{"type":2479,"value":8794},{"type":2474,"tag":2844,"props":8905,"children":8906},{"class":2846,"line":3300},[8907,8911,8915,8919,8924,8928],{"type":2474,"tag":2844,"props":8908,"children":8909},{"style":3019},[8910],{"type":2479,"value":8802},{"type":2474,"tag":2844,"props":8912,"children":8913},{"style":3010},[8914],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8916,"children":8917},{"style":3010},[8918],{"type":2479,"value":3553},{"type":2474,"tag":2844,"props":8920,"children":8921},{"style":2865},[8922],{"type":2479,"value":8923},"\u002Fapi\u002Fusers\u002F*\u002Fprofile",{"type":2474,"tag":2844,"props":8925,"children":8926},{"style":3010},[8927],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":8929,"children":8930},{"style":3010},[8931],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8933,"children":8934},{"class":2846,"line":3317},[8935,8940,8944,8948],{"type":2474,"tag":2844,"props":8936,"children":8937},{"style":3019},[8938],{"type":2479,"value":8939},"        pattern",{"type":2474,"tag":2844,"props":8941,"children":8942},{"style":3010},[8943],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8945,"children":8946},{"style":3339},[8947],{"type":2479,"value":3532},{"type":2474,"tag":2844,"props":8949,"children":8950},{"style":3010},[8951],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8953,"children":8954},{"class":2846,"line":3326},[8955,8959,8963,8967],{"type":2474,"tag":2844,"props":8956,"children":8957},{"style":3019},[8958],{"type":2479,"value":8831},{"type":2474,"tag":2844,"props":8960,"children":8961},{"style":3010},[8962],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8964,"children":8965},{"style":3285},[8966],{"type":2479,"value":8861},{"type":2474,"tag":2844,"props":8968,"children":8969},{"style":3010},[8970],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":8972,"children":8973},{"class":2846,"line":3354},[8974,8978,8982],{"type":2474,"tag":2844,"props":8975,"children":8976},{"style":3019},[8977],{"type":2479,"value":8852},{"type":2474,"tag":2844,"props":8979,"children":8980},{"style":3010},[8981],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":8983,"children":8984},{"style":3285},[8985],{"type":2479,"value":8986}," 60\n",{"type":2474,"tag":2844,"props":8988,"children":8989},{"class":2846,"line":3362},[8990],{"type":2474,"tag":2844,"props":8991,"children":8992},{"style":3010},[8993],{"type":2479,"value":4147},{"type":2474,"tag":2844,"props":8995,"children":8996},{"class":2846,"line":3371},[8997,9002],{"type":2474,"tag":2844,"props":8998,"children":8999},{"style":3004},[9000],{"type":2479,"value":9001},"    ]",{"type":2474,"tag":2844,"props":9003,"children":9004},{"style":3010},[9005],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":9007,"children":9008},{"class":2846,"line":6297},[9009],{"type":2474,"tag":2844,"props":9010,"children":9011},{"style":3010},[9012],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":9014,"children":9015},{"class":2846,"line":6306},[9016,9020,9024],{"type":2474,"tag":2844,"props":9017,"children":9018},{"style":3010},[9019],{"type":2479,"value":3377},{"type":2474,"tag":2844,"props":9021,"children":9022},{"style":3004},[9023],{"type":2479,"value":3382},{"type":2474,"tag":2844,"props":9025,"children":9026},{"style":3010},[9027],{"type":2479,"value":3387},{"type":2474,"tag":2820,"props":9029,"children":9031},{"id":9030},"wildcard-route-support",[9032],{"type":2479,"value":9033},"Wildcard Route Support",{"type":2474,"tag":2481,"props":9035,"children":9036},{},[9037,9039,9045],{"type":2479,"value":9038},"Wildcard patterns allow you to apply the same limits to groups of related API endpoints. Enable them by setting ",{"type":2474,"tag":2631,"props":9040,"children":9042},{"className":9041},[],[9043],{"type":2479,"value":9044},"pattern: true",{"type":2479,"value":9046}," in your route configuration.",{"type":2474,"tag":4711,"props":9048,"children":9050},{"id":9049},"wildcard-pattern-syntax",[9051],{"type":2479,"value":9052},"Wildcard Pattern Syntax",{"type":2474,"tag":2531,"props":9054,"children":9055},{},[9056,9100],{"type":2474,"tag":2535,"props":9057,"children":9058},{},[9059,9071,9073],{"type":2474,"tag":2569,"props":9060,"children":9061},{},[9062,9064,9070],{"type":2479,"value":9063},"Single-Segment Wildcard (",{"type":2474,"tag":2631,"props":9065,"children":9067},{"className":9066},[],[9068],{"type":2479,"value":9069},"*",{"type":2479,"value":3382},{"type":2479,"value":9072},": Matches exactly one path segment.\n",{"type":2474,"tag":2531,"props":9074,"children":9075},{},[9076],{"type":2474,"tag":2535,"props":9077,"children":9078},{},[9079,9084,9086,9092,9093,9099],{"type":2474,"tag":2631,"props":9080,"children":9082},{"className":9081},[],[9083],{"type":2479,"value":8923},{"type":2479,"value":9085}," matches ",{"type":2474,"tag":2631,"props":9087,"children":9089},{"className":9088},[],[9090],{"type":2479,"value":9091},"\u002Fapi\u002Fusers\u002F123\u002Fprofile",{"type":2479,"value":6766},{"type":2474,"tag":2631,"props":9094,"children":9096},{"className":9095},[],[9097],{"type":2479,"value":9098},"\u002Fapi\u002Fusers\u002Fadmin\u002Fprofile",{"type":2479,"value":3974},{"type":2474,"tag":2535,"props":9101,"children":9102},{},[9103,9115,9117],{"type":2474,"tag":2569,"props":9104,"children":9105},{},[9106,9108,9114],{"type":2479,"value":9107},"Multi-Segment Wildcard (",{"type":2474,"tag":2631,"props":9109,"children":9111},{"className":9110},[],[9112],{"type":2479,"value":9113},"**",{"type":2479,"value":3382},{"type":2479,"value":9116},": Matches zero or more path segments.\n",{"type":2474,"tag":2531,"props":9118,"children":9119},{},[9120],{"type":2474,"tag":2535,"props":9121,"children":9122},{},[9123,9129,9130,9136,9137,9143],{"type":2474,"tag":2631,"props":9124,"children":9126},{"className":9125},[],[9127],{"type":2479,"value":9128},"\u002Fapi\u002Freports\u002F**\u002Fsummary",{"type":2479,"value":9085},{"type":2474,"tag":2631,"props":9131,"children":9133},{"className":9132},[],[9134],{"type":2479,"value":9135},"\u002Fapi\u002Freports\u002Fmonthly\u002F2023\u002Fsummary",{"type":2479,"value":6766},{"type":2474,"tag":2631,"props":9138,"children":9140},{"className":9139},[],[9141],{"type":2479,"value":9142},"\u002Fapi\u002Freports\u002Fsummary",{"type":2479,"value":3974},{"type":2474,"tag":4711,"props":9145,"children":9147},{"id":9146},"pattern-precedence",[9148],{"type":2479,"value":9149},"Pattern Precedence",{"type":2474,"tag":9151,"props":9152,"children":9153},"ol",{},[9154,9164,9174],{"type":2474,"tag":2535,"props":9155,"children":9156},{},[9157,9162],{"type":2474,"tag":2569,"props":9158,"children":9159},{},[9160],{"type":2479,"value":9161},"Exact matches",{"type":2479,"value":9163}," always take precedence over wildcard patterns.",{"type":2474,"tag":2535,"props":9165,"children":9166},{},[9167,9172],{"type":2474,"tag":2569,"props":9168,"children":9169},{},[9170],{"type":2479,"value":9171},"More specific wildcards",{"type":2479,"value":9173}," take precedence over less specific ones.",{"type":2474,"tag":2535,"props":9175,"children":9176},{},[9177],{"type":2479,"value":9178},"When multiple wildcard patterns match, the most specific one is used.",{"type":2474,"tag":4711,"props":9180,"children":9182},{"id":9181},"important-notes",[9183],{"type":2479,"value":9184},"Important Notes",{"type":2474,"tag":2531,"props":9186,"children":9187},{},[9188,9198],{"type":2474,"tag":2535,"props":9189,"children":9190},{},[9191,9196],{"type":2474,"tag":2569,"props":9192,"children":9193},{},[9194],{"type":2479,"value":9195},"Shared Rate Limits:",{"type":2479,"value":9197}," All requests that match the same wildcard pattern share the same rate limit counter.",{"type":2474,"tag":2535,"props":9199,"children":9200},{},[9201,9206,9208,9214,9215,9221],{"type":2474,"tag":2569,"props":9202,"children":9203},{},[9204],{"type":2479,"value":9205},"Security:",{"type":2479,"value":9207}," Broad or dangerous patterns like ",{"type":2474,"tag":2631,"props":9209,"children":9211},{"className":9210},[],[9212],{"type":2479,"value":9213},"\u002F**",{"type":2479,"value":6766},{"type":2474,"tag":2631,"props":9216,"children":9218},{"className":9217},[],[9219],{"type":2479,"value":9220},"\u002F*",{"type":2479,"value":9222}," are automatically rejected to prevent accidental global blocking.",{"type":2474,"tag":2557,"props":9224,"children":9226},{"id":9225},"skipping-routes",[9227],{"type":2479,"value":9228},"Skipping Routes",{"type":2474,"tag":2481,"props":9230,"children":9231},{},[9232,9233,9239,9241,9246],{"type":2479,"value":3845},{"type":2474,"tag":2631,"props":9234,"children":9236},{"className":9235},[],[9237],{"type":2479,"value":9238},"skipRoutes",{"type":2479,"value":9240}," option lets you exempt specific paths from all shield processing (ban check, rate limit counter, and logging) without needing to list every protected route in the ",{"type":2474,"tag":2631,"props":9242,"children":9244},{"className":9243},[],[9245],{"type":2479,"value":8547},{"type":2479,"value":9247}," array.",{"type":2474,"tag":2481,"props":9249,"children":9250},{},[9251],{"type":2479,"value":9252},"This is useful for health checks, webhook endpoints, monitoring probes, or internal status routes that should always respond regardless of traffic.",{"type":2474,"tag":2820,"props":9254,"children":9256},{"id":9255},"configuration-example-1",[9257],{"type":2479,"value":8537},{"type":2474,"tag":2834,"props":9259,"children":9261},{"className":4745,"code":9260,"language":4747,"meta":2418,"style":2418},"export default defineNuxtConfig({\n  modules: [\"nuxt-api-shield\"],\n\n  nuxtApiShield: {\n    limit: {\n      max: 12,\n      duration: 108,\n      ban: 3600,\n    },\n\n    skipRoutes: [\n      \"\u002Fapi\u002Fhealth\",          \u002F\u002F exact match\n      \"\u002Fapi\u002F_nuxt\u002F**\",        \u002F\u002F multi-segment wildcard\n      \"\u002Fapi\u002Fwebhooks\u002Fstripe\", \u002F\u002F exact match\n    ],\n  },\n})\n",[9262],{"type":2474,"tag":2631,"props":9263,"children":9264},{"__ignoreMap":2418},[9265,9288,9323,9330,9345,9360,9379,9398,9417,9424,9431,9446,9471,9496,9521,9532,9539],{"type":2474,"tag":2844,"props":9266,"children":9267},{"class":2846,"line":2446},[9268,9272,9276,9280,9284],{"type":2474,"tag":2844,"props":9269,"children":9270},{"style":2987},[9271],{"type":2479,"value":2990},{"type":2474,"tag":2844,"props":9273,"children":9274},{"style":2987},[9275],{"type":2479,"value":2995},{"type":2474,"tag":2844,"props":9277,"children":9278},{"style":2998},[9279],{"type":2479,"value":3001},{"type":2474,"tag":2844,"props":9281,"children":9282},{"style":3004},[9283],{"type":2479,"value":3007},{"type":2474,"tag":2844,"props":9285,"children":9286},{"style":3010},[9287],{"type":2479,"value":3013},{"type":2474,"tag":2844,"props":9289,"children":9290},{"class":2846,"line":2442},[9291,9295,9299,9303,9307,9311,9315,9319],{"type":2474,"tag":2844,"props":9292,"children":9293},{"style":3019},[9294],{"type":2479,"value":3022},{"type":2474,"tag":2844,"props":9296,"children":9297},{"style":3010},[9298],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":9300,"children":9301},{"style":3004},[9302],{"type":2479,"value":3032},{"type":2474,"tag":2844,"props":9304,"children":9305},{"style":3010},[9306],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":9308,"children":9309},{"style":2865},[9310],{"type":2479,"value":2415},{"type":2474,"tag":2844,"props":9312,"children":9313},{"style":3010},[9314],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":9316,"children":9317},{"style":3004},[9318],{"type":2479,"value":3050},{"type":2474,"tag":2844,"props":9320,"children":9321},{"style":3010},[9322],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":9324,"children":9325},{"class":2846,"line":2876},[9326],{"type":2474,"tag":2844,"props":9327,"children":9328},{"emptyLinePlaceholder":2880},[9329],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":9331,"children":9332},{"class":2846,"line":2886},[9333,9337,9341],{"type":2474,"tag":2844,"props":9334,"children":9335},{"style":3019},[9336],{"type":2479,"value":3063},{"type":2474,"tag":2844,"props":9338,"children":9339},{"style":3010},[9340],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":9342,"children":9343},{"style":3010},[9344],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":9346,"children":9347},{"class":2846,"line":2438},[9348,9352,9356],{"type":2474,"tag":2844,"props":9349,"children":9350},{"style":3019},[9351],{"type":2479,"value":8644},{"type":2474,"tag":2844,"props":9353,"children":9354},{"style":3010},[9355],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":9357,"children":9358},{"style":3010},[9359],{"type":2479,"value":3072},{"type":2474,"tag":2844,"props":9361,"children":9362},{"class":2846,"line":2911},[9363,9367,9371,9375],{"type":2474,"tag":2844,"props":9364,"children":9365},{"style":3019},[9366],{"type":2479,"value":8660},{"type":2474,"tag":2844,"props":9368,"children":9369},{"style":3010},[9370],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":9372,"children":9373},{"style":3285},[9374],{"type":2479,"value":3452},{"type":2474,"tag":2844,"props":9376,"children":9377},{"style":3010},[9378],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":9380,"children":9381},{"class":2846,"line":2919},[9382,9386,9390,9394],{"type":2474,"tag":2844,"props":9383,"children":9384},{"style":3019},[9385],{"type":2479,"value":8680},{"type":2474,"tag":2844,"props":9387,"children":9388},{"style":3010},[9389],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":9391,"children":9392},{"style":3285},[9393],{"type":2479,"value":3473},{"type":2474,"tag":2844,"props":9395,"children":9396},{"style":3010},[9397],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":9399,"children":9400},{"class":2846,"line":2463},[9401,9405,9409,9413],{"type":2474,"tag":2844,"props":9402,"children":9403},{"style":3019},[9404],{"type":2479,"value":8700},{"type":2474,"tag":2844,"props":9406,"children":9407},{"style":3010},[9408],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":9410,"children":9411},{"style":3285},[9412],{"type":2479,"value":3499},{"type":2474,"tag":2844,"props":9414,"children":9415},{"style":3010},[9416],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":9418,"children":9419},{"class":2846,"line":3115},[9420],{"type":2474,"tag":2844,"props":9421,"children":9422},{"style":3010},[9423],{"type":2479,"value":3121},{"type":2474,"tag":2844,"props":9425,"children":9426},{"class":2846,"line":3124},[9427],{"type":2474,"tag":2844,"props":9428,"children":9429},{"emptyLinePlaceholder":2880},[9430],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":9432,"children":9433},{"class":2846,"line":3133},[9434,9438,9442],{"type":2474,"tag":2844,"props":9435,"children":9436},{"style":3019},[9437],{"type":2479,"value":3233},{"type":2474,"tag":2844,"props":9439,"children":9440},{"style":3010},[9441],{"type":2479,"value":3027},{"type":2474,"tag":2844,"props":9443,"children":9444},{"style":3004},[9445],{"type":2479,"value":8743},{"type":2474,"tag":2844,"props":9447,"children":9448},{"class":2846,"line":3142},[9449,9453,9458,9462,9466],{"type":2474,"tag":2844,"props":9450,"children":9451},{"style":3010},[9452],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":9454,"children":9455},{"style":2865},[9456],{"type":2479,"value":9457},"\u002Fapi\u002Fhealth",{"type":2474,"tag":2844,"props":9459,"children":9460},{"style":3010},[9461],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":9463,"children":9464},{"style":3010},[9465],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":9467,"children":9468},{"style":2850},[9469],{"type":2479,"value":9470},"          \u002F\u002F exact match\n",{"type":2474,"tag":2844,"props":9472,"children":9473},{"class":2846,"line":3151},[9474,9478,9483,9487,9491],{"type":2474,"tag":2844,"props":9475,"children":9476},{"style":3010},[9477],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":9479,"children":9480},{"style":2865},[9481],{"type":2479,"value":9482},"\u002Fapi\u002F_nuxt\u002F**",{"type":2474,"tag":2844,"props":9484,"children":9485},{"style":3010},[9486],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":9488,"children":9489},{"style":3010},[9490],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":9492,"children":9493},{"style":2850},[9494],{"type":2479,"value":9495},"        \u002F\u002F multi-segment wildcard\n",{"type":2474,"tag":2844,"props":9497,"children":9498},{"class":2846,"line":3160},[9499,9503,9508,9512,9516],{"type":2474,"tag":2844,"props":9500,"children":9501},{"style":3010},[9502],{"type":2479,"value":4080},{"type":2474,"tag":2844,"props":9504,"children":9505},{"style":2865},[9506],{"type":2479,"value":9507},"\u002Fapi\u002Fwebhooks\u002Fstripe",{"type":2474,"tag":2844,"props":9509,"children":9510},{"style":3010},[9511],{"type":2479,"value":3037},{"type":2474,"tag":2844,"props":9513,"children":9514},{"style":3010},[9515],{"type":2479,"value":3247},{"type":2474,"tag":2844,"props":9517,"children":9518},{"style":2850},[9519],{"type":2479,"value":9520}," \u002F\u002F exact match\n",{"type":2474,"tag":2844,"props":9522,"children":9523},{"class":2846,"line":3169},[9524,9528],{"type":2474,"tag":2844,"props":9525,"children":9526},{"style":3004},[9527],{"type":2479,"value":9001},{"type":2474,"tag":2844,"props":9529,"children":9530},{"style":3010},[9531],{"type":2479,"value":3055},{"type":2474,"tag":2844,"props":9533,"children":9534},{"class":2846,"line":3178},[9535],{"type":2474,"tag":2844,"props":9536,"children":9537},{"style":3010},[9538],{"type":2479,"value":3368},{"type":2474,"tag":2844,"props":9540,"children":9541},{"class":2846,"line":3187},[9542,9546],{"type":2474,"tag":2844,"props":9543,"children":9544},{"style":3010},[9545],{"type":2479,"value":3377},{"type":2474,"tag":2844,"props":9547,"children":9548},{"style":3004},[9549],{"type":2479,"value":7513},{"type":2474,"tag":2820,"props":9551,"children":9553},{"id":9552},"how-it-works",[9554],{"type":2479,"value":9555},"How It Works",{"type":2474,"tag":2531,"props":9557,"children":9558},{},[9559,9571,9583],{"type":2474,"tag":2535,"props":9560,"children":9561},{},[9562,9564,9569],{"type":2479,"value":9563},"Routes in ",{"type":2474,"tag":2631,"props":9565,"children":9567},{"className":9566},[],[9568],{"type":2479,"value":9238},{"type":2479,"value":9570}," bypass the middleware entirely — no ban check, no rate limit counter, no log entry.",{"type":2474,"tag":2535,"props":9572,"children":9573},{},[9574,9576,9581],{"type":2479,"value":9575},"The rest of your API routes (those matching the global defaults or the ",{"type":2474,"tag":2631,"props":9577,"children":9579},{"className":9578},[],[9580],{"type":2479,"value":8547},{"type":2479,"value":9582}," option) continue to be rate limited normally.",{"type":2474,"tag":2535,"props":9584,"children":9585},{},[9586,9588,9593,9595,9600],{"type":2479,"value":9587},"Supports the same wildcard syntax as per-route patterns: ",{"type":2474,"tag":2631,"props":9589,"children":9591},{"className":9590},[],[9592],{"type":2479,"value":9069},{"type":2479,"value":9594}," for single segment, ",{"type":2474,"tag":2631,"props":9596,"children":9598},{"className":9597},[],[9599],{"type":2479,"value":9113},{"type":2479,"value":9601}," for multi-segment.",{"type":2474,"tag":2557,"props":9603,"children":9605},{"id":9604},"important-considerations",[9606],{"type":2479,"value":9607},"Important Considerations",{"type":2474,"tag":2820,"props":9609,"children":9611},{"id":9610},"data-privacy-ip-address-storage",[9612],{"type":2479,"value":9613},"Data Privacy (IP Address Storage)",{"type":2474,"tag":2481,"props":9615,"children":9616},{},[9617,9622],{"type":2474,"tag":2631,"props":9618,"children":9620},{"className":9619},[],[9621],{"type":2479,"value":2415},{"type":2479,"value":9623}," functions by tracking IP addresses to monitor request rates and apply bans. This means IP addresses, which can be considered Personally Identifiable Information (PII) under regulations like GDPR, are stored by the module.",{"type":2474,"tag":2531,"props":9625,"children":9626},{},[9627,9668,9678],{"type":2474,"tag":2535,"props":9628,"children":9629},{},[9630,9635],{"type":2474,"tag":2569,"props":9631,"children":9632},{},[9633],{"type":2479,"value":9634},"Data Stored:",{"type":2474,"tag":2531,"props":9636,"children":9637},{},[9638,9657],{"type":2474,"tag":2535,"props":9639,"children":9640},{},[9641,9647,9649,9655],{"type":2474,"tag":2631,"props":9642,"children":9644},{"className":9643},[],[9645],{"type":2479,"value":9646},"ip:\u003CIP_ADDRESS>",{"type":2479,"value":9648},": Stores ",{"type":2474,"tag":2631,"props":9650,"children":9652},{"className":9651},[],[9653],{"type":2479,"value":9654},"{ count: number, time: number }",{"type":2479,"value":9656}," for tracking request rates.",{"type":2474,"tag":2535,"props":9658,"children":9659},{},[9660,9666],{"type":2474,"tag":2631,"props":9661,"children":9663},{"className":9662},[],[9664],{"type":2479,"value":9665},"ban:\u003CIP_ADDRESS>",{"type":2479,"value":9667},": Stores a timestamp indicating when a ban on an IP address expires.",{"type":2474,"tag":2535,"props":9669,"children":9670},{},[9671,9676],{"type":2474,"tag":2569,"props":9672,"children":9673},{},[9674],{"type":2479,"value":9675},"Compliance:",{"type":2479,"value":9677}," Ensure your usage complies with any applicable data privacy regulations. This may involve updating your privacy policy to inform users about this data processing.",{"type":2474,"tag":2535,"props":9679,"children":9680},{},[9681,9686],{"type":2474,"tag":2569,"props":9682,"children":9683},{},[9684],{"type":2479,"value":9685},"Data Retention:",{"type":2474,"tag":2531,"props":9687,"children":9688},{},[9689,9701],{"type":2474,"tag":2535,"props":9690,"children":9691},{},[9692,9694,9699],{"type":2479,"value":9693},"Ban entries are cleaned up by the ",{"type":2474,"tag":2631,"props":9695,"children":9697},{"className":9696},[],[9698],{"type":2479,"value":2728},{"type":2479,"value":9700}," task after expiry.",{"type":2474,"tag":2535,"props":9702,"children":9703},{},[9704,9706,9711,9713,9718],{"type":2479,"value":9705},"IP tracking entries are cleaned up by the ",{"type":2474,"tag":2631,"props":9707,"children":9709},{"className":9708},[],[9710],{"type":2479,"value":2736},{"type":2479,"value":9712}," task based on the ",{"type":2474,"tag":2631,"props":9714,"children":9716},{"className":9715},[],[9717],{"type":2479,"value":4435},{"type":2479,"value":9719}," setting.",{"type":2474,"tag":2820,"props":9721,"children":9723},{"id":9722},"storage-security",[9724],{"type":2479,"value":9725},"Storage Security",{"type":2474,"tag":2531,"props":9727,"children":9728},{},[9729,9807],{"type":2474,"tag":2535,"props":9730,"children":9731},{},[9732,9745,9747,9753,9755,9760,9761,9767,9769,9775,9777,9782,9784],{"type":2474,"tag":2569,"props":9733,"children":9734},{},[9735,9737,9743],{"type":2479,"value":9736},"Filesystem Driver (",{"type":2474,"tag":2631,"props":9738,"children":9740},{"className":9739},[],[9741],{"type":2479,"value":9742},"driver: 'fs'",{"type":2479,"value":9744},"):",{"type":2479,"value":9746}," If you use the filesystem driver for ",{"type":2474,"tag":2631,"props":9748,"children":9750},{"className":9749},[],[9751],{"type":2479,"value":9752},"unstorage",{"type":2479,"value":9754}," (e.g., ",{"type":2474,"tag":2631,"props":9756,"children":9758},{"className":9757},[],[9759],{"type":2479,"value":9742},{"type":2479,"value":2796},{"type":2474,"tag":2631,"props":9762,"children":9764},{"className":9763},[],[9765],{"type":2479,"value":9766},"base: '.shield'",{"type":2479,"value":9768},"), ensure that the storage directory (and the ",{"type":2474,"tag":2631,"props":9770,"children":9772},{"className":9771},[],[9773],{"type":2479,"value":9774},"logs",{"type":2479,"value":9776}," directory if logging is enabled via ",{"type":2474,"tag":2631,"props":9778,"children":9780},{"className":9779},[],[9781],{"type":2479,"value":7305},{"type":2479,"value":9783},") is:\n",{"type":2474,"tag":2531,"props":9785,"children":9786},{},[9787,9797],{"type":2474,"tag":2535,"props":9788,"children":9789},{},[9790,9795],{"type":2474,"tag":2569,"props":9791,"children":9792},{},[9793],{"type":2479,"value":9794},"Not web-accessible:",{"type":2479,"value":9796}," Your web server should not be configured to serve files from these directories.",{"type":2474,"tag":2535,"props":9798,"children":9799},{},[9800,9805],{"type":2474,"tag":2569,"props":9801,"children":9802},{},[9803],{"type":2479,"value":9804},"Properly permissioned:",{"type":2479,"value":9806}," The directories should have appropriate server-side file permissions to prevent unauthorized reading or writing.",{"type":2474,"tag":2535,"props":9808,"children":9809},{},[9810,9815],{"type":2474,"tag":2569,"props":9811,"children":9812},{},[9813],{"type":2479,"value":9814},"Other Drivers (Redis, etc.):",{"type":2479,"value":9816}," If using database drivers like Redis, ensure your database server itself is secured (e.g., authentication, network access controls).",{"type":2474,"tag":2820,"props":9818,"children":9820},{"id":9819},"error-message-errormessage",[9821,9823,9829],{"type":2479,"value":9822},"Error Message (",{"type":2474,"tag":2631,"props":9824,"children":9826},{"className":9825},[],[9827],{"type":2479,"value":9828},"errorMessage",{"type":2479,"value":3382},{"type":2474,"tag":2481,"props":9831,"children":9832},{},[9833,9834,9839],{"type":2479,"value":3845},{"type":2474,"tag":2631,"props":9835,"children":9837},{"className":9836},[],[9838],{"type":2479,"value":9828},{"type":2479,"value":9840}," option in the module configuration is returned in the body of a 429 response.",{"type":2474,"tag":2531,"props":9842,"children":9843},{},[9844,9849],{"type":2474,"tag":2535,"props":9845,"children":9846},{},[9847],{"type":2479,"value":9848},"It's recommended to use a plain text message.",{"type":2474,"tag":2535,"props":9850,"children":9851},{},[9852,9854,9859],{"type":2479,"value":9853},"If you choose to use HTML in your ",{"type":2474,"tag":2631,"props":9855,"children":9857},{"className":9856},[],[9858],{"type":2479,"value":9828},{"type":2479,"value":9860},", ensure your client-side application correctly sanitizes it or renders it in a way that prevents XSS vulnerabilities. The module itself does not sanitize this user-configured message.",{"type":2474,"tag":2557,"props":9862,"children":9864},{"id":9863},"development",[9865],{"type":2479,"value":9866},"Development",{"type":2474,"tag":2834,"props":9868,"children":9870},{"className":2836,"code":9869,"language":2838,"meta":2418,"style":2418},"# Install dependencies\nyarn\n\n# Generate type stubs\nyarn dev:prepare\n\n# Develop with the playground\nyarn dev\n\n# Build the playground\nyarn dev:build\n\n# Run ESLint\nyarn lint\n\n# Run Vitest\nyarn test\nyarn test:watch\n\n# Release new version\nyarn release:patch\nyarn release:minor\n",[9871],{"type":2474,"tag":2631,"props":9872,"children":9873},{"__ignoreMap":2418},[9874,9882,9890,9897,9905,9917,9924,9932,9944,9951,9959,9971,9978,9986,9998,10005,10013,10025,10037,10044,10052,10064],{"type":2474,"tag":2844,"props":9875,"children":9876},{"class":2846,"line":2446},[9877],{"type":2474,"tag":2844,"props":9878,"children":9879},{"style":2850},[9880],{"type":2479,"value":9881},"# Install dependencies\n",{"type":2474,"tag":2844,"props":9883,"children":9884},{"class":2846,"line":2442},[9885],{"type":2474,"tag":2844,"props":9886,"children":9887},{"style":2859},[9888],{"type":2479,"value":9889},"yarn\n",{"type":2474,"tag":2844,"props":9891,"children":9892},{"class":2846,"line":2876},[9893],{"type":2474,"tag":2844,"props":9894,"children":9895},{"emptyLinePlaceholder":2880},[9896],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":9898,"children":9899},{"class":2846,"line":2886},[9900],{"type":2474,"tag":2844,"props":9901,"children":9902},{"style":2850},[9903],{"type":2479,"value":9904},"# Generate type stubs\n",{"type":2474,"tag":2844,"props":9906,"children":9907},{"class":2846,"line":2438},[9908,9912],{"type":2474,"tag":2844,"props":9909,"children":9910},{"style":2859},[9911],{"type":2479,"value":2900},{"type":2474,"tag":2844,"props":9913,"children":9914},{"style":2865},[9915],{"type":2479,"value":9916}," dev:prepare\n",{"type":2474,"tag":2844,"props":9918,"children":9919},{"class":2846,"line":2911},[9920],{"type":2474,"tag":2844,"props":9921,"children":9922},{"emptyLinePlaceholder":2880},[9923],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":9925,"children":9926},{"class":2846,"line":2919},[9927],{"type":2474,"tag":2844,"props":9928,"children":9929},{"style":2850},[9930],{"type":2479,"value":9931},"# Develop with the playground\n",{"type":2474,"tag":2844,"props":9933,"children":9934},{"class":2846,"line":2463},[9935,9939],{"type":2474,"tag":2844,"props":9936,"children":9937},{"style":2859},[9938],{"type":2479,"value":2900},{"type":2474,"tag":2844,"props":9940,"children":9941},{"style":2865},[9942],{"type":2479,"value":9943}," dev\n",{"type":2474,"tag":2844,"props":9945,"children":9946},{"class":2846,"line":3115},[9947],{"type":2474,"tag":2844,"props":9948,"children":9949},{"emptyLinePlaceholder":2880},[9950],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":9952,"children":9953},{"class":2846,"line":3124},[9954],{"type":2474,"tag":2844,"props":9955,"children":9956},{"style":2850},[9957],{"type":2479,"value":9958},"# Build the playground\n",{"type":2474,"tag":2844,"props":9960,"children":9961},{"class":2846,"line":3133},[9962,9966],{"type":2474,"tag":2844,"props":9963,"children":9964},{"style":2859},[9965],{"type":2479,"value":2900},{"type":2474,"tag":2844,"props":9967,"children":9968},{"style":2865},[9969],{"type":2479,"value":9970}," dev:build\n",{"type":2474,"tag":2844,"props":9972,"children":9973},{"class":2846,"line":3142},[9974],{"type":2474,"tag":2844,"props":9975,"children":9976},{"emptyLinePlaceholder":2880},[9977],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":9979,"children":9980},{"class":2846,"line":3151},[9981],{"type":2474,"tag":2844,"props":9982,"children":9983},{"style":2850},[9984],{"type":2479,"value":9985},"# Run ESLint\n",{"type":2474,"tag":2844,"props":9987,"children":9988},{"class":2846,"line":3160},[9989,9993],{"type":2474,"tag":2844,"props":9990,"children":9991},{"style":2859},[9992],{"type":2479,"value":2900},{"type":2474,"tag":2844,"props":9994,"children":9995},{"style":2865},[9996],{"type":2479,"value":9997}," lint\n",{"type":2474,"tag":2844,"props":9999,"children":10000},{"class":2846,"line":3169},[10001],{"type":2474,"tag":2844,"props":10002,"children":10003},{"emptyLinePlaceholder":2880},[10004],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":10006,"children":10007},{"class":2846,"line":3178},[10008],{"type":2474,"tag":2844,"props":10009,"children":10010},{"style":2850},[10011],{"type":2479,"value":10012},"# Run Vitest\n",{"type":2474,"tag":2844,"props":10014,"children":10015},{"class":2846,"line":3187},[10016,10020],{"type":2474,"tag":2844,"props":10017,"children":10018},{"style":2859},[10019],{"type":2479,"value":2900},{"type":2474,"tag":2844,"props":10021,"children":10022},{"style":2865},[10023],{"type":2479,"value":10024}," test\n",{"type":2474,"tag":2844,"props":10026,"children":10027},{"class":2846,"line":3195},[10028,10032],{"type":2474,"tag":2844,"props":10029,"children":10030},{"style":2859},[10031],{"type":2479,"value":2900},{"type":2474,"tag":2844,"props":10033,"children":10034},{"style":2865},[10035],{"type":2479,"value":10036}," test:watch\n",{"type":2474,"tag":2844,"props":10038,"children":10039},{"class":2846,"line":3204},[10040],{"type":2474,"tag":2844,"props":10041,"children":10042},{"emptyLinePlaceholder":2880},[10043],{"type":2479,"value":2883},{"type":2474,"tag":2844,"props":10045,"children":10046},{"class":2846,"line":3213},[10047],{"type":2474,"tag":2844,"props":10048,"children":10049},{"style":2850},[10050],{"type":2479,"value":10051},"# Release new version\n",{"type":2474,"tag":2844,"props":10053,"children":10054},{"class":2846,"line":3227},[10055,10059],{"type":2474,"tag":2844,"props":10056,"children":10057},{"style":2859},[10058],{"type":2479,"value":2900},{"type":2474,"tag":2844,"props":10060,"children":10061},{"style":2865},[10062],{"type":2479,"value":10063}," release:patch\n",{"type":2474,"tag":2844,"props":10065,"children":10066},{"class":2846,"line":3255},[10067,10071],{"type":2474,"tag":2844,"props":10068,"children":10069},{"style":2859},[10070],{"type":2479,"value":2900},{"type":2474,"tag":2844,"props":10072,"children":10073},{"style":2865},[10074],{"type":2479,"value":10075}," release:minor\n",{"type":2474,"tag":10077,"props":10078,"children":10079},"style",{},[10080],{"type":2479,"value":10081},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":2418,"searchDepth":2442,"depth":2442,"links":10083},[10084,10085,10096,10101,10106,10112,10116,10120,10126],{"id":2559,"depth":2442,"text":450},{"id":2815,"depth":2442,"text":2818,"children":10086},[10087,10089,10091,10093,10095],{"id":2822,"depth":2876,"text":10088},"1. Add nuxt-api-shield dependency to your project",{"id":2945,"depth":2876,"text":10090},"2. Add nuxt-api-shield to the modules section of nuxt.config.ts",{"id":3977,"depth":2876,"text":10092},"3. Add nitro\u002Fstorage to nuxt.config.ts",{"id":4386,"depth":2876,"text":10094},"4. Schedule bundled cleanup tasks in nuxt.config.ts",{"id":4687,"depth":2876,"text":4690},{"id":6776,"depth":2442,"text":6779,"children":10097},[10098,10099],{"id":6782,"depth":2876,"text":6785},{"id":7192,"depth":2876,"text":10100},"When memory \u002F fs is acceptable",{"id":7251,"depth":2442,"text":7254,"children":10102},[10103,10104,10105],{"id":7277,"depth":2876,"text":7280},{"id":7531,"depth":2876,"text":7534},{"id":7583,"depth":2876,"text":7586},{"id":7849,"depth":2442,"text":7852,"children":10107},[10108,10110],{"id":7860,"depth":2876,"text":10109},"RateLimit Type",{"id":8412,"depth":2876,"text":10111},"ModuleOptions Type",{"id":8479,"depth":2442,"text":8482,"children":10113},[10114,10115],{"id":8534,"depth":2876,"text":8537},{"id":9030,"depth":2876,"text":9033},{"id":9225,"depth":2442,"text":9228,"children":10117},[10118,10119],{"id":9255,"depth":2876,"text":8537},{"id":9552,"depth":2876,"text":9555},{"id":9604,"depth":2442,"text":9607,"children":10121},[10122,10123,10124],{"id":9610,"depth":2876,"text":9613},{"id":9722,"depth":2876,"text":9725},{"id":9819,"depth":2876,"text":10125},"Error Message (errorMessage)",{"id":9863,"depth":2442,"text":9866},{"v5":10128,"v4":10129,"v3":10130,"v2":10131},"5 (nightly)","4.5.2","3.21.11","2.18.1"]