[{"data":1,"prerenderedAt":4360},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-auto/auto-api/plugin-system-en":444,"/docs/nuxt-auto/auto-api/plugin-system-surround-en":4355},[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":4351},{"id":446,"title":223,"body":447,"description":457,"extension":4350,"links":4351,"meta":4352,"navigation":4351,"ogImage":4351,"path":224,"seo":4353,"stem":225,"__hash__":4354},"nuxt_auto/0.docs/3.nuxt-auto/2.auto-api/13.plugin-system.md",{"type":448,"value":449,"toc":4315},"minimark",[450,454,458,462,465,490,494,501,509,591,595,824,827,831,837,943,950,970,1004,1007,1138,1141,1145,1148,1152,1299,1303,1306,1458,1465,1626,1630,1636,1640,1644,1972,1976,2278,2282,2285,2292,2365,2369,2534,2538,2545,2684,2688,2698,2872,2876,2883,3034,3038,3041,3191,3195,3389,3396,3400,3639,3643,3660,3664,3668,3917,3920,3987,3991,4171,4176,4207,4211,4218,4306,4311],[451,452,223],"h1",{"id":453},"plugin-system",[455,456,457],"p",{},"The plugin system provides a structured architecture for extending @websideproject/nuxt-auto-api. Plugins can hook into both the build-time module setup and the server-side runtime pipeline.",[459,460,5],"h2",{"id":461},"overview",[455,463,464],{},"A plugin has two optional phases:",[466,467,468,481],"ul",{},[469,470,471,475,476,480],"li",{},[472,473,474],"strong",{},"Build-time"," (",[477,478,479],"code",{},"buildSetup",") - Runs during Nuxt module setup. Register server handlers, add imports, modify options.",[469,482,483,475,486,489],{},[472,484,485],{},"Runtime",[477,487,488],{},"runtimeSetup",") - Runs when the Nitro server starts. Register middleware, hooks, and context extenders.",[459,491,493],{"id":492},"plugin-registration","Plugin Registration",[455,495,496,497,500],{},"Plugins are registered via a ",[472,498,499],{},"server file"," that exports an array. This approach gives full closure, import, and TypeScript support with zero serialization issues.",[502,503,505,506],"h3",{"id":504},"step-1-point-to-the-file-in-nuxtconfigts","Step 1: Point to the file in ",[477,507,508],{},"nuxt.config.ts",[510,511,516],"pre",{"className":512,"code":513,"language":514,"meta":515,"style":515},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  autoApi: {\n    plugins: '~/server/autoapi-plugins',\n  },\n})\n","typescript","",[477,517,518,542,555,576,582],{"__ignoreMap":515},[519,520,523,527,530,534,538],"span",{"class":521,"line":522},"line",1,[519,524,526],{"class":525},"s7zQu","export",[519,528,529],{"class":525}," default",[519,531,533],{"class":532},"s2Zo4"," defineNuxtConfig",[519,535,537],{"class":536},"sTEyZ","(",[519,539,541],{"class":540},"sMK4o","{\n",[519,543,545,549,552],{"class":521,"line":544},2,[519,546,548],{"class":547},"swJcz","  autoApi",[519,550,551],{"class":540},":",[519,553,554],{"class":540}," {\n",[519,556,558,561,563,566,570,573],{"class":521,"line":557},3,[519,559,560],{"class":547},"    plugins",[519,562,551],{"class":540},[519,564,565],{"class":540}," '",[519,567,569],{"class":568},"sfazB","~/server/autoapi-plugins",[519,571,572],{"class":540},"'",[519,574,575],{"class":540},",\n",[519,577,579],{"class":521,"line":578},4,[519,580,581],{"class":540},"  },\n",[519,583,585,588],{"class":521,"line":584},5,[519,586,587],{"class":540},"}",[519,589,590],{"class":536},")\n",[502,592,594],{"id":593},"step-2-create-the-server-file","Step 2: Create the server file",[510,596,598],{"className":512,"code":597,"language":514,"meta":515,"style":515},"// server/autoapi-plugins.ts\nimport { createRateLimitPlugin, createRequestMetadataPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport default [\n  createRateLimitPlugin({\n    windowMs: 60000,\n    max: 200,\n    skip: (ctx) => ctx.user?.role === 'admin',\n  }),\n  createRequestMetadataPlugin({\n    autoPopulateOn: ['create', 'update'],\n    resources: ['users'],\n  }),\n]\n",[477,599,600,606,637,643,652,661,675,688,736,746,756,788,809,818],{"__ignoreMap":515},[519,601,602],{"class":521,"line":522},[519,603,605],{"class":604},"sHwdD","// server/autoapi-plugins.ts\n",[519,607,608,611,614,617,620,623,626,629,631,634],{"class":521,"line":544},[519,609,610],{"class":525},"import",[519,612,613],{"class":540}," {",[519,615,616],{"class":536}," createRateLimitPlugin",[519,618,619],{"class":540},",",[519,621,622],{"class":536}," createRequestMetadataPlugin",[519,624,625],{"class":540}," }",[519,627,628],{"class":525}," from",[519,630,565],{"class":540},[519,632,633],{"class":568},"@websideproject/nuxt-auto-api/plugins",[519,635,636],{"class":540},"'\n",[519,638,639],{"class":521,"line":557},[519,640,642],{"emptyLinePlaceholder":641},true,"\n",[519,644,645,647,649],{"class":521,"line":578},[519,646,526],{"class":525},[519,648,529],{"class":525},[519,650,651],{"class":536}," [\n",[519,653,654,657,659],{"class":521,"line":584},[519,655,656],{"class":532},"  createRateLimitPlugin",[519,658,537],{"class":536},[519,660,541],{"class":540},[519,662,664,667,669,673],{"class":521,"line":663},6,[519,665,666],{"class":547},"    windowMs",[519,668,551],{"class":540},[519,670,672],{"class":671},"sbssI"," 60000",[519,674,575],{"class":540},[519,676,678,681,683,686],{"class":521,"line":677},7,[519,679,680],{"class":547},"    max",[519,682,551],{"class":540},[519,684,685],{"class":671}," 200",[519,687,575],{"class":540},[519,689,691,694,696,698,702,705,709,712,715,718,721,724,727,729,732,734],{"class":521,"line":690},8,[519,692,693],{"class":532},"    skip",[519,695,551],{"class":540},[519,697,475],{"class":540},[519,699,701],{"class":700},"sHdIc","ctx",[519,703,704],{"class":540},")",[519,706,708],{"class":707},"spNyl"," =>",[519,710,711],{"class":536}," ctx",[519,713,714],{"class":540},".",[519,716,717],{"class":536},"user",[519,719,720],{"class":540},"?.",[519,722,723],{"class":536},"role ",[519,725,726],{"class":540},"===",[519,728,565],{"class":540},[519,730,731],{"class":568},"admin",[519,733,572],{"class":540},[519,735,575],{"class":540},[519,737,739,742,744],{"class":521,"line":738},9,[519,740,741],{"class":540},"  }",[519,743,704],{"class":536},[519,745,575],{"class":540},[519,747,749,752,754],{"class":521,"line":748},10,[519,750,751],{"class":532},"  createRequestMetadataPlugin",[519,753,537],{"class":536},[519,755,541],{"class":540},[519,757,759,762,764,767,769,772,774,776,778,781,783,786],{"class":521,"line":758},11,[519,760,761],{"class":547},"    autoPopulateOn",[519,763,551],{"class":540},[519,765,766],{"class":536}," [",[519,768,572],{"class":540},[519,770,771],{"class":568},"create",[519,773,572],{"class":540},[519,775,619],{"class":540},[519,777,565],{"class":540},[519,779,780],{"class":568},"update",[519,782,572],{"class":540},[519,784,785],{"class":536},"]",[519,787,575],{"class":540},[519,789,791,794,796,798,800,803,805,807],{"class":521,"line":790},12,[519,792,793],{"class":547},"    resources",[519,795,551],{"class":540},[519,797,766],{"class":536},[519,799,572],{"class":540},[519,801,802],{"class":568},"users",[519,804,572],{"class":540},[519,806,785],{"class":536},[519,808,575],{"class":540},[519,810,812,814,816],{"class":521,"line":811},13,[519,813,741],{"class":540},[519,815,704],{"class":536},[519,817,575],{"class":540},[519,819,821],{"class":521,"line":820},14,[519,822,823],{"class":536},"]\n",[455,825,826],{},"That's it. The module handles initialization, context wiring, and lifecycle automatically.",[502,828,830],{"id":829},"why-a-file-instead-of-inline-config","Why a file instead of inline config?",[455,832,833,834,836],{},"You might wonder why plugins aren't defined inline in ",[477,835,508],{}," like this:",[510,838,840],{"className":512,"code":839,"language":514,"meta":515,"style":515},"// THIS DOES NOT WORK\nimport { createRateLimitPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport default defineNuxtConfig({\n  autoApi: {\n    plugins: [\n      createRateLimitPlugin({ windowMs: 60000, max: 200 })\n    ]\n  }\n})\n",[477,841,842,847,865,869,881,889,897,927,932,937],{"__ignoreMap":515},[519,843,844],{"class":521,"line":522},[519,845,846],{"class":604},"// THIS DOES NOT WORK\n",[519,848,849,851,853,855,857,859,861,863],{"class":521,"line":544},[519,850,610],{"class":525},[519,852,613],{"class":540},[519,854,616],{"class":536},[519,856,625],{"class":540},[519,858,628],{"class":525},[519,860,565],{"class":540},[519,862,633],{"class":568},[519,864,636],{"class":540},[519,866,867],{"class":521,"line":557},[519,868,642],{"emptyLinePlaceholder":641},[519,870,871,873,875,877,879],{"class":521,"line":578},[519,872,526],{"class":525},[519,874,529],{"class":525},[519,876,533],{"class":532},[519,878,537],{"class":536},[519,880,541],{"class":540},[519,882,883,885,887],{"class":521,"line":584},[519,884,548],{"class":547},[519,886,551],{"class":540},[519,888,554],{"class":540},[519,890,891,893,895],{"class":521,"line":663},[519,892,560],{"class":547},[519,894,551],{"class":540},[519,896,651],{"class":536},[519,898,899,902,904,907,910,912,914,916,919,921,923,925],{"class":521,"line":677},[519,900,901],{"class":532},"      createRateLimitPlugin",[519,903,537],{"class":536},[519,905,906],{"class":540},"{",[519,908,909],{"class":547}," windowMs",[519,911,551],{"class":540},[519,913,672],{"class":671},[519,915,619],{"class":540},[519,917,918],{"class":547}," max",[519,920,551],{"class":540},[519,922,685],{"class":671},[519,924,625],{"class":540},[519,926,590],{"class":536},[519,928,929],{"class":521,"line":690},[519,930,931],{"class":536},"    ]\n",[519,933,934],{"class":521,"line":738},[519,935,936],{"class":540},"  }\n",[519,938,939,941],{"class":521,"line":748},[519,940,587],{"class":540},[519,942,590],{"class":536},[455,944,945,946,949],{},"The reason is the ",[472,947,948],{},"serialization boundary"," between build time and runtime.",[455,951,952,954,955,958,959,962,963,966,967,714],{},[477,953,508],{}," runs at build time during Nuxt module setup. The module needs to pass plugin runtime logic to the Nitro server, which runs separately. To bridge this gap, it generates a virtual module (",[477,956,957],{},".nuxt/@websideproject/nuxt-auto-api-plugins.mjs","). The only way to get inline functions into that file is ",[477,960,961],{},"Function.prototype.toString()"," — which captures the function ",[472,964,965],{},"text"," but loses all ",[472,968,969],{},"closure variables",[455,971,972,973,976,977,980,981,984,985,987,988,991,992,995,996,999,1000,1003],{},"For example, ",[477,974,975],{},"createRateLimitPlugin()"," creates an in-memory ",[477,978,979],{},"Map"," and a ",[477,982,983],{},"setInterval"," timer inside the factory. The returned ",[477,986,488],{}," function closes over these variables. When serialized via ",[477,989,990],{},".toString()",", the function text references ",[477,993,994],{},"store"," and ",[477,997,998],{},"cleanupTimer",", but those variables don't exist in the generated file — causing ",[477,1001,1002],{},"store is not defined"," at runtime.",[455,1005,1006],{},"The same problem applies to any callback that uses imports from the calling scope:",[510,1008,1010],{"className":512,"code":1009,"language":514,"meta":515,"style":515},"// THIS ALSO DOES NOT WORK — geoip is a closure variable\nimport { geoip } from 'maxmind'\n\nexport default defineNuxtConfig({\n  autoApi: {\n    plugins: [\n      createRequestMetadataPlugin({\n        extract: async (event) => geoip.lookup(getRequestIP(event))\n        //                        ^^^^^^ lost during serialization\n      })\n    ]\n  }\n})\n",[477,1011,1012,1017,1037,1041,1053,1061,1069,1078,1112,1117,1124,1128,1132],{"__ignoreMap":515},[519,1013,1014],{"class":521,"line":522},[519,1015,1016],{"class":604},"// THIS ALSO DOES NOT WORK — geoip is a closure variable\n",[519,1018,1019,1021,1023,1026,1028,1030,1032,1035],{"class":521,"line":544},[519,1020,610],{"class":525},[519,1022,613],{"class":540},[519,1024,1025],{"class":536}," geoip",[519,1027,625],{"class":540},[519,1029,628],{"class":525},[519,1031,565],{"class":540},[519,1033,1034],{"class":568},"maxmind",[519,1036,636],{"class":540},[519,1038,1039],{"class":521,"line":557},[519,1040,642],{"emptyLinePlaceholder":641},[519,1042,1043,1045,1047,1049,1051],{"class":521,"line":578},[519,1044,526],{"class":525},[519,1046,529],{"class":525},[519,1048,533],{"class":532},[519,1050,537],{"class":536},[519,1052,541],{"class":540},[519,1054,1055,1057,1059],{"class":521,"line":584},[519,1056,548],{"class":547},[519,1058,551],{"class":540},[519,1060,554],{"class":540},[519,1062,1063,1065,1067],{"class":521,"line":663},[519,1064,560],{"class":547},[519,1066,551],{"class":540},[519,1068,651],{"class":536},[519,1070,1071,1074,1076],{"class":521,"line":677},[519,1072,1073],{"class":532},"      createRequestMetadataPlugin",[519,1075,537],{"class":536},[519,1077,541],{"class":540},[519,1079,1080,1083,1085,1088,1090,1093,1095,1097,1099,1101,1104,1106,1109],{"class":521,"line":690},[519,1081,1082],{"class":532},"        extract",[519,1084,551],{"class":540},[519,1086,1087],{"class":707}," async",[519,1089,475],{"class":540},[519,1091,1092],{"class":700},"event",[519,1094,704],{"class":540},[519,1096,708],{"class":707},[519,1098,1025],{"class":536},[519,1100,714],{"class":540},[519,1102,1103],{"class":532},"lookup",[519,1105,537],{"class":536},[519,1107,1108],{"class":532},"getRequestIP",[519,1110,1111],{"class":536},"(event))\n",[519,1113,1114],{"class":521,"line":738},[519,1115,1116],{"class":604},"        //                        ^^^^^^ lost during serialization\n",[519,1118,1119,1122],{"class":521,"line":748},[519,1120,1121],{"class":540},"      }",[519,1123,590],{"class":536},[519,1125,1126],{"class":521,"line":758},[519,1127,931],{"class":536},[519,1129,1130],{"class":521,"line":790},[519,1131,936],{"class":540},[519,1133,1134,1136],{"class":521,"line":811},[519,1135,587],{"class":540},[519,1137,590],{"class":536},[455,1139,1140],{},"A dedicated server file solves this completely. Nitro bundles it as a real module — imports, closures, timers, Maps, and everything else work naturally because the code runs as-is, never serialized.",[459,1142,1144],{"id":1143},"plugin-sources","Plugin Sources",[455,1146,1147],{},"Plugins can come from three sources, all merged at build time:",[502,1149,1151],{"id":1150},"_1-app-level-your-server-file","1. App-level (your server file)",[510,1153,1155],{"className":512,"code":1154,"language":514,"meta":515,"style":515},"// nuxt.config.ts\nautoApi: {\n  plugins: '~/server/autoapi-plugins'\n}\n\n// server/autoapi-plugins.ts\nimport { createRateLimitPlugin } from '@websideproject/nuxt-auto-api/plugins'\nimport { createAuditLogPlugin } from '@websideproject/nuxt-auto-api-audit-log'\n\nexport default [\n  createRateLimitPlugin({ max: 200 }),\n  createAuditLogPlugin({ destination: 'db' }),\n]\n",[477,1156,1157,1162,1172,1185,1190,1194,1198,1216,1236,1240,1248,1268,1295],{"__ignoreMap":515},[519,1158,1159],{"class":521,"line":522},[519,1160,1161],{"class":604},"// nuxt.config.ts\n",[519,1163,1164,1168,1170],{"class":521,"line":544},[519,1165,1167],{"class":1166},"sBMFI","autoApi",[519,1169,551],{"class":540},[519,1171,554],{"class":540},[519,1173,1174,1177,1179,1181,1183],{"class":521,"line":557},[519,1175,1176],{"class":1166},"  plugins",[519,1178,551],{"class":540},[519,1180,565],{"class":540},[519,1182,569],{"class":568},[519,1184,636],{"class":540},[519,1186,1187],{"class":521,"line":578},[519,1188,1189],{"class":540},"}\n",[519,1191,1192],{"class":521,"line":584},[519,1193,642],{"emptyLinePlaceholder":641},[519,1195,1196],{"class":521,"line":663},[519,1197,605],{"class":604},[519,1199,1200,1202,1204,1206,1208,1210,1212,1214],{"class":521,"line":677},[519,1201,610],{"class":525},[519,1203,613],{"class":540},[519,1205,616],{"class":536},[519,1207,625],{"class":540},[519,1209,628],{"class":525},[519,1211,565],{"class":540},[519,1213,633],{"class":568},[519,1215,636],{"class":540},[519,1217,1218,1220,1222,1225,1227,1229,1231,1234],{"class":521,"line":690},[519,1219,610],{"class":525},[519,1221,613],{"class":540},[519,1223,1224],{"class":536}," createAuditLogPlugin",[519,1226,625],{"class":540},[519,1228,628],{"class":525},[519,1230,565],{"class":540},[519,1232,1233],{"class":568},"@websideproject/nuxt-auto-api-audit-log",[519,1235,636],{"class":540},[519,1237,1238],{"class":521,"line":738},[519,1239,642],{"emptyLinePlaceholder":641},[519,1241,1242,1244,1246],{"class":521,"line":748},[519,1243,526],{"class":525},[519,1245,529],{"class":525},[519,1247,651],{"class":536},[519,1249,1250,1252,1254,1256,1258,1260,1262,1264,1266],{"class":521,"line":758},[519,1251,656],{"class":532},[519,1253,537],{"class":536},[519,1255,906],{"class":540},[519,1257,918],{"class":547},[519,1259,551],{"class":540},[519,1261,685],{"class":671},[519,1263,625],{"class":540},[519,1265,704],{"class":536},[519,1267,575],{"class":540},[519,1269,1270,1273,1275,1277,1280,1282,1284,1287,1289,1291,1293],{"class":521,"line":790},[519,1271,1272],{"class":532},"  createAuditLogPlugin",[519,1274,537],{"class":536},[519,1276,906],{"class":540},[519,1278,1279],{"class":547}," destination",[519,1281,551],{"class":540},[519,1283,565],{"class":540},[519,1285,1286],{"class":568},"db",[519,1288,572],{"class":540},[519,1290,625],{"class":540},[519,1292,704],{"class":536},[519,1294,575],{"class":540},[519,1296,1297],{"class":521,"line":811},[519,1298,823],{"class":536},[502,1300,1302],{"id":1301},"_2-community-nuxt-modules-via-hook","2. Community Nuxt modules (via hook)",[455,1304,1305],{},"Community modules can register plugins without the user touching their config:",[510,1307,1309],{"className":512,"code":1308,"language":514,"meta":515,"style":515},"// @websideproject/nuxt-auto-api-audit-log/src/module.ts\nexport default defineNuxtModule({\n  setup(options, nuxt) {\n    const resolver = createResolver(import.meta.url)\n    nuxt.hook('autoApi:registerPlugins', (ctx) => {\n      ctx.addFile(resolver.resolve('./runtime/audit-plugin'))\n    })\n  }\n})\n",[477,1310,1311,1316,1329,1348,1378,1409,1441,1448,1452],{"__ignoreMap":515},[519,1312,1313],{"class":521,"line":522},[519,1314,1315],{"class":604},"// @websideproject/nuxt-auto-api-audit-log/src/module.ts\n",[519,1317,1318,1320,1322,1325,1327],{"class":521,"line":544},[519,1319,526],{"class":525},[519,1321,529],{"class":525},[519,1323,1324],{"class":532}," defineNuxtModule",[519,1326,537],{"class":536},[519,1328,541],{"class":540},[519,1330,1331,1334,1336,1339,1341,1344,1346],{"class":521,"line":557},[519,1332,1333],{"class":547},"  setup",[519,1335,537],{"class":540},[519,1337,1338],{"class":700},"options",[519,1340,619],{"class":540},[519,1342,1343],{"class":700}," nuxt",[519,1345,704],{"class":540},[519,1347,554],{"class":540},[519,1349,1350,1353,1356,1359,1362,1364,1366,1368,1371,1373,1376],{"class":521,"line":578},[519,1351,1352],{"class":707},"    const",[519,1354,1355],{"class":536}," resolver",[519,1357,1358],{"class":540}," =",[519,1360,1361],{"class":532}," createResolver",[519,1363,537],{"class":547},[519,1365,610],{"class":525},[519,1367,714],{"class":540},[519,1369,1370],{"class":536},"meta",[519,1372,714],{"class":540},[519,1374,1375],{"class":536},"url",[519,1377,590],{"class":547},[519,1379,1380,1383,1385,1388,1390,1392,1395,1397,1399,1401,1403,1405,1407],{"class":521,"line":584},[519,1381,1382],{"class":536},"    nuxt",[519,1384,714],{"class":540},[519,1386,1387],{"class":532},"hook",[519,1389,537],{"class":547},[519,1391,572],{"class":540},[519,1393,1394],{"class":568},"autoApi:registerPlugins",[519,1396,572],{"class":540},[519,1398,619],{"class":540},[519,1400,475],{"class":540},[519,1402,701],{"class":700},[519,1404,704],{"class":540},[519,1406,708],{"class":707},[519,1408,554],{"class":540},[519,1410,1411,1414,1416,1419,1421,1424,1426,1429,1431,1433,1436,1438],{"class":521,"line":663},[519,1412,1413],{"class":536},"      ctx",[519,1415,714],{"class":540},[519,1417,1418],{"class":532},"addFile",[519,1420,537],{"class":547},[519,1422,1423],{"class":536},"resolver",[519,1425,714],{"class":540},[519,1427,1428],{"class":532},"resolve",[519,1430,537],{"class":547},[519,1432,572],{"class":540},[519,1434,1435],{"class":568},"./runtime/audit-plugin",[519,1437,572],{"class":540},[519,1439,1440],{"class":547},"))\n",[519,1442,1443,1446],{"class":521,"line":677},[519,1444,1445],{"class":540},"    }",[519,1447,590],{"class":547},[519,1449,1450],{"class":521,"line":690},[519,1451,936],{"class":540},[519,1453,1454,1456],{"class":521,"line":738},[519,1455,587],{"class":540},[519,1457,590],{"class":536},[455,1459,1460,1461,1464],{},"The file must default-export a single ",[477,1462,1463],{},"AutoApiPlugin"," or an array of them:",[510,1466,1468],{"className":512,"code":1467,"language":514,"meta":515,"style":515},"// @websideproject/nuxt-auto-api-audit-log/src/runtime/audit-plugin.ts\nimport { defineAutoApiPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport default defineAutoApiPlugin({\n  name: 'audit-log',\n  runtimeSetup(ctx) {\n    ctx.addMiddleware({\n      name: 'audit-log',\n      stage: 'post-execute',\n      handler: async (context) => { /* ... */ },\n    })\n  },\n})\n",[477,1469,1470,1475,1494,1498,1510,1526,1539,1553,1568,1584,1610,1616,1620],{"__ignoreMap":515},[519,1471,1472],{"class":521,"line":522},[519,1473,1474],{"class":604},"// @websideproject/nuxt-auto-api-audit-log/src/runtime/audit-plugin.ts\n",[519,1476,1477,1479,1481,1484,1486,1488,1490,1492],{"class":521,"line":544},[519,1478,610],{"class":525},[519,1480,613],{"class":540},[519,1482,1483],{"class":536}," defineAutoApiPlugin",[519,1485,625],{"class":540},[519,1487,628],{"class":525},[519,1489,565],{"class":540},[519,1491,633],{"class":568},[519,1493,636],{"class":540},[519,1495,1496],{"class":521,"line":557},[519,1497,642],{"emptyLinePlaceholder":641},[519,1499,1500,1502,1504,1506,1508],{"class":521,"line":578},[519,1501,526],{"class":525},[519,1503,529],{"class":525},[519,1505,1483],{"class":532},[519,1507,537],{"class":536},[519,1509,541],{"class":540},[519,1511,1512,1515,1517,1519,1522,1524],{"class":521,"line":584},[519,1513,1514],{"class":547},"  name",[519,1516,551],{"class":540},[519,1518,565],{"class":540},[519,1520,1521],{"class":568},"audit-log",[519,1523,572],{"class":540},[519,1525,575],{"class":540},[519,1527,1528,1531,1533,1535,1537],{"class":521,"line":663},[519,1529,1530],{"class":547},"  runtimeSetup",[519,1532,537],{"class":540},[519,1534,701],{"class":700},[519,1536,704],{"class":540},[519,1538,554],{"class":540},[519,1540,1541,1544,1546,1549,1551],{"class":521,"line":677},[519,1542,1543],{"class":536},"    ctx",[519,1545,714],{"class":540},[519,1547,1548],{"class":532},"addMiddleware",[519,1550,537],{"class":547},[519,1552,541],{"class":540},[519,1554,1555,1558,1560,1562,1564,1566],{"class":521,"line":690},[519,1556,1557],{"class":547},"      name",[519,1559,551],{"class":540},[519,1561,565],{"class":540},[519,1563,1521],{"class":568},[519,1565,572],{"class":540},[519,1567,575],{"class":540},[519,1569,1570,1573,1575,1577,1580,1582],{"class":521,"line":738},[519,1571,1572],{"class":547},"      stage",[519,1574,551],{"class":540},[519,1576,565],{"class":540},[519,1578,1579],{"class":568},"post-execute",[519,1581,572],{"class":540},[519,1583,575],{"class":540},[519,1585,1586,1589,1591,1593,1595,1598,1600,1602,1604,1607],{"class":521,"line":748},[519,1587,1588],{"class":532},"      handler",[519,1590,551],{"class":540},[519,1592,1087],{"class":707},[519,1594,475],{"class":540},[519,1596,1597],{"class":700},"context",[519,1599,704],{"class":540},[519,1601,708],{"class":707},[519,1603,613],{"class":540},[519,1605,1606],{"class":604}," /* ... */",[519,1608,1609],{"class":540}," },\n",[519,1611,1612,1614],{"class":521,"line":758},[519,1613,1445],{"class":540},[519,1615,590],{"class":547},[519,1617,1618],{"class":521,"line":790},[519,1619,581],{"class":540},[519,1621,1622,1624],{"class":521,"line":811},[519,1623,587],{"class":540},[519,1625,590],{"class":536},[502,1627,1629],{"id":1628},"_3-built-in-plugins-shipped-with-websideprojectnuxt-auto-api","3. Built-in plugins (shipped with @websideproject/nuxt-auto-api)",[455,1631,1632,1633,1635],{},"These are imported from ",[477,1634,633],{}," and used in your server file like any other plugin.",[459,1637,1639],{"id":1638},"creating-a-plugin","Creating a Plugin",[502,1641,1643],{"id":1642},"using-a-factory-function-recommended-for-configurable-plugins","Using a factory function (recommended for configurable plugins)",[510,1645,1647],{"className":512,"code":1646,"language":514,"meta":515,"style":515},"import { defineAutoApiPlugin } from '@websideproject/nuxt-auto-api/plugins'\nimport type { AutoApiPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport interface MyPluginOptions {\n  threshold?: number\n}\n\nexport function createMyPlugin(options: MyPluginOptions = {}): AutoApiPlugin {\n  const { threshold = 100 } = options\n\n  return defineAutoApiPlugin({\n    name: 'my-plugin',\n    version: '1.0.0',\n\n    runtimeSetup(ctx) {\n      ctx.addMiddleware({\n        name: 'my-middleware',\n        stage: 'pre-auth',\n        handler: async (context) => {\n          // `threshold` is available here — closure works!\n          console.log(`Threshold: ${threshold}`)\n        },\n      })\n    },\n  })\n}\n",[477,1648,1649,1667,1689,1693,1705,1716,1720,1724,1751,1773,1777,1788,1804,1820,1824,1838,1851,1868,1885,1905,1911,1941,1947,1954,1960,1967],{"__ignoreMap":515},[519,1650,1651,1653,1655,1657,1659,1661,1663,1665],{"class":521,"line":522},[519,1652,610],{"class":525},[519,1654,613],{"class":540},[519,1656,1483],{"class":536},[519,1658,625],{"class":540},[519,1660,628],{"class":525},[519,1662,565],{"class":540},[519,1664,633],{"class":568},[519,1666,636],{"class":540},[519,1668,1669,1671,1674,1676,1679,1681,1683,1685,1687],{"class":521,"line":544},[519,1670,610],{"class":525},[519,1672,1673],{"class":525}," type",[519,1675,613],{"class":540},[519,1677,1678],{"class":536}," AutoApiPlugin",[519,1680,625],{"class":540},[519,1682,628],{"class":525},[519,1684,565],{"class":540},[519,1686,633],{"class":568},[519,1688,636],{"class":540},[519,1690,1691],{"class":521,"line":557},[519,1692,642],{"emptyLinePlaceholder":641},[519,1694,1695,1697,1700,1703],{"class":521,"line":578},[519,1696,526],{"class":525},[519,1698,1699],{"class":707}," interface",[519,1701,1702],{"class":1166}," MyPluginOptions",[519,1704,554],{"class":540},[519,1706,1707,1710,1713],{"class":521,"line":584},[519,1708,1709],{"class":547},"  threshold",[519,1711,1712],{"class":540},"?:",[519,1714,1715],{"class":1166}," number\n",[519,1717,1718],{"class":521,"line":663},[519,1719,1189],{"class":540},[519,1721,1722],{"class":521,"line":677},[519,1723,642],{"emptyLinePlaceholder":641},[519,1725,1726,1728,1731,1734,1736,1738,1740,1742,1744,1747,1749],{"class":521,"line":690},[519,1727,526],{"class":525},[519,1729,1730],{"class":707}," function",[519,1732,1733],{"class":532}," createMyPlugin",[519,1735,537],{"class":540},[519,1737,1338],{"class":700},[519,1739,551],{"class":540},[519,1741,1702],{"class":1166},[519,1743,1358],{"class":540},[519,1745,1746],{"class":540}," {}):",[519,1748,1678],{"class":1166},[519,1750,554],{"class":540},[519,1752,1753,1756,1758,1761,1763,1766,1768,1770],{"class":521,"line":738},[519,1754,1755],{"class":707},"  const",[519,1757,613],{"class":540},[519,1759,1760],{"class":536}," threshold",[519,1762,1358],{"class":540},[519,1764,1765],{"class":671}," 100",[519,1767,625],{"class":540},[519,1769,1358],{"class":540},[519,1771,1772],{"class":536}," options\n",[519,1774,1775],{"class":521,"line":748},[519,1776,642],{"emptyLinePlaceholder":641},[519,1778,1779,1782,1784,1786],{"class":521,"line":758},[519,1780,1781],{"class":525},"  return",[519,1783,1483],{"class":532},[519,1785,537],{"class":547},[519,1787,541],{"class":540},[519,1789,1790,1793,1795,1797,1800,1802],{"class":521,"line":790},[519,1791,1792],{"class":547},"    name",[519,1794,551],{"class":540},[519,1796,565],{"class":540},[519,1798,1799],{"class":568},"my-plugin",[519,1801,572],{"class":540},[519,1803,575],{"class":540},[519,1805,1806,1809,1811,1813,1816,1818],{"class":521,"line":811},[519,1807,1808],{"class":547},"    version",[519,1810,551],{"class":540},[519,1812,565],{"class":540},[519,1814,1815],{"class":568},"1.0.0",[519,1817,572],{"class":540},[519,1819,575],{"class":540},[519,1821,1822],{"class":521,"line":820},[519,1823,642],{"emptyLinePlaceholder":641},[519,1825,1827,1830,1832,1834,1836],{"class":521,"line":1826},15,[519,1828,1829],{"class":547},"    runtimeSetup",[519,1831,537],{"class":540},[519,1833,701],{"class":700},[519,1835,704],{"class":540},[519,1837,554],{"class":540},[519,1839,1841,1843,1845,1847,1849],{"class":521,"line":1840},16,[519,1842,1413],{"class":536},[519,1844,714],{"class":540},[519,1846,1548],{"class":532},[519,1848,537],{"class":547},[519,1850,541],{"class":540},[519,1852,1854,1857,1859,1861,1864,1866],{"class":521,"line":1853},17,[519,1855,1856],{"class":547},"        name",[519,1858,551],{"class":540},[519,1860,565],{"class":540},[519,1862,1863],{"class":568},"my-middleware",[519,1865,572],{"class":540},[519,1867,575],{"class":540},[519,1869,1871,1874,1876,1878,1881,1883],{"class":521,"line":1870},18,[519,1872,1873],{"class":547},"        stage",[519,1875,551],{"class":540},[519,1877,565],{"class":540},[519,1879,1880],{"class":568},"pre-auth",[519,1882,572],{"class":540},[519,1884,575],{"class":540},[519,1886,1888,1891,1893,1895,1897,1899,1901,1903],{"class":521,"line":1887},19,[519,1889,1890],{"class":532},"        handler",[519,1892,551],{"class":540},[519,1894,1087],{"class":707},[519,1896,475],{"class":540},[519,1898,1597],{"class":700},[519,1900,704],{"class":540},[519,1902,708],{"class":707},[519,1904,554],{"class":540},[519,1906,1908],{"class":521,"line":1907},20,[519,1909,1910],{"class":604},"          // `threshold` is available here — closure works!\n",[519,1912,1914,1917,1919,1922,1924,1927,1930,1933,1936,1939],{"class":521,"line":1913},21,[519,1915,1916],{"class":536},"          console",[519,1918,714],{"class":540},[519,1920,1921],{"class":532},"log",[519,1923,537],{"class":547},[519,1925,1926],{"class":540},"`",[519,1928,1929],{"class":568},"Threshold: ",[519,1931,1932],{"class":540},"${",[519,1934,1935],{"class":536},"threshold",[519,1937,1938],{"class":540},"}`",[519,1940,590],{"class":547},[519,1942,1944],{"class":521,"line":1943},22,[519,1945,1946],{"class":540},"        },\n",[519,1948,1950,1952],{"class":521,"line":1949},23,[519,1951,1121],{"class":540},[519,1953,590],{"class":547},[519,1955,1957],{"class":521,"line":1956},24,[519,1958,1959],{"class":540},"    },\n",[519,1961,1963,1965],{"class":521,"line":1962},25,[519,1964,741],{"class":540},[519,1966,590],{"class":547},[519,1968,1970],{"class":521,"line":1969},26,[519,1971,1189],{"class":540},[502,1973,1975],{"id":1974},"using-defineautoapiplugin-directly-for-simple-plugins","Using defineAutoApiPlugin directly (for simple plugins)",[510,1977,1979],{"className":512,"code":1978,"language":514,"meta":515,"style":515},"import { defineAutoApiPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport default defineAutoApiPlugin({\n  name: 'simple-plugin',\n\n  runtimeSetup(ctx) {\n    ctx.extendContext(async (context) => {\n      context.customData = { fromPlugin: true }\n    })\n\n    ctx.addHook('users', {\n      afterCreate: async (result) => {\n        console.log('User created:', result.id)\n      },\n    })\n\n    ctx.addGlobalHook({\n      afterUpdate: async (result, context) => {\n        console.log(`${context.resource} updated`)\n      },\n    })\n  },\n})\n",[477,1980,1981,1999,2003,2015,2030,2034,2046,2070,2096,2102,2106,2127,2147,2177,2182,2188,2192,2205,2229,2258,2262,2268,2272],{"__ignoreMap":515},[519,1982,1983,1985,1987,1989,1991,1993,1995,1997],{"class":521,"line":522},[519,1984,610],{"class":525},[519,1986,613],{"class":540},[519,1988,1483],{"class":536},[519,1990,625],{"class":540},[519,1992,628],{"class":525},[519,1994,565],{"class":540},[519,1996,633],{"class":568},[519,1998,636],{"class":540},[519,2000,2001],{"class":521,"line":544},[519,2002,642],{"emptyLinePlaceholder":641},[519,2004,2005,2007,2009,2011,2013],{"class":521,"line":557},[519,2006,526],{"class":525},[519,2008,529],{"class":525},[519,2010,1483],{"class":532},[519,2012,537],{"class":536},[519,2014,541],{"class":540},[519,2016,2017,2019,2021,2023,2026,2028],{"class":521,"line":578},[519,2018,1514],{"class":547},[519,2020,551],{"class":540},[519,2022,565],{"class":540},[519,2024,2025],{"class":568},"simple-plugin",[519,2027,572],{"class":540},[519,2029,575],{"class":540},[519,2031,2032],{"class":521,"line":584},[519,2033,642],{"emptyLinePlaceholder":641},[519,2035,2036,2038,2040,2042,2044],{"class":521,"line":663},[519,2037,1530],{"class":547},[519,2039,537],{"class":540},[519,2041,701],{"class":700},[519,2043,704],{"class":540},[519,2045,554],{"class":540},[519,2047,2048,2050,2052,2055,2057,2060,2062,2064,2066,2068],{"class":521,"line":677},[519,2049,1543],{"class":536},[519,2051,714],{"class":540},[519,2053,2054],{"class":532},"extendContext",[519,2056,537],{"class":547},[519,2058,2059],{"class":707},"async",[519,2061,475],{"class":540},[519,2063,1597],{"class":700},[519,2065,704],{"class":540},[519,2067,708],{"class":707},[519,2069,554],{"class":540},[519,2071,2072,2075,2077,2080,2082,2084,2087,2089,2093],{"class":521,"line":690},[519,2073,2074],{"class":536},"      context",[519,2076,714],{"class":540},[519,2078,2079],{"class":536},"customData",[519,2081,1358],{"class":540},[519,2083,613],{"class":540},[519,2085,2086],{"class":547}," fromPlugin",[519,2088,551],{"class":540},[519,2090,2092],{"class":2091},"sfNiH"," true",[519,2094,2095],{"class":540}," }\n",[519,2097,2098,2100],{"class":521,"line":738},[519,2099,1445],{"class":540},[519,2101,590],{"class":547},[519,2103,2104],{"class":521,"line":748},[519,2105,642],{"emptyLinePlaceholder":641},[519,2107,2108,2110,2112,2115,2117,2119,2121,2123,2125],{"class":521,"line":758},[519,2109,1543],{"class":536},[519,2111,714],{"class":540},[519,2113,2114],{"class":532},"addHook",[519,2116,537],{"class":547},[519,2118,572],{"class":540},[519,2120,802],{"class":568},[519,2122,572],{"class":540},[519,2124,619],{"class":540},[519,2126,554],{"class":540},[519,2128,2129,2132,2134,2136,2138,2141,2143,2145],{"class":521,"line":790},[519,2130,2131],{"class":532},"      afterCreate",[519,2133,551],{"class":540},[519,2135,1087],{"class":707},[519,2137,475],{"class":540},[519,2139,2140],{"class":700},"result",[519,2142,704],{"class":540},[519,2144,708],{"class":707},[519,2146,554],{"class":540},[519,2148,2149,2152,2154,2156,2158,2160,2163,2165,2167,2170,2172,2175],{"class":521,"line":811},[519,2150,2151],{"class":536},"        console",[519,2153,714],{"class":540},[519,2155,1921],{"class":532},[519,2157,537],{"class":547},[519,2159,572],{"class":540},[519,2161,2162],{"class":568},"User created:",[519,2164,572],{"class":540},[519,2166,619],{"class":540},[519,2168,2169],{"class":536}," result",[519,2171,714],{"class":540},[519,2173,2174],{"class":536},"id",[519,2176,590],{"class":547},[519,2178,2179],{"class":521,"line":820},[519,2180,2181],{"class":540},"      },\n",[519,2183,2184,2186],{"class":521,"line":1826},[519,2185,1445],{"class":540},[519,2187,590],{"class":547},[519,2189,2190],{"class":521,"line":1840},[519,2191,642],{"emptyLinePlaceholder":641},[519,2193,2194,2196,2198,2201,2203],{"class":521,"line":1853},[519,2195,1543],{"class":536},[519,2197,714],{"class":540},[519,2199,2200],{"class":532},"addGlobalHook",[519,2202,537],{"class":547},[519,2204,541],{"class":540},[519,2206,2207,2210,2212,2214,2216,2218,2220,2223,2225,2227],{"class":521,"line":1870},[519,2208,2209],{"class":532},"      afterUpdate",[519,2211,551],{"class":540},[519,2213,1087],{"class":707},[519,2215,475],{"class":540},[519,2217,2140],{"class":700},[519,2219,619],{"class":540},[519,2221,2222],{"class":700}," context",[519,2224,704],{"class":540},[519,2226,708],{"class":707},[519,2228,554],{"class":540},[519,2230,2231,2233,2235,2237,2239,2242,2244,2246,2249,2251,2254,2256],{"class":521,"line":1887},[519,2232,2151],{"class":536},[519,2234,714],{"class":540},[519,2236,1921],{"class":532},[519,2238,537],{"class":547},[519,2240,2241],{"class":540},"`${",[519,2243,1597],{"class":536},[519,2245,714],{"class":540},[519,2247,2248],{"class":536},"resource",[519,2250,587],{"class":540},[519,2252,2253],{"class":568}," updated",[519,2255,1926],{"class":540},[519,2257,590],{"class":547},[519,2259,2260],{"class":521,"line":1907},[519,2261,2181],{"class":540},[519,2263,2264,2266],{"class":521,"line":1913},[519,2265,1445],{"class":540},[519,2267,590],{"class":547},[519,2269,2270],{"class":521,"line":1943},[519,2271,581],{"class":540},[519,2273,2274,2276],{"class":521,"line":1949},[519,2275,587],{"class":540},[519,2277,590],{"class":536},[459,2279,2281],{"id":2280},"middleware-stages","Middleware Stages",[455,2283,2284],{},"Plugins can register middleware at four stages of the request pipeline:",[510,2286,2290],{"className":2287,"code":2289,"language":965},[2288],"language-text","pre-auth → authorize → post-auth → validate → pre-execute → handler → post-execute\n",[477,2291,2289],{"__ignoreMap":515},[2293,2294,2295,2311],"table",{},[2296,2297,2298],"thead",{},[2299,2300,2301,2305,2308],"tr",{},[2302,2303,2304],"th",{},"Stage",[2302,2306,2307],{},"When it runs",[2302,2309,2310],{},"Use case",[2312,2313,2314,2327,2340,2353],"tbody",{},[2299,2315,2316,2321,2324],{},[2317,2318,2319],"td",{},[477,2320,1880],{},[2317,2322,2323],{},"Before authorization",[2317,2325,2326],{},"Rate limiting, request logging, IP filtering",[2299,2328,2329,2334,2337],{},[2317,2330,2331],{},[477,2332,2333],{},"post-auth",[2317,2335,2336],{},"After authorization, before validation",[2317,2338,2339],{},"Tenant injection, audit logging",[2299,2341,2342,2347,2350],{},[2317,2343,2344],{},[477,2345,2346],{},"pre-execute",[2317,2348,2349],{},"After validation, before the handler",[2317,2351,2352],{},"Cache checks, request enrichment",[2299,2354,2355,2359,2362],{},[2317,2356,2357],{},[477,2358,1579],{},[2317,2360,2361],{},"After the handler returns",[2317,2363,2364],{},"Response logging, cache population",[502,2366,2368],{"id":2367},"middleware-options","Middleware Options",[510,2370,2372],{"className":512,"code":2371,"language":514,"meta":515,"style":515},"ctx.addMiddleware({\n  name: 'audit-log',\n  stage: 'post-execute',\n  order: 10,                          // Lower runs first (default: 0)\n  resources: ['users', 'posts'],      // Only these resources (default: all)\n  operations: ['create', 'update'],   // Only these operations (default: all)\n  handler: async (context) => {\n    await logAuditEntry(context)\n  },\n})\n",[477,2373,2374,2386,2400,2415,2430,2461,2491,2510,2524,2528],{"__ignoreMap":515},[519,2375,2376,2378,2380,2382,2384],{"class":521,"line":522},[519,2377,701],{"class":536},[519,2379,714],{"class":540},[519,2381,1548],{"class":532},[519,2383,537],{"class":536},[519,2385,541],{"class":540},[519,2387,2388,2390,2392,2394,2396,2398],{"class":521,"line":544},[519,2389,1514],{"class":547},[519,2391,551],{"class":540},[519,2393,565],{"class":540},[519,2395,1521],{"class":568},[519,2397,572],{"class":540},[519,2399,575],{"class":540},[519,2401,2402,2405,2407,2409,2411,2413],{"class":521,"line":557},[519,2403,2404],{"class":547},"  stage",[519,2406,551],{"class":540},[519,2408,565],{"class":540},[519,2410,1579],{"class":568},[519,2412,572],{"class":540},[519,2414,575],{"class":540},[519,2416,2417,2420,2422,2425,2427],{"class":521,"line":578},[519,2418,2419],{"class":547},"  order",[519,2421,551],{"class":540},[519,2423,2424],{"class":671}," 10",[519,2426,619],{"class":540},[519,2428,2429],{"class":604},"                          // Lower runs first (default: 0)\n",[519,2431,2432,2435,2437,2439,2441,2443,2445,2447,2449,2452,2454,2456,2458],{"class":521,"line":584},[519,2433,2434],{"class":547},"  resources",[519,2436,551],{"class":540},[519,2438,766],{"class":536},[519,2440,572],{"class":540},[519,2442,802],{"class":568},[519,2444,572],{"class":540},[519,2446,619],{"class":540},[519,2448,565],{"class":540},[519,2450,2451],{"class":568},"posts",[519,2453,572],{"class":540},[519,2455,785],{"class":536},[519,2457,619],{"class":540},[519,2459,2460],{"class":604},"      // Only these resources (default: all)\n",[519,2462,2463,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488],{"class":521,"line":663},[519,2464,2465],{"class":547},"  operations",[519,2467,551],{"class":540},[519,2469,766],{"class":536},[519,2471,572],{"class":540},[519,2473,771],{"class":568},[519,2475,572],{"class":540},[519,2477,619],{"class":540},[519,2479,565],{"class":540},[519,2481,780],{"class":568},[519,2483,572],{"class":540},[519,2485,785],{"class":536},[519,2487,619],{"class":540},[519,2489,2490],{"class":604},"   // Only these operations (default: all)\n",[519,2492,2493,2496,2498,2500,2502,2504,2506,2508],{"class":521,"line":677},[519,2494,2495],{"class":532},"  handler",[519,2497,551],{"class":540},[519,2499,1087],{"class":707},[519,2501,475],{"class":540},[519,2503,1597],{"class":700},[519,2505,704],{"class":540},[519,2507,708],{"class":707},[519,2509,554],{"class":540},[519,2511,2512,2515,2518,2520,2522],{"class":521,"line":690},[519,2513,2514],{"class":525},"    await",[519,2516,2517],{"class":532}," logAuditEntry",[519,2519,537],{"class":547},[519,2521,1597],{"class":536},[519,2523,590],{"class":547},[519,2525,2526],{"class":521,"line":738},[519,2527,581],{"class":540},[519,2529,2530,2532],{"class":521,"line":748},[519,2531,587],{"class":540},[519,2533,590],{"class":536},[459,2535,2537],{"id":2536},"context-extenders","Context Extenders",[455,2539,2540,2541,2544],{},"Context extenders run on every request after the initial context is built, before any middleware. They enrich the ",[477,2542,2543],{},"HandlerContext"," with additional data.",[510,2546,2548],{"className":512,"code":2547,"language":514,"meta":515,"style":515},"ctx.extendContext(async (context) => {\n  if (context.user) {\n    context.tenant = {\n      id: context.user.tenantId,\n      field: 'tenantId',\n      canAccessAllTenants: context.user.role === 'super-admin',\n    }\n  }\n})\n",[477,2549,2550,2572,2590,2604,2624,2639,2669,2674,2678],{"__ignoreMap":515},[519,2551,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570],{"class":521,"line":522},[519,2553,701],{"class":536},[519,2555,714],{"class":540},[519,2557,2054],{"class":532},[519,2559,537],{"class":536},[519,2561,2059],{"class":707},[519,2563,475],{"class":540},[519,2565,1597],{"class":700},[519,2567,704],{"class":540},[519,2569,708],{"class":707},[519,2571,554],{"class":540},[519,2573,2574,2577,2579,2581,2583,2585,2588],{"class":521,"line":544},[519,2575,2576],{"class":525},"  if",[519,2578,475],{"class":547},[519,2580,1597],{"class":536},[519,2582,714],{"class":540},[519,2584,717],{"class":536},[519,2586,2587],{"class":547},") ",[519,2589,541],{"class":540},[519,2591,2592,2595,2597,2600,2602],{"class":521,"line":557},[519,2593,2594],{"class":536},"    context",[519,2596,714],{"class":540},[519,2598,2599],{"class":536},"tenant",[519,2601,1358],{"class":540},[519,2603,554],{"class":540},[519,2605,2606,2609,2611,2613,2615,2617,2619,2622],{"class":521,"line":578},[519,2607,2608],{"class":547},"      id",[519,2610,551],{"class":540},[519,2612,2222],{"class":536},[519,2614,714],{"class":540},[519,2616,717],{"class":536},[519,2618,714],{"class":540},[519,2620,2621],{"class":536},"tenantId",[519,2623,575],{"class":540},[519,2625,2626,2629,2631,2633,2635,2637],{"class":521,"line":584},[519,2627,2628],{"class":547},"      field",[519,2630,551],{"class":540},[519,2632,565],{"class":540},[519,2634,2621],{"class":568},[519,2636,572],{"class":540},[519,2638,575],{"class":540},[519,2640,2641,2644,2646,2648,2650,2652,2654,2657,2660,2662,2665,2667],{"class":521,"line":663},[519,2642,2643],{"class":547},"      canAccessAllTenants",[519,2645,551],{"class":540},[519,2647,2222],{"class":536},[519,2649,714],{"class":540},[519,2651,717],{"class":536},[519,2653,714],{"class":540},[519,2655,2656],{"class":536},"role",[519,2658,2659],{"class":540}," ===",[519,2661,565],{"class":540},[519,2663,2664],{"class":568},"super-admin",[519,2666,572],{"class":540},[519,2668,575],{"class":540},[519,2670,2671],{"class":521,"line":677},[519,2672,2673],{"class":540},"    }\n",[519,2675,2676],{"class":521,"line":690},[519,2677,936],{"class":540},[519,2679,2680,2682],{"class":521,"line":738},[519,2681,587],{"class":540},[519,2683,590],{"class":536},[459,2685,2687],{"id":2686},"build-time-context","Build-Time Context",[455,2689,2690,2691,2693,2694,2697],{},"The ",[477,2692,479],{}," function receives a ",[477,2695,2696],{},"PluginBuildContext"," with access to Nuxt Kit utilities:",[510,2699,2701],{"className":512,"code":2700,"language":514,"meta":515,"style":515},"interface PluginBuildContext {\n  addServerHandler: typeof addServerHandler\n  addServerImportsDir: typeof addServerImportsDir\n  addImportsDir: typeof addImportsDir\n  addServerPlugin: (path: string) => void\n  addPlugin: typeof addPlugin\n  addTemplate: typeof addTemplate\n  options: AutoApiOptions  // Mutable - plugins can modify options\n  nuxt: Nuxt\n  resolver: ReturnType\u003Ctypeof createResolver>\n  logger: { info, warn, error, debug }\n}\n",[477,2702,2703,2713,2726,2738,2750,2774,2786,2798,2811,2821,2839,2868],{"__ignoreMap":515},[519,2704,2705,2708,2711],{"class":521,"line":522},[519,2706,2707],{"class":707},"interface",[519,2709,2710],{"class":1166}," PluginBuildContext",[519,2712,554],{"class":540},[519,2714,2715,2718,2720,2723],{"class":521,"line":544},[519,2716,2717],{"class":547},"  addServerHandler",[519,2719,551],{"class":540},[519,2721,2722],{"class":540}," typeof",[519,2724,2725],{"class":536}," addServerHandler\n",[519,2727,2728,2731,2733,2735],{"class":521,"line":557},[519,2729,2730],{"class":547},"  addServerImportsDir",[519,2732,551],{"class":540},[519,2734,2722],{"class":540},[519,2736,2737],{"class":536}," addServerImportsDir\n",[519,2739,2740,2743,2745,2747],{"class":521,"line":578},[519,2741,2742],{"class":547},"  addImportsDir",[519,2744,551],{"class":540},[519,2746,2722],{"class":540},[519,2748,2749],{"class":536}," addImportsDir\n",[519,2751,2752,2755,2757,2759,2762,2764,2767,2769,2771],{"class":521,"line":584},[519,2753,2754],{"class":547},"  addServerPlugin",[519,2756,551],{"class":540},[519,2758,475],{"class":540},[519,2760,2761],{"class":700},"path",[519,2763,551],{"class":540},[519,2765,2766],{"class":1166}," string",[519,2768,704],{"class":540},[519,2770,708],{"class":707},[519,2772,2773],{"class":1166}," void\n",[519,2775,2776,2779,2781,2783],{"class":521,"line":663},[519,2777,2778],{"class":547},"  addPlugin",[519,2780,551],{"class":540},[519,2782,2722],{"class":540},[519,2784,2785],{"class":536}," addPlugin\n",[519,2787,2788,2791,2793,2795],{"class":521,"line":677},[519,2789,2790],{"class":547},"  addTemplate",[519,2792,551],{"class":540},[519,2794,2722],{"class":540},[519,2796,2797],{"class":536}," addTemplate\n",[519,2799,2800,2803,2805,2808],{"class":521,"line":690},[519,2801,2802],{"class":547},"  options",[519,2804,551],{"class":540},[519,2806,2807],{"class":1166}," AutoApiOptions",[519,2809,2810],{"class":604},"  // Mutable - plugins can modify options\n",[519,2812,2813,2816,2818],{"class":521,"line":738},[519,2814,2815],{"class":547},"  nuxt",[519,2817,551],{"class":540},[519,2819,2820],{"class":1166}," Nuxt\n",[519,2822,2823,2826,2828,2831,2834,2836],{"class":521,"line":748},[519,2824,2825],{"class":547},"  resolver",[519,2827,551],{"class":540},[519,2829,2830],{"class":1166}," ReturnType",[519,2832,2833],{"class":540},"\u003Ctypeof",[519,2835,1361],{"class":536},[519,2837,2838],{"class":540},">\n",[519,2840,2841,2844,2846,2848,2851,2853,2856,2858,2861,2863,2866],{"class":521,"line":758},[519,2842,2843],{"class":547},"  logger",[519,2845,551],{"class":540},[519,2847,613],{"class":540},[519,2849,2850],{"class":547}," info",[519,2852,619],{"class":540},[519,2854,2855],{"class":547}," warn",[519,2857,619],{"class":540},[519,2859,2860],{"class":547}," error",[519,2862,619],{"class":540},[519,2864,2865],{"class":547}," debug",[519,2867,2095],{"class":540},[519,2869,2870],{"class":521,"line":790},[519,2871,1189],{"class":540},[459,2873,2875],{"id":2874},"runtime-context","Runtime Context",[455,2877,2690,2878,2693,2880,551],{},[477,2879,488],{},[477,2881,2882],{},"PluginRuntimeContext",[510,2884,2886],{"className":512,"code":2885,"language":514,"meta":515,"style":515},"interface PluginRuntimeContext {\n  addMiddleware: (middleware: AutoApiMiddleware) => void\n  extendContext: (fn: ContextExtender) => void\n  addHook: (resource: string, hooks: ResourceHooks) => void\n  addGlobalHook: (hooks: ResourceHooks) => void\n  runtimeConfig: any\n  logger: { info, warn, error, debug }\n}\n",[477,2887,2888,2897,2920,2943,2974,2996,3006,3030],{"__ignoreMap":515},[519,2889,2890,2892,2895],{"class":521,"line":522},[519,2891,2707],{"class":707},[519,2893,2894],{"class":1166}," PluginRuntimeContext",[519,2896,554],{"class":540},[519,2898,2899,2902,2904,2906,2909,2911,2914,2916,2918],{"class":521,"line":544},[519,2900,2901],{"class":547},"  addMiddleware",[519,2903,551],{"class":540},[519,2905,475],{"class":540},[519,2907,2908],{"class":700},"middleware",[519,2910,551],{"class":540},[519,2912,2913],{"class":1166}," AutoApiMiddleware",[519,2915,704],{"class":540},[519,2917,708],{"class":707},[519,2919,2773],{"class":1166},[519,2921,2922,2925,2927,2929,2932,2934,2937,2939,2941],{"class":521,"line":557},[519,2923,2924],{"class":547},"  extendContext",[519,2926,551],{"class":540},[519,2928,475],{"class":540},[519,2930,2931],{"class":700},"fn",[519,2933,551],{"class":540},[519,2935,2936],{"class":1166}," ContextExtender",[519,2938,704],{"class":540},[519,2940,708],{"class":707},[519,2942,2773],{"class":1166},[519,2944,2945,2948,2950,2952,2954,2956,2958,2960,2963,2965,2968,2970,2972],{"class":521,"line":578},[519,2946,2947],{"class":547},"  addHook",[519,2949,551],{"class":540},[519,2951,475],{"class":540},[519,2953,2248],{"class":700},[519,2955,551],{"class":540},[519,2957,2766],{"class":1166},[519,2959,619],{"class":540},[519,2961,2962],{"class":700}," hooks",[519,2964,551],{"class":540},[519,2966,2967],{"class":1166}," ResourceHooks",[519,2969,704],{"class":540},[519,2971,708],{"class":707},[519,2973,2773],{"class":1166},[519,2975,2976,2979,2981,2983,2986,2988,2990,2992,2994],{"class":521,"line":584},[519,2977,2978],{"class":547},"  addGlobalHook",[519,2980,551],{"class":540},[519,2982,475],{"class":540},[519,2984,2985],{"class":700},"hooks",[519,2987,551],{"class":540},[519,2989,2967],{"class":1166},[519,2991,704],{"class":540},[519,2993,708],{"class":707},[519,2995,2773],{"class":1166},[519,2997,2998,3001,3003],{"class":521,"line":663},[519,2999,3000],{"class":547},"  runtimeConfig",[519,3002,551],{"class":540},[519,3004,3005],{"class":1166}," any\n",[519,3007,3008,3010,3012,3014,3016,3018,3020,3022,3024,3026,3028],{"class":521,"line":677},[519,3009,2843],{"class":547},[519,3011,551],{"class":540},[519,3013,613],{"class":540},[519,3015,2850],{"class":547},[519,3017,619],{"class":540},[519,3019,2855],{"class":547},[519,3021,619],{"class":540},[519,3023,2860],{"class":547},[519,3025,619],{"class":540},[519,3027,2865],{"class":547},[519,3029,2095],{"class":540},[519,3031,3032],{"class":521,"line":690},[519,3033,1189],{"class":540},[459,3035,3037],{"id":3036},"built-in-plugins","Built-in Plugins",[502,3039,243],{"id":3040},"rate-limiting",[510,3042,3044],{"className":512,"code":3043,"language":514,"meta":515,"style":515},"import { createRateLimitPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\ncreateRateLimitPlugin({\n  windowMs: 60000,   // 1 minute\n  max: 100,          // 100 requests per window\n  byIp: true,        // Rate limit by IP (default)\n  byUser: false,     // Also rate limit by user ID\n  skip: (ctx) => ctx.user?.role === 'admin',\n  message: 'Too many requests',\n})\n",[477,3045,3046,3064,3068,3077,3091,3105,3119,3134,3169,3185],{"__ignoreMap":515},[519,3047,3048,3050,3052,3054,3056,3058,3060,3062],{"class":521,"line":522},[519,3049,610],{"class":525},[519,3051,613],{"class":540},[519,3053,616],{"class":536},[519,3055,625],{"class":540},[519,3057,628],{"class":525},[519,3059,565],{"class":540},[519,3061,633],{"class":568},[519,3063,636],{"class":540},[519,3065,3066],{"class":521,"line":544},[519,3067,642],{"emptyLinePlaceholder":641},[519,3069,3070,3073,3075],{"class":521,"line":557},[519,3071,3072],{"class":532},"createRateLimitPlugin",[519,3074,537],{"class":536},[519,3076,541],{"class":540},[519,3078,3079,3082,3084,3086,3088],{"class":521,"line":578},[519,3080,3081],{"class":547},"  windowMs",[519,3083,551],{"class":540},[519,3085,672],{"class":671},[519,3087,619],{"class":540},[519,3089,3090],{"class":604},"   // 1 minute\n",[519,3092,3093,3096,3098,3100,3102],{"class":521,"line":584},[519,3094,3095],{"class":547},"  max",[519,3097,551],{"class":540},[519,3099,1765],{"class":671},[519,3101,619],{"class":540},[519,3103,3104],{"class":604},"          // 100 requests per window\n",[519,3106,3107,3110,3112,3114,3116],{"class":521,"line":663},[519,3108,3109],{"class":547},"  byIp",[519,3111,551],{"class":540},[519,3113,2092],{"class":2091},[519,3115,619],{"class":540},[519,3117,3118],{"class":604},"        // Rate limit by IP (default)\n",[519,3120,3121,3124,3126,3129,3131],{"class":521,"line":677},[519,3122,3123],{"class":547},"  byUser",[519,3125,551],{"class":540},[519,3127,3128],{"class":2091}," false",[519,3130,619],{"class":540},[519,3132,3133],{"class":604},"     // Also rate limit by user ID\n",[519,3135,3136,3139,3141,3143,3145,3147,3149,3151,3153,3155,3157,3159,3161,3163,3165,3167],{"class":521,"line":690},[519,3137,3138],{"class":532},"  skip",[519,3140,551],{"class":540},[519,3142,475],{"class":540},[519,3144,701],{"class":700},[519,3146,704],{"class":540},[519,3148,708],{"class":707},[519,3150,711],{"class":536},[519,3152,714],{"class":540},[519,3154,717],{"class":536},[519,3156,720],{"class":540},[519,3158,723],{"class":536},[519,3160,726],{"class":540},[519,3162,565],{"class":540},[519,3164,731],{"class":568},[519,3166,572],{"class":540},[519,3168,575],{"class":540},[519,3170,3171,3174,3176,3178,3181,3183],{"class":521,"line":738},[519,3172,3173],{"class":547},"  message",[519,3175,551],{"class":540},[519,3177,565],{"class":540},[519,3179,3180],{"class":568},"Too many requests",[519,3182,572],{"class":540},[519,3184,575],{"class":540},[519,3186,3187,3189],{"class":521,"line":748},[519,3188,587],{"class":540},[519,3190,590],{"class":536},[502,3192,3194],{"id":3193},"request-metadata","Request Metadata",[510,3196,3198],{"className":512,"code":3197,"language":514,"meta":515,"style":515},"import { createRequestMetadataPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\ncreateRequestMetadataPlugin({\n  autoPopulate: (metadata, data, context) => {\n    if (context.operation === 'create') {\n      data.signupCountry = metadata.country\n      data.signupIp = metadata.ip\n    }\n    return data\n  },\n  autoPopulateOn: ['create', 'update'],\n  resources: ['users'],\n})\n",[477,3199,3200,3218,3222,3231,3258,3284,3304,3322,3326,3334,3338,3365,3383],{"__ignoreMap":515},[519,3201,3202,3204,3206,3208,3210,3212,3214,3216],{"class":521,"line":522},[519,3203,610],{"class":525},[519,3205,613],{"class":540},[519,3207,622],{"class":536},[519,3209,625],{"class":540},[519,3211,628],{"class":525},[519,3213,565],{"class":540},[519,3215,633],{"class":568},[519,3217,636],{"class":540},[519,3219,3220],{"class":521,"line":544},[519,3221,642],{"emptyLinePlaceholder":641},[519,3223,3224,3227,3229],{"class":521,"line":557},[519,3225,3226],{"class":532},"createRequestMetadataPlugin",[519,3228,537],{"class":536},[519,3230,541],{"class":540},[519,3232,3233,3236,3238,3240,3243,3245,3248,3250,3252,3254,3256],{"class":521,"line":578},[519,3234,3235],{"class":532},"  autoPopulate",[519,3237,551],{"class":540},[519,3239,475],{"class":540},[519,3241,3242],{"class":700},"metadata",[519,3244,619],{"class":540},[519,3246,3247],{"class":700}," data",[519,3249,619],{"class":540},[519,3251,2222],{"class":700},[519,3253,704],{"class":540},[519,3255,708],{"class":707},[519,3257,554],{"class":540},[519,3259,3260,3263,3265,3267,3269,3272,3274,3276,3278,3280,3282],{"class":521,"line":584},[519,3261,3262],{"class":525},"    if",[519,3264,475],{"class":547},[519,3266,1597],{"class":536},[519,3268,714],{"class":540},[519,3270,3271],{"class":536},"operation",[519,3273,2659],{"class":540},[519,3275,565],{"class":540},[519,3277,771],{"class":568},[519,3279,572],{"class":540},[519,3281,2587],{"class":547},[519,3283,541],{"class":540},[519,3285,3286,3289,3291,3294,3296,3299,3301],{"class":521,"line":663},[519,3287,3288],{"class":536},"      data",[519,3290,714],{"class":540},[519,3292,3293],{"class":536},"signupCountry",[519,3295,1358],{"class":540},[519,3297,3298],{"class":536}," metadata",[519,3300,714],{"class":540},[519,3302,3303],{"class":536},"country\n",[519,3305,3306,3308,3310,3313,3315,3317,3319],{"class":521,"line":677},[519,3307,3288],{"class":536},[519,3309,714],{"class":540},[519,3311,3312],{"class":536},"signupIp",[519,3314,1358],{"class":540},[519,3316,3298],{"class":536},[519,3318,714],{"class":540},[519,3320,3321],{"class":536},"ip\n",[519,3323,3324],{"class":521,"line":690},[519,3325,2673],{"class":540},[519,3327,3328,3331],{"class":521,"line":738},[519,3329,3330],{"class":525},"    return",[519,3332,3333],{"class":536}," data\n",[519,3335,3336],{"class":521,"line":748},[519,3337,581],{"class":540},[519,3339,3340,3343,3345,3347,3349,3351,3353,3355,3357,3359,3361,3363],{"class":521,"line":758},[519,3341,3342],{"class":547},"  autoPopulateOn",[519,3344,551],{"class":540},[519,3346,766],{"class":536},[519,3348,572],{"class":540},[519,3350,771],{"class":568},[519,3352,572],{"class":540},[519,3354,619],{"class":540},[519,3356,565],{"class":540},[519,3358,780],{"class":568},[519,3360,572],{"class":540},[519,3362,785],{"class":536},[519,3364,575],{"class":540},[519,3366,3367,3369,3371,3373,3375,3377,3379,3381],{"class":521,"line":790},[519,3368,2434],{"class":547},[519,3370,551],{"class":540},[519,3372,766],{"class":536},[519,3374,572],{"class":540},[519,3376,802],{"class":568},[519,3378,572],{"class":540},[519,3380,785],{"class":536},[519,3382,575],{"class":540},[519,3384,3385,3387],{"class":521,"line":811},[519,3386,587],{"class":540},[519,3388,590],{"class":536},[455,3390,3391,3392,3395],{},"See ",[3393,3394,247],"a",{"href":248}," for full documentation.",[502,3397,3399],{"id":3398},"better-auth-integration","Better Auth Integration",[510,3401,3403],{"className":512,"code":3402,"language":514,"meta":515,"style":515},"import { createBetterAuthPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\ncreateBetterAuthPlugin({\n  getSession: async (event) => {\n    const session = await auth.api.getSession({ headers: event.headers })\n    return session\n  },\n  mapUser: (session) => ({\n    id: session.user.id,\n    email: session.user.email,\n    permissions: session.user.role === 'admin' ? ['admin'] : ['user'],\n  }),\n})\n",[477,3404,3405,3424,3428,3437,3456,3502,3509,3513,3533,3552,3572,3625,3633],{"__ignoreMap":515},[519,3406,3407,3409,3411,3414,3416,3418,3420,3422],{"class":521,"line":522},[519,3408,610],{"class":525},[519,3410,613],{"class":540},[519,3412,3413],{"class":536}," createBetterAuthPlugin",[519,3415,625],{"class":540},[519,3417,628],{"class":525},[519,3419,565],{"class":540},[519,3421,633],{"class":568},[519,3423,636],{"class":540},[519,3425,3426],{"class":521,"line":544},[519,3427,642],{"emptyLinePlaceholder":641},[519,3429,3430,3433,3435],{"class":521,"line":557},[519,3431,3432],{"class":532},"createBetterAuthPlugin",[519,3434,537],{"class":536},[519,3436,541],{"class":540},[519,3438,3439,3442,3444,3446,3448,3450,3452,3454],{"class":521,"line":578},[519,3440,3441],{"class":532},"  getSession",[519,3443,551],{"class":540},[519,3445,1087],{"class":707},[519,3447,475],{"class":540},[519,3449,1092],{"class":700},[519,3451,704],{"class":540},[519,3453,708],{"class":707},[519,3455,554],{"class":540},[519,3457,3458,3460,3463,3465,3468,3471,3473,3476,3478,3481,3483,3485,3488,3490,3493,3495,3498,3500],{"class":521,"line":584},[519,3459,1352],{"class":707},[519,3461,3462],{"class":536}," session",[519,3464,1358],{"class":540},[519,3466,3467],{"class":525}," await",[519,3469,3470],{"class":536}," auth",[519,3472,714],{"class":540},[519,3474,3475],{"class":536},"api",[519,3477,714],{"class":540},[519,3479,3480],{"class":532},"getSession",[519,3482,537],{"class":547},[519,3484,906],{"class":540},[519,3486,3487],{"class":547}," headers",[519,3489,551],{"class":540},[519,3491,3492],{"class":536}," event",[519,3494,714],{"class":540},[519,3496,3497],{"class":536},"headers",[519,3499,625],{"class":540},[519,3501,590],{"class":547},[519,3503,3504,3506],{"class":521,"line":663},[519,3505,3330],{"class":525},[519,3507,3508],{"class":536}," session\n",[519,3510,3511],{"class":521,"line":677},[519,3512,581],{"class":540},[519,3514,3515,3518,3520,3522,3525,3527,3529,3531],{"class":521,"line":690},[519,3516,3517],{"class":532},"  mapUser",[519,3519,551],{"class":540},[519,3521,475],{"class":540},[519,3523,3524],{"class":700},"session",[519,3526,704],{"class":540},[519,3528,708],{"class":707},[519,3530,475],{"class":536},[519,3532,541],{"class":540},[519,3534,3535,3538,3540,3542,3544,3546,3548,3550],{"class":521,"line":738},[519,3536,3537],{"class":547},"    id",[519,3539,551],{"class":540},[519,3541,3462],{"class":536},[519,3543,714],{"class":540},[519,3545,717],{"class":536},[519,3547,714],{"class":540},[519,3549,2174],{"class":536},[519,3551,575],{"class":540},[519,3553,3554,3557,3559,3561,3563,3565,3567,3570],{"class":521,"line":748},[519,3555,3556],{"class":547},"    email",[519,3558,551],{"class":540},[519,3560,3462],{"class":536},[519,3562,714],{"class":540},[519,3564,717],{"class":536},[519,3566,714],{"class":540},[519,3568,3569],{"class":536},"email",[519,3571,575],{"class":540},[519,3573,3574,3577,3579,3581,3583,3585,3587,3589,3591,3593,3595,3597,3600,3602,3604,3606,3608,3611,3613,3615,3617,3619,3621,3623],{"class":521,"line":758},[519,3575,3576],{"class":547},"    permissions",[519,3578,551],{"class":540},[519,3580,3462],{"class":536},[519,3582,714],{"class":540},[519,3584,717],{"class":536},[519,3586,714],{"class":540},[519,3588,723],{"class":536},[519,3590,726],{"class":540},[519,3592,565],{"class":540},[519,3594,731],{"class":568},[519,3596,572],{"class":540},[519,3598,3599],{"class":540}," ?",[519,3601,766],{"class":536},[519,3603,572],{"class":540},[519,3605,731],{"class":568},[519,3607,572],{"class":540},[519,3609,3610],{"class":536},"] ",[519,3612,551],{"class":540},[519,3614,766],{"class":536},[519,3616,572],{"class":540},[519,3618,717],{"class":568},[519,3620,572],{"class":540},[519,3622,785],{"class":536},[519,3624,575],{"class":540},[519,3626,3627,3629,3631],{"class":521,"line":790},[519,3628,741],{"class":540},[519,3630,704],{"class":536},[519,3632,575],{"class":540},[519,3634,3635,3637],{"class":521,"line":811},[519,3636,587],{"class":540},[519,3638,590],{"class":536},[459,3640,3642],{"id":3641},"plugin-execution-order","Plugin Execution Order",[3644,3645,3646,3651],"ol",{},[469,3647,3648,3650],{},[472,3649,474],{},": Inline plugins execute in array order during module setup. File-based plugins do not have build-time phases (their code runs at runtime).",[469,3652,3653,3655,3656,3659],{},[472,3654,485],{},": Plugins execute in order: user file plugins first, then community module plugins. Middleware is sorted by ",[477,3657,3658],{},"order"," field across all plugins.",[459,3661,3663],{"id":3662},"writing-a-community-plugin-package","Writing a Community Plugin Package",[502,3665,3667],{"id":3666},"as-a-factory-function-users-add-to-their-plugins-file","As a factory function (users add to their plugins file)",[510,3669,3671],{"className":512,"code":3670,"language":514,"meta":515,"style":515},"// @websideproject/nuxt-auto-api-audit-log/src/plugin.ts\nimport { defineAutoApiPlugin } from '@websideproject/nuxt-auto-api/plugins'\nimport type { AutoApiPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport interface AuditLogOptions {\n  destination: 'db' | 'console' | 'external'\n}\n\nexport function createAuditLogPlugin(options: AuditLogOptions): AutoApiPlugin {\n  return defineAutoApiPlugin({\n    name: 'audit-log',\n    runtimeSetup(ctx) {\n      ctx.addMiddleware({\n        name: 'audit-log',\n        stage: 'post-execute',\n        handler: async (context) => {\n          // Log the operation ...\n        },\n      })\n    },\n  })\n}\n",[477,3672,3673,3678,3696,3716,3720,3731,3763,3767,3771,3794,3804,3818,3830,3842,3856,3870,3888,3893,3897,3903,3907,3913],{"__ignoreMap":515},[519,3674,3675],{"class":521,"line":522},[519,3676,3677],{"class":604},"// @websideproject/nuxt-auto-api-audit-log/src/plugin.ts\n",[519,3679,3680,3682,3684,3686,3688,3690,3692,3694],{"class":521,"line":544},[519,3681,610],{"class":525},[519,3683,613],{"class":540},[519,3685,1483],{"class":536},[519,3687,625],{"class":540},[519,3689,628],{"class":525},[519,3691,565],{"class":540},[519,3693,633],{"class":568},[519,3695,636],{"class":540},[519,3697,3698,3700,3702,3704,3706,3708,3710,3712,3714],{"class":521,"line":557},[519,3699,610],{"class":525},[519,3701,1673],{"class":525},[519,3703,613],{"class":540},[519,3705,1678],{"class":536},[519,3707,625],{"class":540},[519,3709,628],{"class":525},[519,3711,565],{"class":540},[519,3713,633],{"class":568},[519,3715,636],{"class":540},[519,3717,3718],{"class":521,"line":578},[519,3719,642],{"emptyLinePlaceholder":641},[519,3721,3722,3724,3726,3729],{"class":521,"line":584},[519,3723,526],{"class":525},[519,3725,1699],{"class":707},[519,3727,3728],{"class":1166}," AuditLogOptions",[519,3730,554],{"class":540},[519,3732,3733,3736,3738,3740,3742,3744,3747,3749,3752,3754,3756,3758,3761],{"class":521,"line":663},[519,3734,3735],{"class":547},"  destination",[519,3737,551],{"class":540},[519,3739,565],{"class":540},[519,3741,1286],{"class":568},[519,3743,572],{"class":540},[519,3745,3746],{"class":540}," |",[519,3748,565],{"class":540},[519,3750,3751],{"class":568},"console",[519,3753,572],{"class":540},[519,3755,3746],{"class":540},[519,3757,565],{"class":540},[519,3759,3760],{"class":568},"external",[519,3762,636],{"class":540},[519,3764,3765],{"class":521,"line":677},[519,3766,1189],{"class":540},[519,3768,3769],{"class":521,"line":690},[519,3770,642],{"emptyLinePlaceholder":641},[519,3772,3773,3775,3777,3779,3781,3783,3785,3787,3790,3792],{"class":521,"line":738},[519,3774,526],{"class":525},[519,3776,1730],{"class":707},[519,3778,1224],{"class":532},[519,3780,537],{"class":540},[519,3782,1338],{"class":700},[519,3784,551],{"class":540},[519,3786,3728],{"class":1166},[519,3788,3789],{"class":540},"):",[519,3791,1678],{"class":1166},[519,3793,554],{"class":540},[519,3795,3796,3798,3800,3802],{"class":521,"line":748},[519,3797,1781],{"class":525},[519,3799,1483],{"class":532},[519,3801,537],{"class":547},[519,3803,541],{"class":540},[519,3805,3806,3808,3810,3812,3814,3816],{"class":521,"line":758},[519,3807,1792],{"class":547},[519,3809,551],{"class":540},[519,3811,565],{"class":540},[519,3813,1521],{"class":568},[519,3815,572],{"class":540},[519,3817,575],{"class":540},[519,3819,3820,3822,3824,3826,3828],{"class":521,"line":790},[519,3821,1829],{"class":547},[519,3823,537],{"class":540},[519,3825,701],{"class":700},[519,3827,704],{"class":540},[519,3829,554],{"class":540},[519,3831,3832,3834,3836,3838,3840],{"class":521,"line":811},[519,3833,1413],{"class":536},[519,3835,714],{"class":540},[519,3837,1548],{"class":532},[519,3839,537],{"class":547},[519,3841,541],{"class":540},[519,3843,3844,3846,3848,3850,3852,3854],{"class":521,"line":820},[519,3845,1856],{"class":547},[519,3847,551],{"class":540},[519,3849,565],{"class":540},[519,3851,1521],{"class":568},[519,3853,572],{"class":540},[519,3855,575],{"class":540},[519,3857,3858,3860,3862,3864,3866,3868],{"class":521,"line":1826},[519,3859,1873],{"class":547},[519,3861,551],{"class":540},[519,3863,565],{"class":540},[519,3865,1579],{"class":568},[519,3867,572],{"class":540},[519,3869,575],{"class":540},[519,3871,3872,3874,3876,3878,3880,3882,3884,3886],{"class":521,"line":1840},[519,3873,1890],{"class":532},[519,3875,551],{"class":540},[519,3877,1087],{"class":707},[519,3879,475],{"class":540},[519,3881,1597],{"class":700},[519,3883,704],{"class":540},[519,3885,708],{"class":707},[519,3887,554],{"class":540},[519,3889,3890],{"class":521,"line":1853},[519,3891,3892],{"class":604},"          // Log the operation ...\n",[519,3894,3895],{"class":521,"line":1870},[519,3896,1946],{"class":540},[519,3898,3899,3901],{"class":521,"line":1887},[519,3900,1121],{"class":540},[519,3902,590],{"class":547},[519,3904,3905],{"class":521,"line":1907},[519,3906,1959],{"class":540},[519,3908,3909,3911],{"class":521,"line":1913},[519,3910,741],{"class":540},[519,3912,590],{"class":547},[519,3914,3915],{"class":521,"line":1943},[519,3916,1189],{"class":540},[455,3918,3919],{},"Users add it to their server file:",[510,3921,3923],{"className":512,"code":3922,"language":514,"meta":515,"style":515},"// server/autoapi-plugins.ts\nimport { createAuditLogPlugin } from '@websideproject/nuxt-auto-api-audit-log'\n\nexport default [\n  createAuditLogPlugin({ destination: 'db' }),\n]\n",[477,3924,3925,3929,3947,3951,3959,3983],{"__ignoreMap":515},[519,3926,3927],{"class":521,"line":522},[519,3928,605],{"class":604},[519,3930,3931,3933,3935,3937,3939,3941,3943,3945],{"class":521,"line":544},[519,3932,610],{"class":525},[519,3934,613],{"class":540},[519,3936,1224],{"class":536},[519,3938,625],{"class":540},[519,3940,628],{"class":525},[519,3942,565],{"class":540},[519,3944,1233],{"class":568},[519,3946,636],{"class":540},[519,3948,3949],{"class":521,"line":557},[519,3950,642],{"emptyLinePlaceholder":641},[519,3952,3953,3955,3957],{"class":521,"line":578},[519,3954,526],{"class":525},[519,3956,529],{"class":525},[519,3958,651],{"class":536},[519,3960,3961,3963,3965,3967,3969,3971,3973,3975,3977,3979,3981],{"class":521,"line":584},[519,3962,1272],{"class":532},[519,3964,537],{"class":536},[519,3966,906],{"class":540},[519,3968,1279],{"class":547},[519,3970,551],{"class":540},[519,3972,565],{"class":540},[519,3974,1286],{"class":568},[519,3976,572],{"class":540},[519,3978,625],{"class":540},[519,3980,704],{"class":536},[519,3982,575],{"class":540},[519,3984,3985],{"class":521,"line":663},[519,3986,823],{"class":536},[502,3988,3990],{"id":3989},"as-a-nuxt-module-zero-config-for-users","As a Nuxt module (zero-config for users)",[510,3992,3994],{"className":512,"code":3993,"language":514,"meta":515,"style":515},"// @websideproject/nuxt-auto-api-audit-log/src/module.ts\nimport { defineNuxtModule, createResolver } from '@nuxt/kit'\n\nexport default defineNuxtModule({\n  meta: { name: '@websideproject/nuxt-auto-api-audit-log' },\n  setup(options, nuxt) {\n    const resolver = createResolver(import.meta.url)\n    nuxt.hook('autoApi:registerPlugins', (ctx) => {\n      ctx.addFile(resolver.resolve('./runtime/audit-plugin'))\n    })\n  },\n})\n",[477,3995,3996,4000,4023,4027,4039,4061,4077,4101,4129,4155,4161,4165],{"__ignoreMap":515},[519,3997,3998],{"class":521,"line":522},[519,3999,1315],{"class":604},[519,4001,4002,4004,4006,4008,4010,4012,4014,4016,4018,4021],{"class":521,"line":544},[519,4003,610],{"class":525},[519,4005,613],{"class":540},[519,4007,1324],{"class":536},[519,4009,619],{"class":540},[519,4011,1361],{"class":536},[519,4013,625],{"class":540},[519,4015,628],{"class":525},[519,4017,565],{"class":540},[519,4019,4020],{"class":568},"@nuxt/kit",[519,4022,636],{"class":540},[519,4024,4025],{"class":521,"line":557},[519,4026,642],{"emptyLinePlaceholder":641},[519,4028,4029,4031,4033,4035,4037],{"class":521,"line":578},[519,4030,526],{"class":525},[519,4032,529],{"class":525},[519,4034,1324],{"class":532},[519,4036,537],{"class":536},[519,4038,541],{"class":540},[519,4040,4041,4044,4046,4048,4051,4053,4055,4057,4059],{"class":521,"line":584},[519,4042,4043],{"class":547},"  meta",[519,4045,551],{"class":540},[519,4047,613],{"class":540},[519,4049,4050],{"class":547}," name",[519,4052,551],{"class":540},[519,4054,565],{"class":540},[519,4056,1233],{"class":568},[519,4058,572],{"class":540},[519,4060,1609],{"class":540},[519,4062,4063,4065,4067,4069,4071,4073,4075],{"class":521,"line":663},[519,4064,1333],{"class":547},[519,4066,537],{"class":540},[519,4068,1338],{"class":700},[519,4070,619],{"class":540},[519,4072,1343],{"class":700},[519,4074,704],{"class":540},[519,4076,554],{"class":540},[519,4078,4079,4081,4083,4085,4087,4089,4091,4093,4095,4097,4099],{"class":521,"line":677},[519,4080,1352],{"class":707},[519,4082,1355],{"class":536},[519,4084,1358],{"class":540},[519,4086,1361],{"class":532},[519,4088,537],{"class":547},[519,4090,610],{"class":525},[519,4092,714],{"class":540},[519,4094,1370],{"class":536},[519,4096,714],{"class":540},[519,4098,1375],{"class":536},[519,4100,590],{"class":547},[519,4102,4103,4105,4107,4109,4111,4113,4115,4117,4119,4121,4123,4125,4127],{"class":521,"line":690},[519,4104,1382],{"class":536},[519,4106,714],{"class":540},[519,4108,1387],{"class":532},[519,4110,537],{"class":547},[519,4112,572],{"class":540},[519,4114,1394],{"class":568},[519,4116,572],{"class":540},[519,4118,619],{"class":540},[519,4120,475],{"class":540},[519,4122,701],{"class":700},[519,4124,704],{"class":540},[519,4126,708],{"class":707},[519,4128,554],{"class":540},[519,4130,4131,4133,4135,4137,4139,4141,4143,4145,4147,4149,4151,4153],{"class":521,"line":738},[519,4132,1413],{"class":536},[519,4134,714],{"class":540},[519,4136,1418],{"class":532},[519,4138,537],{"class":547},[519,4140,1423],{"class":536},[519,4142,714],{"class":540},[519,4144,1428],{"class":532},[519,4146,537],{"class":547},[519,4148,572],{"class":540},[519,4150,1435],{"class":568},[519,4152,572],{"class":540},[519,4154,1440],{"class":547},[519,4156,4157,4159],{"class":521,"line":748},[519,4158,1445],{"class":540},[519,4160,590],{"class":547},[519,4162,4163],{"class":521,"line":758},[519,4164,581],{"class":540},[519,4166,4167,4169],{"class":521,"line":790},[519,4168,587],{"class":540},[519,4170,590],{"class":536},[455,4172,4173,4174,551],{},"Users just add the module to ",[477,4175,508],{},[510,4177,4179],{"className":512,"code":4178,"language":514,"meta":515,"style":515},"modules: ['@websideproject/nuxt-auto-api', '@websideproject/nuxt-auto-api-audit-log']\n",[477,4180,4181],{"__ignoreMap":515},[519,4182,4183,4186,4188,4190,4192,4195,4197,4199,4201,4203,4205],{"class":521,"line":522},[519,4184,4185],{"class":1166},"modules",[519,4187,551],{"class":540},[519,4189,766],{"class":536},[519,4191,572],{"class":540},[519,4193,4194],{"class":568},"@websideproject/nuxt-auto-api",[519,4196,572],{"class":540},[519,4198,619],{"class":540},[519,4200,565],{"class":540},[519,4202,1233],{"class":568},[519,4204,572],{"class":540},[519,4206,823],{"class":536},[459,4208,4210],{"id":4209},"migration-from-extensions","Migration from Extensions",[455,4212,4213,4214,4217],{},"If you were using the legacy ",[477,4215,4216],{},"extensions"," field, migrate to the file-based approach:",[510,4219,4221],{"className":512,"code":4220,"language":514,"meta":515,"style":515},"// Before (deprecated)\nautoApi: {\n  extensions: [\n    createRateLimitExtension({ max: 100 })\n  ]\n}\n\n// After\nautoApi: {\n  plugins: '~/server/autoapi-plugins'\n}\n",[477,4222,4223,4228,4236,4245,4264,4269,4273,4277,4282,4290,4302],{"__ignoreMap":515},[519,4224,4225],{"class":521,"line":522},[519,4226,4227],{"class":604},"// Before (deprecated)\n",[519,4229,4230,4232,4234],{"class":521,"line":544},[519,4231,1167],{"class":1166},[519,4233,551],{"class":540},[519,4235,554],{"class":540},[519,4237,4238,4241,4243],{"class":521,"line":557},[519,4239,4240],{"class":1166},"  extensions",[519,4242,551],{"class":540},[519,4244,651],{"class":547},[519,4246,4247,4250,4252,4254,4256,4258,4260,4262],{"class":521,"line":578},[519,4248,4249],{"class":532},"    createRateLimitExtension",[519,4251,537],{"class":547},[519,4253,906],{"class":540},[519,4255,918],{"class":547},[519,4257,551],{"class":540},[519,4259,1765],{"class":671},[519,4261,625],{"class":540},[519,4263,590],{"class":547},[519,4265,4266],{"class":521,"line":584},[519,4267,4268],{"class":547},"  ]\n",[519,4270,4271],{"class":521,"line":663},[519,4272,1189],{"class":540},[519,4274,4275],{"class":521,"line":677},[519,4276,642],{"emptyLinePlaceholder":641},[519,4278,4279],{"class":521,"line":690},[519,4280,4281],{"class":604},"// After\n",[519,4283,4284,4286,4288],{"class":521,"line":738},[519,4285,1167],{"class":1166},[519,4287,551],{"class":540},[519,4289,554],{"class":540},[519,4291,4292,4294,4296,4298,4300],{"class":521,"line":748},[519,4293,1176],{"class":1166},[519,4295,551],{"class":540},[519,4297,565],{"class":540},[519,4299,569],{"class":568},[519,4301,636],{"class":540},[519,4303,4304],{"class":521,"line":758},[519,4305,1189],{"class":540},[455,4307,2690,4308,4310],{},[477,4309,4216],{}," field still works for backward compatibility but is deprecated.",[4312,4313,4314],"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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .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}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":515,"searchDepth":544,"depth":544,"links":4316},[4317,4318,4324,4329,4333,4336,4337,4338,4339,4344,4345,4349],{"id":461,"depth":544,"text":5},{"id":492,"depth":544,"text":493,"children":4319},[4320,4322,4323],{"id":504,"depth":557,"text":4321},"Step 1: Point to the file in nuxt.config.ts",{"id":593,"depth":557,"text":594},{"id":829,"depth":557,"text":830},{"id":1143,"depth":544,"text":1144,"children":4325},[4326,4327,4328],{"id":1150,"depth":557,"text":1151},{"id":1301,"depth":557,"text":1302},{"id":1628,"depth":557,"text":1629},{"id":1638,"depth":544,"text":1639,"children":4330},[4331,4332],{"id":1642,"depth":557,"text":1643},{"id":1974,"depth":557,"text":1975},{"id":2280,"depth":544,"text":2281,"children":4334},[4335],{"id":2367,"depth":557,"text":2368},{"id":2536,"depth":544,"text":2537},{"id":2686,"depth":544,"text":2687},{"id":2874,"depth":544,"text":2875},{"id":3036,"depth":544,"text":3037,"children":4340},[4341,4342,4343],{"id":3040,"depth":557,"text":243},{"id":3193,"depth":557,"text":3194},{"id":3398,"depth":557,"text":3399},{"id":3641,"depth":544,"text":3642},{"id":3662,"depth":544,"text":3663,"children":4346},[4347,4348],{"id":3666,"depth":557,"text":3667},{"id":3989,"depth":557,"text":3990},{"id":4209,"depth":544,"text":4210},"md",null,{},{"title":223,"description":457},"PR5vgWPwhHKxyQcAU512ZxGTHJ4CF9qvPhUeGT_6Gl4",[4356,4358],{"title":219,"path":220,"stem":221,"description":4357,"children":-1},"This guide covers how to work with many-to-many relationships in @websideproject/nuxt-auto-api.",{"title":227,"path":228,"stem":229,"description":4359,"children":-1},"@websideproject/nuxt-auto-api supports multiple database engines through a unified adapter layer. Each adapter normalizes engine-specific behavior like transactions, batch operations, and mutation count parsing.",1772977477983]