[{"data":1,"prerenderedAt":3420},["ShallowReactive",2],{"navigation_docs":3,"-rpc-server-routes":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":32,"body":401,"description":3414,"extension":3415,"links":3416,"meta":3417,"navigation":696,"path":33,"seo":3418,"stem":34,"__hash__":3419},"docs\u002F01.rpc\u002F02.server\u002F01.routes.md",{"type":402,"value":403},"minimark",[404,412,419,424,452,536,548,561,565,576,1030,1043,1047,1065,1434,1444,1448,1458,1468,1772,1776,1786,2202,2206,2209,2388,2404,2408,2421,2762,2766,2769,3189,3192,3264,3267,3281,3285,3292,3349,3353,3367,3371,3378,3410],[405,406,407,408,411],"p",{},"A route is a function your client calls remotely. Its first parameter is always the ",[409,410,40],"a",{"href":41},". The rest come from the client, validated before the route runs.",[405,413,414,415,418],{},"Your API is a plain object of routes and middleware, with no URLs to write. Each route gets a URL underneath, which the ",[409,416,417],{"href":85},"client"," handles for you.",[420,421,423],"h2",{"id":422},"creating-the-router","Creating the Router",[405,425,426,427,431,432,435,436,435,439,435,442,435,445,435,448,451],{},"Create the router once per app with ",[428,429,430],"code",{},"createMionRouter"," and pass it every router option (base path, parser, context data factory and the rest). Every helper it returns (",[428,433,434],{},"route",", ",[428,437,438],{},"query",[428,440,441],{},"mutation",[428,443,444],{},"middleware",[428,446,447],{},"headersMiddleware",[428,449,450],{},"rawMiddleware",") gets those options by type.",[453,454,459],"pre",{"className":455,"code":456,"language":457,"meta":458,"style":458},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const mion = createMionRouter({\n  contextDataFactory: getSharedData,\n  basePath: 'api\u002Fv1',\n});\n","ts","",[428,460,461,488,504,524],{"__ignoreMap":458},[462,463,466,470,474,478,482,485],"span",{"class":464,"line":465},"line",1,[462,467,469],{"class":468},"spNyl","const",[462,471,473],{"class":472},"sTEyZ"," mion ",[462,475,477],{"class":476},"sMK4o","=",[462,479,481],{"class":480},"s2Zo4"," createMionRouter",[462,483,484],{"class":472},"(",[462,486,487],{"class":476},"{\n",[462,489,491,495,498,501],{"class":464,"line":490},2,[462,492,494],{"class":493},"swJcz","  contextDataFactory",[462,496,497],{"class":476},":",[462,499,500],{"class":472}," getSharedData",[462,502,503],{"class":476},",\n",[462,505,507,510,512,515,519,522],{"class":464,"line":506},3,[462,508,509],{"class":493},"  basePath",[462,511,497],{"class":476},[462,513,514],{"class":476}," '",[462,516,518],{"class":517},"sfazB","api\u002Fv1",[462,520,521],{"class":476},"'",[462,523,503],{"class":476},[462,525,527,530,533],{"class":464,"line":526},4,[462,528,529],{"class":476},"}",[462,531,532],{"class":472},")",[462,534,535],{"class":476},";\n",[537,538,539,540,543,544,547],"tip",{},"Create the router and call ",[428,541,542],{},"initRoutes"," in your routes file, then import that file from the server entry. Destructuring the helpers is fine: ",[428,545,546],{},"const {route, middleware} = createMionRouter({...})",".",[549,550,551,552,554,555,557,558,560],"warning",{},"Call ",[428,553,430],{}," and ",[428,556,542],{}," once each, with all your routes in one ",[428,559,542],{}," call. A second call to either throws.",[420,562,564],{"id":563},"defining-a-route","Defining a Route",[405,566,567,568,571,572,575],{},"Declare a route with ",[428,569,570],{},"mion.route",": the handler is the first argument and the ",[428,573,574],{},"RouteOptions"," the second.",[453,577,579],{"className":455,"code":578,"language":457,"meta":458,"style":458},"import {RpcError} from '@mionjs\u002Fcore';\nimport {createMionRouter, Routes} from '@mionjs\u002Frouter';\nimport type {SomeData as Data} from '.\u002Ffull-example.app.ts';\nimport {myDbService as db} from '.\u002Ffull-example.app.ts';\n\nconst mion = createMionRouter();\n\nexport const routes = {\n  sayHello: mion.route((ctx, name1: string, name2: string): string => {\n    return `Hello ${name1} and ${name2}.`;\n  }),\n  getSomeData: mion.route(\n    async (ctx, id: string): Promise\u003CData | RpcError\u003C'data-not-found'>> => {\n      const data = await db.getData(id);\n      return (\n        data ||\n        new RpcError({publicMessage: 'Data not found', type: 'data-not-found'})\n      );\n    }\n  ),\n} satisfies Routes;\n",[428,580,581,607,634,665,691,698,714,719,736,789,825,835,852,905,936,945,954,996,1004,1010,1018],{"__ignoreMap":458},[462,582,583,587,590,593,595,598,600,603,605],{"class":464,"line":465},[462,584,586],{"class":585},"s7zQu","import",[462,588,589],{"class":476}," {",[462,591,592],{"class":472},"RpcError",[462,594,529],{"class":476},[462,596,597],{"class":585}," from",[462,599,514],{"class":476},[462,601,602],{"class":517},"@mionjs\u002Fcore",[462,604,521],{"class":476},[462,606,535],{"class":476},[462,608,609,611,613,615,618,621,623,625,627,630,632],{"class":464,"line":490},[462,610,586],{"class":585},[462,612,589],{"class":476},[462,614,430],{"class":472},[462,616,617],{"class":476},",",[462,619,620],{"class":472}," Routes",[462,622,529],{"class":476},[462,624,597],{"class":585},[462,626,514],{"class":476},[462,628,629],{"class":517},"@mionjs\u002Frouter",[462,631,521],{"class":476},[462,633,535],{"class":476},[462,635,636,638,641,643,646,649,652,654,656,658,661,663],{"class":464,"line":506},[462,637,586],{"class":585},[462,639,640],{"class":585}," type",[462,642,589],{"class":476},[462,644,645],{"class":472},"SomeData",[462,647,648],{"class":585}," as",[462,650,651],{"class":472}," Data",[462,653,529],{"class":476},[462,655,597],{"class":585},[462,657,514],{"class":476},[462,659,660],{"class":517},".\u002Ffull-example.app.ts",[462,662,521],{"class":476},[462,664,535],{"class":476},[462,666,667,669,671,674,676,679,681,683,685,687,689],{"class":464,"line":526},[462,668,586],{"class":585},[462,670,589],{"class":476},[462,672,673],{"class":472},"myDbService",[462,675,648],{"class":585},[462,677,678],{"class":472}," db",[462,680,529],{"class":476},[462,682,597],{"class":585},[462,684,514],{"class":476},[462,686,660],{"class":517},[462,688,521],{"class":476},[462,690,535],{"class":476},[462,692,694],{"class":464,"line":693},5,[462,695,697],{"emptyLinePlaceholder":696},true,"\n",[462,699,701,703,705,707,709,712],{"class":464,"line":700},6,[462,702,469],{"class":468},[462,704,473],{"class":472},[462,706,477],{"class":476},[462,708,481],{"class":480},[462,710,711],{"class":472},"()",[462,713,535],{"class":476},[462,715,717],{"class":464,"line":716},7,[462,718,697],{"emptyLinePlaceholder":696},[462,720,722,725,728,731,733],{"class":464,"line":721},8,[462,723,724],{"class":585},"export",[462,726,727],{"class":468}," const",[462,729,730],{"class":472}," routes ",[462,732,477],{"class":476},[462,734,735],{"class":476}," {\n",[462,737,739,742,744,747,749,751,753,755,759,761,764,766,770,772,775,777,779,782,784,787],{"class":464,"line":738},9,[462,740,741],{"class":493},"  sayHello",[462,743,497],{"class":476},[462,745,746],{"class":472}," mion",[462,748,547],{"class":476},[462,750,434],{"class":480},[462,752,484],{"class":472},[462,754,484],{"class":476},[462,756,758],{"class":757},"sHdIc","ctx",[462,760,617],{"class":476},[462,762,763],{"class":757}," name1",[462,765,497],{"class":476},[462,767,769],{"class":768},"sBMFI"," string",[462,771,617],{"class":476},[462,773,774],{"class":757}," name2",[462,776,497],{"class":476},[462,778,769],{"class":768},[462,780,781],{"class":476},"):",[462,783,769],{"class":768},[462,785,786],{"class":468}," =>",[462,788,735],{"class":476},[462,790,792,795,798,801,804,807,809,811,813,816,818,820,823],{"class":464,"line":791},10,[462,793,794],{"class":585},"    return",[462,796,797],{"class":476}," `",[462,799,800],{"class":517},"Hello ",[462,802,803],{"class":476},"${",[462,805,806],{"class":472},"name1",[462,808,529],{"class":476},[462,810,554],{"class":517},[462,812,803],{"class":476},[462,814,815],{"class":472},"name2",[462,817,529],{"class":476},[462,819,547],{"class":517},[462,821,822],{"class":476},"`",[462,824,535],{"class":476},[462,826,828,831,833],{"class":464,"line":827},11,[462,829,830],{"class":476},"  }",[462,832,532],{"class":472},[462,834,503],{"class":476},[462,836,838,841,843,845,847,849],{"class":464,"line":837},12,[462,839,840],{"class":493},"  getSomeData",[462,842,497],{"class":476},[462,844,746],{"class":472},[462,846,547],{"class":476},[462,848,434],{"class":480},[462,850,851],{"class":472},"(\n",[462,853,855,858,861,863,865,868,870,872,874,877,880,883,886,889,891,893,896,898,901,903],{"class":464,"line":854},13,[462,856,857],{"class":468},"    async",[462,859,860],{"class":476}," (",[462,862,758],{"class":757},[462,864,617],{"class":476},[462,866,867],{"class":757}," id",[462,869,497],{"class":476},[462,871,769],{"class":768},[462,873,781],{"class":476},[462,875,876],{"class":768}," Promise",[462,878,879],{"class":476},"\u003C",[462,881,882],{"class":768},"Data",[462,884,885],{"class":476}," |",[462,887,888],{"class":768}," RpcError",[462,890,879],{"class":476},[462,892,521],{"class":476},[462,894,895],{"class":517},"data-not-found",[462,897,521],{"class":476},[462,899,900],{"class":476},">>",[462,902,786],{"class":468},[462,904,735],{"class":476},[462,906,908,911,914,917,920,922,924,927,929,932,934],{"class":464,"line":907},14,[462,909,910],{"class":468},"      const",[462,912,913],{"class":472}," data",[462,915,916],{"class":476}," =",[462,918,919],{"class":585}," await",[462,921,678],{"class":472},[462,923,547],{"class":476},[462,925,926],{"class":480},"getData",[462,928,484],{"class":493},[462,930,931],{"class":472},"id",[462,933,532],{"class":493},[462,935,535],{"class":476},[462,937,939,942],{"class":464,"line":938},15,[462,940,941],{"class":585},"      return",[462,943,944],{"class":493}," (\n",[462,946,948,951],{"class":464,"line":947},16,[462,949,950],{"class":472},"        data",[462,952,953],{"class":476}," ||\n",[462,955,957,960,962,964,967,970,972,974,977,979,981,983,985,987,989,991,993],{"class":464,"line":956},17,[462,958,959],{"class":476},"        new",[462,961,888],{"class":480},[462,963,484],{"class":493},[462,965,966],{"class":476},"{",[462,968,969],{"class":493},"publicMessage",[462,971,497],{"class":476},[462,973,514],{"class":476},[462,975,976],{"class":517},"Data not found",[462,978,521],{"class":476},[462,980,617],{"class":476},[462,982,640],{"class":493},[462,984,497],{"class":476},[462,986,514],{"class":476},[462,988,895],{"class":517},[462,990,521],{"class":476},[462,992,529],{"class":476},[462,994,995],{"class":493},")\n",[462,997,999,1002],{"class":464,"line":998},18,[462,1000,1001],{"class":493},"      )",[462,1003,535],{"class":476},[462,1005,1007],{"class":464,"line":1006},19,[462,1008,1009],{"class":476},"    }\n",[462,1011,1013,1016],{"class":464,"line":1012},20,[462,1014,1015],{"class":472},"  )",[462,1017,503],{"class":476},[462,1019,1021,1023,1026,1028],{"class":464,"line":1020},21,[462,1022,529],{"class":476},[462,1024,1025],{"class":585}," satisfies",[462,1027,620],{"class":768},[462,1029,535],{"class":476},[537,1031,1032,1033,1042],{},"Never give routes or middleware a type. Use the ",[409,1034,1039],{"href":1035,"rel":1036,"target":1038},"https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002Frelease-notes\u002Ftypescript-4-9.html#the-satisfies-operator",[1037],"nofollow","_blank",[428,1040,1041],{},"satisfies"," operator instead, so the router stays fully typed.",[420,1044,1046],{"id":1045},"query-and-mutation-handlers","Query and Mutation Handlers",[405,1048,1049,1050,554,1052,1054,1055,1057,1058,1060,1061,1064],{},"The ",[428,1051,438],{},[428,1053,441],{}," helpers declare what a route does, so the client can choose how to send it. A ",[428,1056,438],{}," sends small payloads in the URL as a GET, a ",[428,1059,441],{}," always in the body. A ",[428,1062,1063],{},"mion.route()"," declares no intent, sends its data in the body and has no cache semantics.",[453,1066,1068],{"className":455,"code":1067,"language":457,"meta":458,"style":458},"import {RpcError} from '@mionjs\u002Fcore';\nimport {createMionRouter, Routes} from '@mionjs\u002Frouter';\n\nconst mion = createMionRouter();\n\ntype User = {name: string; surname: string};\n\nconst routes = {\n  \u002F\u002F mion.query() for read-only operations\n  \u002F\u002F client automatically uses GET with ?data=base64url for small payloads\n  getUser: mion.query((ctx, id: number): User | RpcError\u003C'user-not-found'> => {\n    return {name: 'John', surname: 'Doe'};\n  }),\n\n  \u002F\u002F mion.mutation() for operations that modify data\n  \u002F\u002F client always uses POST with body\n  createUser: mion.mutation((ctx, user: User): User => {\n    return user;\n  }),\n\n  \u002F\u002F mion.route() declares no intent (client uses POST)\n  sayHello: mion.route((ctx, name: string): string => {\n    return `Hello ${name}`;\n  }),\n} satisfies Routes;\n",[428,1069,1070,1090,1114,1118,1132,1136,1168,1172,1182,1188,1193,1245,1277,1285,1289,1294,1299,1335,1343,1351,1355,1360,1396,1414,1423],{"__ignoreMap":458},[462,1071,1072,1074,1076,1078,1080,1082,1084,1086,1088],{"class":464,"line":465},[462,1073,586],{"class":585},[462,1075,589],{"class":476},[462,1077,592],{"class":472},[462,1079,529],{"class":476},[462,1081,597],{"class":585},[462,1083,514],{"class":476},[462,1085,602],{"class":517},[462,1087,521],{"class":476},[462,1089,535],{"class":476},[462,1091,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112],{"class":464,"line":490},[462,1093,586],{"class":585},[462,1095,589],{"class":476},[462,1097,430],{"class":472},[462,1099,617],{"class":476},[462,1101,620],{"class":472},[462,1103,529],{"class":476},[462,1105,597],{"class":585},[462,1107,514],{"class":476},[462,1109,629],{"class":517},[462,1111,521],{"class":476},[462,1113,535],{"class":476},[462,1115,1116],{"class":464,"line":506},[462,1117,697],{"emptyLinePlaceholder":696},[462,1119,1120,1122,1124,1126,1128,1130],{"class":464,"line":526},[462,1121,469],{"class":468},[462,1123,473],{"class":472},[462,1125,477],{"class":476},[462,1127,481],{"class":480},[462,1129,711],{"class":472},[462,1131,535],{"class":476},[462,1133,1134],{"class":464,"line":693},[462,1135,697],{"emptyLinePlaceholder":696},[462,1137,1138,1141,1144,1146,1148,1151,1153,1155,1158,1161,1163,1165],{"class":464,"line":700},[462,1139,1140],{"class":468},"type",[462,1142,1143],{"class":768}," User",[462,1145,916],{"class":476},[462,1147,589],{"class":476},[462,1149,1150],{"class":493},"name",[462,1152,497],{"class":476},[462,1154,769],{"class":768},[462,1156,1157],{"class":476},";",[462,1159,1160],{"class":493}," surname",[462,1162,497],{"class":476},[462,1164,769],{"class":768},[462,1166,1167],{"class":476},"};\n",[462,1169,1170],{"class":464,"line":716},[462,1171,697],{"emptyLinePlaceholder":696},[462,1173,1174,1176,1178,1180],{"class":464,"line":721},[462,1175,469],{"class":468},[462,1177,730],{"class":472},[462,1179,477],{"class":476},[462,1181,735],{"class":476},[462,1183,1184],{"class":464,"line":738},[462,1185,1187],{"class":1186},"sHwdD","  \u002F\u002F mion.query() for read-only operations\n",[462,1189,1190],{"class":464,"line":791},[462,1191,1192],{"class":1186},"  \u002F\u002F client automatically uses GET with ?data=base64url for small payloads\n",[462,1194,1195,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1218,1221,1223,1225,1227,1229,1231,1233,1236,1238,1241,1243],{"class":464,"line":827},[462,1196,1197],{"class":493},"  getUser",[462,1199,497],{"class":476},[462,1201,746],{"class":472},[462,1203,547],{"class":476},[462,1205,438],{"class":480},[462,1207,484],{"class":472},[462,1209,484],{"class":476},[462,1211,758],{"class":757},[462,1213,617],{"class":476},[462,1215,867],{"class":757},[462,1217,497],{"class":476},[462,1219,1220],{"class":768}," number",[462,1222,781],{"class":476},[462,1224,1143],{"class":768},[462,1226,885],{"class":476},[462,1228,888],{"class":768},[462,1230,879],{"class":476},[462,1232,521],{"class":476},[462,1234,1235],{"class":517},"user-not-found",[462,1237,521],{"class":476},[462,1239,1240],{"class":476},">",[462,1242,786],{"class":468},[462,1244,735],{"class":476},[462,1246,1247,1249,1251,1253,1255,1257,1260,1262,1264,1266,1268,1270,1273,1275],{"class":464,"line":837},[462,1248,794],{"class":585},[462,1250,589],{"class":476},[462,1252,1150],{"class":493},[462,1254,497],{"class":476},[462,1256,514],{"class":476},[462,1258,1259],{"class":517},"John",[462,1261,521],{"class":476},[462,1263,617],{"class":476},[462,1265,1160],{"class":493},[462,1267,497],{"class":476},[462,1269,514],{"class":476},[462,1271,1272],{"class":517},"Doe",[462,1274,521],{"class":476},[462,1276,1167],{"class":476},[462,1278,1279,1281,1283],{"class":464,"line":854},[462,1280,830],{"class":476},[462,1282,532],{"class":472},[462,1284,503],{"class":476},[462,1286,1287],{"class":464,"line":907},[462,1288,697],{"emptyLinePlaceholder":696},[462,1290,1291],{"class":464,"line":938},[462,1292,1293],{"class":1186},"  \u002F\u002F mion.mutation() for operations that modify data\n",[462,1295,1296],{"class":464,"line":947},[462,1297,1298],{"class":1186},"  \u002F\u002F client always uses POST with body\n",[462,1300,1301,1304,1306,1308,1310,1312,1314,1316,1318,1320,1323,1325,1327,1329,1331,1333],{"class":464,"line":956},[462,1302,1303],{"class":493},"  createUser",[462,1305,497],{"class":476},[462,1307,746],{"class":472},[462,1309,547],{"class":476},[462,1311,441],{"class":480},[462,1313,484],{"class":472},[462,1315,484],{"class":476},[462,1317,758],{"class":757},[462,1319,617],{"class":476},[462,1321,1322],{"class":757}," user",[462,1324,497],{"class":476},[462,1326,1143],{"class":768},[462,1328,781],{"class":476},[462,1330,1143],{"class":768},[462,1332,786],{"class":468},[462,1334,735],{"class":476},[462,1336,1337,1339,1341],{"class":464,"line":998},[462,1338,794],{"class":585},[462,1340,1322],{"class":472},[462,1342,535],{"class":476},[462,1344,1345,1347,1349],{"class":464,"line":1006},[462,1346,830],{"class":476},[462,1348,532],{"class":472},[462,1350,503],{"class":476},[462,1352,1353],{"class":464,"line":1012},[462,1354,697],{"emptyLinePlaceholder":696},[462,1356,1357],{"class":464,"line":1020},[462,1358,1359],{"class":1186},"  \u002F\u002F mion.route() declares no intent (client uses POST)\n",[462,1361,1363,1365,1367,1369,1371,1373,1375,1377,1379,1381,1384,1386,1388,1390,1392,1394],{"class":464,"line":1362},22,[462,1364,741],{"class":493},[462,1366,497],{"class":476},[462,1368,746],{"class":472},[462,1370,547],{"class":476},[462,1372,434],{"class":480},[462,1374,484],{"class":472},[462,1376,484],{"class":476},[462,1378,758],{"class":757},[462,1380,617],{"class":476},[462,1382,1383],{"class":757}," name",[462,1385,497],{"class":476},[462,1387,769],{"class":768},[462,1389,781],{"class":476},[462,1391,769],{"class":768},[462,1393,786],{"class":468},[462,1395,735],{"class":476},[462,1397,1399,1401,1403,1405,1407,1409,1412],{"class":464,"line":1398},23,[462,1400,794],{"class":585},[462,1402,797],{"class":476},[462,1404,800],{"class":517},[462,1406,803],{"class":476},[462,1408,1150],{"class":472},[462,1410,1411],{"class":476},"}`",[462,1413,535],{"class":476},[462,1415,1417,1419,1421],{"class":464,"line":1416},24,[462,1418,830],{"class":476},[462,1420,532],{"class":472},[462,1422,503],{"class":476},[462,1424,1426,1428,1430,1432],{"class":464,"line":1425},25,[462,1427,529],{"class":476},[462,1429,1025],{"class":585},[462,1431,620],{"class":768},[462,1433,535],{"class":476},[537,1435,1436,1437,554,1440,1443],{},"Prefer ",[428,1438,1439],{},"mion.query()",[428,1441,1442],{},"mion.mutation()",": your code reads better, and it leaves room for future optimizations like caching layers.",[420,1445,1447],{"id":1446},"undeclared-properties","Undeclared Properties",[405,1449,1450,1451,554,1454,1457],{},"By default, a param property your types do not declare is dropped while the request is decoded, not at validation. The ",[428,1452,1453],{},"clone",[428,1455,1456],{},"compact"," strategies rebuild the params from your declared type.",[405,1459,1460,1461,1464,1465,547],{},"To reject the request instead, set ",[428,1462,1463],{},"parser: {params: 'mutateStrict'}",". See ",[409,1466,52],{"href":1467},"\u002Frpc\u002Fserver\u002Fvalidation#undeclared-properties",[453,1469,1471],{"className":455,"code":1470,"language":457,"meta":458,"style":458},"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",[428,1472,1473,1497,1501,1510,1521,1532,1543,1548,1552,1557,1601,1605,1615,1620,1657,1662,1714,1736,1744,1754,1758],{"__ignoreMap":458},[462,1474,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495],{"class":464,"line":465},[462,1476,586],{"class":585},[462,1478,589],{"class":476},[462,1480,430],{"class":472},[462,1482,617],{"class":476},[462,1484,620],{"class":472},[462,1486,529],{"class":476},[462,1488,597],{"class":585},[462,1490,514],{"class":476},[462,1492,629],{"class":517},[462,1494,521],{"class":476},[462,1496,535],{"class":476},[462,1498,1499],{"class":464,"line":490},[462,1500,697],{"emptyLinePlaceholder":696},[462,1502,1503,1506,1508],{"class":464,"line":506},[462,1504,1505],{"class":468},"interface",[462,1507,1143],{"class":768},[462,1509,735],{"class":476},[462,1511,1512,1515,1517,1519],{"class":464,"line":526},[462,1513,1514],{"class":493},"  name",[462,1516,497],{"class":476},[462,1518,769],{"class":768},[462,1520,535],{"class":476},[462,1522,1523,1526,1528,1530],{"class":464,"line":693},[462,1524,1525],{"class":493},"  email",[462,1527,497],{"class":476},[462,1529,769],{"class":768},[462,1531,535],{"class":476},[462,1533,1534,1537,1539,1541],{"class":464,"line":700},[462,1535,1536],{"class":493},"  age",[462,1538,497],{"class":476},[462,1540,1220],{"class":768},[462,1542,535],{"class":476},[462,1544,1545],{"class":464,"line":716},[462,1546,1547],{"class":476},"}\n",[462,1549,1550],{"class":464,"line":721},[462,1551,697],{"emptyLinePlaceholder":696},[462,1553,1554],{"class":464,"line":738},[462,1555,1556],{"class":1186},"\u002F\u002F every route on this router rejects params carrying a property the type does not declare\n",[462,1558,1559,1561,1563,1565,1567,1569,1571,1574,1576,1578,1581,1583,1585,1588,1590,1593,1595,1597,1599],{"class":464,"line":791},[462,1560,469],{"class":468},[462,1562,473],{"class":472},[462,1564,477],{"class":476},[462,1566,481],{"class":480},[462,1568,484],{"class":472},[462,1570,966],{"class":476},[462,1572,1573],{"class":493},"parser",[462,1575,497],{"class":476},[462,1577,589],{"class":476},[462,1579,1580],{"class":493},"params",[462,1582,497],{"class":476},[462,1584,514],{"class":476},[462,1586,1587],{"class":517},"mutateStrict",[462,1589,521],{"class":476},[462,1591,1592],{"class":476},"}}",[462,1594,648],{"class":585},[462,1596,727],{"class":468},[462,1598,532],{"class":472},[462,1600,535],{"class":476},[462,1602,1603],{"class":464,"line":827},[462,1604,697],{"emptyLinePlaceholder":696},[462,1606,1607,1609,1611,1613],{"class":464,"line":837},[462,1608,469],{"class":468},[462,1610,730],{"class":472},[462,1612,477],{"class":476},[462,1614,735],{"class":476},[462,1616,1617],{"class":464,"line":854},[462,1618,1619],{"class":1186},"  \u002F\u002F inherits mutateStrict from the router\n",[462,1621,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650,1652,1655],{"class":464,"line":907},[462,1623,1303],{"class":493},[462,1625,497],{"class":476},[462,1627,746],{"class":472},[462,1629,547],{"class":476},[462,1631,434],{"class":480},[462,1633,484],{"class":472},[462,1635,484],{"class":476},[462,1637,758],{"class":757},[462,1639,617],{"class":476},[462,1641,1322],{"class":757},[462,1643,497],{"class":476},[462,1645,1143],{"class":768},[462,1647,781],{"class":476},[462,1649,1143],{"class":768},[462,1651,786],{"class":468},[462,1653,1654],{"class":472}," user)",[462,1656,503],{"class":476},[462,1658,1659],{"class":464,"line":938},[462,1660,1661],{"class":1186},"  \u002F\u002F this route drops the extra property instead of refusing the request\n",[462,1663,1664,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1690,1692,1695,1698,1700,1702,1704,1706,1708,1710,1712],{"class":464,"line":947},[462,1665,1666],{"class":493},"  updateUser",[462,1668,497],{"class":476},[462,1670,746],{"class":472},[462,1672,547],{"class":476},[462,1674,434],{"class":480},[462,1676,484],{"class":472},[462,1678,484],{"class":476},[462,1680,758],{"class":757},[462,1682,617],{"class":476},[462,1684,1322],{"class":757},[462,1686,497],{"class":476},[462,1688,1689],{"class":768}," Partial",[462,1691,879],{"class":476},[462,1693,1694],{"class":768},"User",[462,1696,1697],{"class":476},">):",[462,1699,1689],{"class":768},[462,1701,879],{"class":476},[462,1703,1694],{"class":768},[462,1705,1240],{"class":476},[462,1707,786],{"class":468},[462,1709,1322],{"class":472},[462,1711,617],{"class":476},[462,1713,735],{"class":476},[462,1715,1716,1719,1721,1723,1725,1727,1729,1731,1733],{"class":464,"line":956},[462,1717,1718],{"class":493},"    parser",[462,1720,497],{"class":476},[462,1722,589],{"class":476},[462,1724,1580],{"class":493},[462,1726,497],{"class":476},[462,1728,514],{"class":476},[462,1730,1453],{"class":517},[462,1732,521],{"class":476},[462,1734,1735],{"class":476},"},\n",[462,1737,1738,1740,1742],{"class":464,"line":998},[462,1739,830],{"class":476},[462,1741,532],{"class":472},[462,1743,503],{"class":476},[462,1745,1746,1748,1750,1752],{"class":464,"line":1006},[462,1747,529],{"class":476},[462,1749,1025],{"class":585},[462,1751,620],{"class":768},[462,1753,535],{"class":476},[462,1755,1756],{"class":464,"line":1012},[462,1757,697],{"emptyLinePlaceholder":696},[462,1759,1760,1763,1765,1767,1770],{"class":464,"line":1020},[462,1761,1762],{"class":472},"mion",[462,1764,547],{"class":476},[462,1766,542],{"class":480},[462,1768,1769],{"class":472},"(routes)",[462,1771,535],{"class":476},[420,1773,1775],{"id":1774},"registering-routes","Registering Routes",[405,1777,1778,1779,1782,1783,1785],{},"Pass the routes object to ",[428,1780,1781],{},"mion.initRoutes",", once per app. It initializes the router with the options given to ",[428,1784,430],{},", registers the routes and returns the API type the client uses.",[453,1787,1789],{"className":455,"code":1788,"language":457,"meta":458,"style":458},"import {HeadersSubset} from '@mionjs\u002Fcore';\nimport {createMionRouter, PublicApi, Routes} from '@mionjs\u002Frouter';\n\nconst mion = createMionRouter();\n\nconst authRoutes = {\n  logIn: mion.route(\n    (ctx, email: string, password: string): string => 'loggedIn'\n  ),\n  logOut: mion.route((): string => 'loggedOut'),\n} satisfies Routes;\n\nconst routes = {\n  trace: mion.headersMiddleware(\n    (ctx, headers: HeadersSubset\u003C'X-Trace-Id'>): void => undefined\n  ),\n  sayHello: mion.route((ctx, name: string): string => 'hello ' + name),\n} satisfies Routes;\n\n\u002F\u002F routes split across files are spread into the one initRoutes call\nexport const myApi = mion.initRoutes({...routes, ...authRoutes});\n\nexport type MyApi = typeof myApi;\n\u002F\u002F a sub-api can be typed on its own from its routes object\nexport type AuthApi = PublicApi\u003Ctypeof authRoutes>;\n",[428,1790,1791,1812,1841,1845,1859,1863,1874,1889,1928,1934,1967,1977,1981,1991,2006,2041,2047,2094,2104,2108,2113,2152,2156,2175,2180],{"__ignoreMap":458},[462,1792,1793,1795,1797,1800,1802,1804,1806,1808,1810],{"class":464,"line":465},[462,1794,586],{"class":585},[462,1796,589],{"class":476},[462,1798,1799],{"class":472},"HeadersSubset",[462,1801,529],{"class":476},[462,1803,597],{"class":585},[462,1805,514],{"class":476},[462,1807,602],{"class":517},[462,1809,521],{"class":476},[462,1811,535],{"class":476},[462,1813,1814,1816,1818,1820,1822,1825,1827,1829,1831,1833,1835,1837,1839],{"class":464,"line":490},[462,1815,586],{"class":585},[462,1817,589],{"class":476},[462,1819,430],{"class":472},[462,1821,617],{"class":476},[462,1823,1824],{"class":472}," PublicApi",[462,1826,617],{"class":476},[462,1828,620],{"class":472},[462,1830,529],{"class":476},[462,1832,597],{"class":585},[462,1834,514],{"class":476},[462,1836,629],{"class":517},[462,1838,521],{"class":476},[462,1840,535],{"class":476},[462,1842,1843],{"class":464,"line":506},[462,1844,697],{"emptyLinePlaceholder":696},[462,1846,1847,1849,1851,1853,1855,1857],{"class":464,"line":526},[462,1848,469],{"class":468},[462,1850,473],{"class":472},[462,1852,477],{"class":476},[462,1854,481],{"class":480},[462,1856,711],{"class":472},[462,1858,535],{"class":476},[462,1860,1861],{"class":464,"line":693},[462,1862,697],{"emptyLinePlaceholder":696},[462,1864,1865,1867,1870,1872],{"class":464,"line":700},[462,1866,469],{"class":468},[462,1868,1869],{"class":472}," authRoutes ",[462,1871,477],{"class":476},[462,1873,735],{"class":476},[462,1875,1876,1879,1881,1883,1885,1887],{"class":464,"line":716},[462,1877,1878],{"class":493},"  logIn",[462,1880,497],{"class":476},[462,1882,746],{"class":472},[462,1884,547],{"class":476},[462,1886,434],{"class":480},[462,1888,851],{"class":472},[462,1890,1891,1894,1896,1898,1901,1903,1905,1907,1910,1912,1914,1916,1918,1920,1922,1925],{"class":464,"line":721},[462,1892,1893],{"class":476},"    (",[462,1895,758],{"class":757},[462,1897,617],{"class":476},[462,1899,1900],{"class":757}," email",[462,1902,497],{"class":476},[462,1904,769],{"class":768},[462,1906,617],{"class":476},[462,1908,1909],{"class":757}," password",[462,1911,497],{"class":476},[462,1913,769],{"class":768},[462,1915,781],{"class":476},[462,1917,769],{"class":768},[462,1919,786],{"class":468},[462,1921,514],{"class":476},[462,1923,1924],{"class":517},"loggedIn",[462,1926,1927],{"class":476},"'\n",[462,1929,1930,1932],{"class":464,"line":738},[462,1931,1015],{"class":472},[462,1933,503],{"class":476},[462,1935,1936,1939,1941,1943,1945,1947,1949,1952,1954,1956,1958,1961,1963,1965],{"class":464,"line":791},[462,1937,1938],{"class":493},"  logOut",[462,1940,497],{"class":476},[462,1942,746],{"class":472},[462,1944,547],{"class":476},[462,1946,434],{"class":480},[462,1948,484],{"class":472},[462,1950,1951],{"class":476},"():",[462,1953,769],{"class":768},[462,1955,786],{"class":468},[462,1957,514],{"class":476},[462,1959,1960],{"class":517},"loggedOut",[462,1962,521],{"class":476},[462,1964,532],{"class":472},[462,1966,503],{"class":476},[462,1968,1969,1971,1973,1975],{"class":464,"line":827},[462,1970,529],{"class":476},[462,1972,1025],{"class":585},[462,1974,620],{"class":768},[462,1976,535],{"class":476},[462,1978,1979],{"class":464,"line":837},[462,1980,697],{"emptyLinePlaceholder":696},[462,1982,1983,1985,1987,1989],{"class":464,"line":854},[462,1984,469],{"class":468},[462,1986,730],{"class":472},[462,1988,477],{"class":476},[462,1990,735],{"class":476},[462,1992,1993,1996,1998,2000,2002,2004],{"class":464,"line":907},[462,1994,1995],{"class":493},"  trace",[462,1997,497],{"class":476},[462,1999,746],{"class":472},[462,2001,547],{"class":476},[462,2003,447],{"class":480},[462,2005,851],{"class":472},[462,2007,2008,2010,2012,2014,2017,2019,2022,2024,2026,2029,2031,2033,2036,2038],{"class":464,"line":938},[462,2009,1893],{"class":476},[462,2011,758],{"class":757},[462,2013,617],{"class":476},[462,2015,2016],{"class":757}," headers",[462,2018,497],{"class":476},[462,2020,2021],{"class":768}," HeadersSubset",[462,2023,879],{"class":476},[462,2025,521],{"class":476},[462,2027,2028],{"class":517},"X-Trace-Id",[462,2030,521],{"class":476},[462,2032,1697],{"class":476},[462,2034,2035],{"class":768}," void",[462,2037,786],{"class":468},[462,2039,2040],{"class":476}," undefined\n",[462,2042,2043,2045],{"class":464,"line":947},[462,2044,1015],{"class":472},[462,2046,503],{"class":476},[462,2048,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2084,2086,2089,2092],{"class":464,"line":956},[462,2050,741],{"class":493},[462,2052,497],{"class":476},[462,2054,746],{"class":472},[462,2056,547],{"class":476},[462,2058,434],{"class":480},[462,2060,484],{"class":472},[462,2062,484],{"class":476},[462,2064,758],{"class":757},[462,2066,617],{"class":476},[462,2068,1383],{"class":757},[462,2070,497],{"class":476},[462,2072,769],{"class":768},[462,2074,781],{"class":476},[462,2076,769],{"class":768},[462,2078,786],{"class":468},[462,2080,514],{"class":476},[462,2082,2083],{"class":517},"hello ",[462,2085,521],{"class":476},[462,2087,2088],{"class":476}," +",[462,2090,2091],{"class":472}," name)",[462,2093,503],{"class":476},[462,2095,2096,2098,2100,2102],{"class":464,"line":998},[462,2097,529],{"class":476},[462,2099,1025],{"class":585},[462,2101,620],{"class":768},[462,2103,535],{"class":476},[462,2105,2106],{"class":464,"line":1006},[462,2107,697],{"emptyLinePlaceholder":696},[462,2109,2110],{"class":464,"line":1012},[462,2111,2112],{"class":1186},"\u002F\u002F routes split across files are spread into the one initRoutes call\n",[462,2114,2115,2117,2119,2122,2124,2126,2128,2130,2132,2135,2138,2140,2143,2146,2148,2150],{"class":464,"line":1020},[462,2116,724],{"class":585},[462,2118,727],{"class":468},[462,2120,2121],{"class":472}," myApi ",[462,2123,477],{"class":476},[462,2125,746],{"class":472},[462,2127,547],{"class":476},[462,2129,542],{"class":480},[462,2131,484],{"class":472},[462,2133,2134],{"class":476},"{...",[462,2136,2137],{"class":472},"routes",[462,2139,617],{"class":476},[462,2141,2142],{"class":476}," ...",[462,2144,2145],{"class":472},"authRoutes",[462,2147,529],{"class":476},[462,2149,532],{"class":472},[462,2151,535],{"class":476},[462,2153,2154],{"class":464,"line":1362},[462,2155,697],{"emptyLinePlaceholder":696},[462,2157,2158,2160,2162,2165,2167,2170,2173],{"class":464,"line":1398},[462,2159,724],{"class":585},[462,2161,640],{"class":468},[462,2163,2164],{"class":768}," MyApi",[462,2166,916],{"class":476},[462,2168,2169],{"class":476}," typeof",[462,2171,2172],{"class":472}," myApi",[462,2174,535],{"class":476},[462,2176,2177],{"class":464,"line":1416},[462,2178,2179],{"class":1186},"\u002F\u002F a sub-api can be typed on its own from its routes object\n",[462,2181,2182,2184,2186,2189,2191,2193,2196,2199],{"class":464,"line":1425},[462,2183,724],{"class":585},[462,2185,640],{"class":468},[462,2187,2188],{"class":768}," AuthApi",[462,2190,916],{"class":476},[462,2192,1824],{"class":768},[462,2194,2195],{"class":476},"\u003Ctypeof",[462,2197,2198],{"class":472}," authRoutes",[462,2200,2201],{"class":476},">;\n",[420,2203,2205],{"id":2204},"naming-routes","Naming Routes",[405,2207,2208],{},"Name routes with valid JS variable names, not quoted keys.",[453,2210,2212],{"className":455,"code":2211,"language":457,"meta":458,"style":458},"import {createMionRouter, Routes} from '@mionjs\u002Frouter';\n\nconst mion = createMionRouter();\n\nconst sayHello = mion.route((ctx, name: string): string => {\n  return `Hello ${name}.`;\n});\n\nconst routes = {\n  'say-Hello': sayHello, \u002F\u002F path = \u002Fsay-Hello  !! NOT Recommended\n  'say Hello': sayHello, \u002F\u002F path = \u002Fsay%20Hello  !! ROUTE WONT BE FOUND\n} satisfies Routes;\n",[428,2213,2214,2238,2242,2256,2260,2297,2318,2326,2330,2340,2360,2378],{"__ignoreMap":458},[462,2215,2216,2218,2220,2222,2224,2226,2228,2230,2232,2234,2236],{"class":464,"line":465},[462,2217,586],{"class":585},[462,2219,589],{"class":476},[462,2221,430],{"class":472},[462,2223,617],{"class":476},[462,2225,620],{"class":472},[462,2227,529],{"class":476},[462,2229,597],{"class":585},[462,2231,514],{"class":476},[462,2233,629],{"class":517},[462,2235,521],{"class":476},[462,2237,535],{"class":476},[462,2239,2240],{"class":464,"line":490},[462,2241,697],{"emptyLinePlaceholder":696},[462,2243,2244,2246,2248,2250,2252,2254],{"class":464,"line":506},[462,2245,469],{"class":468},[462,2247,473],{"class":472},[462,2249,477],{"class":476},[462,2251,481],{"class":480},[462,2253,711],{"class":472},[462,2255,535],{"class":476},[462,2257,2258],{"class":464,"line":526},[462,2259,697],{"emptyLinePlaceholder":696},[462,2261,2262,2264,2267,2269,2271,2273,2275,2277,2279,2281,2283,2285,2287,2289,2291,2293,2295],{"class":464,"line":693},[462,2263,469],{"class":468},[462,2265,2266],{"class":472}," sayHello ",[462,2268,477],{"class":476},[462,2270,746],{"class":472},[462,2272,547],{"class":476},[462,2274,434],{"class":480},[462,2276,484],{"class":472},[462,2278,484],{"class":476},[462,2280,758],{"class":757},[462,2282,617],{"class":476},[462,2284,1383],{"class":757},[462,2286,497],{"class":476},[462,2288,769],{"class":768},[462,2290,781],{"class":476},[462,2292,769],{"class":768},[462,2294,786],{"class":468},[462,2296,735],{"class":476},[462,2298,2299,2302,2304,2306,2308,2310,2312,2314,2316],{"class":464,"line":700},[462,2300,2301],{"class":585},"  return",[462,2303,797],{"class":476},[462,2305,800],{"class":517},[462,2307,803],{"class":476},[462,2309,1150],{"class":472},[462,2311,529],{"class":476},[462,2313,547],{"class":517},[462,2315,822],{"class":476},[462,2317,535],{"class":476},[462,2319,2320,2322,2324],{"class":464,"line":716},[462,2321,529],{"class":476},[462,2323,532],{"class":472},[462,2325,535],{"class":476},[462,2327,2328],{"class":464,"line":721},[462,2329,697],{"emptyLinePlaceholder":696},[462,2331,2332,2334,2336,2338],{"class":464,"line":738},[462,2333,469],{"class":468},[462,2335,730],{"class":472},[462,2337,477],{"class":476},[462,2339,735],{"class":476},[462,2341,2342,2345,2348,2350,2352,2355,2357],{"class":464,"line":791},[462,2343,2344],{"class":476},"  '",[462,2346,2347],{"class":493},"say-Hello",[462,2349,521],{"class":476},[462,2351,497],{"class":476},[462,2353,2354],{"class":472}," sayHello",[462,2356,617],{"class":476},[462,2358,2359],{"class":1186}," \u002F\u002F path = \u002Fsay-Hello  !! NOT Recommended\n",[462,2361,2362,2364,2367,2369,2371,2373,2375],{"class":464,"line":827},[462,2363,2344],{"class":476},[462,2365,2366],{"class":493},"say Hello",[462,2368,521],{"class":476},[462,2370,497],{"class":476},[462,2372,2354],{"class":472},[462,2374,617],{"class":476},[462,2376,2377],{"class":1186}," \u002F\u002F path = \u002Fsay%20Hello  !! ROUTE WONT BE FOUND\n",[462,2379,2380,2382,2384,2386],{"class":464,"line":837},[462,2381,529],{"class":476},[462,2383,1025],{"class":585},[462,2385,620],{"class":768},[462,2387,535],{"class":476},[2389,2390,2391,2392,2394,2395,435,2398,554,2401,547],"note",{},"Route lookup does not decode the URL, so a name with characters that need URL encoding is never found. ",[428,2393,542],{}," refuses the names ",[428,2396,2397],{},"__proto__",[428,2399,2400],{},"prototype",[428,2402,2403],{},"constructor",[420,2405,2407],{"id":2406},"sanitizing-params","Sanitizing Params",[405,2409,2410,2411,2414,2415,2417,2418,547],{},"A route can apply the transforms its param types declare (trim, lowercase, strip separators) after decoding and before validation, on the server and in the client. Turn it on with ",[428,2412,2413],{},"sanitizeParams",", globally in ",[428,2416,430],{}," or per route. See ",[409,2419,52],{"href":2420},"\u002Frpc\u002Fserver\u002Fvalidation#sanitizing-params",[453,2422,2424],{"className":455,"code":2423,"language":457,"meta":458,"style":458},"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",[428,2425,2426,2450,2476,2480,2485,2536,2540,2545,2572,2576,2586,2591,2606,2636,2666,2672,2677,2716,2728,2736,2746,2750],{"__ignoreMap":458},[462,2427,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448],{"class":464,"line":465},[462,2429,586],{"class":585},[462,2431,589],{"class":476},[462,2433,430],{"class":472},[462,2435,617],{"class":476},[462,2437,620],{"class":472},[462,2439,529],{"class":476},[462,2441,597],{"class":585},[462,2443,514],{"class":476},[462,2445,629],{"class":517},[462,2447,521],{"class":476},[462,2449,535],{"class":476},[462,2451,2452,2454,2456,2459,2461,2464,2467,2469,2472,2474],{"class":464,"line":490},[462,2453,586],{"class":585},[462,2455,640],{"class":585},[462,2457,2458],{"class":476}," *",[462,2460,648],{"class":585},[462,2462,2463],{"class":472}," TF ",[462,2465,2466],{"class":585},"from",[462,2468,514],{"class":476},[462,2470,2471],{"class":517},"@mionjs\u002Frun-types\u002Fformats",[462,2473,521],{"class":476},[462,2475,535],{"class":476},[462,2477,2478],{"class":464,"line":506},[462,2479,697],{"emptyLinePlaceholder":696},[462,2481,2482],{"class":464,"line":526},[462,2483,2484],{"class":1186},"\u002F\u002F The type says what a clean value looks like: trimmed and lowercased.\n",[462,2486,2487,2489,2492,2494,2497,2499,2502,2504,2507,2509,2512,2514,2516,2519,2521,2524,2526,2529,2531,2533],{"class":464,"line":693},[462,2488,1140],{"class":468},[462,2490,2491],{"class":768}," Email",[462,2493,916],{"class":476},[462,2495,2496],{"class":768}," TF",[462,2498,547],{"class":476},[462,2500,2501],{"class":768},"Transform",[462,2503,879],{"class":476},[462,2505,2506],{"class":768},"TF",[462,2508,547],{"class":476},[462,2510,2511],{"class":768},"Email",[462,2513,617],{"class":476},[462,2515,589],{"class":476},[462,2517,2518],{"class":493},"trim",[462,2520,497],{"class":476},[462,2522,2523],{"class":768}," true",[462,2525,1157],{"class":476},[462,2527,2528],{"class":493}," lowercase",[462,2530,497],{"class":476},[462,2532,2523],{"class":768},[462,2534,2535],{"class":476},"}>;\n",[462,2537,2538],{"class":464,"line":700},[462,2539,697],{"emptyLinePlaceholder":696},[462,2541,2542],{"class":464,"line":716},[462,2543,2544],{"class":1186},"\u002F\u002F Turn sanitizing on for every route, or per route below. It is off by default.\n",[462,2546,2547,2549,2551,2553,2555,2557,2559,2561,2563,2566,2568,2570],{"class":464,"line":721},[462,2548,469],{"class":468},[462,2550,473],{"class":472},[462,2552,477],{"class":476},[462,2554,481],{"class":480},[462,2556,484],{"class":472},[462,2558,966],{"class":476},[462,2560,2413],{"class":493},[462,2562,497],{"class":476},[462,2564,2523],{"class":2565},"sfNiH",[462,2567,529],{"class":476},[462,2569,532],{"class":472},[462,2571,535],{"class":476},[462,2573,2574],{"class":464,"line":738},[462,2575,697],{"emptyLinePlaceholder":696},[462,2577,2578,2580,2582,2584],{"class":464,"line":791},[462,2579,469],{"class":468},[462,2581,730],{"class":472},[462,2583,477],{"class":476},[462,2585,735],{"class":476},[462,2587,2588],{"class":464,"line":827},[462,2589,2590],{"class":1186},"  \u002F\u002F ' John@Example.COM ' arrives, the handler gets 'john@example.com'\n",[462,2592,2593,2596,2598,2600,2602,2604],{"class":464,"line":837},[462,2594,2595],{"class":493},"  login",[462,2597,497],{"class":476},[462,2599,746],{"class":472},[462,2601,547],{"class":476},[462,2603,434],{"class":480},[462,2605,851],{"class":472},[462,2607,2608,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630,2633],{"class":464,"line":854},[462,2609,1893],{"class":476},[462,2611,758],{"class":757},[462,2613,617],{"class":476},[462,2615,1900],{"class":757},[462,2617,497],{"class":476},[462,2619,2491],{"class":768},[462,2621,617],{"class":476},[462,2623,1909],{"class":757},[462,2625,497],{"class":476},[462,2627,769],{"class":768},[462,2629,781],{"class":476},[462,2631,2632],{"class":768}," boolean",[462,2634,2635],{"class":468}," =>\n",[462,2637,2638,2641,2643,2646,2648,2652,2655,2657,2659,2661,2663],{"class":464,"line":907},[462,2639,2640],{"class":472},"      email",[462,2642,547],{"class":476},[462,2644,2645],{"class":472},"length ",[462,2647,1240],{"class":476},[462,2649,2651],{"class":2650},"sbssI"," 0",[462,2653,2654],{"class":476}," &&",[462,2656,1909],{"class":472},[462,2658,547],{"class":476},[462,2660,2645],{"class":472},[462,2662,1240],{"class":476},[462,2664,2665],{"class":2650}," 0\n",[462,2667,2668,2670],{"class":464,"line":938},[462,2669,1015],{"class":472},[462,2671,503],{"class":476},[462,2673,2674],{"class":464,"line":947},[462,2675,2676],{"class":1186},"  \u002F\u002F this route opts out: the handler gets the value exactly as sent\n",[462,2678,2679,2682,2684,2686,2688,2690,2692,2694,2696,2698,2700,2702,2704,2706,2708,2710,2712,2714],{"class":464,"line":956},[462,2680,2681],{"class":493},"  echo",[462,2683,497],{"class":476},[462,2685,746],{"class":472},[462,2687,547],{"class":476},[462,2689,434],{"class":480},[462,2691,484],{"class":472},[462,2693,484],{"class":476},[462,2695,758],{"class":757},[462,2697,617],{"class":476},[462,2699,1900],{"class":757},[462,2701,497],{"class":476},[462,2703,2491],{"class":768},[462,2705,781],{"class":476},[462,2707,769],{"class":768},[462,2709,786],{"class":468},[462,2711,1900],{"class":472},[462,2713,617],{"class":476},[462,2715,735],{"class":476},[462,2717,2718,2721,2723,2726],{"class":464,"line":998},[462,2719,2720],{"class":493},"    sanitizeParams",[462,2722,497],{"class":476},[462,2724,2725],{"class":2565}," false",[462,2727,503],{"class":476},[462,2729,2730,2732,2734],{"class":464,"line":1006},[462,2731,830],{"class":476},[462,2733,532],{"class":472},[462,2735,503],{"class":476},[462,2737,2738,2740,2742,2744],{"class":464,"line":1012},[462,2739,529],{"class":476},[462,2741,1025],{"class":585},[462,2743,620],{"class":768},[462,2745,535],{"class":476},[462,2747,2748],{"class":464,"line":1020},[462,2749,697],{"emptyLinePlaceholder":696},[462,2751,2752,2754,2756,2758,2760],{"class":464,"line":1362},[462,2753,1762],{"class":472},[462,2755,547],{"class":476},[462,2757,542],{"class":480},[462,2759,1769],{"class":472},[462,2761,535],{"class":476},[420,2763,2765],{"id":2764},"request-size","Request Size",[405,2767,2768],{},"mion works out the largest valid request for each route from the parameter types of the route and its middleware. A bigger request gets a 413 error, as early as the platform allows. You write no size limits by hand.",[453,2770,2772],{"className":455,"code":2771,"language":457,"meta":458,"style":458},"import {createMionRouter, Routes} from '@mionjs\u002Frouter';\nimport * as TF from '@mionjs\u002Frun-types\u002Fformats';\n\ninterface Item {\n  id: TF.String\u003C{maxLength: 36}>;\n  qty: number;\n}\n\n\u002F\u002F the one router-wide knob: the slack applied to a limit derived from the types\nconst mion = createMionRouter({maxBodySizeFactor: 2});\n\nconst routes = {\n  \u002F\u002F every param has a maximum, so the limit is derived from the types\n  addItems: mion.route(\n    (\n      ctx,\n      orderId: TF.String\u003C{maxLength: 36}>,\n      items: TF.FormattedArray\u003CItem[], {maxItems: 50}>\n    ): number => items.length\n  ),\n\n  \u002F\u002F a plain string has no maximum, so this route takes the adapter's number\n  search: mion.route((ctx, text: string): number => text.length),\n\n  \u002F\u002F the route option wins over both\n  upload: mion.route((ctx, payload: string): number => payload.length, {\n    maxBodySize: 512_000,\n  }),\n} satisfies Routes;\n\nmion.initRoutes(routes);\n",[428,2773,2774,2798,2818,2822,2831,2858,2869,2873,2877,2882,2910,2914,2924,2929,2944,2949,2956,2976,3006,3025,3031,3035,3040,3083,3087,3092,3138,3151,3160,3171,3176],{"__ignoreMap":458},[462,2775,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796],{"class":464,"line":465},[462,2777,586],{"class":585},[462,2779,589],{"class":476},[462,2781,430],{"class":472},[462,2783,617],{"class":476},[462,2785,620],{"class":472},[462,2787,529],{"class":476},[462,2789,597],{"class":585},[462,2791,514],{"class":476},[462,2793,629],{"class":517},[462,2795,521],{"class":476},[462,2797,535],{"class":476},[462,2799,2800,2802,2804,2806,2808,2810,2812,2814,2816],{"class":464,"line":490},[462,2801,586],{"class":585},[462,2803,2458],{"class":476},[462,2805,648],{"class":585},[462,2807,2463],{"class":472},[462,2809,2466],{"class":585},[462,2811,514],{"class":476},[462,2813,2471],{"class":517},[462,2815,521],{"class":476},[462,2817,535],{"class":476},[462,2819,2820],{"class":464,"line":506},[462,2821,697],{"emptyLinePlaceholder":696},[462,2823,2824,2826,2829],{"class":464,"line":526},[462,2825,1505],{"class":468},[462,2827,2828],{"class":768}," Item",[462,2830,735],{"class":476},[462,2832,2833,2836,2838,2840,2842,2845,2848,2851,2853,2856],{"class":464,"line":693},[462,2834,2835],{"class":493},"  id",[462,2837,497],{"class":476},[462,2839,2496],{"class":768},[462,2841,547],{"class":476},[462,2843,2844],{"class":768},"String",[462,2846,2847],{"class":476},"\u003C{",[462,2849,2850],{"class":493},"maxLength",[462,2852,497],{"class":476},[462,2854,2855],{"class":2650}," 36",[462,2857,2535],{"class":476},[462,2859,2860,2863,2865,2867],{"class":464,"line":700},[462,2861,2862],{"class":493},"  qty",[462,2864,497],{"class":476},[462,2866,1220],{"class":768},[462,2868,535],{"class":476},[462,2870,2871],{"class":464,"line":716},[462,2872,1547],{"class":476},[462,2874,2875],{"class":464,"line":721},[462,2876,697],{"emptyLinePlaceholder":696},[462,2878,2879],{"class":464,"line":738},[462,2880,2881],{"class":1186},"\u002F\u002F the one router-wide knob: the slack applied to a limit derived from the types\n",[462,2883,2884,2886,2888,2890,2892,2894,2896,2899,2901,2904,2906,2908],{"class":464,"line":791},[462,2885,469],{"class":468},[462,2887,473],{"class":472},[462,2889,477],{"class":476},[462,2891,481],{"class":480},[462,2893,484],{"class":472},[462,2895,966],{"class":476},[462,2897,2898],{"class":493},"maxBodySizeFactor",[462,2900,497],{"class":476},[462,2902,2903],{"class":2650}," 2",[462,2905,529],{"class":476},[462,2907,532],{"class":472},[462,2909,535],{"class":476},[462,2911,2912],{"class":464,"line":827},[462,2913,697],{"emptyLinePlaceholder":696},[462,2915,2916,2918,2920,2922],{"class":464,"line":837},[462,2917,469],{"class":468},[462,2919,730],{"class":472},[462,2921,477],{"class":476},[462,2923,735],{"class":476},[462,2925,2926],{"class":464,"line":854},[462,2927,2928],{"class":1186},"  \u002F\u002F every param has a maximum, so the limit is derived from the types\n",[462,2930,2931,2934,2936,2938,2940,2942],{"class":464,"line":907},[462,2932,2933],{"class":493},"  addItems",[462,2935,497],{"class":476},[462,2937,746],{"class":472},[462,2939,547],{"class":476},[462,2941,434],{"class":480},[462,2943,851],{"class":472},[462,2945,2946],{"class":464,"line":938},[462,2947,2948],{"class":472},"    (\n",[462,2950,2951,2954],{"class":464,"line":947},[462,2952,2953],{"class":472},"      ctx",[462,2955,503],{"class":476},[462,2957,2958,2961,2963,2965,2967,2969,2971,2973],{"class":464,"line":956},[462,2959,2960],{"class":472},"      orderId: TF",[462,2962,547],{"class":476},[462,2964,2844],{"class":472},[462,2966,2847],{"class":476},[462,2968,2850],{"class":493},[462,2970,497],{"class":476},[462,2972,2855],{"class":2650},[462,2974,2975],{"class":476},"}>,\n",[462,2977,2978,2981,2983,2986,2988,2991,2993,2995,2998,3000,3003],{"class":464,"line":998},[462,2979,2980],{"class":472},"      items: TF",[462,2982,547],{"class":476},[462,2984,2985],{"class":472},"FormattedArray",[462,2987,879],{"class":476},[462,2989,2990],{"class":472},"Item[]",[462,2992,617],{"class":476},[462,2994,589],{"class":476},[462,2996,2997],{"class":493},"maxItems",[462,2999,497],{"class":476},[462,3001,3002],{"class":2650}," 50",[462,3004,3005],{"class":476},"}>\n",[462,3007,3008,3011,3013,3015,3017,3020,3022],{"class":464,"line":1006},[462,3009,3010],{"class":472},"    )",[462,3012,497],{"class":476},[462,3014,1220],{"class":768},[462,3016,786],{"class":468},[462,3018,3019],{"class":472}," items",[462,3021,547],{"class":476},[462,3023,3024],{"class":472},"length\n",[462,3026,3027,3029],{"class":464,"line":1012},[462,3028,1015],{"class":472},[462,3030,503],{"class":476},[462,3032,3033],{"class":464,"line":1020},[462,3034,697],{"emptyLinePlaceholder":696},[462,3036,3037],{"class":464,"line":1362},[462,3038,3039],{"class":1186},"  \u002F\u002F a plain string has no maximum, so this route takes the adapter's number\n",[462,3041,3042,3045,3047,3049,3051,3053,3055,3057,3059,3061,3064,3066,3068,3070,3072,3074,3076,3078,3081],{"class":464,"line":1398},[462,3043,3044],{"class":493},"  search",[462,3046,497],{"class":476},[462,3048,746],{"class":472},[462,3050,547],{"class":476},[462,3052,434],{"class":480},[462,3054,484],{"class":472},[462,3056,484],{"class":476},[462,3058,758],{"class":757},[462,3060,617],{"class":476},[462,3062,3063],{"class":757}," text",[462,3065,497],{"class":476},[462,3067,769],{"class":768},[462,3069,781],{"class":476},[462,3071,1220],{"class":768},[462,3073,786],{"class":468},[462,3075,3063],{"class":472},[462,3077,547],{"class":476},[462,3079,3080],{"class":472},"length)",[462,3082,503],{"class":476},[462,3084,3085],{"class":464,"line":1416},[462,3086,697],{"emptyLinePlaceholder":696},[462,3088,3089],{"class":464,"line":1425},[462,3090,3091],{"class":1186},"  \u002F\u002F the route option wins over both\n",[462,3093,3095,3098,3100,3102,3104,3106,3108,3110,3112,3114,3117,3119,3121,3123,3125,3127,3129,3131,3134,3136],{"class":464,"line":3094},26,[462,3096,3097],{"class":493},"  upload",[462,3099,497],{"class":476},[462,3101,746],{"class":472},[462,3103,547],{"class":476},[462,3105,434],{"class":480},[462,3107,484],{"class":472},[462,3109,484],{"class":476},[462,3111,758],{"class":757},[462,3113,617],{"class":476},[462,3115,3116],{"class":757}," payload",[462,3118,497],{"class":476},[462,3120,769],{"class":768},[462,3122,781],{"class":476},[462,3124,1220],{"class":768},[462,3126,786],{"class":468},[462,3128,3116],{"class":472},[462,3130,547],{"class":476},[462,3132,3133],{"class":472},"length",[462,3135,617],{"class":476},[462,3137,735],{"class":476},[462,3139,3141,3144,3146,3149],{"class":464,"line":3140},27,[462,3142,3143],{"class":493},"    maxBodySize",[462,3145,497],{"class":476},[462,3147,3148],{"class":2650}," 512_000",[462,3150,503],{"class":476},[462,3152,3154,3156,3158],{"class":464,"line":3153},28,[462,3155,830],{"class":476},[462,3157,532],{"class":472},[462,3159,503],{"class":476},[462,3161,3163,3165,3167,3169],{"class":464,"line":3162},29,[462,3164,529],{"class":476},[462,3166,1025],{"class":585},[462,3168,620],{"class":768},[462,3170,535],{"class":476},[462,3172,3174],{"class":464,"line":3173},30,[462,3175,697],{"emptyLinePlaceholder":696},[462,3177,3179,3181,3183,3185,3187],{"class":464,"line":3178},31,[462,3180,1762],{"class":472},[462,3182,547],{"class":476},[462,3184,542],{"class":480},[462,3186,1769],{"class":472},[462,3188,535],{"class":476},[405,3190,3191],{},"The first limit that applies wins:",[3193,3194,3195,3208],"table",{},[3196,3197,3198],"thead",{},[3199,3200,3201,3205],"tr",{},[3202,3203,3204],"th",{},"Limit",[3202,3206,3207],{},"Used when",[3209,3210,3211,3223,3240],"tbody",{},[3199,3212,3213,3220],{},[3214,3215,3216,3219],"td",{},[428,3217,3218],{},"maxBodySize"," on the route",[3214,3221,3222],{},"You set it on the route options.",[3199,3224,3225,3228],{},[3214,3226,3227],{},"From the types",[3214,3229,3230,3231,3233,3234,3236,3237,3239],{},"Every parameter has a maximum, like a string with ",[428,3232,2850],{}," or an array, Set or Map with ",[428,3235,2997],{},". The limit is the largest valid JSON body, times ",[428,3238,2898],{}," (a router option, 2 by default).",[3199,3241,3242,3247],{},[3214,3243,3244,3246],{},[428,3245,3218],{}," on the platform adapter",[3214,3248,3249,3250,435,3253,435,3256,3259,3260,3263],{},"A parameter has no maximum, like a plain ",[428,3251,3252],{},"string",[428,3254,3255],{},"string[]",[428,3257,3258],{},"Map",", record or ",[428,3261,3262],{},"any",". 128 KB by default.",[537,3265,3266],{},"Give every parameter a maximum, so each route gets its own exact limit instead of the platform default.",[2389,3268,3269,3270,3273,3274,3277,3278,547],{},"Responses are not limited. To turn off limits from the types, set ",[428,3271,3272],{},"derivedPayloadLimits: false"," in the ",[428,3275,3276],{},"runTypes"," block of the Vite plugin or ",[428,3279,3280],{},"withMion",[420,3282,3284],{"id":3283},"platform-ceilings","Platform Ceilings",[405,3286,3287,3288,3291],{},"Some platforms refuse a request past their own ceiling before mion runs, and no route limit goes above it. Each platform page lists its ceiling, and the adapter's ",[428,3289,3290],{},"maxBodySizeCap"," option sets it.",[453,3293,3295],{"className":455,"code":3294,"language":457,"meta":458,"style":458},"import {createCloudflareHandler} from '@mionjs\u002Fplatform-cloudflare';\n\n\u002F\u002F a bigger plan allows more than the default ceiling\ncreateCloudflareHandler({maxBodySizeCap: 200_000_000});\n",[428,3296,3297,3319,3323,3328],{"__ignoreMap":458},[462,3298,3299,3301,3303,3306,3308,3310,3312,3315,3317],{"class":464,"line":465},[462,3300,586],{"class":585},[462,3302,589],{"class":476},[462,3304,3305],{"class":472},"createCloudflareHandler",[462,3307,529],{"class":476},[462,3309,597],{"class":585},[462,3311,514],{"class":476},[462,3313,3314],{"class":517},"@mionjs\u002Fplatform-cloudflare",[462,3316,521],{"class":476},[462,3318,535],{"class":476},[462,3320,3321],{"class":464,"line":490},[462,3322,697],{"emptyLinePlaceholder":696},[462,3324,3325],{"class":464,"line":506},[462,3326,3327],{"class":1186},"\u002F\u002F a bigger plan allows more than the default ceiling\n",[462,3329,3330,3332,3334,3336,3338,3340,3343,3345,3347],{"class":464,"line":526},[462,3331,3305],{"class":480},[462,3333,484],{"class":472},[462,3335,966],{"class":476},[462,3337,3290],{"class":493},[462,3339,497],{"class":476},[462,3341,3342],{"class":2650}," 200_000_000",[462,3344,529],{"class":476},[462,3346,532],{"class":472},[462,3348,535],{"class":476},[420,3350,3352],{"id":3351},"keeping-the-raw-body","Keeping the Raw Body",[405,3354,3355,3356,3359,3360,3363,3364,3366],{},"Once the body is parsed mion drops the raw text, so ",[428,3357,3358],{},"ctx.request.rawBody"," reads empty in your handlers. Set ",[428,3361,3362],{},"releaseRawBody: false"," in ",[428,3365,430],{}," to keep it, for an access log that records exactly what arrived.",[420,3368,3370],{"id":3369},"awaiting-every-step","Awaiting Every Step",[405,3372,3373,3374,3377],{},"mion awaits every middleware and route, even synchronous ones, so other requests can run between steps. Set ",[428,3375,3376],{},"alwaysAwait: false"," to skip the await on synchronous handlers: faster, but the slowest requests can get slower under load. A route whose middlewares and handler are all synchronous then answers with no promise (on Node.js and uWebSockets.js always, on Bun when the request has no body).",[453,3379,3381],{"className":455,"code":3380,"language":457,"meta":458,"style":458},"const mion = createMionRouter({alwaysAwait: false});\n",[428,3382,3383],{"__ignoreMap":458},[462,3384,3385,3387,3389,3391,3393,3395,3397,3400,3402,3404,3406,3408],{"class":464,"line":465},[462,3386,469],{"class":468},[462,3388,473],{"class":472},[462,3390,477],{"class":476},[462,3392,481],{"class":480},[462,3394,484],{"class":472},[462,3396,966],{"class":476},[462,3398,3399],{"class":493},"alwaysAwait",[462,3401,497],{"class":476},[462,3403,2725],{"class":2565},[462,3405,529],{"class":476},[462,3407,532],{"class":472},[462,3409,535],{"class":476},[3411,3412,3413],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .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 .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}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}","Learn how to define and register routes in mion APIs.","md",null,{"toc":24},{"title":32,"description":3414},"2-a-p1ER7BgweI6J52ODKWgDHJWglMPLoDB9MC0WJ_Q",1793324369105]