[{"data":1,"prerenderedAt":3660},["ShallowReactive",2],{"navigation_docs":3,"-rpc-server-validation":399},[4,162,346],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":24},"RPC","icon-park-outline:lightning","\u002Frpc","01.rpc",[10,25,63,77,102,136],{"title":11,"icon":12,"redirect":7,"path":13,"stem":14,"children":15,"page":24},"Introduction","icon-park-outline:home","\u002Frpc\u002Fintroduction","01.rpc\u002F01.introduction",[16,20],{"title":17,"path":18,"stem":19},"Quick Start","\u002Frpc\u002Fintroduction\u002Fquick-start","01.rpc\u002F01.introduction\u002F02.quick-start",{"title":21,"path":22,"stem":23},"Manual Install","\u002Frpc\u002Fintroduction\u002Fmanual-install","01.rpc\u002F01.introduction\u002F03.manual-install",false,{"title":26,"icon":27,"path":28,"stem":29,"children":30,"page":24},"Server","icon-park-outline:server","\u002Frpc\u002Fserver","01.rpc\u002F02.server",[31,35,39,43,47,51,55,59],{"title":32,"path":33,"stem":34},"Routes","\u002Frpc\u002Fserver\u002Froutes","01.rpc\u002F02.server\u002F01.routes",{"title":36,"path":37,"stem":38},"Middleware","\u002Frpc\u002Fserver\u002Fmiddleware","01.rpc\u002F02.server\u002F02.middleware",{"title":40,"path":41,"stem":42},"Call Context","\u002Frpc\u002Fserver\u002Fcall-context","01.rpc\u002F02.server\u002F03.call-context",{"title":44,"path":45,"stem":46},"Headers","\u002Frpc\u002Fserver\u002Fheaders","01.rpc\u002F02.server\u002F04.headers",{"title":48,"path":49,"stem":50},"Error Handling","\u002Frpc\u002Fserver\u002Ferror-handling","01.rpc\u002F02.server\u002F05.error-handling",{"title":52,"path":53,"stem":54},"Validation","\u002Frpc\u002Fserver\u002Fvalidation","01.rpc\u002F02.server\u002F06.validation",{"title":56,"path":57,"stem":58},"JSON Round Trip","\u002Frpc\u002Fserver\u002Fjson-round-trip","01.rpc\u002F02.server\u002F07.json-round-trip",{"title":60,"path":61,"stem":62},"Drizzle Tables","\u002Frpc\u002Fserver\u002Fdrizzle-tables","01.rpc\u002F02.server\u002F08.drizzle-tables",{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":24},"Middlewares","icon-park-outline:link-one","\u002Frpc\u002Fmiddlewares","01.rpc\u002F03.middlewares",[69,73],{"title":70,"path":71,"stem":72},"fetchMetadata","\u002Frpc\u002Fmiddlewares\u002Ffetch-metadata","01.rpc\u002F03.middlewares\u002F01.fetch-metadata",{"title":74,"path":75,"stem":76},"syncRoutes","\u002Frpc\u002Fmiddlewares\u002Fsync-routes","01.rpc\u002F03.middlewares\u002F02.sync-routes",{"title":78,"icon":79,"path":80,"stem":81,"children":82,"page":24},"Client","icon-park-outline:computer","\u002Frpc\u002Fclient","01.rpc\u002F04.client",[83,87,91,94,98],{"title":84,"path":85,"stem":86},"Client Overview","\u002Frpc\u002Fclient\u002Fclient-overview","01.rpc\u002F04.client\u002F00.client-overview",{"title":88,"path":89,"stem":90},"Client Middleware","\u002Frpc\u002Fclient\u002Fclient-middleware","01.rpc\u002F04.client\u002F01.client-middleware",{"title":48,"path":92,"stem":93},"\u002Frpc\u002Fclient\u002Ferror-handling","01.rpc\u002F04.client\u002F02.error-handling",{"title":95,"path":96,"stem":97},"Batch Requests","\u002Frpc\u002Fclient\u002Fbatch","01.rpc\u002F04.client\u002F03.batch",{"title":99,"path":100,"stem":101},"Cancellation & Timeouts","\u002Frpc\u002Fclient\u002Fcancellation-timeouts","01.rpc\u002F04.client\u002F04.cancellation-timeouts",{"title":103,"redirect":104,"icon":105,"path":106,"stem":107,"children":108,"page":24},"Platforms","\u002Frpc\u002Fplatforms\u002Fnode-js","icon-park-outline:play","\u002Frpc\u002Fplatforms","01.rpc\u002F06.platforms",[109,112,116,120,124,128,132],{"title":110,"path":104,"stem":111},"Node.js","01.rpc\u002F06.platforms\u002F01.node-js",{"title":113,"path":114,"stem":115},"Bun","\u002Frpc\u002Fplatforms\u002Fbun","01.rpc\u002F06.platforms\u002F02.bun",{"title":117,"path":118,"stem":119},"AWS Lambda","\u002Frpc\u002Fplatforms\u002Faws-lambda","01.rpc\u002F06.platforms\u002F03.aws-lambda",{"title":121,"path":122,"stem":123},"Google Cloud Functions","\u002Frpc\u002Fplatforms\u002Fgoogle-cloud-functions","01.rpc\u002F06.platforms\u002F04.google-cloud-functions",{"title":125,"path":126,"stem":127},"Cloudflare Workers","\u002Frpc\u002Fplatforms\u002Fcloudflare","01.rpc\u002F06.platforms\u002F05.cloudflare",{"title":129,"path":130,"stem":131},"Vercel","\u002Frpc\u002Fplatforms\u002Fvercel","01.rpc\u002F06.platforms\u002F06.vercel",{"title":133,"path":134,"stem":135},"uWebSockets.js","\u002Frpc\u002Fplatforms\u002Fuwebsockets","01.rpc\u002F06.platforms\u002F07.uwebsockets",{"title":137,"icon":138,"path":139,"stem":140,"children":141,"page":24},"Devtools","icon-park-outline:tool","\u002Frpc\u002Fdevtools","01.rpc\u002F07.devtools",[142,146,150,154,158],{"title":143,"path":144,"stem":145},"Linter","\u002Frpc\u002Fdevtools\u002Flinter","01.rpc\u002F07.devtools\u002F01.linter",{"title":147,"path":148,"stem":149},"Vite","\u002Frpc\u002Fdevtools\u002Fvite","01.rpc\u002F07.devtools\u002F02.vite",{"title":151,"path":152,"stem":153},"Next.js","\u002Frpc\u002Fdevtools\u002Fnextjs","01.rpc\u002F07.devtools\u002F03.nextjs",{"title":155,"path":156,"stem":157},"CLI","\u002Frpc\u002Fdevtools\u002Fcli","01.rpc\u002F07.devtools\u002F04.cli",{"title":159,"path":160,"stem":161},"API Types","\u002Frpc\u002Fdevtools\u002Fapi-types","01.rpc\u002F07.devtools\u002F05.api-types",{"title":163,"icon":164,"path":165,"stem":166,"children":167,"page":24},"RunTypes","i-lucide-braces","\u002Fruntypes","02.runtypes",[168,184,224,254,268,290,332],{"title":11,"icon":169,"redirect":165,"path":170,"stem":171,"children":172,"page":24},"i-lucide-rocket","\u002Fruntypes\u002Fintroduction","02.runtypes\u002F01.introduction",[173,177,180],{"title":174,"path":175,"stem":176},"Built on typescript-go","\u002Fruntypes\u002Fintroduction\u002Fbuilt-on-typescript-go","02.runtypes\u002F01.introduction\u002F02.built-on-typescript-go",{"title":17,"path":178,"stem":179},"\u002Fruntypes\u002Fintroduction\u002Fquick-start","02.runtypes\u002F01.introduction\u002F03.quick-start",{"title":181,"path":182,"stem":183},"Configuration","\u002Fruntypes\u002Fintroduction\u002Fconfiguration","02.runtypes\u002F01.introduction\u002F04.configuration",{"title":185,"icon":186,"redirect":187,"path":188,"stem":189,"children":190,"page":24},"Guide","i-lucide-book-open","\u002Fruntypes\u002Fguide\u002Ftype-builders","\u002Fruntypes\u002Fguide","02.runtypes\u002F02.guide",[191,194,198,201,204,208,212,216,220],{"title":192,"path":187,"stem":193},"Types vs Type Builders","02.runtypes\u002F02.guide\u002F01.type-builders",{"title":195,"path":196,"stem":197},"Reflection","\u002Fruntypes\u002Fguide\u002Freflection","02.runtypes\u002F02.guide\u002F02.reflection",{"title":52,"path":199,"stem":200},"\u002Fruntypes\u002Fguide\u002Fvalidation","02.runtypes\u002F02.guide\u002F03.validation",{"title":56,"path":202,"stem":203},"\u002Fruntypes\u002Fguide\u002Fjson-round-trip","02.runtypes\u002F02.guide\u002F04.json-round-trip",{"title":205,"path":206,"stem":207},"Data Mocking","\u002Fruntypes\u002Fguide\u002Fmocking","02.runtypes\u002F02.guide\u002F07.mocking",{"title":209,"path":210,"stem":211},"JSON Schemas","\u002Fruntypes\u002Fguide\u002Fjson-schemas","02.runtypes\u002F02.guide\u002F08.json-schemas",{"title":213,"path":214,"stem":215},"Pure Functions","\u002Fruntypes\u002Fguide\u002Fpure-functions","02.runtypes\u002F02.guide\u002F09.pure-functions",{"title":217,"path":218,"stem":219},"Compiler Markers","\u002Fruntypes\u002Fguide\u002Fcompiler-markers","02.runtypes\u002F02.guide\u002F10.compiler-markers",{"title":221,"path":222,"stem":223},"All Compiled Functions","\u002Fruntypes\u002Fguide\u002Fall-compiled-functions","02.runtypes\u002F02.guide\u002F11.all-compiled-functions",{"title":225,"icon":226,"redirect":227,"path":228,"stem":229,"children":230,"page":24},"Type Formats","i-lucide-shapes","\u002Fruntypes\u002Ftype-formats\u002Foverview","\u002Fruntypes\u002Ftype-formats","02.runtypes\u002F03.type-formats",[231,234,238,242,246,250],{"title":232,"path":227,"stem":233},"Overview","02.runtypes\u002F03.type-formats\u002F01.overview",{"title":235,"path":236,"stem":237},"String Formats","\u002Fruntypes\u002Ftype-formats\u002Fstring","02.runtypes\u002F03.type-formats\u002F02.string",{"title":239,"path":240,"stem":241},"Number Formats","\u002Fruntypes\u002Ftype-formats\u002Fnumber","02.runtypes\u002F03.type-formats\u002F03.number",{"title":243,"path":244,"stem":245},"BigInt Formats","\u002Fruntypes\u002Ftype-formats\u002Fbigint","02.runtypes\u002F03.type-formats\u002F04.bigint",{"title":247,"path":248,"stem":249},"Date and Time Formats","\u002Fruntypes\u002Ftype-formats\u002Fdate-time","02.runtypes\u002F03.type-formats\u002F05.date-time",{"title":251,"path":252,"stem":253},"Collection Formats","\u002Fruntypes\u002Ftype-formats\u002Fcollections","02.runtypes\u002F03.type-formats\u002F06.collections",{"title":255,"icon":256,"redirect":257,"path":258,"stem":259,"children":260,"page":24},"Tooling","i-lucide-wrench","\u002Fruntypes\u002Ftooling\u002Flinting","\u002Fruntypes\u002Ftooling","02.runtypes\u002F04.tooling",[261,264],{"title":262,"path":257,"stem":263},"Linting","02.runtypes\u002F04.tooling\u002F01.linting",{"title":265,"path":266,"stem":267},"Source Conversion","\u002Fruntypes\u002Ftooling\u002Fsource-conversion","02.runtypes\u002F04.tooling\u002F02.source-conversion",{"title":269,"icon":270,"redirect":271,"path":272,"stem":273,"children":274,"page":24},"AI Integration","i-lucide-sparkles","\u002Fruntypes\u002Fai-integration\u002Fworkflow-and-commands","\u002Fruntypes\u002Fai-integration","02.runtypes\u002F05.ai-integration",[275,278,282,286],{"title":276,"path":271,"stem":277},"AI Workflow","02.runtypes\u002F05.ai-integration\u002F01.workflow-and-commands",{"title":279,"path":280,"stem":281},"FriendlyText","\u002Fruntypes\u002Fai-integration\u002Ffriendly-text","02.runtypes\u002F05.ai-integration\u002F02.friendly-text",{"title":283,"path":284,"stem":285},"MockData","\u002Fruntypes\u002Fai-integration\u002Fmock-data","02.runtypes\u002F05.ai-integration\u002F03.mock-data",{"title":287,"path":288,"stem":289},"Translations (i18n)","\u002Fruntypes\u002Fai-integration\u002Fi18n","02.runtypes\u002F05.ai-integration\u002F04.i18n",{"title":291,"icon":292,"redirect":293,"path":294,"stem":295,"children":296,"page":24},"Drizzle ORM","i-lineicons-drizzle","\u002Fruntypes\u002Fdrizzle-orm\u002Fdrizzle-overview","\u002Fruntypes\u002Fdrizzle-orm","02.runtypes\u002F06.drizzle-orm",[297,300,304,308,312,316,320,324,328],{"title":298,"path":293,"stem":299},"Drizzle Overview","02.runtypes\u002F06.drizzle-orm\u002F00.drizzle-overview",{"title":301,"path":302,"stem":303},"Column Formats","\u002Fruntypes\u002Fdrizzle-orm\u002Fcolumn-formats","02.runtypes\u002F06.drizzle-orm\u002F01.column-formats",{"title":305,"path":306,"stem":307},"Views","\u002Fruntypes\u002Fdrizzle-orm\u002Fviews","02.runtypes\u002F06.drizzle-orm\u002F02.views",{"title":309,"path":310,"stem":311},"Indexes and Constraints","\u002Fruntypes\u002Fdrizzle-orm\u002Fconstraints","02.runtypes\u002F06.drizzle-orm\u002F03.constraints",{"title":313,"path":314,"stem":315},"Row Level Security","\u002Fruntypes\u002Fdrizzle-orm\u002Frow-level-security","02.runtypes\u002F06.drizzle-orm\u002F04.row-level-security",{"title":317,"path":318,"stem":319},"Relations","\u002Fruntypes\u002Fdrizzle-orm\u002Frelations","02.runtypes\u002F06.drizzle-orm\u002F05.relations",{"title":321,"path":322,"stem":323},"The Schema File","\u002Fruntypes\u002Fdrizzle-orm\u002Fschema-file","02.runtypes\u002F06.drizzle-orm\u002F06.schema-file",{"title":325,"path":326,"stem":327},"Migrate an Existing Schema","\u002Fruntypes\u002Fdrizzle-orm\u002Fmigrate-an-existing-schema","02.runtypes\u002F06.drizzle-orm\u002F07.migrate-an-existing-schema",{"title":329,"path":330,"stem":331},"Cloudflare D1 and Durable Objects","\u002Fruntypes\u002Fdrizzle-orm\u002Fcloudflare-storage","02.runtypes\u002F06.drizzle-orm\u002F08.cloudflare-storage",{"title":333,"icon":334,"redirect":335,"path":336,"stem":337,"children":338,"page":24},"Diagnostics","i-lucide-triangle-alert","\u002Fruntypes\u002Fdiagnostics\u002Ferror-levels","\u002Fruntypes\u002Fdiagnostics","02.runtypes\u002F08.diagnostics",[339,342],{"title":340,"path":335,"stem":341},"Error Levels","02.runtypes\u002F08.diagnostics\u002F01.error-levels",{"title":343,"path":344,"stem":345},"All Diagnostics","\u002Fruntypes\u002Fdiagnostics\u002Fall-diagnostics","02.runtypes\u002F08.diagnostics\u002F02.all-diagnostics",{"title":347,"icon":348,"path":349,"stem":350,"children":351,"page":24},"Benchmarks","i-lucide-gauge","\u002Fbenchmarks","03.benchmarks",[352,372],{"title":5,"icon":6,"redirect":353,"path":354,"stem":355,"children":356,"page":24},"\u002Fbenchmarks\u002Frpc\u002Fhello-world","\u002Fbenchmarks\u002Frpc","03.benchmarks\u002F02.rpc",[357,360,364,368],{"title":358,"path":353,"stem":359},"Hello World","03.benchmarks\u002F02.rpc\u002F01.hello-world",{"title":361,"path":362,"stem":363},"Light Validation","\u002Fbenchmarks\u002Frpc\u002Flight-validation","03.benchmarks\u002F02.rpc\u002F02.light-validation",{"title":365,"path":366,"stem":367},"Heavy Validation","\u002Fbenchmarks\u002Frpc\u002Fheavy-validation","03.benchmarks\u002F02.rpc\u002F03.heavy-validation",{"title":369,"path":370,"stem":371},"Payload Sizes","\u002Fbenchmarks\u002Frpc\u002Fpayload-sizes","03.benchmarks\u002F02.rpc\u002F04.payload-sizes",{"title":163,"icon":164,"redirect":373,"path":374,"stem":375,"children":376,"page":24},"\u002Fbenchmarks\u002Fruntypes\u002Fis-valid","\u002Fbenchmarks\u002Fruntypes","03.benchmarks\u002F03.runtypes",[377,380,384,388,392,395],{"title":378,"path":373,"stem":379},"Is Valid","03.benchmarks\u002F03.runtypes\u002F01.is-valid",{"title":381,"path":382,"stem":383},"Is Valid Formats","\u002Fbenchmarks\u002Fruntypes\u002Fis-valid-formats","03.benchmarks\u002F03.runtypes\u002F02.is-valid-formats",{"title":385,"path":386,"stem":387},"Get Errors","\u002Fbenchmarks\u002Fruntypes\u002Fget-errors","03.benchmarks\u002F03.runtypes\u002F03.get-errors",{"title":389,"path":390,"stem":391},"Get Errors Formats","\u002Fbenchmarks\u002Fruntypes\u002Fget-errors-formats","03.benchmarks\u002F03.runtypes\u002F04.get-errors-formats",{"title":56,"path":393,"stem":394},"\u002Fbenchmarks\u002Fruntypes\u002Fjson-round-trip","03.benchmarks\u002F03.runtypes\u002F05.json-round-trip",{"title":396,"path":397,"stem":398},"Type Checking","\u002Fbenchmarks\u002Fruntypes\u002Ftype-checking","03.benchmarks\u002F03.runtypes\u002F07.type-checking",{"id":400,"title":52,"body":401,"description":3654,"extension":3655,"links":3656,"meta":3657,"navigation":481,"path":53,"seo":3658,"stem":54,"__hash__":3659},"docs\u002F01.rpc\u002F02.server\u002F06.validation.md",{"type":402,"value":403},"minimark",[404,413,418,425,828,832,841,1072,1076,1081,1095,1300,1304,1310,1453,1457,1466,1766,1827,1838,1842,1845,2002,2017,2024,2028,2050,3016,3020,3031,3374,3377,3381,3384,3636,3650],[405,406,407,408,412],"p",{},"mion validates with ",[409,410,411],"code",{},"@mionjs\u002Frun-types",", which reads your TypeScript types at compile time and uses them at runtime.\nYou write no schemas and no validation code.",[414,415,417],"h2",{"id":416},"automatic-validation","Automatic Validation",[405,419,420,421,424],{},"The params of every route and middleware are always validated before it runs.\nIf validation fails, the method never runs and an ",[409,422,423],{},"RpcError"," is thrown with the validation errors.",[426,427,432],"pre",{"className":428,"code":429,"language":430,"meta":431,"style":431},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {createMionRouter, Routes} from '@mionjs\u002Frouter';\n\nconst mion = createMionRouter();\n\n\u002F\u002F Your TypeScript types ARE the validation schema\ninterface User {\n  id: string;\n  email: string;\n  age: number;\n  birthDate: Date;\n  tags: Set\u003Cstring>;\n}\n\ntype NewUser = Omit\u003CUser, 'id'>;\n\nconst routes = {\n  createUser: mion.route((ctx, user: NewUser): User => {\n    \u002F\u002F Date and Set were restored from JSON, then user was validated\n    console.log(user.birthDate instanceof Date); \u002F\u002F true\n    console.log(user.tags instanceof Set); \u002F\u002F true\n    return {id: 'USER-123', ...user};\n  }),\n} satisfies Routes;\n","ts","",[409,433,434,476,483,505,510,517,530,545,557,570,583,603,609,614,645,650,662,707,713,748,776,805,816],{"__ignoreMap":431},[435,436,439,443,447,451,454,457,460,463,466,470,473],"span",{"class":437,"line":438},"line",1,[435,440,442],{"class":441},"s7zQu","import",[435,444,446],{"class":445},"sMK4o"," {",[435,448,450],{"class":449},"sTEyZ","createMionRouter",[435,452,453],{"class":445},",",[435,455,456],{"class":449}," Routes",[435,458,459],{"class":445},"}",[435,461,462],{"class":441}," from",[435,464,465],{"class":445}," '",[435,467,469],{"class":468},"sfazB","@mionjs\u002Frouter",[435,471,472],{"class":445},"'",[435,474,475],{"class":445},";\n",[435,477,479],{"class":437,"line":478},2,[435,480,482],{"emptyLinePlaceholder":481},true,"\n",[435,484,486,490,493,496,500,503],{"class":437,"line":485},3,[435,487,489],{"class":488},"spNyl","const",[435,491,492],{"class":449}," mion ",[435,494,495],{"class":445},"=",[435,497,499],{"class":498},"s2Zo4"," createMionRouter",[435,501,502],{"class":449},"()",[435,504,475],{"class":445},[435,506,508],{"class":437,"line":507},4,[435,509,482],{"emptyLinePlaceholder":481},[435,511,513],{"class":437,"line":512},5,[435,514,516],{"class":515},"sHwdD","\u002F\u002F Your TypeScript types ARE the validation schema\n",[435,518,520,523,527],{"class":437,"line":519},6,[435,521,522],{"class":488},"interface",[435,524,526],{"class":525},"sBMFI"," User",[435,528,529],{"class":445}," {\n",[435,531,533,537,540,543],{"class":437,"line":532},7,[435,534,536],{"class":535},"swJcz","  id",[435,538,539],{"class":445},":",[435,541,542],{"class":525}," string",[435,544,475],{"class":445},[435,546,548,551,553,555],{"class":437,"line":547},8,[435,549,550],{"class":535},"  email",[435,552,539],{"class":445},[435,554,542],{"class":525},[435,556,475],{"class":445},[435,558,560,563,565,568],{"class":437,"line":559},9,[435,561,562],{"class":535},"  age",[435,564,539],{"class":445},[435,566,567],{"class":525}," number",[435,569,475],{"class":445},[435,571,573,576,578,581],{"class":437,"line":572},10,[435,574,575],{"class":535},"  birthDate",[435,577,539],{"class":445},[435,579,580],{"class":525}," Date",[435,582,475],{"class":445},[435,584,586,589,591,594,597,600],{"class":437,"line":585},11,[435,587,588],{"class":535},"  tags",[435,590,539],{"class":445},[435,592,593],{"class":525}," Set",[435,595,596],{"class":445},"\u003C",[435,598,599],{"class":525},"string",[435,601,602],{"class":445},">;\n",[435,604,606],{"class":437,"line":605},12,[435,607,608],{"class":445},"}\n",[435,610,612],{"class":437,"line":611},13,[435,613,482],{"emptyLinePlaceholder":481},[435,615,617,620,623,626,629,631,634,636,638,641,643],{"class":437,"line":616},14,[435,618,619],{"class":488},"type",[435,621,622],{"class":525}," NewUser",[435,624,625],{"class":445}," =",[435,627,628],{"class":525}," Omit",[435,630,596],{"class":445},[435,632,633],{"class":525},"User",[435,635,453],{"class":445},[435,637,465],{"class":445},[435,639,640],{"class":468},"id",[435,642,472],{"class":445},[435,644,602],{"class":445},[435,646,648],{"class":437,"line":647},15,[435,649,482],{"emptyLinePlaceholder":481},[435,651,653,655,658,660],{"class":437,"line":652},16,[435,654,489],{"class":488},[435,656,657],{"class":449}," routes ",[435,659,495],{"class":445},[435,661,529],{"class":445},[435,663,665,668,670,673,676,679,682,684,688,690,693,695,697,700,702,705],{"class":437,"line":664},17,[435,666,667],{"class":535},"  createUser",[435,669,539],{"class":445},[435,671,672],{"class":449}," mion",[435,674,675],{"class":445},".",[435,677,678],{"class":498},"route",[435,680,681],{"class":449},"(",[435,683,681],{"class":445},[435,685,687],{"class":686},"sHdIc","ctx",[435,689,453],{"class":445},[435,691,692],{"class":686}," user",[435,694,539],{"class":445},[435,696,622],{"class":525},[435,698,699],{"class":445},"):",[435,701,526],{"class":525},[435,703,704],{"class":488}," =>",[435,706,529],{"class":445},[435,708,710],{"class":437,"line":709},18,[435,711,712],{"class":515},"    \u002F\u002F Date and Set were restored from JSON, then user was validated\n",[435,714,716,719,721,724,726,729,731,734,737,739,742,745],{"class":437,"line":715},19,[435,717,718],{"class":449},"    console",[435,720,675],{"class":445},[435,722,723],{"class":498},"log",[435,725,681],{"class":535},[435,727,728],{"class":449},"user",[435,730,675],{"class":445},[435,732,733],{"class":449},"birthDate",[435,735,736],{"class":445}," instanceof",[435,738,580],{"class":525},[435,740,741],{"class":535},")",[435,743,744],{"class":445},";",[435,746,747],{"class":515}," \u002F\u002F true\n",[435,749,751,753,755,757,759,761,763,766,768,770,772,774],{"class":437,"line":750},20,[435,752,718],{"class":449},[435,754,675],{"class":445},[435,756,723],{"class":498},[435,758,681],{"class":535},[435,760,728],{"class":449},[435,762,675],{"class":445},[435,764,765],{"class":449},"tags",[435,767,736],{"class":445},[435,769,593],{"class":525},[435,771,741],{"class":535},[435,773,744],{"class":445},[435,775,747],{"class":515},[435,777,779,782,784,786,788,790,793,795,797,800,802],{"class":437,"line":778},21,[435,780,781],{"class":441},"    return",[435,783,446],{"class":445},[435,785,640],{"class":535},[435,787,539],{"class":445},[435,789,465],{"class":445},[435,791,792],{"class":468},"USER-123",[435,794,472],{"class":445},[435,796,453],{"class":445},[435,798,799],{"class":445}," ...",[435,801,728],{"class":449},[435,803,804],{"class":445},"};\n",[435,806,808,811,813],{"class":437,"line":807},22,[435,809,810],{"class":445},"  }",[435,812,741],{"class":449},[435,814,815],{"class":445},",\n",[435,817,819,821,824,826],{"class":437,"line":818},23,[435,820,459],{"class":445},[435,822,823],{"class":441}," satisfies",[435,825,456],{"class":525},[435,827,475],{"class":445},[414,829,831],{"id":830},"validation-errors","Validation Errors",[405,833,834,835,838,839,675],{},"An invalid request throws a ",[409,836,837],{},"ValidationError",", which extends ",[409,840,423],{},[426,842,844],{"className":428,"code":843,"language":430,"meta":431,"style":431},"import {RpcError, RunTypeError, ValidationError} from '@mionjs\u002Fcore';\n\nconst validationError: ValidationError = new RpcError({\n  statusCode: 422,\n  type: 'validation-error',\n  publicMessage: \"Invalid params in 'createUser', validation failed.\",\n  errorData: {\n    typeErrors: [\n      {path: ['email'], expected: 'string'},\n      {path: ['age'], expected: 'number'},\n    ] as RunTypeError[],\n  },\n});\n",[409,845,846,877,881,905,918,934,952,961,971,1010,1044,1059,1064],{"__ignoreMap":431},[435,847,848,850,852,854,856,859,861,864,866,868,870,873,875],{"class":437,"line":438},[435,849,442],{"class":441},[435,851,446],{"class":445},[435,853,423],{"class":449},[435,855,453],{"class":445},[435,857,858],{"class":449}," RunTypeError",[435,860,453],{"class":445},[435,862,863],{"class":449}," ValidationError",[435,865,459],{"class":445},[435,867,462],{"class":441},[435,869,465],{"class":445},[435,871,872],{"class":468},"@mionjs\u002Fcore",[435,874,472],{"class":445},[435,876,475],{"class":445},[435,878,879],{"class":437,"line":478},[435,880,482],{"emptyLinePlaceholder":481},[435,882,883,885,888,890,892,894,897,900,902],{"class":437,"line":485},[435,884,489],{"class":488},[435,886,887],{"class":449}," validationError",[435,889,539],{"class":445},[435,891,863],{"class":525},[435,893,625],{"class":445},[435,895,896],{"class":445}," new",[435,898,899],{"class":498}," RpcError",[435,901,681],{"class":449},[435,903,904],{"class":445},"{\n",[435,906,907,910,912,916],{"class":437,"line":507},[435,908,909],{"class":535},"  statusCode",[435,911,539],{"class":445},[435,913,915],{"class":914},"sbssI"," 422",[435,917,815],{"class":445},[435,919,920,923,925,927,930,932],{"class":437,"line":512},[435,921,922],{"class":535},"  type",[435,924,539],{"class":445},[435,926,465],{"class":445},[435,928,929],{"class":468},"validation-error",[435,931,472],{"class":445},[435,933,815],{"class":445},[435,935,936,939,941,944,947,950],{"class":437,"line":519},[435,937,938],{"class":535},"  publicMessage",[435,940,539],{"class":445},[435,942,943],{"class":445}," \"",[435,945,946],{"class":468},"Invalid params in 'createUser', validation failed.",[435,948,949],{"class":445},"\"",[435,951,815],{"class":445},[435,953,954,957,959],{"class":437,"line":532},[435,955,956],{"class":535},"  errorData",[435,958,539],{"class":445},[435,960,529],{"class":445},[435,962,963,966,968],{"class":437,"line":547},[435,964,965],{"class":535},"    typeErrors",[435,967,539],{"class":445},[435,969,970],{"class":449}," [\n",[435,972,973,976,979,981,984,986,989,991,994,996,999,1001,1003,1005,1007],{"class":437,"line":559},[435,974,975],{"class":445},"      {",[435,977,978],{"class":535},"path",[435,980,539],{"class":445},[435,982,983],{"class":449}," [",[435,985,472],{"class":445},[435,987,988],{"class":468},"email",[435,990,472],{"class":445},[435,992,993],{"class":449},"]",[435,995,453],{"class":445},[435,997,998],{"class":535}," expected",[435,1000,539],{"class":445},[435,1002,465],{"class":445},[435,1004,599],{"class":468},[435,1006,472],{"class":445},[435,1008,1009],{"class":445},"},\n",[435,1011,1012,1014,1016,1018,1020,1022,1025,1027,1029,1031,1033,1035,1037,1040,1042],{"class":437,"line":572},[435,1013,975],{"class":445},[435,1015,978],{"class":535},[435,1017,539],{"class":445},[435,1019,983],{"class":449},[435,1021,472],{"class":445},[435,1023,1024],{"class":468},"age",[435,1026,472],{"class":445},[435,1028,993],{"class":449},[435,1030,453],{"class":445},[435,1032,998],{"class":535},[435,1034,539],{"class":445},[435,1036,465],{"class":445},[435,1038,1039],{"class":468},"number",[435,1041,472],{"class":445},[435,1043,1009],{"class":445},[435,1045,1046,1049,1052,1054,1057],{"class":437,"line":585},[435,1047,1048],{"class":449},"    ] ",[435,1050,1051],{"class":441},"as",[435,1053,858],{"class":525},[435,1055,1056],{"class":449},"[]",[435,1058,815],{"class":445},[435,1060,1061],{"class":437,"line":605},[435,1062,1063],{"class":445},"  },\n",[435,1065,1066,1068,1070],{"class":437,"line":611},[435,1067,459],{"class":445},[435,1069,741],{"class":449},[435,1071,475],{"class":445},[414,1073,1075],{"id":1074},"validation-functions","Validation Functions",[1077,1078,1080],"h3",{"id":1079},"fast-boolean-check","Fast Boolean Check",[405,1082,1083,1086,1087,1090,1091,1094],{},[409,1084,1085],{},"createValidateFn"," builds a fast check that returns only ",[409,1088,1089],{},"true"," or ",[409,1092,1093],{},"false",". Use it in guard clauses and hot paths, where you do not need error details.",[426,1096,1098],{"className":428,"code":1097,"language":430,"meta":431,"style":431},"import {createValidateFn} from '@mionjs\u002Frun-types';\n\ninterface User {\n  name: string;\n  age: number;\n}\n\n\u002F\u002F synchronous: the mion vite plugin injects the compiled validator at build time\nconst validate = createValidateFn\u003CUser>();\n\nvalidate({name: 'John', age: 30}); \u002F\u002F true\nvalidate({name: 'John'}); \u002F\u002F false (missing age)\nvalidate({name: 'John', age: '30'}); \u002F\u002F false (age is string)\n",[409,1099,1100,1120,1124,1132,1143,1153,1157,1161,1166,1189,1193,1233,1260],{"__ignoreMap":431},[435,1101,1102,1104,1106,1108,1110,1112,1114,1116,1118],{"class":437,"line":438},[435,1103,442],{"class":441},[435,1105,446],{"class":445},[435,1107,1085],{"class":449},[435,1109,459],{"class":445},[435,1111,462],{"class":441},[435,1113,465],{"class":445},[435,1115,411],{"class":468},[435,1117,472],{"class":445},[435,1119,475],{"class":445},[435,1121,1122],{"class":437,"line":478},[435,1123,482],{"emptyLinePlaceholder":481},[435,1125,1126,1128,1130],{"class":437,"line":485},[435,1127,522],{"class":488},[435,1129,526],{"class":525},[435,1131,529],{"class":445},[435,1133,1134,1137,1139,1141],{"class":437,"line":507},[435,1135,1136],{"class":535},"  name",[435,1138,539],{"class":445},[435,1140,542],{"class":525},[435,1142,475],{"class":445},[435,1144,1145,1147,1149,1151],{"class":437,"line":512},[435,1146,562],{"class":535},[435,1148,539],{"class":445},[435,1150,567],{"class":525},[435,1152,475],{"class":445},[435,1154,1155],{"class":437,"line":519},[435,1156,608],{"class":445},[435,1158,1159],{"class":437,"line":532},[435,1160,482],{"emptyLinePlaceholder":481},[435,1162,1163],{"class":437,"line":547},[435,1164,1165],{"class":515},"\u002F\u002F synchronous: the mion vite plugin injects the compiled validator at build time\n",[435,1167,1168,1170,1173,1175,1178,1180,1182,1185,1187],{"class":437,"line":559},[435,1169,489],{"class":488},[435,1171,1172],{"class":449}," validate ",[435,1174,495],{"class":445},[435,1176,1177],{"class":498}," createValidateFn",[435,1179,596],{"class":445},[435,1181,633],{"class":525},[435,1183,1184],{"class":445},">",[435,1186,502],{"class":449},[435,1188,475],{"class":445},[435,1190,1191],{"class":437,"line":572},[435,1192,482],{"emptyLinePlaceholder":481},[435,1194,1195,1198,1200,1203,1206,1208,1210,1213,1215,1217,1220,1222,1225,1227,1229,1231],{"class":437,"line":585},[435,1196,1197],{"class":498},"validate",[435,1199,681],{"class":449},[435,1201,1202],{"class":445},"{",[435,1204,1205],{"class":535},"name",[435,1207,539],{"class":445},[435,1209,465],{"class":445},[435,1211,1212],{"class":468},"John",[435,1214,472],{"class":445},[435,1216,453],{"class":445},[435,1218,1219],{"class":535}," age",[435,1221,539],{"class":445},[435,1223,1224],{"class":914}," 30",[435,1226,459],{"class":445},[435,1228,741],{"class":449},[435,1230,744],{"class":445},[435,1232,747],{"class":515},[435,1234,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257],{"class":437,"line":605},[435,1236,1197],{"class":498},[435,1238,681],{"class":449},[435,1240,1202],{"class":445},[435,1242,1205],{"class":535},[435,1244,539],{"class":445},[435,1246,465],{"class":445},[435,1248,1212],{"class":468},[435,1250,472],{"class":445},[435,1252,459],{"class":445},[435,1254,741],{"class":449},[435,1256,744],{"class":445},[435,1258,1259],{"class":515}," \u002F\u002F false (missing age)\n",[435,1261,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1289,1291,1293,1295,1297],{"class":437,"line":611},[435,1263,1197],{"class":498},[435,1265,681],{"class":449},[435,1267,1202],{"class":445},[435,1269,1205],{"class":535},[435,1271,539],{"class":445},[435,1273,465],{"class":445},[435,1275,1212],{"class":468},[435,1277,472],{"class":445},[435,1279,453],{"class":445},[435,1281,1219],{"class":535},[435,1283,539],{"class":445},[435,1285,465],{"class":445},[435,1287,1288],{"class":468},"30",[435,1290,472],{"class":445},[435,1292,459],{"class":445},[435,1294,741],{"class":449},[435,1296,744],{"class":445},[435,1298,1299],{"class":515}," \u002F\u002F false (age is string)\n",[1077,1301,1303],{"id":1302},"detailed-error-information","Detailed Error Information",[405,1305,1306,1309],{},[409,1307,1308],{},"createGetValidationErrorsFn"," builds a function that returns each error with the path to the invalid property and the expected type. Use it for user feedback (forms, API error responses), debugging and logging.",[426,1311,1313],{"className":428,"code":1312,"language":430,"meta":431,"style":431},"import {createGetValidationErrorsFn} from '@mionjs\u002Frun-types';\n\ninterface User {\n  name: string;\n  age: number;\n}\n\n\u002F\u002F synchronous: returns the compiled error collector\nconst getUserErrors = createGetValidationErrorsFn\u003CUser>();\n\nconst errors = getUserErrors({name: 123, age: 'invalid'});\n\u002F\u002F [{path: ['name'], expected: 'string'}, {path: ['age'], expected: 'number'}]\n",[409,1314,1315,1335,1339,1347,1357,1367,1371,1375,1380,1402,1406,1448],{"__ignoreMap":431},[435,1316,1317,1319,1321,1323,1325,1327,1329,1331,1333],{"class":437,"line":438},[435,1318,442],{"class":441},[435,1320,446],{"class":445},[435,1322,1308],{"class":449},[435,1324,459],{"class":445},[435,1326,462],{"class":441},[435,1328,465],{"class":445},[435,1330,411],{"class":468},[435,1332,472],{"class":445},[435,1334,475],{"class":445},[435,1336,1337],{"class":437,"line":478},[435,1338,482],{"emptyLinePlaceholder":481},[435,1340,1341,1343,1345],{"class":437,"line":485},[435,1342,522],{"class":488},[435,1344,526],{"class":525},[435,1346,529],{"class":445},[435,1348,1349,1351,1353,1355],{"class":437,"line":507},[435,1350,1136],{"class":535},[435,1352,539],{"class":445},[435,1354,542],{"class":525},[435,1356,475],{"class":445},[435,1358,1359,1361,1363,1365],{"class":437,"line":512},[435,1360,562],{"class":535},[435,1362,539],{"class":445},[435,1364,567],{"class":525},[435,1366,475],{"class":445},[435,1368,1369],{"class":437,"line":519},[435,1370,608],{"class":445},[435,1372,1373],{"class":437,"line":532},[435,1374,482],{"emptyLinePlaceholder":481},[435,1376,1377],{"class":437,"line":547},[435,1378,1379],{"class":515},"\u002F\u002F synchronous: returns the compiled error collector\n",[435,1381,1382,1384,1387,1389,1392,1394,1396,1398,1400],{"class":437,"line":559},[435,1383,489],{"class":488},[435,1385,1386],{"class":449}," getUserErrors ",[435,1388,495],{"class":445},[435,1390,1391],{"class":498}," createGetValidationErrorsFn",[435,1393,596],{"class":445},[435,1395,633],{"class":525},[435,1397,1184],{"class":445},[435,1399,502],{"class":449},[435,1401,475],{"class":445},[435,1403,1404],{"class":437,"line":572},[435,1405,482],{"emptyLinePlaceholder":481},[435,1407,1408,1410,1413,1415,1418,1420,1422,1424,1426,1429,1431,1433,1435,1437,1440,1442,1444,1446],{"class":437,"line":585},[435,1409,489],{"class":488},[435,1411,1412],{"class":449}," errors ",[435,1414,495],{"class":445},[435,1416,1417],{"class":498}," getUserErrors",[435,1419,681],{"class":449},[435,1421,1202],{"class":445},[435,1423,1205],{"class":535},[435,1425,539],{"class":445},[435,1427,1428],{"class":914}," 123",[435,1430,453],{"class":445},[435,1432,1219],{"class":535},[435,1434,539],{"class":445},[435,1436,465],{"class":445},[435,1438,1439],{"class":468},"invalid",[435,1441,472],{"class":445},[435,1443,459],{"class":445},[435,1445,741],{"class":449},[435,1447,475],{"class":445},[435,1449,1450],{"class":437,"line":605},[435,1451,1452],{"class":515},"\u002F\u002F [{path: ['name'], expected: 'string'}, {path: ['age'], expected: 'number'}]\n",[414,1454,1456],{"id":1455},"undeclared-properties","Undeclared Properties",[405,1458,1459,1460,1465],{},"The ",[1461,1462,1464],"a",{"href":1463},"\u002Frpc\u002Fserver\u002Fjson-round-trip#parser-strategies","parser"," option picks what happens to a property your type does not declare. Dropping happens while the request is decoded, not at validation.",[426,1467,1469],{"className":428,"code":1468,"language":430,"meta":431,"style":431},"import {createMionRouter, Routes} from '@mionjs\u002Frouter';\n\ninterface User {\n  name: string;\n  email: string;\n  age: number;\n}\n\n\u002F\u002F every route on this router rejects params carrying a property the type does not declare\nconst mion = createMionRouter({parser: {params: 'mutateStrict'}} as const);\n\nconst routes = {\n  \u002F\u002F inherits mutateStrict from the router\n  createUser: mion.route((ctx, user: User): User => user),\n  \u002F\u002F this route drops the extra property instead of refusing the request\n  updateUser: mion.route((ctx, user: Partial\u003CUser>): Partial\u003CUser> => user, {\n    parser: {params: 'clone'},\n  }),\n} satisfies Routes;\n\nmion.initRoutes(routes);\n",[409,1470,1471,1495,1499,1507,1517,1527,1537,1541,1545,1550,1595,1599,1609,1614,1651,1656,1707,1729,1737,1747,1751],{"__ignoreMap":431},[435,1472,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493],{"class":437,"line":438},[435,1474,442],{"class":441},[435,1476,446],{"class":445},[435,1478,450],{"class":449},[435,1480,453],{"class":445},[435,1482,456],{"class":449},[435,1484,459],{"class":445},[435,1486,462],{"class":441},[435,1488,465],{"class":445},[435,1490,469],{"class":468},[435,1492,472],{"class":445},[435,1494,475],{"class":445},[435,1496,1497],{"class":437,"line":478},[435,1498,482],{"emptyLinePlaceholder":481},[435,1500,1501,1503,1505],{"class":437,"line":485},[435,1502,522],{"class":488},[435,1504,526],{"class":525},[435,1506,529],{"class":445},[435,1508,1509,1511,1513,1515],{"class":437,"line":507},[435,1510,1136],{"class":535},[435,1512,539],{"class":445},[435,1514,542],{"class":525},[435,1516,475],{"class":445},[435,1518,1519,1521,1523,1525],{"class":437,"line":512},[435,1520,550],{"class":535},[435,1522,539],{"class":445},[435,1524,542],{"class":525},[435,1526,475],{"class":445},[435,1528,1529,1531,1533,1535],{"class":437,"line":519},[435,1530,562],{"class":535},[435,1532,539],{"class":445},[435,1534,567],{"class":525},[435,1536,475],{"class":445},[435,1538,1539],{"class":437,"line":532},[435,1540,608],{"class":445},[435,1542,1543],{"class":437,"line":547},[435,1544,482],{"emptyLinePlaceholder":481},[435,1546,1547],{"class":437,"line":559},[435,1548,1549],{"class":515},"\u002F\u002F every route on this router rejects params carrying a property the type does not declare\n",[435,1551,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570,1573,1575,1577,1580,1582,1585,1588,1591,1593],{"class":437,"line":572},[435,1553,489],{"class":488},[435,1555,492],{"class":449},[435,1557,495],{"class":445},[435,1559,499],{"class":498},[435,1561,681],{"class":449},[435,1563,1202],{"class":445},[435,1565,1464],{"class":535},[435,1567,539],{"class":445},[435,1569,446],{"class":445},[435,1571,1572],{"class":535},"params",[435,1574,539],{"class":445},[435,1576,465],{"class":445},[435,1578,1579],{"class":468},"mutateStrict",[435,1581,472],{"class":445},[435,1583,1584],{"class":445},"}}",[435,1586,1587],{"class":441}," as",[435,1589,1590],{"class":488}," const",[435,1592,741],{"class":449},[435,1594,475],{"class":445},[435,1596,1597],{"class":437,"line":585},[435,1598,482],{"emptyLinePlaceholder":481},[435,1600,1601,1603,1605,1607],{"class":437,"line":605},[435,1602,489],{"class":488},[435,1604,657],{"class":449},[435,1606,495],{"class":445},[435,1608,529],{"class":445},[435,1610,1611],{"class":437,"line":611},[435,1612,1613],{"class":515},"  \u002F\u002F inherits mutateStrict from the router\n",[435,1615,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1646,1649],{"class":437,"line":616},[435,1617,667],{"class":535},[435,1619,539],{"class":445},[435,1621,672],{"class":449},[435,1623,675],{"class":445},[435,1625,678],{"class":498},[435,1627,681],{"class":449},[435,1629,681],{"class":445},[435,1631,687],{"class":686},[435,1633,453],{"class":445},[435,1635,692],{"class":686},[435,1637,539],{"class":445},[435,1639,526],{"class":525},[435,1641,699],{"class":445},[435,1643,526],{"class":525},[435,1645,704],{"class":488},[435,1647,1648],{"class":449}," user)",[435,1650,815],{"class":445},[435,1652,1653],{"class":437,"line":647},[435,1654,1655],{"class":515},"  \u002F\u002F this route drops the extra property instead of refusing the request\n",[435,1657,1658,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1684,1686,1688,1691,1693,1695,1697,1699,1701,1703,1705],{"class":437,"line":652},[435,1659,1660],{"class":535},"  updateUser",[435,1662,539],{"class":445},[435,1664,672],{"class":449},[435,1666,675],{"class":445},[435,1668,678],{"class":498},[435,1670,681],{"class":449},[435,1672,681],{"class":445},[435,1674,687],{"class":686},[435,1676,453],{"class":445},[435,1678,692],{"class":686},[435,1680,539],{"class":445},[435,1682,1683],{"class":525}," Partial",[435,1685,596],{"class":445},[435,1687,633],{"class":525},[435,1689,1690],{"class":445},">):",[435,1692,1683],{"class":525},[435,1694,596],{"class":445},[435,1696,633],{"class":525},[435,1698,1184],{"class":445},[435,1700,704],{"class":488},[435,1702,692],{"class":449},[435,1704,453],{"class":445},[435,1706,529],{"class":445},[435,1708,1709,1712,1714,1716,1718,1720,1722,1725,1727],{"class":437,"line":664},[435,1710,1711],{"class":535},"    parser",[435,1713,539],{"class":445},[435,1715,446],{"class":445},[435,1717,1572],{"class":535},[435,1719,539],{"class":445},[435,1721,465],{"class":445},[435,1723,1724],{"class":468},"clone",[435,1726,472],{"class":445},[435,1728,1009],{"class":445},[435,1730,1731,1733,1735],{"class":437,"line":709},[435,1732,810],{"class":445},[435,1734,741],{"class":449},[435,1736,815],{"class":445},[435,1738,1739,1741,1743,1745],{"class":437,"line":715},[435,1740,459],{"class":445},[435,1742,823],{"class":441},[435,1744,456],{"class":525},[435,1746,475],{"class":445},[435,1748,1749],{"class":437,"line":750},[435,1750,482],{"emptyLinePlaceholder":481},[435,1752,1753,1756,1758,1761,1764],{"class":437,"line":778},[435,1754,1755],{"class":449},"mion",[435,1757,675],{"class":445},[435,1759,1760],{"class":498},"initRoutes",[435,1762,1763],{"class":449},"(routes)",[435,1765,475],{"class":445},[1767,1768,1769,1782],"table",{},[1770,1771,1772],"thead",{},[1773,1774,1775,1779],"tr",{},[1776,1777,1778],"th",{},"Strategy",[1776,1780,1781],{},"An undeclared property is",[1783,1784,1785,1796,1805,1815],"tbody",{},[1773,1786,1787,1793],{},[1788,1789,1790,1792],"td",{},[409,1791,1724],{}," (default)",[1788,1794,1795],{},"dropped",[1773,1797,1798,1803],{},[1788,1799,1800],{},[409,1801,1802],{},"compact",[1788,1804,1795],{},[1773,1806,1807,1812],{},[1788,1808,1809],{},[409,1810,1811],{},"mutate",[1788,1813,1814],{},"kept",[1773,1816,1817,1821],{},[1788,1818,1819],{},[409,1820,1579],{},[1788,1822,1823,1824,1826],{},"rejected: the route never runs and the caller gets a ",[409,1825,929],{}," (HTTP 422)",[1828,1829,1830,1831,1833,1834,1837],"note",{},"This table is about params, and ",[409,1832,1579],{}," works on params only. ",[1461,1835,1836],{"href":1463},"Parser Strategies"," shows what each strategy does to a return value.",[1077,1839,1841],{"id":1840},"unions","Unions",[405,1843,1844],{},"A union is the one shape where dropping is not enough. Its members share one list of property names, and a member with an index signature declares every property:",[426,1846,1848],{"className":428,"code":1847,"language":430,"meta":431,"style":431},"type Pet = {kind: 'cat'; meows: boolean} | {kind: 'dog'; barks: number};\n\u002F\u002F {kind: 'cat', meows: true, barks: 3}  ->  barks is kept\n\ntype Something = {a: string} | Record\u003Cstring, number>;\n\u002F\u002F {a: 'x', evil: 'garbage'}  ->  the whole object is kept\n\ntype Loose = {a: string} | Record\u003Cstring, string>;\n\u002F\u002F {a: 'x', evil: 'garbage'}  ->  accepted, every value is a string\n",[409,1849,1850,1912,1917,1921,1955,1960,1964,1997],{"__ignoreMap":431},[435,1851,1852,1854,1857,1859,1861,1864,1866,1868,1871,1873,1875,1878,1880,1883,1885,1888,1890,1892,1894,1896,1899,1901,1903,1906,1908,1910],{"class":437,"line":438},[435,1853,619],{"class":488},[435,1855,1856],{"class":525}," Pet",[435,1858,625],{"class":445},[435,1860,446],{"class":445},[435,1862,1863],{"class":535},"kind",[435,1865,539],{"class":445},[435,1867,465],{"class":445},[435,1869,1870],{"class":468},"cat",[435,1872,472],{"class":445},[435,1874,744],{"class":445},[435,1876,1877],{"class":535}," meows",[435,1879,539],{"class":445},[435,1881,1882],{"class":525}," boolean",[435,1884,459],{"class":445},[435,1886,1887],{"class":445}," |",[435,1889,446],{"class":445},[435,1891,1863],{"class":535},[435,1893,539],{"class":445},[435,1895,465],{"class":445},[435,1897,1898],{"class":468},"dog",[435,1900,472],{"class":445},[435,1902,744],{"class":445},[435,1904,1905],{"class":535}," barks",[435,1907,539],{"class":445},[435,1909,567],{"class":525},[435,1911,804],{"class":445},[435,1913,1914],{"class":437,"line":478},[435,1915,1916],{"class":515},"\u002F\u002F {kind: 'cat', meows: true, barks: 3}  ->  barks is kept\n",[435,1918,1919],{"class":437,"line":485},[435,1920,482],{"emptyLinePlaceholder":481},[435,1922,1923,1925,1928,1930,1932,1934,1936,1938,1940,1942,1945,1947,1949,1951,1953],{"class":437,"line":507},[435,1924,619],{"class":488},[435,1926,1927],{"class":525}," Something",[435,1929,625],{"class":445},[435,1931,446],{"class":445},[435,1933,1461],{"class":535},[435,1935,539],{"class":445},[435,1937,542],{"class":525},[435,1939,459],{"class":445},[435,1941,1887],{"class":445},[435,1943,1944],{"class":525}," Record",[435,1946,596],{"class":445},[435,1948,599],{"class":525},[435,1950,453],{"class":445},[435,1952,567],{"class":525},[435,1954,602],{"class":445},[435,1956,1957],{"class":437,"line":512},[435,1958,1959],{"class":515},"\u002F\u002F {a: 'x', evil: 'garbage'}  ->  the whole object is kept\n",[435,1961,1962],{"class":437,"line":519},[435,1963,482],{"emptyLinePlaceholder":481},[435,1965,1966,1968,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995],{"class":437,"line":532},[435,1967,619],{"class":488},[435,1969,1970],{"class":525}," Loose",[435,1972,625],{"class":445},[435,1974,446],{"class":445},[435,1976,1461],{"class":535},[435,1978,539],{"class":445},[435,1980,542],{"class":525},[435,1982,459],{"class":445},[435,1984,1887],{"class":445},[435,1986,1944],{"class":525},[435,1988,596],{"class":445},[435,1990,599],{"class":525},[435,1992,453],{"class":445},[435,1994,542],{"class":525},[435,1996,602],{"class":445},[435,1998,1999],{"class":437,"line":547},[435,2000,2001],{"class":515},"\u002F\u002F {a: 'x', evil: 'garbage'}  ->  accepted, every value is a string\n",[405,2003,2004,2005,2007,2008,2010,2011,2013,2014,2016],{},"Every strategy checks this: ",[409,2006,1724],{},", ",[409,2009,1802],{}," and ",[409,2012,1579],{}," reject the request, ",[409,2015,1811],{}," still keeps the property.",[405,2018,2019,2020,2023],{},"The check runs only when the union has two or more members with named properties, so ",[409,2021,2022],{},"{a: string} | number"," is not affected.",[1077,2025,2027],{"id":2026},"checking-types-outside-a-route","Checking Types Outside a Route",[405,2029,2030,2033,2034,2037,2038,2040,2041,2010,2043,2045,2046,675],{},[409,2031,2032],{},"checkUnknowns"," rejects an undeclared property anywhere in the type, ",[409,2035,2036],{},"checkUnionUnknowns"," only on a union member. ",[409,2039,1579],{}," uses the first, ",[409,2042,1724],{},[409,2044,1802],{}," the second. See ",[1461,2047,2049],{"href":2048},"\u002Fruntypes\u002Fguide\u002Fvalidation#checking-for-unknown-keys","Checking for Unknown Keys",[426,2051,2053],{"className":428,"code":2052,"language":430,"meta":431,"style":431},"import {createGetValidationErrorsFn, createValidateFn} from '@mionjs\u002Frun-types';\n\ntype Address = {street: string; city: string};\ntype User = {id: number; name: string; address: Address};\n\n\u002F\u002F one function, one pass: matches User and carries no extra property, at every level\nconst isUserStrict = createValidateFn\u003CUser>(undefined, {checkUnknowns: true});\n\nisUserStrict({id: 1, name: 'Ada', address: {street: 'Main', city: 'Rome'}}); \u002F\u002F true\nisUserStrict({\n  id: 1,\n  name: 'Ada',\n  address: {street: 'Main', city: 'Rome'},\n  admin: true,\n}); \u002F\u002F false\nisUserStrict({\n  id: 1,\n  name: 'Ada',\n  address: {street: 'Main', city: 'Rome', zip: '00184'},\n}); \u002F\u002F false, the extra is nested\n\n\u002F\u002F same option on the error report: one entry per undeclared key, `expected: 'never'`\nconst userErrors = createGetValidationErrorsFn\u003CUser>(undefined, {\n  checkUnknowns: true,\n});\n\nuserErrors({\n  id: 1,\n  name: 'Ada',\n  address: {street: 'Main', city: 'Rome', zip: '00184'},\n});\n\u002F\u002F [{path: ['address', 'zip'], expected: 'never'}]\n\n\u002F\u002F a union needs its own option: its members share one list of property names\ntype Pet = {kind: 'cat'; meows: boolean} | {kind: 'dog'; barks: number};\ntype Something = {a: string} | Record\u003Cstring, number>;\n\nconst isPetUnionStrict = createValidateFn\u003CPet>(undefined, {\n  checkUnionUnknowns: true,\n});\nisPetUnionStrict({kind: 'cat', meows: true}); \u002F\u002F true\nisPetUnionStrict({kind: 'cat', meows: true, barks: 3}); \u002F\u002F false, barks belongs to Dog\n\nconst isSomething = createValidateFn\u003CSomething>(undefined, {\n  checkUnionUnknowns: true,\n});\nisSomething({a: 'x'}); \u002F\u002F true\nisSomething({p: 1, q: 2}); \u002F\u002F true, it is a record\nisSomething({a: 'x', evil: 'garbage'}); \u002F\u002F false, it matches neither member\n\nexport {isUserStrict, userErrors, isPetUnionStrict, isSomething};\n",[409,2054,2055,2079,2083,2112,2148,2152,2157,2195,2199,2268,2276,2286,2300,2333,2344,2355,2363,2373,2387,2433,2444,2448,2453,2476,2488,2497,2502,2512,2523,2538,2583,2592,2598,2603,2609,2664,2697,2702,2727,2739,2748,2784,2829,2834,2859,2870,2879,2908,2942,2984,2989],{"__ignoreMap":431},[435,2056,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077],{"class":437,"line":438},[435,2058,442],{"class":441},[435,2060,446],{"class":445},[435,2062,1308],{"class":449},[435,2064,453],{"class":445},[435,2066,1177],{"class":449},[435,2068,459],{"class":445},[435,2070,462],{"class":441},[435,2072,465],{"class":445},[435,2074,411],{"class":468},[435,2076,472],{"class":445},[435,2078,475],{"class":445},[435,2080,2081],{"class":437,"line":478},[435,2082,482],{"emptyLinePlaceholder":481},[435,2084,2085,2087,2090,2092,2094,2097,2099,2101,2103,2106,2108,2110],{"class":437,"line":485},[435,2086,619],{"class":488},[435,2088,2089],{"class":525}," Address",[435,2091,625],{"class":445},[435,2093,446],{"class":445},[435,2095,2096],{"class":535},"street",[435,2098,539],{"class":445},[435,2100,542],{"class":525},[435,2102,744],{"class":445},[435,2104,2105],{"class":535}," city",[435,2107,539],{"class":445},[435,2109,542],{"class":525},[435,2111,804],{"class":445},[435,2113,2114,2116,2118,2120,2122,2124,2126,2128,2130,2133,2135,2137,2139,2142,2144,2146],{"class":437,"line":507},[435,2115,619],{"class":488},[435,2117,526],{"class":525},[435,2119,625],{"class":445},[435,2121,446],{"class":445},[435,2123,640],{"class":535},[435,2125,539],{"class":445},[435,2127,567],{"class":525},[435,2129,744],{"class":445},[435,2131,2132],{"class":535}," name",[435,2134,539],{"class":445},[435,2136,542],{"class":525},[435,2138,744],{"class":445},[435,2140,2141],{"class":535}," address",[435,2143,539],{"class":445},[435,2145,2089],{"class":525},[435,2147,804],{"class":445},[435,2149,2150],{"class":437,"line":512},[435,2151,482],{"emptyLinePlaceholder":481},[435,2153,2154],{"class":437,"line":519},[435,2155,2156],{"class":515},"\u002F\u002F one function, one pass: matches User and carries no extra property, at every level\n",[435,2158,2159,2161,2164,2166,2168,2170,2172,2174,2176,2179,2181,2183,2185,2189,2191,2193],{"class":437,"line":532},[435,2160,489],{"class":488},[435,2162,2163],{"class":449}," isUserStrict ",[435,2165,495],{"class":445},[435,2167,1177],{"class":498},[435,2169,596],{"class":445},[435,2171,633],{"class":525},[435,2173,1184],{"class":445},[435,2175,681],{"class":449},[435,2177,2178],{"class":445},"undefined,",[435,2180,446],{"class":445},[435,2182,2032],{"class":535},[435,2184,539],{"class":445},[435,2186,2188],{"class":2187},"sfNiH"," true",[435,2190,459],{"class":445},[435,2192,741],{"class":449},[435,2194,475],{"class":445},[435,2196,2197],{"class":437,"line":547},[435,2198,482],{"emptyLinePlaceholder":481},[435,2200,2201,2204,2206,2208,2210,2212,2215,2217,2219,2221,2223,2226,2228,2230,2232,2234,2236,2238,2240,2242,2245,2247,2249,2251,2253,2255,2258,2260,2262,2264,2266],{"class":437,"line":559},[435,2202,2203],{"class":498},"isUserStrict",[435,2205,681],{"class":449},[435,2207,1202],{"class":445},[435,2209,640],{"class":535},[435,2211,539],{"class":445},[435,2213,2214],{"class":914}," 1",[435,2216,453],{"class":445},[435,2218,2132],{"class":535},[435,2220,539],{"class":445},[435,2222,465],{"class":445},[435,2224,2225],{"class":468},"Ada",[435,2227,472],{"class":445},[435,2229,453],{"class":445},[435,2231,2141],{"class":535},[435,2233,539],{"class":445},[435,2235,446],{"class":445},[435,2237,2096],{"class":535},[435,2239,539],{"class":445},[435,2241,465],{"class":445},[435,2243,2244],{"class":468},"Main",[435,2246,472],{"class":445},[435,2248,453],{"class":445},[435,2250,2105],{"class":535},[435,2252,539],{"class":445},[435,2254,465],{"class":445},[435,2256,2257],{"class":468},"Rome",[435,2259,472],{"class":445},[435,2261,1584],{"class":445},[435,2263,741],{"class":449},[435,2265,744],{"class":445},[435,2267,747],{"class":515},[435,2269,2270,2272,2274],{"class":437,"line":572},[435,2271,2203],{"class":498},[435,2273,681],{"class":449},[435,2275,904],{"class":445},[435,2277,2278,2280,2282,2284],{"class":437,"line":585},[435,2279,536],{"class":535},[435,2281,539],{"class":445},[435,2283,2214],{"class":914},[435,2285,815],{"class":445},[435,2287,2288,2290,2292,2294,2296,2298],{"class":437,"line":605},[435,2289,1136],{"class":535},[435,2291,539],{"class":445},[435,2293,465],{"class":445},[435,2295,2225],{"class":468},[435,2297,472],{"class":445},[435,2299,815],{"class":445},[435,2301,2302,2305,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327,2329,2331],{"class":437,"line":611},[435,2303,2304],{"class":535},"  address",[435,2306,539],{"class":445},[435,2308,446],{"class":445},[435,2310,2096],{"class":535},[435,2312,539],{"class":445},[435,2314,465],{"class":445},[435,2316,2244],{"class":468},[435,2318,472],{"class":445},[435,2320,453],{"class":445},[435,2322,2105],{"class":535},[435,2324,539],{"class":445},[435,2326,465],{"class":445},[435,2328,2257],{"class":468},[435,2330,472],{"class":445},[435,2332,1009],{"class":445},[435,2334,2335,2338,2340,2342],{"class":437,"line":616},[435,2336,2337],{"class":535},"  admin",[435,2339,539],{"class":445},[435,2341,2188],{"class":2187},[435,2343,815],{"class":445},[435,2345,2346,2348,2350,2352],{"class":437,"line":647},[435,2347,459],{"class":445},[435,2349,741],{"class":449},[435,2351,744],{"class":445},[435,2353,2354],{"class":515}," \u002F\u002F false\n",[435,2356,2357,2359,2361],{"class":437,"line":652},[435,2358,2203],{"class":498},[435,2360,681],{"class":449},[435,2362,904],{"class":445},[435,2364,2365,2367,2369,2371],{"class":437,"line":664},[435,2366,536],{"class":535},[435,2368,539],{"class":445},[435,2370,2214],{"class":914},[435,2372,815],{"class":445},[435,2374,2375,2377,2379,2381,2383,2385],{"class":437,"line":709},[435,2376,1136],{"class":535},[435,2378,539],{"class":445},[435,2380,465],{"class":445},[435,2382,2225],{"class":468},[435,2384,472],{"class":445},[435,2386,815],{"class":445},[435,2388,2389,2391,2393,2395,2397,2399,2401,2403,2405,2407,2409,2411,2413,2415,2417,2419,2422,2424,2426,2429,2431],{"class":437,"line":715},[435,2390,2304],{"class":535},[435,2392,539],{"class":445},[435,2394,446],{"class":445},[435,2396,2096],{"class":535},[435,2398,539],{"class":445},[435,2400,465],{"class":445},[435,2402,2244],{"class":468},[435,2404,472],{"class":445},[435,2406,453],{"class":445},[435,2408,2105],{"class":535},[435,2410,539],{"class":445},[435,2412,465],{"class":445},[435,2414,2257],{"class":468},[435,2416,472],{"class":445},[435,2418,453],{"class":445},[435,2420,2421],{"class":535}," zip",[435,2423,539],{"class":445},[435,2425,465],{"class":445},[435,2427,2428],{"class":468},"00184",[435,2430,472],{"class":445},[435,2432,1009],{"class":445},[435,2434,2435,2437,2439,2441],{"class":437,"line":750},[435,2436,459],{"class":445},[435,2438,741],{"class":449},[435,2440,744],{"class":445},[435,2442,2443],{"class":515}," \u002F\u002F false, the extra is nested\n",[435,2445,2446],{"class":437,"line":778},[435,2447,482],{"emptyLinePlaceholder":481},[435,2449,2450],{"class":437,"line":807},[435,2451,2452],{"class":515},"\u002F\u002F same option on the error report: one entry per undeclared key, `expected: 'never'`\n",[435,2454,2455,2457,2460,2462,2464,2466,2468,2470,2472,2474],{"class":437,"line":818},[435,2456,489],{"class":488},[435,2458,2459],{"class":449}," userErrors ",[435,2461,495],{"class":445},[435,2463,1391],{"class":498},[435,2465,596],{"class":445},[435,2467,633],{"class":525},[435,2469,1184],{"class":445},[435,2471,681],{"class":449},[435,2473,2178],{"class":445},[435,2475,529],{"class":445},[435,2477,2479,2482,2484,2486],{"class":437,"line":2478},24,[435,2480,2481],{"class":535},"  checkUnknowns",[435,2483,539],{"class":445},[435,2485,2188],{"class":2187},[435,2487,815],{"class":445},[435,2489,2491,2493,2495],{"class":437,"line":2490},25,[435,2492,459],{"class":445},[435,2494,741],{"class":449},[435,2496,475],{"class":445},[435,2498,2500],{"class":437,"line":2499},26,[435,2501,482],{"emptyLinePlaceholder":481},[435,2503,2505,2508,2510],{"class":437,"line":2504},27,[435,2506,2507],{"class":498},"userErrors",[435,2509,681],{"class":449},[435,2511,904],{"class":445},[435,2513,2515,2517,2519,2521],{"class":437,"line":2514},28,[435,2516,536],{"class":535},[435,2518,539],{"class":445},[435,2520,2214],{"class":914},[435,2522,815],{"class":445},[435,2524,2526,2528,2530,2532,2534,2536],{"class":437,"line":2525},29,[435,2527,1136],{"class":535},[435,2529,539],{"class":445},[435,2531,465],{"class":445},[435,2533,2225],{"class":468},[435,2535,472],{"class":445},[435,2537,815],{"class":445},[435,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581],{"class":437,"line":2540},30,[435,2542,2304],{"class":535},[435,2544,539],{"class":445},[435,2546,446],{"class":445},[435,2548,2096],{"class":535},[435,2550,539],{"class":445},[435,2552,465],{"class":445},[435,2554,2244],{"class":468},[435,2556,472],{"class":445},[435,2558,453],{"class":445},[435,2560,2105],{"class":535},[435,2562,539],{"class":445},[435,2564,465],{"class":445},[435,2566,2257],{"class":468},[435,2568,472],{"class":445},[435,2570,453],{"class":445},[435,2572,2421],{"class":535},[435,2574,539],{"class":445},[435,2576,465],{"class":445},[435,2578,2428],{"class":468},[435,2580,472],{"class":445},[435,2582,1009],{"class":445},[435,2584,2586,2588,2590],{"class":437,"line":2585},31,[435,2587,459],{"class":445},[435,2589,741],{"class":449},[435,2591,475],{"class":445},[435,2593,2595],{"class":437,"line":2594},32,[435,2596,2597],{"class":515},"\u002F\u002F [{path: ['address', 'zip'], expected: 'never'}]\n",[435,2599,2601],{"class":437,"line":2600},33,[435,2602,482],{"emptyLinePlaceholder":481},[435,2604,2606],{"class":437,"line":2605},34,[435,2607,2608],{"class":515},"\u002F\u002F a union needs its own option: its members share one list of property names\n",[435,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654,2656,2658,2660,2662],{"class":437,"line":2611},35,[435,2613,619],{"class":488},[435,2615,1856],{"class":525},[435,2617,625],{"class":445},[435,2619,446],{"class":445},[435,2621,1863],{"class":535},[435,2623,539],{"class":445},[435,2625,465],{"class":445},[435,2627,1870],{"class":468},[435,2629,472],{"class":445},[435,2631,744],{"class":445},[435,2633,1877],{"class":535},[435,2635,539],{"class":445},[435,2637,1882],{"class":525},[435,2639,459],{"class":445},[435,2641,1887],{"class":445},[435,2643,446],{"class":445},[435,2645,1863],{"class":535},[435,2647,539],{"class":445},[435,2649,465],{"class":445},[435,2651,1898],{"class":468},[435,2653,472],{"class":445},[435,2655,744],{"class":445},[435,2657,1905],{"class":535},[435,2659,539],{"class":445},[435,2661,567],{"class":525},[435,2663,804],{"class":445},[435,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691,2693,2695],{"class":437,"line":2666},36,[435,2668,619],{"class":488},[435,2670,1927],{"class":525},[435,2672,625],{"class":445},[435,2674,446],{"class":445},[435,2676,1461],{"class":535},[435,2678,539],{"class":445},[435,2680,542],{"class":525},[435,2682,459],{"class":445},[435,2684,1887],{"class":445},[435,2686,1944],{"class":525},[435,2688,596],{"class":445},[435,2690,599],{"class":525},[435,2692,453],{"class":445},[435,2694,567],{"class":525},[435,2696,602],{"class":445},[435,2698,2700],{"class":437,"line":2699},37,[435,2701,482],{"emptyLinePlaceholder":481},[435,2703,2705,2707,2710,2712,2714,2716,2719,2721,2723,2725],{"class":437,"line":2704},38,[435,2706,489],{"class":488},[435,2708,2709],{"class":449}," isPetUnionStrict ",[435,2711,495],{"class":445},[435,2713,1177],{"class":498},[435,2715,596],{"class":445},[435,2717,2718],{"class":525},"Pet",[435,2720,1184],{"class":445},[435,2722,681],{"class":449},[435,2724,2178],{"class":445},[435,2726,529],{"class":445},[435,2728,2730,2733,2735,2737],{"class":437,"line":2729},39,[435,2731,2732],{"class":535},"  checkUnionUnknowns",[435,2734,539],{"class":445},[435,2736,2188],{"class":2187},[435,2738,815],{"class":445},[435,2740,2742,2744,2746],{"class":437,"line":2741},40,[435,2743,459],{"class":445},[435,2745,741],{"class":449},[435,2747,475],{"class":445},[435,2749,2751,2754,2756,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782],{"class":437,"line":2750},41,[435,2752,2753],{"class":498},"isPetUnionStrict",[435,2755,681],{"class":449},[435,2757,1202],{"class":445},[435,2759,1863],{"class":535},[435,2761,539],{"class":445},[435,2763,465],{"class":445},[435,2765,1870],{"class":468},[435,2767,472],{"class":445},[435,2769,453],{"class":445},[435,2771,1877],{"class":535},[435,2773,539],{"class":445},[435,2775,2188],{"class":2187},[435,2777,459],{"class":445},[435,2779,741],{"class":449},[435,2781,744],{"class":445},[435,2783,747],{"class":515},[435,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815,2817,2820,2822,2824,2826],{"class":437,"line":2786},42,[435,2788,2753],{"class":498},[435,2790,681],{"class":449},[435,2792,1202],{"class":445},[435,2794,1863],{"class":535},[435,2796,539],{"class":445},[435,2798,465],{"class":445},[435,2800,1870],{"class":468},[435,2802,472],{"class":445},[435,2804,453],{"class":445},[435,2806,1877],{"class":535},[435,2808,539],{"class":445},[435,2810,2188],{"class":2187},[435,2812,453],{"class":445},[435,2814,1905],{"class":535},[435,2816,539],{"class":445},[435,2818,2819],{"class":914}," 3",[435,2821,459],{"class":445},[435,2823,741],{"class":449},[435,2825,744],{"class":445},[435,2827,2828],{"class":515}," \u002F\u002F false, barks belongs to Dog\n",[435,2830,2832],{"class":437,"line":2831},43,[435,2833,482],{"emptyLinePlaceholder":481},[435,2835,2837,2839,2842,2844,2846,2848,2851,2853,2855,2857],{"class":437,"line":2836},44,[435,2838,489],{"class":488},[435,2840,2841],{"class":449}," isSomething ",[435,2843,495],{"class":445},[435,2845,1177],{"class":498},[435,2847,596],{"class":445},[435,2849,2850],{"class":525},"Something",[435,2852,1184],{"class":445},[435,2854,681],{"class":449},[435,2856,2178],{"class":445},[435,2858,529],{"class":445},[435,2860,2862,2864,2866,2868],{"class":437,"line":2861},45,[435,2863,2732],{"class":535},[435,2865,539],{"class":445},[435,2867,2188],{"class":2187},[435,2869,815],{"class":445},[435,2871,2873,2875,2877],{"class":437,"line":2872},46,[435,2874,459],{"class":445},[435,2876,741],{"class":449},[435,2878,475],{"class":445},[435,2880,2882,2885,2887,2889,2891,2893,2895,2898,2900,2902,2904,2906],{"class":437,"line":2881},47,[435,2883,2884],{"class":498},"isSomething",[435,2886,681],{"class":449},[435,2888,1202],{"class":445},[435,2890,1461],{"class":535},[435,2892,539],{"class":445},[435,2894,465],{"class":445},[435,2896,2897],{"class":468},"x",[435,2899,472],{"class":445},[435,2901,459],{"class":445},[435,2903,741],{"class":449},[435,2905,744],{"class":445},[435,2907,747],{"class":515},[435,2909,2911,2913,2915,2917,2919,2921,2923,2925,2928,2930,2933,2935,2937,2939],{"class":437,"line":2910},48,[435,2912,2884],{"class":498},[435,2914,681],{"class":449},[435,2916,1202],{"class":445},[435,2918,405],{"class":535},[435,2920,539],{"class":445},[435,2922,2214],{"class":914},[435,2924,453],{"class":445},[435,2926,2927],{"class":535}," q",[435,2929,539],{"class":445},[435,2931,2932],{"class":914}," 2",[435,2934,459],{"class":445},[435,2936,741],{"class":449},[435,2938,744],{"class":445},[435,2940,2941],{"class":515}," \u002F\u002F true, it is a record\n",[435,2943,2945,2947,2949,2951,2953,2955,2957,2959,2961,2963,2966,2968,2970,2973,2975,2977,2979,2981],{"class":437,"line":2944},49,[435,2946,2884],{"class":498},[435,2948,681],{"class":449},[435,2950,1202],{"class":445},[435,2952,1461],{"class":535},[435,2954,539],{"class":445},[435,2956,465],{"class":445},[435,2958,2897],{"class":468},[435,2960,472],{"class":445},[435,2962,453],{"class":445},[435,2964,2965],{"class":535}," evil",[435,2967,539],{"class":445},[435,2969,465],{"class":445},[435,2971,2972],{"class":468},"garbage",[435,2974,472],{"class":445},[435,2976,459],{"class":445},[435,2978,741],{"class":449},[435,2980,744],{"class":445},[435,2982,2983],{"class":515}," \u002F\u002F false, it matches neither member\n",[435,2985,2987],{"class":437,"line":2986},50,[435,2988,482],{"emptyLinePlaceholder":481},[435,2990,2992,2995,2997,2999,3001,3004,3006,3009,3011,3014],{"class":437,"line":2991},51,[435,2993,2994],{"class":441},"export",[435,2996,446],{"class":445},[435,2998,2203],{"class":449},[435,3000,453],{"class":445},[435,3002,3003],{"class":449}," userErrors",[435,3005,453],{"class":445},[435,3007,3008],{"class":449}," isPetUnionStrict",[435,3010,453],{"class":445},[435,3012,3013],{"class":449}," isSomething",[435,3015,804],{"class":445},[414,3017,3019],{"id":3018},"sanitizing-params","Sanitizing Params",[405,3021,3022,3025,3026,3030],{},[409,3023,3024],{},"sanitizeParams"," is off by default. Turn it on and a route applies every ",[1461,3027,3029],{"href":3028},"\u002Fruntypes\u002Ftype-formats\u002Fstring#string-transformations","transform"," its params types declare: trim spaces, lowercase an email, strip the grouping from a card number. It runs after decoding and before validation, so a value that passes only once trimmed is accepted and the handler gets the clean value. Headers and return values are never sanitized.",[426,3032,3034],{"className":428,"code":3033,"language":430,"meta":431,"style":431},"import {createMionRouter, Routes} from '@mionjs\u002Frouter';\nimport type * as TF from '@mionjs\u002Frun-types\u002Fformats';\n\n\u002F\u002F The type says what a clean value looks like: trimmed and lowercased.\ntype Email = TF.Transform\u003CTF.Email, {trim: true; lowercase: true}>;\n\n\u002F\u002F Turn sanitizing on for every route, or per route below. It is off by default.\nconst mion = createMionRouter({sanitizeParams: true});\n\nconst routes = {\n  \u002F\u002F ' John@Example.COM ' arrives, the handler gets 'john@example.com'\n  login: mion.route(\n    (ctx, email: Email, password: string): boolean =>\n      email.length > 0 && password.length > 0\n  ),\n  \u002F\u002F this route opts out: the handler gets the value exactly as sent\n  echo: mion.route((ctx, email: Email): string => email, {\n    sanitizeParams: false,\n  }),\n} satisfies Routes;\n\nmion.initRoutes(routes);\n",[409,3035,3036,3060,3087,3091,3096,3146,3150,3155,3181,3185,3195,3200,3216,3248,3277,3284,3289,3328,3340,3348,3358,3362],{"__ignoreMap":431},[435,3037,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058],{"class":437,"line":438},[435,3039,442],{"class":441},[435,3041,446],{"class":445},[435,3043,450],{"class":449},[435,3045,453],{"class":445},[435,3047,456],{"class":449},[435,3049,459],{"class":445},[435,3051,462],{"class":441},[435,3053,465],{"class":445},[435,3055,469],{"class":468},[435,3057,472],{"class":445},[435,3059,475],{"class":445},[435,3061,3062,3064,3067,3070,3072,3075,3078,3080,3083,3085],{"class":437,"line":478},[435,3063,442],{"class":441},[435,3065,3066],{"class":441}," type",[435,3068,3069],{"class":445}," *",[435,3071,1587],{"class":441},[435,3073,3074],{"class":449}," TF ",[435,3076,3077],{"class":441},"from",[435,3079,465],{"class":445},[435,3081,3082],{"class":468},"@mionjs\u002Frun-types\u002Fformats",[435,3084,472],{"class":445},[435,3086,475],{"class":445},[435,3088,3089],{"class":437,"line":485},[435,3090,482],{"emptyLinePlaceholder":481},[435,3092,3093],{"class":437,"line":507},[435,3094,3095],{"class":515},"\u002F\u002F The type says what a clean value looks like: trimmed and lowercased.\n",[435,3097,3098,3100,3103,3105,3108,3110,3113,3115,3118,3120,3123,3125,3127,3130,3132,3134,3136,3139,3141,3143],{"class":437,"line":512},[435,3099,619],{"class":488},[435,3101,3102],{"class":525}," Email",[435,3104,625],{"class":445},[435,3106,3107],{"class":525}," TF",[435,3109,675],{"class":445},[435,3111,3112],{"class":525},"Transform",[435,3114,596],{"class":445},[435,3116,3117],{"class":525},"TF",[435,3119,675],{"class":445},[435,3121,3122],{"class":525},"Email",[435,3124,453],{"class":445},[435,3126,446],{"class":445},[435,3128,3129],{"class":535},"trim",[435,3131,539],{"class":445},[435,3133,2188],{"class":525},[435,3135,744],{"class":445},[435,3137,3138],{"class":535}," lowercase",[435,3140,539],{"class":445},[435,3142,2188],{"class":525},[435,3144,3145],{"class":445},"}>;\n",[435,3147,3148],{"class":437,"line":519},[435,3149,482],{"emptyLinePlaceholder":481},[435,3151,3152],{"class":437,"line":532},[435,3153,3154],{"class":515},"\u002F\u002F Turn sanitizing on for every route, or per route below. It is off by default.\n",[435,3156,3157,3159,3161,3163,3165,3167,3169,3171,3173,3175,3177,3179],{"class":437,"line":547},[435,3158,489],{"class":488},[435,3160,492],{"class":449},[435,3162,495],{"class":445},[435,3164,499],{"class":498},[435,3166,681],{"class":449},[435,3168,1202],{"class":445},[435,3170,3024],{"class":535},[435,3172,539],{"class":445},[435,3174,2188],{"class":2187},[435,3176,459],{"class":445},[435,3178,741],{"class":449},[435,3180,475],{"class":445},[435,3182,3183],{"class":437,"line":559},[435,3184,482],{"emptyLinePlaceholder":481},[435,3186,3187,3189,3191,3193],{"class":437,"line":572},[435,3188,489],{"class":488},[435,3190,657],{"class":449},[435,3192,495],{"class":445},[435,3194,529],{"class":445},[435,3196,3197],{"class":437,"line":585},[435,3198,3199],{"class":515},"  \u002F\u002F ' John@Example.COM ' arrives, the handler gets 'john@example.com'\n",[435,3201,3202,3205,3207,3209,3211,3213],{"class":437,"line":605},[435,3203,3204],{"class":535},"  login",[435,3206,539],{"class":445},[435,3208,672],{"class":449},[435,3210,675],{"class":445},[435,3212,678],{"class":498},[435,3214,3215],{"class":449},"(\n",[435,3217,3218,3221,3223,3225,3228,3230,3232,3234,3237,3239,3241,3243,3245],{"class":437,"line":611},[435,3219,3220],{"class":445},"    (",[435,3222,687],{"class":686},[435,3224,453],{"class":445},[435,3226,3227],{"class":686}," email",[435,3229,539],{"class":445},[435,3231,3102],{"class":525},[435,3233,453],{"class":445},[435,3235,3236],{"class":686}," password",[435,3238,539],{"class":445},[435,3240,542],{"class":525},[435,3242,699],{"class":445},[435,3244,1882],{"class":525},[435,3246,3247],{"class":488}," =>\n",[435,3249,3250,3253,3255,3258,3260,3263,3266,3268,3270,3272,3274],{"class":437,"line":616},[435,3251,3252],{"class":449},"      email",[435,3254,675],{"class":445},[435,3256,3257],{"class":449},"length ",[435,3259,1184],{"class":445},[435,3261,3262],{"class":914}," 0",[435,3264,3265],{"class":445}," &&",[435,3267,3236],{"class":449},[435,3269,675],{"class":445},[435,3271,3257],{"class":449},[435,3273,1184],{"class":445},[435,3275,3276],{"class":914}," 0\n",[435,3278,3279,3282],{"class":437,"line":647},[435,3280,3281],{"class":449},"  )",[435,3283,815],{"class":445},[435,3285,3286],{"class":437,"line":652},[435,3287,3288],{"class":515},"  \u002F\u002F this route opts out: the handler gets the value exactly as sent\n",[435,3290,3291,3294,3296,3298,3300,3302,3304,3306,3308,3310,3312,3314,3316,3318,3320,3322,3324,3326],{"class":437,"line":664},[435,3292,3293],{"class":535},"  echo",[435,3295,539],{"class":445},[435,3297,672],{"class":449},[435,3299,675],{"class":445},[435,3301,678],{"class":498},[435,3303,681],{"class":449},[435,3305,681],{"class":445},[435,3307,687],{"class":686},[435,3309,453],{"class":445},[435,3311,3227],{"class":686},[435,3313,539],{"class":445},[435,3315,3102],{"class":525},[435,3317,699],{"class":445},[435,3319,542],{"class":525},[435,3321,704],{"class":488},[435,3323,3227],{"class":449},[435,3325,453],{"class":445},[435,3327,529],{"class":445},[435,3329,3330,3333,3335,3338],{"class":437,"line":709},[435,3331,3332],{"class":535},"    sanitizeParams",[435,3334,539],{"class":445},[435,3336,3337],{"class":2187}," false",[435,3339,815],{"class":445},[435,3341,3342,3344,3346],{"class":437,"line":715},[435,3343,810],{"class":445},[435,3345,741],{"class":449},[435,3347,815],{"class":445},[435,3349,3350,3352,3354,3356],{"class":437,"line":750},[435,3351,459],{"class":445},[435,3353,823],{"class":441},[435,3355,456],{"class":525},[435,3357,475],{"class":445},[435,3359,3360],{"class":437,"line":778},[435,3361,482],{"emptyLinePlaceholder":481},[435,3363,3364,3366,3368,3370,3372],{"class":437,"line":807},[435,3365,1755],{"class":449},[435,3367,675],{"class":445},[435,3369,1760],{"class":498},[435,3371,1763],{"class":449},[435,3373,475],{"class":445},[1828,3375,3376],{},"A value with the wrong shape (a number where a string is expected) skips the transform, and validation reports the error.",[414,3378,3380],{"id":3379},"sanitizing-on-the-client","Sanitizing on the Client",[405,3382,3383],{},"On a sanitized route, the client applies the same transforms before its own validation and before sending, so both ends validate and send the same value.",[426,3385,3387],{"className":428,"code":3386,"language":430,"meta":431,"style":431},"import {initClient} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Fsanitize.routes.ts';\n\n\u002F\u002F sanitizeParams is on by default\nconst {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F ' John@Example.COM ' is trimmed and lowercased before it leaves the browser\nconst [loggedIn] = await routes\n  .login(' John@Example.COM ', 'my-password')\n  .call();\nconsole.log(loggedIn); \u002F\u002F true\n\n\u002F\u002F false: validate and send the value as typed; the server still sanitizes\nconst raw = initClient\u003CMyApi>({\n  baseURL: 'http:\u002F\u002Flocalhost:3000',\n  sanitizeParams: false,\n});\n",[409,3388,3389,3411,3435,3439,3444,3488,3492,3497,3516,3545,3556,3572,3576,3581,3602,3617,3628],{"__ignoreMap":431},[435,3390,3391,3393,3395,3398,3400,3402,3404,3407,3409],{"class":437,"line":438},[435,3392,442],{"class":441},[435,3394,446],{"class":445},[435,3396,3397],{"class":449},"initClient",[435,3399,459],{"class":445},[435,3401,462],{"class":441},[435,3403,465],{"class":445},[435,3405,3406],{"class":468},"@mionjs\u002Fclient",[435,3408,472],{"class":445},[435,3410,475],{"class":445},[435,3412,3413,3415,3417,3419,3422,3424,3426,3428,3431,3433],{"class":437,"line":478},[435,3414,442],{"class":441},[435,3416,3066],{"class":441},[435,3418,446],{"class":445},[435,3420,3421],{"class":449},"MyApi",[435,3423,459],{"class":445},[435,3425,462],{"class":441},[435,3427,465],{"class":445},[435,3429,3430],{"class":468},".\u002Fsanitize.routes.ts",[435,3432,472],{"class":445},[435,3434,475],{"class":445},[435,3436,3437],{"class":437,"line":485},[435,3438,482],{"emptyLinePlaceholder":481},[435,3440,3441],{"class":437,"line":507},[435,3442,3443],{"class":515},"\u002F\u002F sanitizeParams is on by default\n",[435,3445,3446,3448,3450,3453,3455,3457,3460,3462,3464,3466,3468,3470,3473,3475,3477,3480,3482,3484,3486],{"class":437,"line":512},[435,3447,489],{"class":488},[435,3449,446],{"class":445},[435,3451,3452],{"class":449},"routes",[435,3454,459],{"class":445},[435,3456,625],{"class":445},[435,3458,3459],{"class":498}," initClient",[435,3461,596],{"class":445},[435,3463,3421],{"class":525},[435,3465,1184],{"class":445},[435,3467,681],{"class":449},[435,3469,1202],{"class":445},[435,3471,3472],{"class":535},"baseURL",[435,3474,539],{"class":445},[435,3476,465],{"class":445},[435,3478,3479],{"class":468},"http:\u002F\u002Flocalhost:3000",[435,3481,472],{"class":445},[435,3483,459],{"class":445},[435,3485,741],{"class":449},[435,3487,475],{"class":445},[435,3489,3490],{"class":437,"line":519},[435,3491,482],{"emptyLinePlaceholder":481},[435,3493,3494],{"class":437,"line":532},[435,3495,3496],{"class":515},"\u002F\u002F ' John@Example.COM ' is trimmed and lowercased before it leaves the browser\n",[435,3498,3499,3501,3503,3506,3508,3510,3513],{"class":437,"line":547},[435,3500,489],{"class":488},[435,3502,983],{"class":445},[435,3504,3505],{"class":449},"loggedIn",[435,3507,993],{"class":445},[435,3509,625],{"class":445},[435,3511,3512],{"class":441}," await",[435,3514,3515],{"class":449}," routes\n",[435,3517,3518,3521,3524,3526,3528,3531,3533,3535,3537,3540,3542],{"class":437,"line":559},[435,3519,3520],{"class":445},"  .",[435,3522,3523],{"class":498},"login",[435,3525,681],{"class":449},[435,3527,472],{"class":445},[435,3529,3530],{"class":468}," John@Example.COM ",[435,3532,472],{"class":445},[435,3534,453],{"class":445},[435,3536,465],{"class":445},[435,3538,3539],{"class":468},"my-password",[435,3541,472],{"class":445},[435,3543,3544],{"class":449},")\n",[435,3546,3547,3549,3552,3554],{"class":437,"line":572},[435,3548,3520],{"class":445},[435,3550,3551],{"class":498},"call",[435,3553,502],{"class":449},[435,3555,475],{"class":445},[435,3557,3558,3561,3563,3565,3568,3570],{"class":437,"line":585},[435,3559,3560],{"class":449},"console",[435,3562,675],{"class":445},[435,3564,723],{"class":498},[435,3566,3567],{"class":449},"(loggedIn)",[435,3569,744],{"class":445},[435,3571,747],{"class":515},[435,3573,3574],{"class":437,"line":605},[435,3575,482],{"emptyLinePlaceholder":481},[435,3577,3578],{"class":437,"line":611},[435,3579,3580],{"class":515},"\u002F\u002F false: validate and send the value as typed; the server still sanitizes\n",[435,3582,3583,3585,3588,3590,3592,3594,3596,3598,3600],{"class":437,"line":616},[435,3584,489],{"class":488},[435,3586,3587],{"class":449}," raw ",[435,3589,495],{"class":445},[435,3591,3459],{"class":498},[435,3593,596],{"class":445},[435,3595,3421],{"class":525},[435,3597,1184],{"class":445},[435,3599,681],{"class":449},[435,3601,904],{"class":445},[435,3603,3604,3607,3609,3611,3613,3615],{"class":437,"line":647},[435,3605,3606],{"class":535},"  baseURL",[435,3608,539],{"class":445},[435,3610,465],{"class":445},[435,3612,3479],{"class":468},[435,3614,472],{"class":445},[435,3616,815],{"class":445},[435,3618,3619,3622,3624,3626],{"class":437,"line":652},[435,3620,3621],{"class":535},"  sanitizeParams",[435,3623,539],{"class":445},[435,3625,3337],{"class":2187},[435,3627,815],{"class":445},[435,3629,3630,3632,3634],{"class":437,"line":664},[435,3631,459],{"class":445},[435,3633,741],{"class":449},[435,3635,475],{"class":445},[1828,3637,3638,3639,2010,3642,3645,3646,3649],{},"The transform runs on the client and again on the server, so prefer transforms that give the same result twice: trim, the case changes, ",[409,3640,3641],{},"replaceAll",[409,3643,3644],{},"stripSeparators"," do, ",[409,3647,3648],{},"replace"," (first match only) does not.",[3651,3652,3653],"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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}","Automatic validation in mion using RunTypes.","md",null,{"toc":24},{"title":52,"description":3654},"TegM0SvtYrLpWcWqxwVaFATlAj13ue1evDWTnp490bk",1793324369699]