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