[{"data":1,"prerenderedAt":5604},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-auto/auto-api/lifecycle-hooks-en":444,"/docs/nuxt-auto/auto-api/lifecycle-hooks-surround-en":5599},[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":5595},{"id":446,"title":215,"body":447,"description":457,"extension":5594,"links":5595,"meta":5596,"navigation":5595,"ogImage":5595,"path":216,"seo":5597,"stem":217,"__hash__":5598},"nuxt_auto/0.docs/3.nuxt-auto/2.auto-api/11.lifecycle-hooks.md",{"type":448,"value":449,"toc":5568},"minimark",[450,454,458,463,641,645,648,653,660,977,1185,1189,1195,1490,1494,1500,1787,1791,1794,1816,1846,1850,1853,2227,2231,2234,2878,2882,2889,3153,3156,3468,3472,3476,3479,3715,3719,3726,3835,3838,3952,3956,3959,4022,4026,4030,4318,4322,4548,4552,4746,4750,4936,4940,5131,5135,5197,5201,5204,5543,5546,5564],[451,452,215],"h1",{"id":453},"lifecycle-hooks",[455,456,457],"p",{},"Lifecycle hooks allow you to execute custom logic before and after CRUD operations. Perfect for audit logging, notifications, data transformation, and business logic.",[459,460,462],"h2",{"id":461},"available-hooks","Available Hooks",[464,465,466,485],"table",{},[467,468,469],"thead",{},[470,471,472,476,479,482],"tr",{},[473,474,475],"th",{},"Hook",[473,477,478],{},"When it runs",[473,480,481],{},"Can modify data",[473,483,484],{},"Use cases",[486,487,488,506,522,537,552,567,582,597,612,626],"tbody",{},[470,489,490,497,500,503],{},[491,492,493],"td",{},[494,495,496],"code",{},"beforeCreate",[491,498,499],{},"Before inserting record",[491,501,502],{},"✅ Yes",[491,504,505],{},"Set defaults, validate, transform",[470,507,508,513,516,519],{},[491,509,510],{},[494,511,512],{},"afterCreate",[491,514,515],{},"After inserting record",[491,517,518],{},"❌ No",[491,520,521],{},"Send notifications, log audit",[470,523,524,529,532,534],{},[491,525,526],{},[494,527,528],{},"beforeUpdate",[491,530,531],{},"Before updating record",[491,533,502],{},[491,535,536],{},"Validate changes, transform",[470,538,539,544,547,549],{},[491,540,541],{},[494,542,543],{},"afterUpdate",[491,545,546],{},"After updating record",[491,548,518],{},[491,550,551],{},"Notify users, sync services",[470,553,554,559,562,564],{},[491,555,556],{},[494,557,558],{},"beforeDelete",[491,560,561],{},"Before deleting record",[491,563,518],{},[491,565,566],{},"Check dependencies, validate",[470,568,569,574,577,579],{},[491,570,571],{},[494,572,573],{},"afterDelete",[491,575,576],{},"After deleting record",[491,578,518],{},[491,580,581],{},"Clean up relations, log audit",[470,583,584,589,592,594],{},[491,585,586],{},[494,587,588],{},"beforeList",[491,590,591],{},"Before listing records",[491,593,518],{},[491,595,596],{},"Log access (rarely needed)",[470,598,599,604,607,609],{},[491,600,601],{},[494,602,603],{},"afterList",[491,605,606],{},"After listing records",[491,608,518],{},[491,610,611],{},"Log access, track analytics",[470,613,614,619,622,624],{},[491,615,616],{},[494,617,618],{},"beforeGet",[491,620,621],{},"Before fetching single record",[491,623,518],{},[491,625,596],{},[470,627,628,633,636,638],{},[491,629,630],{},[494,631,632],{},"afterGet",[491,634,635],{},"After fetching single record",[491,637,518],{},[491,639,640],{},"Track views, log access",[459,642,644],{"id":643},"hook-configuration-methods","Hook Configuration Methods",[455,646,647],{},"Nuxt Auto API supports three ways to configure hooks, with clear priority ordering.",[649,650,652],"h3",{"id":651},"method-1-per-resource-via-module-registration","Method 1: Per-Resource (via Module Registration)",[455,654,655,659],{},[656,657,658],"strong",{},"Highest priority",". Best for module-based architecture.",[661,662,667],"pre",{"className":663,"code":664,"language":665,"meta":666,"style":666},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// playground/modules/base/index.ts\nimport { createModuleImport } from '@websideproject/nuxt-auto-api'\n\nexport default defineNuxtModule({\n  async setup(options, nuxt) {\n    const resolver = createResolver(import.meta.url)\n\n    nuxt.hook('autoApi:registerSchema', (registry) => {\n      registry.register('users', {\n        schema: createModuleImport(resolver.resolve('./schema'), 'users'),\n        hooks: createModuleImport(resolver.resolve('./hooks'), 'userHooks')\n      })\n    })\n  }\n})\n","typescript","",[494,668,669,678,709,716,735,764,797,802,838,862,907,947,955,963,969],{"__ignoreMap":666},[670,671,674],"span",{"class":672,"line":673},"line",1,[670,675,677],{"class":676},"sHwdD","// playground/modules/base/index.ts\n",[670,679,681,685,689,693,696,699,702,706],{"class":672,"line":680},2,[670,682,684],{"class":683},"s7zQu","import",[670,686,688],{"class":687},"sMK4o"," {",[670,690,692],{"class":691},"sTEyZ"," createModuleImport",[670,694,695],{"class":687}," }",[670,697,698],{"class":683}," from",[670,700,701],{"class":687}," '",[670,703,705],{"class":704},"sfazB","@websideproject/nuxt-auto-api",[670,707,708],{"class":687},"'\n",[670,710,712],{"class":672,"line":711},3,[670,713,715],{"emptyLinePlaceholder":714},true,"\n",[670,717,719,722,725,729,732],{"class":672,"line":718},4,[670,720,721],{"class":683},"export",[670,723,724],{"class":683}," default",[670,726,728],{"class":727},"s2Zo4"," defineNuxtModule",[670,730,731],{"class":691},"(",[670,733,734],{"class":687},"{\n",[670,736,738,742,746,748,752,755,758,761],{"class":672,"line":737},5,[670,739,741],{"class":740},"spNyl","  async",[670,743,745],{"class":744},"swJcz"," setup",[670,747,731],{"class":687},[670,749,751],{"class":750},"sHdIc","options",[670,753,754],{"class":687},",",[670,756,757],{"class":750}," nuxt",[670,759,760],{"class":687},")",[670,762,763],{"class":687}," {\n",[670,765,767,770,773,776,779,781,783,786,789,791,794],{"class":672,"line":766},6,[670,768,769],{"class":740},"    const",[670,771,772],{"class":691}," resolver",[670,774,775],{"class":687}," =",[670,777,778],{"class":727}," createResolver",[670,780,731],{"class":744},[670,782,684],{"class":683},[670,784,785],{"class":687},".",[670,787,788],{"class":691},"meta",[670,790,785],{"class":687},[670,792,793],{"class":691},"url",[670,795,796],{"class":744},")\n",[670,798,800],{"class":672,"line":799},7,[670,801,715],{"emptyLinePlaceholder":714},[670,803,805,808,810,813,815,818,821,823,825,828,831,833,836],{"class":672,"line":804},8,[670,806,807],{"class":691},"    nuxt",[670,809,785],{"class":687},[670,811,812],{"class":727},"hook",[670,814,731],{"class":744},[670,816,817],{"class":687},"'",[670,819,820],{"class":704},"autoApi:registerSchema",[670,822,817],{"class":687},[670,824,754],{"class":687},[670,826,827],{"class":687}," (",[670,829,830],{"class":750},"registry",[670,832,760],{"class":687},[670,834,835],{"class":740}," =>",[670,837,763],{"class":687},[670,839,841,844,846,849,851,853,856,858,860],{"class":672,"line":840},9,[670,842,843],{"class":691},"      registry",[670,845,785],{"class":687},[670,847,848],{"class":727},"register",[670,850,731],{"class":744},[670,852,817],{"class":687},[670,854,855],{"class":704},"users",[670,857,817],{"class":687},[670,859,754],{"class":687},[670,861,763],{"class":687},[670,863,865,868,871,873,875,878,880,883,885,887,890,892,894,896,898,900,902,904],{"class":672,"line":864},10,[670,866,867],{"class":744},"        schema",[670,869,870],{"class":687},":",[670,872,692],{"class":727},[670,874,731],{"class":744},[670,876,877],{"class":691},"resolver",[670,879,785],{"class":687},[670,881,882],{"class":727},"resolve",[670,884,731],{"class":744},[670,886,817],{"class":687},[670,888,889],{"class":704},"./schema",[670,891,817],{"class":687},[670,893,760],{"class":744},[670,895,754],{"class":687},[670,897,701],{"class":687},[670,899,855],{"class":704},[670,901,817],{"class":687},[670,903,760],{"class":744},[670,905,906],{"class":687},",\n",[670,908,910,913,915,917,919,921,923,925,927,929,932,934,936,938,940,943,945],{"class":672,"line":909},11,[670,911,912],{"class":744},"        hooks",[670,914,870],{"class":687},[670,916,692],{"class":727},[670,918,731],{"class":744},[670,920,877],{"class":691},[670,922,785],{"class":687},[670,924,882],{"class":727},[670,926,731],{"class":744},[670,928,817],{"class":687},[670,930,931],{"class":704},"./hooks",[670,933,817],{"class":687},[670,935,760],{"class":744},[670,937,754],{"class":687},[670,939,701],{"class":687},[670,941,942],{"class":704},"userHooks",[670,944,817],{"class":687},[670,946,796],{"class":744},[670,948,950,953],{"class":672,"line":949},12,[670,951,952],{"class":687},"      }",[670,954,796],{"class":744},[670,956,958,961],{"class":672,"line":957},13,[670,959,960],{"class":687},"    }",[670,962,796],{"class":744},[670,964,966],{"class":672,"line":965},14,[670,967,968],{"class":687},"  }\n",[670,970,972,975],{"class":672,"line":971},15,[670,973,974],{"class":687},"}",[670,976,796],{"class":691},[661,978,980],{"className":663,"code":979,"language":665,"meta":666,"style":666},"// playground/modules/base/hooks.ts\nexport const userHooks = {\n  beforeCreate: async (data, context) => {\n    data.createdBy = context.user.id\n    data.status = data.status || 'active'\n    return data\n  },\n\n  afterCreate: async (user, context) => {\n    console.log(`User ${user.id} created by ${context.user.id}`)\n    // Send welcome email, create audit log, etc.\n  }\n}\n",[494,981,982,987,1002,1028,1052,1080,1088,1093,1097,1120,1171,1176,1180],{"__ignoreMap":666},[670,983,984],{"class":672,"line":673},[670,985,986],{"class":676},"// playground/modules/base/hooks.ts\n",[670,988,989,991,994,997,1000],{"class":672,"line":680},[670,990,721],{"class":683},[670,992,993],{"class":740}," const",[670,995,996],{"class":691}," userHooks ",[670,998,999],{"class":687},"=",[670,1001,763],{"class":687},[670,1003,1004,1007,1009,1012,1014,1017,1019,1022,1024,1026],{"class":672,"line":711},[670,1005,1006],{"class":727},"  beforeCreate",[670,1008,870],{"class":687},[670,1010,1011],{"class":740}," async",[670,1013,827],{"class":687},[670,1015,1016],{"class":750},"data",[670,1018,754],{"class":687},[670,1020,1021],{"class":750}," context",[670,1023,760],{"class":687},[670,1025,835],{"class":740},[670,1027,763],{"class":687},[670,1029,1030,1033,1035,1038,1040,1042,1044,1047,1049],{"class":672,"line":718},[670,1031,1032],{"class":691},"    data",[670,1034,785],{"class":687},[670,1036,1037],{"class":691},"createdBy",[670,1039,775],{"class":687},[670,1041,1021],{"class":691},[670,1043,785],{"class":687},[670,1045,1046],{"class":691},"user",[670,1048,785],{"class":687},[670,1050,1051],{"class":691},"id\n",[670,1053,1054,1056,1058,1061,1063,1066,1068,1070,1073,1075,1078],{"class":672,"line":737},[670,1055,1032],{"class":691},[670,1057,785],{"class":687},[670,1059,1060],{"class":691},"status",[670,1062,775],{"class":687},[670,1064,1065],{"class":691}," data",[670,1067,785],{"class":687},[670,1069,1060],{"class":691},[670,1071,1072],{"class":687}," ||",[670,1074,701],{"class":687},[670,1076,1077],{"class":704},"active",[670,1079,708],{"class":687},[670,1081,1082,1085],{"class":672,"line":766},[670,1083,1084],{"class":683},"    return",[670,1086,1087],{"class":691}," data\n",[670,1089,1090],{"class":672,"line":799},[670,1091,1092],{"class":687},"  },\n",[670,1094,1095],{"class":672,"line":804},[670,1096,715],{"emptyLinePlaceholder":714},[670,1098,1099,1102,1104,1106,1108,1110,1112,1114,1116,1118],{"class":672,"line":840},[670,1100,1101],{"class":727},"  afterCreate",[670,1103,870],{"class":687},[670,1105,1011],{"class":740},[670,1107,827],{"class":687},[670,1109,1046],{"class":750},[670,1111,754],{"class":687},[670,1113,1021],{"class":750},[670,1115,760],{"class":687},[670,1117,835],{"class":740},[670,1119,763],{"class":687},[670,1121,1122,1125,1127,1130,1132,1135,1138,1141,1143,1145,1148,1150,1153,1155,1158,1160,1162,1164,1166,1169],{"class":672,"line":864},[670,1123,1124],{"class":691},"    console",[670,1126,785],{"class":687},[670,1128,1129],{"class":727},"log",[670,1131,731],{"class":744},[670,1133,1134],{"class":687},"`",[670,1136,1137],{"class":704},"User ",[670,1139,1140],{"class":687},"${",[670,1142,1046],{"class":691},[670,1144,785],{"class":687},[670,1146,1147],{"class":691},"id",[670,1149,974],{"class":687},[670,1151,1152],{"class":704}," created by ",[670,1154,1140],{"class":687},[670,1156,1157],{"class":691},"context",[670,1159,785],{"class":687},[670,1161,1046],{"class":691},[670,1163,785],{"class":687},[670,1165,1147],{"class":691},[670,1167,1168],{"class":687},"}`",[670,1170,796],{"class":744},[670,1172,1173],{"class":672,"line":909},[670,1174,1175],{"class":676},"    // Send welcome email, create audit log, etc.\n",[670,1177,1178],{"class":672,"line":949},[670,1179,968],{"class":687},[670,1181,1182],{"class":672,"line":957},[670,1183,1184],{"class":687},"}\n",[649,1186,1188],{"id":1187},"method-2-plugin-based-runtime-registration","Method 2: Plugin-Based (Runtime Registration)",[455,1190,1191,1194],{},[656,1192,1193],{},"Medium priority",". Best for cross-cutting concerns.",[661,1196,1198],{"className":663,"code":1197,"language":665,"meta":666,"style":666},"// server/plugins/user-hooks.ts\nexport default defineNitroPlugin(() => {\n  const hooks = globalThis.__autoApiHooks || (globalThis.__autoApiHooks = {})\n\n  hooks.users = {\n    ...(hooks.users || {}),\n\n    afterCreate: async (user, context) => {\n      // Send welcome email\n      await sendEmail({\n        to: user.email,\n        template: 'welcome',\n        data: { name: user.name }\n      })\n    },\n\n    afterUpdate: async (user, context) => {\n      // Invalidate cache\n      await clearCache(`user:${user.id}`)\n    }\n  }\n})\n",[494,1199,1200,1205,1223,1259,1263,1276,1298,1302,1325,1330,1342,1359,1375,1399,1405,1410,1415,1439,1445,1472,1478,1483],{"__ignoreMap":666},[670,1201,1202],{"class":672,"line":673},[670,1203,1204],{"class":676},"// server/plugins/user-hooks.ts\n",[670,1206,1207,1209,1211,1214,1216,1219,1221],{"class":672,"line":680},[670,1208,721],{"class":683},[670,1210,724],{"class":683},[670,1212,1213],{"class":727}," defineNitroPlugin",[670,1215,731],{"class":691},[670,1217,1218],{"class":687},"()",[670,1220,835],{"class":740},[670,1222,763],{"class":687},[670,1224,1225,1228,1231,1233,1236,1238,1241,1243,1245,1248,1250,1252,1254,1257],{"class":672,"line":711},[670,1226,1227],{"class":740},"  const",[670,1229,1230],{"class":691}," hooks",[670,1232,775],{"class":687},[670,1234,1235],{"class":691}," globalThis",[670,1237,785],{"class":687},[670,1239,1240],{"class":691},"__autoApiHooks",[670,1242,1072],{"class":687},[670,1244,827],{"class":744},[670,1246,1247],{"class":691},"globalThis",[670,1249,785],{"class":687},[670,1251,1240],{"class":691},[670,1253,775],{"class":687},[670,1255,1256],{"class":687}," {}",[670,1258,796],{"class":744},[670,1260,1261],{"class":672,"line":718},[670,1262,715],{"emptyLinePlaceholder":714},[670,1264,1265,1268,1270,1272,1274],{"class":672,"line":737},[670,1266,1267],{"class":691},"  hooks",[670,1269,785],{"class":687},[670,1271,855],{"class":691},[670,1273,775],{"class":687},[670,1275,763],{"class":687},[670,1277,1278,1281,1283,1286,1288,1290,1292,1294,1296],{"class":672,"line":766},[670,1279,1280],{"class":687},"    ...",[670,1282,731],{"class":744},[670,1284,1285],{"class":691},"hooks",[670,1287,785],{"class":687},[670,1289,855],{"class":691},[670,1291,1072],{"class":687},[670,1293,1256],{"class":687},[670,1295,760],{"class":744},[670,1297,906],{"class":687},[670,1299,1300],{"class":672,"line":799},[670,1301,715],{"emptyLinePlaceholder":714},[670,1303,1304,1307,1309,1311,1313,1315,1317,1319,1321,1323],{"class":672,"line":804},[670,1305,1306],{"class":727},"    afterCreate",[670,1308,870],{"class":687},[670,1310,1011],{"class":740},[670,1312,827],{"class":687},[670,1314,1046],{"class":750},[670,1316,754],{"class":687},[670,1318,1021],{"class":750},[670,1320,760],{"class":687},[670,1322,835],{"class":740},[670,1324,763],{"class":687},[670,1326,1327],{"class":672,"line":840},[670,1328,1329],{"class":676},"      // Send welcome email\n",[670,1331,1332,1335,1338,1340],{"class":672,"line":864},[670,1333,1334],{"class":683},"      await",[670,1336,1337],{"class":727}," sendEmail",[670,1339,731],{"class":744},[670,1341,734],{"class":687},[670,1343,1344,1347,1349,1352,1354,1357],{"class":672,"line":909},[670,1345,1346],{"class":744},"        to",[670,1348,870],{"class":687},[670,1350,1351],{"class":691}," user",[670,1353,785],{"class":687},[670,1355,1356],{"class":691},"email",[670,1358,906],{"class":687},[670,1360,1361,1364,1366,1368,1371,1373],{"class":672,"line":949},[670,1362,1363],{"class":744},"        template",[670,1365,870],{"class":687},[670,1367,701],{"class":687},[670,1369,1370],{"class":704},"welcome",[670,1372,817],{"class":687},[670,1374,906],{"class":687},[670,1376,1377,1380,1382,1384,1387,1389,1391,1393,1396],{"class":672,"line":957},[670,1378,1379],{"class":744},"        data",[670,1381,870],{"class":687},[670,1383,688],{"class":687},[670,1385,1386],{"class":744}," name",[670,1388,870],{"class":687},[670,1390,1351],{"class":691},[670,1392,785],{"class":687},[670,1394,1395],{"class":691},"name",[670,1397,1398],{"class":687}," }\n",[670,1400,1401,1403],{"class":672,"line":965},[670,1402,952],{"class":687},[670,1404,796],{"class":744},[670,1406,1407],{"class":672,"line":971},[670,1408,1409],{"class":687},"    },\n",[670,1411,1413],{"class":672,"line":1412},16,[670,1414,715],{"emptyLinePlaceholder":714},[670,1416,1418,1421,1423,1425,1427,1429,1431,1433,1435,1437],{"class":672,"line":1417},17,[670,1419,1420],{"class":727},"    afterUpdate",[670,1422,870],{"class":687},[670,1424,1011],{"class":740},[670,1426,827],{"class":687},[670,1428,1046],{"class":750},[670,1430,754],{"class":687},[670,1432,1021],{"class":750},[670,1434,760],{"class":687},[670,1436,835],{"class":740},[670,1438,763],{"class":687},[670,1440,1442],{"class":672,"line":1441},18,[670,1443,1444],{"class":676},"      // Invalidate cache\n",[670,1446,1448,1450,1453,1455,1457,1460,1462,1464,1466,1468,1470],{"class":672,"line":1447},19,[670,1449,1334],{"class":683},[670,1451,1452],{"class":727}," clearCache",[670,1454,731],{"class":744},[670,1456,1134],{"class":687},[670,1458,1459],{"class":704},"user:",[670,1461,1140],{"class":687},[670,1463,1046],{"class":691},[670,1465,785],{"class":687},[670,1467,1147],{"class":691},[670,1469,1168],{"class":687},[670,1471,796],{"class":744},[670,1473,1475],{"class":672,"line":1474},20,[670,1476,1477],{"class":687},"    }\n",[670,1479,1481],{"class":672,"line":1480},21,[670,1482,968],{"class":687},[670,1484,1486,1488],{"class":672,"line":1485},22,[670,1487,974],{"class":687},[670,1489,796],{"class":691},[649,1491,1493],{"id":1492},"method-3-config-based-nuxtconfigts","Method 3: Config-Based (nuxt.config.ts)",[455,1495,1496,1499],{},[656,1497,1498],{},"Lowest priority",". Best for simple projects.",[661,1501,1503],{"className":663,"code":1502,"language":665,"meta":666,"style":666},"// nuxt.config.ts\nexport default defineNuxtConfig({\n  autoApi: {\n    hooks: {\n      users: {\n        beforeCreate: async (data, context) => {\n          data.createdBy = context.user.id\n          return data\n        },\n\n        afterCreate: async (user, context) => {\n          console.log('User created:', user.id)\n        }\n      },\n\n      posts: {\n        beforeCreate: async (data, context) => {\n          data.authorId = context.user.id\n          data.publishedAt = data.publishedAt || new Date()\n          return data\n        }\n      }\n    }\n  }\n})\n",[494,1504,1505,1510,1523,1532,1541,1550,1573,1594,1601,1606,1610,1633,1661,1666,1671,1675,1684,1706,1727,1755,1761,1765,1770,1775,1780],{"__ignoreMap":666},[670,1506,1507],{"class":672,"line":673},[670,1508,1509],{"class":676},"// nuxt.config.ts\n",[670,1511,1512,1514,1516,1519,1521],{"class":672,"line":680},[670,1513,721],{"class":683},[670,1515,724],{"class":683},[670,1517,1518],{"class":727}," defineNuxtConfig",[670,1520,731],{"class":691},[670,1522,734],{"class":687},[670,1524,1525,1528,1530],{"class":672,"line":711},[670,1526,1527],{"class":744},"  autoApi",[670,1529,870],{"class":687},[670,1531,763],{"class":687},[670,1533,1534,1537,1539],{"class":672,"line":718},[670,1535,1536],{"class":744},"    hooks",[670,1538,870],{"class":687},[670,1540,763],{"class":687},[670,1542,1543,1546,1548],{"class":672,"line":737},[670,1544,1545],{"class":744},"      users",[670,1547,870],{"class":687},[670,1549,763],{"class":687},[670,1551,1552,1555,1557,1559,1561,1563,1565,1567,1569,1571],{"class":672,"line":766},[670,1553,1554],{"class":727},"        beforeCreate",[670,1556,870],{"class":687},[670,1558,1011],{"class":740},[670,1560,827],{"class":687},[670,1562,1016],{"class":750},[670,1564,754],{"class":687},[670,1566,1021],{"class":750},[670,1568,760],{"class":687},[670,1570,835],{"class":740},[670,1572,763],{"class":687},[670,1574,1575,1578,1580,1582,1584,1586,1588,1590,1592],{"class":672,"line":799},[670,1576,1577],{"class":691},"          data",[670,1579,785],{"class":687},[670,1581,1037],{"class":691},[670,1583,775],{"class":687},[670,1585,1021],{"class":691},[670,1587,785],{"class":687},[670,1589,1046],{"class":691},[670,1591,785],{"class":687},[670,1593,1051],{"class":691},[670,1595,1596,1599],{"class":672,"line":804},[670,1597,1598],{"class":683},"          return",[670,1600,1087],{"class":691},[670,1602,1603],{"class":672,"line":840},[670,1604,1605],{"class":687},"        },\n",[670,1607,1608],{"class":672,"line":864},[670,1609,715],{"emptyLinePlaceholder":714},[670,1611,1612,1615,1617,1619,1621,1623,1625,1627,1629,1631],{"class":672,"line":909},[670,1613,1614],{"class":727},"        afterCreate",[670,1616,870],{"class":687},[670,1618,1011],{"class":740},[670,1620,827],{"class":687},[670,1622,1046],{"class":750},[670,1624,754],{"class":687},[670,1626,1021],{"class":750},[670,1628,760],{"class":687},[670,1630,835],{"class":740},[670,1632,763],{"class":687},[670,1634,1635,1638,1640,1642,1644,1646,1649,1651,1653,1655,1657,1659],{"class":672,"line":949},[670,1636,1637],{"class":691},"          console",[670,1639,785],{"class":687},[670,1641,1129],{"class":727},[670,1643,731],{"class":744},[670,1645,817],{"class":687},[670,1647,1648],{"class":704},"User created:",[670,1650,817],{"class":687},[670,1652,754],{"class":687},[670,1654,1351],{"class":691},[670,1656,785],{"class":687},[670,1658,1147],{"class":691},[670,1660,796],{"class":744},[670,1662,1663],{"class":672,"line":957},[670,1664,1665],{"class":687},"        }\n",[670,1667,1668],{"class":672,"line":965},[670,1669,1670],{"class":687},"      },\n",[670,1672,1673],{"class":672,"line":971},[670,1674,715],{"emptyLinePlaceholder":714},[670,1676,1677,1680,1682],{"class":672,"line":1412},[670,1678,1679],{"class":744},"      posts",[670,1681,870],{"class":687},[670,1683,763],{"class":687},[670,1685,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704],{"class":672,"line":1417},[670,1687,1554],{"class":727},[670,1689,870],{"class":687},[670,1691,1011],{"class":740},[670,1693,827],{"class":687},[670,1695,1016],{"class":750},[670,1697,754],{"class":687},[670,1699,1021],{"class":750},[670,1701,760],{"class":687},[670,1703,835],{"class":740},[670,1705,763],{"class":687},[670,1707,1708,1710,1712,1715,1717,1719,1721,1723,1725],{"class":672,"line":1441},[670,1709,1577],{"class":691},[670,1711,785],{"class":687},[670,1713,1714],{"class":691},"authorId",[670,1716,775],{"class":687},[670,1718,1021],{"class":691},[670,1720,785],{"class":687},[670,1722,1046],{"class":691},[670,1724,785],{"class":687},[670,1726,1051],{"class":691},[670,1728,1729,1731,1733,1736,1738,1740,1742,1744,1746,1749,1752],{"class":672,"line":1447},[670,1730,1577],{"class":691},[670,1732,785],{"class":687},[670,1734,1735],{"class":691},"publishedAt",[670,1737,775],{"class":687},[670,1739,1065],{"class":691},[670,1741,785],{"class":687},[670,1743,1735],{"class":691},[670,1745,1072],{"class":687},[670,1747,1748],{"class":687}," new",[670,1750,1751],{"class":727}," Date",[670,1753,1754],{"class":744},"()\n",[670,1756,1757,1759],{"class":672,"line":1474},[670,1758,1598],{"class":683},[670,1760,1087],{"class":691},[670,1762,1763],{"class":672,"line":1480},[670,1764,1665],{"class":687},[670,1766,1767],{"class":672,"line":1485},[670,1768,1769],{"class":687},"      }\n",[670,1771,1773],{"class":672,"line":1772},23,[670,1774,1477],{"class":687},[670,1776,1778],{"class":672,"line":1777},24,[670,1779,968],{"class":687},[670,1781,1783,1785],{"class":672,"line":1782},25,[670,1784,974],{"class":687},[670,1786,796],{"class":691},[459,1788,1790],{"id":1789},"hook-priority-merging","Hook Priority & Merging",[455,1792,1793],{},"When multiple hooks exist for the same event:",[1795,1796,1797,1804,1810],"ol",{},[1798,1799,1800,1803],"li",{},[656,1801,1802],{},"Registry hooks"," (createModuleImport) - execute last (highest priority)",[1798,1805,1806,1809],{},[656,1807,1808],{},"Plugin hooks"," (globalThis) - execute second",[1798,1811,1812,1815],{},[656,1813,1814],{},"Config hooks"," (nuxt.config.ts) - execute first (lowest priority)",[661,1817,1819],{"className":663,"code":1818,"language":665,"meta":666,"style":666},"// If all three exist:\n// 1. Config hook runs\n// 2. Plugin hook runs\n// 3. Registry hook runs\n// 4. Final result from registry hook is used\n",[494,1820,1821,1826,1831,1836,1841],{"__ignoreMap":666},[670,1822,1823],{"class":672,"line":673},[670,1824,1825],{"class":676},"// If all three exist:\n",[670,1827,1828],{"class":672,"line":680},[670,1829,1830],{"class":676},"// 1. Config hook runs\n",[670,1832,1833],{"class":672,"line":711},[670,1834,1835],{"class":676},"// 2. Plugin hook runs\n",[670,1837,1838],{"class":672,"line":718},[670,1839,1840],{"class":676},"// 3. Registry hook runs\n",[670,1842,1843],{"class":672,"line":737},[670,1844,1845],{"class":676},"// 4. Final result from registry hook is used\n",[459,1847,1849],{"id":1848},"before-hooks-data-modification","Before Hooks (Data Modification)",[455,1851,1852],{},"Before hooks can modify data before it's saved:",[661,1854,1856],{"className":663,"code":1855,"language":665,"meta":666,"style":666},"export const productHooks = {\n  beforeCreate: async (data, context) => {\n    // Set defaults\n    data.status = data.status || 'draft'\n    data.createdBy = context.user.id\n\n    // Generate slug from title\n    data.slug = slugify(data.title)\n\n    // Validate business rules\n    if (data.price \u003C 0) {\n      throw new Error('Price cannot be negative')\n    }\n\n    // Transform data\n    data.name = data.name.trim().toLowerCase()\n\n    // Return modified data\n    return data\n  },\n\n  beforeUpdate: async (id, data, context) => {\n    // Track who modified\n    data.modifiedBy = context.user.id\n    data.modifiedAt = new Date()\n\n    // Prevent changing certain fields\n    delete data.createdBy\n    delete data.createdAt\n\n    return data\n  }\n}\n",[494,1857,1858,1871,1893,1898,1923,1943,1947,1952,1977,1981,1986,2012,2033,2037,2041,2046,2076,2080,2085,2091,2095,2099,2126,2131,2152,2169,2174,2180,2193,2205,2210,2217,2222],{"__ignoreMap":666},[670,1859,1860,1862,1864,1867,1869],{"class":672,"line":673},[670,1861,721],{"class":683},[670,1863,993],{"class":740},[670,1865,1866],{"class":691}," productHooks ",[670,1868,999],{"class":687},[670,1870,763],{"class":687},[670,1872,1873,1875,1877,1879,1881,1883,1885,1887,1889,1891],{"class":672,"line":680},[670,1874,1006],{"class":727},[670,1876,870],{"class":687},[670,1878,1011],{"class":740},[670,1880,827],{"class":687},[670,1882,1016],{"class":750},[670,1884,754],{"class":687},[670,1886,1021],{"class":750},[670,1888,760],{"class":687},[670,1890,835],{"class":740},[670,1892,763],{"class":687},[670,1894,1895],{"class":672,"line":711},[670,1896,1897],{"class":676},"    // Set defaults\n",[670,1899,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1921],{"class":672,"line":718},[670,1901,1032],{"class":691},[670,1903,785],{"class":687},[670,1905,1060],{"class":691},[670,1907,775],{"class":687},[670,1909,1065],{"class":691},[670,1911,785],{"class":687},[670,1913,1060],{"class":691},[670,1915,1072],{"class":687},[670,1917,701],{"class":687},[670,1919,1920],{"class":704},"draft",[670,1922,708],{"class":687},[670,1924,1925,1927,1929,1931,1933,1935,1937,1939,1941],{"class":672,"line":737},[670,1926,1032],{"class":691},[670,1928,785],{"class":687},[670,1930,1037],{"class":691},[670,1932,775],{"class":687},[670,1934,1021],{"class":691},[670,1936,785],{"class":687},[670,1938,1046],{"class":691},[670,1940,785],{"class":687},[670,1942,1051],{"class":691},[670,1944,1945],{"class":672,"line":766},[670,1946,715],{"emptyLinePlaceholder":714},[670,1948,1949],{"class":672,"line":799},[670,1950,1951],{"class":676},"    // Generate slug from title\n",[670,1953,1954,1956,1958,1961,1963,1966,1968,1970,1972,1975],{"class":672,"line":804},[670,1955,1032],{"class":691},[670,1957,785],{"class":687},[670,1959,1960],{"class":691},"slug",[670,1962,775],{"class":687},[670,1964,1965],{"class":727}," slugify",[670,1967,731],{"class":744},[670,1969,1016],{"class":691},[670,1971,785],{"class":687},[670,1973,1974],{"class":691},"title",[670,1976,796],{"class":744},[670,1978,1979],{"class":672,"line":840},[670,1980,715],{"emptyLinePlaceholder":714},[670,1982,1983],{"class":672,"line":864},[670,1984,1985],{"class":676},"    // Validate business rules\n",[670,1987,1988,1991,1993,1995,1997,2000,2003,2007,2010],{"class":672,"line":909},[670,1989,1990],{"class":683},"    if",[670,1992,827],{"class":744},[670,1994,1016],{"class":691},[670,1996,785],{"class":687},[670,1998,1999],{"class":691},"price",[670,2001,2002],{"class":687}," \u003C",[670,2004,2006],{"class":2005},"sbssI"," 0",[670,2008,2009],{"class":744},") ",[670,2011,734],{"class":687},[670,2013,2014,2017,2019,2022,2024,2026,2029,2031],{"class":672,"line":949},[670,2015,2016],{"class":683},"      throw",[670,2018,1748],{"class":687},[670,2020,2021],{"class":727}," Error",[670,2023,731],{"class":744},[670,2025,817],{"class":687},[670,2027,2028],{"class":704},"Price cannot be negative",[670,2030,817],{"class":687},[670,2032,796],{"class":744},[670,2034,2035],{"class":672,"line":957},[670,2036,1477],{"class":687},[670,2038,2039],{"class":672,"line":965},[670,2040,715],{"emptyLinePlaceholder":714},[670,2042,2043],{"class":672,"line":971},[670,2044,2045],{"class":676},"    // Transform data\n",[670,2047,2048,2050,2052,2054,2056,2058,2060,2062,2064,2067,2069,2071,2074],{"class":672,"line":1412},[670,2049,1032],{"class":691},[670,2051,785],{"class":687},[670,2053,1395],{"class":691},[670,2055,775],{"class":687},[670,2057,1065],{"class":691},[670,2059,785],{"class":687},[670,2061,1395],{"class":691},[670,2063,785],{"class":687},[670,2065,2066],{"class":727},"trim",[670,2068,1218],{"class":744},[670,2070,785],{"class":687},[670,2072,2073],{"class":727},"toLowerCase",[670,2075,1754],{"class":744},[670,2077,2078],{"class":672,"line":1417},[670,2079,715],{"emptyLinePlaceholder":714},[670,2081,2082],{"class":672,"line":1441},[670,2083,2084],{"class":676},"    // Return modified data\n",[670,2086,2087,2089],{"class":672,"line":1447},[670,2088,1084],{"class":683},[670,2090,1087],{"class":691},[670,2092,2093],{"class":672,"line":1474},[670,2094,1092],{"class":687},[670,2096,2097],{"class":672,"line":1480},[670,2098,715],{"emptyLinePlaceholder":714},[670,2100,2101,2104,2106,2108,2110,2112,2114,2116,2118,2120,2122,2124],{"class":672,"line":1485},[670,2102,2103],{"class":727},"  beforeUpdate",[670,2105,870],{"class":687},[670,2107,1011],{"class":740},[670,2109,827],{"class":687},[670,2111,1147],{"class":750},[670,2113,754],{"class":687},[670,2115,1065],{"class":750},[670,2117,754],{"class":687},[670,2119,1021],{"class":750},[670,2121,760],{"class":687},[670,2123,835],{"class":740},[670,2125,763],{"class":687},[670,2127,2128],{"class":672,"line":1772},[670,2129,2130],{"class":676},"    // Track who modified\n",[670,2132,2133,2135,2137,2140,2142,2144,2146,2148,2150],{"class":672,"line":1777},[670,2134,1032],{"class":691},[670,2136,785],{"class":687},[670,2138,2139],{"class":691},"modifiedBy",[670,2141,775],{"class":687},[670,2143,1021],{"class":691},[670,2145,785],{"class":687},[670,2147,1046],{"class":691},[670,2149,785],{"class":687},[670,2151,1051],{"class":691},[670,2153,2154,2156,2158,2161,2163,2165,2167],{"class":672,"line":1782},[670,2155,1032],{"class":691},[670,2157,785],{"class":687},[670,2159,2160],{"class":691},"modifiedAt",[670,2162,775],{"class":687},[670,2164,1748],{"class":687},[670,2166,1751],{"class":727},[670,2168,1754],{"class":744},[670,2170,2172],{"class":672,"line":2171},26,[670,2173,715],{"emptyLinePlaceholder":714},[670,2175,2177],{"class":672,"line":2176},27,[670,2178,2179],{"class":676},"    // Prevent changing certain fields\n",[670,2181,2183,2186,2188,2190],{"class":672,"line":2182},28,[670,2184,2185],{"class":687},"    delete",[670,2187,1065],{"class":691},[670,2189,785],{"class":687},[670,2191,2192],{"class":691},"createdBy\n",[670,2194,2196,2198,2200,2202],{"class":672,"line":2195},29,[670,2197,2185],{"class":687},[670,2199,1065],{"class":691},[670,2201,785],{"class":687},[670,2203,2204],{"class":691},"createdAt\n",[670,2206,2208],{"class":672,"line":2207},30,[670,2209,715],{"emptyLinePlaceholder":714},[670,2211,2213,2215],{"class":672,"line":2212},31,[670,2214,1084],{"class":683},[670,2216,1087],{"class":691},[670,2218,2220],{"class":672,"line":2219},32,[670,2221,968],{"class":687},[670,2223,2225],{"class":672,"line":2224},33,[670,2226,1184],{"class":687},[459,2228,2230],{"id":2229},"after-hooks-side-effects","After Hooks (Side Effects)",[455,2232,2233],{},"After hooks are for side effects (no data modification):",[661,2235,2237],{"className":663,"code":2236,"language":665,"meta":666,"style":666},"export const orderHooks = {\n  afterCreate: async (order, context) => {\n    // Send confirmation email\n    await sendEmail({\n      to: order.customerEmail,\n      template: 'order-confirmation',\n      data: { orderNumber: order.id, total: order.total }\n    })\n\n    // Create audit log\n    await db.insert(auditLogs).values({\n      action: 'order.created',\n      userId: context.user.id,\n      resourceId: order.id,\n      timestamp: new Date()\n    })\n\n    // Notify external service\n    await fetch('https://analytics.example.com/track', {\n      method: 'POST',\n      body: JSON.stringify({\n        event: 'order_created',\n        orderId: order.id,\n        total: order.total\n      })\n    })\n  },\n\n  afterUpdate: async (order, context) => {\n    // If status changed to 'shipped'\n    if (order.status === 'shipped') {\n      await sendEmail({\n        to: order.customerEmail,\n        template: 'order-shipped',\n        data: { trackingNumber: order.trackingNumber }\n      })\n    }\n  },\n\n  afterDelete: async (id, context) => {\n    // Clean up related records\n    await db.delete(orderItems).where(eq(orderItems.orderId, id))\n\n    // Log deletion\n    console.log(`Order ${id} deleted by user ${context.user.id}`)\n  }\n}\n",[494,2238,2239,2252,2275,2280,2291,2308,2324,2360,2366,2370,2375,2403,2419,2438,2453,2466,2472,2476,2481,2501,2517,2536,2552,2567,2581,2587,2593,2597,2601,2624,2629,2655,2665,2679,2695,2718,2725,2730,2735,2740,2764,2770,2816,2821,2827,2868,2873],{"__ignoreMap":666},[670,2240,2241,2243,2245,2248,2250],{"class":672,"line":673},[670,2242,721],{"class":683},[670,2244,993],{"class":740},[670,2246,2247],{"class":691}," orderHooks ",[670,2249,999],{"class":687},[670,2251,763],{"class":687},[670,2253,2254,2256,2258,2260,2262,2265,2267,2269,2271,2273],{"class":672,"line":680},[670,2255,1101],{"class":727},[670,2257,870],{"class":687},[670,2259,1011],{"class":740},[670,2261,827],{"class":687},[670,2263,2264],{"class":750},"order",[670,2266,754],{"class":687},[670,2268,1021],{"class":750},[670,2270,760],{"class":687},[670,2272,835],{"class":740},[670,2274,763],{"class":687},[670,2276,2277],{"class":672,"line":711},[670,2278,2279],{"class":676},"    // Send confirmation email\n",[670,2281,2282,2285,2287,2289],{"class":672,"line":718},[670,2283,2284],{"class":683},"    await",[670,2286,1337],{"class":727},[670,2288,731],{"class":744},[670,2290,734],{"class":687},[670,2292,2293,2296,2298,2301,2303,2306],{"class":672,"line":737},[670,2294,2295],{"class":744},"      to",[670,2297,870],{"class":687},[670,2299,2300],{"class":691}," order",[670,2302,785],{"class":687},[670,2304,2305],{"class":691},"customerEmail",[670,2307,906],{"class":687},[670,2309,2310,2313,2315,2317,2320,2322],{"class":672,"line":766},[670,2311,2312],{"class":744},"      template",[670,2314,870],{"class":687},[670,2316,701],{"class":687},[670,2318,2319],{"class":704},"order-confirmation",[670,2321,817],{"class":687},[670,2323,906],{"class":687},[670,2325,2326,2329,2331,2333,2336,2338,2340,2342,2344,2346,2349,2351,2353,2355,2358],{"class":672,"line":799},[670,2327,2328],{"class":744},"      data",[670,2330,870],{"class":687},[670,2332,688],{"class":687},[670,2334,2335],{"class":744}," orderNumber",[670,2337,870],{"class":687},[670,2339,2300],{"class":691},[670,2341,785],{"class":687},[670,2343,1147],{"class":691},[670,2345,754],{"class":687},[670,2347,2348],{"class":744}," total",[670,2350,870],{"class":687},[670,2352,2300],{"class":691},[670,2354,785],{"class":687},[670,2356,2357],{"class":691},"total",[670,2359,1398],{"class":687},[670,2361,2362,2364],{"class":672,"line":804},[670,2363,960],{"class":687},[670,2365,796],{"class":744},[670,2367,2368],{"class":672,"line":840},[670,2369,715],{"emptyLinePlaceholder":714},[670,2371,2372],{"class":672,"line":864},[670,2373,2374],{"class":676},"    // Create audit log\n",[670,2376,2377,2379,2382,2384,2387,2389,2392,2394,2396,2399,2401],{"class":672,"line":909},[670,2378,2284],{"class":683},[670,2380,2381],{"class":691}," db",[670,2383,785],{"class":687},[670,2385,2386],{"class":727},"insert",[670,2388,731],{"class":744},[670,2390,2391],{"class":691},"auditLogs",[670,2393,760],{"class":744},[670,2395,785],{"class":687},[670,2397,2398],{"class":727},"values",[670,2400,731],{"class":744},[670,2402,734],{"class":687},[670,2404,2405,2408,2410,2412,2415,2417],{"class":672,"line":949},[670,2406,2407],{"class":744},"      action",[670,2409,870],{"class":687},[670,2411,701],{"class":687},[670,2413,2414],{"class":704},"order.created",[670,2416,817],{"class":687},[670,2418,906],{"class":687},[670,2420,2421,2424,2426,2428,2430,2432,2434,2436],{"class":672,"line":957},[670,2422,2423],{"class":744},"      userId",[670,2425,870],{"class":687},[670,2427,1021],{"class":691},[670,2429,785],{"class":687},[670,2431,1046],{"class":691},[670,2433,785],{"class":687},[670,2435,1147],{"class":691},[670,2437,906],{"class":687},[670,2439,2440,2443,2445,2447,2449,2451],{"class":672,"line":965},[670,2441,2442],{"class":744},"      resourceId",[670,2444,870],{"class":687},[670,2446,2300],{"class":691},[670,2448,785],{"class":687},[670,2450,1147],{"class":691},[670,2452,906],{"class":687},[670,2454,2455,2458,2460,2462,2464],{"class":672,"line":971},[670,2456,2457],{"class":744},"      timestamp",[670,2459,870],{"class":687},[670,2461,1748],{"class":687},[670,2463,1751],{"class":727},[670,2465,1754],{"class":744},[670,2467,2468,2470],{"class":672,"line":1412},[670,2469,960],{"class":687},[670,2471,796],{"class":744},[670,2473,2474],{"class":672,"line":1417},[670,2475,715],{"emptyLinePlaceholder":714},[670,2477,2478],{"class":672,"line":1441},[670,2479,2480],{"class":676},"    // Notify external service\n",[670,2482,2483,2485,2488,2490,2492,2495,2497,2499],{"class":672,"line":1447},[670,2484,2284],{"class":683},[670,2486,2487],{"class":727}," fetch",[670,2489,731],{"class":744},[670,2491,817],{"class":687},[670,2493,2494],{"class":704},"https://analytics.example.com/track",[670,2496,817],{"class":687},[670,2498,754],{"class":687},[670,2500,763],{"class":687},[670,2502,2503,2506,2508,2510,2513,2515],{"class":672,"line":1474},[670,2504,2505],{"class":744},"      method",[670,2507,870],{"class":687},[670,2509,701],{"class":687},[670,2511,2512],{"class":704},"POST",[670,2514,817],{"class":687},[670,2516,906],{"class":687},[670,2518,2519,2522,2524,2527,2529,2532,2534],{"class":672,"line":1480},[670,2520,2521],{"class":744},"      body",[670,2523,870],{"class":687},[670,2525,2526],{"class":691}," JSON",[670,2528,785],{"class":687},[670,2530,2531],{"class":727},"stringify",[670,2533,731],{"class":744},[670,2535,734],{"class":687},[670,2537,2538,2541,2543,2545,2548,2550],{"class":672,"line":1485},[670,2539,2540],{"class":744},"        event",[670,2542,870],{"class":687},[670,2544,701],{"class":687},[670,2546,2547],{"class":704},"order_created",[670,2549,817],{"class":687},[670,2551,906],{"class":687},[670,2553,2554,2557,2559,2561,2563,2565],{"class":672,"line":1772},[670,2555,2556],{"class":744},"        orderId",[670,2558,870],{"class":687},[670,2560,2300],{"class":691},[670,2562,785],{"class":687},[670,2564,1147],{"class":691},[670,2566,906],{"class":687},[670,2568,2569,2572,2574,2576,2578],{"class":672,"line":1777},[670,2570,2571],{"class":744},"        total",[670,2573,870],{"class":687},[670,2575,2300],{"class":691},[670,2577,785],{"class":687},[670,2579,2580],{"class":691},"total\n",[670,2582,2583,2585],{"class":672,"line":1782},[670,2584,952],{"class":687},[670,2586,796],{"class":744},[670,2588,2589,2591],{"class":672,"line":2171},[670,2590,960],{"class":687},[670,2592,796],{"class":744},[670,2594,2595],{"class":672,"line":2176},[670,2596,1092],{"class":687},[670,2598,2599],{"class":672,"line":2182},[670,2600,715],{"emptyLinePlaceholder":714},[670,2602,2603,2606,2608,2610,2612,2614,2616,2618,2620,2622],{"class":672,"line":2195},[670,2604,2605],{"class":727},"  afterUpdate",[670,2607,870],{"class":687},[670,2609,1011],{"class":740},[670,2611,827],{"class":687},[670,2613,2264],{"class":750},[670,2615,754],{"class":687},[670,2617,1021],{"class":750},[670,2619,760],{"class":687},[670,2621,835],{"class":740},[670,2623,763],{"class":687},[670,2625,2626],{"class":672,"line":2207},[670,2627,2628],{"class":676},"    // If status changed to 'shipped'\n",[670,2630,2631,2633,2635,2637,2639,2641,2644,2646,2649,2651,2653],{"class":672,"line":2212},[670,2632,1990],{"class":683},[670,2634,827],{"class":744},[670,2636,2264],{"class":691},[670,2638,785],{"class":687},[670,2640,1060],{"class":691},[670,2642,2643],{"class":687}," ===",[670,2645,701],{"class":687},[670,2647,2648],{"class":704},"shipped",[670,2650,817],{"class":687},[670,2652,2009],{"class":744},[670,2654,734],{"class":687},[670,2656,2657,2659,2661,2663],{"class":672,"line":2219},[670,2658,1334],{"class":683},[670,2660,1337],{"class":727},[670,2662,731],{"class":744},[670,2664,734],{"class":687},[670,2666,2667,2669,2671,2673,2675,2677],{"class":672,"line":2224},[670,2668,1346],{"class":744},[670,2670,870],{"class":687},[670,2672,2300],{"class":691},[670,2674,785],{"class":687},[670,2676,2305],{"class":691},[670,2678,906],{"class":687},[670,2680,2682,2684,2686,2688,2691,2693],{"class":672,"line":2681},34,[670,2683,1363],{"class":744},[670,2685,870],{"class":687},[670,2687,701],{"class":687},[670,2689,2690],{"class":704},"order-shipped",[670,2692,817],{"class":687},[670,2694,906],{"class":687},[670,2696,2698,2700,2702,2704,2707,2709,2711,2713,2716],{"class":672,"line":2697},35,[670,2699,1379],{"class":744},[670,2701,870],{"class":687},[670,2703,688],{"class":687},[670,2705,2706],{"class":744}," trackingNumber",[670,2708,870],{"class":687},[670,2710,2300],{"class":691},[670,2712,785],{"class":687},[670,2714,2715],{"class":691},"trackingNumber",[670,2717,1398],{"class":687},[670,2719,2721,2723],{"class":672,"line":2720},36,[670,2722,952],{"class":687},[670,2724,796],{"class":744},[670,2726,2728],{"class":672,"line":2727},37,[670,2729,1477],{"class":687},[670,2731,2733],{"class":672,"line":2732},38,[670,2734,1092],{"class":687},[670,2736,2738],{"class":672,"line":2737},39,[670,2739,715],{"emptyLinePlaceholder":714},[670,2741,2743,2746,2748,2750,2752,2754,2756,2758,2760,2762],{"class":672,"line":2742},40,[670,2744,2745],{"class":727},"  afterDelete",[670,2747,870],{"class":687},[670,2749,1011],{"class":740},[670,2751,827],{"class":687},[670,2753,1147],{"class":750},[670,2755,754],{"class":687},[670,2757,1021],{"class":750},[670,2759,760],{"class":687},[670,2761,835],{"class":740},[670,2763,763],{"class":687},[670,2765,2767],{"class":672,"line":2766},41,[670,2768,2769],{"class":676},"    // Clean up related records\n",[670,2771,2773,2775,2777,2779,2782,2784,2787,2789,2791,2794,2796,2799,2801,2803,2805,2808,2810,2813],{"class":672,"line":2772},42,[670,2774,2284],{"class":683},[670,2776,2381],{"class":691},[670,2778,785],{"class":687},[670,2780,2781],{"class":727},"delete",[670,2783,731],{"class":744},[670,2785,2786],{"class":691},"orderItems",[670,2788,760],{"class":744},[670,2790,785],{"class":687},[670,2792,2793],{"class":727},"where",[670,2795,731],{"class":744},[670,2797,2798],{"class":727},"eq",[670,2800,731],{"class":744},[670,2802,2786],{"class":691},[670,2804,785],{"class":687},[670,2806,2807],{"class":691},"orderId",[670,2809,754],{"class":687},[670,2811,2812],{"class":691}," id",[670,2814,2815],{"class":744},"))\n",[670,2817,2819],{"class":672,"line":2818},43,[670,2820,715],{"emptyLinePlaceholder":714},[670,2822,2824],{"class":672,"line":2823},44,[670,2825,2826],{"class":676},"    // Log deletion\n",[670,2828,2830,2832,2834,2836,2838,2840,2843,2845,2847,2849,2852,2854,2856,2858,2860,2862,2864,2866],{"class":672,"line":2829},45,[670,2831,1124],{"class":691},[670,2833,785],{"class":687},[670,2835,1129],{"class":727},[670,2837,731],{"class":744},[670,2839,1134],{"class":687},[670,2841,2842],{"class":704},"Order ",[670,2844,1140],{"class":687},[670,2846,1147],{"class":691},[670,2848,974],{"class":687},[670,2850,2851],{"class":704}," deleted by user ",[670,2853,1140],{"class":687},[670,2855,1157],{"class":691},[670,2857,785],{"class":687},[670,2859,1046],{"class":691},[670,2861,785],{"class":687},[670,2863,1147],{"class":691},[670,2865,1168],{"class":687},[670,2867,796],{"class":744},[670,2869,2871],{"class":672,"line":2870},46,[670,2872,968],{"class":687},[670,2874,2876],{"class":672,"line":2875},47,[670,2877,1184],{"class":687},[459,2879,2881],{"id":2880},"hook-context","Hook Context",[455,2883,2884,2885,2888],{},"All hooks receive a ",[494,2886,2887],{},"HandlerContext"," object:",[661,2890,2892],{"className":663,"code":2891,"language":665,"meta":666,"style":666},"interface HandlerContext {\n  db: any                    // Database instance\n  schema: any                // Drizzle schema\n  user: AuthUser | null      // Current user\n  permissions: string[]      // User permissions\n  params: Record\u003Cstring, string>   // Route params\n  query: Record\u003Cstring, any>       // Query parameters\n  validated: {               // Validated data\n    body?: any\n    query?: any\n  }\n  event: H3Event             // H3 event object\n  resource: string           // Resource name (e.g., 'users')\n  operation: string          // Operation type\n  tenant?: {                 // Multi-tenancy info\n    id: string | number\n    field: string\n    canAccessAllTenants: boolean\n  }\n  resourceConfig?: ResourceRegistration  // Resource configuration\n}\n",[494,2893,2894,2905,2918,2930,2949,2965,2991,3013,3025,3036,3045,3049,3062,3074,3086,3098,3112,3122,3132,3136,3149],{"__ignoreMap":666},[670,2895,2896,2899,2903],{"class":672,"line":673},[670,2897,2898],{"class":740},"interface",[670,2900,2902],{"class":2901},"sBMFI"," HandlerContext",[670,2904,763],{"class":687},[670,2906,2907,2910,2912,2915],{"class":672,"line":680},[670,2908,2909],{"class":744},"  db",[670,2911,870],{"class":687},[670,2913,2914],{"class":2901}," any",[670,2916,2917],{"class":676},"                    // Database instance\n",[670,2919,2920,2923,2925,2927],{"class":672,"line":711},[670,2921,2922],{"class":744},"  schema",[670,2924,870],{"class":687},[670,2926,2914],{"class":2901},[670,2928,2929],{"class":676},"                // Drizzle schema\n",[670,2931,2932,2935,2937,2940,2943,2946],{"class":672,"line":718},[670,2933,2934],{"class":744},"  user",[670,2936,870],{"class":687},[670,2938,2939],{"class":2901}," AuthUser",[670,2941,2942],{"class":687}," |",[670,2944,2945],{"class":2901}," null",[670,2947,2948],{"class":676},"      // Current user\n",[670,2950,2951,2954,2956,2959,2962],{"class":672,"line":737},[670,2952,2953],{"class":744},"  permissions",[670,2955,870],{"class":687},[670,2957,2958],{"class":2901}," string",[670,2960,2961],{"class":691},"[]      ",[670,2963,2964],{"class":676},"// User permissions\n",[670,2966,2967,2970,2972,2975,2978,2981,2983,2985,2988],{"class":672,"line":766},[670,2968,2969],{"class":744},"  params",[670,2971,870],{"class":687},[670,2973,2974],{"class":2901}," Record",[670,2976,2977],{"class":687},"\u003C",[670,2979,2980],{"class":2901},"string",[670,2982,754],{"class":687},[670,2984,2958],{"class":2901},[670,2986,2987],{"class":687},">",[670,2989,2990],{"class":676},"   // Route params\n",[670,2992,2993,2996,2998,3000,3002,3004,3006,3008,3010],{"class":672,"line":799},[670,2994,2995],{"class":744},"  query",[670,2997,870],{"class":687},[670,2999,2974],{"class":2901},[670,3001,2977],{"class":687},[670,3003,2980],{"class":2901},[670,3005,754],{"class":687},[670,3007,2914],{"class":2901},[670,3009,2987],{"class":687},[670,3011,3012],{"class":676},"       // Query parameters\n",[670,3014,3015,3018,3020,3022],{"class":672,"line":804},[670,3016,3017],{"class":744},"  validated",[670,3019,870],{"class":687},[670,3021,688],{"class":687},[670,3023,3024],{"class":676},"               // Validated data\n",[670,3026,3027,3030,3033],{"class":672,"line":840},[670,3028,3029],{"class":744},"    body",[670,3031,3032],{"class":687},"?:",[670,3034,3035],{"class":2901}," any\n",[670,3037,3038,3041,3043],{"class":672,"line":864},[670,3039,3040],{"class":744},"    query",[670,3042,3032],{"class":687},[670,3044,3035],{"class":2901},[670,3046,3047],{"class":672,"line":909},[670,3048,968],{"class":687},[670,3050,3051,3054,3056,3059],{"class":672,"line":949},[670,3052,3053],{"class":744},"  event",[670,3055,870],{"class":687},[670,3057,3058],{"class":2901}," H3Event",[670,3060,3061],{"class":676},"             // H3 event object\n",[670,3063,3064,3067,3069,3071],{"class":672,"line":957},[670,3065,3066],{"class":744},"  resource",[670,3068,870],{"class":687},[670,3070,2958],{"class":2901},[670,3072,3073],{"class":676},"           // Resource name (e.g., 'users')\n",[670,3075,3076,3079,3081,3083],{"class":672,"line":965},[670,3077,3078],{"class":744},"  operation",[670,3080,870],{"class":687},[670,3082,2958],{"class":2901},[670,3084,3085],{"class":676},"          // Operation type\n",[670,3087,3088,3091,3093,3095],{"class":672,"line":971},[670,3089,3090],{"class":744},"  tenant",[670,3092,3032],{"class":687},[670,3094,688],{"class":687},[670,3096,3097],{"class":676},"                 // Multi-tenancy info\n",[670,3099,3100,3103,3105,3107,3109],{"class":672,"line":1412},[670,3101,3102],{"class":744},"    id",[670,3104,870],{"class":687},[670,3106,2958],{"class":2901},[670,3108,2942],{"class":687},[670,3110,3111],{"class":2901}," number\n",[670,3113,3114,3117,3119],{"class":672,"line":1417},[670,3115,3116],{"class":744},"    field",[670,3118,870],{"class":687},[670,3120,3121],{"class":2901}," string\n",[670,3123,3124,3127,3129],{"class":672,"line":1441},[670,3125,3126],{"class":744},"    canAccessAllTenants",[670,3128,870],{"class":687},[670,3130,3131],{"class":2901}," boolean\n",[670,3133,3134],{"class":672,"line":1447},[670,3135,968],{"class":687},[670,3137,3138,3141,3143,3146],{"class":672,"line":1474},[670,3139,3140],{"class":744},"  resourceConfig",[670,3142,3032],{"class":687},[670,3144,3145],{"class":2901}," ResourceRegistration",[670,3147,3148],{"class":676},"  // Resource configuration\n",[670,3150,3151],{"class":672,"line":1480},[670,3152,1184],{"class":687},[455,3154,3155],{},"Using context:",[661,3157,3159],{"className":663,"code":3158,"language":665,"meta":666,"style":666},"export const postHooks = {\n  beforeCreate: async (data, context) => {\n    // Auto-set author from authenticated user\n    data.authorId = context.user.id\n\n    // Auto-set tenant\n    if (context.tenant) {\n      data.organizationId = context.tenant.id\n    }\n\n    // Access query parameters\n    if (context.query.publishNow === 'true') {\n      data.publishedAt = new Date()\n    }\n\n    return data\n  },\n\n  afterCreate: async (post, context) => {\n    // Log to database\n    await context.db.insert(auditLogs).values({\n      action: 'post.created',\n      userId: context.user.id,\n      postId: post.id\n    })\n  }\n}\n",[494,3160,3161,3174,3196,3201,3221,3225,3230,3247,3268,3272,3276,3281,3312,3328,3332,3336,3342,3346,3350,3373,3378,3407,3422,3440,3454,3460,3464],{"__ignoreMap":666},[670,3162,3163,3165,3167,3170,3172],{"class":672,"line":673},[670,3164,721],{"class":683},[670,3166,993],{"class":740},[670,3168,3169],{"class":691}," postHooks ",[670,3171,999],{"class":687},[670,3173,763],{"class":687},[670,3175,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194],{"class":672,"line":680},[670,3177,1006],{"class":727},[670,3179,870],{"class":687},[670,3181,1011],{"class":740},[670,3183,827],{"class":687},[670,3185,1016],{"class":750},[670,3187,754],{"class":687},[670,3189,1021],{"class":750},[670,3191,760],{"class":687},[670,3193,835],{"class":740},[670,3195,763],{"class":687},[670,3197,3198],{"class":672,"line":711},[670,3199,3200],{"class":676},"    // Auto-set author from authenticated user\n",[670,3202,3203,3205,3207,3209,3211,3213,3215,3217,3219],{"class":672,"line":718},[670,3204,1032],{"class":691},[670,3206,785],{"class":687},[670,3208,1714],{"class":691},[670,3210,775],{"class":687},[670,3212,1021],{"class":691},[670,3214,785],{"class":687},[670,3216,1046],{"class":691},[670,3218,785],{"class":687},[670,3220,1051],{"class":691},[670,3222,3223],{"class":672,"line":737},[670,3224,715],{"emptyLinePlaceholder":714},[670,3226,3227],{"class":672,"line":766},[670,3228,3229],{"class":676},"    // Auto-set tenant\n",[670,3231,3232,3234,3236,3238,3240,3243,3245],{"class":672,"line":799},[670,3233,1990],{"class":683},[670,3235,827],{"class":744},[670,3237,1157],{"class":691},[670,3239,785],{"class":687},[670,3241,3242],{"class":691},"tenant",[670,3244,2009],{"class":744},[670,3246,734],{"class":687},[670,3248,3249,3251,3253,3256,3258,3260,3262,3264,3266],{"class":672,"line":804},[670,3250,2328],{"class":691},[670,3252,785],{"class":687},[670,3254,3255],{"class":691},"organizationId",[670,3257,775],{"class":687},[670,3259,1021],{"class":691},[670,3261,785],{"class":687},[670,3263,3242],{"class":691},[670,3265,785],{"class":687},[670,3267,1051],{"class":691},[670,3269,3270],{"class":672,"line":840},[670,3271,1477],{"class":687},[670,3273,3274],{"class":672,"line":864},[670,3275,715],{"emptyLinePlaceholder":714},[670,3277,3278],{"class":672,"line":909},[670,3279,3280],{"class":676},"    // Access query parameters\n",[670,3282,3283,3285,3287,3289,3291,3294,3296,3299,3301,3303,3306,3308,3310],{"class":672,"line":949},[670,3284,1990],{"class":683},[670,3286,827],{"class":744},[670,3288,1157],{"class":691},[670,3290,785],{"class":687},[670,3292,3293],{"class":691},"query",[670,3295,785],{"class":687},[670,3297,3298],{"class":691},"publishNow",[670,3300,2643],{"class":687},[670,3302,701],{"class":687},[670,3304,3305],{"class":704},"true",[670,3307,817],{"class":687},[670,3309,2009],{"class":744},[670,3311,734],{"class":687},[670,3313,3314,3316,3318,3320,3322,3324,3326],{"class":672,"line":957},[670,3315,2328],{"class":691},[670,3317,785],{"class":687},[670,3319,1735],{"class":691},[670,3321,775],{"class":687},[670,3323,1748],{"class":687},[670,3325,1751],{"class":727},[670,3327,1754],{"class":744},[670,3329,3330],{"class":672,"line":965},[670,3331,1477],{"class":687},[670,3333,3334],{"class":672,"line":971},[670,3335,715],{"emptyLinePlaceholder":714},[670,3337,3338,3340],{"class":672,"line":1412},[670,3339,1084],{"class":683},[670,3341,1087],{"class":691},[670,3343,3344],{"class":672,"line":1417},[670,3345,1092],{"class":687},[670,3347,3348],{"class":672,"line":1441},[670,3349,715],{"emptyLinePlaceholder":714},[670,3351,3352,3354,3356,3358,3360,3363,3365,3367,3369,3371],{"class":672,"line":1447},[670,3353,1101],{"class":727},[670,3355,870],{"class":687},[670,3357,1011],{"class":740},[670,3359,827],{"class":687},[670,3361,3362],{"class":750},"post",[670,3364,754],{"class":687},[670,3366,1021],{"class":750},[670,3368,760],{"class":687},[670,3370,835],{"class":740},[670,3372,763],{"class":687},[670,3374,3375],{"class":672,"line":1474},[670,3376,3377],{"class":676},"    // Log to database\n",[670,3379,3380,3382,3384,3386,3389,3391,3393,3395,3397,3399,3401,3403,3405],{"class":672,"line":1480},[670,3381,2284],{"class":683},[670,3383,1021],{"class":691},[670,3385,785],{"class":687},[670,3387,3388],{"class":691},"db",[670,3390,785],{"class":687},[670,3392,2386],{"class":727},[670,3394,731],{"class":744},[670,3396,2391],{"class":691},[670,3398,760],{"class":744},[670,3400,785],{"class":687},[670,3402,2398],{"class":727},[670,3404,731],{"class":744},[670,3406,734],{"class":687},[670,3408,3409,3411,3413,3415,3418,3420],{"class":672,"line":1485},[670,3410,2407],{"class":744},[670,3412,870],{"class":687},[670,3414,701],{"class":687},[670,3416,3417],{"class":704},"post.created",[670,3419,817],{"class":687},[670,3421,906],{"class":687},[670,3423,3424,3426,3428,3430,3432,3434,3436,3438],{"class":672,"line":1772},[670,3425,2423],{"class":744},[670,3427,870],{"class":687},[670,3429,1021],{"class":691},[670,3431,785],{"class":687},[670,3433,1046],{"class":691},[670,3435,785],{"class":687},[670,3437,1147],{"class":691},[670,3439,906],{"class":687},[670,3441,3442,3445,3447,3450,3452],{"class":672,"line":1777},[670,3443,3444],{"class":744},"      postId",[670,3446,870],{"class":687},[670,3448,3449],{"class":691}," post",[670,3451,785],{"class":687},[670,3453,1051],{"class":691},[670,3455,3456,3458],{"class":672,"line":1782},[670,3457,960],{"class":687},[670,3459,796],{"class":744},[670,3461,3462],{"class":672,"line":2171},[670,3463,968],{"class":687},[670,3465,3466],{"class":672,"line":2176},[670,3467,1184],{"class":687},[459,3469,3471],{"id":3470},"error-handling","Error Handling",[649,3473,3475],{"id":3474},"before-hooks","Before Hooks",[455,3477,3478],{},"Before hooks should throw errors to block the operation:",[661,3480,3482],{"className":663,"code":3481,"language":665,"meta":666,"style":666},"beforeCreate: async (data, context) => {\n  // Validation error - blocks creation\n  if (!data.email || !data.email.includes('@')) {\n    throw new Error('Invalid email address')\n  }\n\n  // Business rule error - blocks creation\n  const existingUser = await context.db.query.users.findFirst({\n    where: eq(users.email, data.email)\n  })\n\n  if (existingUser) {\n    throw new Error('Email already exists')\n  }\n\n  return data\n}\n",[494,3483,3484,3506,3511,3557,3577,3581,3585,3590,3625,3653,3660,3664,3677,3696,3700,3704,3711],{"__ignoreMap":666},[670,3485,3486,3488,3490,3492,3494,3496,3498,3500,3502,3504],{"class":672,"line":673},[670,3487,496],{"class":2901},[670,3489,870],{"class":687},[670,3491,1011],{"class":740},[670,3493,827],{"class":687},[670,3495,1016],{"class":750},[670,3497,754],{"class":687},[670,3499,1021],{"class":750},[670,3501,760],{"class":687},[670,3503,835],{"class":740},[670,3505,763],{"class":687},[670,3507,3508],{"class":672,"line":680},[670,3509,3510],{"class":676},"  // Validation error - blocks creation\n",[670,3512,3513,3516,3518,3521,3523,3525,3527,3529,3532,3534,3536,3538,3540,3543,3545,3547,3550,3552,3555],{"class":672,"line":711},[670,3514,3515],{"class":683},"  if",[670,3517,827],{"class":744},[670,3519,3520],{"class":687},"!",[670,3522,1016],{"class":691},[670,3524,785],{"class":687},[670,3526,1356],{"class":691},[670,3528,1072],{"class":687},[670,3530,3531],{"class":687}," !",[670,3533,1016],{"class":691},[670,3535,785],{"class":687},[670,3537,1356],{"class":691},[670,3539,785],{"class":687},[670,3541,3542],{"class":727},"includes",[670,3544,731],{"class":744},[670,3546,817],{"class":687},[670,3548,3549],{"class":704},"@",[670,3551,817],{"class":687},[670,3553,3554],{"class":744},")) ",[670,3556,734],{"class":687},[670,3558,3559,3562,3564,3566,3568,3570,3573,3575],{"class":672,"line":718},[670,3560,3561],{"class":683},"    throw",[670,3563,1748],{"class":687},[670,3565,2021],{"class":727},[670,3567,731],{"class":744},[670,3569,817],{"class":687},[670,3571,3572],{"class":704},"Invalid email address",[670,3574,817],{"class":687},[670,3576,796],{"class":744},[670,3578,3579],{"class":672,"line":737},[670,3580,968],{"class":687},[670,3582,3583],{"class":672,"line":766},[670,3584,715],{"emptyLinePlaceholder":714},[670,3586,3587],{"class":672,"line":799},[670,3588,3589],{"class":676},"  // Business rule error - blocks creation\n",[670,3591,3592,3594,3597,3599,3602,3604,3606,3608,3610,3612,3614,3616,3618,3621,3623],{"class":672,"line":804},[670,3593,1227],{"class":740},[670,3595,3596],{"class":691}," existingUser",[670,3598,775],{"class":687},[670,3600,3601],{"class":683}," await",[670,3603,1021],{"class":691},[670,3605,785],{"class":687},[670,3607,3388],{"class":691},[670,3609,785],{"class":687},[670,3611,3293],{"class":691},[670,3613,785],{"class":687},[670,3615,855],{"class":691},[670,3617,785],{"class":687},[670,3619,3620],{"class":727},"findFirst",[670,3622,731],{"class":744},[670,3624,734],{"class":687},[670,3626,3627,3630,3632,3635,3637,3639,3641,3643,3645,3647,3649,3651],{"class":672,"line":840},[670,3628,3629],{"class":744},"    where",[670,3631,870],{"class":687},[670,3633,3634],{"class":727}," eq",[670,3636,731],{"class":744},[670,3638,855],{"class":691},[670,3640,785],{"class":687},[670,3642,1356],{"class":691},[670,3644,754],{"class":687},[670,3646,1065],{"class":691},[670,3648,785],{"class":687},[670,3650,1356],{"class":691},[670,3652,796],{"class":744},[670,3654,3655,3658],{"class":672,"line":864},[670,3656,3657],{"class":687},"  }",[670,3659,796],{"class":744},[670,3661,3662],{"class":672,"line":909},[670,3663,715],{"emptyLinePlaceholder":714},[670,3665,3666,3668,3670,3673,3675],{"class":672,"line":949},[670,3667,3515],{"class":683},[670,3669,827],{"class":744},[670,3671,3672],{"class":691},"existingUser",[670,3674,2009],{"class":744},[670,3676,734],{"class":687},[670,3678,3679,3681,3683,3685,3687,3689,3692,3694],{"class":672,"line":957},[670,3680,3561],{"class":683},[670,3682,1748],{"class":687},[670,3684,2021],{"class":727},[670,3686,731],{"class":744},[670,3688,817],{"class":687},[670,3690,3691],{"class":704},"Email already exists",[670,3693,817],{"class":687},[670,3695,796],{"class":744},[670,3697,3698],{"class":672,"line":965},[670,3699,968],{"class":687},[670,3701,3702],{"class":672,"line":971},[670,3703,715],{"emptyLinePlaceholder":714},[670,3705,3706,3709],{"class":672,"line":1412},[670,3707,3708],{"class":683},"  return",[670,3710,1087],{"class":691},[670,3712,3713],{"class":672,"line":1417},[670,3714,1184],{"class":687},[649,3716,3718],{"id":3717},"after-hooks","After Hooks",[455,3720,3721,3722,3725],{},"After hooks should not throw errors (or set ",[494,3723,3724],{},"errorHandling: 'throw'","):",[661,3727,3729],{"className":663,"code":3728,"language":665,"meta":666,"style":666},"// Default behavior: log errors, don't rollback\nafterCreate: async (user, context) => {\n  try {\n    await sendWelcomeEmail(user.email)\n  } catch (error) {\n    // Error is logged but operation continues\n    console.error('Failed to send welcome email:', error)\n  }\n}\n",[494,3730,3731,3736,3758,3765,3782,3798,3803,3827,3831],{"__ignoreMap":666},[670,3732,3733],{"class":672,"line":673},[670,3734,3735],{"class":676},"// Default behavior: log errors, don't rollback\n",[670,3737,3738,3740,3742,3744,3746,3748,3750,3752,3754,3756],{"class":672,"line":680},[670,3739,512],{"class":2901},[670,3741,870],{"class":687},[670,3743,1011],{"class":740},[670,3745,827],{"class":687},[670,3747,1046],{"class":750},[670,3749,754],{"class":687},[670,3751,1021],{"class":750},[670,3753,760],{"class":687},[670,3755,835],{"class":740},[670,3757,763],{"class":687},[670,3759,3760,3763],{"class":672,"line":711},[670,3761,3762],{"class":683},"  try",[670,3764,763],{"class":687},[670,3766,3767,3769,3772,3774,3776,3778,3780],{"class":672,"line":718},[670,3768,2284],{"class":683},[670,3770,3771],{"class":727}," sendWelcomeEmail",[670,3773,731],{"class":744},[670,3775,1046],{"class":691},[670,3777,785],{"class":687},[670,3779,1356],{"class":691},[670,3781,796],{"class":744},[670,3783,3784,3786,3789,3791,3794,3796],{"class":672,"line":737},[670,3785,3657],{"class":687},[670,3787,3788],{"class":683}," catch",[670,3790,827],{"class":744},[670,3792,3793],{"class":691},"error",[670,3795,2009],{"class":744},[670,3797,734],{"class":687},[670,3799,3800],{"class":672,"line":766},[670,3801,3802],{"class":676},"    // Error is logged but operation continues\n",[670,3804,3805,3807,3809,3811,3813,3815,3818,3820,3822,3825],{"class":672,"line":799},[670,3806,1124],{"class":691},[670,3808,785],{"class":687},[670,3810,3793],{"class":727},[670,3812,731],{"class":744},[670,3814,817],{"class":687},[670,3816,3817],{"class":704},"Failed to send welcome email:",[670,3819,817],{"class":687},[670,3821,754],{"class":687},[670,3823,3824],{"class":691}," error",[670,3826,796],{"class":744},[670,3828,3829],{"class":672,"line":804},[670,3830,968],{"class":687},[670,3832,3833],{"class":672,"line":840},[670,3834,1184],{"class":687},[455,3836,3837],{},"Configure error handling:",[661,3839,3841],{"className":663,"code":3840,"language":665,"meta":666,"style":666},"export default defineNuxtConfig({\n  autoApi: {\n    hookConfig: {\n      // 'log' (default): log errors but don't throw\n      // 'throw': throw errors and rollback\n      errorHandling: 'log',\n\n      // Hook timeout in milliseconds\n      timeout: 5000,\n\n      // Execute multiple hooks in parallel\n      parallel: false\n    }\n  }\n})\n",[494,3842,3843,3855,3863,3872,3877,3882,3897,3901,3906,3918,3922,3927,3938,3942,3946],{"__ignoreMap":666},[670,3844,3845,3847,3849,3851,3853],{"class":672,"line":673},[670,3846,721],{"class":683},[670,3848,724],{"class":683},[670,3850,1518],{"class":727},[670,3852,731],{"class":691},[670,3854,734],{"class":687},[670,3856,3857,3859,3861],{"class":672,"line":680},[670,3858,1527],{"class":744},[670,3860,870],{"class":687},[670,3862,763],{"class":687},[670,3864,3865,3868,3870],{"class":672,"line":711},[670,3866,3867],{"class":744},"    hookConfig",[670,3869,870],{"class":687},[670,3871,763],{"class":687},[670,3873,3874],{"class":672,"line":718},[670,3875,3876],{"class":676},"      // 'log' (default): log errors but don't throw\n",[670,3878,3879],{"class":672,"line":737},[670,3880,3881],{"class":676},"      // 'throw': throw errors and rollback\n",[670,3883,3884,3887,3889,3891,3893,3895],{"class":672,"line":766},[670,3885,3886],{"class":744},"      errorHandling",[670,3888,870],{"class":687},[670,3890,701],{"class":687},[670,3892,1129],{"class":704},[670,3894,817],{"class":687},[670,3896,906],{"class":687},[670,3898,3899],{"class":672,"line":799},[670,3900,715],{"emptyLinePlaceholder":714},[670,3902,3903],{"class":672,"line":804},[670,3904,3905],{"class":676},"      // Hook timeout in milliseconds\n",[670,3907,3908,3911,3913,3916],{"class":672,"line":840},[670,3909,3910],{"class":744},"      timeout",[670,3912,870],{"class":687},[670,3914,3915],{"class":2005}," 5000",[670,3917,906],{"class":687},[670,3919,3920],{"class":672,"line":864},[670,3921,715],{"emptyLinePlaceholder":714},[670,3923,3924],{"class":672,"line":909},[670,3925,3926],{"class":676},"      // Execute multiple hooks in parallel\n",[670,3928,3929,3932,3934],{"class":672,"line":949},[670,3930,3931],{"class":744},"      parallel",[670,3933,870],{"class":687},[670,3935,3937],{"class":3936},"sfNiH"," false\n",[670,3939,3940],{"class":672,"line":957},[670,3941,1477],{"class":687},[670,3943,3944],{"class":672,"line":965},[670,3945,968],{"class":687},[670,3947,3948,3950],{"class":672,"line":971},[670,3949,974],{"class":687},[670,3951,796],{"class":691},[459,3953,3955],{"id":3954},"hook-execution-in-bulk-operations","Hook Execution in Bulk Operations",[455,3957,3958],{},"Hooks execute for each item in bulk operations:",[661,3960,3962],{"className":663,"code":3961,"language":665,"meta":666,"style":666},"// Bulk create 100 users\nPOST /api/users/bulk { items: [/* 100 users */] }\n\n// beforeCreate runs 100 times (once per user)\n// afterCreate runs 100 times (once per user)\n",[494,3963,3964,3969,4008,4012,4017],{"__ignoreMap":666},[670,3965,3966],{"class":672,"line":673},[670,3967,3968],{"class":676},"// Bulk create 100 users\n",[670,3970,3971,3974,3977,3980,3982,3984,3986,3989,3992,3995,3997,4000,4003,4006],{"class":672,"line":680},[670,3972,3973],{"class":691},"POST ",[670,3975,3976],{"class":687},"/",[670,3978,3979],{"class":691},"api",[670,3981,3976],{"class":687},[670,3983,855],{"class":691},[670,3985,3976],{"class":687},[670,3987,3988],{"class":691},"bulk ",[670,3990,3991],{"class":687},"{",[670,3993,3994],{"class":2901}," items",[670,3996,870],{"class":687},[670,3998,3999],{"class":744}," [",[670,4001,4002],{"class":676},"/* 100 users */",[670,4004,4005],{"class":744},"] ",[670,4007,1184],{"class":687},[670,4009,4010],{"class":672,"line":711},[670,4011,715],{"emptyLinePlaceholder":714},[670,4013,4014],{"class":672,"line":718},[670,4015,4016],{"class":676},"// beforeCreate runs 100 times (once per user)\n",[670,4018,4019],{"class":672,"line":737},[670,4020,4021],{"class":676},"// afterCreate runs 100 times (once per user)\n",[459,4023,4025],{"id":4024},"common-use-cases","Common Use Cases",[649,4027,4029],{"id":4028},"audit-logging","Audit Logging",[661,4031,4033],{"className":663,"code":4032,"language":665,"meta":666,"style":666},"const auditHooks = {\n  afterCreate: async (record, context) => {\n    await db.insert(auditLogs).values({\n      action: `${context.resource}.created`,\n      userId: context.user.id,\n      resourceId: record.id,\n      changes: JSON.stringify(record)\n    })\n  },\n\n  afterUpdate: async (record, context) => {\n    await db.insert(auditLogs).values({\n      action: `${context.resource}.updated`,\n      userId: context.user.id,\n      resourceId: record.id,\n      changes: JSON.stringify(record)\n    })\n  }\n}\n",[494,4034,4035,4047,4070,4094,4119,4137,4152,4171,4177,4181,4185,4207,4231,4254,4272,4286,4304,4310,4314],{"__ignoreMap":666},[670,4036,4037,4040,4043,4045],{"class":672,"line":673},[670,4038,4039],{"class":740},"const",[670,4041,4042],{"class":691}," auditHooks ",[670,4044,999],{"class":687},[670,4046,763],{"class":687},[670,4048,4049,4051,4053,4055,4057,4060,4062,4064,4066,4068],{"class":672,"line":680},[670,4050,1101],{"class":727},[670,4052,870],{"class":687},[670,4054,1011],{"class":740},[670,4056,827],{"class":687},[670,4058,4059],{"class":750},"record",[670,4061,754],{"class":687},[670,4063,1021],{"class":750},[670,4065,760],{"class":687},[670,4067,835],{"class":740},[670,4069,763],{"class":687},[670,4071,4072,4074,4076,4078,4080,4082,4084,4086,4088,4090,4092],{"class":672,"line":711},[670,4073,2284],{"class":683},[670,4075,2381],{"class":691},[670,4077,785],{"class":687},[670,4079,2386],{"class":727},[670,4081,731],{"class":744},[670,4083,2391],{"class":691},[670,4085,760],{"class":744},[670,4087,785],{"class":687},[670,4089,2398],{"class":727},[670,4091,731],{"class":744},[670,4093,734],{"class":687},[670,4095,4096,4098,4100,4103,4105,4107,4110,4112,4115,4117],{"class":672,"line":718},[670,4097,2407],{"class":744},[670,4099,870],{"class":687},[670,4101,4102],{"class":687}," `${",[670,4104,1157],{"class":691},[670,4106,785],{"class":687},[670,4108,4109],{"class":691},"resource",[670,4111,974],{"class":687},[670,4113,4114],{"class":704},".created",[670,4116,1134],{"class":687},[670,4118,906],{"class":687},[670,4120,4121,4123,4125,4127,4129,4131,4133,4135],{"class":672,"line":737},[670,4122,2423],{"class":744},[670,4124,870],{"class":687},[670,4126,1021],{"class":691},[670,4128,785],{"class":687},[670,4130,1046],{"class":691},[670,4132,785],{"class":687},[670,4134,1147],{"class":691},[670,4136,906],{"class":687},[670,4138,4139,4141,4143,4146,4148,4150],{"class":672,"line":766},[670,4140,2442],{"class":744},[670,4142,870],{"class":687},[670,4144,4145],{"class":691}," record",[670,4147,785],{"class":687},[670,4149,1147],{"class":691},[670,4151,906],{"class":687},[670,4153,4154,4157,4159,4161,4163,4165,4167,4169],{"class":672,"line":799},[670,4155,4156],{"class":744},"      changes",[670,4158,870],{"class":687},[670,4160,2526],{"class":691},[670,4162,785],{"class":687},[670,4164,2531],{"class":727},[670,4166,731],{"class":744},[670,4168,4059],{"class":691},[670,4170,796],{"class":744},[670,4172,4173,4175],{"class":672,"line":804},[670,4174,960],{"class":687},[670,4176,796],{"class":744},[670,4178,4179],{"class":672,"line":840},[670,4180,1092],{"class":687},[670,4182,4183],{"class":672,"line":864},[670,4184,715],{"emptyLinePlaceholder":714},[670,4186,4187,4189,4191,4193,4195,4197,4199,4201,4203,4205],{"class":672,"line":909},[670,4188,2605],{"class":727},[670,4190,870],{"class":687},[670,4192,1011],{"class":740},[670,4194,827],{"class":687},[670,4196,4059],{"class":750},[670,4198,754],{"class":687},[670,4200,1021],{"class":750},[670,4202,760],{"class":687},[670,4204,835],{"class":740},[670,4206,763],{"class":687},[670,4208,4209,4211,4213,4215,4217,4219,4221,4223,4225,4227,4229],{"class":672,"line":949},[670,4210,2284],{"class":683},[670,4212,2381],{"class":691},[670,4214,785],{"class":687},[670,4216,2386],{"class":727},[670,4218,731],{"class":744},[670,4220,2391],{"class":691},[670,4222,760],{"class":744},[670,4224,785],{"class":687},[670,4226,2398],{"class":727},[670,4228,731],{"class":744},[670,4230,734],{"class":687},[670,4232,4233,4235,4237,4239,4241,4243,4245,4247,4250,4252],{"class":672,"line":957},[670,4234,2407],{"class":744},[670,4236,870],{"class":687},[670,4238,4102],{"class":687},[670,4240,1157],{"class":691},[670,4242,785],{"class":687},[670,4244,4109],{"class":691},[670,4246,974],{"class":687},[670,4248,4249],{"class":704},".updated",[670,4251,1134],{"class":687},[670,4253,906],{"class":687},[670,4255,4256,4258,4260,4262,4264,4266,4268,4270],{"class":672,"line":965},[670,4257,2423],{"class":744},[670,4259,870],{"class":687},[670,4261,1021],{"class":691},[670,4263,785],{"class":687},[670,4265,1046],{"class":691},[670,4267,785],{"class":687},[670,4269,1147],{"class":691},[670,4271,906],{"class":687},[670,4273,4274,4276,4278,4280,4282,4284],{"class":672,"line":971},[670,4275,2442],{"class":744},[670,4277,870],{"class":687},[670,4279,4145],{"class":691},[670,4281,785],{"class":687},[670,4283,1147],{"class":691},[670,4285,906],{"class":687},[670,4287,4288,4290,4292,4294,4296,4298,4300,4302],{"class":672,"line":1412},[670,4289,4156],{"class":744},[670,4291,870],{"class":687},[670,4293,2526],{"class":691},[670,4295,785],{"class":687},[670,4297,2531],{"class":727},[670,4299,731],{"class":744},[670,4301,4059],{"class":691},[670,4303,796],{"class":744},[670,4305,4306,4308],{"class":672,"line":1417},[670,4307,960],{"class":687},[670,4309,796],{"class":744},[670,4311,4312],{"class":672,"line":1441},[670,4313,968],{"class":687},[670,4315,4316],{"class":672,"line":1447},[670,4317,1184],{"class":687},[649,4319,4321],{"id":4320},"notifications","Notifications",[661,4323,4325],{"className":663,"code":4324,"language":665,"meta":666,"style":666},"const notificationHooks = {\n  afterCreate: async (comment, context) => {\n    // Notify post author about new comment\n    const post = await db.query.posts.findFirst({\n      where: eq(posts.id, comment.postId)\n    })\n\n    if (post && post.authorId !== context.user.id) {\n      await sendNotification(post.authorId, {\n        type: 'new_comment',\n        message: `${context.user.name} commented on your post`\n      })\n    }\n  }\n}\n",[494,4326,4327,4338,4361,4366,4395,4424,4430,4434,4468,4487,4503,4530,4536,4540,4544],{"__ignoreMap":666},[670,4328,4329,4331,4334,4336],{"class":672,"line":673},[670,4330,4039],{"class":740},[670,4332,4333],{"class":691}," notificationHooks ",[670,4335,999],{"class":687},[670,4337,763],{"class":687},[670,4339,4340,4342,4344,4346,4348,4351,4353,4355,4357,4359],{"class":672,"line":680},[670,4341,1101],{"class":727},[670,4343,870],{"class":687},[670,4345,1011],{"class":740},[670,4347,827],{"class":687},[670,4349,4350],{"class":750},"comment",[670,4352,754],{"class":687},[670,4354,1021],{"class":750},[670,4356,760],{"class":687},[670,4358,835],{"class":740},[670,4360,763],{"class":687},[670,4362,4363],{"class":672,"line":711},[670,4364,4365],{"class":676},"    // Notify post author about new comment\n",[670,4367,4368,4370,4372,4374,4376,4378,4380,4382,4384,4387,4389,4391,4393],{"class":672,"line":718},[670,4369,769],{"class":740},[670,4371,3449],{"class":691},[670,4373,775],{"class":687},[670,4375,3601],{"class":683},[670,4377,2381],{"class":691},[670,4379,785],{"class":687},[670,4381,3293],{"class":691},[670,4383,785],{"class":687},[670,4385,4386],{"class":691},"posts",[670,4388,785],{"class":687},[670,4390,3620],{"class":727},[670,4392,731],{"class":744},[670,4394,734],{"class":687},[670,4396,4397,4400,4402,4404,4406,4408,4410,4412,4414,4417,4419,4422],{"class":672,"line":737},[670,4398,4399],{"class":744},"      where",[670,4401,870],{"class":687},[670,4403,3634],{"class":727},[670,4405,731],{"class":744},[670,4407,4386],{"class":691},[670,4409,785],{"class":687},[670,4411,1147],{"class":691},[670,4413,754],{"class":687},[670,4415,4416],{"class":691}," comment",[670,4418,785],{"class":687},[670,4420,4421],{"class":691},"postId",[670,4423,796],{"class":744},[670,4425,4426,4428],{"class":672,"line":766},[670,4427,960],{"class":687},[670,4429,796],{"class":744},[670,4431,4432],{"class":672,"line":799},[670,4433,715],{"emptyLinePlaceholder":714},[670,4435,4436,4438,4440,4442,4445,4447,4449,4451,4454,4456,4458,4460,4462,4464,4466],{"class":672,"line":804},[670,4437,1990],{"class":683},[670,4439,827],{"class":744},[670,4441,3362],{"class":691},[670,4443,4444],{"class":687}," &&",[670,4446,3449],{"class":691},[670,4448,785],{"class":687},[670,4450,1714],{"class":691},[670,4452,4453],{"class":687}," !==",[670,4455,1021],{"class":691},[670,4457,785],{"class":687},[670,4459,1046],{"class":691},[670,4461,785],{"class":687},[670,4463,1147],{"class":691},[670,4465,2009],{"class":744},[670,4467,734],{"class":687},[670,4469,4470,4472,4475,4477,4479,4481,4483,4485],{"class":672,"line":840},[670,4471,1334],{"class":683},[670,4473,4474],{"class":727}," sendNotification",[670,4476,731],{"class":744},[670,4478,3362],{"class":691},[670,4480,785],{"class":687},[670,4482,1714],{"class":691},[670,4484,754],{"class":687},[670,4486,763],{"class":687},[670,4488,4489,4492,4494,4496,4499,4501],{"class":672,"line":864},[670,4490,4491],{"class":744},"        type",[670,4493,870],{"class":687},[670,4495,701],{"class":687},[670,4497,4498],{"class":704},"new_comment",[670,4500,817],{"class":687},[670,4502,906],{"class":687},[670,4504,4505,4508,4510,4512,4514,4516,4518,4520,4522,4524,4527],{"class":672,"line":909},[670,4506,4507],{"class":744},"        message",[670,4509,870],{"class":687},[670,4511,4102],{"class":687},[670,4513,1157],{"class":691},[670,4515,785],{"class":687},[670,4517,1046],{"class":691},[670,4519,785],{"class":687},[670,4521,1395],{"class":691},[670,4523,974],{"class":687},[670,4525,4526],{"class":704}," commented on your post",[670,4528,4529],{"class":687},"`\n",[670,4531,4532,4534],{"class":672,"line":949},[670,4533,952],{"class":687},[670,4535,796],{"class":744},[670,4537,4538],{"class":672,"line":957},[670,4539,1477],{"class":687},[670,4541,4542],{"class":672,"line":965},[670,4543,968],{"class":687},[670,4545,4546],{"class":672,"line":971},[670,4547,1184],{"class":687},[649,4549,4551],{"id":4550},"data-validation","Data Validation",[661,4553,4555],{"className":663,"code":4554,"language":665,"meta":666,"style":666},"const validationHooks = {\n  beforeCreate: async (data, context) => {\n    // Complex business rule validation\n    if (data.price > 1000 && !context.permissions.includes('admin')) {\n      throw new Error('Only admins can create items over $1000')\n    }\n\n    // Cross-field validation\n    if (data.discountPercent > 0 && !data.discountCode) {\n      throw new Error('Discount code required when discount is applied')\n    }\n\n    return data\n  }\n}\n",[494,4556,4557,4568,4590,4595,4641,4660,4664,4668,4673,4705,4724,4728,4732,4738,4742],{"__ignoreMap":666},[670,4558,4559,4561,4564,4566],{"class":672,"line":673},[670,4560,4039],{"class":740},[670,4562,4563],{"class":691}," validationHooks ",[670,4565,999],{"class":687},[670,4567,763],{"class":687},[670,4569,4570,4572,4574,4576,4578,4580,4582,4584,4586,4588],{"class":672,"line":680},[670,4571,1006],{"class":727},[670,4573,870],{"class":687},[670,4575,1011],{"class":740},[670,4577,827],{"class":687},[670,4579,1016],{"class":750},[670,4581,754],{"class":687},[670,4583,1021],{"class":750},[670,4585,760],{"class":687},[670,4587,835],{"class":740},[670,4589,763],{"class":687},[670,4591,4592],{"class":672,"line":711},[670,4593,4594],{"class":676},"    // Complex business rule validation\n",[670,4596,4597,4599,4601,4603,4605,4607,4610,4613,4615,4617,4619,4621,4624,4626,4628,4630,4632,4635,4637,4639],{"class":672,"line":718},[670,4598,1990],{"class":683},[670,4600,827],{"class":744},[670,4602,1016],{"class":691},[670,4604,785],{"class":687},[670,4606,1999],{"class":691},[670,4608,4609],{"class":687}," >",[670,4611,4612],{"class":2005}," 1000",[670,4614,4444],{"class":687},[670,4616,3531],{"class":687},[670,4618,1157],{"class":691},[670,4620,785],{"class":687},[670,4622,4623],{"class":691},"permissions",[670,4625,785],{"class":687},[670,4627,3542],{"class":727},[670,4629,731],{"class":744},[670,4631,817],{"class":687},[670,4633,4634],{"class":704},"admin",[670,4636,817],{"class":687},[670,4638,3554],{"class":744},[670,4640,734],{"class":687},[670,4642,4643,4645,4647,4649,4651,4653,4656,4658],{"class":672,"line":737},[670,4644,2016],{"class":683},[670,4646,1748],{"class":687},[670,4648,2021],{"class":727},[670,4650,731],{"class":744},[670,4652,817],{"class":687},[670,4654,4655],{"class":704},"Only admins can create items over $1000",[670,4657,817],{"class":687},[670,4659,796],{"class":744},[670,4661,4662],{"class":672,"line":766},[670,4663,1477],{"class":687},[670,4665,4666],{"class":672,"line":799},[670,4667,715],{"emptyLinePlaceholder":714},[670,4669,4670],{"class":672,"line":804},[670,4671,4672],{"class":676},"    // Cross-field validation\n",[670,4674,4675,4677,4679,4681,4683,4686,4688,4690,4692,4694,4696,4698,4701,4703],{"class":672,"line":840},[670,4676,1990],{"class":683},[670,4678,827],{"class":744},[670,4680,1016],{"class":691},[670,4682,785],{"class":687},[670,4684,4685],{"class":691},"discountPercent",[670,4687,4609],{"class":687},[670,4689,2006],{"class":2005},[670,4691,4444],{"class":687},[670,4693,3531],{"class":687},[670,4695,1016],{"class":691},[670,4697,785],{"class":687},[670,4699,4700],{"class":691},"discountCode",[670,4702,2009],{"class":744},[670,4704,734],{"class":687},[670,4706,4707,4709,4711,4713,4715,4717,4720,4722],{"class":672,"line":864},[670,4708,2016],{"class":683},[670,4710,1748],{"class":687},[670,4712,2021],{"class":727},[670,4714,731],{"class":744},[670,4716,817],{"class":687},[670,4718,4719],{"class":704},"Discount code required when discount is applied",[670,4721,817],{"class":687},[670,4723,796],{"class":744},[670,4725,4726],{"class":672,"line":909},[670,4727,1477],{"class":687},[670,4729,4730],{"class":672,"line":949},[670,4731,715],{"emptyLinePlaceholder":714},[670,4733,4734,4736],{"class":672,"line":957},[670,4735,1084],{"class":683},[670,4737,1087],{"class":691},[670,4739,4740],{"class":672,"line":965},[670,4741,968],{"class":687},[670,4743,4744],{"class":672,"line":971},[670,4745,1184],{"class":687},[649,4747,4749],{"id":4748},"cache-invalidation","Cache Invalidation",[661,4751,4753],{"className":663,"code":4752,"language":665,"meta":666,"style":666},"const cacheHooks = {\n  afterUpdate: async (record, context) => {\n    await clearCache(`${context.resource}:${record.id}`)\n    await clearCache(`${context.resource}:list`)\n  },\n\n  afterDelete: async (id, context) => {\n    await clearCache(`${context.resource}:${id}`)\n    await clearCache(`${context.resource}:list`)\n  }\n}\n",[494,4754,4755,4766,4788,4821,4846,4850,4854,4876,4904,4928,4932],{"__ignoreMap":666},[670,4756,4757,4759,4762,4764],{"class":672,"line":673},[670,4758,4039],{"class":740},[670,4760,4761],{"class":691}," cacheHooks ",[670,4763,999],{"class":687},[670,4765,763],{"class":687},[670,4767,4768,4770,4772,4774,4776,4778,4780,4782,4784,4786],{"class":672,"line":680},[670,4769,2605],{"class":727},[670,4771,870],{"class":687},[670,4773,1011],{"class":740},[670,4775,827],{"class":687},[670,4777,4059],{"class":750},[670,4779,754],{"class":687},[670,4781,1021],{"class":750},[670,4783,760],{"class":687},[670,4785,835],{"class":740},[670,4787,763],{"class":687},[670,4789,4790,4792,4794,4796,4799,4801,4803,4805,4807,4809,4811,4813,4815,4817,4819],{"class":672,"line":711},[670,4791,2284],{"class":683},[670,4793,1452],{"class":727},[670,4795,731],{"class":744},[670,4797,4798],{"class":687},"`${",[670,4800,1157],{"class":691},[670,4802,785],{"class":687},[670,4804,4109],{"class":691},[670,4806,974],{"class":687},[670,4808,870],{"class":704},[670,4810,1140],{"class":687},[670,4812,4059],{"class":691},[670,4814,785],{"class":687},[670,4816,1147],{"class":691},[670,4818,1168],{"class":687},[670,4820,796],{"class":744},[670,4822,4823,4825,4827,4829,4831,4833,4835,4837,4839,4842,4844],{"class":672,"line":718},[670,4824,2284],{"class":683},[670,4826,1452],{"class":727},[670,4828,731],{"class":744},[670,4830,4798],{"class":687},[670,4832,1157],{"class":691},[670,4834,785],{"class":687},[670,4836,4109],{"class":691},[670,4838,974],{"class":687},[670,4840,4841],{"class":704},":list",[670,4843,1134],{"class":687},[670,4845,796],{"class":744},[670,4847,4848],{"class":672,"line":737},[670,4849,1092],{"class":687},[670,4851,4852],{"class":672,"line":766},[670,4853,715],{"emptyLinePlaceholder":714},[670,4855,4856,4858,4860,4862,4864,4866,4868,4870,4872,4874],{"class":672,"line":799},[670,4857,2745],{"class":727},[670,4859,870],{"class":687},[670,4861,1011],{"class":740},[670,4863,827],{"class":687},[670,4865,1147],{"class":750},[670,4867,754],{"class":687},[670,4869,1021],{"class":750},[670,4871,760],{"class":687},[670,4873,835],{"class":740},[670,4875,763],{"class":687},[670,4877,4878,4880,4882,4884,4886,4888,4890,4892,4894,4896,4898,4900,4902],{"class":672,"line":804},[670,4879,2284],{"class":683},[670,4881,1452],{"class":727},[670,4883,731],{"class":744},[670,4885,4798],{"class":687},[670,4887,1157],{"class":691},[670,4889,785],{"class":687},[670,4891,4109],{"class":691},[670,4893,974],{"class":687},[670,4895,870],{"class":704},[670,4897,1140],{"class":687},[670,4899,1147],{"class":691},[670,4901,1168],{"class":687},[670,4903,796],{"class":744},[670,4905,4906,4908,4910,4912,4914,4916,4918,4920,4922,4924,4926],{"class":672,"line":840},[670,4907,2284],{"class":683},[670,4909,1452],{"class":727},[670,4911,731],{"class":744},[670,4913,4798],{"class":687},[670,4915,1157],{"class":691},[670,4917,785],{"class":687},[670,4919,4109],{"class":691},[670,4921,974],{"class":687},[670,4923,4841],{"class":704},[670,4925,1134],{"class":687},[670,4927,796],{"class":744},[670,4929,4930],{"class":672,"line":864},[670,4931,968],{"class":687},[670,4933,4934],{"class":672,"line":909},[670,4935,1184],{"class":687},[649,4937,4939],{"id":4938},"external-service-integration","External Service Integration",[661,4941,4943],{"className":663,"code":4942,"language":665,"meta":666,"style":666},"const integrationHooks = {\n  afterCreate: async (customer, context) => {\n    // Sync to CRM\n    await fetch('https://crm.example.com/api/customers', {\n      method: 'POST',\n      body: JSON.stringify(customer)\n    })\n\n    // Add to mailing list\n    await mailchimp.lists.addMember({\n      email: customer.email,\n      firstName: customer.firstName,\n      lastName: customer.lastName\n    })\n  }\n}\n",[494,4944,4945,4956,4979,4984,5003,5017,5035,5041,5045,5050,5071,5087,5103,5117,5123,5127],{"__ignoreMap":666},[670,4946,4947,4949,4952,4954],{"class":672,"line":673},[670,4948,4039],{"class":740},[670,4950,4951],{"class":691}," integrationHooks ",[670,4953,999],{"class":687},[670,4955,763],{"class":687},[670,4957,4958,4960,4962,4964,4966,4969,4971,4973,4975,4977],{"class":672,"line":680},[670,4959,1101],{"class":727},[670,4961,870],{"class":687},[670,4963,1011],{"class":740},[670,4965,827],{"class":687},[670,4967,4968],{"class":750},"customer",[670,4970,754],{"class":687},[670,4972,1021],{"class":750},[670,4974,760],{"class":687},[670,4976,835],{"class":740},[670,4978,763],{"class":687},[670,4980,4981],{"class":672,"line":711},[670,4982,4983],{"class":676},"    // Sync to CRM\n",[670,4985,4986,4988,4990,4992,4994,4997,4999,5001],{"class":672,"line":718},[670,4987,2284],{"class":683},[670,4989,2487],{"class":727},[670,4991,731],{"class":744},[670,4993,817],{"class":687},[670,4995,4996],{"class":704},"https://crm.example.com/api/customers",[670,4998,817],{"class":687},[670,5000,754],{"class":687},[670,5002,763],{"class":687},[670,5004,5005,5007,5009,5011,5013,5015],{"class":672,"line":737},[670,5006,2505],{"class":744},[670,5008,870],{"class":687},[670,5010,701],{"class":687},[670,5012,2512],{"class":704},[670,5014,817],{"class":687},[670,5016,906],{"class":687},[670,5018,5019,5021,5023,5025,5027,5029,5031,5033],{"class":672,"line":766},[670,5020,2521],{"class":744},[670,5022,870],{"class":687},[670,5024,2526],{"class":691},[670,5026,785],{"class":687},[670,5028,2531],{"class":727},[670,5030,731],{"class":744},[670,5032,4968],{"class":691},[670,5034,796],{"class":744},[670,5036,5037,5039],{"class":672,"line":799},[670,5038,960],{"class":687},[670,5040,796],{"class":744},[670,5042,5043],{"class":672,"line":804},[670,5044,715],{"emptyLinePlaceholder":714},[670,5046,5047],{"class":672,"line":840},[670,5048,5049],{"class":676},"    // Add to mailing list\n",[670,5051,5052,5054,5057,5059,5062,5064,5067,5069],{"class":672,"line":864},[670,5053,2284],{"class":683},[670,5055,5056],{"class":691}," mailchimp",[670,5058,785],{"class":687},[670,5060,5061],{"class":691},"lists",[670,5063,785],{"class":687},[670,5065,5066],{"class":727},"addMember",[670,5068,731],{"class":744},[670,5070,734],{"class":687},[670,5072,5073,5076,5078,5081,5083,5085],{"class":672,"line":909},[670,5074,5075],{"class":744},"      email",[670,5077,870],{"class":687},[670,5079,5080],{"class":691}," customer",[670,5082,785],{"class":687},[670,5084,1356],{"class":691},[670,5086,906],{"class":687},[670,5088,5089,5092,5094,5096,5098,5101],{"class":672,"line":949},[670,5090,5091],{"class":744},"      firstName",[670,5093,870],{"class":687},[670,5095,5080],{"class":691},[670,5097,785],{"class":687},[670,5099,5100],{"class":691},"firstName",[670,5102,906],{"class":687},[670,5104,5105,5108,5110,5112,5114],{"class":672,"line":957},[670,5106,5107],{"class":744},"      lastName",[670,5109,870],{"class":687},[670,5111,5080],{"class":691},[670,5113,785],{"class":687},[670,5115,5116],{"class":691},"lastName\n",[670,5118,5119,5121],{"class":672,"line":965},[670,5120,960],{"class":687},[670,5122,796],{"class":744},[670,5124,5125],{"class":672,"line":971},[670,5126,968],{"class":687},[670,5128,5129],{"class":672,"line":1412},[670,5130,1184],{"class":687},[459,5132,5134],{"id":5133},"best-practices","Best Practices",[1795,5136,5137,5143,5149,5155,5161,5167,5173,5179,5185,5191],{},[1798,5138,5139,5142],{},[656,5140,5141],{},"Keep hooks focused",": One responsibility per hook",[1798,5144,5145,5148],{},[656,5146,5147],{},"Handle errors",": Use try-catch in after hooks",[1798,5150,5151,5154],{},[656,5152,5153],{},"Don't query in before hooks",": Data should already be validated",[1798,5156,5157,5160],{},[656,5158,5159],{},"Use after hooks for async operations",": Email, webhooks, etc.",[1798,5162,5163,5166],{},[656,5164,5165],{},"Return modified data from before hooks",": Always return the data object",[1798,5168,5169,5172],{},[656,5170,5171],{},"Don't modify data in after hooks",": Too late, data is already saved",[1798,5174,5175,5178],{},[656,5176,5177],{},"Log important operations",": Especially in production",[1798,5180,5181,5184],{},[656,5182,5183],{},"Test hooks thoroughly",": They can break your API if buggy",[1798,5186,5187,5190],{},[656,5188,5189],{},"Use transactions carefully",": After hooks run outside transaction scope",[1798,5192,5193,5196],{},[656,5194,5195],{},"Monitor hook performance",": Set appropriate timeouts",[459,5198,5200],{"id":5199},"migration-path","Migration Path",[455,5202,5203],{},"If you have custom handlers, migrate to hooks:",[661,5205,5207],{"className":663,"code":5206,"language":665,"meta":666,"style":666},"// Before: Custom handler\nexport default defineEventHandler(async (event) => {\n  const body = await readBody(event)\n\n  // Custom logic\n  body.createdBy = event.context.user.id\n  body.status = 'active'\n\n  const user = await db.insert(users).values(body).returning()\n\n  // Send email\n  await sendWelcomeEmail(user.email)\n\n  return { data: user }\n})\n\n// After: Use hooks\nexport const userHooks = {\n  beforeCreate: async (data, context) => {\n    data.createdBy = context.user.id\n    data.status = 'active'\n    return data\n  },\n\n  afterCreate: async (user, context) => {\n    await sendWelcomeEmail(user.email)\n  }\n}\n",[494,5208,5209,5214,5239,5259,5263,5268,5294,5310,5314,5354,5358,5363,5380,5384,5398,5404,5408,5413,5425,5447,5467,5483,5489,5493,5497,5519,5535,5539],{"__ignoreMap":666},[670,5210,5211],{"class":672,"line":673},[670,5212,5213],{"class":676},"// Before: Custom handler\n",[670,5215,5216,5218,5220,5223,5225,5228,5230,5233,5235,5237],{"class":672,"line":680},[670,5217,721],{"class":683},[670,5219,724],{"class":683},[670,5221,5222],{"class":727}," defineEventHandler",[670,5224,731],{"class":691},[670,5226,5227],{"class":740},"async",[670,5229,827],{"class":687},[670,5231,5232],{"class":750},"event",[670,5234,760],{"class":687},[670,5236,835],{"class":740},[670,5238,763],{"class":687},[670,5240,5241,5243,5246,5248,5250,5253,5255,5257],{"class":672,"line":711},[670,5242,1227],{"class":740},[670,5244,5245],{"class":691}," body",[670,5247,775],{"class":687},[670,5249,3601],{"class":683},[670,5251,5252],{"class":727}," readBody",[670,5254,731],{"class":744},[670,5256,5232],{"class":691},[670,5258,796],{"class":744},[670,5260,5261],{"class":672,"line":718},[670,5262,715],{"emptyLinePlaceholder":714},[670,5264,5265],{"class":672,"line":737},[670,5266,5267],{"class":676},"  // Custom logic\n",[670,5269,5270,5273,5275,5277,5279,5282,5284,5286,5288,5290,5292],{"class":672,"line":766},[670,5271,5272],{"class":691},"  body",[670,5274,785],{"class":687},[670,5276,1037],{"class":691},[670,5278,775],{"class":687},[670,5280,5281],{"class":691}," event",[670,5283,785],{"class":687},[670,5285,1157],{"class":691},[670,5287,785],{"class":687},[670,5289,1046],{"class":691},[670,5291,785],{"class":687},[670,5293,1051],{"class":691},[670,5295,5296,5298,5300,5302,5304,5306,5308],{"class":672,"line":799},[670,5297,5272],{"class":691},[670,5299,785],{"class":687},[670,5301,1060],{"class":691},[670,5303,775],{"class":687},[670,5305,701],{"class":687},[670,5307,1077],{"class":704},[670,5309,708],{"class":687},[670,5311,5312],{"class":672,"line":804},[670,5313,715],{"emptyLinePlaceholder":714},[670,5315,5316,5318,5320,5322,5324,5326,5328,5330,5332,5334,5336,5338,5340,5342,5345,5347,5349,5352],{"class":672,"line":840},[670,5317,1227],{"class":740},[670,5319,1351],{"class":691},[670,5321,775],{"class":687},[670,5323,3601],{"class":683},[670,5325,2381],{"class":691},[670,5327,785],{"class":687},[670,5329,2386],{"class":727},[670,5331,731],{"class":744},[670,5333,855],{"class":691},[670,5335,760],{"class":744},[670,5337,785],{"class":687},[670,5339,2398],{"class":727},[670,5341,731],{"class":744},[670,5343,5344],{"class":691},"body",[670,5346,760],{"class":744},[670,5348,785],{"class":687},[670,5350,5351],{"class":727},"returning",[670,5353,1754],{"class":744},[670,5355,5356],{"class":672,"line":864},[670,5357,715],{"emptyLinePlaceholder":714},[670,5359,5360],{"class":672,"line":909},[670,5361,5362],{"class":676},"  // Send email\n",[670,5364,5365,5368,5370,5372,5374,5376,5378],{"class":672,"line":949},[670,5366,5367],{"class":683},"  await",[670,5369,3771],{"class":727},[670,5371,731],{"class":744},[670,5373,1046],{"class":691},[670,5375,785],{"class":687},[670,5377,1356],{"class":691},[670,5379,796],{"class":744},[670,5381,5382],{"class":672,"line":957},[670,5383,715],{"emptyLinePlaceholder":714},[670,5385,5386,5388,5390,5392,5394,5396],{"class":672,"line":965},[670,5387,3708],{"class":683},[670,5389,688],{"class":687},[670,5391,1065],{"class":744},[670,5393,870],{"class":687},[670,5395,1351],{"class":691},[670,5397,1398],{"class":687},[670,5399,5400,5402],{"class":672,"line":971},[670,5401,974],{"class":687},[670,5403,796],{"class":691},[670,5405,5406],{"class":672,"line":1412},[670,5407,715],{"emptyLinePlaceholder":714},[670,5409,5410],{"class":672,"line":1417},[670,5411,5412],{"class":676},"// After: Use hooks\n",[670,5414,5415,5417,5419,5421,5423],{"class":672,"line":1441},[670,5416,721],{"class":683},[670,5418,993],{"class":740},[670,5420,996],{"class":691},[670,5422,999],{"class":687},[670,5424,763],{"class":687},[670,5426,5427,5429,5431,5433,5435,5437,5439,5441,5443,5445],{"class":672,"line":1447},[670,5428,1006],{"class":727},[670,5430,870],{"class":687},[670,5432,1011],{"class":740},[670,5434,827],{"class":687},[670,5436,1016],{"class":750},[670,5438,754],{"class":687},[670,5440,1021],{"class":750},[670,5442,760],{"class":687},[670,5444,835],{"class":740},[670,5446,763],{"class":687},[670,5448,5449,5451,5453,5455,5457,5459,5461,5463,5465],{"class":672,"line":1474},[670,5450,1032],{"class":691},[670,5452,785],{"class":687},[670,5454,1037],{"class":691},[670,5456,775],{"class":687},[670,5458,1021],{"class":691},[670,5460,785],{"class":687},[670,5462,1046],{"class":691},[670,5464,785],{"class":687},[670,5466,1051],{"class":691},[670,5468,5469,5471,5473,5475,5477,5479,5481],{"class":672,"line":1480},[670,5470,1032],{"class":691},[670,5472,785],{"class":687},[670,5474,1060],{"class":691},[670,5476,775],{"class":687},[670,5478,701],{"class":687},[670,5480,1077],{"class":704},[670,5482,708],{"class":687},[670,5484,5485,5487],{"class":672,"line":1485},[670,5486,1084],{"class":683},[670,5488,1087],{"class":691},[670,5490,5491],{"class":672,"line":1772},[670,5492,1092],{"class":687},[670,5494,5495],{"class":672,"line":1777},[670,5496,715],{"emptyLinePlaceholder":714},[670,5498,5499,5501,5503,5505,5507,5509,5511,5513,5515,5517],{"class":672,"line":1782},[670,5500,1101],{"class":727},[670,5502,870],{"class":687},[670,5504,1011],{"class":740},[670,5506,827],{"class":687},[670,5508,1046],{"class":750},[670,5510,754],{"class":687},[670,5512,1021],{"class":750},[670,5514,760],{"class":687},[670,5516,835],{"class":740},[670,5518,763],{"class":687},[670,5520,5521,5523,5525,5527,5529,5531,5533],{"class":672,"line":2171},[670,5522,2284],{"class":683},[670,5524,3771],{"class":727},[670,5526,731],{"class":744},[670,5528,1046],{"class":691},[670,5530,785],{"class":687},[670,5532,1356],{"class":691},[670,5534,796],{"class":744},[670,5536,5537],{"class":672,"line":2176},[670,5538,968],{"class":687},[670,5540,5541],{"class":672,"line":2182},[670,5542,1184],{"class":687},[455,5544,5545],{},"Benefits:",[5547,5548,5549,5552,5555,5558,5561],"ul",{},[1798,5550,5551],{},"Automatic validation",[1798,5553,5554],{},"Authorization checks",[1798,5556,5557],{},"Multi-tenancy support",[1798,5559,5560],{},"Consistent error handling",[1798,5562,5563],{},"Works with bulk operations",[5565,5566,5567],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":666,"searchDepth":680,"depth":680,"links":5569},[5570,5571,5576,5577,5578,5579,5580,5584,5585,5592,5593],{"id":461,"depth":680,"text":462},{"id":643,"depth":680,"text":644,"children":5572},[5573,5574,5575],{"id":651,"depth":711,"text":652},{"id":1187,"depth":711,"text":1188},{"id":1492,"depth":711,"text":1493},{"id":1789,"depth":680,"text":1790},{"id":1848,"depth":680,"text":1849},{"id":2229,"depth":680,"text":2230},{"id":2880,"depth":680,"text":2881},{"id":3470,"depth":680,"text":3471,"children":5581},[5582,5583],{"id":3474,"depth":711,"text":3475},{"id":3717,"depth":711,"text":3718},{"id":3954,"depth":680,"text":3955},{"id":4024,"depth":680,"text":4025,"children":5586},[5587,5588,5589,5590,5591],{"id":4028,"depth":711,"text":4029},{"id":4320,"depth":711,"text":4321},{"id":4550,"depth":711,"text":4551},{"id":4748,"depth":711,"text":4749},{"id":4938,"depth":711,"text":4939},{"id":5133,"depth":680,"text":5134},{"id":5199,"depth":680,"text":5200},"md",null,{},{"title":215,"description":457},"0epEKKt0yFe_U6AJgmHFPrV0W75rsojjoPil-I97mAA",[5600,5602],{"title":211,"path":212,"stem":213,"description":5601,"children":-1},"Nuxt Auto API provides powerful aggregation capabilities for analyzing your data, including simple aggregates on list endpoints and complex grouped aggregations.",{"title":219,"path":220,"stem":221,"description":5603,"children":-1},"This guide covers how to work with many-to-many relationships in @websideproject/nuxt-auto-api.",1772977478013]