[{"data":1,"prerenderedAt":3222},["ShallowReactive",2],{"navigation-landing-en":3,"navigation-nuxt-auto-en":180,"navigation-nuxt-protokit-en":338,"/docs/nuxt-auto/auto-api/validation-en":444,"/docs/nuxt-auto/auto-api/validation-surround-en":3217},[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":3213},{"id":446,"title":239,"body":447,"description":3211,"extension":3212,"links":3213,"meta":3214,"navigation":3213,"ogImage":3213,"path":240,"seo":3215,"stem":241,"__hash__":3216},"nuxt_auto/0.docs/3.nuxt-auto/2.auto-api/2.validation.md",{"type":448,"value":449,"toc":3195},"minimark",[450,454,466,471,474,682,685,704,708,713,1414,1418,1421,1594,1598,1601,1607,1664,1669,1910,1914,1917,2044,2048,2051,2307,2311,2317,2501,2505,2508,2596,2600,2633,2637,2642,2873,2877,3080,3084,3191],[451,452,239],"h1",{"id":453},"validation",[455,456,457,461,462,465],"p",{},[458,459,460],"code",{},"@websideproject/nuxt-auto-api"," uses Zod for validation with automatic schema generation from Drizzle tables via ",[458,463,464],{},"drizzle-zod",".",[467,468,470],"h2",{"id":469},"automatic-validation","Automatic Validation",[455,472,473],{},"By default, validation schemas are auto-generated from your Drizzle tables:",[475,476,481],"pre",{"className":477,"code":478,"language":479,"meta":480,"style":480},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core'\n\nexport const users = sqliteTable('users', {\n  id: integer('id').primaryKey({ autoIncrement: true }),\n  email: text('email').notNull(),\n  name: text('name'),\n})\n","typescript","",[458,482,483,527,534,569,619,650,673],{"__ignoreMap":480},[484,485,488,492,496,500,503,506,508,511,514,517,520,524],"span",{"class":486,"line":487},"line",1,[484,489,491],{"class":490},"s7zQu","import",[484,493,495],{"class":494},"sMK4o"," {",[484,497,499],{"class":498},"sTEyZ"," sqliteTable",[484,501,502],{"class":494},",",[484,504,505],{"class":498}," text",[484,507,502],{"class":494},[484,509,510],{"class":498}," integer",[484,512,513],{"class":494}," }",[484,515,516],{"class":490}," from",[484,518,519],{"class":494}," '",[484,521,523],{"class":522},"sfazB","drizzle-orm/sqlite-core",[484,525,526],{"class":494},"'\n",[484,528,530],{"class":486,"line":529},2,[484,531,533],{"emptyLinePlaceholder":532},true,"\n",[484,535,537,540,544,547,550,553,556,559,562,564,566],{"class":486,"line":536},3,[484,538,539],{"class":490},"export",[484,541,543],{"class":542},"spNyl"," const",[484,545,546],{"class":498}," users ",[484,548,549],{"class":494},"=",[484,551,499],{"class":552},"s2Zo4",[484,554,555],{"class":498},"(",[484,557,558],{"class":494},"'",[484,560,561],{"class":522},"users",[484,563,558],{"class":494},[484,565,502],{"class":494},[484,567,568],{"class":494}," {\n",[484,570,572,576,579,581,583,585,588,590,593,595,598,600,603,606,608,612,614,616],{"class":486,"line":571},4,[484,573,575],{"class":574},"swJcz","  id",[484,577,578],{"class":494},":",[484,580,510],{"class":552},[484,582,555],{"class":498},[484,584,558],{"class":494},[484,586,587],{"class":522},"id",[484,589,558],{"class":494},[484,591,592],{"class":498},")",[484,594,465],{"class":494},[484,596,597],{"class":552},"primaryKey",[484,599,555],{"class":498},[484,601,602],{"class":494},"{",[484,604,605],{"class":574}," autoIncrement",[484,607,578],{"class":494},[484,609,611],{"class":610},"sfNiH"," true",[484,613,513],{"class":494},[484,615,592],{"class":498},[484,617,618],{"class":494},",\n",[484,620,622,625,627,629,631,633,636,638,640,642,645,648],{"class":486,"line":621},5,[484,623,624],{"class":574},"  email",[484,626,578],{"class":494},[484,628,505],{"class":552},[484,630,555],{"class":498},[484,632,558],{"class":494},[484,634,635],{"class":522},"email",[484,637,558],{"class":494},[484,639,592],{"class":498},[484,641,465],{"class":494},[484,643,644],{"class":552},"notNull",[484,646,647],{"class":498},"()",[484,649,618],{"class":494},[484,651,653,656,658,660,662,664,667,669,671],{"class":486,"line":652},6,[484,654,655],{"class":574},"  name",[484,657,578],{"class":494},[484,659,505],{"class":552},[484,661,555],{"class":498},[484,663,558],{"class":494},[484,665,666],{"class":522},"name",[484,668,558],{"class":494},[484,670,592],{"class":498},[484,672,618],{"class":494},[484,674,676,679],{"class":486,"line":675},7,[484,677,678],{"class":494},"}",[484,680,681],{"class":498},")\n",[455,683,684],{},"This automatically validates:",[686,687,688,698,701],"ul",{},[689,690,691,692,694,695,697],"li",{},"Required fields (",[458,693,635],{}," is required, ",[458,696,666],{}," is optional)",[689,699,700],{},"Field types (integer, text, boolean, etc.)",[689,702,703],{},"Enum values (if defined)",[467,705,707],{"id":706},"custom-validation","Custom Validation",[455,709,710,711,578],{},"For custom rules, create validation schemas with ",[458,712,464],{},[475,714,716],{"className":477,"code":715,"language":479,"meta":480,"style":480},"// server/validation/users.ts\nimport { createInsertSchema } from 'drizzle-zod'\nimport { z } from 'zod'\nimport { users } from '../database/schema'\n\nconst baseInsertSchema = createInsertSchema(users)\n\nexport const usersValidation = {\n  create: baseInsertSchema.extend({\n    email: z.string().email().toLowerCase().min(1),\n    name: z.string().min(2).max(100),\n    role: z.enum(['user', 'admin', 'editor']).default('user'),\n  }),\n  update: baseInsertSchema.partial().extend({\n    email: z.string().email().toLowerCase().optional(),\n    name: z.string().min(2).max(100).optional(),\n  }),\n  query: z.object({\n    filter: z.record(z.any()).optional(),\n    sort: z.union([z.string(), z.array(z.string())]).optional(),\n    fields: z.union([z.string(), z.array(z.string())]).optional(),\n    include: z.union([z.string(), z.array(z.string())]).optional(),\n    page: z.number().int().positive().optional(),\n    limit: z.number().int().positive().max(100).optional(),\n  }).optional(),\n}\n",[458,717,718,724,743,763,783,787,802,806,820,841,886,927,990,1000,1025,1061,1104,1113,1132,1166,1216,1262,1308,1347,1393,1408],{"__ignoreMap":480},[484,719,720],{"class":486,"line":487},[484,721,723],{"class":722},"sHwdD","// server/validation/users.ts\n",[484,725,726,728,730,733,735,737,739,741],{"class":486,"line":529},[484,727,491],{"class":490},[484,729,495],{"class":494},[484,731,732],{"class":498}," createInsertSchema",[484,734,513],{"class":494},[484,736,516],{"class":490},[484,738,519],{"class":494},[484,740,464],{"class":522},[484,742,526],{"class":494},[484,744,745,747,749,752,754,756,758,761],{"class":486,"line":536},[484,746,491],{"class":490},[484,748,495],{"class":494},[484,750,751],{"class":498}," z",[484,753,513],{"class":494},[484,755,516],{"class":490},[484,757,519],{"class":494},[484,759,760],{"class":522},"zod",[484,762,526],{"class":494},[484,764,765,767,769,772,774,776,778,781],{"class":486,"line":571},[484,766,491],{"class":490},[484,768,495],{"class":494},[484,770,771],{"class":498}," users",[484,773,513],{"class":494},[484,775,516],{"class":490},[484,777,519],{"class":494},[484,779,780],{"class":522},"../database/schema",[484,782,526],{"class":494},[484,784,785],{"class":486,"line":621},[484,786,533],{"emptyLinePlaceholder":532},[484,788,789,792,795,797,799],{"class":486,"line":652},[484,790,791],{"class":542},"const",[484,793,794],{"class":498}," baseInsertSchema ",[484,796,549],{"class":494},[484,798,732],{"class":552},[484,800,801],{"class":498},"(users)\n",[484,803,804],{"class":486,"line":675},[484,805,533],{"emptyLinePlaceholder":532},[484,807,809,811,813,816,818],{"class":486,"line":808},8,[484,810,539],{"class":490},[484,812,543],{"class":542},[484,814,815],{"class":498}," usersValidation ",[484,817,549],{"class":494},[484,819,568],{"class":494},[484,821,823,826,828,831,833,836,838],{"class":486,"line":822},9,[484,824,825],{"class":574},"  create",[484,827,578],{"class":494},[484,829,830],{"class":498}," baseInsertSchema",[484,832,465],{"class":494},[484,834,835],{"class":552},"extend",[484,837,555],{"class":498},[484,839,840],{"class":494},"{\n",[484,842,844,847,849,851,853,856,858,860,862,864,866,869,871,873,876,878,882,884],{"class":486,"line":843},10,[484,845,846],{"class":574},"    email",[484,848,578],{"class":494},[484,850,751],{"class":498},[484,852,465],{"class":494},[484,854,855],{"class":552},"string",[484,857,647],{"class":498},[484,859,465],{"class":494},[484,861,635],{"class":552},[484,863,647],{"class":498},[484,865,465],{"class":494},[484,867,868],{"class":552},"toLowerCase",[484,870,647],{"class":498},[484,872,465],{"class":494},[484,874,875],{"class":552},"min",[484,877,555],{"class":498},[484,879,881],{"class":880},"sbssI","1",[484,883,592],{"class":498},[484,885,618],{"class":494},[484,887,889,892,894,896,898,900,902,904,906,908,911,913,915,918,920,923,925],{"class":486,"line":888},11,[484,890,891],{"class":574},"    name",[484,893,578],{"class":494},[484,895,751],{"class":498},[484,897,465],{"class":494},[484,899,855],{"class":552},[484,901,647],{"class":498},[484,903,465],{"class":494},[484,905,875],{"class":552},[484,907,555],{"class":498},[484,909,910],{"class":880},"2",[484,912,592],{"class":498},[484,914,465],{"class":494},[484,916,917],{"class":552},"max",[484,919,555],{"class":498},[484,921,922],{"class":880},"100",[484,924,592],{"class":498},[484,926,618],{"class":494},[484,928,930,933,935,937,939,942,945,947,950,952,954,956,959,961,963,965,968,970,973,975,978,980,982,984,986,988],{"class":486,"line":929},12,[484,931,932],{"class":574},"    role",[484,934,578],{"class":494},[484,936,751],{"class":498},[484,938,465],{"class":494},[484,940,941],{"class":552},"enum",[484,943,944],{"class":498},"([",[484,946,558],{"class":494},[484,948,949],{"class":522},"user",[484,951,558],{"class":494},[484,953,502],{"class":494},[484,955,519],{"class":494},[484,957,958],{"class":522},"admin",[484,960,558],{"class":494},[484,962,502],{"class":494},[484,964,519],{"class":494},[484,966,967],{"class":522},"editor",[484,969,558],{"class":494},[484,971,972],{"class":498},"])",[484,974,465],{"class":494},[484,976,977],{"class":552},"default",[484,979,555],{"class":498},[484,981,558],{"class":494},[484,983,949],{"class":522},[484,985,558],{"class":494},[484,987,592],{"class":498},[484,989,618],{"class":494},[484,991,993,996,998],{"class":486,"line":992},13,[484,994,995],{"class":494},"  }",[484,997,592],{"class":498},[484,999,618],{"class":494},[484,1001,1003,1006,1008,1010,1012,1015,1017,1019,1021,1023],{"class":486,"line":1002},14,[484,1004,1005],{"class":574},"  update",[484,1007,578],{"class":494},[484,1009,830],{"class":498},[484,1011,465],{"class":494},[484,1013,1014],{"class":552},"partial",[484,1016,647],{"class":498},[484,1018,465],{"class":494},[484,1020,835],{"class":552},[484,1022,555],{"class":498},[484,1024,840],{"class":494},[484,1026,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046,1048,1050,1052,1054,1057,1059],{"class":486,"line":1027},15,[484,1029,846],{"class":574},[484,1031,578],{"class":494},[484,1033,751],{"class":498},[484,1035,465],{"class":494},[484,1037,855],{"class":552},[484,1039,647],{"class":498},[484,1041,465],{"class":494},[484,1043,635],{"class":552},[484,1045,647],{"class":498},[484,1047,465],{"class":494},[484,1049,868],{"class":552},[484,1051,647],{"class":498},[484,1053,465],{"class":494},[484,1055,1056],{"class":552},"optional",[484,1058,647],{"class":498},[484,1060,618],{"class":494},[484,1062,1064,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102],{"class":486,"line":1063},16,[484,1065,891],{"class":574},[484,1067,578],{"class":494},[484,1069,751],{"class":498},[484,1071,465],{"class":494},[484,1073,855],{"class":552},[484,1075,647],{"class":498},[484,1077,465],{"class":494},[484,1079,875],{"class":552},[484,1081,555],{"class":498},[484,1083,910],{"class":880},[484,1085,592],{"class":498},[484,1087,465],{"class":494},[484,1089,917],{"class":552},[484,1091,555],{"class":498},[484,1093,922],{"class":880},[484,1095,592],{"class":498},[484,1097,465],{"class":494},[484,1099,1056],{"class":552},[484,1101,647],{"class":498},[484,1103,618],{"class":494},[484,1105,1107,1109,1111],{"class":486,"line":1106},17,[484,1108,995],{"class":494},[484,1110,592],{"class":498},[484,1112,618],{"class":494},[484,1114,1116,1119,1121,1123,1125,1128,1130],{"class":486,"line":1115},18,[484,1117,1118],{"class":574},"  query",[484,1120,578],{"class":494},[484,1122,751],{"class":498},[484,1124,465],{"class":494},[484,1126,1127],{"class":552},"object",[484,1129,555],{"class":498},[484,1131,840],{"class":494},[484,1133,1135,1138,1140,1142,1144,1147,1150,1152,1155,1158,1160,1162,1164],{"class":486,"line":1134},19,[484,1136,1137],{"class":574},"    filter",[484,1139,578],{"class":494},[484,1141,751],{"class":498},[484,1143,465],{"class":494},[484,1145,1146],{"class":552},"record",[484,1148,1149],{"class":498},"(z",[484,1151,465],{"class":494},[484,1153,1154],{"class":552},"any",[484,1156,1157],{"class":498},"())",[484,1159,465],{"class":494},[484,1161,1056],{"class":552},[484,1163,647],{"class":498},[484,1165,618],{"class":494},[484,1167,1169,1172,1174,1176,1178,1181,1184,1186,1188,1190,1192,1194,1196,1199,1201,1203,1205,1208,1210,1212,1214],{"class":486,"line":1168},20,[484,1170,1171],{"class":574},"    sort",[484,1173,578],{"class":494},[484,1175,751],{"class":498},[484,1177,465],{"class":494},[484,1179,1180],{"class":552},"union",[484,1182,1183],{"class":498},"([z",[484,1185,465],{"class":494},[484,1187,855],{"class":552},[484,1189,647],{"class":498},[484,1191,502],{"class":494},[484,1193,751],{"class":498},[484,1195,465],{"class":494},[484,1197,1198],{"class":552},"array",[484,1200,1149],{"class":498},[484,1202,465],{"class":494},[484,1204,855],{"class":552},[484,1206,1207],{"class":498},"())])",[484,1209,465],{"class":494},[484,1211,1056],{"class":552},[484,1213,647],{"class":498},[484,1215,618],{"class":494},[484,1217,1219,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260],{"class":486,"line":1218},21,[484,1220,1221],{"class":574},"    fields",[484,1223,578],{"class":494},[484,1225,751],{"class":498},[484,1227,465],{"class":494},[484,1229,1180],{"class":552},[484,1231,1183],{"class":498},[484,1233,465],{"class":494},[484,1235,855],{"class":552},[484,1237,647],{"class":498},[484,1239,502],{"class":494},[484,1241,751],{"class":498},[484,1243,465],{"class":494},[484,1245,1198],{"class":552},[484,1247,1149],{"class":498},[484,1249,465],{"class":494},[484,1251,855],{"class":552},[484,1253,1207],{"class":498},[484,1255,465],{"class":494},[484,1257,1056],{"class":552},[484,1259,647],{"class":498},[484,1261,618],{"class":494},[484,1263,1265,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306],{"class":486,"line":1264},22,[484,1266,1267],{"class":574},"    include",[484,1269,578],{"class":494},[484,1271,751],{"class":498},[484,1273,465],{"class":494},[484,1275,1180],{"class":552},[484,1277,1183],{"class":498},[484,1279,465],{"class":494},[484,1281,855],{"class":552},[484,1283,647],{"class":498},[484,1285,502],{"class":494},[484,1287,751],{"class":498},[484,1289,465],{"class":494},[484,1291,1198],{"class":552},[484,1293,1149],{"class":498},[484,1295,465],{"class":494},[484,1297,855],{"class":552},[484,1299,1207],{"class":498},[484,1301,465],{"class":494},[484,1303,1056],{"class":552},[484,1305,647],{"class":498},[484,1307,618],{"class":494},[484,1309,1311,1314,1316,1318,1320,1323,1325,1327,1330,1332,1334,1337,1339,1341,1343,1345],{"class":486,"line":1310},23,[484,1312,1313],{"class":574},"    page",[484,1315,578],{"class":494},[484,1317,751],{"class":498},[484,1319,465],{"class":494},[484,1321,1322],{"class":552},"number",[484,1324,647],{"class":498},[484,1326,465],{"class":494},[484,1328,1329],{"class":552},"int",[484,1331,647],{"class":498},[484,1333,465],{"class":494},[484,1335,1336],{"class":552},"positive",[484,1338,647],{"class":498},[484,1340,465],{"class":494},[484,1342,1056],{"class":552},[484,1344,647],{"class":498},[484,1346,618],{"class":494},[484,1348,1350,1353,1355,1357,1359,1361,1363,1365,1367,1369,1371,1373,1375,1377,1379,1381,1383,1385,1387,1389,1391],{"class":486,"line":1349},24,[484,1351,1352],{"class":574},"    limit",[484,1354,578],{"class":494},[484,1356,751],{"class":498},[484,1358,465],{"class":494},[484,1360,1322],{"class":552},[484,1362,647],{"class":498},[484,1364,465],{"class":494},[484,1366,1329],{"class":552},[484,1368,647],{"class":498},[484,1370,465],{"class":494},[484,1372,1336],{"class":552},[484,1374,647],{"class":498},[484,1376,465],{"class":494},[484,1378,917],{"class":552},[484,1380,555],{"class":498},[484,1382,922],{"class":880},[484,1384,592],{"class":498},[484,1386,465],{"class":494},[484,1388,1056],{"class":552},[484,1390,647],{"class":498},[484,1392,618],{"class":494},[484,1394,1396,1398,1400,1402,1404,1406],{"class":486,"line":1395},25,[484,1397,995],{"class":494},[484,1399,592],{"class":498},[484,1401,465],{"class":494},[484,1403,1056],{"class":552},[484,1405,647],{"class":498},[484,1407,618],{"class":494},[484,1409,1411],{"class":486,"line":1410},26,[484,1412,1413],{"class":494},"}\n",[467,1415,1417],{"id":1416},"register-validation","Register Validation",[455,1419,1420],{},"Register validation schemas in your module:",[475,1422,1424],{"className":477,"code":1423,"language":479,"meta":480,"style":480},"// modules/base/index.ts\nnuxt.hook('autoApi:registerSchema', (registry) => {\n  registry.register('users', {\n    schema: createModuleImport(resolver.resolve('../../server/database/schema'), 'users'),\n    validation: createModuleImport(\n      resolver.resolve('../../server/validation/users'),\n      'usersValidation'\n    ),\n  })\n})\n",[458,1425,1426,1431,1466,1488,1531,1543,1565,1575,1582,1588],{"__ignoreMap":480},[484,1427,1428],{"class":486,"line":487},[484,1429,1430],{"class":722},"// modules/base/index.ts\n",[484,1432,1433,1436,1438,1441,1443,1445,1448,1450,1452,1455,1459,1461,1464],{"class":486,"line":529},[484,1434,1435],{"class":498},"nuxt",[484,1437,465],{"class":494},[484,1439,1440],{"class":552},"hook",[484,1442,555],{"class":498},[484,1444,558],{"class":494},[484,1446,1447],{"class":522},"autoApi:registerSchema",[484,1449,558],{"class":494},[484,1451,502],{"class":494},[484,1453,1454],{"class":494}," (",[484,1456,1458],{"class":1457},"sHdIc","registry",[484,1460,592],{"class":494},[484,1462,1463],{"class":542}," =>",[484,1465,568],{"class":494},[484,1467,1468,1471,1473,1476,1478,1480,1482,1484,1486],{"class":486,"line":536},[484,1469,1470],{"class":498},"  registry",[484,1472,465],{"class":494},[484,1474,1475],{"class":552},"register",[484,1477,555],{"class":574},[484,1479,558],{"class":494},[484,1481,561],{"class":522},[484,1483,558],{"class":494},[484,1485,502],{"class":494},[484,1487,568],{"class":494},[484,1489,1490,1493,1495,1498,1500,1503,1505,1508,1510,1512,1515,1517,1519,1521,1523,1525,1527,1529],{"class":486,"line":571},[484,1491,1492],{"class":574},"    schema",[484,1494,578],{"class":494},[484,1496,1497],{"class":552}," createModuleImport",[484,1499,555],{"class":574},[484,1501,1502],{"class":498},"resolver",[484,1504,465],{"class":494},[484,1506,1507],{"class":552},"resolve",[484,1509,555],{"class":574},[484,1511,558],{"class":494},[484,1513,1514],{"class":522},"../../server/database/schema",[484,1516,558],{"class":494},[484,1518,592],{"class":574},[484,1520,502],{"class":494},[484,1522,519],{"class":494},[484,1524,561],{"class":522},[484,1526,558],{"class":494},[484,1528,592],{"class":574},[484,1530,618],{"class":494},[484,1532,1533,1536,1538,1540],{"class":486,"line":621},[484,1534,1535],{"class":574},"    validation",[484,1537,578],{"class":494},[484,1539,1497],{"class":552},[484,1541,1542],{"class":574},"(\n",[484,1544,1545,1548,1550,1552,1554,1556,1559,1561,1563],{"class":486,"line":652},[484,1546,1547],{"class":498},"      resolver",[484,1549,465],{"class":494},[484,1551,1507],{"class":552},[484,1553,555],{"class":574},[484,1555,558],{"class":494},[484,1557,1558],{"class":522},"../../server/validation/users",[484,1560,558],{"class":494},[484,1562,592],{"class":574},[484,1564,618],{"class":494},[484,1566,1567,1570,1573],{"class":486,"line":675},[484,1568,1569],{"class":494},"      '",[484,1571,1572],{"class":522},"usersValidation",[484,1574,526],{"class":494},[484,1576,1577,1580],{"class":486,"line":808},[484,1578,1579],{"class":574},"    )",[484,1581,618],{"class":494},[484,1583,1584,1586],{"class":486,"line":822},[484,1585,995],{"class":494},[484,1587,681],{"class":574},[484,1589,1590,1592],{"class":486,"line":843},[484,1591,678],{"class":494},[484,1593,681],{"class":498},[467,1595,1597],{"id":1596},"validation-errors","Validation Errors",[455,1599,1600],{},"Invalid requests return 400 with Zod error details:",[455,1602,1603],{},[1604,1605,1606],"strong",{},"Request:",[475,1608,1612],{"className":1609,"code":1610,"language":1611,"meta":480,"style":480},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","POST /api/users\n{\n  \"email\": \"invalid-email\",\n  \"name\": \"A\"\n}\n","bash",[458,1613,1614,1623,1627,1645,1660],{"__ignoreMap":480},[484,1615,1616,1620],{"class":486,"line":487},[484,1617,1619],{"class":1618},"sBMFI","POST",[484,1621,1622],{"class":522}," /api/users\n",[484,1624,1625],{"class":486,"line":529},[484,1626,840],{"class":494},[484,1628,1629,1632,1634,1637,1640,1643],{"class":486,"line":536},[484,1630,1631],{"class":1618},"  \"email\"",[484,1633,578],{"class":552},[484,1635,1636],{"class":494}," \"",[484,1638,1639],{"class":522},"invalid-email",[484,1641,1642],{"class":494},"\"",[484,1644,618],{"class":522},[484,1646,1647,1650,1652,1654,1657],{"class":486,"line":571},[484,1648,1649],{"class":1618},"  \"name\"",[484,1651,578],{"class":552},[484,1653,1636],{"class":494},[484,1655,1656],{"class":522},"A",[484,1658,1659],{"class":494},"\"\n",[484,1661,1662],{"class":486,"line":621},[484,1663,1413],{"class":494},[455,1665,1666],{},[1604,1667,1668],{},"Response:",[475,1670,1674],{"className":1671,"code":1672,"language":1673,"meta":480,"style":480},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"statusCode\": 400,\n  \"message\": \"Validation error\",\n  \"data\": {\n    \"errors\": [\n      {\n        \"code\": \"invalid_string\",\n        \"path\": [\"email\"],\n        \"message\": \"Invalid email\"\n      },\n      {\n        \"code\": \"too_small\",\n        \"path\": [\"name\"],\n        \"message\": \"String must contain at least 2 character(s)\",\n        \"minimum\": 2\n      }\n    ]\n  }\n}\n","json",[458,1675,1676,1680,1697,1717,1730,1745,1750,1770,1793,1810,1815,1819,1838,1858,1877,1891,1896,1901,1906],{"__ignoreMap":480},[484,1677,1678],{"class":486,"line":487},[484,1679,840],{"class":494},[484,1681,1682,1685,1688,1690,1692,1695],{"class":486,"line":529},[484,1683,1684],{"class":494},"  \"",[484,1686,1687],{"class":542},"statusCode",[484,1689,1642],{"class":494},[484,1691,578],{"class":494},[484,1693,1694],{"class":880}," 400",[484,1696,618],{"class":494},[484,1698,1699,1701,1704,1706,1708,1710,1713,1715],{"class":486,"line":536},[484,1700,1684],{"class":494},[484,1702,1703],{"class":542},"message",[484,1705,1642],{"class":494},[484,1707,578],{"class":494},[484,1709,1636],{"class":494},[484,1711,1712],{"class":522},"Validation error",[484,1714,1642],{"class":494},[484,1716,618],{"class":494},[484,1718,1719,1721,1724,1726,1728],{"class":486,"line":571},[484,1720,1684],{"class":494},[484,1722,1723],{"class":542},"data",[484,1725,1642],{"class":494},[484,1727,578],{"class":494},[484,1729,568],{"class":494},[484,1731,1732,1735,1738,1740,1742],{"class":486,"line":621},[484,1733,1734],{"class":494},"    \"",[484,1736,1737],{"class":1618},"errors",[484,1739,1642],{"class":494},[484,1741,578],{"class":494},[484,1743,1744],{"class":494}," [\n",[484,1746,1747],{"class":486,"line":652},[484,1748,1749],{"class":494},"      {\n",[484,1751,1752,1755,1757,1759,1761,1763,1766,1768],{"class":486,"line":675},[484,1753,1754],{"class":494},"        \"",[484,1756,458],{"class":880},[484,1758,1642],{"class":494},[484,1760,578],{"class":494},[484,1762,1636],{"class":494},[484,1764,1765],{"class":522},"invalid_string",[484,1767,1642],{"class":494},[484,1769,618],{"class":494},[484,1771,1772,1774,1777,1779,1781,1784,1786,1788,1790],{"class":486,"line":808},[484,1773,1754],{"class":494},[484,1775,1776],{"class":880},"path",[484,1778,1642],{"class":494},[484,1780,578],{"class":494},[484,1782,1783],{"class":494}," [",[484,1785,1642],{"class":494},[484,1787,635],{"class":522},[484,1789,1642],{"class":494},[484,1791,1792],{"class":494},"],\n",[484,1794,1795,1797,1799,1801,1803,1805,1808],{"class":486,"line":822},[484,1796,1754],{"class":494},[484,1798,1703],{"class":880},[484,1800,1642],{"class":494},[484,1802,578],{"class":494},[484,1804,1636],{"class":494},[484,1806,1807],{"class":522},"Invalid email",[484,1809,1659],{"class":494},[484,1811,1812],{"class":486,"line":843},[484,1813,1814],{"class":494},"      },\n",[484,1816,1817],{"class":486,"line":888},[484,1818,1749],{"class":494},[484,1820,1821,1823,1825,1827,1829,1831,1834,1836],{"class":486,"line":929},[484,1822,1754],{"class":494},[484,1824,458],{"class":880},[484,1826,1642],{"class":494},[484,1828,578],{"class":494},[484,1830,1636],{"class":494},[484,1832,1833],{"class":522},"too_small",[484,1835,1642],{"class":494},[484,1837,618],{"class":494},[484,1839,1840,1842,1844,1846,1848,1850,1852,1854,1856],{"class":486,"line":992},[484,1841,1754],{"class":494},[484,1843,1776],{"class":880},[484,1845,1642],{"class":494},[484,1847,578],{"class":494},[484,1849,1783],{"class":494},[484,1851,1642],{"class":494},[484,1853,666],{"class":522},[484,1855,1642],{"class":494},[484,1857,1792],{"class":494},[484,1859,1860,1862,1864,1866,1868,1870,1873,1875],{"class":486,"line":1002},[484,1861,1754],{"class":494},[484,1863,1703],{"class":880},[484,1865,1642],{"class":494},[484,1867,578],{"class":494},[484,1869,1636],{"class":494},[484,1871,1872],{"class":522},"String must contain at least 2 character(s)",[484,1874,1642],{"class":494},[484,1876,618],{"class":494},[484,1878,1879,1881,1884,1886,1888],{"class":486,"line":1027},[484,1880,1754],{"class":494},[484,1882,1883],{"class":880},"minimum",[484,1885,1642],{"class":494},[484,1887,578],{"class":494},[484,1889,1890],{"class":880}," 2\n",[484,1892,1893],{"class":486,"line":1063},[484,1894,1895],{"class":494},"      }\n",[484,1897,1898],{"class":486,"line":1106},[484,1899,1900],{"class":494},"    ]\n",[484,1902,1903],{"class":486,"line":1115},[484,1904,1905],{"class":494},"  }\n",[484,1907,1908],{"class":486,"line":1134},[484,1909,1413],{"class":494},[467,1911,1913],{"id":1912},"query-parameter-validation","Query Parameter Validation",[455,1915,1916],{},"Query parameters are validated by default:",[475,1918,1920],{"className":477,"code":1919,"language":479,"meta":480,"style":480},"// Invalid: limit too high\nGET /api/users?limit=1000\n// Response: 400 - limit must be \u003C= 100\n\n// Invalid: page must be positive\nGET /api/users?page=-1\n// Response: 400 - page must be positive\n\n// Valid\nGET /api/users?limit=50&page=2&sort=-createdAt\n",[458,1921,1922,1927,1953,1958,1962,1967,1990,1995,1999,2004],{"__ignoreMap":480},[484,1923,1924],{"class":486,"line":487},[484,1925,1926],{"class":722},"// Invalid: limit too high\n",[484,1928,1929,1932,1935,1938,1940,1942,1945,1948,1950],{"class":486,"line":529},[484,1930,1931],{"class":498},"GET ",[484,1933,1934],{"class":494},"/",[484,1936,1937],{"class":498},"api",[484,1939,1934],{"class":494},[484,1941,561],{"class":498},[484,1943,1944],{"class":494},"?",[484,1946,1947],{"class":498},"limit",[484,1949,549],{"class":494},[484,1951,1952],{"class":880},"1000\n",[484,1954,1955],{"class":486,"line":536},[484,1956,1957],{"class":722},"// Response: 400 - limit must be \u003C= 100\n",[484,1959,1960],{"class":486,"line":571},[484,1961,533],{"emptyLinePlaceholder":532},[484,1963,1964],{"class":486,"line":621},[484,1965,1966],{"class":722},"// Invalid: page must be positive\n",[484,1968,1969,1971,1973,1975,1977,1979,1981,1984,1987],{"class":486,"line":652},[484,1970,1931],{"class":498},[484,1972,1934],{"class":494},[484,1974,1937],{"class":498},[484,1976,1934],{"class":494},[484,1978,561],{"class":498},[484,1980,1944],{"class":494},[484,1982,1983],{"class":498},"page",[484,1985,1986],{"class":494},"=-",[484,1988,1989],{"class":880},"1\n",[484,1991,1992],{"class":486,"line":675},[484,1993,1994],{"class":722},"// Response: 400 - page must be positive\n",[484,1996,1997],{"class":486,"line":808},[484,1998,533],{"emptyLinePlaceholder":532},[484,2000,2001],{"class":486,"line":822},[484,2002,2003],{"class":722},"// Valid\n",[484,2005,2006,2008,2010,2012,2014,2016,2018,2020,2022,2025,2028,2030,2032,2034,2036,2039,2041],{"class":486,"line":843},[484,2007,1931],{"class":498},[484,2009,1934],{"class":494},[484,2011,1937],{"class":498},[484,2013,1934],{"class":494},[484,2015,561],{"class":498},[484,2017,1944],{"class":494},[484,2019,1947],{"class":498},[484,2021,549],{"class":494},[484,2023,2024],{"class":880},"50",[484,2026,2027],{"class":494},"&",[484,2029,1983],{"class":498},[484,2031,549],{"class":494},[484,2033,910],{"class":880},[484,2035,2027],{"class":494},[484,2037,2038],{"class":498},"sort",[484,2040,1986],{"class":494},[484,2042,2043],{"class":498},"createdAt\n",[467,2045,2047],{"id":2046},"custom-query-validation","Custom Query Validation",[455,2049,2050],{},"Override query validation in your schema:",[475,2052,2054],{"className":477,"code":2053,"language":479,"meta":480,"style":480},"export const usersValidation = {\n  // ... create, update schemas\n  query: z.object({\n    filter: z.object({\n      role: z.enum(['user', 'admin', 'editor']).optional(),\n      verified: z.boolean().optional(),\n    }).optional(),\n    sort: z.enum(['name', '-name', 'createdAt', '-createdAt']).optional(),\n    limit: z.number().int().positive().max(50).optional(), // Lower limit\n  }),\n}\n",[458,2055,2056,2068,2073,2089,2105,2152,2176,2191,2248,2295,2303],{"__ignoreMap":480},[484,2057,2058,2060,2062,2064,2066],{"class":486,"line":487},[484,2059,539],{"class":490},[484,2061,543],{"class":542},[484,2063,815],{"class":498},[484,2065,549],{"class":494},[484,2067,568],{"class":494},[484,2069,2070],{"class":486,"line":529},[484,2071,2072],{"class":722},"  // ... create, update schemas\n",[484,2074,2075,2077,2079,2081,2083,2085,2087],{"class":486,"line":536},[484,2076,1118],{"class":574},[484,2078,578],{"class":494},[484,2080,751],{"class":498},[484,2082,465],{"class":494},[484,2084,1127],{"class":552},[484,2086,555],{"class":498},[484,2088,840],{"class":494},[484,2090,2091,2093,2095,2097,2099,2101,2103],{"class":486,"line":571},[484,2092,1137],{"class":574},[484,2094,578],{"class":494},[484,2096,751],{"class":498},[484,2098,465],{"class":494},[484,2100,1127],{"class":552},[484,2102,555],{"class":498},[484,2104,840],{"class":494},[484,2106,2107,2110,2112,2114,2116,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144,2146,2148,2150],{"class":486,"line":621},[484,2108,2109],{"class":574},"      role",[484,2111,578],{"class":494},[484,2113,751],{"class":498},[484,2115,465],{"class":494},[484,2117,941],{"class":552},[484,2119,944],{"class":498},[484,2121,558],{"class":494},[484,2123,949],{"class":522},[484,2125,558],{"class":494},[484,2127,502],{"class":494},[484,2129,519],{"class":494},[484,2131,958],{"class":522},[484,2133,558],{"class":494},[484,2135,502],{"class":494},[484,2137,519],{"class":494},[484,2139,967],{"class":522},[484,2141,558],{"class":494},[484,2143,972],{"class":498},[484,2145,465],{"class":494},[484,2147,1056],{"class":552},[484,2149,647],{"class":498},[484,2151,618],{"class":494},[484,2153,2154,2157,2159,2161,2163,2166,2168,2170,2172,2174],{"class":486,"line":652},[484,2155,2156],{"class":574},"      verified",[484,2158,578],{"class":494},[484,2160,751],{"class":498},[484,2162,465],{"class":494},[484,2164,2165],{"class":552},"boolean",[484,2167,647],{"class":498},[484,2169,465],{"class":494},[484,2171,1056],{"class":552},[484,2173,647],{"class":498},[484,2175,618],{"class":494},[484,2177,2178,2181,2183,2185,2187,2189],{"class":486,"line":675},[484,2179,2180],{"class":494},"    }",[484,2182,592],{"class":498},[484,2184,465],{"class":494},[484,2186,1056],{"class":552},[484,2188,647],{"class":498},[484,2190,618],{"class":494},[484,2192,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211,2213,2215,2218,2220,2222,2224,2227,2229,2231,2233,2236,2238,2240,2242,2244,2246],{"class":486,"line":808},[484,2194,1171],{"class":574},[484,2196,578],{"class":494},[484,2198,751],{"class":498},[484,2200,465],{"class":494},[484,2202,941],{"class":552},[484,2204,944],{"class":498},[484,2206,558],{"class":494},[484,2208,666],{"class":522},[484,2210,558],{"class":494},[484,2212,502],{"class":494},[484,2214,519],{"class":494},[484,2216,2217],{"class":522},"-name",[484,2219,558],{"class":494},[484,2221,502],{"class":494},[484,2223,519],{"class":494},[484,2225,2226],{"class":522},"createdAt",[484,2228,558],{"class":494},[484,2230,502],{"class":494},[484,2232,519],{"class":494},[484,2234,2235],{"class":522},"-createdAt",[484,2237,558],{"class":494},[484,2239,972],{"class":498},[484,2241,465],{"class":494},[484,2243,1056],{"class":552},[484,2245,647],{"class":498},[484,2247,618],{"class":494},[484,2249,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284,2286,2288,2290,2292],{"class":486,"line":822},[484,2251,1352],{"class":574},[484,2253,578],{"class":494},[484,2255,751],{"class":498},[484,2257,465],{"class":494},[484,2259,1322],{"class":552},[484,2261,647],{"class":498},[484,2263,465],{"class":494},[484,2265,1329],{"class":552},[484,2267,647],{"class":498},[484,2269,465],{"class":494},[484,2271,1336],{"class":552},[484,2273,647],{"class":498},[484,2275,465],{"class":494},[484,2277,917],{"class":552},[484,2279,555],{"class":498},[484,2281,2024],{"class":880},[484,2283,592],{"class":498},[484,2285,465],{"class":494},[484,2287,1056],{"class":552},[484,2289,647],{"class":498},[484,2291,502],{"class":494},[484,2293,2294],{"class":722}," // Lower limit\n",[484,2296,2297,2299,2301],{"class":486,"line":843},[484,2298,995],{"class":494},[484,2300,592],{"class":498},[484,2302,618],{"class":494},[484,2304,2305],{"class":486,"line":888},[484,2306,1413],{"class":494},[467,2308,2310],{"id":2309},"accessing-validated-data","Accessing Validated Data",[455,2312,2313,2314,578],{},"In custom handlers, use ",[458,2315,2316],{},"context.validated",[475,2318,2320],{"className":477,"code":2319,"language":479,"meta":480,"style":480},"import { defineAutoApiHandler } from '@websideproject/nuxt-auto-api/utils'\n\nexport default defineAutoApiHandler({\n  async execute(context) {\n    // Access validated body\n    const validatedBody = context.validated.body\n    console.log(validatedBody.email) // Guaranteed to be valid email\n\n    // Access validated query\n    const validatedQuery = context.validated.query\n    console.log(validatedQuery.limit) // Guaranteed to be valid number\n\n    // ... custom logic\n  },\n})\n",[458,2321,2322,2342,2346,2359,2376,2381,2405,2430,2434,2439,2459,2481,2485,2490,2495],{"__ignoreMap":480},[484,2323,2324,2326,2328,2331,2333,2335,2337,2340],{"class":486,"line":487},[484,2325,491],{"class":490},[484,2327,495],{"class":494},[484,2329,2330],{"class":498}," defineAutoApiHandler",[484,2332,513],{"class":494},[484,2334,516],{"class":490},[484,2336,519],{"class":494},[484,2338,2339],{"class":522},"@websideproject/nuxt-auto-api/utils",[484,2341,526],{"class":494},[484,2343,2344],{"class":486,"line":529},[484,2345,533],{"emptyLinePlaceholder":532},[484,2347,2348,2350,2353,2355,2357],{"class":486,"line":536},[484,2349,539],{"class":490},[484,2351,2352],{"class":490}," default",[484,2354,2330],{"class":552},[484,2356,555],{"class":498},[484,2358,840],{"class":494},[484,2360,2361,2364,2367,2369,2372,2374],{"class":486,"line":571},[484,2362,2363],{"class":542},"  async",[484,2365,2366],{"class":574}," execute",[484,2368,555],{"class":494},[484,2370,2371],{"class":1457},"context",[484,2373,592],{"class":494},[484,2375,568],{"class":494},[484,2377,2378],{"class":486,"line":621},[484,2379,2380],{"class":722},"    // Access validated body\n",[484,2382,2383,2386,2389,2392,2395,2397,2400,2402],{"class":486,"line":652},[484,2384,2385],{"class":542},"    const",[484,2387,2388],{"class":498}," validatedBody",[484,2390,2391],{"class":494}," =",[484,2393,2394],{"class":498}," context",[484,2396,465],{"class":494},[484,2398,2399],{"class":498},"validated",[484,2401,465],{"class":494},[484,2403,2404],{"class":498},"body\n",[484,2406,2407,2410,2412,2415,2417,2420,2422,2424,2427],{"class":486,"line":675},[484,2408,2409],{"class":498},"    console",[484,2411,465],{"class":494},[484,2413,2414],{"class":552},"log",[484,2416,555],{"class":574},[484,2418,2419],{"class":498},"validatedBody",[484,2421,465],{"class":494},[484,2423,635],{"class":498},[484,2425,2426],{"class":574},") ",[484,2428,2429],{"class":722},"// Guaranteed to be valid email\n",[484,2431,2432],{"class":486,"line":808},[484,2433,533],{"emptyLinePlaceholder":532},[484,2435,2436],{"class":486,"line":822},[484,2437,2438],{"class":722},"    // Access validated query\n",[484,2440,2441,2443,2446,2448,2450,2452,2454,2456],{"class":486,"line":843},[484,2442,2385],{"class":542},[484,2444,2445],{"class":498}," validatedQuery",[484,2447,2391],{"class":494},[484,2449,2394],{"class":498},[484,2451,465],{"class":494},[484,2453,2399],{"class":498},[484,2455,465],{"class":494},[484,2457,2458],{"class":498},"query\n",[484,2460,2461,2463,2465,2467,2469,2472,2474,2476,2478],{"class":486,"line":888},[484,2462,2409],{"class":498},[484,2464,465],{"class":494},[484,2466,2414],{"class":552},[484,2468,555],{"class":574},[484,2470,2471],{"class":498},"validatedQuery",[484,2473,465],{"class":494},[484,2475,1947],{"class":498},[484,2477,2426],{"class":574},[484,2479,2480],{"class":722},"// Guaranteed to be valid number\n",[484,2482,2483],{"class":486,"line":929},[484,2484,533],{"emptyLinePlaceholder":532},[484,2486,2487],{"class":486,"line":992},[484,2488,2489],{"class":722},"    // ... custom logic\n",[484,2491,2492],{"class":486,"line":1002},[484,2493,2494],{"class":494},"  },\n",[484,2496,2497,2499],{"class":486,"line":1027},[484,2498,678],{"class":494},[484,2500,681],{"class":498},[467,2502,2504],{"id":2503},"skip-validation","Skip Validation",[455,2506,2507],{},"In rare cases, skip validation for custom handlers:",[475,2509,2511],{"className":477,"code":2510,"language":479,"meta":480,"style":480},"export default defineAutoApiHandler({\n  skipValidation: true,\n  async execute(context) {\n    // No validation performed\n    const body = await readBody(context.event)\n    // ... custom logic without validation\n  },\n})\n",[458,2512,2513,2525,2536,2550,2555,2581,2586,2590],{"__ignoreMap":480},[484,2514,2515,2517,2519,2521,2523],{"class":486,"line":487},[484,2516,539],{"class":490},[484,2518,2352],{"class":490},[484,2520,2330],{"class":552},[484,2522,555],{"class":498},[484,2524,840],{"class":494},[484,2526,2527,2530,2532,2534],{"class":486,"line":529},[484,2528,2529],{"class":574},"  skipValidation",[484,2531,578],{"class":494},[484,2533,611],{"class":610},[484,2535,618],{"class":494},[484,2537,2538,2540,2542,2544,2546,2548],{"class":486,"line":536},[484,2539,2363],{"class":542},[484,2541,2366],{"class":574},[484,2543,555],{"class":494},[484,2545,2371],{"class":1457},[484,2547,592],{"class":494},[484,2549,568],{"class":494},[484,2551,2552],{"class":486,"line":571},[484,2553,2554],{"class":722},"    // No validation performed\n",[484,2556,2557,2559,2562,2564,2567,2570,2572,2574,2576,2579],{"class":486,"line":621},[484,2558,2385],{"class":542},[484,2560,2561],{"class":498}," body",[484,2563,2391],{"class":494},[484,2565,2566],{"class":490}," await",[484,2568,2569],{"class":552}," readBody",[484,2571,555],{"class":574},[484,2573,2371],{"class":498},[484,2575,465],{"class":494},[484,2577,2578],{"class":498},"event",[484,2580,681],{"class":574},[484,2582,2583],{"class":486,"line":652},[484,2584,2585],{"class":722},"    // ... custom logic without validation\n",[484,2587,2588],{"class":486,"line":675},[484,2589,2494],{"class":494},[484,2591,2592,2594],{"class":486,"line":808},[484,2593,678],{"class":494},[484,2595,681],{"class":498},[467,2597,2599],{"id":2598},"best-practices","Best Practices",[2601,2602,2603,2609,2615,2621,2627],"ol",{},[689,2604,2605,2608],{},[1604,2606,2607],{},"Use drizzle-zod"," for base schemas - keeps validation in sync with database",[689,2610,2611,2614],{},[1604,2612,2613],{},"Extend, don't replace"," - build on auto-generated schemas",[689,2616,2617,2620],{},[1604,2618,2619],{},"Validate at boundaries"," - user input, not internal operations",[689,2622,2623,2626],{},[1604,2624,2625],{},"Use TypeScript"," - get type inference from Zod schemas",[689,2628,2629,2632],{},[1604,2630,2631],{},"Test validation"," - write tests for edge cases",[467,2634,2636],{"id":2635},"advanced-patterns","Advanced Patterns",[2638,2639,2641],"h3",{"id":2640},"conditional-validation","Conditional Validation",[475,2643,2645],{"className":477,"code":2644,"language":479,"meta":480,"style":480},"const createUserSchema = baseInsertSchema.extend({\n  email: z.string().email(),\n  role: z.enum(['user', 'admin']),\n}).refine(\n  (data) => {\n    // Admin users must have @company.com email\n    if (data.role === 'admin') {\n      return data.email.endsWith('@company.com')\n    }\n    return true\n  },\n  {\n    message: 'Admin users must use company email',\n    path: ['email'],\n  }\n)\n",[458,2646,2647,2666,2688,2721,2734,2747,2752,2779,2807,2812,2820,2824,2829,2845,2865,2869],{"__ignoreMap":480},[484,2648,2649,2651,2654,2656,2658,2660,2662,2664],{"class":486,"line":487},[484,2650,791],{"class":542},[484,2652,2653],{"class":498}," createUserSchema ",[484,2655,549],{"class":494},[484,2657,830],{"class":498},[484,2659,465],{"class":494},[484,2661,835],{"class":552},[484,2663,555],{"class":498},[484,2665,840],{"class":494},[484,2667,2668,2670,2672,2674,2676,2678,2680,2682,2684,2686],{"class":486,"line":529},[484,2669,624],{"class":574},[484,2671,578],{"class":494},[484,2673,751],{"class":498},[484,2675,465],{"class":494},[484,2677,855],{"class":552},[484,2679,647],{"class":498},[484,2681,465],{"class":494},[484,2683,635],{"class":552},[484,2685,647],{"class":498},[484,2687,618],{"class":494},[484,2689,2690,2693,2695,2697,2699,2701,2703,2705,2707,2709,2711,2713,2715,2717,2719],{"class":486,"line":536},[484,2691,2692],{"class":574},"  role",[484,2694,578],{"class":494},[484,2696,751],{"class":498},[484,2698,465],{"class":494},[484,2700,941],{"class":552},[484,2702,944],{"class":498},[484,2704,558],{"class":494},[484,2706,949],{"class":522},[484,2708,558],{"class":494},[484,2710,502],{"class":494},[484,2712,519],{"class":494},[484,2714,958],{"class":522},[484,2716,558],{"class":494},[484,2718,972],{"class":498},[484,2720,618],{"class":494},[484,2722,2723,2725,2727,2729,2732],{"class":486,"line":571},[484,2724,678],{"class":494},[484,2726,592],{"class":498},[484,2728,465],{"class":494},[484,2730,2731],{"class":552},"refine",[484,2733,1542],{"class":498},[484,2735,2736,2739,2741,2743,2745],{"class":486,"line":621},[484,2737,2738],{"class":494},"  (",[484,2740,1723],{"class":1457},[484,2742,592],{"class":494},[484,2744,1463],{"class":542},[484,2746,568],{"class":494},[484,2748,2749],{"class":486,"line":652},[484,2750,2751],{"class":722},"    // Admin users must have @company.com email\n",[484,2753,2754,2757,2759,2761,2763,2766,2769,2771,2773,2775,2777],{"class":486,"line":675},[484,2755,2756],{"class":490},"    if",[484,2758,1454],{"class":574},[484,2760,1723],{"class":498},[484,2762,465],{"class":494},[484,2764,2765],{"class":498},"role",[484,2767,2768],{"class":494}," ===",[484,2770,519],{"class":494},[484,2772,958],{"class":522},[484,2774,558],{"class":494},[484,2776,2426],{"class":574},[484,2778,840],{"class":494},[484,2780,2781,2784,2787,2789,2791,2793,2796,2798,2800,2803,2805],{"class":486,"line":808},[484,2782,2783],{"class":490},"      return",[484,2785,2786],{"class":498}," data",[484,2788,465],{"class":494},[484,2790,635],{"class":498},[484,2792,465],{"class":494},[484,2794,2795],{"class":552},"endsWith",[484,2797,555],{"class":574},[484,2799,558],{"class":494},[484,2801,2802],{"class":522},"@company.com",[484,2804,558],{"class":494},[484,2806,681],{"class":574},[484,2808,2809],{"class":486,"line":822},[484,2810,2811],{"class":494},"    }\n",[484,2813,2814,2817],{"class":486,"line":843},[484,2815,2816],{"class":490},"    return",[484,2818,2819],{"class":610}," true\n",[484,2821,2822],{"class":486,"line":888},[484,2823,2494],{"class":494},[484,2825,2826],{"class":486,"line":929},[484,2827,2828],{"class":494},"  {\n",[484,2830,2831,2834,2836,2838,2841,2843],{"class":486,"line":992},[484,2832,2833],{"class":574},"    message",[484,2835,578],{"class":494},[484,2837,519],{"class":494},[484,2839,2840],{"class":522},"Admin users must use company email",[484,2842,558],{"class":494},[484,2844,618],{"class":494},[484,2846,2847,2850,2852,2854,2856,2858,2860,2863],{"class":486,"line":1002},[484,2848,2849],{"class":574},"    path",[484,2851,578],{"class":494},[484,2853,1783],{"class":498},[484,2855,558],{"class":494},[484,2857,635],{"class":522},[484,2859,558],{"class":494},[484,2861,2862],{"class":498},"]",[484,2864,618],{"class":494},[484,2866,2867],{"class":486,"line":1027},[484,2868,1905],{"class":494},[484,2870,2871],{"class":486,"line":1063},[484,2872,681],{"class":498},[2638,2874,2876],{"id":2875},"async-validation","Async Validation",[475,2878,2880],{"className":477,"code":2879,"language":479,"meta":480,"style":480},"const createUserSchema = baseInsertSchema.extend({\n  email: z.string().email(),\n}).refine(\n  async (data) => {\n    // Check if email already exists\n    const existing = await db.query.users.findFirst({\n      where: eq(users.email, data.email),\n    })\n    return !existing\n  },\n  {\n    message: 'Email already exists',\n    path: ['email'],\n  }\n)\n",[458,2881,2882,2900,2922,2934,2948,2953,2985,3015,3021,3031,3035,3039,3054,3072,3076],{"__ignoreMap":480},[484,2883,2884,2886,2888,2890,2892,2894,2896,2898],{"class":486,"line":487},[484,2885,791],{"class":542},[484,2887,2653],{"class":498},[484,2889,549],{"class":494},[484,2891,830],{"class":498},[484,2893,465],{"class":494},[484,2895,835],{"class":552},[484,2897,555],{"class":498},[484,2899,840],{"class":494},[484,2901,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920],{"class":486,"line":529},[484,2903,624],{"class":574},[484,2905,578],{"class":494},[484,2907,751],{"class":498},[484,2909,465],{"class":494},[484,2911,855],{"class":552},[484,2913,647],{"class":498},[484,2915,465],{"class":494},[484,2917,635],{"class":552},[484,2919,647],{"class":498},[484,2921,618],{"class":494},[484,2923,2924,2926,2928,2930,2932],{"class":486,"line":536},[484,2925,678],{"class":494},[484,2927,592],{"class":498},[484,2929,465],{"class":494},[484,2931,2731],{"class":552},[484,2933,1542],{"class":498},[484,2935,2936,2938,2940,2942,2944,2946],{"class":486,"line":571},[484,2937,2363],{"class":542},[484,2939,1454],{"class":494},[484,2941,1723],{"class":1457},[484,2943,592],{"class":494},[484,2945,1463],{"class":542},[484,2947,568],{"class":494},[484,2949,2950],{"class":486,"line":621},[484,2951,2952],{"class":722},"    // Check if email already exists\n",[484,2954,2955,2957,2960,2962,2964,2967,2969,2972,2974,2976,2978,2981,2983],{"class":486,"line":652},[484,2956,2385],{"class":542},[484,2958,2959],{"class":498}," existing",[484,2961,2391],{"class":494},[484,2963,2566],{"class":490},[484,2965,2966],{"class":498}," db",[484,2968,465],{"class":494},[484,2970,2971],{"class":498},"query",[484,2973,465],{"class":494},[484,2975,561],{"class":498},[484,2977,465],{"class":494},[484,2979,2980],{"class":552},"findFirst",[484,2982,555],{"class":574},[484,2984,840],{"class":494},[484,2986,2987,2990,2992,2995,2997,2999,3001,3003,3005,3007,3009,3011,3013],{"class":486,"line":675},[484,2988,2989],{"class":574},"      where",[484,2991,578],{"class":494},[484,2993,2994],{"class":552}," eq",[484,2996,555],{"class":574},[484,2998,561],{"class":498},[484,3000,465],{"class":494},[484,3002,635],{"class":498},[484,3004,502],{"class":494},[484,3006,2786],{"class":498},[484,3008,465],{"class":494},[484,3010,635],{"class":498},[484,3012,592],{"class":574},[484,3014,618],{"class":494},[484,3016,3017,3019],{"class":486,"line":808},[484,3018,2180],{"class":494},[484,3020,681],{"class":574},[484,3022,3023,3025,3028],{"class":486,"line":822},[484,3024,2816],{"class":490},[484,3026,3027],{"class":494}," !",[484,3029,3030],{"class":498},"existing\n",[484,3032,3033],{"class":486,"line":843},[484,3034,2494],{"class":494},[484,3036,3037],{"class":486,"line":888},[484,3038,2828],{"class":494},[484,3040,3041,3043,3045,3047,3050,3052],{"class":486,"line":929},[484,3042,2833],{"class":574},[484,3044,578],{"class":494},[484,3046,519],{"class":494},[484,3048,3049],{"class":522},"Email already exists",[484,3051,558],{"class":494},[484,3053,618],{"class":494},[484,3055,3056,3058,3060,3062,3064,3066,3068,3070],{"class":486,"line":992},[484,3057,2849],{"class":574},[484,3059,578],{"class":494},[484,3061,1783],{"class":498},[484,3063,558],{"class":494},[484,3065,635],{"class":522},[484,3067,558],{"class":494},[484,3069,2862],{"class":498},[484,3071,618],{"class":494},[484,3073,3074],{"class":486,"line":1002},[484,3075,1905],{"class":494},[484,3077,3078],{"class":486,"line":1027},[484,3079,681],{"class":498},[2638,3081,3083],{"id":3082},"transform-data","Transform Data",[475,3085,3087],{"className":477,"code":3086,"language":479,"meta":480,"style":480},"const createUserSchema = baseInsertSchema.extend({\n  email: z.string().email().transform(val => val.toLowerCase()),\n  name: z.string().transform(val => val.trim()),\n})\n",[458,3088,3089,3107,3150,3185],{"__ignoreMap":480},[484,3090,3091,3093,3095,3097,3099,3101,3103,3105],{"class":486,"line":487},[484,3092,791],{"class":542},[484,3094,2653],{"class":498},[484,3096,549],{"class":494},[484,3098,830],{"class":498},[484,3100,465],{"class":494},[484,3102,835],{"class":552},[484,3104,555],{"class":498},[484,3106,840],{"class":494},[484,3108,3109,3111,3113,3115,3117,3119,3121,3123,3125,3127,3129,3132,3134,3137,3139,3142,3144,3146,3148],{"class":486,"line":529},[484,3110,624],{"class":574},[484,3112,578],{"class":494},[484,3114,751],{"class":498},[484,3116,465],{"class":494},[484,3118,855],{"class":552},[484,3120,647],{"class":498},[484,3122,465],{"class":494},[484,3124,635],{"class":552},[484,3126,647],{"class":498},[484,3128,465],{"class":494},[484,3130,3131],{"class":552},"transform",[484,3133,555],{"class":498},[484,3135,3136],{"class":1457},"val",[484,3138,1463],{"class":542},[484,3140,3141],{"class":498}," val",[484,3143,465],{"class":494},[484,3145,868],{"class":552},[484,3147,1157],{"class":498},[484,3149,618],{"class":494},[484,3151,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178,3181,3183],{"class":486,"line":536},[484,3153,655],{"class":574},[484,3155,578],{"class":494},[484,3157,751],{"class":498},[484,3159,465],{"class":494},[484,3161,855],{"class":552},[484,3163,647],{"class":498},[484,3165,465],{"class":494},[484,3167,3131],{"class":552},[484,3169,555],{"class":498},[484,3171,3136],{"class":1457},[484,3173,1463],{"class":542},[484,3175,3141],{"class":498},[484,3177,465],{"class":494},[484,3179,3180],{"class":552},"trim",[484,3182,1157],{"class":498},[484,3184,618],{"class":494},[484,3186,3187,3189],{"class":486,"line":571},[484,3188,678],{"class":494},[484,3190,681],{"class":498},[3192,3193,3194],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html 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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":480,"searchDepth":529,"depth":529,"links":3196},[3197,3198,3199,3200,3201,3202,3203,3204,3205,3206],{"id":469,"depth":529,"text":470},{"id":706,"depth":529,"text":707},{"id":1416,"depth":529,"text":1417},{"id":1596,"depth":529,"text":1597},{"id":1912,"depth":529,"text":1913},{"id":2046,"depth":529,"text":2047},{"id":2309,"depth":529,"text":2310},{"id":2503,"depth":529,"text":2504},{"id":2598,"depth":529,"text":2599},{"id":2635,"depth":529,"text":2636,"children":3207},[3208,3209,3210],{"id":2640,"depth":536,"text":2641},{"id":2875,"depth":536,"text":2876},{"id":3082,"depth":536,"text":3083},"@websideproject/nuxt-auto-api uses Zod for validation with automatic schema generation from Drizzle tables via drizzle-zod.","md",null,{},{"title":239,"description":3211},"sq_Spq0ZWPSSNZ1UnQ2iHwq0XAS4uoF0U1f8O3MXz0E",[3218,3220],{"title":235,"path":236,"stem":237,"description":3219,"children":-1},"This guide covers building multi-tenant SaaS applications with organization-level permissions, where users can have different roles across organizations.",{"title":243,"path":244,"stem":245,"description":3221,"children":-1},"Rate limiting is provided as a built-in plugin to protect your API from abuse and ensure fair usage. It registers as pre-auth middleware that runs automatically on every API request.",1772977477975]