[{"data":1,"prerenderedAt":1396},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-auto/getting-started/introduction-en":444,"/docs/nuxt-auto/getting-started/introduction-surround-en":1391},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","/docs/landing","0.docs/1.landing/001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","/docs/landing/built-in-features","0.docs/1.landing/002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","/docs/landing/content","0.docs/1.landing/02.content/1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","/docs/landing/content/details","0.docs/1.landing/02.content/2.details",{"title":24,"path":25,"stem":26},"Technical","/docs/landing/content/technical","0.docs/1.landing/02.content/4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","/docs/landing/regional","0.docs/1.landing/03.regional/1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"/docs/landing/regional/details","0.docs/1.landing/03.regional/2.details",{"title":24,"path":38,"stem":39},"/docs/landing/regional/technical","0.docs/1.landing/03.regional/4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","/docs/landing/multilang","0.docs/1.landing/04.multilang/1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"/docs/landing/multilang/details","0.docs/1.landing/04.multilang/2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","/docs/landing/blog","0.docs/1.landing/05.blog/1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"/docs/landing/blog/details","0.docs/1.landing/05.blog/2.details",{"title":24,"path":61,"stem":62},"/docs/landing/blog/technical","0.docs/1.landing/05.blog/4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","/docs/landing/docs","0.docs/1.landing/06.docs/1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"/docs/landing/docs/details","0.docs/1.landing/06.docs/2.details",{"title":24,"path":74,"stem":75},"/docs/landing/docs/technical","0.docs/1.landing/06.docs/4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","/docs/landing/forms","0.docs/1.landing/07.forms/1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"/docs/landing/forms/details","0.docs/1.landing/07.forms/2.details",{"title":87,"path":88,"stem":89},"Admin","/docs/landing/forms/admin","0.docs/1.landing/07.forms/3.admin",{"title":24,"path":91,"stem":92},"/docs/landing/forms/technical","0.docs/1.landing/07.forms/4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","/docs/landing/email","0.docs/1.landing/08.email/1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"/docs/landing/email/details","0.docs/1.landing/08.email/2.details",{"title":87,"path":104,"stem":105},"/docs/landing/email/admin","0.docs/1.landing/08.email/3.admin",{"title":24,"path":107,"stem":108},"/docs/landing/email/technical","0.docs/1.landing/08.email/4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","/docs/landing/feedback","0.docs/1.landing/09.feedback/1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"/docs/landing/feedback/details","0.docs/1.landing/09.feedback/2.details",{"title":87,"path":120,"stem":121},"/docs/landing/feedback/admin","0.docs/1.landing/09.feedback/3.admin",{"title":24,"path":123,"stem":124},"/docs/landing/feedback/technical","0.docs/1.landing/09.feedback/4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","/docs/landing/feedback/compare","0.docs/1.landing/09.feedback/5.compare",{"title":130,"path":131,"stem":132},"FAQ","/docs/landing/feedback/faq","0.docs/1.landing/09.feedback/6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","/docs/landing/storage","0.docs/1.landing/10.storage/1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"/docs/landing/storage/details","0.docs/1.landing/10.storage/2.details",{"title":87,"path":144,"stem":145},"/docs/landing/storage/admin","0.docs/1.landing/10.storage/3.admin",{"title":24,"path":147,"stem":148},"/docs/landing/storage/technical","0.docs/1.landing/10.storage/4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","/docs/landing/offline-first","0.docs/1.landing/11.offline-first/1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","/docs/landing/yjs-sync","0.docs/1.landing/12.yjs-sync/1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"/docs/landing/yjs-sync/details","0.docs/1.landing/12.yjs-sync/2.details",{"title":87,"path":167,"stem":168},"/docs/landing/yjs-sync/admin","0.docs/1.landing/12.yjs-sync/3.admin",{"title":24,"path":170,"stem":171},"/docs/landing/yjs-sync/technical","0.docs/1.landing/12.yjs-sync/4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","/docs/landing/newsletter","0.docs/1.landing/13.newsletter/index",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,298],{"title":5,"path":182,"stem":183},"/docs/nuxt-auto","0.docs/3.nuxt-auto/index",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","/docs/nuxt-auto/getting-started","0.docs/3.nuxt-auto/1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","/docs/nuxt-auto/getting-started/introduction","0.docs/3.nuxt-auto/1.getting-started/1.introduction",{"title":194,"path":195,"stem":196},"Installation","/docs/nuxt-auto/getting-started/installation","0.docs/3.nuxt-auto/1.getting-started/2.installation",{"title":198,"path":199,"stem":200},"Quick Start","/docs/nuxt-auto/getting-started/quick-start","0.docs/3.nuxt-auto/1.getting-started/3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","/docs/nuxt-auto/auto-api","0.docs/3.nuxt-auto/2.auto-api",[207,210,214,218,222,226,230,234,238,242,246,250,254,258,262,266,270,274,278,282,286,290,294],{"title":185,"path":208,"stem":209},"/docs/nuxt-auto/auto-api/getting-started","0.docs/3.nuxt-auto/2.auto-api/1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","/docs/nuxt-auto/auto-api/aggregations","0.docs/3.nuxt-auto/2.auto-api/10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","/docs/nuxt-auto/auto-api/lifecycle-hooks","0.docs/3.nuxt-auto/2.auto-api/11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","/docs/nuxt-auto/auto-api/m2m-relationships","0.docs/3.nuxt-auto/2.auto-api/12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","/docs/nuxt-auto/auto-api/plugin-system","0.docs/3.nuxt-auto/2.auto-api/13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","/docs/nuxt-auto/auto-api/database-adapters","0.docs/3.nuxt-auto/2.auto-api/14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","/docs/nuxt-auto/auto-api/custom-endpoints","0.docs/3.nuxt-auto/2.auto-api/15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","/docs/nuxt-auto/auto-api/multi-tenancy","0.docs/3.nuxt-auto/2.auto-api/16.multi-tenancy",{"title":239,"path":240,"stem":241},"Validation","/docs/nuxt-auto/auto-api/validation","0.docs/3.nuxt-auto/2.auto-api/2.validation",{"title":243,"path":244,"stem":245},"Rate Limiting","/docs/nuxt-auto/auto-api/rate-limiting","0.docs/3.nuxt-auto/2.auto-api/20.rate-limiting",{"title":247,"path":248,"stem":249},"Request Metadata Plugin","/docs/nuxt-auto/auto-api/request-metadata","0.docs/3.nuxt-auto/2.auto-api/21.request-metadata",{"title":251,"path":252,"stem":253},"Plugin Catalog","/docs/nuxt-auto/auto-api/plugin-catalog","0.docs/3.nuxt-auto/2.auto-api/22.plugin-catalog",{"title":255,"path":256,"stem":257},"Handler Overrides","/docs/nuxt-auto/auto-api/handler-overrides","0.docs/3.nuxt-auto/2.auto-api/3.handler-overrides",{"title":259,"path":260,"stem":261},"Cloudflare D1","/docs/nuxt-auto/auto-api/cloudflare-d1","0.docs/3.nuxt-auto/2.auto-api/30.cloudflare-d1",{"title":263,"path":264,"stem":265},"SQLite to D1 Migration","/docs/nuxt-auto/auto-api/migration-sqlite-d1","0.docs/3.nuxt-auto/2.auto-api/31.migration-sqlite-d1",{"title":267,"path":268,"stem":269},"Frontend Composables","/docs/nuxt-auto/auto-api/frontend-composables","0.docs/3.nuxt-auto/2.auto-api/32.frontend-composables",{"title":271,"path":272,"stem":273},"Testing","/docs/nuxt-auto/auto-api/testing","0.docs/3.nuxt-auto/2.auto-api/33.testing",{"title":275,"path":276,"stem":277},"Pagination","/docs/nuxt-auto/auto-api/pagination","0.docs/3.nuxt-auto/2.auto-api/4.pagination",{"title":279,"path":280,"stem":281},"Soft Deletes","/docs/nuxt-auto/auto-api/soft-deletes","0.docs/3.nuxt-auto/2.auto-api/5.soft-deletes",{"title":283,"path":284,"stem":285},"Authentication & Authorization","/docs/nuxt-auto/auto-api/authentication-authorization","0.docs/3.nuxt-auto/2.auto-api/6.authentication-authorization",{"title":287,"path":288,"stem":289},"Better-Auth Integration","/docs/nuxt-auto/auto-api/better-auth","0.docs/3.nuxt-auto/2.auto-api/7.better-auth",{"title":291,"path":292,"stem":293},"Nested Relations","/docs/nuxt-auto/auto-api/nested-relationships","0.docs/3.nuxt-auto/2.auto-api/8.nested-relationships",{"title":295,"path":296,"stem":297},"Bulk Operations","/docs/nuxt-auto/auto-api/bulk-operations","0.docs/3.nuxt-auto/2.auto-api/9.bulk-operations",{"title":299,"path":300,"stem":301,"children":302,"page":201},"Auto Admin","/docs/nuxt-auto/auto-admin","0.docs/3.nuxt-auto/3.auto-admin",[303,306,310,314,318,322,326,330,334],{"title":185,"path":304,"stem":305},"/docs/nuxt-auto/auto-admin/getting-started","0.docs/3.nuxt-auto/3.auto-admin/1.getting-started",{"title":307,"path":308,"stem":309},"Configuration & Theming","/docs/nuxt-auto/auto-admin/configuration-theming","0.docs/3.nuxt-auto/3.auto-admin/2.configuration-theming",{"title":311,"path":312,"stem":313},"Resource Configuration","/docs/nuxt-auto/auto-admin/resource-configuration","0.docs/3.nuxt-auto/3.auto-admin/3.resource-configuration",{"title":315,"path":316,"stem":317},"Form Fields & Widgets","/docs/nuxt-auto/auto-admin/form-fields-widgets","0.docs/3.nuxt-auto/3.auto-admin/4.form-fields-widgets",{"title":319,"path":320,"stem":321},"Permissions","/docs/nuxt-auto/auto-admin/permissions","0.docs/3.nuxt-auto/3.auto-admin/5.permissions",{"title":323,"path":324,"stem":325},"Custom Pages","/docs/nuxt-auto/auto-admin/custom-pages","0.docs/3.nuxt-auto/3.auto-admin/6.custom-pages",{"title":327,"path":328,"stem":329},"M2M Relationships","/docs/nuxt-auto/auto-admin/m2m-relationships","0.docs/3.nuxt-auto/3.auto-admin/7.m2m-relationships",{"title":331,"path":332,"stem":333},"Custom Actions","/docs/nuxt-auto/auto-admin/custom-actions","0.docs/3.nuxt-auto/3.auto-admin/8.custom-actions",{"title":335,"path":336,"stem":337},"Composables","/docs/nuxt-auto/auto-admin/composables","0.docs/3.nuxt-auto/3.auto-admin/9.composables",[339,342,355,382,400,415,425],{"title":5,"path":340,"stem":341},"/docs/nuxt-protokit","0.docs/4.nuxt-protokit/index",{"title":185,"path":343,"stem":344,"children":345,"icon":354},"/docs/nuxt-protokit/getting-started","0.docs/4.nuxt-protokit/1.getting-started/1.index",[346,347,351],{"title":190,"path":343,"stem":344},{"title":348,"path":349,"stem":350},"Core Concepts","/docs/nuxt-protokit/getting-started/concepts","0.docs/4.nuxt-protokit/1.getting-started/2.concepts",{"title":198,"path":352,"stem":353},"/docs/nuxt-protokit/getting-started/quick-start","0.docs/4.nuxt-protokit/1.getting-started/3.quick-start","i-lucide-rocket",{"title":356,"path":357,"stem":358,"children":359,"icon":381},"Schemas","/docs/nuxt-protokit/schemas","0.docs/4.nuxt-protokit/2.schemas/1.index",[360,361,365,369,373,377],{"title":5,"path":357,"stem":358},{"title":362,"path":363,"stem":364},"Field Types","/docs/nuxt-protokit/schemas/fields","0.docs/4.nuxt-protokit/2.schemas/2.fields",{"title":366,"path":367,"stem":368},"Collections","/docs/nuxt-protokit/schemas/collections","0.docs/4.nuxt-protokit/2.schemas/3.collections",{"title":370,"path":371,"stem":372},"Derived & Computed","/docs/nuxt-protokit/schemas/derived-computed","0.docs/4.nuxt-protokit/2.schemas/4.derived-computed",{"title":374,"path":375,"stem":376},"Connections","/docs/nuxt-protokit/schemas/connections","0.docs/4.nuxt-protokit/2.schemas/5.connections",{"title":378,"path":379,"stem":380},"Visualizations & Layouts","/docs/nuxt-protokit/schemas/visualizations","0.docs/4.nuxt-protokit/2.schemas/6.visualizations","i-lucide-file-code",{"title":335,"path":383,"stem":384,"children":385,"icon":399},"/docs/nuxt-protokit/composables","0.docs/4.nuxt-protokit/3.composables/1.index",[386,387,391,395],{"title":5,"path":383,"stem":384},{"title":388,"path":389,"stem":390},"usePrototype","/docs/nuxt-protokit/composables/use-prototype","0.docs/4.nuxt-protokit/3.composables/2.use-prototype",{"title":392,"path":393,"stem":394},"useProtoDoc","/docs/nuxt-protokit/composables/use-proto-doc","0.docs/4.nuxt-protokit/3.composables/3.use-proto-doc",{"title":396,"path":397,"stem":398},"useProtoCollection","/docs/nuxt-protokit/composables/use-proto-collection","0.docs/4.nuxt-protokit/3.composables/4.use-proto-collection","i-lucide-layers",{"title":401,"path":402,"stem":403,"children":404,"icon":414},"Components","/docs/nuxt-protokit/components","0.docs/4.nuxt-protokit/4.components/1.index",[405,406,410],{"title":5,"path":402,"stem":403},{"title":407,"path":408,"stem":409},"ProtoTool","/docs/nuxt-protokit/components/proto-tool","0.docs/4.nuxt-protokit/4.components/2.proto-tool",{"title":411,"path":412,"stem":413},"ProtoCrudModal","/docs/nuxt-protokit/components/proto-crud-modal","0.docs/4.nuxt-protokit/4.components/3.proto-crud-modal","i-lucide-puzzle",{"title":151,"path":416,"stem":417,"children":418,"icon":424},"/docs/nuxt-protokit/offline-first","0.docs/4.nuxt-protokit/5.offline-first/1.index",[419,420],{"title":151,"path":416,"stem":417},{"title":421,"path":422,"stem":423},"Corruption Recovery","/docs/nuxt-protokit/offline-first/corruption-recovery","0.docs/4.nuxt-protokit/5.offline-first/2.corruption-recovery","i-lucide-wifi-off",{"title":426,"icon":427,"path":428,"stem":429,"children":430},"Advanced","i-lucide-graduation-cap","/docs/nuxt-protokit/advanced","0.docs/4.nuxt-protokit/6.advanced/1.index",[431,432,436,440],{"title":5,"path":428,"stem":429},{"title":433,"path":434,"stem":435},"Multi-Tool Apps","/docs/nuxt-protokit/advanced/building-a-toolkit","0.docs/4.nuxt-protokit/6.advanced/1.building-a-toolkit",{"title":437,"path":438,"stem":439},"Schema Patterns","/docs/nuxt-protokit/advanced/custom-schema-patterns","0.docs/4.nuxt-protokit/6.advanced/2.custom-schema-patterns",{"title":441,"path":442,"stem":443},"Custom Fields & Viz","/docs/nuxt-protokit/advanced/extensibility","0.docs/4.nuxt-protokit/6.advanced/3.extensibility",{"page":445,"fallbackPage":1387},{"id":446,"title":190,"body":447,"description":457,"extension":1386,"links":1387,"meta":1388,"navigation":1387,"ogImage":1387,"path":191,"seo":1389,"stem":192,"__hash__":1390},"nuxt_auto/0.docs/3.nuxt-auto/1.getting-started/1.introduction.md",{"type":448,"value":449,"toc":1371},"minimark",[450,454,458,463,466,471,477,480,485,522,526,531,534,538,564,568,572,575,580,1031,1036,1252,1256,1259,1263,1266,1270,1273,1277,1280,1318,1322,1330,1334,1367],[451,452,190],"h1",{"id":453},"introduction",[455,456,457],"p",{},"Nuxt Auto is a collection of modules that dramatically accelerate full-stack development by automatically generating production-ready APIs and admin interfaces from your database schemas.",[459,460,462],"h2",{"id":461},"what-is-nuxt-auto","What is Nuxt Auto?",[455,464,465],{},"Nuxt Auto consists of two complementary Nuxt modules:",[467,468,470],"h3",{"id":469},"nuxt-auto-api","Nuxt Auto API",[455,472,473],{},[474,475,476],"strong",{},"Auto-generate type-safe REST APIs from Drizzle ORM schemas",[455,478,479],{},"Define your database schema with Drizzle ORM and get complete CRUD endpoints automatically. No need to write repetitive route handlers, validation logic, or authorization checks manually.",[455,481,482],{},[474,483,484],{},"Key capabilities:",[486,487,488,492,495,498,501,504,507,510,513,516,519],"ul",{},[489,490,491],"li",{},"Automatic CRUD endpoint generation",[489,493,494],{},"Multi-tier authorization (operation, SQL, object, field level)",[489,496,497],{},"Built-in validation with Zod",[489,499,500],{},"Multi-database support (SQLite, Postgres, MySQL, D1, Turso, PlanetScale)",[489,502,503],{},"Plugin system for extensibility",[489,505,506],{},"Custom endpoints and handler overrides",[489,508,509],{},"Cursor & offset pagination",[489,511,512],{},"Soft delete support",[489,514,515],{},"Multi-tenancy",[489,517,518],{},"M2M relationships",[489,520,521],{},"Lifecycle hooks",[467,523,525],{"id":524},"nuxt-auto-admin","Nuxt Auto Admin",[455,527,528],{},[474,529,530],{},"Beautiful admin panel generated from Auto API resources",[455,532,533],{},"Once your APIs are defined, Auto Admin automatically creates a complete admin interface with full CRUD operations, permissions, and customization options.",[455,535,536],{},[474,537,484],{},[486,539,540,543,546,549,552,555,558,561],{},[489,541,542],{},"Auto-generated CRUD pages (list, detail, create, edit)",[489,544,545],{},"Permission-based access control",[489,547,548],{},"Rich form widgets (text, select, date, relations, rich text, markdown, code, file upload, etc.)",[489,550,551],{},"M2M relationship management",[489,553,554],{},"Custom pages for specialized admin functionality",[489,556,557],{},"Fully customizable branding and theming",[489,559,560],{},"Dark mode support",[489,562,563],{},"Responsive design",[459,565,567],{"id":566},"why-nuxt-auto","Why Nuxt Auto?",[467,569,571],{"id":570},"eliminate-boilerplate","Eliminate Boilerplate",[455,573,574],{},"Stop writing the same CRUD endpoints and admin interfaces over and over. Define your schema once, get everything else automatically.",[455,576,577],{},[474,578,579],{},"Without Nuxt Auto:",[581,582,587],"pre",{"className":583,"code":584,"language":585,"meta":586,"style":586},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Manual API route\nexport default defineEventHandler(async (event) => {\n  const id = getRouterParam(event, 'id')\n  const body = await readBody(event)\n\n  // Manual validation\n  if (!body.email || !isValidEmail(body.email)) {\n    throw createError({ statusCode: 400, message: 'Invalid email' })\n  }\n\n  // Manual authorization\n  const user = await getUser(event)\n  if (!user || user.role !== 'admin') {\n    throw createError({ statusCode: 403, message: 'Forbidden' })\n  }\n\n  // Manual database query\n  const result = await db.update(users)\n    .set(body)\n    .where(eq(users.id, id))\n    .returning()\n\n  return result[0]\n})\n","typescript","",[588,589,590,599,638,674,696,703,709,752,795,801,806,812,833,869,904,909,914,920,947,962,990,1001,1006,1023],"code",{"__ignoreMap":586},[591,592,595],"span",{"class":593,"line":594},"line",1,[591,596,598],{"class":597},"sHwdD","// Manual API route\n",[591,600,602,606,609,613,617,621,625,629,632,635],{"class":593,"line":601},2,[591,603,605],{"class":604},"s7zQu","export",[591,607,608],{"class":604}," default",[591,610,612],{"class":611},"s2Zo4"," defineEventHandler",[591,614,616],{"class":615},"sTEyZ","(",[591,618,620],{"class":619},"spNyl","async",[591,622,624],{"class":623},"sMK4o"," (",[591,626,628],{"class":627},"sHdIc","event",[591,630,631],{"class":623},")",[591,633,634],{"class":619}," =>",[591,636,637],{"class":623}," {\n",[591,639,641,644,647,650,653,656,658,661,664,668,671],{"class":593,"line":640},3,[591,642,643],{"class":619},"  const",[591,645,646],{"class":615}," id",[591,648,649],{"class":623}," =",[591,651,652],{"class":611}," getRouterParam",[591,654,616],{"class":655},"swJcz",[591,657,628],{"class":615},[591,659,660],{"class":623},",",[591,662,663],{"class":623}," '",[591,665,667],{"class":666},"sfazB","id",[591,669,670],{"class":623},"'",[591,672,673],{"class":655},")\n",[591,675,677,679,682,684,687,690,692,694],{"class":593,"line":676},4,[591,678,643],{"class":619},[591,680,681],{"class":615}," body",[591,683,649],{"class":623},[591,685,686],{"class":604}," await",[591,688,689],{"class":611}," readBody",[591,691,616],{"class":655},[591,693,628],{"class":615},[591,695,673],{"class":655},[591,697,699],{"class":593,"line":698},5,[591,700,702],{"emptyLinePlaceholder":701},true,"\n",[591,704,706],{"class":593,"line":705},6,[591,707,708],{"class":597},"  // Manual validation\n",[591,710,712,715,717,720,723,726,729,732,735,738,740,742,744,746,749],{"class":593,"line":711},7,[591,713,714],{"class":604},"  if",[591,716,624],{"class":655},[591,718,719],{"class":623},"!",[591,721,722],{"class":615},"body",[591,724,725],{"class":623},".",[591,727,728],{"class":615},"email",[591,730,731],{"class":623}," ||",[591,733,734],{"class":623}," !",[591,736,737],{"class":611},"isValidEmail",[591,739,616],{"class":655},[591,741,722],{"class":615},[591,743,725],{"class":623},[591,745,728],{"class":615},[591,747,748],{"class":655},")) ",[591,750,751],{"class":623},"{\n",[591,753,755,758,761,763,766,769,772,776,778,781,783,785,788,790,793],{"class":593,"line":754},8,[591,756,757],{"class":604},"    throw",[591,759,760],{"class":611}," createError",[591,762,616],{"class":655},[591,764,765],{"class":623},"{",[591,767,768],{"class":655}," statusCode",[591,770,771],{"class":623},":",[591,773,775],{"class":774},"sbssI"," 400",[591,777,660],{"class":623},[591,779,780],{"class":655}," message",[591,782,771],{"class":623},[591,784,663],{"class":623},[591,786,787],{"class":666},"Invalid email",[591,789,670],{"class":623},[591,791,792],{"class":623}," }",[591,794,673],{"class":655},[591,796,798],{"class":593,"line":797},9,[591,799,800],{"class":623},"  }\n",[591,802,804],{"class":593,"line":803},10,[591,805,702],{"emptyLinePlaceholder":701},[591,807,809],{"class":593,"line":808},11,[591,810,811],{"class":597},"  // Manual authorization\n",[591,813,815,817,820,822,824,827,829,831],{"class":593,"line":814},12,[591,816,643],{"class":619},[591,818,819],{"class":615}," user",[591,821,649],{"class":623},[591,823,686],{"class":604},[591,825,826],{"class":611}," getUser",[591,828,616],{"class":655},[591,830,628],{"class":615},[591,832,673],{"class":655},[591,834,836,838,840,842,845,847,849,851,854,857,859,862,864,867],{"class":593,"line":835},13,[591,837,714],{"class":604},[591,839,624],{"class":655},[591,841,719],{"class":623},[591,843,844],{"class":615},"user",[591,846,731],{"class":623},[591,848,819],{"class":615},[591,850,725],{"class":623},[591,852,853],{"class":615},"role",[591,855,856],{"class":623}," !==",[591,858,663],{"class":623},[591,860,861],{"class":666},"admin",[591,863,670],{"class":623},[591,865,866],{"class":655},") ",[591,868,751],{"class":623},[591,870,872,874,876,878,880,882,884,887,889,891,893,895,898,900,902],{"class":593,"line":871},14,[591,873,757],{"class":604},[591,875,760],{"class":611},[591,877,616],{"class":655},[591,879,765],{"class":623},[591,881,768],{"class":655},[591,883,771],{"class":623},[591,885,886],{"class":774}," 403",[591,888,660],{"class":623},[591,890,780],{"class":655},[591,892,771],{"class":623},[591,894,663],{"class":623},[591,896,897],{"class":666},"Forbidden",[591,899,670],{"class":623},[591,901,792],{"class":623},[591,903,673],{"class":655},[591,905,907],{"class":593,"line":906},15,[591,908,800],{"class":623},[591,910,912],{"class":593,"line":911},16,[591,913,702],{"emptyLinePlaceholder":701},[591,915,917],{"class":593,"line":916},17,[591,918,919],{"class":597},"  // Manual database query\n",[591,921,923,925,928,930,932,935,937,940,942,945],{"class":593,"line":922},18,[591,924,643],{"class":619},[591,926,927],{"class":615}," result",[591,929,649],{"class":623},[591,931,686],{"class":604},[591,933,934],{"class":615}," db",[591,936,725],{"class":623},[591,938,939],{"class":611},"update",[591,941,616],{"class":655},[591,943,944],{"class":615},"users",[591,946,673],{"class":655},[591,948,950,953,956,958,960],{"class":593,"line":949},19,[591,951,952],{"class":623},"    .",[591,954,955],{"class":611},"set",[591,957,616],{"class":655},[591,959,722],{"class":615},[591,961,673],{"class":655},[591,963,965,967,970,972,975,977,979,981,983,985,987],{"class":593,"line":964},20,[591,966,952],{"class":623},[591,968,969],{"class":611},"where",[591,971,616],{"class":655},[591,973,974],{"class":611},"eq",[591,976,616],{"class":655},[591,978,944],{"class":615},[591,980,725],{"class":623},[591,982,667],{"class":615},[591,984,660],{"class":623},[591,986,646],{"class":615},[591,988,989],{"class":655},"))\n",[591,991,993,995,998],{"class":593,"line":992},21,[591,994,952],{"class":623},[591,996,997],{"class":611},"returning",[591,999,1000],{"class":655},"()\n",[591,1002,1004],{"class":593,"line":1003},22,[591,1005,702],{"emptyLinePlaceholder":701},[591,1007,1009,1012,1014,1017,1020],{"class":593,"line":1008},23,[591,1010,1011],{"class":604},"  return",[591,1013,927],{"class":615},[591,1015,1016],{"class":655},"[",[591,1018,1019],{"class":774},"0",[591,1021,1022],{"class":655},"]\n",[591,1024,1026,1029],{"class":593,"line":1025},24,[591,1027,1028],{"class":623},"}",[591,1030,673],{"class":615},[455,1032,1033],{},[474,1034,1035],{},"With Nuxt Auto:",[581,1037,1039],{"className":583,"code":1038,"language":585,"meta":586,"style":586},"// Your schema IS your API\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey({ autoIncrement: true }),\n  email: text('email').notNull().unique(),\n  name: text('name'),\n  role: text('role', { enum: ['user', 'admin'] }).default('user'),\n})\n",[588,1040,1041,1046,1074,1119,1156,1178,1246],{"__ignoreMap":586},[591,1042,1043],{"class":593,"line":594},[591,1044,1045],{"class":597},"// Your schema IS your API\n",[591,1047,1048,1050,1053,1056,1059,1062,1064,1066,1068,1070,1072],{"class":593,"line":601},[591,1049,605],{"class":604},[591,1051,1052],{"class":619}," const",[591,1054,1055],{"class":615}," users ",[591,1057,1058],{"class":623},"=",[591,1060,1061],{"class":611}," sqliteTable",[591,1063,616],{"class":615},[591,1065,670],{"class":623},[591,1067,944],{"class":666},[591,1069,670],{"class":623},[591,1071,660],{"class":623},[591,1073,637],{"class":623},[591,1075,1076,1079,1081,1084,1086,1088,1090,1092,1094,1096,1099,1101,1103,1106,1108,1112,1114,1116],{"class":593,"line":640},[591,1077,1078],{"class":655},"  id",[591,1080,771],{"class":623},[591,1082,1083],{"class":611}," integer",[591,1085,616],{"class":615},[591,1087,670],{"class":623},[591,1089,667],{"class":666},[591,1091,670],{"class":623},[591,1093,631],{"class":615},[591,1095,725],{"class":623},[591,1097,1098],{"class":611},"primaryKey",[591,1100,616],{"class":615},[591,1102,765],{"class":623},[591,1104,1105],{"class":655}," autoIncrement",[591,1107,771],{"class":623},[591,1109,1111],{"class":1110},"sfNiH"," true",[591,1113,792],{"class":623},[591,1115,631],{"class":615},[591,1117,1118],{"class":623},",\n",[591,1120,1121,1124,1126,1129,1131,1133,1135,1137,1139,1141,1144,1147,1149,1152,1154],{"class":593,"line":676},[591,1122,1123],{"class":655},"  email",[591,1125,771],{"class":623},[591,1127,1128],{"class":611}," text",[591,1130,616],{"class":615},[591,1132,670],{"class":623},[591,1134,728],{"class":666},[591,1136,670],{"class":623},[591,1138,631],{"class":615},[591,1140,725],{"class":623},[591,1142,1143],{"class":611},"notNull",[591,1145,1146],{"class":615},"()",[591,1148,725],{"class":623},[591,1150,1151],{"class":611},"unique",[591,1153,1146],{"class":615},[591,1155,1118],{"class":623},[591,1157,1158,1161,1163,1165,1167,1169,1172,1174,1176],{"class":593,"line":698},[591,1159,1160],{"class":655},"  name",[591,1162,771],{"class":623},[591,1164,1128],{"class":611},[591,1166,616],{"class":615},[591,1168,670],{"class":623},[591,1170,1171],{"class":666},"name",[591,1173,670],{"class":623},[591,1175,631],{"class":615},[591,1177,1118],{"class":623},[591,1179,1180,1183,1185,1187,1189,1191,1193,1195,1197,1200,1203,1205,1208,1210,1212,1214,1216,1218,1220,1222,1225,1227,1229,1231,1234,1236,1238,1240,1242,1244],{"class":593,"line":705},[591,1181,1182],{"class":655},"  role",[591,1184,771],{"class":623},[591,1186,1128],{"class":611},[591,1188,616],{"class":615},[591,1190,670],{"class":623},[591,1192,853],{"class":666},[591,1194,670],{"class":623},[591,1196,660],{"class":623},[591,1198,1199],{"class":623}," {",[591,1201,1202],{"class":655}," enum",[591,1204,771],{"class":623},[591,1206,1207],{"class":615}," [",[591,1209,670],{"class":623},[591,1211,844],{"class":666},[591,1213,670],{"class":623},[591,1215,660],{"class":623},[591,1217,663],{"class":623},[591,1219,861],{"class":666},[591,1221,670],{"class":623},[591,1223,1224],{"class":615},"] ",[591,1226,1028],{"class":623},[591,1228,631],{"class":615},[591,1230,725],{"class":623},[591,1232,1233],{"class":611},"default",[591,1235,616],{"class":615},[591,1237,670],{"class":623},[591,1239,844],{"class":666},[591,1241,670],{"class":623},[591,1243,631],{"class":615},[591,1245,1118],{"class":623},[591,1247,1248,1250],{"class":593,"line":711},[591,1249,1028],{"class":623},[591,1251,673],{"class":615},[467,1253,1255],{"id":1254},"type-safe-end-to-end","Type-Safe End-to-End",[455,1257,1258],{},"Full TypeScript inference from database schema to frontend components. Change your schema, and TypeScript will guide you through updating your entire stack.",[467,1260,1262],{"id":1261},"production-ready-features","Production-Ready Features",[455,1264,1265],{},"Built-in authorization, validation, pagination, multi-tenancy, soft deletes, and more. All the features you need for production applications without writing them yourself.",[467,1267,1269],{"id":1268},"flexible-extensible","Flexible & Extensible",[455,1271,1272],{},"Not a black box. Override any handler, add custom endpoints, create plugins, define custom validation, and build custom admin pages when needed.",[459,1274,1276],{"id":1275},"use-cases","Use Cases",[455,1278,1279],{},"Nuxt Auto is perfect for:",[486,1281,1282,1288,1294,1300,1306,1312],{},[489,1283,1284,1287],{},[474,1285,1286],{},"SaaS applications"," - Multi-tenant data isolation, admin panels, user management",[489,1289,1290,1293],{},[474,1291,1292],{},"Internal tools"," - Rapid development of CRUD interfaces for internal teams",[489,1295,1296,1299],{},[474,1297,1298],{},"Content management"," - Blog posts, pages, media management",[489,1301,1302,1305],{},[474,1303,1304],{},"Data dashboards"," - Admin interfaces for viewing and editing data",[489,1307,1308,1311],{},[474,1309,1310],{},"MVP development"," - Ship faster with auto-generated APIs and admin UIs",[489,1313,1314,1317],{},[474,1315,1316],{},"Monolithic applications"," - Full-stack Nuxt apps with database-driven features",[459,1319,1321],{"id":1320},"architecture","Architecture",[581,1323,1328],{"className":1324,"code":1326,"language":1327},[1325],"language-text","┌─────────────────────────────────────────┐\n│         Nuxt Application                │\n├─────────────────────────────────────────┤\n│                                         │\n│  Frontend (Auto-generated Composables)  │\n│  • useAutoApiList()                     │\n│  • useAutoApiMutation()                 │\n│  • Admin UI Components                  │\n│                                         │\n├─────────────────────────────────────────┤\n│                                         │\n│  Auto API (REST Endpoints)              │\n│  • GET /api/users                       │\n│  • POST /api/users                      │\n│  • PATCH /api/users/:id                 │\n│  • DELETE /api/users/:id                │\n│                                         │\n├─────────────────────────────────────────┤\n│                                         │\n│  Drizzle ORM                            │\n│  • Type-safe queries                    │\n│  • Schema definitions                   │\n│  • Migrations                           │\n│                                         │\n├─────────────────────────────────────────┤\n│                                         │\n│  Database                               │\n│  • SQLite / Postgres / MySQL            │\n│  • Cloudflare D1 / Turso / PlanetScale  │\n│                                         │\n└─────────────────────────────────────────┘\n","text",[588,1329,1326],{"__ignoreMap":586},[459,1331,1333],{"id":1332},"next-steps","Next Steps",[486,1335,1336,1344,1351,1359],{},[489,1337,1338,1343],{},[474,1339,1340],{},[1341,1342,194],"a",{"href":195}," - Set up Nuxt Auto in your project",[489,1345,1346,1350],{},[474,1347,1348],{},[1341,1349,198],{"href":199}," - Build your first API and admin panel",[489,1352,1353,1358],{},[474,1354,1355],{},[1341,1356,1357],{"href":208},"Auto API Docs"," - Deep dive into API features",[489,1360,1361,1366],{},[474,1362,1363],{},[1341,1364,1365],{"href":304},"Auto Admin Docs"," - Customize your admin panel",[1368,1369,1370],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":586,"searchDepth":601,"depth":601,"links":1372},[1373,1377,1383,1384,1385],{"id":461,"depth":601,"text":462,"children":1374},[1375,1376],{"id":469,"depth":640,"text":470},{"id":524,"depth":640,"text":525},{"id":566,"depth":601,"text":567,"children":1378},[1379,1380,1381,1382],{"id":570,"depth":640,"text":571},{"id":1254,"depth":640,"text":1255},{"id":1261,"depth":640,"text":1262},{"id":1268,"depth":640,"text":1269},{"id":1275,"depth":601,"text":1276},{"id":1320,"depth":601,"text":1321},{"id":1332,"depth":601,"text":1333},"md",null,{},{"title":190,"description":457},"E2LJFytdNxDg2L93eI3iHQd4LrtRfO1qJr3ZwCda3cw",[1392,1394],{"title":5,"path":182,"stem":183,"description":1393,"children":-1},"Auto-generate type-safe REST APIs and admin panels from your Drizzle ORM schemas.",{"title":194,"path":195,"stem":196,"description":1395,"children":-1},"This guide will help you install and set up Nuxt Auto in your Nuxt 3 project.",1772977477773]