[{"data":1,"prerenderedAt":6752},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-auto/auto-api/request-metadata-en":444,"/docs/nuxt-auto/auto-api/request-metadata-surround-en":6747},[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":6743},{"id":446,"title":247,"body":447,"description":457,"extension":6742,"links":6743,"meta":6744,"navigation":6743,"ogImage":6743,"path":248,"seo":6745,"stem":249,"__hash__":6746},"nuxt_auto/0.docs/3.nuxt-auto/2.auto-api/21.request-metadata.md",{"type":448,"value":449,"toc":6696},"minimark",[450,454,458,462,470,512,516,521,524,665,668,893,897,900,1142,1149,1222,1226,1233,1236,1390,1396,1457,1463,1466,1471,1474,1535,1540,1551,1555,1558,1762,1767,1888,1895,1936,1940,2021,2025,2028,2328,2332,2348,2354,2360,2446,2452,2455,2489,2492,2496,2500,2503,2734,2738,2741,2955,2959,2962,3146,3150,3153,3272,3276,3279,3566,3570,3573,3827,3832,3846,3850,3854,4115,4119,4366,4370,4575,4579,4588,4735,4739,4743,4748,4880,4884,4889,5064,5068,5071,5143,5147,5150,5280,5284,5287,5347,5351,5354,5483,5486,5600,5604,5698,5702,5706,5726,5729,5740,5744,5761,5765,6671,6675,6692],[451,452,247],"h1",{"id":453},"request-metadata-plugin",[455,456,457],"p",{},"The Request Metadata Plugin automatically captures request metadata (IP address, geolocation, user-agent, etc.) and makes it available throughout your API handlers. It supports both context-only access (for hooks and authorization) and optional database persistence.",[459,460,194],"h2",{"id":461},"installation",[455,463,464,465,469],{},"The plugin is included with ",[466,467,468],"code",{},"@websideproject/nuxt-auto-api"," and can be imported from the plugins index:",[471,472,477],"pre",{"className":473,"code":474,"language":475,"meta":476,"style":476},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createRequestMetadataPlugin } from '@websideproject/nuxt-auto-api/plugins'\n","typescript","",[466,478,479],{"__ignoreMap":476},[480,481,484,488,492,496,499,502,505,509],"span",{"class":482,"line":483},"line",1,[480,485,487],{"class":486},"s7zQu","import",[480,489,491],{"class":490},"sMK4o"," {",[480,493,495],{"class":494},"sTEyZ"," createRequestMetadataPlugin",[480,497,498],{"class":490}," }",[480,500,501],{"class":486}," from",[480,503,504],{"class":490}," '",[480,506,508],{"class":507},"sfazB","@websideproject/nuxt-auto-api/plugins",[480,510,511],{"class":490},"'\n",[459,513,515],{"id":514},"basic-usage","Basic Usage",[517,518,520],"h3",{"id":519},"context-only-no-database-storage","Context-Only (No Database Storage)",[455,522,523],{},"Use this when you only need metadata for hooks, logging, or authorization decisions:",[471,525,527],{"className":473,"code":526,"language":475,"meta":476,"style":476},"// server/plugins/autoapi.ts\nimport { createRequestMetadataPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport default defineNitroPlugin(() => {\n  // Plugin configuration...\n  plugins: [\n    createRequestMetadataPlugin({\n      autoPopulate: false,  // Don't write to DB\n    }),\n  ],\n})\n",[466,528,529,535,554,561,587,593,607,618,636,648,656],{"__ignoreMap":476},[480,530,531],{"class":482,"line":483},[480,532,534],{"class":533},"sHwdD","// server/plugins/autoapi.ts\n",[480,536,538,540,542,544,546,548,550,552],{"class":482,"line":537},2,[480,539,487],{"class":486},[480,541,491],{"class":490},[480,543,495],{"class":494},[480,545,498],{"class":490},[480,547,501],{"class":486},[480,549,504],{"class":490},[480,551,508],{"class":507},[480,553,511],{"class":490},[480,555,557],{"class":482,"line":556},3,[480,558,560],{"emptyLinePlaceholder":559},true,"\n",[480,562,564,567,570,574,577,580,584],{"class":482,"line":563},4,[480,565,566],{"class":486},"export",[480,568,569],{"class":486}," default",[480,571,573],{"class":572},"s2Zo4"," defineNitroPlugin",[480,575,576],{"class":494},"(",[480,578,579],{"class":490},"()",[480,581,583],{"class":582},"spNyl"," =>",[480,585,586],{"class":490}," {\n",[480,588,590],{"class":482,"line":589},5,[480,591,592],{"class":533},"  // Plugin configuration...\n",[480,594,596,600,603],{"class":482,"line":595},6,[480,597,599],{"class":598},"sBMFI","  plugins",[480,601,602],{"class":490},":",[480,604,606],{"class":605},"swJcz"," [\n",[480,608,610,613,615],{"class":482,"line":609},7,[480,611,612],{"class":572},"    createRequestMetadataPlugin",[480,614,576],{"class":605},[480,616,617],{"class":490},"{\n",[480,619,621,624,626,630,633],{"class":482,"line":620},8,[480,622,623],{"class":605},"      autoPopulate",[480,625,602],{"class":490},[480,627,629],{"class":628},"sfNiH"," false",[480,631,632],{"class":490},",",[480,634,635],{"class":533},"  // Don't write to DB\n",[480,637,639,642,645],{"class":482,"line":638},9,[480,640,641],{"class":490},"    }",[480,643,644],{"class":605},")",[480,646,647],{"class":490},",\n",[480,649,651,654],{"class":482,"line":650},10,[480,652,653],{"class":605},"  ]",[480,655,647],{"class":490},[480,657,659,662],{"class":482,"line":658},11,[480,660,661],{"class":490},"}",[480,663,664],{"class":494},")\n",[455,666,667],{},"Access metadata in hooks:",[471,669,671],{"className":473,"code":670,"language":475,"meta":476,"style":476},"autoApi: {\n  hooks: {\n    users: {\n      afterCreate: async (result, context) => {\n        // Metadata available in context\n        const country = context.requestMeta?.country || 'US'\n        const ip = context.requestMeta?.ip\n\n        // Send localized welcome email\n        await sendWelcomeEmail(result.email, country)\n\n        // Log for analytics\n        console.log(`New user from ${country}: ${ip}`)\n      }\n    }\n  }\n}\n",[466,672,673,682,691,700,728,733,768,788,792,797,820,824,830,869,875,881,887],{"__ignoreMap":476},[480,674,675,678,680],{"class":482,"line":483},[480,676,677],{"class":598},"autoApi",[480,679,602],{"class":490},[480,681,586],{"class":490},[480,683,684,687,689],{"class":482,"line":537},[480,685,686],{"class":598},"  hooks",[480,688,602],{"class":490},[480,690,586],{"class":490},[480,692,693,696,698],{"class":482,"line":556},[480,694,695],{"class":598},"    users",[480,697,602],{"class":490},[480,699,586],{"class":490},[480,701,702,705,707,710,713,717,719,722,724,726],{"class":482,"line":563},[480,703,704],{"class":598},"      afterCreate",[480,706,602],{"class":490},[480,708,709],{"class":582}," async",[480,711,712],{"class":490}," (",[480,714,716],{"class":715},"sHdIc","result",[480,718,632],{"class":490},[480,720,721],{"class":715}," context",[480,723,644],{"class":490},[480,725,583],{"class":582},[480,727,586],{"class":490},[480,729,730],{"class":482,"line":589},[480,731,732],{"class":533},"        // Metadata available in context\n",[480,734,735,738,741,744,746,749,752,755,758,761,763,766],{"class":482,"line":595},[480,736,737],{"class":582},"        const",[480,739,740],{"class":494}," country",[480,742,743],{"class":490}," =",[480,745,721],{"class":494},[480,747,748],{"class":490},".",[480,750,751],{"class":494},"requestMeta",[480,753,754],{"class":490},"?.",[480,756,757],{"class":494},"country",[480,759,760],{"class":490}," ||",[480,762,504],{"class":490},[480,764,765],{"class":507},"US",[480,767,511],{"class":490},[480,769,770,772,775,777,779,781,783,785],{"class":482,"line":609},[480,771,737],{"class":582},[480,773,774],{"class":494}," ip",[480,776,743],{"class":490},[480,778,721],{"class":494},[480,780,748],{"class":490},[480,782,751],{"class":494},[480,784,754],{"class":490},[480,786,787],{"class":494},"ip\n",[480,789,790],{"class":482,"line":620},[480,791,560],{"emptyLinePlaceholder":559},[480,793,794],{"class":482,"line":638},[480,795,796],{"class":533},"        // Send localized welcome email\n",[480,798,799,802,805,807,809,811,814,816,818],{"class":482,"line":650},[480,800,801],{"class":486},"        await",[480,803,804],{"class":572}," sendWelcomeEmail",[480,806,576],{"class":605},[480,808,716],{"class":494},[480,810,748],{"class":490},[480,812,813],{"class":494},"email",[480,815,632],{"class":490},[480,817,740],{"class":494},[480,819,664],{"class":605},[480,821,822],{"class":482,"line":658},[480,823,560],{"emptyLinePlaceholder":559},[480,825,827],{"class":482,"line":826},12,[480,828,829],{"class":533},"        // Log for analytics\n",[480,831,833,836,838,841,843,846,849,852,854,856,859,861,864,867],{"class":482,"line":832},13,[480,834,835],{"class":494},"        console",[480,837,748],{"class":490},[480,839,840],{"class":572},"log",[480,842,576],{"class":605},[480,844,845],{"class":490},"`",[480,847,848],{"class":507},"New user from ",[480,850,851],{"class":490},"${",[480,853,757],{"class":494},[480,855,661],{"class":490},[480,857,858],{"class":507},": ",[480,860,851],{"class":490},[480,862,863],{"class":494},"ip",[480,865,866],{"class":490},"}`",[480,868,664],{"class":605},[480,870,872],{"class":482,"line":871},14,[480,873,874],{"class":490},"      }\n",[480,876,878],{"class":482,"line":877},15,[480,879,880],{"class":490},"    }\n",[480,882,884],{"class":482,"line":883},16,[480,885,886],{"class":490},"  }\n",[480,888,890],{"class":482,"line":889},17,[480,891,892],{"class":490},"}\n",[517,894,896],{"id":895},"auto-population-database-storage","Auto-Population (Database Storage)",[455,898,899],{},"Store metadata in database columns automatically on create/update operations:",[471,901,903],{"className":473,"code":902,"language":475,"meta":476,"style":476},"// Schema with metadata columns\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  email: text('email').notNull(),\n  signupIp: text('signup_ip'),\n  signupCountry: text('signup_country'),\n})\n\n// Plugin configuration\ncreateRequestMetadataPlugin({\n  autoPopulate: {\n    ip: 'signupIp',\n    country: 'signupCountry'\n  },\n  autoPopulateOn: ['create'],  // Only on signup\n})\n",[466,904,905,910,940,970,999,1021,1043,1049,1053,1058,1067,1076,1092,1106,1111,1136],{"__ignoreMap":476},[480,906,907],{"class":482,"line":483},[480,908,909],{"class":533},"// Schema with metadata columns\n",[480,911,912,914,917,920,923,926,928,931,934,936,938],{"class":482,"line":537},[480,913,566],{"class":486},[480,915,916],{"class":582}," const",[480,918,919],{"class":494}," users ",[480,921,922],{"class":490},"=",[480,924,925],{"class":572}," sqliteTable",[480,927,576],{"class":494},[480,929,930],{"class":490},"'",[480,932,933],{"class":507},"users",[480,935,930],{"class":490},[480,937,632],{"class":490},[480,939,586],{"class":490},[480,941,942,945,947,950,952,954,957,959,961,963,966,968],{"class":482,"line":556},[480,943,944],{"class":605},"  id",[480,946,602],{"class":490},[480,948,949],{"class":572}," integer",[480,951,576],{"class":494},[480,953,930],{"class":490},[480,955,956],{"class":507},"id",[480,958,930],{"class":490},[480,960,644],{"class":494},[480,962,748],{"class":490},[480,964,965],{"class":572},"primaryKey",[480,967,579],{"class":494},[480,969,647],{"class":490},[480,971,972,975,977,980,982,984,986,988,990,992,995,997],{"class":482,"line":563},[480,973,974],{"class":605},"  email",[480,976,602],{"class":490},[480,978,979],{"class":572}," text",[480,981,576],{"class":494},[480,983,930],{"class":490},[480,985,813],{"class":507},[480,987,930],{"class":490},[480,989,644],{"class":494},[480,991,748],{"class":490},[480,993,994],{"class":572},"notNull",[480,996,579],{"class":494},[480,998,647],{"class":490},[480,1000,1001,1004,1006,1008,1010,1012,1015,1017,1019],{"class":482,"line":589},[480,1002,1003],{"class":605},"  signupIp",[480,1005,602],{"class":490},[480,1007,979],{"class":572},[480,1009,576],{"class":494},[480,1011,930],{"class":490},[480,1013,1014],{"class":507},"signup_ip",[480,1016,930],{"class":490},[480,1018,644],{"class":494},[480,1020,647],{"class":490},[480,1022,1023,1026,1028,1030,1032,1034,1037,1039,1041],{"class":482,"line":595},[480,1024,1025],{"class":605},"  signupCountry",[480,1027,602],{"class":490},[480,1029,979],{"class":572},[480,1031,576],{"class":494},[480,1033,930],{"class":490},[480,1035,1036],{"class":507},"signup_country",[480,1038,930],{"class":490},[480,1040,644],{"class":494},[480,1042,647],{"class":490},[480,1044,1045,1047],{"class":482,"line":609},[480,1046,661],{"class":490},[480,1048,664],{"class":494},[480,1050,1051],{"class":482,"line":620},[480,1052,560],{"emptyLinePlaceholder":559},[480,1054,1055],{"class":482,"line":638},[480,1056,1057],{"class":533},"// Plugin configuration\n",[480,1059,1060,1063,1065],{"class":482,"line":650},[480,1061,1062],{"class":572},"createRequestMetadataPlugin",[480,1064,576],{"class":494},[480,1066,617],{"class":490},[480,1068,1069,1072,1074],{"class":482,"line":658},[480,1070,1071],{"class":605},"  autoPopulate",[480,1073,602],{"class":490},[480,1075,586],{"class":490},[480,1077,1078,1081,1083,1085,1088,1090],{"class":482,"line":826},[480,1079,1080],{"class":605},"    ip",[480,1082,602],{"class":490},[480,1084,504],{"class":490},[480,1086,1087],{"class":507},"signupIp",[480,1089,930],{"class":490},[480,1091,647],{"class":490},[480,1093,1094,1097,1099,1101,1104],{"class":482,"line":832},[480,1095,1096],{"class":605},"    country",[480,1098,602],{"class":490},[480,1100,504],{"class":490},[480,1102,1103],{"class":507},"signupCountry",[480,1105,511],{"class":490},[480,1107,1108],{"class":482,"line":871},[480,1109,1110],{"class":490},"  },\n",[480,1112,1113,1116,1118,1121,1123,1126,1128,1131,1133],{"class":482,"line":877},[480,1114,1115],{"class":605},"  autoPopulateOn",[480,1117,602],{"class":490},[480,1119,1120],{"class":494}," [",[480,1122,930],{"class":490},[480,1124,1125],{"class":507},"create",[480,1127,930],{"class":490},[480,1129,1130],{"class":494},"]",[480,1132,632],{"class":490},[480,1134,1135],{"class":533},"  // Only on signup\n",[480,1137,1138,1140],{"class":482,"line":883},[480,1139,661],{"class":490},[480,1141,664],{"class":494},[455,1143,1144,1145,1148],{},"When a user signs up via ",[466,1146,1147],{},"POST /api/users",", the record will include:",[471,1150,1154],{"className":1151,"code":1152,"language":1153,"meta":476,"style":476},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"email\": \"user@example.com\",\n  \"signupIp\": \"1.2.3.4\",\n  \"signupCountry\": \"US\"\n}\n","json",[466,1155,1156,1160,1182,1201,1218],{"__ignoreMap":476},[480,1157,1158],{"class":482,"line":483},[480,1159,617],{"class":490},[480,1161,1162,1165,1167,1170,1172,1175,1178,1180],{"class":482,"line":537},[480,1163,1164],{"class":490},"  \"",[480,1166,813],{"class":582},[480,1168,1169],{"class":490},"\"",[480,1171,602],{"class":490},[480,1173,1174],{"class":490}," \"",[480,1176,1177],{"class":507},"user@example.com",[480,1179,1169],{"class":490},[480,1181,647],{"class":490},[480,1183,1184,1186,1188,1190,1192,1194,1197,1199],{"class":482,"line":556},[480,1185,1164],{"class":490},[480,1187,1087],{"class":582},[480,1189,1169],{"class":490},[480,1191,602],{"class":490},[480,1193,1174],{"class":490},[480,1195,1196],{"class":507},"1.2.3.4",[480,1198,1169],{"class":490},[480,1200,647],{"class":490},[480,1202,1203,1205,1207,1209,1211,1213,1215],{"class":482,"line":563},[480,1204,1164],{"class":490},[480,1206,1103],{"class":582},[480,1208,1169],{"class":490},[480,1210,602],{"class":490},[480,1212,1174],{"class":490},[480,1214,765],{"class":507},[480,1216,1217],{"class":490},"\"\n",[480,1219,1220],{"class":482,"line":589},[480,1221,892],{"class":490},[459,1223,1225],{"id":1224},"configuration-options","Configuration Options",[517,1227,1229,1232],{"id":1228},"extract-optional",[466,1230,1231],{},"extract"," (optional)",[455,1234,1235],{},"Custom function to extract metadata from the request. Defaults to Cloudflare headers with fallback to standard headers.",[471,1237,1239],{"className":473,"code":1238,"language":475,"meta":476,"style":476},"createRequestMetadataPlugin({\n  extract: async (event) => {\n    const ip = getRequestIP(event)\n    const geo = await geoipService.lookup(ip)\n\n    return {\n      ip,\n      country: geo?.country,\n      city: geo?.city,\n      customField: 'value'\n    }\n  }\n})\n",[466,1240,1241,1249,1269,1287,1313,1317,1324,1331,1346,1362,1376,1380,1384],{"__ignoreMap":476},[480,1242,1243,1245,1247],{"class":482,"line":483},[480,1244,1062],{"class":572},[480,1246,576],{"class":494},[480,1248,617],{"class":490},[480,1250,1251,1254,1256,1258,1260,1263,1265,1267],{"class":482,"line":537},[480,1252,1253],{"class":572},"  extract",[480,1255,602],{"class":490},[480,1257,709],{"class":582},[480,1259,712],{"class":490},[480,1261,1262],{"class":715},"event",[480,1264,644],{"class":490},[480,1266,583],{"class":582},[480,1268,586],{"class":490},[480,1270,1271,1274,1276,1278,1281,1283,1285],{"class":482,"line":556},[480,1272,1273],{"class":582},"    const",[480,1275,774],{"class":494},[480,1277,743],{"class":490},[480,1279,1280],{"class":572}," getRequestIP",[480,1282,576],{"class":605},[480,1284,1262],{"class":494},[480,1286,664],{"class":605},[480,1288,1289,1291,1294,1296,1299,1302,1304,1307,1309,1311],{"class":482,"line":563},[480,1290,1273],{"class":582},[480,1292,1293],{"class":494}," geo",[480,1295,743],{"class":490},[480,1297,1298],{"class":486}," await",[480,1300,1301],{"class":494}," geoipService",[480,1303,748],{"class":490},[480,1305,1306],{"class":572},"lookup",[480,1308,576],{"class":605},[480,1310,863],{"class":494},[480,1312,664],{"class":605},[480,1314,1315],{"class":482,"line":589},[480,1316,560],{"emptyLinePlaceholder":559},[480,1318,1319,1322],{"class":482,"line":595},[480,1320,1321],{"class":486},"    return",[480,1323,586],{"class":490},[480,1325,1326,1329],{"class":482,"line":609},[480,1327,1328],{"class":494},"      ip",[480,1330,647],{"class":490},[480,1332,1333,1336,1338,1340,1342,1344],{"class":482,"line":620},[480,1334,1335],{"class":605},"      country",[480,1337,602],{"class":490},[480,1339,1293],{"class":494},[480,1341,754],{"class":490},[480,1343,757],{"class":494},[480,1345,647],{"class":490},[480,1347,1348,1351,1353,1355,1357,1360],{"class":482,"line":638},[480,1349,1350],{"class":605},"      city",[480,1352,602],{"class":490},[480,1354,1293],{"class":494},[480,1356,754],{"class":490},[480,1358,1359],{"class":494},"city",[480,1361,647],{"class":490},[480,1363,1364,1367,1369,1371,1374],{"class":482,"line":650},[480,1365,1366],{"class":605},"      customField",[480,1368,602],{"class":490},[480,1370,504],{"class":490},[480,1372,1373],{"class":507},"value",[480,1375,511],{"class":490},[480,1377,1378],{"class":482,"line":658},[480,1379,880],{"class":490},[480,1381,1382],{"class":482,"line":826},[480,1383,886],{"class":490},[480,1385,1386,1388],{"class":482,"line":832},[480,1387,661],{"class":490},[480,1389,664],{"class":494},[455,1391,1392],{},[1393,1394,1395],"strong",{},"Default extraction logic:",[1397,1398,1399,1414,1420,1426,1432,1438,1444,1450],"ul",{},[1400,1401,1402,1403,1406,1407,1406,1410,1413],"li",{},"IP: ",[466,1404,1405],{},"CF-Connecting-IP"," → ",[466,1408,1409],{},"X-Forwarded-For",[466,1411,1412],{},"X-Real-IP"," → socket IP",[1400,1415,1416,1417],{},"Country: ",[466,1418,1419],{},"CF-IPCountry",[1400,1421,1422,1423],{},"City: ",[466,1424,1425],{},"CF-IPCity",[1400,1427,1428,1429],{},"Region: ",[466,1430,1431],{},"CF-IPRegion",[1400,1433,1434,1435],{},"Timezone: ",[466,1436,1437],{},"CF-Timezone",[1400,1439,1440,1441],{},"Latitude: ",[466,1442,1443],{},"CF-IPLatitude",[1400,1445,1446,1447],{},"Longitude: ",[466,1448,1449],{},"CF-IPLongitude",[1400,1451,1452,1453,1456],{},"User-Agent: ",[466,1454,1455],{},"User-Agent"," header",[517,1458,1460,1232],{"id":1459},"autopopulate-optional",[466,1461,1462],{},"autoPopulate",[455,1464,1465],{},"Configures how metadata is stored in the database. Supports multiple strategies:",[1467,1468,1470],"h4",{"id":1469},"option-1-column-mapping-simple","Option 1: Column Mapping (Simple)",[455,1472,1473],{},"Map metadata fields to database columns:",[471,1475,1477],{"className":473,"code":1476,"language":475,"meta":476,"style":476},"autoPopulate: {\n  ip: 'signupIp',\n  country: 'signupCountry',\n  city: 'signupCity'\n}\n",[466,1478,1479,1487,1502,1517,1531],{"__ignoreMap":476},[480,1480,1481,1483,1485],{"class":482,"line":483},[480,1482,1462],{"class":598},[480,1484,602],{"class":490},[480,1486,586],{"class":490},[480,1488,1489,1492,1494,1496,1498,1500],{"class":482,"line":537},[480,1490,1491],{"class":598},"  ip",[480,1493,602],{"class":490},[480,1495,504],{"class":490},[480,1497,1087],{"class":507},[480,1499,930],{"class":490},[480,1501,647],{"class":490},[480,1503,1504,1507,1509,1511,1513,1515],{"class":482,"line":556},[480,1505,1506],{"class":598},"  country",[480,1508,602],{"class":490},[480,1510,504],{"class":490},[480,1512,1103],{"class":507},[480,1514,930],{"class":490},[480,1516,647],{"class":490},[480,1518,1519,1522,1524,1526,1529],{"class":482,"line":563},[480,1520,1521],{"class":598},"  city",[480,1523,602],{"class":490},[480,1525,504],{"class":490},[480,1527,1528],{"class":507},"signupCity",[480,1530,511],{"class":490},[480,1532,1533],{"class":482,"line":589},[480,1534,892],{"class":490},[455,1536,1537],{},[1393,1538,1539],{},"Rules:",[1397,1541,1542,1545,1548],{},[1400,1543,1544],{},"Only populates if the column exists in the schema",[1400,1546,1547],{},"Won't overwrite user-provided values",[1400,1549,1550],{},"Skips if metadata value is undefined",[1467,1552,1554],{"id":1553},"option-2-json-field-storage-nested","Option 2: JSON Field Storage (Nested)",[455,1556,1557],{},"Store all metadata in a single JSON column:",[471,1559,1561],{"className":473,"code":1560,"language":475,"meta":476,"style":476},"// Schema\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  email: text('email').notNull(),\n  metadata: text('metadata', { mode: 'json' }),\n})\n\n// Plugin\nautoPopulate: {\n  json: 'metadata',    // Column name\n  path: 'signup',      // Optional: nest under this key\n  merge: true,         // Merge with existing JSON data (default: true)\n}\n",[466,1562,1563,1568,1592,1618,1644,1683,1689,1693,1698,1706,1724,1743,1758],{"__ignoreMap":476},[480,1564,1565],{"class":482,"line":483},[480,1566,1567],{"class":533},"// Schema\n",[480,1569,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588,1590],{"class":482,"line":537},[480,1571,566],{"class":486},[480,1573,916],{"class":582},[480,1575,919],{"class":494},[480,1577,922],{"class":490},[480,1579,925],{"class":572},[480,1581,576],{"class":494},[480,1583,930],{"class":490},[480,1585,933],{"class":507},[480,1587,930],{"class":490},[480,1589,632],{"class":490},[480,1591,586],{"class":490},[480,1593,1594,1596,1598,1600,1602,1604,1606,1608,1610,1612,1614,1616],{"class":482,"line":556},[480,1595,944],{"class":605},[480,1597,602],{"class":490},[480,1599,949],{"class":572},[480,1601,576],{"class":494},[480,1603,930],{"class":490},[480,1605,956],{"class":507},[480,1607,930],{"class":490},[480,1609,644],{"class":494},[480,1611,748],{"class":490},[480,1613,965],{"class":572},[480,1615,579],{"class":494},[480,1617,647],{"class":490},[480,1619,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640,1642],{"class":482,"line":563},[480,1621,974],{"class":605},[480,1623,602],{"class":490},[480,1625,979],{"class":572},[480,1627,576],{"class":494},[480,1629,930],{"class":490},[480,1631,813],{"class":507},[480,1633,930],{"class":490},[480,1635,644],{"class":494},[480,1637,748],{"class":490},[480,1639,994],{"class":572},[480,1641,579],{"class":494},[480,1643,647],{"class":490},[480,1645,1646,1649,1651,1653,1655,1657,1660,1662,1664,1666,1669,1671,1673,1675,1677,1679,1681],{"class":482,"line":589},[480,1647,1648],{"class":605},"  metadata",[480,1650,602],{"class":490},[480,1652,979],{"class":572},[480,1654,576],{"class":494},[480,1656,930],{"class":490},[480,1658,1659],{"class":507},"metadata",[480,1661,930],{"class":490},[480,1663,632],{"class":490},[480,1665,491],{"class":490},[480,1667,1668],{"class":605}," mode",[480,1670,602],{"class":490},[480,1672,504],{"class":490},[480,1674,1153],{"class":507},[480,1676,930],{"class":490},[480,1678,498],{"class":490},[480,1680,644],{"class":494},[480,1682,647],{"class":490},[480,1684,1685,1687],{"class":482,"line":595},[480,1686,661],{"class":490},[480,1688,664],{"class":494},[480,1690,1691],{"class":482,"line":609},[480,1692,560],{"emptyLinePlaceholder":559},[480,1694,1695],{"class":482,"line":620},[480,1696,1697],{"class":533},"// Plugin\n",[480,1699,1700,1702,1704],{"class":482,"line":638},[480,1701,1462],{"class":598},[480,1703,602],{"class":490},[480,1705,586],{"class":490},[480,1707,1708,1711,1713,1715,1717,1719,1721],{"class":482,"line":650},[480,1709,1710],{"class":598},"  json",[480,1712,602],{"class":490},[480,1714,504],{"class":490},[480,1716,1659],{"class":507},[480,1718,930],{"class":490},[480,1720,632],{"class":490},[480,1722,1723],{"class":533},"    // Column name\n",[480,1725,1726,1729,1731,1733,1736,1738,1740],{"class":482,"line":658},[480,1727,1728],{"class":598},"  path",[480,1730,602],{"class":490},[480,1732,504],{"class":490},[480,1734,1735],{"class":507},"signup",[480,1737,930],{"class":490},[480,1739,632],{"class":490},[480,1741,1742],{"class":533},"      // Optional: nest under this key\n",[480,1744,1745,1748,1750,1753,1755],{"class":482,"line":826},[480,1746,1747],{"class":598},"  merge",[480,1749,602],{"class":490},[480,1751,1752],{"class":628}," true",[480,1754,632],{"class":490},[480,1756,1757],{"class":533},"         // Merge with existing JSON data (default: true)\n",[480,1759,1760],{"class":482,"line":832},[480,1761,892],{"class":490},[455,1763,1764],{},[1393,1765,1766],{},"Result:",[471,1768,1770],{"className":1151,"code":1769,"language":1153,"meta":476,"style":476},"{\n  \"metadata\": {\n    \"signup\": {\n      \"ip\": \"1.2.3.4\",\n      \"country\": \"US\",\n      \"city\": \"San Francisco\",\n      \"userAgent\": \"Mozilla/5.0...\"\n    }\n  }\n}\n",[466,1771,1772,1776,1788,1801,1821,1839,1858,1876,1880,1884],{"__ignoreMap":476},[480,1773,1774],{"class":482,"line":483},[480,1775,617],{"class":490},[480,1777,1778,1780,1782,1784,1786],{"class":482,"line":537},[480,1779,1164],{"class":490},[480,1781,1659],{"class":582},[480,1783,1169],{"class":490},[480,1785,602],{"class":490},[480,1787,586],{"class":490},[480,1789,1790,1793,1795,1797,1799],{"class":482,"line":556},[480,1791,1792],{"class":490},"    \"",[480,1794,1735],{"class":598},[480,1796,1169],{"class":490},[480,1798,602],{"class":490},[480,1800,586],{"class":490},[480,1802,1803,1806,1809,1811,1813,1815,1817,1819],{"class":482,"line":563},[480,1804,1805],{"class":490},"      \"",[480,1807,863],{"class":1808},"sbssI",[480,1810,1169],{"class":490},[480,1812,602],{"class":490},[480,1814,1174],{"class":490},[480,1816,1196],{"class":507},[480,1818,1169],{"class":490},[480,1820,647],{"class":490},[480,1822,1823,1825,1827,1829,1831,1833,1835,1837],{"class":482,"line":589},[480,1824,1805],{"class":490},[480,1826,757],{"class":1808},[480,1828,1169],{"class":490},[480,1830,602],{"class":490},[480,1832,1174],{"class":490},[480,1834,765],{"class":507},[480,1836,1169],{"class":490},[480,1838,647],{"class":490},[480,1840,1841,1843,1845,1847,1849,1851,1854,1856],{"class":482,"line":595},[480,1842,1805],{"class":490},[480,1844,1359],{"class":1808},[480,1846,1169],{"class":490},[480,1848,602],{"class":490},[480,1850,1174],{"class":490},[480,1852,1853],{"class":507},"San Francisco",[480,1855,1169],{"class":490},[480,1857,647],{"class":490},[480,1859,1860,1862,1865,1867,1869,1871,1874],{"class":482,"line":609},[480,1861,1805],{"class":490},[480,1863,1864],{"class":1808},"userAgent",[480,1866,1169],{"class":490},[480,1868,602],{"class":490},[480,1870,1174],{"class":490},[480,1872,1873],{"class":507},"Mozilla/5.0...",[480,1875,1217],{"class":490},[480,1877,1878],{"class":482,"line":620},[480,1879,880],{"class":490},[480,1881,1882],{"class":482,"line":638},[480,1883,886],{"class":490},[480,1885,1886],{"class":482,"line":650},[480,1887,892],{"class":490},[455,1889,1890,1891,1894],{},"Without ",[466,1892,1893],{},"path"," (top-level merge):",[471,1896,1898],{"className":473,"code":1897,"language":475,"meta":476,"style":476},"autoPopulate: {\n  json: 'metadata',\n  merge: true,\n}\n",[466,1899,1900,1908,1922,1932],{"__ignoreMap":476},[480,1901,1902,1904,1906],{"class":482,"line":483},[480,1903,1462],{"class":598},[480,1905,602],{"class":490},[480,1907,586],{"class":490},[480,1909,1910,1912,1914,1916,1918,1920],{"class":482,"line":537},[480,1911,1710],{"class":598},[480,1913,602],{"class":490},[480,1915,504],{"class":490},[480,1917,1659],{"class":507},[480,1919,930],{"class":490},[480,1921,647],{"class":490},[480,1923,1924,1926,1928,1930],{"class":482,"line":556},[480,1925,1747],{"class":598},[480,1927,602],{"class":490},[480,1929,1752],{"class":628},[480,1931,647],{"class":490},[480,1933,1934],{"class":482,"line":563},[480,1935,892],{"class":490},[455,1937,1938],{},[1393,1939,1766],{},[471,1941,1943],{"className":1151,"code":1942,"language":1153,"meta":476,"style":476},"{\n  \"metadata\": {\n    \"ip\": \"1.2.3.4\",\n    \"country\": \"US\",\n    \"city\": \"San Francisco\"\n  }\n}\n",[466,1944,1945,1949,1961,1979,1997,2013,2017],{"__ignoreMap":476},[480,1946,1947],{"class":482,"line":483},[480,1948,617],{"class":490},[480,1950,1951,1953,1955,1957,1959],{"class":482,"line":537},[480,1952,1164],{"class":490},[480,1954,1659],{"class":582},[480,1956,1169],{"class":490},[480,1958,602],{"class":490},[480,1960,586],{"class":490},[480,1962,1963,1965,1967,1969,1971,1973,1975,1977],{"class":482,"line":556},[480,1964,1792],{"class":490},[480,1966,863],{"class":598},[480,1968,1169],{"class":490},[480,1970,602],{"class":490},[480,1972,1174],{"class":490},[480,1974,1196],{"class":507},[480,1976,1169],{"class":490},[480,1978,647],{"class":490},[480,1980,1981,1983,1985,1987,1989,1991,1993,1995],{"class":482,"line":563},[480,1982,1792],{"class":490},[480,1984,757],{"class":598},[480,1986,1169],{"class":490},[480,1988,602],{"class":490},[480,1990,1174],{"class":490},[480,1992,765],{"class":507},[480,1994,1169],{"class":490},[480,1996,647],{"class":490},[480,1998,1999,2001,2003,2005,2007,2009,2011],{"class":482,"line":589},[480,2000,1792],{"class":490},[480,2002,1359],{"class":598},[480,2004,1169],{"class":490},[480,2006,602],{"class":490},[480,2008,1174],{"class":490},[480,2010,1853],{"class":507},[480,2012,1217],{"class":490},[480,2014,2015],{"class":482,"line":595},[480,2016,886],{"class":490},[480,2018,2019],{"class":482,"line":609},[480,2020,892],{"class":490},[1467,2022,2024],{"id":2023},"option-3-custom-mapper-full-control","Option 3: Custom Mapper (Full Control)",[455,2026,2027],{},"Use a custom function for complex storage logic:",[471,2029,2031],{"className":473,"code":2030,"language":475,"meta":476,"style":476},"autoPopulate: async (metadata, data, context) => {\n  // Store in JSON column\n  data.signupMeta = {\n    ip: metadata.ip,\n    location: `${metadata.city}, ${metadata.country}`,\n    timestamp: new Date().toISOString(),\n  }\n\n  // Compute derived fields\n  data.isDomestic = metadata.country === 'US'\n  data.signupSource = metadata.country === 'US' ? 'domestic' : 'international'\n\n  // Conditional logic\n  if (metadata.vpnDetected) {\n    data.riskScore = 0.8\n    await notifySecurityTeam(data.email, metadata.ip)\n  }\n\n  return data\n}\n",[466,2032,2033,2060,2065,2079,2094,2127,2151,2155,2159,2164,2190,2235,2239,2244,2263,2278,2305,2309,2314,2323],{"__ignoreMap":476},[480,2034,2035,2037,2039,2041,2043,2045,2047,2050,2052,2054,2056,2058],{"class":482,"line":483},[480,2036,1462],{"class":598},[480,2038,602],{"class":490},[480,2040,709],{"class":582},[480,2042,712],{"class":490},[480,2044,1659],{"class":715},[480,2046,632],{"class":490},[480,2048,2049],{"class":715}," data",[480,2051,632],{"class":490},[480,2053,721],{"class":715},[480,2055,644],{"class":490},[480,2057,583],{"class":582},[480,2059,586],{"class":490},[480,2061,2062],{"class":482,"line":537},[480,2063,2064],{"class":533},"  // Store in JSON column\n",[480,2066,2067,2070,2072,2075,2077],{"class":482,"line":556},[480,2068,2069],{"class":494},"  data",[480,2071,748],{"class":490},[480,2073,2074],{"class":494},"signupMeta",[480,2076,743],{"class":490},[480,2078,586],{"class":490},[480,2080,2081,2083,2085,2088,2090,2092],{"class":482,"line":563},[480,2082,1080],{"class":605},[480,2084,602],{"class":490},[480,2086,2087],{"class":494}," metadata",[480,2089,748],{"class":490},[480,2091,863],{"class":494},[480,2093,647],{"class":490},[480,2095,2096,2099,2101,2104,2106,2108,2110,2112,2115,2117,2119,2121,2123,2125],{"class":482,"line":589},[480,2097,2098],{"class":605},"    location",[480,2100,602],{"class":490},[480,2102,2103],{"class":490}," `${",[480,2105,1659],{"class":494},[480,2107,748],{"class":490},[480,2109,1359],{"class":494},[480,2111,661],{"class":490},[480,2113,2114],{"class":507},", ",[480,2116,851],{"class":490},[480,2118,1659],{"class":494},[480,2120,748],{"class":490},[480,2122,757],{"class":494},[480,2124,866],{"class":490},[480,2126,647],{"class":490},[480,2128,2129,2132,2134,2137,2140,2142,2144,2147,2149],{"class":482,"line":595},[480,2130,2131],{"class":605},"    timestamp",[480,2133,602],{"class":490},[480,2135,2136],{"class":490}," new",[480,2138,2139],{"class":572}," Date",[480,2141,579],{"class":605},[480,2143,748],{"class":490},[480,2145,2146],{"class":572},"toISOString",[480,2148,579],{"class":605},[480,2150,647],{"class":490},[480,2152,2153],{"class":482,"line":609},[480,2154,886],{"class":490},[480,2156,2157],{"class":482,"line":620},[480,2158,560],{"emptyLinePlaceholder":559},[480,2160,2161],{"class":482,"line":638},[480,2162,2163],{"class":533},"  // Compute derived fields\n",[480,2165,2166,2168,2170,2173,2175,2177,2179,2181,2184,2186,2188],{"class":482,"line":650},[480,2167,2069],{"class":494},[480,2169,748],{"class":490},[480,2171,2172],{"class":494},"isDomestic",[480,2174,743],{"class":490},[480,2176,2087],{"class":494},[480,2178,748],{"class":490},[480,2180,757],{"class":494},[480,2182,2183],{"class":490}," ===",[480,2185,504],{"class":490},[480,2187,765],{"class":507},[480,2189,511],{"class":490},[480,2191,2192,2194,2196,2199,2201,2203,2205,2207,2209,2211,2213,2215,2218,2220,2223,2225,2228,2230,2233],{"class":482,"line":658},[480,2193,2069],{"class":494},[480,2195,748],{"class":490},[480,2197,2198],{"class":494},"signupSource",[480,2200,743],{"class":490},[480,2202,2087],{"class":494},[480,2204,748],{"class":490},[480,2206,757],{"class":494},[480,2208,2183],{"class":490},[480,2210,504],{"class":490},[480,2212,765],{"class":507},[480,2214,930],{"class":490},[480,2216,2217],{"class":490}," ?",[480,2219,504],{"class":490},[480,2221,2222],{"class":507},"domestic",[480,2224,930],{"class":490},[480,2226,2227],{"class":490}," :",[480,2229,504],{"class":490},[480,2231,2232],{"class":507},"international",[480,2234,511],{"class":490},[480,2236,2237],{"class":482,"line":826},[480,2238,560],{"emptyLinePlaceholder":559},[480,2240,2241],{"class":482,"line":832},[480,2242,2243],{"class":533},"  // Conditional logic\n",[480,2245,2246,2249,2251,2253,2255,2258,2261],{"class":482,"line":871},[480,2247,2248],{"class":486},"  if",[480,2250,712],{"class":605},[480,2252,1659],{"class":494},[480,2254,748],{"class":490},[480,2256,2257],{"class":494},"vpnDetected",[480,2259,2260],{"class":605},") ",[480,2262,617],{"class":490},[480,2264,2265,2268,2270,2273,2275],{"class":482,"line":877},[480,2266,2267],{"class":494},"    data",[480,2269,748],{"class":490},[480,2271,2272],{"class":494},"riskScore",[480,2274,743],{"class":490},[480,2276,2277],{"class":1808}," 0.8\n",[480,2279,2280,2283,2286,2288,2291,2293,2295,2297,2299,2301,2303],{"class":482,"line":883},[480,2281,2282],{"class":486},"    await",[480,2284,2285],{"class":572}," notifySecurityTeam",[480,2287,576],{"class":605},[480,2289,2290],{"class":494},"data",[480,2292,748],{"class":490},[480,2294,813],{"class":494},[480,2296,632],{"class":490},[480,2298,2087],{"class":494},[480,2300,748],{"class":490},[480,2302,863],{"class":494},[480,2304,664],{"class":605},[480,2306,2307],{"class":482,"line":889},[480,2308,886],{"class":490},[480,2310,2312],{"class":482,"line":2311},18,[480,2313,560],{"emptyLinePlaceholder":559},[480,2315,2317,2320],{"class":482,"line":2316},19,[480,2318,2319],{"class":486},"  return",[480,2321,2322],{"class":494}," data\n",[480,2324,2326],{"class":482,"line":2325},20,[480,2327,892],{"class":490},[1467,2329,2331],{"id":2330},"option-4-disabled-default","Option 4: Disabled (Default)",[471,2333,2335],{"className":473,"code":2334,"language":475,"meta":476,"style":476},"autoPopulate: false  // Context-only, no DB storage\n",[466,2336,2337],{"__ignoreMap":476},[480,2338,2339,2341,2343,2345],{"class":482,"line":483},[480,2340,1462],{"class":598},[480,2342,602],{"class":490},[480,2344,629],{"class":628},[480,2346,2347],{"class":533},"  // Context-only, no DB storage\n",[517,2349,2351,1232],{"id":2350},"autopopulateon-optional",[466,2352,2353],{},"autoPopulateOn",[455,2355,2356,2357],{},"Which operations to auto-populate on. Default: ",[466,2358,2359],{},"['create']",[471,2361,2363],{"className":473,"code":2362,"language":475,"meta":476,"style":476},"// Only on create (signup)\nautoPopulateOn: ['create']\n\n// Track last access on every update\nautoPopulateOn: ['update']\n\n// Both create and update\nautoPopulateOn: ['create', 'update']\n",[466,2364,2365,2370,2387,2391,2396,2413,2417,2422],{"__ignoreMap":476},[480,2366,2367],{"class":482,"line":483},[480,2368,2369],{"class":533},"// Only on create (signup)\n",[480,2371,2372,2374,2376,2378,2380,2382,2384],{"class":482,"line":537},[480,2373,2353],{"class":598},[480,2375,602],{"class":490},[480,2377,1120],{"class":494},[480,2379,930],{"class":490},[480,2381,1125],{"class":507},[480,2383,930],{"class":490},[480,2385,2386],{"class":494},"]\n",[480,2388,2389],{"class":482,"line":556},[480,2390,560],{"emptyLinePlaceholder":559},[480,2392,2393],{"class":482,"line":563},[480,2394,2395],{"class":533},"// Track last access on every update\n",[480,2397,2398,2400,2402,2404,2406,2409,2411],{"class":482,"line":589},[480,2399,2353],{"class":598},[480,2401,602],{"class":490},[480,2403,1120],{"class":494},[480,2405,930],{"class":490},[480,2407,2408],{"class":507},"update",[480,2410,930],{"class":490},[480,2412,2386],{"class":494},[480,2414,2415],{"class":482,"line":595},[480,2416,560],{"emptyLinePlaceholder":559},[480,2418,2419],{"class":482,"line":609},[480,2420,2421],{"class":533},"// Both create and update\n",[480,2423,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444],{"class":482,"line":620},[480,2425,2353],{"class":598},[480,2427,602],{"class":490},[480,2429,1120],{"class":494},[480,2431,930],{"class":490},[480,2433,1125],{"class":507},[480,2435,930],{"class":490},[480,2437,632],{"class":490},[480,2439,504],{"class":490},[480,2441,2408],{"class":507},[480,2443,930],{"class":490},[480,2445,2386],{"class":494},[517,2447,2449,1232],{"id":2448},"resources-optional",[466,2450,2451],{},"resources",[455,2453,2454],{},"Limit auto-population to specific resources:",[471,2456,2458],{"className":473,"code":2457,"language":475,"meta":476,"style":476},"resources: ['users', 'orders']  // Only auto-populate for these tables\n",[466,2459,2460],{"__ignoreMap":476},[480,2461,2462,2464,2466,2468,2470,2472,2474,2476,2478,2481,2483,2486],{"class":482,"line":483},[480,2463,2451],{"class":598},[480,2465,602],{"class":490},[480,2467,1120],{"class":494},[480,2469,930],{"class":490},[480,2471,933],{"class":507},[480,2473,930],{"class":490},[480,2475,632],{"class":490},[480,2477,504],{"class":490},[480,2479,2480],{"class":507},"orders",[480,2482,930],{"class":490},[480,2484,2485],{"class":494},"]  ",[480,2487,2488],{"class":533},"// Only auto-populate for these tables\n",[455,2490,2491],{},"If not specified, applies to all resources.",[459,2493,2495],{"id":2494},"use-cases","Use Cases",[517,2497,2499],{"id":2498},"_1-auditing-compliance","1. Auditing & Compliance",[455,2501,2502],{},"Track where users signed up from:",[471,2504,2506],{"className":473,"code":2505,"language":475,"meta":476,"style":476},"// Schema\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  email: text('email').notNull(),\n  signupIp: text('signup_ip'),\n  signupCountry: text('signup_country'),\n  signupTimestamp: integer('signup_timestamp'),\n})\n\n// Plugin\ncreateRequestMetadataPlugin({\n  autoPopulate: {\n    ip: 'signupIp',\n    country: 'signupCountry'\n  },\n  autoPopulateOn: ['create'],\n})\n",[466,2507,2508,2512,2536,2562,2588,2608,2628,2650,2656,2660,2664,2672,2680,2694,2706,2710,2728],{"__ignoreMap":476},[480,2509,2510],{"class":482,"line":483},[480,2511,1567],{"class":533},[480,2513,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532,2534],{"class":482,"line":537},[480,2515,566],{"class":486},[480,2517,916],{"class":582},[480,2519,919],{"class":494},[480,2521,922],{"class":490},[480,2523,925],{"class":572},[480,2525,576],{"class":494},[480,2527,930],{"class":490},[480,2529,933],{"class":507},[480,2531,930],{"class":490},[480,2533,632],{"class":490},[480,2535,586],{"class":490},[480,2537,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560],{"class":482,"line":556},[480,2539,944],{"class":605},[480,2541,602],{"class":490},[480,2543,949],{"class":572},[480,2545,576],{"class":494},[480,2547,930],{"class":490},[480,2549,956],{"class":507},[480,2551,930],{"class":490},[480,2553,644],{"class":494},[480,2555,748],{"class":490},[480,2557,965],{"class":572},[480,2559,579],{"class":494},[480,2561,647],{"class":490},[480,2563,2564,2566,2568,2570,2572,2574,2576,2578,2580,2582,2584,2586],{"class":482,"line":563},[480,2565,974],{"class":605},[480,2567,602],{"class":490},[480,2569,979],{"class":572},[480,2571,576],{"class":494},[480,2573,930],{"class":490},[480,2575,813],{"class":507},[480,2577,930],{"class":490},[480,2579,644],{"class":494},[480,2581,748],{"class":490},[480,2583,994],{"class":572},[480,2585,579],{"class":494},[480,2587,647],{"class":490},[480,2589,2590,2592,2594,2596,2598,2600,2602,2604,2606],{"class":482,"line":589},[480,2591,1003],{"class":605},[480,2593,602],{"class":490},[480,2595,979],{"class":572},[480,2597,576],{"class":494},[480,2599,930],{"class":490},[480,2601,1014],{"class":507},[480,2603,930],{"class":490},[480,2605,644],{"class":494},[480,2607,647],{"class":490},[480,2609,2610,2612,2614,2616,2618,2620,2622,2624,2626],{"class":482,"line":595},[480,2611,1025],{"class":605},[480,2613,602],{"class":490},[480,2615,979],{"class":572},[480,2617,576],{"class":494},[480,2619,930],{"class":490},[480,2621,1036],{"class":507},[480,2623,930],{"class":490},[480,2625,644],{"class":494},[480,2627,647],{"class":490},[480,2629,2630,2633,2635,2637,2639,2641,2644,2646,2648],{"class":482,"line":609},[480,2631,2632],{"class":605},"  signupTimestamp",[480,2634,602],{"class":490},[480,2636,949],{"class":572},[480,2638,576],{"class":494},[480,2640,930],{"class":490},[480,2642,2643],{"class":507},"signup_timestamp",[480,2645,930],{"class":490},[480,2647,644],{"class":494},[480,2649,647],{"class":490},[480,2651,2652,2654],{"class":482,"line":620},[480,2653,661],{"class":490},[480,2655,664],{"class":494},[480,2657,2658],{"class":482,"line":638},[480,2659,560],{"emptyLinePlaceholder":559},[480,2661,2662],{"class":482,"line":650},[480,2663,1697],{"class":533},[480,2665,2666,2668,2670],{"class":482,"line":658},[480,2667,1062],{"class":572},[480,2669,576],{"class":494},[480,2671,617],{"class":490},[480,2673,2674,2676,2678],{"class":482,"line":826},[480,2675,1071],{"class":605},[480,2677,602],{"class":490},[480,2679,586],{"class":490},[480,2681,2682,2684,2686,2688,2690,2692],{"class":482,"line":832},[480,2683,1080],{"class":605},[480,2685,602],{"class":490},[480,2687,504],{"class":490},[480,2689,1087],{"class":507},[480,2691,930],{"class":490},[480,2693,647],{"class":490},[480,2695,2696,2698,2700,2702,2704],{"class":482,"line":871},[480,2697,1096],{"class":605},[480,2699,602],{"class":490},[480,2701,504],{"class":490},[480,2703,1103],{"class":507},[480,2705,511],{"class":490},[480,2707,2708],{"class":482,"line":877},[480,2709,1110],{"class":490},[480,2711,2712,2714,2716,2718,2720,2722,2724,2726],{"class":482,"line":883},[480,2713,1115],{"class":605},[480,2715,602],{"class":490},[480,2717,1120],{"class":494},[480,2719,930],{"class":490},[480,2721,1125],{"class":507},[480,2723,930],{"class":490},[480,2725,1130],{"class":494},[480,2727,647],{"class":490},[480,2729,2730,2732],{"class":482,"line":889},[480,2731,661],{"class":490},[480,2733,664],{"class":494},[517,2735,2737],{"id":2736},"_2-fraud-detection","2. Fraud Detection",[455,2739,2740],{},"Analyze signup patterns:",[471,2742,2744],{"className":473,"code":2743,"language":475,"meta":476,"style":476},"// In a hook\nafterCreate: async (result, context) => {\n  const { ip, country, vpnDetected } = context.requestMeta || {}\n\n  // Check for suspicious activity\n  const recentSignups = await db.select()\n    .from(users)\n    .where(eq(users.signupIp, ip))\n    .limit(10)\n\n  if (recentSignups.length > 5) {\n    await flagForReview(result.id, 'Multiple signups from same IP')\n  }\n}\n",[466,2745,2746,2751,2774,2807,2811,2816,2838,2852,2879,2893,2897,2921,2947,2951],{"__ignoreMap":476},[480,2747,2748],{"class":482,"line":483},[480,2749,2750],{"class":533},"// In a hook\n",[480,2752,2753,2756,2758,2760,2762,2764,2766,2768,2770,2772],{"class":482,"line":537},[480,2754,2755],{"class":598},"afterCreate",[480,2757,602],{"class":490},[480,2759,709],{"class":582},[480,2761,712],{"class":490},[480,2763,716],{"class":715},[480,2765,632],{"class":490},[480,2767,721],{"class":715},[480,2769,644],{"class":490},[480,2771,583],{"class":582},[480,2773,586],{"class":490},[480,2775,2776,2779,2781,2783,2785,2787,2789,2792,2794,2796,2798,2800,2802,2804],{"class":482,"line":556},[480,2777,2778],{"class":582},"  const",[480,2780,491],{"class":490},[480,2782,774],{"class":494},[480,2784,632],{"class":490},[480,2786,740],{"class":494},[480,2788,632],{"class":490},[480,2790,2791],{"class":494}," vpnDetected",[480,2793,498],{"class":490},[480,2795,743],{"class":490},[480,2797,721],{"class":494},[480,2799,748],{"class":490},[480,2801,751],{"class":494},[480,2803,760],{"class":490},[480,2805,2806],{"class":490}," {}\n",[480,2808,2809],{"class":482,"line":563},[480,2810,560],{"emptyLinePlaceholder":559},[480,2812,2813],{"class":482,"line":589},[480,2814,2815],{"class":533},"  // Check for suspicious activity\n",[480,2817,2818,2820,2823,2825,2827,2830,2832,2835],{"class":482,"line":595},[480,2819,2778],{"class":582},[480,2821,2822],{"class":494}," recentSignups",[480,2824,743],{"class":490},[480,2826,1298],{"class":486},[480,2828,2829],{"class":494}," db",[480,2831,748],{"class":490},[480,2833,2834],{"class":572},"select",[480,2836,2837],{"class":605},"()\n",[480,2839,2840,2843,2846,2848,2850],{"class":482,"line":609},[480,2841,2842],{"class":490},"    .",[480,2844,2845],{"class":572},"from",[480,2847,576],{"class":605},[480,2849,933],{"class":494},[480,2851,664],{"class":605},[480,2853,2854,2856,2859,2861,2864,2866,2868,2870,2872,2874,2876],{"class":482,"line":620},[480,2855,2842],{"class":490},[480,2857,2858],{"class":572},"where",[480,2860,576],{"class":605},[480,2862,2863],{"class":572},"eq",[480,2865,576],{"class":605},[480,2867,933],{"class":494},[480,2869,748],{"class":490},[480,2871,1087],{"class":494},[480,2873,632],{"class":490},[480,2875,774],{"class":494},[480,2877,2878],{"class":605},"))\n",[480,2880,2881,2883,2886,2888,2891],{"class":482,"line":638},[480,2882,2842],{"class":490},[480,2884,2885],{"class":572},"limit",[480,2887,576],{"class":605},[480,2889,2890],{"class":1808},"10",[480,2892,664],{"class":605},[480,2894,2895],{"class":482,"line":650},[480,2896,560],{"emptyLinePlaceholder":559},[480,2898,2899,2901,2903,2906,2908,2911,2914,2917,2919],{"class":482,"line":658},[480,2900,2248],{"class":486},[480,2902,712],{"class":605},[480,2904,2905],{"class":494},"recentSignups",[480,2907,748],{"class":490},[480,2909,2910],{"class":494},"length",[480,2912,2913],{"class":490}," >",[480,2915,2916],{"class":1808}," 5",[480,2918,2260],{"class":605},[480,2920,617],{"class":490},[480,2922,2923,2925,2928,2930,2932,2934,2936,2938,2940,2943,2945],{"class":482,"line":826},[480,2924,2282],{"class":486},[480,2926,2927],{"class":572}," flagForReview",[480,2929,576],{"class":605},[480,2931,716],{"class":494},[480,2933,748],{"class":490},[480,2935,956],{"class":494},[480,2937,632],{"class":490},[480,2939,504],{"class":490},[480,2941,2942],{"class":507},"Multiple signups from same IP",[480,2944,930],{"class":490},[480,2946,664],{"class":605},[480,2948,2949],{"class":482,"line":832},[480,2950,886],{"class":490},[480,2952,2953],{"class":482,"line":871},[480,2954,892],{"class":490},[517,2956,2958],{"id":2957},"_3-country-based-features","3. Country-Based Features",[455,2960,2961],{},"Block or enable features based on country:",[471,2963,2965],{"className":473,"code":2964,"language":475,"meta":476,"style":476},"// Authorization function\nautoApi: {\n  authorization: {\n    payments: {\n      permissions: {\n        create: (context) => {\n          const country = context.requestMeta?.country\n          if (country !== 'US') {\n            throw createError({\n              statusCode: 403,\n              message: 'Payments only available in US'\n            })\n          }\n          return true\n        }\n      }\n    }\n  }\n}\n",[466,2966,2967,2972,2980,2989,2998,3007,3025,3045,3067,3079,3091,3105,3112,3117,3125,3130,3134,3138,3142],{"__ignoreMap":476},[480,2968,2969],{"class":482,"line":483},[480,2970,2971],{"class":533},"// Authorization function\n",[480,2973,2974,2976,2978],{"class":482,"line":537},[480,2975,677],{"class":598},[480,2977,602],{"class":490},[480,2979,586],{"class":490},[480,2981,2982,2985,2987],{"class":482,"line":556},[480,2983,2984],{"class":598},"  authorization",[480,2986,602],{"class":490},[480,2988,586],{"class":490},[480,2990,2991,2994,2996],{"class":482,"line":563},[480,2992,2993],{"class":598},"    payments",[480,2995,602],{"class":490},[480,2997,586],{"class":490},[480,2999,3000,3003,3005],{"class":482,"line":589},[480,3001,3002],{"class":598},"      permissions",[480,3004,602],{"class":490},[480,3006,586],{"class":490},[480,3008,3009,3012,3014,3016,3019,3021,3023],{"class":482,"line":595},[480,3010,3011],{"class":598},"        create",[480,3013,602],{"class":490},[480,3015,712],{"class":490},[480,3017,3018],{"class":715},"context",[480,3020,644],{"class":490},[480,3022,583],{"class":582},[480,3024,586],{"class":490},[480,3026,3027,3030,3032,3034,3036,3038,3040,3042],{"class":482,"line":609},[480,3028,3029],{"class":582},"          const",[480,3031,740],{"class":494},[480,3033,743],{"class":490},[480,3035,721],{"class":494},[480,3037,748],{"class":490},[480,3039,751],{"class":494},[480,3041,754],{"class":490},[480,3043,3044],{"class":494},"country\n",[480,3046,3047,3050,3052,3054,3057,3059,3061,3063,3065],{"class":482,"line":620},[480,3048,3049],{"class":486},"          if",[480,3051,712],{"class":605},[480,3053,757],{"class":494},[480,3055,3056],{"class":490}," !==",[480,3058,504],{"class":490},[480,3060,765],{"class":507},[480,3062,930],{"class":490},[480,3064,2260],{"class":605},[480,3066,617],{"class":490},[480,3068,3069,3072,3075,3077],{"class":482,"line":638},[480,3070,3071],{"class":486},"            throw",[480,3073,3074],{"class":572}," createError",[480,3076,576],{"class":605},[480,3078,617],{"class":490},[480,3080,3081,3084,3086,3089],{"class":482,"line":650},[480,3082,3083],{"class":605},"              statusCode",[480,3085,602],{"class":490},[480,3087,3088],{"class":1808}," 403",[480,3090,647],{"class":490},[480,3092,3093,3096,3098,3100,3103],{"class":482,"line":658},[480,3094,3095],{"class":605},"              message",[480,3097,602],{"class":490},[480,3099,504],{"class":490},[480,3101,3102],{"class":507},"Payments only available in US",[480,3104,511],{"class":490},[480,3106,3107,3110],{"class":482,"line":826},[480,3108,3109],{"class":490},"            }",[480,3111,664],{"class":605},[480,3113,3114],{"class":482,"line":832},[480,3115,3116],{"class":490},"          }\n",[480,3118,3119,3122],{"class":482,"line":871},[480,3120,3121],{"class":486},"          return",[480,3123,3124],{"class":628}," true\n",[480,3126,3127],{"class":482,"line":877},[480,3128,3129],{"class":490},"        }\n",[480,3131,3132],{"class":482,"line":883},[480,3133,874],{"class":490},[480,3135,3136],{"class":482,"line":889},[480,3137,880],{"class":490},[480,3139,3140],{"class":482,"line":2311},[480,3141,886],{"class":490},[480,3143,3144],{"class":482,"line":2316},[480,3145,892],{"class":490},[517,3147,3149],{"id":3148},"_4-localized-content","4. Localized Content",[455,3151,3152],{},"Send region-appropriate emails:",[471,3154,3156],{"className":473,"code":3155,"language":475,"meta":476,"style":476},"afterCreate: async (result, context) => {\n  const country = context.requestMeta?.country || 'US'\n  const locale = country === 'US' ? 'en-US' : 'en-GB'\n\n  await sendWelcomeEmail(result.email, locale)\n}\n",[466,3157,3158,3180,3206,3243,3247,3268],{"__ignoreMap":476},[480,3159,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178],{"class":482,"line":483},[480,3161,2755],{"class":598},[480,3163,602],{"class":490},[480,3165,709],{"class":582},[480,3167,712],{"class":490},[480,3169,716],{"class":715},[480,3171,632],{"class":490},[480,3173,721],{"class":715},[480,3175,644],{"class":490},[480,3177,583],{"class":582},[480,3179,586],{"class":490},[480,3181,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200,3202,3204],{"class":482,"line":537},[480,3183,2778],{"class":582},[480,3185,740],{"class":494},[480,3187,743],{"class":490},[480,3189,721],{"class":494},[480,3191,748],{"class":490},[480,3193,751],{"class":494},[480,3195,754],{"class":490},[480,3197,757],{"class":494},[480,3199,760],{"class":490},[480,3201,504],{"class":490},[480,3203,765],{"class":507},[480,3205,511],{"class":490},[480,3207,3208,3210,3213,3215,3217,3219,3221,3223,3225,3227,3229,3232,3234,3236,3238,3241],{"class":482,"line":556},[480,3209,2778],{"class":582},[480,3211,3212],{"class":494}," locale",[480,3214,743],{"class":490},[480,3216,740],{"class":494},[480,3218,2183],{"class":490},[480,3220,504],{"class":490},[480,3222,765],{"class":507},[480,3224,930],{"class":490},[480,3226,2217],{"class":490},[480,3228,504],{"class":490},[480,3230,3231],{"class":507},"en-US",[480,3233,930],{"class":490},[480,3235,2227],{"class":490},[480,3237,504],{"class":490},[480,3239,3240],{"class":507},"en-GB",[480,3242,511],{"class":490},[480,3244,3245],{"class":482,"line":563},[480,3246,560],{"emptyLinePlaceholder":559},[480,3248,3249,3252,3254,3256,3258,3260,3262,3264,3266],{"class":482,"line":589},[480,3250,3251],{"class":486},"  await",[480,3253,804],{"class":572},[480,3255,576],{"class":605},[480,3257,716],{"class":494},[480,3259,748],{"class":490},[480,3261,813],{"class":494},[480,3263,632],{"class":490},[480,3265,3212],{"class":494},[480,3267,664],{"class":605},[480,3269,3270],{"class":482,"line":595},[480,3271,892],{"class":490},[517,3273,3275],{"id":3274},"_5-last-seen-tracking","5. Last Seen Tracking",[455,3277,3278],{},"Update user's last IP on every action:",[471,3280,3282],{"className":473,"code":3281,"language":475,"meta":476,"style":476},"// Schema\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  lastIp: text('last_ip'),\n  lastSeen: integer('last_seen'),\n})\n\n// Plugin\ncreateRequestMetadataPlugin({\n  autoPopulate: { ip: 'lastIp' },\n  autoPopulateOn: ['update'],\n  resources: ['users'],\n})\n\n// Hook to also update timestamp\nhooks: {\n  users: {\n    beforeUpdate: async (id, data, context) => {\n      data.lastSeen = Date.now()\n      return data\n    }\n  }\n}\n",[466,3283,3284,3288,3312,3338,3360,3382,3388,3392,3396,3404,3426,3444,3463,3469,3473,3478,3487,3496,3523,3544,3551,3556,3561],{"__ignoreMap":476},[480,3285,3286],{"class":482,"line":483},[480,3287,1567],{"class":533},[480,3289,3290,3292,3294,3296,3298,3300,3302,3304,3306,3308,3310],{"class":482,"line":537},[480,3291,566],{"class":486},[480,3293,916],{"class":582},[480,3295,919],{"class":494},[480,3297,922],{"class":490},[480,3299,925],{"class":572},[480,3301,576],{"class":494},[480,3303,930],{"class":490},[480,3305,933],{"class":507},[480,3307,930],{"class":490},[480,3309,632],{"class":490},[480,3311,586],{"class":490},[480,3313,3314,3316,3318,3320,3322,3324,3326,3328,3330,3332,3334,3336],{"class":482,"line":556},[480,3315,944],{"class":605},[480,3317,602],{"class":490},[480,3319,949],{"class":572},[480,3321,576],{"class":494},[480,3323,930],{"class":490},[480,3325,956],{"class":507},[480,3327,930],{"class":490},[480,3329,644],{"class":494},[480,3331,748],{"class":490},[480,3333,965],{"class":572},[480,3335,579],{"class":494},[480,3337,647],{"class":490},[480,3339,3340,3343,3345,3347,3349,3351,3354,3356,3358],{"class":482,"line":563},[480,3341,3342],{"class":605},"  lastIp",[480,3344,602],{"class":490},[480,3346,979],{"class":572},[480,3348,576],{"class":494},[480,3350,930],{"class":490},[480,3352,3353],{"class":507},"last_ip",[480,3355,930],{"class":490},[480,3357,644],{"class":494},[480,3359,647],{"class":490},[480,3361,3362,3365,3367,3369,3371,3373,3376,3378,3380],{"class":482,"line":589},[480,3363,3364],{"class":605},"  lastSeen",[480,3366,602],{"class":490},[480,3368,949],{"class":572},[480,3370,576],{"class":494},[480,3372,930],{"class":490},[480,3374,3375],{"class":507},"last_seen",[480,3377,930],{"class":490},[480,3379,644],{"class":494},[480,3381,647],{"class":490},[480,3383,3384,3386],{"class":482,"line":595},[480,3385,661],{"class":490},[480,3387,664],{"class":494},[480,3389,3390],{"class":482,"line":609},[480,3391,560],{"emptyLinePlaceholder":559},[480,3393,3394],{"class":482,"line":620},[480,3395,1697],{"class":533},[480,3397,3398,3400,3402],{"class":482,"line":638},[480,3399,1062],{"class":572},[480,3401,576],{"class":494},[480,3403,617],{"class":490},[480,3405,3406,3408,3410,3412,3414,3416,3418,3421,3423],{"class":482,"line":650},[480,3407,1071],{"class":605},[480,3409,602],{"class":490},[480,3411,491],{"class":490},[480,3413,774],{"class":605},[480,3415,602],{"class":490},[480,3417,504],{"class":490},[480,3419,3420],{"class":507},"lastIp",[480,3422,930],{"class":490},[480,3424,3425],{"class":490}," },\n",[480,3427,3428,3430,3432,3434,3436,3438,3440,3442],{"class":482,"line":658},[480,3429,1115],{"class":605},[480,3431,602],{"class":490},[480,3433,1120],{"class":494},[480,3435,930],{"class":490},[480,3437,2408],{"class":507},[480,3439,930],{"class":490},[480,3441,1130],{"class":494},[480,3443,647],{"class":490},[480,3445,3446,3449,3451,3453,3455,3457,3459,3461],{"class":482,"line":826},[480,3447,3448],{"class":605},"  resources",[480,3450,602],{"class":490},[480,3452,1120],{"class":494},[480,3454,930],{"class":490},[480,3456,933],{"class":507},[480,3458,930],{"class":490},[480,3460,1130],{"class":494},[480,3462,647],{"class":490},[480,3464,3465,3467],{"class":482,"line":832},[480,3466,661],{"class":490},[480,3468,664],{"class":494},[480,3470,3471],{"class":482,"line":871},[480,3472,560],{"emptyLinePlaceholder":559},[480,3474,3475],{"class":482,"line":877},[480,3476,3477],{"class":533},"// Hook to also update timestamp\n",[480,3479,3480,3483,3485],{"class":482,"line":883},[480,3481,3482],{"class":598},"hooks",[480,3484,602],{"class":490},[480,3486,586],{"class":490},[480,3488,3489,3492,3494],{"class":482,"line":889},[480,3490,3491],{"class":598},"  users",[480,3493,602],{"class":490},[480,3495,586],{"class":490},[480,3497,3498,3501,3503,3505,3507,3509,3511,3513,3515,3517,3519,3521],{"class":482,"line":2311},[480,3499,3500],{"class":598},"    beforeUpdate",[480,3502,602],{"class":490},[480,3504,709],{"class":582},[480,3506,712],{"class":490},[480,3508,956],{"class":715},[480,3510,632],{"class":490},[480,3512,2049],{"class":715},[480,3514,632],{"class":490},[480,3516,721],{"class":715},[480,3518,644],{"class":490},[480,3520,583],{"class":582},[480,3522,586],{"class":490},[480,3524,3525,3528,3530,3533,3535,3537,3539,3542],{"class":482,"line":2316},[480,3526,3527],{"class":494},"      data",[480,3529,748],{"class":490},[480,3531,3532],{"class":494},"lastSeen",[480,3534,743],{"class":490},[480,3536,2139],{"class":494},[480,3538,748],{"class":490},[480,3540,3541],{"class":572},"now",[480,3543,2837],{"class":605},[480,3545,3546,3549],{"class":482,"line":2325},[480,3547,3548],{"class":486},"      return",[480,3550,2322],{"class":494},[480,3552,3554],{"class":482,"line":3553},21,[480,3555,880],{"class":490},[480,3557,3559],{"class":482,"line":3558},22,[480,3560,886],{"class":490},[480,3562,3564],{"class":482,"line":3563},23,[480,3565,892],{"class":490},[517,3567,3569],{"id":3568},"_6-hybrid-storage-best-practice","6. Hybrid Storage (Best Practice)",[455,3571,3572],{},"Store frequently queried fields as columns + full metadata as JSON:",[471,3574,3576],{"className":473,"code":3575,"language":475,"meta":476,"style":476},"// Schema\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  email: text('email').notNull(),\n  signupCountry: text('signup_country'),  // Indexed for fast queries\n  signupMeta: text('signup_meta', { mode: 'json' }),  // Full metadata\n})\n\n// Plugin\ncreateRequestMetadataPlugin({\n  autoPopulate: (metadata, data) => {\n    // Store country as column for indexed queries\n    data.signupCountry = metadata.country\n\n    // Store full metadata as JSON\n    data.signupMeta = metadata\n\n    return data\n  },\n})\n",[466,3577,3578,3582,3606,3632,3658,3681,3722,3728,3732,3736,3744,3764,3769,3785,3789,3794,3807,3811,3817,3821],{"__ignoreMap":476},[480,3579,3580],{"class":482,"line":483},[480,3581,1567],{"class":533},[480,3583,3584,3586,3588,3590,3592,3594,3596,3598,3600,3602,3604],{"class":482,"line":537},[480,3585,566],{"class":486},[480,3587,916],{"class":582},[480,3589,919],{"class":494},[480,3591,922],{"class":490},[480,3593,925],{"class":572},[480,3595,576],{"class":494},[480,3597,930],{"class":490},[480,3599,933],{"class":507},[480,3601,930],{"class":490},[480,3603,632],{"class":490},[480,3605,586],{"class":490},[480,3607,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630],{"class":482,"line":556},[480,3609,944],{"class":605},[480,3611,602],{"class":490},[480,3613,949],{"class":572},[480,3615,576],{"class":494},[480,3617,930],{"class":490},[480,3619,956],{"class":507},[480,3621,930],{"class":490},[480,3623,644],{"class":494},[480,3625,748],{"class":490},[480,3627,965],{"class":572},[480,3629,579],{"class":494},[480,3631,647],{"class":490},[480,3633,3634,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656],{"class":482,"line":563},[480,3635,974],{"class":605},[480,3637,602],{"class":490},[480,3639,979],{"class":572},[480,3641,576],{"class":494},[480,3643,930],{"class":490},[480,3645,813],{"class":507},[480,3647,930],{"class":490},[480,3649,644],{"class":494},[480,3651,748],{"class":490},[480,3653,994],{"class":572},[480,3655,579],{"class":494},[480,3657,647],{"class":490},[480,3659,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678],{"class":482,"line":589},[480,3661,1025],{"class":605},[480,3663,602],{"class":490},[480,3665,979],{"class":572},[480,3667,576],{"class":494},[480,3669,930],{"class":490},[480,3671,1036],{"class":507},[480,3673,930],{"class":490},[480,3675,644],{"class":494},[480,3677,632],{"class":490},[480,3679,3680],{"class":533},"  // Indexed for fast queries\n",[480,3682,3683,3686,3688,3690,3692,3694,3697,3699,3701,3703,3705,3707,3709,3711,3713,3715,3717,3719],{"class":482,"line":595},[480,3684,3685],{"class":605},"  signupMeta",[480,3687,602],{"class":490},[480,3689,979],{"class":572},[480,3691,576],{"class":494},[480,3693,930],{"class":490},[480,3695,3696],{"class":507},"signup_meta",[480,3698,930],{"class":490},[480,3700,632],{"class":490},[480,3702,491],{"class":490},[480,3704,1668],{"class":605},[480,3706,602],{"class":490},[480,3708,504],{"class":490},[480,3710,1153],{"class":507},[480,3712,930],{"class":490},[480,3714,498],{"class":490},[480,3716,644],{"class":494},[480,3718,632],{"class":490},[480,3720,3721],{"class":533},"  // Full metadata\n",[480,3723,3724,3726],{"class":482,"line":609},[480,3725,661],{"class":490},[480,3727,664],{"class":494},[480,3729,3730],{"class":482,"line":620},[480,3731,560],{"emptyLinePlaceholder":559},[480,3733,3734],{"class":482,"line":638},[480,3735,1697],{"class":533},[480,3737,3738,3740,3742],{"class":482,"line":650},[480,3739,1062],{"class":572},[480,3741,576],{"class":494},[480,3743,617],{"class":490},[480,3745,3746,3748,3750,3752,3754,3756,3758,3760,3762],{"class":482,"line":658},[480,3747,1071],{"class":572},[480,3749,602],{"class":490},[480,3751,712],{"class":490},[480,3753,1659],{"class":715},[480,3755,632],{"class":490},[480,3757,2049],{"class":715},[480,3759,644],{"class":490},[480,3761,583],{"class":582},[480,3763,586],{"class":490},[480,3765,3766],{"class":482,"line":826},[480,3767,3768],{"class":533},"    // Store country as column for indexed queries\n",[480,3770,3771,3773,3775,3777,3779,3781,3783],{"class":482,"line":832},[480,3772,2267],{"class":494},[480,3774,748],{"class":490},[480,3776,1103],{"class":494},[480,3778,743],{"class":490},[480,3780,2087],{"class":494},[480,3782,748],{"class":490},[480,3784,3044],{"class":494},[480,3786,3787],{"class":482,"line":871},[480,3788,560],{"emptyLinePlaceholder":559},[480,3790,3791],{"class":482,"line":877},[480,3792,3793],{"class":533},"    // Store full metadata as JSON\n",[480,3795,3796,3798,3800,3802,3804],{"class":482,"line":883},[480,3797,2267],{"class":494},[480,3799,748],{"class":490},[480,3801,2074],{"class":494},[480,3803,743],{"class":490},[480,3805,3806],{"class":494}," metadata\n",[480,3808,3809],{"class":482,"line":889},[480,3810,560],{"emptyLinePlaceholder":559},[480,3812,3813,3815],{"class":482,"line":2311},[480,3814,1321],{"class":486},[480,3816,2322],{"class":494},[480,3818,3819],{"class":482,"line":2316},[480,3820,1110],{"class":490},[480,3822,3823,3825],{"class":482,"line":2325},[480,3824,661],{"class":490},[480,3826,664],{"class":494},[455,3828,3829],{},[1393,3830,3831],{},"Benefits:",[1397,3833,3834,3840,3843],{},[1400,3835,3836,3837],{},"Fast queries: ",[466,3838,3839],{},"SELECT * FROM users WHERE signupCountry = 'US'",[1400,3841,3842],{},"Full context preserved for detailed analysis",[1400,3844,3845],{},"No need to add columns for every metadata field",[459,3847,3849],{"id":3848},"custom-extractors","Custom Extractors",[517,3851,3853],{"id":3852},"maxmind-geoip","MaxMind GeoIP",[471,3855,3857],{"className":473,"code":3856,"language":475,"meta":476,"style":476},"import { lookup } from 'geoip-lite'\n\ncreateRequestMetadataPlugin({\n  extract: async (event) => {\n    const ip = getRequestIP(event)\n    const geo = lookup(ip)\n\n    return {\n      ip,\n      country: geo?.country,\n      city: geo?.city,\n      region: geo?.region,\n      timezone: geo?.timezone,\n      latitude: String(geo?.ll[0]),\n      longitude: String(geo?.ll[1]),\n      userAgent: getHeader(event, 'user-agent'),\n    }\n  }\n})\n",[466,3858,3859,3879,3883,3891,3909,3925,3941,3945,3951,3957,3971,3985,4001,4017,4048,4074,4101,4105,4109],{"__ignoreMap":476},[480,3860,3861,3863,3865,3868,3870,3872,3874,3877],{"class":482,"line":483},[480,3862,487],{"class":486},[480,3864,491],{"class":490},[480,3866,3867],{"class":494}," lookup",[480,3869,498],{"class":490},[480,3871,501],{"class":486},[480,3873,504],{"class":490},[480,3875,3876],{"class":507},"geoip-lite",[480,3878,511],{"class":490},[480,3880,3881],{"class":482,"line":537},[480,3882,560],{"emptyLinePlaceholder":559},[480,3884,3885,3887,3889],{"class":482,"line":556},[480,3886,1062],{"class":572},[480,3888,576],{"class":494},[480,3890,617],{"class":490},[480,3892,3893,3895,3897,3899,3901,3903,3905,3907],{"class":482,"line":563},[480,3894,1253],{"class":572},[480,3896,602],{"class":490},[480,3898,709],{"class":582},[480,3900,712],{"class":490},[480,3902,1262],{"class":715},[480,3904,644],{"class":490},[480,3906,583],{"class":582},[480,3908,586],{"class":490},[480,3910,3911,3913,3915,3917,3919,3921,3923],{"class":482,"line":589},[480,3912,1273],{"class":582},[480,3914,774],{"class":494},[480,3916,743],{"class":490},[480,3918,1280],{"class":572},[480,3920,576],{"class":605},[480,3922,1262],{"class":494},[480,3924,664],{"class":605},[480,3926,3927,3929,3931,3933,3935,3937,3939],{"class":482,"line":595},[480,3928,1273],{"class":582},[480,3930,1293],{"class":494},[480,3932,743],{"class":490},[480,3934,3867],{"class":572},[480,3936,576],{"class":605},[480,3938,863],{"class":494},[480,3940,664],{"class":605},[480,3942,3943],{"class":482,"line":609},[480,3944,560],{"emptyLinePlaceholder":559},[480,3946,3947,3949],{"class":482,"line":620},[480,3948,1321],{"class":486},[480,3950,586],{"class":490},[480,3952,3953,3955],{"class":482,"line":638},[480,3954,1328],{"class":494},[480,3956,647],{"class":490},[480,3958,3959,3961,3963,3965,3967,3969],{"class":482,"line":650},[480,3960,1335],{"class":605},[480,3962,602],{"class":490},[480,3964,1293],{"class":494},[480,3966,754],{"class":490},[480,3968,757],{"class":494},[480,3970,647],{"class":490},[480,3972,3973,3975,3977,3979,3981,3983],{"class":482,"line":658},[480,3974,1350],{"class":605},[480,3976,602],{"class":490},[480,3978,1293],{"class":494},[480,3980,754],{"class":490},[480,3982,1359],{"class":494},[480,3984,647],{"class":490},[480,3986,3987,3990,3992,3994,3996,3999],{"class":482,"line":826},[480,3988,3989],{"class":605},"      region",[480,3991,602],{"class":490},[480,3993,1293],{"class":494},[480,3995,754],{"class":490},[480,3997,3998],{"class":494},"region",[480,4000,647],{"class":490},[480,4002,4003,4006,4008,4010,4012,4015],{"class":482,"line":832},[480,4004,4005],{"class":605},"      timezone",[480,4007,602],{"class":490},[480,4009,1293],{"class":494},[480,4011,754],{"class":490},[480,4013,4014],{"class":494},"timezone",[480,4016,647],{"class":490},[480,4018,4019,4022,4024,4027,4029,4032,4034,4037,4040,4043,4046],{"class":482,"line":871},[480,4020,4021],{"class":605},"      latitude",[480,4023,602],{"class":490},[480,4025,4026],{"class":572}," String",[480,4028,576],{"class":605},[480,4030,4031],{"class":494},"geo",[480,4033,754],{"class":490},[480,4035,4036],{"class":494},"ll",[480,4038,4039],{"class":605},"[",[480,4041,4042],{"class":1808},"0",[480,4044,4045],{"class":605},"])",[480,4047,647],{"class":490},[480,4049,4050,4053,4055,4057,4059,4061,4063,4065,4067,4070,4072],{"class":482,"line":877},[480,4051,4052],{"class":605},"      longitude",[480,4054,602],{"class":490},[480,4056,4026],{"class":572},[480,4058,576],{"class":605},[480,4060,4031],{"class":494},[480,4062,754],{"class":490},[480,4064,4036],{"class":494},[480,4066,4039],{"class":605},[480,4068,4069],{"class":1808},"1",[480,4071,4045],{"class":605},[480,4073,647],{"class":490},[480,4075,4076,4079,4081,4084,4086,4088,4090,4092,4095,4097,4099],{"class":482,"line":883},[480,4077,4078],{"class":605},"      userAgent",[480,4080,602],{"class":490},[480,4082,4083],{"class":572}," getHeader",[480,4085,576],{"class":605},[480,4087,1262],{"class":494},[480,4089,632],{"class":490},[480,4091,504],{"class":490},[480,4093,4094],{"class":507},"user-agent",[480,4096,930],{"class":490},[480,4098,644],{"class":605},[480,4100,647],{"class":490},[480,4102,4103],{"class":482,"line":889},[480,4104,880],{"class":490},[480,4106,4107],{"class":482,"line":2311},[480,4108,886],{"class":490},[480,4110,4111,4113],{"class":482,"line":2316},[480,4112,661],{"class":490},[480,4114,664],{"class":494},[517,4116,4118],{"id":4117},"third-party-geolocation-api","Third-Party Geolocation API",[471,4120,4122],{"className":473,"code":4121,"language":475,"meta":476,"style":476},"createRequestMetadataPlugin({\n  extract: async (event) => {\n    const ip = getRequestIP(event)\n\n    // Call external service\n    const response = await $fetch(`https://api.ipdata.co/${ip}`, {\n      params: { 'api-key': process.env.IPDATA_API_KEY }\n    })\n\n    return {\n      ip,\n      country: response.country_code,\n      city: response.city,\n      timezone: response.time_zone.name,\n      isp: response.asn.name,\n      vpnDetected: response.threat.is_vpn,\n    }\n  }\n})\n",[466,4123,4124,4132,4150,4166,4170,4175,4206,4240,4246,4250,4256,4262,4277,4291,4311,4331,4352,4356,4360],{"__ignoreMap":476},[480,4125,4126,4128,4130],{"class":482,"line":483},[480,4127,1062],{"class":572},[480,4129,576],{"class":494},[480,4131,617],{"class":490},[480,4133,4134,4136,4138,4140,4142,4144,4146,4148],{"class":482,"line":537},[480,4135,1253],{"class":572},[480,4137,602],{"class":490},[480,4139,709],{"class":582},[480,4141,712],{"class":490},[480,4143,1262],{"class":715},[480,4145,644],{"class":490},[480,4147,583],{"class":582},[480,4149,586],{"class":490},[480,4151,4152,4154,4156,4158,4160,4162,4164],{"class":482,"line":556},[480,4153,1273],{"class":582},[480,4155,774],{"class":494},[480,4157,743],{"class":490},[480,4159,1280],{"class":572},[480,4161,576],{"class":605},[480,4163,1262],{"class":494},[480,4165,664],{"class":605},[480,4167,4168],{"class":482,"line":563},[480,4169,560],{"emptyLinePlaceholder":559},[480,4171,4172],{"class":482,"line":589},[480,4173,4174],{"class":533},"    // Call external service\n",[480,4176,4177,4179,4182,4184,4186,4189,4191,4193,4196,4198,4200,4202,4204],{"class":482,"line":595},[480,4178,1273],{"class":582},[480,4180,4181],{"class":494}," response",[480,4183,743],{"class":490},[480,4185,1298],{"class":486},[480,4187,4188],{"class":572}," $fetch",[480,4190,576],{"class":605},[480,4192,845],{"class":490},[480,4194,4195],{"class":507},"https://api.ipdata.co/",[480,4197,851],{"class":490},[480,4199,863],{"class":494},[480,4201,866],{"class":490},[480,4203,632],{"class":490},[480,4205,586],{"class":490},[480,4207,4208,4211,4213,4215,4217,4220,4222,4224,4227,4229,4232,4234,4237],{"class":482,"line":609},[480,4209,4210],{"class":605},"      params",[480,4212,602],{"class":490},[480,4214,491],{"class":490},[480,4216,504],{"class":490},[480,4218,4219],{"class":605},"api-key",[480,4221,930],{"class":490},[480,4223,602],{"class":490},[480,4225,4226],{"class":494}," process",[480,4228,748],{"class":490},[480,4230,4231],{"class":494},"env",[480,4233,748],{"class":490},[480,4235,4236],{"class":494},"IPDATA_API_KEY",[480,4238,4239],{"class":490}," }\n",[480,4241,4242,4244],{"class":482,"line":620},[480,4243,641],{"class":490},[480,4245,664],{"class":605},[480,4247,4248],{"class":482,"line":638},[480,4249,560],{"emptyLinePlaceholder":559},[480,4251,4252,4254],{"class":482,"line":650},[480,4253,1321],{"class":486},[480,4255,586],{"class":490},[480,4257,4258,4260],{"class":482,"line":658},[480,4259,1328],{"class":494},[480,4261,647],{"class":490},[480,4263,4264,4266,4268,4270,4272,4275],{"class":482,"line":826},[480,4265,1335],{"class":605},[480,4267,602],{"class":490},[480,4269,4181],{"class":494},[480,4271,748],{"class":490},[480,4273,4274],{"class":494},"country_code",[480,4276,647],{"class":490},[480,4278,4279,4281,4283,4285,4287,4289],{"class":482,"line":832},[480,4280,1350],{"class":605},[480,4282,602],{"class":490},[480,4284,4181],{"class":494},[480,4286,748],{"class":490},[480,4288,1359],{"class":494},[480,4290,647],{"class":490},[480,4292,4293,4295,4297,4299,4301,4304,4306,4309],{"class":482,"line":871},[480,4294,4005],{"class":605},[480,4296,602],{"class":490},[480,4298,4181],{"class":494},[480,4300,748],{"class":490},[480,4302,4303],{"class":494},"time_zone",[480,4305,748],{"class":490},[480,4307,4308],{"class":494},"name",[480,4310,647],{"class":490},[480,4312,4313,4316,4318,4320,4322,4325,4327,4329],{"class":482,"line":877},[480,4314,4315],{"class":605},"      isp",[480,4317,602],{"class":490},[480,4319,4181],{"class":494},[480,4321,748],{"class":490},[480,4323,4324],{"class":494},"asn",[480,4326,748],{"class":490},[480,4328,4308],{"class":494},[480,4330,647],{"class":490},[480,4332,4333,4336,4338,4340,4342,4345,4347,4350],{"class":482,"line":883},[480,4334,4335],{"class":605},"      vpnDetected",[480,4337,602],{"class":490},[480,4339,4181],{"class":494},[480,4341,748],{"class":490},[480,4343,4344],{"class":494},"threat",[480,4346,748],{"class":490},[480,4348,4349],{"class":494},"is_vpn",[480,4351,647],{"class":490},[480,4353,4354],{"class":482,"line":889},[480,4355,880],{"class":490},[480,4357,4358],{"class":482,"line":2311},[480,4359,886],{"class":490},[480,4361,4362,4364],{"class":482,"line":2316},[480,4363,661],{"class":490},[480,4365,664],{"class":494},[517,4367,4369],{"id":4368},"custom-headers","Custom Headers",[471,4371,4373],{"className":473,"code":4372,"language":475,"meta":476,"style":476},"createRequestMetadataPlugin({\n  extract: (event) => {\n    const headers = getRequestHeaders(event)\n\n    return {\n      ip: headers['x-real-ip'],\n      userAgent: headers['user-agent'],\n      referrer: headers['referer'],\n      acceptLanguage: headers['accept-language'],\n      // Custom headers from your proxy\n      customerId: headers['x-customer-id'],\n      requestId: headers['x-request-id'],\n    }\n  }\n})\n",[466,4374,4375,4383,4399,4417,4421,4427,4448,4468,4490,4512,4517,4539,4561,4565,4569],{"__ignoreMap":476},[480,4376,4377,4379,4381],{"class":482,"line":483},[480,4378,1062],{"class":572},[480,4380,576],{"class":494},[480,4382,617],{"class":490},[480,4384,4385,4387,4389,4391,4393,4395,4397],{"class":482,"line":537},[480,4386,1253],{"class":572},[480,4388,602],{"class":490},[480,4390,712],{"class":490},[480,4392,1262],{"class":715},[480,4394,644],{"class":490},[480,4396,583],{"class":582},[480,4398,586],{"class":490},[480,4400,4401,4403,4406,4408,4411,4413,4415],{"class":482,"line":556},[480,4402,1273],{"class":582},[480,4404,4405],{"class":494}," headers",[480,4407,743],{"class":490},[480,4409,4410],{"class":572}," getRequestHeaders",[480,4412,576],{"class":605},[480,4414,1262],{"class":494},[480,4416,664],{"class":605},[480,4418,4419],{"class":482,"line":563},[480,4420,560],{"emptyLinePlaceholder":559},[480,4422,4423,4425],{"class":482,"line":589},[480,4424,1321],{"class":486},[480,4426,586],{"class":490},[480,4428,4429,4431,4433,4435,4437,4439,4442,4444,4446],{"class":482,"line":595},[480,4430,1328],{"class":605},[480,4432,602],{"class":490},[480,4434,4405],{"class":494},[480,4436,4039],{"class":605},[480,4438,930],{"class":490},[480,4440,4441],{"class":507},"x-real-ip",[480,4443,930],{"class":490},[480,4445,1130],{"class":605},[480,4447,647],{"class":490},[480,4449,4450,4452,4454,4456,4458,4460,4462,4464,4466],{"class":482,"line":609},[480,4451,4078],{"class":605},[480,4453,602],{"class":490},[480,4455,4405],{"class":494},[480,4457,4039],{"class":605},[480,4459,930],{"class":490},[480,4461,4094],{"class":507},[480,4463,930],{"class":490},[480,4465,1130],{"class":605},[480,4467,647],{"class":490},[480,4469,4470,4473,4475,4477,4479,4481,4484,4486,4488],{"class":482,"line":620},[480,4471,4472],{"class":605},"      referrer",[480,4474,602],{"class":490},[480,4476,4405],{"class":494},[480,4478,4039],{"class":605},[480,4480,930],{"class":490},[480,4482,4483],{"class":507},"referer",[480,4485,930],{"class":490},[480,4487,1130],{"class":605},[480,4489,647],{"class":490},[480,4491,4492,4495,4497,4499,4501,4503,4506,4508,4510],{"class":482,"line":638},[480,4493,4494],{"class":605},"      acceptLanguage",[480,4496,602],{"class":490},[480,4498,4405],{"class":494},[480,4500,4039],{"class":605},[480,4502,930],{"class":490},[480,4504,4505],{"class":507},"accept-language",[480,4507,930],{"class":490},[480,4509,1130],{"class":605},[480,4511,647],{"class":490},[480,4513,4514],{"class":482,"line":650},[480,4515,4516],{"class":533},"      // Custom headers from your proxy\n",[480,4518,4519,4522,4524,4526,4528,4530,4533,4535,4537],{"class":482,"line":658},[480,4520,4521],{"class":605},"      customerId",[480,4523,602],{"class":490},[480,4525,4405],{"class":494},[480,4527,4039],{"class":605},[480,4529,930],{"class":490},[480,4531,4532],{"class":507},"x-customer-id",[480,4534,930],{"class":490},[480,4536,1130],{"class":605},[480,4538,647],{"class":490},[480,4540,4541,4544,4546,4548,4550,4552,4555,4557,4559],{"class":482,"line":826},[480,4542,4543],{"class":605},"      requestId",[480,4545,602],{"class":490},[480,4547,4405],{"class":494},[480,4549,4039],{"class":605},[480,4551,930],{"class":490},[480,4553,4554],{"class":507},"x-request-id",[480,4556,930],{"class":490},[480,4558,1130],{"class":605},[480,4560,647],{"class":490},[480,4562,4563],{"class":482,"line":832},[480,4564,880],{"class":490},[480,4566,4567],{"class":482,"line":871},[480,4568,886],{"class":490},[480,4570,4571,4573],{"class":482,"line":877},[480,4572,661],{"class":490},[480,4574,664],{"class":494},[459,4576,4578],{"id":4577},"context-structure","Context Structure",[455,4580,4581,4582,4584,4585,602],{},"The plugin adds ",[466,4583,751],{}," to ",[466,4586,4587],{},"HandlerContext",[471,4589,4591],{"className":473,"code":4590,"language":475,"meta":476,"style":476},"interface HandlerContext {\n  // ... other fields ...\n\n  requestMeta?: {\n    // Default fields (Cloudflare)\n    ip?: string\n    country?: string\n    city?: string\n    region?: string\n    timezone?: string\n    latitude?: string\n    longitude?: string\n    userAgent?: string\n\n    // Custom fields from your extractor\n    [key: string]: any\n  }\n}\n",[466,4592,4593,4603,4608,4612,4622,4627,4636,4644,4653,4662,4671,4680,4689,4698,4702,4707,4727,4731],{"__ignoreMap":476},[480,4594,4595,4598,4601],{"class":482,"line":483},[480,4596,4597],{"class":582},"interface",[480,4599,4600],{"class":598}," HandlerContext",[480,4602,586],{"class":490},[480,4604,4605],{"class":482,"line":537},[480,4606,4607],{"class":533},"  // ... other fields ...\n",[480,4609,4610],{"class":482,"line":556},[480,4611,560],{"emptyLinePlaceholder":559},[480,4613,4614,4617,4620],{"class":482,"line":563},[480,4615,4616],{"class":605},"  requestMeta",[480,4618,4619],{"class":490},"?:",[480,4621,586],{"class":490},[480,4623,4624],{"class":482,"line":589},[480,4625,4626],{"class":533},"    // Default fields (Cloudflare)\n",[480,4628,4629,4631,4633],{"class":482,"line":595},[480,4630,1080],{"class":605},[480,4632,4619],{"class":490},[480,4634,4635],{"class":598}," string\n",[480,4637,4638,4640,4642],{"class":482,"line":609},[480,4639,1096],{"class":605},[480,4641,4619],{"class":490},[480,4643,4635],{"class":598},[480,4645,4646,4649,4651],{"class":482,"line":620},[480,4647,4648],{"class":605},"    city",[480,4650,4619],{"class":490},[480,4652,4635],{"class":598},[480,4654,4655,4658,4660],{"class":482,"line":638},[480,4656,4657],{"class":605},"    region",[480,4659,4619],{"class":490},[480,4661,4635],{"class":598},[480,4663,4664,4667,4669],{"class":482,"line":650},[480,4665,4666],{"class":605},"    timezone",[480,4668,4619],{"class":490},[480,4670,4635],{"class":598},[480,4672,4673,4676,4678],{"class":482,"line":658},[480,4674,4675],{"class":605},"    latitude",[480,4677,4619],{"class":490},[480,4679,4635],{"class":598},[480,4681,4682,4685,4687],{"class":482,"line":826},[480,4683,4684],{"class":605},"    longitude",[480,4686,4619],{"class":490},[480,4688,4635],{"class":598},[480,4690,4691,4694,4696],{"class":482,"line":832},[480,4692,4693],{"class":605},"    userAgent",[480,4695,4619],{"class":490},[480,4697,4635],{"class":598},[480,4699,4700],{"class":482,"line":871},[480,4701,560],{"emptyLinePlaceholder":559},[480,4703,4704],{"class":482,"line":877},[480,4705,4706],{"class":533},"    // Custom fields from your extractor\n",[480,4708,4709,4712,4715,4717,4720,4722,4724],{"class":482,"line":883},[480,4710,4711],{"class":494},"    [",[480,4713,4714],{"class":715},"key",[480,4716,602],{"class":490},[480,4718,4719],{"class":598}," string",[480,4721,1130],{"class":494},[480,4723,602],{"class":490},[480,4725,4726],{"class":598}," any\n",[480,4728,4729],{"class":482,"line":889},[480,4730,886],{"class":490},[480,4732,4733],{"class":482,"line":2311},[480,4734,892],{"class":490},[459,4736,4738],{"id":4737},"best-practices","Best Practices",[517,4740,4742],{"id":4741},"_1-privacy-considerations","1. Privacy Considerations",[455,4744,4745],{},[1393,4746,4747],{},"Don't store IP addresses unless necessary:",[471,4749,4751],{"className":473,"code":4750,"language":475,"meta":476,"style":476},"// ✅ Good: Context-only for temporary use\ncreateRequestMetadataPlugin({\n  autoPopulate: false,  // Don't persist\n})\n\n// Use in hooks for analytics/logging\nafterCreate: async (result, context) => {\n  await analytics.track({\n    userId: result.id,\n    ip: context.requestMeta?.ip,  // Sent to analytics service, not stored\n  })\n}\n",[466,4752,4753,4758,4766,4779,4785,4789,4794,4816,4832,4848,4869,4876],{"__ignoreMap":476},[480,4754,4755],{"class":482,"line":483},[480,4756,4757],{"class":533},"// ✅ Good: Context-only for temporary use\n",[480,4759,4760,4762,4764],{"class":482,"line":537},[480,4761,1062],{"class":572},[480,4763,576],{"class":494},[480,4765,617],{"class":490},[480,4767,4768,4770,4772,4774,4776],{"class":482,"line":556},[480,4769,1071],{"class":605},[480,4771,602],{"class":490},[480,4773,629],{"class":628},[480,4775,632],{"class":490},[480,4777,4778],{"class":533},"  // Don't persist\n",[480,4780,4781,4783],{"class":482,"line":563},[480,4782,661],{"class":490},[480,4784,664],{"class":494},[480,4786,4787],{"class":482,"line":589},[480,4788,560],{"emptyLinePlaceholder":559},[480,4790,4791],{"class":482,"line":595},[480,4792,4793],{"class":533},"// Use in hooks for analytics/logging\n",[480,4795,4796,4798,4800,4802,4804,4806,4808,4810,4812,4814],{"class":482,"line":609},[480,4797,2755],{"class":598},[480,4799,602],{"class":490},[480,4801,709],{"class":582},[480,4803,712],{"class":490},[480,4805,716],{"class":715},[480,4807,632],{"class":490},[480,4809,721],{"class":715},[480,4811,644],{"class":490},[480,4813,583],{"class":582},[480,4815,586],{"class":490},[480,4817,4818,4820,4823,4825,4828,4830],{"class":482,"line":620},[480,4819,3251],{"class":486},[480,4821,4822],{"class":494}," analytics",[480,4824,748],{"class":490},[480,4826,4827],{"class":572},"track",[480,4829,576],{"class":605},[480,4831,617],{"class":490},[480,4833,4834,4837,4839,4842,4844,4846],{"class":482,"line":638},[480,4835,4836],{"class":605},"    userId",[480,4838,602],{"class":490},[480,4840,4841],{"class":494}," result",[480,4843,748],{"class":490},[480,4845,956],{"class":494},[480,4847,647],{"class":490},[480,4849,4850,4852,4854,4856,4858,4860,4862,4864,4866],{"class":482,"line":650},[480,4851,1080],{"class":605},[480,4853,602],{"class":490},[480,4855,721],{"class":494},[480,4857,748],{"class":490},[480,4859,751],{"class":494},[480,4861,754],{"class":490},[480,4863,863],{"class":494},[480,4865,632],{"class":490},[480,4867,4868],{"class":533},"  // Sent to analytics service, not stored\n",[480,4870,4871,4874],{"class":482,"line":658},[480,4872,4873],{"class":490},"  }",[480,4875,664],{"class":605},[480,4877,4878],{"class":482,"line":826},[480,4879,892],{"class":490},[517,4881,4883],{"id":4882},"_2-indexed-columns","2. Indexed Columns",[455,4885,4886],{},[1393,4887,4888],{},"Store frequently queried fields as columns:",[471,4890,4892],{"className":473,"code":4891,"language":475,"meta":476,"style":476},"// ✅ Good: Country as indexed column\nexport const users = sqliteTable('users', {\n  signupCountry: text('signup_country').index(),  // Fast queries\n  signupMeta: text('signup_meta', { mode: 'json' }),  // Full data\n})\n\n// Can efficiently query\nconst usUsers = await db.select()\n  .from(users)\n  .where(eq(users.signupCountry, 'US'))\n",[466,4893,4894,4899,4923,4953,4992,4998,5002,5007,5027,5037],{"__ignoreMap":476},[480,4895,4896],{"class":482,"line":483},[480,4897,4898],{"class":533},"// ✅ Good: Country as indexed column\n",[480,4900,4901,4903,4905,4907,4909,4911,4913,4915,4917,4919,4921],{"class":482,"line":537},[480,4902,566],{"class":486},[480,4904,916],{"class":582},[480,4906,919],{"class":494},[480,4908,922],{"class":490},[480,4910,925],{"class":572},[480,4912,576],{"class":494},[480,4914,930],{"class":490},[480,4916,933],{"class":507},[480,4918,930],{"class":490},[480,4920,632],{"class":490},[480,4922,586],{"class":490},[480,4924,4925,4927,4929,4931,4933,4935,4937,4939,4941,4943,4946,4948,4950],{"class":482,"line":556},[480,4926,1025],{"class":605},[480,4928,602],{"class":490},[480,4930,979],{"class":572},[480,4932,576],{"class":494},[480,4934,930],{"class":490},[480,4936,1036],{"class":507},[480,4938,930],{"class":490},[480,4940,644],{"class":494},[480,4942,748],{"class":490},[480,4944,4945],{"class":572},"index",[480,4947,579],{"class":494},[480,4949,632],{"class":490},[480,4951,4952],{"class":533},"  // Fast queries\n",[480,4954,4955,4957,4959,4961,4963,4965,4967,4969,4971,4973,4975,4977,4979,4981,4983,4985,4987,4989],{"class":482,"line":563},[480,4956,3685],{"class":605},[480,4958,602],{"class":490},[480,4960,979],{"class":572},[480,4962,576],{"class":494},[480,4964,930],{"class":490},[480,4966,3696],{"class":507},[480,4968,930],{"class":490},[480,4970,632],{"class":490},[480,4972,491],{"class":490},[480,4974,1668],{"class":605},[480,4976,602],{"class":490},[480,4978,504],{"class":490},[480,4980,1153],{"class":507},[480,4982,930],{"class":490},[480,4984,498],{"class":490},[480,4986,644],{"class":494},[480,4988,632],{"class":490},[480,4990,4991],{"class":533},"  // Full data\n",[480,4993,4994,4996],{"class":482,"line":589},[480,4995,661],{"class":490},[480,4997,664],{"class":494},[480,4999,5000],{"class":482,"line":595},[480,5001,560],{"emptyLinePlaceholder":559},[480,5003,5004],{"class":482,"line":609},[480,5005,5006],{"class":533},"// Can efficiently query\n",[480,5008,5009,5012,5015,5017,5019,5021,5023,5025],{"class":482,"line":620},[480,5010,5011],{"class":582},"const",[480,5013,5014],{"class":494}," usUsers ",[480,5016,922],{"class":490},[480,5018,1298],{"class":486},[480,5020,2829],{"class":494},[480,5022,748],{"class":490},[480,5024,2834],{"class":572},[480,5026,2837],{"class":494},[480,5028,5029,5032,5034],{"class":482,"line":638},[480,5030,5031],{"class":490},"  .",[480,5033,2845],{"class":572},[480,5035,5036],{"class":494},"(users)\n",[480,5038,5039,5041,5043,5045,5047,5050,5052,5054,5056,5058,5060,5062],{"class":482,"line":650},[480,5040,5031],{"class":490},[480,5042,2858],{"class":572},[480,5044,576],{"class":494},[480,5046,2863],{"class":572},[480,5048,5049],{"class":494},"(users",[480,5051,748],{"class":490},[480,5053,1103],{"class":494},[480,5055,632],{"class":490},[480,5057,504],{"class":490},[480,5059,765],{"class":507},[480,5061,930],{"class":490},[480,5063,2878],{"class":494},[517,5065,5067],{"id":5066},"_3-dont-overwrite-user-input","3. Don't Overwrite User Input",[455,5069,5070],{},"The plugin automatically skips fields the user has set:",[471,5072,5074],{"className":473,"code":5073,"language":475,"meta":476,"style":476},"// User explicitly provides a value\nPOST /api/users\n{\n  \"email\": \"user@example.com\",\n  \"signupIp\": \"custom-value\"  // Won't be overwritten\n}\n",[466,5075,5076,5081,5097,5101,5119,5139],{"__ignoreMap":476},[480,5077,5078],{"class":482,"line":483},[480,5079,5080],{"class":533},"// User explicitly provides a value\n",[480,5082,5083,5086,5089,5092,5094],{"class":482,"line":537},[480,5084,5085],{"class":494},"POST ",[480,5087,5088],{"class":490},"/",[480,5090,5091],{"class":494},"api",[480,5093,5088],{"class":490},[480,5095,5096],{"class":494},"users\n",[480,5098,5099],{"class":482,"line":556},[480,5100,617],{"class":490},[480,5102,5103,5105,5107,5109,5111,5113,5115,5117],{"class":482,"line":563},[480,5104,1164],{"class":490},[480,5106,813],{"class":507},[480,5108,1169],{"class":490},[480,5110,858],{"class":605},[480,5112,1169],{"class":490},[480,5114,1177],{"class":507},[480,5116,1169],{"class":490},[480,5118,647],{"class":490},[480,5120,5121,5123,5125,5127,5129,5131,5134,5136],{"class":482,"line":589},[480,5122,1164],{"class":490},[480,5124,1087],{"class":507},[480,5126,1169],{"class":490},[480,5128,858],{"class":605},[480,5130,1169],{"class":490},[480,5132,5133],{"class":507},"custom-value",[480,5135,1169],{"class":490},[480,5137,5138],{"class":533},"  // Won't be overwritten\n",[480,5140,5141],{"class":482,"line":595},[480,5142,892],{"class":490},[517,5144,5146],{"id":5145},"_4-handle-missing-metadata","4. Handle Missing Metadata",[455,5148,5149],{},"Always check for undefined metadata:",[471,5151,5153],{"className":473,"code":5152,"language":475,"meta":476,"style":476},"afterCreate: async (result, context) => {\n  const country = context.requestMeta?.country || 'UNKNOWN'\n  const ip = context.requestMeta?.ip || 'unknown'\n\n  // Safe to use\n  console.log(`User from ${country} (${ip})`)\n}\n",[466,5154,5155,5177,5204,5231,5235,5240,5276],{"__ignoreMap":476},[480,5156,5157,5159,5161,5163,5165,5167,5169,5171,5173,5175],{"class":482,"line":483},[480,5158,2755],{"class":598},[480,5160,602],{"class":490},[480,5162,709],{"class":582},[480,5164,712],{"class":490},[480,5166,716],{"class":715},[480,5168,632],{"class":490},[480,5170,721],{"class":715},[480,5172,644],{"class":490},[480,5174,583],{"class":582},[480,5176,586],{"class":490},[480,5178,5179,5181,5183,5185,5187,5189,5191,5193,5195,5197,5199,5202],{"class":482,"line":537},[480,5180,2778],{"class":582},[480,5182,740],{"class":494},[480,5184,743],{"class":490},[480,5186,721],{"class":494},[480,5188,748],{"class":490},[480,5190,751],{"class":494},[480,5192,754],{"class":490},[480,5194,757],{"class":494},[480,5196,760],{"class":490},[480,5198,504],{"class":490},[480,5200,5201],{"class":507},"UNKNOWN",[480,5203,511],{"class":490},[480,5205,5206,5208,5210,5212,5214,5216,5218,5220,5222,5224,5226,5229],{"class":482,"line":556},[480,5207,2778],{"class":582},[480,5209,774],{"class":494},[480,5211,743],{"class":490},[480,5213,721],{"class":494},[480,5215,748],{"class":490},[480,5217,751],{"class":494},[480,5219,754],{"class":490},[480,5221,863],{"class":494},[480,5223,760],{"class":490},[480,5225,504],{"class":490},[480,5227,5228],{"class":507},"unknown",[480,5230,511],{"class":490},[480,5232,5233],{"class":482,"line":563},[480,5234,560],{"emptyLinePlaceholder":559},[480,5236,5237],{"class":482,"line":589},[480,5238,5239],{"class":533},"  // Safe to use\n",[480,5241,5242,5245,5247,5249,5251,5253,5256,5258,5260,5262,5264,5266,5268,5270,5272,5274],{"class":482,"line":595},[480,5243,5244],{"class":494},"  console",[480,5246,748],{"class":490},[480,5248,840],{"class":572},[480,5250,576],{"class":605},[480,5252,845],{"class":490},[480,5254,5255],{"class":507},"User from ",[480,5257,851],{"class":490},[480,5259,757],{"class":494},[480,5261,661],{"class":490},[480,5263,712],{"class":507},[480,5265,851],{"class":490},[480,5267,863],{"class":494},[480,5269,661],{"class":490},[480,5271,644],{"class":507},[480,5273,845],{"class":490},[480,5275,664],{"class":605},[480,5277,5278],{"class":482,"line":609},[480,5279,892],{"class":490},[517,5281,5283],{"id":5282},"_5-resource-filtering","5. Resource Filtering",[455,5285,5286],{},"Only auto-populate for relevant resources:",[471,5288,5290],{"className":473,"code":5289,"language":475,"meta":476,"style":476},"createRequestMetadataPlugin({\n  autoPopulate: { ip: 'signupIp' },\n  resources: ['users'],  // Not needed for products, categories, etc.\n})\n",[466,5291,5292,5300,5320,5341],{"__ignoreMap":476},[480,5293,5294,5296,5298],{"class":482,"line":483},[480,5295,1062],{"class":572},[480,5297,576],{"class":494},[480,5299,617],{"class":490},[480,5301,5302,5304,5306,5308,5310,5312,5314,5316,5318],{"class":482,"line":537},[480,5303,1071],{"class":605},[480,5305,602],{"class":490},[480,5307,491],{"class":490},[480,5309,774],{"class":605},[480,5311,602],{"class":490},[480,5313,504],{"class":490},[480,5315,1087],{"class":507},[480,5317,930],{"class":490},[480,5319,3425],{"class":490},[480,5321,5322,5324,5326,5328,5330,5332,5334,5336,5338],{"class":482,"line":556},[480,5323,3448],{"class":605},[480,5325,602],{"class":490},[480,5327,1120],{"class":494},[480,5329,930],{"class":490},[480,5331,933],{"class":507},[480,5333,930],{"class":490},[480,5335,1130],{"class":494},[480,5337,632],{"class":490},[480,5339,5340],{"class":533},"  // Not needed for products, categories, etc.\n",[480,5342,5343,5345],{"class":482,"line":563},[480,5344,661],{"class":490},[480,5346,664],{"class":494},[459,5348,5350],{"id":5349},"typescript-support","TypeScript Support",[455,5352,5353],{},"The plugin is fully typed. Context metadata is available with autocomplete:",[471,5355,5357],{"className":473,"code":5356,"language":475,"meta":476,"style":476},"import type { HandlerContext } from '@websideproject/nuxt-auto-api'\n\n// In hooks\nafterCreate: async (result: any, context: HandlerContext) => {\n  // context.requestMeta is typed\n  const ip: string | undefined = context.requestMeta?.ip\n  const country: string | undefined = context.requestMeta?.country\n}\n",[466,5358,5359,5380,5384,5389,5420,5425,5453,5479],{"__ignoreMap":476},[480,5360,5361,5363,5366,5368,5370,5372,5374,5376,5378],{"class":482,"line":483},[480,5362,487],{"class":486},[480,5364,5365],{"class":486}," type",[480,5367,491],{"class":490},[480,5369,4600],{"class":494},[480,5371,498],{"class":490},[480,5373,501],{"class":486},[480,5375,504],{"class":490},[480,5377,468],{"class":507},[480,5379,511],{"class":490},[480,5381,5382],{"class":482,"line":537},[480,5383,560],{"emptyLinePlaceholder":559},[480,5385,5386],{"class":482,"line":556},[480,5387,5388],{"class":533},"// In hooks\n",[480,5390,5391,5393,5395,5397,5399,5401,5403,5406,5408,5410,5412,5414,5416,5418],{"class":482,"line":563},[480,5392,2755],{"class":598},[480,5394,602],{"class":490},[480,5396,709],{"class":582},[480,5398,712],{"class":490},[480,5400,716],{"class":715},[480,5402,602],{"class":490},[480,5404,5405],{"class":598}," any",[480,5407,632],{"class":490},[480,5409,721],{"class":715},[480,5411,602],{"class":490},[480,5413,4600],{"class":598},[480,5415,644],{"class":490},[480,5417,583],{"class":582},[480,5419,586],{"class":490},[480,5421,5422],{"class":482,"line":589},[480,5423,5424],{"class":533},"  // context.requestMeta is typed\n",[480,5426,5427,5429,5431,5433,5435,5438,5441,5443,5445,5447,5449,5451],{"class":482,"line":595},[480,5428,2778],{"class":582},[480,5430,774],{"class":494},[480,5432,602],{"class":490},[480,5434,4719],{"class":598},[480,5436,5437],{"class":490}," |",[480,5439,5440],{"class":598}," undefined",[480,5442,743],{"class":490},[480,5444,721],{"class":494},[480,5446,748],{"class":490},[480,5448,751],{"class":494},[480,5450,754],{"class":490},[480,5452,787],{"class":494},[480,5454,5455,5457,5459,5461,5463,5465,5467,5469,5471,5473,5475,5477],{"class":482,"line":609},[480,5456,2778],{"class":582},[480,5458,740],{"class":494},[480,5460,602],{"class":490},[480,5462,4719],{"class":598},[480,5464,5437],{"class":490},[480,5466,5440],{"class":598},[480,5468,743],{"class":490},[480,5470,721],{"class":494},[480,5472,748],{"class":490},[480,5474,751],{"class":494},[480,5476,754],{"class":490},[480,5478,3044],{"class":494},[480,5480,5481],{"class":482,"line":620},[480,5482,892],{"class":490},[455,5484,5485],{},"Custom extractors are also typed:",[471,5487,5489],{"className":473,"code":5488,"language":475,"meta":476,"style":476},"import type { H3Event } from 'h3'\n\ncreateRequestMetadataPlugin({\n  extract: async (event: H3Event): Promise\u003CRecord\u003Cstring, any>> => {\n    return {\n      customField: 'value'\n    }\n  }\n})\n",[466,5490,5491,5512,5516,5524,5568,5574,5586,5590,5594],{"__ignoreMap":476},[480,5492,5493,5495,5497,5499,5502,5504,5506,5508,5510],{"class":482,"line":483},[480,5494,487],{"class":486},[480,5496,5365],{"class":486},[480,5498,491],{"class":490},[480,5500,5501],{"class":494}," H3Event",[480,5503,498],{"class":490},[480,5505,501],{"class":486},[480,5507,504],{"class":490},[480,5509,517],{"class":507},[480,5511,511],{"class":490},[480,5513,5514],{"class":482,"line":537},[480,5515,560],{"emptyLinePlaceholder":559},[480,5517,5518,5520,5522],{"class":482,"line":556},[480,5519,1062],{"class":572},[480,5521,576],{"class":494},[480,5523,617],{"class":490},[480,5525,5526,5528,5530,5532,5534,5536,5538,5540,5543,5546,5549,5552,5554,5557,5559,5561,5564,5566],{"class":482,"line":563},[480,5527,1253],{"class":572},[480,5529,602],{"class":490},[480,5531,709],{"class":582},[480,5533,712],{"class":490},[480,5535,1262],{"class":715},[480,5537,602],{"class":490},[480,5539,5501],{"class":598},[480,5541,5542],{"class":490},"):",[480,5544,5545],{"class":598}," Promise",[480,5547,5548],{"class":490},"\u003C",[480,5550,5551],{"class":598},"Record",[480,5553,5548],{"class":490},[480,5555,5556],{"class":598},"string",[480,5558,632],{"class":490},[480,5560,5405],{"class":598},[480,5562,5563],{"class":490},">>",[480,5565,583],{"class":582},[480,5567,586],{"class":490},[480,5569,5570,5572],{"class":482,"line":589},[480,5571,1321],{"class":486},[480,5573,586],{"class":490},[480,5575,5576,5578,5580,5582,5584],{"class":482,"line":595},[480,5577,1366],{"class":605},[480,5579,602],{"class":490},[480,5581,504],{"class":490},[480,5583,1373],{"class":507},[480,5585,511],{"class":490},[480,5587,5588],{"class":482,"line":609},[480,5589,880],{"class":490},[480,5591,5592],{"class":482,"line":620},[480,5593,886],{"class":490},[480,5595,5596,5598],{"class":482,"line":638},[480,5597,661],{"class":490},[480,5599,664],{"class":494},[459,5601,5603],{"id":5602},"comparison-storage-strategies","Comparison: Storage Strategies",[5605,5606,5607,5623],"table",{},[5608,5609,5610],"thead",{},[5611,5612,5613,5617,5620],"tr",{},[5614,5615,5616],"th",{},"Strategy",[5614,5618,5619],{},"Best For",[5614,5621,5622],{},"Example",[5624,5625,5626,5642,5657,5672,5685],"tbody",{},[5611,5627,5628,5634,5637],{},[5629,5630,5631],"td",{},[1393,5632,5633],{},"Context-only",[5629,5635,5636],{},"Hooks, logging, auth decisions",[5629,5638,5639],{},[466,5640,5641],{},"autoPopulate: false",[5611,5643,5644,5649,5652],{},[5629,5645,5646],{},[1393,5647,5648],{},"Column mapping",[5629,5650,5651],{},"Simple schemas, frequent queries",[5629,5653,5654],{},[466,5655,5656],{},"{ ip: 'signupIp' }",[5611,5658,5659,5664,5667],{},[5629,5660,5661],{},[1393,5662,5663],{},"JSON field",[5629,5665,5666],{},"Flexible schemas, rare queries",[5629,5668,5669],{},[466,5670,5671],{},"{ json: 'metadata' }",[5611,5673,5674,5679,5682],{},[5629,5675,5676],{},[1393,5677,5678],{},"Custom mapper",[5629,5680,5681],{},"Complex logic, computed fields",[5629,5683,5684],{},"Custom function",[5611,5686,5687,5692,5695],{},[5629,5688,5689],{},[1393,5690,5691],{},"Hybrid",[5629,5693,5694],{},"Production apps (indexed + flexible)",[5629,5696,5697],{},"Column + JSON",[459,5699,5701],{"id":5700},"performance-considerations","Performance Considerations",[517,5703,5705],{"id":5704},"extraction-cost","Extraction Cost",[1397,5707,5708,5714,5720],{},[1400,5709,5710,5713],{},[1393,5711,5712],{},"Cloudflare headers"," (default): ~0ms (just reading headers)",[1400,5715,5716,5719],{},[1393,5717,5718],{},"GeoIP-lite lookup",": ~1-5ms (in-memory database)",[1400,5721,5722,5725],{},[1393,5723,5724],{},"External API calls",": ~50-500ms (network latency)",[455,5727,5728],{},"For external APIs, consider:",[1397,5730,5731,5734,5737],{},[1400,5732,5733],{},"Caching results by IP",[1400,5735,5736],{},"Using background jobs for non-critical data",[1400,5738,5739],{},"Fallback to fast headers if API fails",[517,5741,5743],{"id":5742},"storage-cost","Storage Cost",[1397,5745,5746,5751,5756],{},[1400,5747,5748,5750],{},[1393,5749,5633],{},": Zero DB overhead",[1400,5752,5753,5755],{},[1393,5754,5648],{},": Minimal (native column writes)",[1400,5757,5758,5760],{},[1393,5759,5663],{},": Slightly slower on write, but flexible",[459,5762,5764],{"id":5763},"example-complete-setup","Example: Complete Setup",[471,5766,5768],{"className":473,"code":5767,"language":475,"meta":476,"style":476},"// server/db/schema.ts\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey(),\n  email: text('email').notNull().unique(),\n  name: text('name'),\n\n  // Metadata columns\n  signupCountry: text('signup_country').index(),  // Fast queries\n  signupMeta: text('signup_meta', { mode: 'json' }),  // Full metadata\n\n  // Audit fields\n  lastIp: text('last_ip'),\n  lastSeen: integer('last_seen'),\n})\n\n// server/plugins/autoapi.ts\nimport { createRequestMetadataPlugin } from '@websideproject/nuxt-auto-api/plugins'\n\nexport default defineNitroPlugin(() => {\n  // Auto API configuration\n  plugins: [\n    createRequestMetadataPlugin({\n      // Use Cloudflare headers (default)\n      extract: undefined,\n\n      // Hybrid storage\n      autoPopulate: (metadata, data, context) => {\n        if (context.operation === 'create') {\n          // Store country for fast queries\n          data.signupCountry = metadata.country\n\n          // Store full metadata\n          data.signupMeta = {\n            ip: metadata.ip,\n            country: metadata.country,\n            city: metadata.city,\n            userAgent: metadata.userAgent,\n            timestamp: new Date().toISOString(),\n          }\n        }\n\n        if (context.operation === 'update') {\n          // Track last seen\n          data.lastIp = metadata.ip\n          data.lastSeen = Date.now()\n        }\n\n        return data\n      },\n\n      autoPopulateOn: ['create', 'update'],\n      resources: ['users'],  // Only track for users\n    }),\n  ],\n\n  hooks: {\n    users: {\n      afterCreate: async (result, context) => {\n        // Send localized welcome email\n        const country = context.requestMeta?.country || 'US'\n        await sendWelcomeEmail(result.email, country)\n\n        // Log to analytics (not stored in DB)\n        await analytics.track({\n          event: 'user_signup',\n          userId: result.id,\n          properties: context.requestMeta,\n        })\n      }\n    }\n  }\n})\n",[466,5769,5770,5775,5799,5825,5858,5879,5883,5888,5916,5954,5958,5963,5983,6003,6009,6013,6017,6035,6039,6055,6060,6068,6076,6081,6092,6097,6103,6128,6155,6161,6179,6184,6190,6203,6219,6235,6251,6267,6289,6294,6299,6304,6329,6335,6352,6371,6376,6381,6389,6395,6400,6428,6451,6460,6467,6472,6481,6490,6513,6518,6545,6566,6571,6577,6592,6609,6625,6641,6649,6654,6659,6664],{"__ignoreMap":476},[480,5771,5772],{"class":482,"line":483},[480,5773,5774],{"class":533},"// server/db/schema.ts\n",[480,5776,5777,5779,5781,5783,5785,5787,5789,5791,5793,5795,5797],{"class":482,"line":537},[480,5778,566],{"class":486},[480,5780,916],{"class":582},[480,5782,919],{"class":494},[480,5784,922],{"class":490},[480,5786,925],{"class":572},[480,5788,576],{"class":494},[480,5790,930],{"class":490},[480,5792,933],{"class":507},[480,5794,930],{"class":490},[480,5796,632],{"class":490},[480,5798,586],{"class":490},[480,5800,5801,5803,5805,5807,5809,5811,5813,5815,5817,5819,5821,5823],{"class":482,"line":556},[480,5802,944],{"class":605},[480,5804,602],{"class":490},[480,5806,949],{"class":572},[480,5808,576],{"class":494},[480,5810,930],{"class":490},[480,5812,956],{"class":507},[480,5814,930],{"class":490},[480,5816,644],{"class":494},[480,5818,748],{"class":490},[480,5820,965],{"class":572},[480,5822,579],{"class":494},[480,5824,647],{"class":490},[480,5826,5827,5829,5831,5833,5835,5837,5839,5841,5843,5845,5847,5849,5851,5854,5856],{"class":482,"line":563},[480,5828,974],{"class":605},[480,5830,602],{"class":490},[480,5832,979],{"class":572},[480,5834,576],{"class":494},[480,5836,930],{"class":490},[480,5838,813],{"class":507},[480,5840,930],{"class":490},[480,5842,644],{"class":494},[480,5844,748],{"class":490},[480,5846,994],{"class":572},[480,5848,579],{"class":494},[480,5850,748],{"class":490},[480,5852,5853],{"class":572},"unique",[480,5855,579],{"class":494},[480,5857,647],{"class":490},[480,5859,5860,5863,5865,5867,5869,5871,5873,5875,5877],{"class":482,"line":589},[480,5861,5862],{"class":605},"  name",[480,5864,602],{"class":490},[480,5866,979],{"class":572},[480,5868,576],{"class":494},[480,5870,930],{"class":490},[480,5872,4308],{"class":507},[480,5874,930],{"class":490},[480,5876,644],{"class":494},[480,5878,647],{"class":490},[480,5880,5881],{"class":482,"line":595},[480,5882,560],{"emptyLinePlaceholder":559},[480,5884,5885],{"class":482,"line":609},[480,5886,5887],{"class":533},"  // Metadata columns\n",[480,5889,5890,5892,5894,5896,5898,5900,5902,5904,5906,5908,5910,5912,5914],{"class":482,"line":620},[480,5891,1025],{"class":605},[480,5893,602],{"class":490},[480,5895,979],{"class":572},[480,5897,576],{"class":494},[480,5899,930],{"class":490},[480,5901,1036],{"class":507},[480,5903,930],{"class":490},[480,5905,644],{"class":494},[480,5907,748],{"class":490},[480,5909,4945],{"class":572},[480,5911,579],{"class":494},[480,5913,632],{"class":490},[480,5915,4952],{"class":533},[480,5917,5918,5920,5922,5924,5926,5928,5930,5932,5934,5936,5938,5940,5942,5944,5946,5948,5950,5952],{"class":482,"line":638},[480,5919,3685],{"class":605},[480,5921,602],{"class":490},[480,5923,979],{"class":572},[480,5925,576],{"class":494},[480,5927,930],{"class":490},[480,5929,3696],{"class":507},[480,5931,930],{"class":490},[480,5933,632],{"class":490},[480,5935,491],{"class":490},[480,5937,1668],{"class":605},[480,5939,602],{"class":490},[480,5941,504],{"class":490},[480,5943,1153],{"class":507},[480,5945,930],{"class":490},[480,5947,498],{"class":490},[480,5949,644],{"class":494},[480,5951,632],{"class":490},[480,5953,3721],{"class":533},[480,5955,5956],{"class":482,"line":650},[480,5957,560],{"emptyLinePlaceholder":559},[480,5959,5960],{"class":482,"line":658},[480,5961,5962],{"class":533},"  // Audit fields\n",[480,5964,5965,5967,5969,5971,5973,5975,5977,5979,5981],{"class":482,"line":826},[480,5966,3342],{"class":605},[480,5968,602],{"class":490},[480,5970,979],{"class":572},[480,5972,576],{"class":494},[480,5974,930],{"class":490},[480,5976,3353],{"class":507},[480,5978,930],{"class":490},[480,5980,644],{"class":494},[480,5982,647],{"class":490},[480,5984,5985,5987,5989,5991,5993,5995,5997,5999,6001],{"class":482,"line":832},[480,5986,3364],{"class":605},[480,5988,602],{"class":490},[480,5990,949],{"class":572},[480,5992,576],{"class":494},[480,5994,930],{"class":490},[480,5996,3375],{"class":507},[480,5998,930],{"class":490},[480,6000,644],{"class":494},[480,6002,647],{"class":490},[480,6004,6005,6007],{"class":482,"line":871},[480,6006,661],{"class":490},[480,6008,664],{"class":494},[480,6010,6011],{"class":482,"line":877},[480,6012,560],{"emptyLinePlaceholder":559},[480,6014,6015],{"class":482,"line":883},[480,6016,534],{"class":533},[480,6018,6019,6021,6023,6025,6027,6029,6031,6033],{"class":482,"line":889},[480,6020,487],{"class":486},[480,6022,491],{"class":490},[480,6024,495],{"class":494},[480,6026,498],{"class":490},[480,6028,501],{"class":486},[480,6030,504],{"class":490},[480,6032,508],{"class":507},[480,6034,511],{"class":490},[480,6036,6037],{"class":482,"line":2311},[480,6038,560],{"emptyLinePlaceholder":559},[480,6040,6041,6043,6045,6047,6049,6051,6053],{"class":482,"line":2316},[480,6042,566],{"class":486},[480,6044,569],{"class":486},[480,6046,573],{"class":572},[480,6048,576],{"class":494},[480,6050,579],{"class":490},[480,6052,583],{"class":582},[480,6054,586],{"class":490},[480,6056,6057],{"class":482,"line":2325},[480,6058,6059],{"class":533},"  // Auto API configuration\n",[480,6061,6062,6064,6066],{"class":482,"line":3553},[480,6063,599],{"class":598},[480,6065,602],{"class":490},[480,6067,606],{"class":605},[480,6069,6070,6072,6074],{"class":482,"line":3558},[480,6071,612],{"class":572},[480,6073,576],{"class":605},[480,6075,617],{"class":490},[480,6077,6078],{"class":482,"line":3563},[480,6079,6080],{"class":533},"      // Use Cloudflare headers (default)\n",[480,6082,6084,6087,6089],{"class":482,"line":6083},24,[480,6085,6086],{"class":605},"      extract",[480,6088,602],{"class":490},[480,6090,6091],{"class":490}," undefined,\n",[480,6093,6095],{"class":482,"line":6094},25,[480,6096,560],{"emptyLinePlaceholder":559},[480,6098,6100],{"class":482,"line":6099},26,[480,6101,6102],{"class":533},"      // Hybrid storage\n",[480,6104,6106,6108,6110,6112,6114,6116,6118,6120,6122,6124,6126],{"class":482,"line":6105},27,[480,6107,623],{"class":572},[480,6109,602],{"class":490},[480,6111,712],{"class":490},[480,6113,1659],{"class":715},[480,6115,632],{"class":490},[480,6117,2049],{"class":715},[480,6119,632],{"class":490},[480,6121,721],{"class":715},[480,6123,644],{"class":490},[480,6125,583],{"class":582},[480,6127,586],{"class":490},[480,6129,6131,6134,6136,6138,6140,6143,6145,6147,6149,6151,6153],{"class":482,"line":6130},28,[480,6132,6133],{"class":486},"        if",[480,6135,712],{"class":605},[480,6137,3018],{"class":494},[480,6139,748],{"class":490},[480,6141,6142],{"class":494},"operation",[480,6144,2183],{"class":490},[480,6146,504],{"class":490},[480,6148,1125],{"class":507},[480,6150,930],{"class":490},[480,6152,2260],{"class":605},[480,6154,617],{"class":490},[480,6156,6158],{"class":482,"line":6157},29,[480,6159,6160],{"class":533},"          // Store country for fast queries\n",[480,6162,6164,6167,6169,6171,6173,6175,6177],{"class":482,"line":6163},30,[480,6165,6166],{"class":494},"          data",[480,6168,748],{"class":490},[480,6170,1103],{"class":494},[480,6172,743],{"class":490},[480,6174,2087],{"class":494},[480,6176,748],{"class":490},[480,6178,3044],{"class":494},[480,6180,6182],{"class":482,"line":6181},31,[480,6183,560],{"emptyLinePlaceholder":559},[480,6185,6187],{"class":482,"line":6186},32,[480,6188,6189],{"class":533},"          // Store full metadata\n",[480,6191,6193,6195,6197,6199,6201],{"class":482,"line":6192},33,[480,6194,6166],{"class":494},[480,6196,748],{"class":490},[480,6198,2074],{"class":494},[480,6200,743],{"class":490},[480,6202,586],{"class":490},[480,6204,6206,6209,6211,6213,6215,6217],{"class":482,"line":6205},34,[480,6207,6208],{"class":605},"            ip",[480,6210,602],{"class":490},[480,6212,2087],{"class":494},[480,6214,748],{"class":490},[480,6216,863],{"class":494},[480,6218,647],{"class":490},[480,6220,6222,6225,6227,6229,6231,6233],{"class":482,"line":6221},35,[480,6223,6224],{"class":605},"            country",[480,6226,602],{"class":490},[480,6228,2087],{"class":494},[480,6230,748],{"class":490},[480,6232,757],{"class":494},[480,6234,647],{"class":490},[480,6236,6238,6241,6243,6245,6247,6249],{"class":482,"line":6237},36,[480,6239,6240],{"class":605},"            city",[480,6242,602],{"class":490},[480,6244,2087],{"class":494},[480,6246,748],{"class":490},[480,6248,1359],{"class":494},[480,6250,647],{"class":490},[480,6252,6254,6257,6259,6261,6263,6265],{"class":482,"line":6253},37,[480,6255,6256],{"class":605},"            userAgent",[480,6258,602],{"class":490},[480,6260,2087],{"class":494},[480,6262,748],{"class":490},[480,6264,1864],{"class":494},[480,6266,647],{"class":490},[480,6268,6270,6273,6275,6277,6279,6281,6283,6285,6287],{"class":482,"line":6269},38,[480,6271,6272],{"class":605},"            timestamp",[480,6274,602],{"class":490},[480,6276,2136],{"class":490},[480,6278,2139],{"class":572},[480,6280,579],{"class":605},[480,6282,748],{"class":490},[480,6284,2146],{"class":572},[480,6286,579],{"class":605},[480,6288,647],{"class":490},[480,6290,6292],{"class":482,"line":6291},39,[480,6293,3116],{"class":490},[480,6295,6297],{"class":482,"line":6296},40,[480,6298,3129],{"class":490},[480,6300,6302],{"class":482,"line":6301},41,[480,6303,560],{"emptyLinePlaceholder":559},[480,6305,6307,6309,6311,6313,6315,6317,6319,6321,6323,6325,6327],{"class":482,"line":6306},42,[480,6308,6133],{"class":486},[480,6310,712],{"class":605},[480,6312,3018],{"class":494},[480,6314,748],{"class":490},[480,6316,6142],{"class":494},[480,6318,2183],{"class":490},[480,6320,504],{"class":490},[480,6322,2408],{"class":507},[480,6324,930],{"class":490},[480,6326,2260],{"class":605},[480,6328,617],{"class":490},[480,6330,6332],{"class":482,"line":6331},43,[480,6333,6334],{"class":533},"          // Track last seen\n",[480,6336,6338,6340,6342,6344,6346,6348,6350],{"class":482,"line":6337},44,[480,6339,6166],{"class":494},[480,6341,748],{"class":490},[480,6343,3420],{"class":494},[480,6345,743],{"class":490},[480,6347,2087],{"class":494},[480,6349,748],{"class":490},[480,6351,787],{"class":494},[480,6353,6355,6357,6359,6361,6363,6365,6367,6369],{"class":482,"line":6354},45,[480,6356,6166],{"class":494},[480,6358,748],{"class":490},[480,6360,3532],{"class":494},[480,6362,743],{"class":490},[480,6364,2139],{"class":494},[480,6366,748],{"class":490},[480,6368,3541],{"class":572},[480,6370,2837],{"class":605},[480,6372,6374],{"class":482,"line":6373},46,[480,6375,3129],{"class":490},[480,6377,6379],{"class":482,"line":6378},47,[480,6380,560],{"emptyLinePlaceholder":559},[480,6382,6384,6387],{"class":482,"line":6383},48,[480,6385,6386],{"class":486},"        return",[480,6388,2322],{"class":494},[480,6390,6392],{"class":482,"line":6391},49,[480,6393,6394],{"class":490},"      },\n",[480,6396,6398],{"class":482,"line":6397},50,[480,6399,560],{"emptyLinePlaceholder":559},[480,6401,6403,6406,6408,6410,6412,6414,6416,6418,6420,6422,6424,6426],{"class":482,"line":6402},51,[480,6404,6405],{"class":605},"      autoPopulateOn",[480,6407,602],{"class":490},[480,6409,1120],{"class":605},[480,6411,930],{"class":490},[480,6413,1125],{"class":507},[480,6415,930],{"class":490},[480,6417,632],{"class":490},[480,6419,504],{"class":490},[480,6421,2408],{"class":507},[480,6423,930],{"class":490},[480,6425,1130],{"class":605},[480,6427,647],{"class":490},[480,6429,6431,6434,6436,6438,6440,6442,6444,6446,6448],{"class":482,"line":6430},52,[480,6432,6433],{"class":605},"      resources",[480,6435,602],{"class":490},[480,6437,1120],{"class":605},[480,6439,930],{"class":490},[480,6441,933],{"class":507},[480,6443,930],{"class":490},[480,6445,1130],{"class":605},[480,6447,632],{"class":490},[480,6449,6450],{"class":533},"  // Only track for users\n",[480,6452,6454,6456,6458],{"class":482,"line":6453},53,[480,6455,641],{"class":490},[480,6457,644],{"class":605},[480,6459,647],{"class":490},[480,6461,6463,6465],{"class":482,"line":6462},54,[480,6464,653],{"class":605},[480,6466,647],{"class":490},[480,6468,6470],{"class":482,"line":6469},55,[480,6471,560],{"emptyLinePlaceholder":559},[480,6473,6475,6477,6479],{"class":482,"line":6474},56,[480,6476,686],{"class":598},[480,6478,602],{"class":490},[480,6480,586],{"class":490},[480,6482,6484,6486,6488],{"class":482,"line":6483},57,[480,6485,695],{"class":598},[480,6487,602],{"class":490},[480,6489,586],{"class":490},[480,6491,6493,6495,6497,6499,6501,6503,6505,6507,6509,6511],{"class":482,"line":6492},58,[480,6494,704],{"class":598},[480,6496,602],{"class":490},[480,6498,709],{"class":582},[480,6500,712],{"class":490},[480,6502,716],{"class":715},[480,6504,632],{"class":490},[480,6506,721],{"class":715},[480,6508,644],{"class":490},[480,6510,583],{"class":582},[480,6512,586],{"class":490},[480,6514,6516],{"class":482,"line":6515},59,[480,6517,796],{"class":533},[480,6519,6521,6523,6525,6527,6529,6531,6533,6535,6537,6539,6541,6543],{"class":482,"line":6520},60,[480,6522,737],{"class":582},[480,6524,740],{"class":494},[480,6526,743],{"class":490},[480,6528,721],{"class":494},[480,6530,748],{"class":490},[480,6532,751],{"class":494},[480,6534,754],{"class":490},[480,6536,757],{"class":494},[480,6538,760],{"class":490},[480,6540,504],{"class":490},[480,6542,765],{"class":507},[480,6544,511],{"class":490},[480,6546,6548,6550,6552,6554,6556,6558,6560,6562,6564],{"class":482,"line":6547},61,[480,6549,801],{"class":486},[480,6551,804],{"class":572},[480,6553,576],{"class":605},[480,6555,716],{"class":494},[480,6557,748],{"class":490},[480,6559,813],{"class":494},[480,6561,632],{"class":490},[480,6563,740],{"class":494},[480,6565,664],{"class":605},[480,6567,6569],{"class":482,"line":6568},62,[480,6570,560],{"emptyLinePlaceholder":559},[480,6572,6574],{"class":482,"line":6573},63,[480,6575,6576],{"class":533},"        // Log to analytics (not stored in DB)\n",[480,6578,6580,6582,6584,6586,6588,6590],{"class":482,"line":6579},64,[480,6581,801],{"class":486},[480,6583,4822],{"class":494},[480,6585,748],{"class":490},[480,6587,4827],{"class":572},[480,6589,576],{"class":605},[480,6591,617],{"class":490},[480,6593,6595,6598,6600,6602,6605,6607],{"class":482,"line":6594},65,[480,6596,6597],{"class":605},"          event",[480,6599,602],{"class":490},[480,6601,504],{"class":490},[480,6603,6604],{"class":507},"user_signup",[480,6606,930],{"class":490},[480,6608,647],{"class":490},[480,6610,6612,6615,6617,6619,6621,6623],{"class":482,"line":6611},66,[480,6613,6614],{"class":605},"          userId",[480,6616,602],{"class":490},[480,6618,4841],{"class":494},[480,6620,748],{"class":490},[480,6622,956],{"class":494},[480,6624,647],{"class":490},[480,6626,6628,6631,6633,6635,6637,6639],{"class":482,"line":6627},67,[480,6629,6630],{"class":605},"          properties",[480,6632,602],{"class":490},[480,6634,721],{"class":494},[480,6636,748],{"class":490},[480,6638,751],{"class":494},[480,6640,647],{"class":490},[480,6642,6644,6647],{"class":482,"line":6643},68,[480,6645,6646],{"class":490},"        }",[480,6648,664],{"class":605},[480,6650,6652],{"class":482,"line":6651},69,[480,6653,874],{"class":490},[480,6655,6657],{"class":482,"line":6656},70,[480,6658,880],{"class":490},[480,6660,6662],{"class":482,"line":6661},71,[480,6663,886],{"class":490},[480,6665,6667,6669],{"class":482,"line":6666},72,[480,6668,661],{"class":490},[480,6670,664],{"class":494},[459,6672,6674],{"id":6673},"related","Related",[1397,6676,6677,6682,6687],{},[1400,6678,6679],{},[6680,6681,223],"a",{"href":224},[1400,6683,6684],{},[6680,6685,6686],{"href":216},"Hook System",[1400,6688,6689],{},[6680,6690,6691],{"href":284},"Authorization",[6693,6694,6695],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":476,"searchDepth":537,"depth":537,"links":6697},[6698,6699,6703,6713,6721,6726,6727,6734,6735,6736,6740,6741],{"id":461,"depth":537,"text":194},{"id":514,"depth":537,"text":515,"children":6700},[6701,6702],{"id":519,"depth":556,"text":520},{"id":895,"depth":556,"text":896},{"id":1224,"depth":537,"text":1225,"children":6704},[6705,6707,6709,6711],{"id":1228,"depth":556,"text":6706},"extract (optional)",{"id":1459,"depth":556,"text":6708},"autoPopulate (optional)",{"id":2350,"depth":556,"text":6710},"autoPopulateOn (optional)",{"id":2448,"depth":556,"text":6712},"resources (optional)",{"id":2494,"depth":537,"text":2495,"children":6714},[6715,6716,6717,6718,6719,6720],{"id":2498,"depth":556,"text":2499},{"id":2736,"depth":556,"text":2737},{"id":2957,"depth":556,"text":2958},{"id":3148,"depth":556,"text":3149},{"id":3274,"depth":556,"text":3275},{"id":3568,"depth":556,"text":3569},{"id":3848,"depth":537,"text":3849,"children":6722},[6723,6724,6725],{"id":3852,"depth":556,"text":3853},{"id":4117,"depth":556,"text":4118},{"id":4368,"depth":556,"text":4369},{"id":4577,"depth":537,"text":4578},{"id":4737,"depth":537,"text":4738,"children":6728},[6729,6730,6731,6732,6733],{"id":4741,"depth":556,"text":4742},{"id":4882,"depth":556,"text":4883},{"id":5066,"depth":556,"text":5067},{"id":5145,"depth":556,"text":5146},{"id":5282,"depth":556,"text":5283},{"id":5349,"depth":537,"text":5350},{"id":5602,"depth":537,"text":5603},{"id":5700,"depth":537,"text":5701,"children":6737},[6738,6739],{"id":5704,"depth":556,"text":5705},{"id":5742,"depth":556,"text":5743},{"id":5763,"depth":537,"text":5764},{"id":6673,"depth":537,"text":6674},"md",null,{},{"title":247,"description":457},"to_fdWxzRwIU8dAx4BGIDQG0imqQjWR0PQtR2hwnucw",[6748,6750],{"title":243,"path":244,"stem":245,"description":6749,"children":-1},"Rate limiting is provided as a built-in plugin to protect your API from abuse and ensure fair usage. It registers as pre-auth middleware that runs automatically on every API request.",{"title":251,"path":252,"stem":253,"description":6751,"children":-1},"This document lists all shipped plugins for @websideproject/nuxt-auto-api.",1772977478061]