[{"data":1,"prerenderedAt":1786},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":365,"\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fupgrading-en":507,"\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fupgrading-surround-en":1781},[4,8,13,28,41,51,64,77,94,110,134,150,157,172],{"title":5,"path":6,"stem":7},"Overview","\u002Fdocs\u002Flanding","0.docs\u002F1.landing\u002F001.index",{"title":9,"path":10,"stem":11,"badge":12},"Built-in Features","\u002Fdocs\u002Flanding\u002Fbuilt-in-features","0.docs\u002F1.landing\u002F002.built-in-features","New",{"title":14,"path":15,"stem":16,"children":17,"icon":27},"Content Foundation","\u002Fdocs\u002Flanding\u002Fcontent","0.docs\u002F1.landing\u002F02.content\u002F1.index",[18,19,23],{"title":5,"path":15,"stem":16},{"title":20,"path":21,"stem":22},"Details","\u002Fdocs\u002Flanding\u002Fcontent\u002Fdetails","0.docs\u002F1.landing\u002F02.content\u002F2.details",{"title":24,"path":25,"stem":26},"Technical","\u002Fdocs\u002Flanding\u002Fcontent\u002Ftechnical","0.docs\u002F1.landing\u002F02.content\u002F4.technical","i-heroicons-document-text",{"title":29,"path":30,"stem":31,"children":32,"icon":40},"Regional Content","\u002Fdocs\u002Flanding\u002Fregional","0.docs\u002F1.landing\u002F03.regional\u002F1.index",[33,34,37],{"title":5,"path":30,"stem":31},{"title":20,"path":35,"stem":36},"\u002Fdocs\u002Flanding\u002Fregional\u002Fdetails","0.docs\u002F1.landing\u002F03.regional\u002F2.details",{"title":24,"path":38,"stem":39},"\u002Fdocs\u002Flanding\u002Fregional\u002Ftechnical","0.docs\u002F1.landing\u002F03.regional\u002F4.technical","i-heroicons-globe-alt",{"title":42,"path":43,"stem":44,"children":45,"icon":50},"Multi-language","\u002Fdocs\u002Flanding\u002Fmultilang","0.docs\u002F1.landing\u002F04.multilang\u002F1.index",[46,47],{"title":5,"path":43,"stem":44},{"title":20,"path":48,"stem":49},"\u002Fdocs\u002Flanding\u002Fmultilang\u002Fdetails","0.docs\u002F1.landing\u002F04.multilang\u002F2.details","i-heroicons-language",{"title":52,"path":53,"stem":54,"children":55,"icon":63},"Blog","\u002Fdocs\u002Flanding\u002Fblog","0.docs\u002F1.landing\u002F05.blog\u002F1.index",[56,57,60],{"title":5,"path":53,"stem":54},{"title":20,"path":58,"stem":59},"\u002Fdocs\u002Flanding\u002Fblog\u002Fdetails","0.docs\u002F1.landing\u002F05.blog\u002F2.details",{"title":24,"path":61,"stem":62},"\u002Fdocs\u002Flanding\u002Fblog\u002Ftechnical","0.docs\u002F1.landing\u002F05.blog\u002F4.technical","i-heroicons-pencil-square",{"title":65,"path":66,"stem":67,"children":68,"icon":76},"Documentation","\u002Fdocs\u002Flanding\u002Fdocs","0.docs\u002F1.landing\u002F06.docs\u002F1.index",[69,70,73],{"title":5,"path":66,"stem":67},{"title":20,"path":71,"stem":72},"\u002Fdocs\u002Flanding\u002Fdocs\u002Fdetails","0.docs\u002F1.landing\u002F06.docs\u002F2.details",{"title":24,"path":74,"stem":75},"\u002Fdocs\u002Flanding\u002Fdocs\u002Ftechnical","0.docs\u002F1.landing\u002F06.docs\u002F4.technical","i-heroicons-book-open",{"title":78,"path":79,"stem":80,"children":81,"icon":93},"Forms","\u002Fdocs\u002Flanding\u002Fforms","0.docs\u002F1.landing\u002F07.forms\u002F1.index",[82,83,86,90],{"title":5,"path":79,"stem":80},{"title":20,"path":84,"stem":85},"\u002Fdocs\u002Flanding\u002Fforms\u002Fdetails","0.docs\u002F1.landing\u002F07.forms\u002F2.details",{"title":87,"path":88,"stem":89},"Admin","\u002Fdocs\u002Flanding\u002Fforms\u002Fadmin","0.docs\u002F1.landing\u002F07.forms\u002F3.admin",{"title":24,"path":91,"stem":92},"\u002Fdocs\u002Flanding\u002Fforms\u002Ftechnical","0.docs\u002F1.landing\u002F07.forms\u002F4.technical","i-heroicons-clipboard-document-list",{"title":95,"path":96,"stem":97,"children":98,"icon":109},"Email","\u002Fdocs\u002Flanding\u002Femail","0.docs\u002F1.landing\u002F08.email\u002F1.index",[99,100,103,106],{"title":5,"path":96,"stem":97},{"title":20,"path":101,"stem":102},"\u002Fdocs\u002Flanding\u002Femail\u002Fdetails","0.docs\u002F1.landing\u002F08.email\u002F2.details",{"title":87,"path":104,"stem":105},"\u002Fdocs\u002Flanding\u002Femail\u002Fadmin","0.docs\u002F1.landing\u002F08.email\u002F3.admin",{"title":24,"path":107,"stem":108},"\u002Fdocs\u002Flanding\u002Femail\u002Ftechnical","0.docs\u002F1.landing\u002F08.email\u002F4.technical","i-heroicons-envelope",{"title":111,"path":112,"stem":113,"children":114,"icon":133},"Feedback Platform","\u002Fdocs\u002Flanding\u002Ffeedback","0.docs\u002F1.landing\u002F09.feedback\u002F1.index",[115,116,119,122,125,129],{"title":5,"path":112,"stem":113},{"title":20,"path":117,"stem":118},"\u002Fdocs\u002Flanding\u002Ffeedback\u002Fdetails","0.docs\u002F1.landing\u002F09.feedback\u002F2.details",{"title":87,"path":120,"stem":121},"\u002Fdocs\u002Flanding\u002Ffeedback\u002Fadmin","0.docs\u002F1.landing\u002F09.feedback\u002F3.admin",{"title":24,"path":123,"stem":124},"\u002Fdocs\u002Flanding\u002Ffeedback\u002Ftechnical","0.docs\u002F1.landing\u002F09.feedback\u002F4.technical",{"title":126,"path":127,"stem":128},"Compare vs SaaS","\u002Fdocs\u002Flanding\u002Ffeedback\u002Fcompare","0.docs\u002F1.landing\u002F09.feedback\u002F5.compare",{"title":130,"path":131,"stem":132},"FAQ","\u002Fdocs\u002Flanding\u002Ffeedback\u002Ffaq","0.docs\u002F1.landing\u002F09.feedback\u002F6.faq","i-heroicons-chat-bubble-left-right",{"title":135,"path":136,"stem":137,"children":138,"icon":149},"Storage","\u002Fdocs\u002Flanding\u002Fstorage","0.docs\u002F1.landing\u002F10.storage\u002F1.index",[139,140,143,146],{"title":5,"path":136,"stem":137},{"title":20,"path":141,"stem":142},"\u002Fdocs\u002Flanding\u002Fstorage\u002Fdetails","0.docs\u002F1.landing\u002F10.storage\u002F2.details",{"title":87,"path":144,"stem":145},"\u002Fdocs\u002Flanding\u002Fstorage\u002Fadmin","0.docs\u002F1.landing\u002F10.storage\u002F3.admin",{"title":24,"path":147,"stem":148},"\u002Fdocs\u002Flanding\u002Fstorage\u002Ftechnical","0.docs\u002F1.landing\u002F10.storage\u002F4.technical","i-heroicons-circle-stack",{"title":151,"path":152,"stem":153,"children":154,"icon":156},"Offline First","\u002Fdocs\u002Flanding\u002Foffline-first","0.docs\u002F1.landing\u002F11.offline-first\u002F1.index",[155],{"title":151,"path":152,"stem":153},"i-heroicons-users",{"title":158,"path":159,"stem":160,"children":161,"icon":156},"Yjs Sync","\u002Fdocs\u002Flanding\u002Fyjs-sync","0.docs\u002F1.landing\u002F12.yjs-sync\u002F1.index",[162,163,166,169],{"title":5,"path":159,"stem":160},{"title":20,"path":164,"stem":165},"\u002Fdocs\u002Flanding\u002Fyjs-sync\u002Fdetails","0.docs\u002F1.landing\u002F12.yjs-sync\u002F2.details",{"title":87,"path":167,"stem":168},"\u002Fdocs\u002Flanding\u002Fyjs-sync\u002Fadmin","0.docs\u002F1.landing\u002F12.yjs-sync\u002F3.admin",{"title":24,"path":170,"stem":171},"\u002Fdocs\u002Flanding\u002Fyjs-sync\u002Ftechnical","0.docs\u002F1.landing\u002F12.yjs-sync\u002F4.technical",{"title":173,"path":174,"stem":175,"children":176,"badge":178,"icon":179},"Newsletter","\u002Fdocs\u002Flanding\u002Fnewsletter","0.docs\u002F1.landing\u002F13.newsletter\u002Findex",[177],{"title":173,"path":174,"stem":175,"badge":178},"Coming Soon","i-lucide-send",[181,184,202,318,358],{"title":5,"path":182,"stem":183},"\u002Fdocs\u002Fnuxt-auto","0.docs\u002F3.nuxt-auto\u002Findex",{"title":185,"path":186,"stem":187,"children":188,"page":201},"Getting Started","\u002Fdocs\u002Fnuxt-auto\u002Fgetting-started","0.docs\u002F3.nuxt-auto\u002F1.getting-started",[189,193,197],{"title":190,"path":191,"stem":192},"Introduction","\u002Fdocs\u002Fnuxt-auto\u002Fgetting-started\u002Fintroduction","0.docs\u002F3.nuxt-auto\u002F1.getting-started\u002F1.introduction",{"title":194,"path":195,"stem":196},"Installation","\u002Fdocs\u002Fnuxt-auto\u002Fgetting-started\u002Finstallation","0.docs\u002F3.nuxt-auto\u002F1.getting-started\u002F2.installation",{"title":198,"path":199,"stem":200},"Quick Start","\u002Fdocs\u002Fnuxt-auto\u002Fgetting-started\u002Fquick-start","0.docs\u002F3.nuxt-auto\u002F1.getting-started\u002F3.quick-start",false,{"title":203,"path":204,"stem":205,"children":206,"page":201},"Auto API","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api","0.docs\u002F3.nuxt-auto\u002F2.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,298,302,306,310,314],{"title":185,"path":208,"stem":209},"\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fgetting-started","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F1.getting-started",{"title":211,"path":212,"stem":213},"Aggregations","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Faggregations","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F10.aggregations",{"title":215,"path":216,"stem":217},"Lifecycle Hooks","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Flifecycle-hooks","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F11.lifecycle-hooks",{"title":219,"path":220,"stem":221},"Many-to-Many (M2M) Relationships","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fm2m-relationships","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F12.m2m-relationships",{"title":223,"path":224,"stem":225},"Plugin System","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fplugin-system","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F13.plugin-system",{"title":227,"path":228,"stem":229},"Database Adapters","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fdatabase-adapters","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F14.database-adapters",{"title":231,"path":232,"stem":233},"Custom Endpoints","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fcustom-endpoints","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F15.custom-endpoints",{"title":235,"path":236,"stem":237},"Multi-Tenancy","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fmulti-tenancy","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F16.multi-tenancy",{"title":239,"path":240,"stem":241},"Schema Presets (Cross-engine)","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fschema-presets","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F17.schema-presets",{"title":243,"path":244,"stem":245},"Permissions Cookbook","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fpermissions-cookbook","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F18.permissions-cookbook",{"title":247,"path":248,"stem":249},"Billing & Plan Gating","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fbilling","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F19.billing",{"title":251,"path":252,"stem":253},"Validation","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fvalidation","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F2.validation",{"title":255,"path":256,"stem":257},"Rate Limiting","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Frate-limiting","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F20.rate-limiting",{"title":259,"path":260,"stem":261},"Request Metadata Plugin","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Frequest-metadata","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F21.request-metadata",{"title":263,"path":264,"stem":265},"Plugin Catalog","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fplugin-catalog","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F22.plugin-catalog",{"title":267,"path":268,"stem":269},"Configuration Reference","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fconfiguration","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F23.configuration",{"title":271,"path":272,"stem":273},"Handler Overrides","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fhandler-overrides","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F3.handler-overrides",{"title":275,"path":276,"stem":277},"Cloudflare D1","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fcloudflare-d1","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F30.cloudflare-d1",{"title":279,"path":280,"stem":281},"SQLite to D1 Migration","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fmigration-sqlite-d1","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F31.migration-sqlite-d1",{"title":283,"path":284,"stem":285},"Frontend Composables","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Ffrontend-composables","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F32.frontend-composables",{"title":287,"path":288,"stem":289},"Testing","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Ftesting","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F33.testing",{"title":291,"path":292,"stem":293},"Pagination","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fpagination","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F4.pagination",{"title":295,"path":296,"stem":297},"Upgrading","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fupgrading","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F40.upgrading",{"title":299,"path":300,"stem":301},"Soft Deletes","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fsoft-deletes","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F5.soft-deletes",{"title":303,"path":304,"stem":305},"Authentication & Authorization","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fauthentication-authorization","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F6.authentication-authorization",{"title":307,"path":308,"stem":309},"Better-Auth Integration","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fbetter-auth","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F7.better-auth",{"title":311,"path":312,"stem":313},"Nested Relations","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fnested-relationships","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F8.nested-relationships",{"title":315,"path":316,"stem":317},"Bulk Operations","\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fbulk-operations","0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F9.bulk-operations",{"title":319,"path":320,"stem":321,"children":322,"page":201},"Auto Admin","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin","0.docs\u002F3.nuxt-auto\u002F3.auto-admin",[323,326,330,334,338,342,346,350,354],{"title":185,"path":324,"stem":325},"\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fgetting-started","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F1.getting-started",{"title":327,"path":328,"stem":329},"Configuration & Theming","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fconfiguration-theming","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F2.configuration-theming",{"title":331,"path":332,"stem":333},"Resource Configuration","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fresource-configuration","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F3.resource-configuration",{"title":335,"path":336,"stem":337},"Form Fields & Widgets","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fform-fields-widgets","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F4.form-fields-widgets",{"title":339,"path":340,"stem":341},"Permissions","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fpermissions","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F5.permissions",{"title":343,"path":344,"stem":345},"Custom Pages","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fcustom-pages","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F6.custom-pages",{"title":347,"path":348,"stem":349},"M2M Relationships","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fm2m-relationships","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F7.m2m-relationships",{"title":351,"path":352,"stem":353},"Custom Actions","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fcustom-actions","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F8.custom-actions",{"title":355,"path":356,"stem":357},"Composables","\u002Fdocs\u002Fnuxt-auto\u002Fauto-admin\u002Fcomposables","0.docs\u002F3.nuxt-auto\u002F3.auto-admin\u002F9.composables",{"title":359,"path":360,"stem":361,"children":362,"icon":364},"Claude Code Skills","\u002Fdocs\u002Fnuxt-auto\u002Fclaude-code-skills","0.docs\u002F3.nuxt-auto\u002F4.claude-code-skills\u002F1.index",[363],{"title":5,"path":360,"stem":361},"i-lucide-bot",[366,369,382,409,427,450,472,502],{"title":5,"path":367,"stem":368},"\u002Fdocs\u002Fnuxt-protokit","0.docs\u002F4.nuxt-protokit\u002Findex",{"title":185,"path":370,"stem":371,"children":372,"icon":381},"\u002Fdocs\u002Fnuxt-protokit\u002Fgetting-started","0.docs\u002F4.nuxt-protokit\u002F1.getting-started\u002F1.index",[373,374,378],{"title":190,"path":370,"stem":371},{"title":375,"path":376,"stem":377},"Core Concepts","\u002Fdocs\u002Fnuxt-protokit\u002Fgetting-started\u002Fconcepts","0.docs\u002F4.nuxt-protokit\u002F1.getting-started\u002F2.concepts",{"title":198,"path":379,"stem":380},"\u002Fdocs\u002Fnuxt-protokit\u002Fgetting-started\u002Fquick-start","0.docs\u002F4.nuxt-protokit\u002F1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":383,"path":384,"stem":385,"children":386,"icon":408},"Schemas","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F1.index",[387,388,392,396,400,404],{"title":5,"path":384,"stem":385},{"title":389,"path":390,"stem":391},"Field Types","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Ffields","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F2.fields",{"title":393,"path":394,"stem":395},"Collections","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Fcollections","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F3.collections",{"title":397,"path":398,"stem":399},"Derived & Computed","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Fderived-computed","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F4.derived-computed",{"title":401,"path":402,"stem":403},"Connections","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Fconnections","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F5.connections",{"title":405,"path":406,"stem":407},"Visualizations & Layouts","\u002Fdocs\u002Fnuxt-protokit\u002Fschemas\u002Fvisualizations","0.docs\u002F4.nuxt-protokit\u002F2.schemas\u002F6.visualizations","i-lucide-file-code",{"title":355,"path":410,"stem":411,"children":412,"icon":426},"\u002Fdocs\u002Fnuxt-protokit\u002Fcomposables","0.docs\u002F4.nuxt-protokit\u002F3.composables\u002F1.index",[413,414,418,422],{"title":5,"path":410,"stem":411},{"title":415,"path":416,"stem":417},"usePrototype","\u002Fdocs\u002Fnuxt-protokit\u002Fcomposables\u002Fuse-prototype","0.docs\u002F4.nuxt-protokit\u002F3.composables\u002F2.use-prototype",{"title":419,"path":420,"stem":421},"useProtoDoc","\u002Fdocs\u002Fnuxt-protokit\u002Fcomposables\u002Fuse-proto-doc","0.docs\u002F4.nuxt-protokit\u002F3.composables\u002F3.use-proto-doc",{"title":423,"path":424,"stem":425},"useProtoCollection","\u002Fdocs\u002Fnuxt-protokit\u002Fcomposables\u002Fuse-proto-collection","0.docs\u002F4.nuxt-protokit\u002F3.composables\u002F4.use-proto-collection","i-lucide-layers",{"title":428,"path":429,"stem":430,"children":431,"icon":449},"Components","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F1.index",[432,433,437,441,445],{"title":5,"path":429,"stem":430},{"title":434,"path":435,"stem":436},"ProtoTool","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents\u002Fproto-tool","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F2.proto-tool",{"title":438,"path":439,"stem":440},"ProtoCrudModal","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents\u002Fproto-crud-modal","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F3.proto-crud-modal",{"title":442,"path":443,"stem":444},"ProtoCalendar","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents\u002Fproto-calendar","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F4.proto-calendar",{"title":446,"path":447,"stem":448},"ProtoItemPanel variants","\u002Fdocs\u002Fnuxt-protokit\u002Fcomponents\u002Fproto-item-panels","0.docs\u002F4.nuxt-protokit\u002F4.components\u002F5.proto-item-panels","i-lucide-puzzle",{"title":151,"path":451,"stem":452,"children":453,"icon":471},"\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F1.index",[454,455,459,463,467],{"title":151,"path":451,"stem":452},{"title":456,"path":457,"stem":458},"Corruption Recovery","\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fcorruption-recovery","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F2.corruption-recovery",{"title":460,"path":461,"stem":462},"Size & GC","\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fdocument-size-and-gc","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F3.document-size-and-gc",{"title":464,"path":465,"stem":466},"Multi-tenant Isolation","\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fmulti-tenant-isolation","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F4.multi-tenant-isolation",{"title":468,"path":469,"stem":470},"Encryption at Rest","\u002Fdocs\u002Fnuxt-protokit\u002Foffline-first\u002Fencryption","0.docs\u002F4.nuxt-protokit\u002F5.offline-first\u002F5.encryption","i-lucide-wifi-off",{"title":473,"icon":474,"path":475,"stem":476,"children":477},"Advanced","i-lucide-graduation-cap","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F1.index",[478,479,483,487,491,494,498],{"title":5,"path":475,"stem":476},{"title":480,"path":481,"stem":482},"Multi-Tool Apps","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fbuilding-a-toolkit","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F1.building-a-toolkit",{"title":484,"path":485,"stem":486},"Schema Patterns","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fcustom-schema-patterns","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F2.custom-schema-patterns",{"title":488,"path":489,"stem":490},"Custom Fields & Viz","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fextensibility","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F3.extensibility",{"title":339,"path":492,"stem":493},"\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fpermissions","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F4.permissions",{"title":495,"path":496,"stem":497},"Business Logic Guards","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fpermissions-business-logic","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F5.permissions-business-logic",{"title":499,"path":500,"stem":501},"Headless Mode","\u002Fdocs\u002Fnuxt-protokit\u002Fadvanced\u002Fheadless-mode","0.docs\u002F4.nuxt-protokit\u002F6.advanced\u002F6.headless-mode",{"title":359,"path":503,"stem":504,"children":505,"icon":364},"\u002Fdocs\u002Fnuxt-protokit\u002Fclaude-code-skills","0.docs\u002F4.nuxt-protokit\u002F7.claude-code-skills\u002F1.index",[506],{"title":5,"path":503,"stem":504},{"page":508,"fallbackPage":1777},{"id":509,"title":295,"body":510,"description":639,"extension":1776,"links":1777,"meta":1778,"navigation":1777,"ogImage":1777,"path":296,"seo":1779,"stem":297,"__hash__":1780},"nuxt_auto\u002F0.docs\u002F3.nuxt-auto\u002F2.auto-api\u002F40.upgrading.md",{"type":511,"value":512,"toc":1755},"minimark",[513,517,522,531,536,623,633,762,791,795,870,882,886,905,909,928,936,957,961,1022,1026,1044,1048,1192,1382,1386,1423,1426,1454,1458,1508,1523,1527,1581,1585,1673,1676,1709,1711,1740,1744,1751],[514,515,295],"h1",{"id":516},"upgrading",[518,519,521],"h2",{"id":520},"to-the-security-release","To the security release",[523,524,525,526,530],"p",{},"This release closes the gaps a security review found in the pre-release versions. Most changes make a request\nthat used to succeed — when it should not have — fail. Options that could never work (functions in\n",[527,528,529],"code",{},"runtimeConfig",") now fail the build with a message pointing here, so nothing changes silently.",[532,533,535],"h3",{"id":534},"authorization-is-deny-by-default","Authorization is deny-by-default",[537,538,539,552],"table",{},[540,541,542],"thead",{},[543,544,545,549],"tr",{},[546,547,548],"th",{},"Before",[546,550,551],{},"Now",[553,554,555,572,584,601],"tbody",{},[543,556,557,565],{},[558,559,560,561],"td",{},"An operation with no permission was ",[562,563,564],"strong",{},"allowed",[558,566,567,568,571],{},"It is ",[562,569,570],{},"refused",": 401 anonymous, 403 signed in",[543,573,574,581],{},[558,575,576,577,580],{},"A resource without ",[527,578,579],{},"authorization"," was open",[558,582,583],{},"It refuses every request; the build warns and names it",[543,585,586,592],{},[558,587,588,591],{},[527,589,590],{},"'*'"," had no special meaning",[558,593,594,596,597,600],{},[527,595,590],{}," in ",[527,598,599],{},"ctx.permissions"," passes every operation (super-admin)",[543,602,603,609],{},[558,604,605,608],{},[527,606,607],{},"permissions.aggregate"," did not exist",[558,610,611,612,615,616,619,620],{},"It gates ",[527,613,614],{},"\u002Faggregate"," and ",[527,617,618],{},"?aggregate=","; falls back to ",[527,621,622],{},"read",[523,624,625,628,629,632],{},[562,626,627],{},"Migrate:"," declare every operation you serve. ",[527,630,631],{},"true"," means public:",[634,635,640],"pre",{"className":636,"code":637,"language":638,"meta":639,"style":639},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export const postsAuth: ResourceAuthConfig = {\n  permissions: { read: true, create: ctx => !!ctx.user, update: 'posts:write', delete: 'admin' },\n}\n","ts","",[527,641,642,673,756],{"__ignoreMap":639},[643,644,647,651,655,659,663,667,670],"span",{"class":645,"line":646},"line",1,[643,648,650],{"class":649},"s7zQu","export",[643,652,654],{"class":653},"spNyl"," const",[643,656,658],{"class":657},"sTEyZ"," postsAuth",[643,660,662],{"class":661},"sMK4o",":",[643,664,666],{"class":665},"sBMFI"," ResourceAuthConfig",[643,668,669],{"class":661}," =",[643,671,672],{"class":661}," {\n",[643,674,676,680,682,685,688,690,694,697,701,703,707,710,713,716,719,722,724,727,729,732,736,739,741,744,746,748,751,753],{"class":645,"line":675},2,[643,677,679],{"class":678},"swJcz","  permissions",[643,681,662],{"class":661},[643,683,684],{"class":661}," {",[643,686,687],{"class":678}," read",[643,689,662],{"class":661},[643,691,693],{"class":692},"sfNiH"," true",[643,695,696],{"class":661},",",[643,698,700],{"class":699},"s2Zo4"," create",[643,702,662],{"class":661},[643,704,706],{"class":705},"sHdIc"," ctx",[643,708,709],{"class":653}," =>",[643,711,712],{"class":661}," !!",[643,714,715],{"class":657},"ctx",[643,717,718],{"class":661},".",[643,720,721],{"class":657},"user",[643,723,696],{"class":661},[643,725,726],{"class":678}," update",[643,728,662],{"class":661},[643,730,731],{"class":661}," '",[643,733,735],{"class":734},"sfazB","posts:write",[643,737,738],{"class":661},"'",[643,740,696],{"class":661},[643,742,743],{"class":678}," delete",[643,745,662],{"class":661},[643,747,731],{"class":661},[643,749,750],{"class":734},"admin",[643,752,738],{"class":661},[643,754,755],{"class":661}," },\n",[643,757,759],{"class":645,"line":758},3,[643,760,761],{"class":661},"}\n",[523,763,764,767,768,615,771,774,775,767,778,615,781,783,784,787,788,718],{},[527,765,766],{},"restore",", ",[527,769,770],{},"purge",[527,772,773],{},"viewDeleted"," fall back to ",[527,776,777],{},"update",[527,779,780],{},"delete",[527,782,766],{}," — the hardcoded ",[527,785,786],{},"'admin'","\nrole and org-role fallbacks for trash access are gone. See\n",[789,790,303],"a",{"href":304},[532,792,794],{"id":793},"multi-tenancy-is-server-resolved-and-fails-closed","Multi-tenancy is server-resolved and fails closed",[796,797,798,826,845,848,860],"ul",{},[799,800,801,804,805,767,808,767,811,814,815,817,818,825],"li",{},[562,802,803],{},"Removed:"," ",[527,806,807],{},"multiTenancy.getTenantId",[527,809,810],{},"allowCrossTenantAccess",[527,812,813],{},"requireTenant"," — the build fails if set.\nThey were functions read through serialized ",[527,816,529],{},", so they never reached the server, and\nresolution fell back to a ",[562,819,820,821,824],{},"client-supplied ",[527,822,823],{},"x-tenant-id"," header",". That header is no longer read.",[799,827,828,829,832,833,836,837,840,841,844],{},"The tenant comes from ",[527,830,831],{},"ctx.tenant"," (context extender), ",[527,834,835],{},"event.context.tenantId"," or\n",[527,838,839],{},"ctx.user[userTenantField]"," (default ",[527,842,843],{},"organizationId",").",[799,846,847],{},"A scoped resource without a tenant answers 403 (401 anonymous) instead of returning unscoped rows.",[799,849,850,851,767,854,767,857,718],{},"New options: ",[527,852,853],{},"userTenantField",[527,855,856],{},"scopedResources",[527,858,859],{},"excludedResources",[799,861,862,863,866,867,718],{},"The better-auth plugin maps ",[527,864,865],{},"session.activeOrganizationId"," onto ",[527,868,869],{},"ctx.user.organizationId",[523,871,872,874,875,877,878,881],{},[562,873,627],{}," see ",[789,876,235],{"href":236},". Cross-tenant staff: set\n",[527,879,880],{},"ctx.tenant.canAccessAllTenants"," from a context extender.",[532,883,885],{"id":884},"rows-are-filtered-everywhere","Rows are filtered everywhere",[523,887,888,889,892,893,896,897,900,901,904],{},"Tenant scoping, ",[527,890,891],{},"listFilter",", soft delete and ",[527,894,895],{},"objectLevel"," now apply on every route — get, update, delete,\nrestore, bulk, aggregate, ",[527,898,899],{},"?include=",", and both sides of M2M — not only the list. Rows the caller may not see\nanswer ",[562,902,903],{},"404"," (not 403), so existence is not disclosed.",[532,906,908],{"id":907},"server-owned-columns-are-ignored-in-bodies","Server-owned columns are ignored in bodies",[523,910,911,912,915,916,919,920,923,924,927],{},"The primary key and ",[527,913,914],{},"createdAt"," on update, a primary key the database generates (auto-increment, serial,\nidentity) on create, soft-delete columns, ",[527,917,918],{},"createdBy"," \u002F ",[527,921,922],{},"updatedBy",", the tenant column and a registration's new\n",[527,925,926],{},"protectedFields"," are dropped from create\u002Fupdate bodies (and left out of generated validation schemas). A\nclient can no longer move a row to another tenant, un-trash it, forge authorship, or push an auto-increment\nkey to its maximum so that every later insert fails. A text \u002F UUID key the database does not generate stays\nwritable on create, so client-made ids keep working.",[532,929,931,932,935],{"id":930},"field-level-write-rules-are-enforced","Field-level ",[527,933,934],{},"write"," rules are enforced",[523,937,938,941,942,945,946,949,950,952,953,956],{},[527,939,940],{},"fields[x].write"," used to be reported by ",[527,943,944],{},"\u002Fpermissions"," only — a request could still write the column. Now a\ncreate\u002Fupdate (or bulk item) that sets a field the caller may not write is ",[562,947,948],{},"refused with 403"," (401 anonymous);\nthe field is not silently dropped. To ignore a field instead of refusing, list it in the registration's\n",[527,951,926],{}," or remove it in a ",[527,954,955],{},"before*"," hook.",[532,958,960],{"id":959},"queries-are-strict","Queries are strict",[796,962,963,987,1007],{},[799,964,965,966,767,969,767,972,767,975,978,979,982,983,986],{},"An unknown or hidden field in ",[527,967,968],{},"filter",[527,970,971],{},"sort",[527,973,974],{},"fields",[527,976,977],{},"include"," or ",[527,980,981],{},"groupBy"," is a ",[562,984,985],{},"400"," (it used to be\nignored, or leaked through hidden columns).",[799,988,989,990,993,994,997,998,1002,1003,1006],{},"Filter operators: ",[527,991,992],{},"$eq $ne $gt $gte $lt $lte $like $in $nin $null",", and a top-level ",[527,995,996],{},"$or","; anything else is a\n400 (see ",[789,999,1001],{"href":1000},"\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fpagination#filtering","Filtering","). ",[527,1004,1005],{},"$in"," takes at most 500 values.",[799,1008,1009,1011,1012,1014,1015,1017,1018,1021],{},[527,1010,899],{}," checks the included resource's ",[527,1013,622],{}," permission (403), limits depth (3) and count (20), and\nallows ",[527,1016,968],{},"\u002F",[527,1019,1020],{},"limit"," only on to-many relations.",[532,1023,1025],{"id":1024},"cursor-pagination-is-keyset","Cursor pagination is keyset",[523,1027,1028,1029,1031,1032,1039,1040,1043],{},"Cursors are opaque keyset cursors that follow ",[527,1030,971],{}," with the primary key as tiebreaker. ",[562,1033,1034,1035,1038],{},"Send ",[527,1036,1037],{},"cursor=","\n(empty) on the first page","; old cursors are rejected with 400. ",[527,1041,1042],{},"useAutoApiInfinite"," does this for you.",[532,1045,1047],{"id":1046},"removed-options-and-apis","Removed options and APIs",[537,1049,1050,1060],{},[540,1051,1052],{},[543,1053,1054,1057],{},[546,1055,1056],{},"Removed",[546,1058,1059],{},"Use instead",[553,1061,1062,1087,1100,1127,1146,1158,1177],{},[543,1063,1064,1069],{},[558,1065,1066],{},[527,1067,1068],{},"autoApi.hooks",[558,1070,1071,1072,1075,1076,1079,1080,1083,1084,1086],{},"Registration ",[527,1073,1074],{},"hooks"," via ",[527,1077,1078],{},"createModuleImport",", or ",[527,1081,1082],{},"addResourceHook"," in a Nitro plugin (",[789,1085,215],{"href":216},")",[543,1088,1089,1097],{},[558,1090,1091,919,1094],{},[527,1092,1093],{},"autoApi.exclude",[527,1095,1096],{},"autoApi.include",[558,1098,1099],{},"Register only the resources you want to expose",[543,1101,1102,1107],{},[558,1103,1104],{},[527,1105,1106],{},"defineAutoApiHandler",[558,1108,1109,1112,1113,1116,1117,1120,1121,1124,1125,1086],{},[527,1110,1111],{},"createEndpoint"," — ",[527,1114,1115],{},"execute"," → ",[527,1118,1119],{},"handler",", return the payload without ",[527,1122,1123],{},"{ data }"," (",[789,1126,231],{"href":232},[543,1128,1129,1134],{},[558,1130,1131],{},[527,1132,1133],{},"GET \u002Fapi\u002F_m2m\u002Fdebug-detection",[558,1135,1136,767,1139,767,1142,1145],{},[527,1137,1138],{},"\u002Fapi\u002F_m2m\u002Fjunctions",[527,1140,1141],{},"\u002Fis-junction\u002F:table",[527,1143,1144],{},"\u002Fdetect\u002F:resource"," (signed-in only)",[543,1147,1148,1151],{},[558,1149,1150],{},"Server auto-import of internal helpers",[558,1152,1153,1154,1157],{},"Only the public API of ",[527,1155,1156],{},"@websideproject\u002Fnuxt-auto-api\u002Futils"," is auto-imported",[543,1159,1160,1167],{},[558,1161,1162,1163,1166],{},"An inline ",[527,1164,1165],{},"validation"," object on a registration (was silently ignored)",[558,1168,1169,1172,1173,615,1175],{},[527,1170,1171],{},"validation: createModuleImport(path, name)"," — inline now fails the build, like ",[527,1174,579],{},[527,1176,1074],{},[543,1178,1179,1185],{},[558,1180,1181,1184],{},[527,1182,1183],{},"autoApi.database"," (was never read)",[558,1186,1187,1188,1191],{},"The engine is the second argument of ",[527,1189,1190],{},"initializeDatabase(db, engine)","; the option is accepted but ignored",[634,1193,1195],{"className":636,"code":1194,"language":638,"meta":639,"style":639},"\u002F\u002F Before\nexport default defineAutoApiHandler({\n  async execute(context) {\n    return { data: await loadStats(context) }\n  },\n})\n\n\u002F\u002F After\nexport default createEndpoint({\n  resource: 'users',\n  operation: 'get',\n  async handler(ctx) {\n    return loadStats(ctx)\n  },\n})\n",[527,1196,1197,1203,1219,1236,1264,1270,1279,1286,1292,1306,1324,1341,1357,1370,1375],{"__ignoreMap":639},[643,1198,1199],{"class":645,"line":646},[643,1200,1202],{"class":1201},"sHwdD","\u002F\u002F Before\n",[643,1204,1205,1207,1210,1213,1216],{"class":645,"line":675},[643,1206,650],{"class":649},[643,1208,1209],{"class":649}," default",[643,1211,1212],{"class":699}," defineAutoApiHandler",[643,1214,1215],{"class":657},"(",[643,1217,1218],{"class":661},"{\n",[643,1220,1221,1224,1227,1229,1232,1234],{"class":645,"line":758},[643,1222,1223],{"class":653},"  async",[643,1225,1226],{"class":678}," execute",[643,1228,1215],{"class":661},[643,1230,1231],{"class":705},"context",[643,1233,1086],{"class":661},[643,1235,672],{"class":661},[643,1237,1239,1242,1244,1247,1249,1252,1255,1257,1259,1262],{"class":645,"line":1238},4,[643,1240,1241],{"class":649},"    return",[643,1243,684],{"class":661},[643,1245,1246],{"class":678}," data",[643,1248,662],{"class":661},[643,1250,1251],{"class":649}," await",[643,1253,1254],{"class":699}," loadStats",[643,1256,1215],{"class":678},[643,1258,1231],{"class":657},[643,1260,1261],{"class":678},") ",[643,1263,761],{"class":661},[643,1265,1267],{"class":645,"line":1266},5,[643,1268,1269],{"class":661},"  },\n",[643,1271,1273,1276],{"class":645,"line":1272},6,[643,1274,1275],{"class":661},"}",[643,1277,1278],{"class":657},")\n",[643,1280,1282],{"class":645,"line":1281},7,[643,1283,1285],{"emptyLinePlaceholder":1284},true,"\n",[643,1287,1289],{"class":645,"line":1288},8,[643,1290,1291],{"class":1201},"\u002F\u002F After\n",[643,1293,1295,1297,1299,1302,1304],{"class":645,"line":1294},9,[643,1296,650],{"class":649},[643,1298,1209],{"class":649},[643,1300,1301],{"class":699}," createEndpoint",[643,1303,1215],{"class":657},[643,1305,1218],{"class":661},[643,1307,1309,1312,1314,1316,1319,1321],{"class":645,"line":1308},10,[643,1310,1311],{"class":678},"  resource",[643,1313,662],{"class":661},[643,1315,731],{"class":661},[643,1317,1318],{"class":734},"users",[643,1320,738],{"class":661},[643,1322,1323],{"class":661},",\n",[643,1325,1327,1330,1332,1334,1337,1339],{"class":645,"line":1326},11,[643,1328,1329],{"class":678},"  operation",[643,1331,662],{"class":661},[643,1333,731],{"class":661},[643,1335,1336],{"class":734},"get",[643,1338,738],{"class":661},[643,1340,1323],{"class":661},[643,1342,1344,1346,1349,1351,1353,1355],{"class":645,"line":1343},12,[643,1345,1223],{"class":653},[643,1347,1348],{"class":678}," handler",[643,1350,1215],{"class":661},[643,1352,715],{"class":705},[643,1354,1086],{"class":661},[643,1356,672],{"class":661},[643,1358,1360,1362,1364,1366,1368],{"class":645,"line":1359},13,[643,1361,1241],{"class":649},[643,1363,1254],{"class":699},[643,1365,1215],{"class":678},[643,1367,715],{"class":657},[643,1369,1278],{"class":678},[643,1371,1373],{"class":645,"line":1372},14,[643,1374,1269],{"class":661},[643,1376,1378,1380],{"class":645,"line":1377},15,[643,1379,1275],{"class":661},[643,1381,1278],{"class":657},[532,1383,1385],{"id":1384},"custom-endpoints","Custom endpoints",[796,1387,1388,1398],{},[799,1389,1390,1391,1116,1394,1397],{},"A named gate (",[527,1392,1393],{},"endpointName",[527,1395,1396],{},"authorization.custom[name]",") decides only the operations it declares; others\nfall back to the resource's permissions instead of being allowed.",[799,1399,1400,1401,1403,1404,1407,1408,1411,1412,919,1415,1418,1419,844],{},"A standalone ",[527,1402,1111],{}," (no ",[527,1405,1406],{},"resource",") and ",[527,1409,1410],{},"getAutoApiContext"," resolve the caller but authorize\nnothing — gate them yourself. Use ",[527,1413,1414],{},"findAuthorizedRow",[527,1416,1417],{},"rowScope"," to read rows\n(",[789,1420,1422],{"href":1421},"\u002Fdocs\u002Fnuxt-auto\u002Fauto-api\u002Fcustom-endpoints#row-access","Row access",[532,1424,1425],{"id":1074},"Hooks",[796,1427,1428,1437,1444],{},[799,1429,1430,1433,1434,718],{},[527,1431,1432],{},"beforeGet"," receives ",[527,1435,1436],{},"(id, ctx)",[799,1438,1439,1440,1443],{},"An error thrown by a hook keeps its status: ",[527,1441,1442],{},"throw createError({ statusCode: 409 })"," answers 409 (it used to\nbecome a 500).",[799,1445,1446,1447,919,1450,1453],{},"Your ",[527,1448,1449],{},"onSuccess",[527,1451,1452],{},"onError"," on composables run after the built-in ones instead of replacing them.",[532,1455,1457],{"id":1456},"bulk","Bulk",[537,1459,1460,1470],{},[540,1461,1462],{},[543,1463,1464,1467],{},[546,1465,1466],{},"Route",[546,1468,1469],{},"Body",[553,1471,1472,1484,1496],{},[543,1473,1474,1479],{},[558,1475,1476],{},[527,1477,1478],{},"POST \u002Fbulk",[558,1480,1481],{},[527,1482,1483],{},"{ items: [{…}] }",[543,1485,1486,1491],{},[558,1487,1488],{},[527,1489,1490],{},"PATCH \u002Fbulk",[558,1492,1493],{},[527,1494,1495],{},"{ items: [{ id, data: {…} }] }",[543,1497,1498,1503],{},[558,1499,1500],{},[527,1501,1502],{},"DELETE \u002Fbulk",[558,1504,1505],{},[527,1506,1507],{},"{ ids: [...] }",[523,1509,1510,1511,1514,1515,1518,1519,1522],{},"Each item goes through the single-record rules (validation, protected fields, row visibility, hooks). A\ntransactional batch checks every item (and runs its before-hook) before writing any, writes them together —\non D1 too, as one ",[527,1512,1513],{},"db.batch()"," — and runs the after-hooks once committed. The failure message is\n",[527,1516,1517],{},"Bulk operation failed (nothing was written)"," for a failed check and ",[527,1520,1521],{},"… (rolled back)"," for a database error.",[532,1524,1526],{"id":1525},"soft-delete","Soft delete",[796,1528,1529,1535,1542,1545,1551,1561],{},[799,1530,1531,1534],{},[527,1532,1533],{},"deletionId"," is always generated by the server.",[799,1536,1537,1538,1541],{},"Deleting an already-trashed row is a 404 unless ",[527,1539,1540],{},"?force=true"," (purge).",[799,1543,1544],{},"Batch restore\u002Fpurge are all-or-nothing across every row of the batch.",[799,1546,1547,1548,1550],{},"A cascade no longer re-stamps a child that was already in the trash: it keeps its own ",[527,1549,1533],{},", and\nrestoring the parent does not bring it back.",[799,1552,1553,1554,1556,1557,1560],{},"Soft delete with its cascade, batch restore\u002Fpurge, bulk writes and M2M changes are all-or-nothing on every\nengine — on D1 as one ",[527,1555,1513],{},". ",[527,1558,1559],{},"atomicWrites()"," gives your own endpoints the same.",[799,1562,1563,1566,1567,919,1570,919,1573,1576,1577,1580],{},[527,1564,1565],{},"GET \u002Fapi\u002Fpermissions"," reports ",[527,1568,1569],{},"canRestore",[527,1571,1572],{},"canPurge",[527,1574,1575],{},"canViewDeleted"," as ",[527,1578,1579],{},"false"," on a table without\nsoft delete.",[532,1582,1584],{"id":1583},"plugins","Plugins",[796,1586,1587,1603,1632,1638,1663],{},[799,1588,1589,1596,1597,1599,1600,718],{},[562,1590,1591,1592,1595],{},"Listed in ",[527,1593,1594],{},"nuxt.config",", built-in factories now work."," They used to be stringified, losing their options\n(a rate limiter listed there threw at startup and limited nothing). They are now recreated from their\noptions; an option that cannot be — an instance such as a store — fails the build. Register those from a\nfile. ",[527,1598,1583],{}," also takes both: ",[527,1601,1602],{},"['~\u002Fserver\u002Fautoapi-plugins', createExportPlugin()]",[799,1604,1605,1608,1609,1611,1612,1615,1616,1619,1620,919,1622,919,1625,1628,1629,718],{},[562,1606,1607],{},"Plugins that add routes work, and are authorized."," Export, file upload, the audit-log and activity feeds\nand token introspection used to crash the build when listed in ",[527,1610,1594],{}," (and had no routes from a file).\nTheir routes now go through the same authorization as the generated ones — see the\n",[789,1613,1614],{"href":264},"catalog",". Export and upload routes are registered per resource\n(",[527,1617,1618],{},"\u002Fapi\u002F{resource}\u002Fexport","); the feeds take ",[527,1621,1020],{},[527,1623,1624],{},"page",[527,1626,1627],{},"cursor"," instead of ",[527,1630,1631],{},"offset",[799,1633,1634,1637],{},[562,1635,1636],{},"API tokens"," always belong to the caller who creates them (and their active organization): an owner in the\nbody is ignored and an update cannot move a token.",[799,1639,1640,1643,1644,1647,1648,1651,1652,1655,1656,1658,1659,1662],{},[562,1641,1642],{},"Rate limiting"," keys on ",[527,1645,1646],{},"CF-Connecting-IP"," only on Cloudflare and on ",[527,1649,1650],{},"X-Forwarded-For"," only with\n",[527,1653,1654],{},"trustProxy"," — a client can set either header elsewhere. Behind your own proxy, set ",[527,1657,1654],{},". The request\nmetadata plugin reads its ",[527,1660,1661],{},"CF-*"," headers on the same rule.",[799,1664,1665,1668,1669,1672],{},[562,1666,1667],{},"Cache"," stores the whole response (pagination ",[527,1670,1671],{},"meta"," included) and is invalidated by every write route,\nincluding bulk, restore and M2M.",[532,1674,355],{"id":1675},"composables",[796,1677,1678,1684,1693,1702],{},[799,1679,1680,1683],{},[527,1681,1682],{},"useAutoApiOptimisticUpdate(queryClient, resource, id, updates)"," — the query client is now the first argument.",[799,1685,1686,1689,1690,718],{},[527,1687,1688],{},"useAutoApiUpdate"," takes ",[527,1691,1692],{},"{ id, ...fields }",[799,1694,1695,1696,1689,1699,718],{},"Bulk composables send the bodies above; ",[527,1697,1698],{},"useAutoApiAggregate",[527,1700,1701],{},"{ aggregate, groupBy?, having?, filter? }",[799,1703,1704,1705,1708],{},"All composables honour ",[527,1706,1707],{},"autoApi.prefix",", and during SSR send the request's headers.",[532,1710,87],{"id":750},[796,1712,1713,1719],{},[799,1714,1715,1718],{},[527,1716,1717],{},"POST \u002Fapi\u002Fadmin\u002Fm2m\u002Fsync"," (unauthenticated) was removed; the admin UI uses the API's M2M routes.",[799,1720,1721,1724,1725,1728,1729,1731,1732,1735,1736,1739],{},[527,1722,1723],{},"autoAdmin.access"," and a custom page's ",[527,1726,1727],{},"canAccess"," were never applied (a function in ",[527,1730,1594],{}," cannot reach\nthe running app); setting them now fails the build. Use ",[527,1733,1734],{},"autoAdmin.middleware: 'your-middleware'"," and\n",[527,1737,1738],{},"customPages[].permissions: ['\u003Cresource>:\u003Caction>']",", which are enforced.",[532,1741,1743],{"id":1742},"requirements","Requirements",[523,1745,1746,1747,1750],{},"Nuxt 4 (",[527,1748,1749],{},">=4.0.0","). The suite also runs against the Nuxt 5 nightly.",[1752,1753,1754],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .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}",{"title":639,"searchDepth":675,"depth":675,"links":1756},[1757],{"id":520,"depth":675,"text":521,"children":1758},[1759,1760,1761,1762,1763,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775],{"id":534,"depth":758,"text":535},{"id":793,"depth":758,"text":794},{"id":884,"depth":758,"text":885},{"id":907,"depth":758,"text":908},{"id":930,"depth":758,"text":1764},"Field-level write rules are enforced",{"id":959,"depth":758,"text":960},{"id":1024,"depth":758,"text":1025},{"id":1046,"depth":758,"text":1047},{"id":1384,"depth":758,"text":1385},{"id":1074,"depth":758,"text":1425},{"id":1456,"depth":758,"text":1457},{"id":1525,"depth":758,"text":1526},{"id":1583,"depth":758,"text":1584},{"id":1675,"depth":758,"text":355},{"id":750,"depth":758,"text":87},{"id":1742,"depth":758,"text":1743},"md",null,{},{"title":295,"description":639},"z4Cphyd3W-4uQaEjsRMMJvjbiezj3tOGWooXhv-g-Wg",[1782,1784],{"title":291,"path":292,"stem":293,"description":1783,"children":-1},"@websideproject\u002Fnuxt-auto-api supports offset (page) pagination and cursor (keyset) pagination. Every list is\ncapped: ?limit defaults to pagination.defaultLimit (20) and can never exceed pagination.maxLimit (100).",{"title":299,"path":300,"stem":301,"description":1785,"children":-1},"Soft deletes mark records as deleted (a timestamp) instead of removing them, with restore, purge,\ncascade-to-children, and batch (cascade-group) restore\u002Fpurge.",1791106765185]