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