[{"data":1,"prerenderedAt":5116},["ShallowReactive",2],{"navigation_docs":3,"-rpc-devtools-linter":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":143,"body":401,"description":5110,"extension":5111,"links":5112,"meta":5113,"navigation":615,"path":144,"seo":5114,"stem":145,"__hash__":5115},"docs\u002F01.rpc\u002F07.devtools\u002F01.linter.md",{"type":402,"value":403,"toc":5095},"minimark",[404,416,419,424,440,514,526,530,558,562,578,641,652,656,666,746,750,755,761,1570,1577,1581,1598,2125,2128,2132,2142,2147,2153,2340,2345,2462,2467,2626,2634,2794,2799,3036,3040,3044,3192,3196,3304,3307,3311,3325,3373,3383,3386,3838,3841,4127,4129,4133,4153,4156,4488,4491,4699,4701,4705,4715,4724,4727,4842,4845,4910,4912,4916,4929,4932,4935,5014,5017,5091],[405,406,407,411,412,415],"p",{},[408,409,410],"code",{},"@mionjs\u002Fdevtools\u002Feslint"," is a lint plugin for OXlint and ESLint that catches mistakes in mion routes, middleware and types as you write them. It ships inside ",[408,413,414],{},"@mionjs\u002Fdevtools",".",[405,417,418],{},"The rules check your real types, the same way the build does. Every handler is checked, however you write it.",[420,421,423],"h2",{"id":422},"lint-rules","Lint Rules",[405,425,426,427,431,432,435,436,439],{},"The plugin has one rule per ",[428,429,430],"a",{"href":335},"level",", and each message starts with its name, like ",[408,433,434],{},"[rpc-handler-missing-return-type]",". The route checks below and the ",[428,437,438],{"href":257},"RunTypes checks"," both report through them.",[441,442,443,459],"table",{},[444,445,446],"thead",{},[447,448,449,453,456],"tr",{},[450,451,452],"th",{},"Rule",[450,454,455],{},"What it reports",[450,457,458],{},"Recommended",[460,461,462,476,488,501],"tbody",{},[447,463,464,470,473],{},[465,466,467],"td",{},[408,468,469],{},"mion\u002Ferror",[465,471,472],{},"Every Error: no code was made, so the build stops",[465,474,475],{},"✅ Error",[447,477,478,483,486],{},[465,479,480],{},[408,481,482],{},"mion\u002Fruntime-error",[465,484,485],{},"Every RuntimeError: the code throws when called, or no longer checks what you asked for, so the build stops",[465,487,475],{},[447,489,490,495,498],{},[465,491,492],{},[408,493,494],{},"mion\u002Fwarning",[465,496,497],{},"Every Warning, and every error you lowered",[465,499,500],{},"⚠️ Warn",[447,502,503,508,511],{},[465,504,505],{},[408,506,507],{},"mion\u002Finfo",[465,509,510],{},"Every Info message: documented behaviour or advice",[465,512,513],{},"Off",[515,516,517,518,521,522,525],"tip",{},"The four rules are the same in every app and cannot turn one check on or off. To allow one error, add a ",[408,519,520],{},"@mion-expect-error"," comment above it or list its name in ",[408,523,524],{},"downgradeErrors"," in your tsconfig: your editor and your build both follow it.",[420,527,529],{"id":528},"installing-the-plugin","Installing the Plugin",[531,532,537],"pre",{"className":533,"code":534,"language":535,"meta":536,"style":536},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install @mionjs\u002Fdevtools -D\n","bash","",[408,538,539],{"__ignoreMap":536},[540,541,544,548,552,555],"span",{"class":542,"line":543},"line",1,[540,545,547],{"class":546},"sBMFI","npm",[540,549,551],{"class":550},"sfazB"," install",[540,553,554],{"class":550}," @mionjs\u002Fdevtools",[540,556,557],{"class":550}," -D\n",[420,559,561],{"id":560},"recommended-config","Recommended Config",[405,563,564,565,568,569,572,573,577],{},"The recommended config turns on the four level rules. The plugin is ESM only, so ESLint needs its flat config (",[408,566,567],{},"eslint.config.js","), not ",[408,570,571],{},".eslintrc.json",". The ",[428,574,576],{"href":575},"\u002Fruntypes\u002Ftooling\u002Flinting#lint-plugin-setup","RunTypes linting page"," shows the OXlint config.",[531,579,583],{"className":580,"code":581,"filename":567,"language":582,"meta":536,"style":536},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import mion from '@mionjs\u002Fdevtools\u002Feslint';\n\nexport default [mion.configs.recommended];\n","js",[408,584,585,610,617],{"__ignoreMap":536},[540,586,587,591,595,598,602,604,607],{"class":542,"line":543},[540,588,590],{"class":589},"s7zQu","import",[540,592,594],{"class":593},"sTEyZ"," mion ",[540,596,597],{"class":589},"from",[540,599,601],{"class":600},"sMK4o"," '",[540,603,410],{"class":550},[540,605,606],{"class":600},"'",[540,608,609],{"class":600},";\n",[540,611,613],{"class":542,"line":612},2,[540,614,616],{"emptyLinePlaceholder":615},true,"\n",[540,618,620,623,626,629,631,634,636,639],{"class":542,"line":619},3,[540,621,622],{"class":589},"export",[540,624,625],{"class":589}," default",[540,627,628],{"class":593}," [mion",[540,630,415],{"class":600},[540,632,633],{"class":593},"configs",[540,635,415],{"class":600},[540,637,638],{"class":593},"recommended]",[540,640,609],{"class":600},[642,643,644,645,648,649,415],"note",{},"The rules find ",[408,646,647],{},"tsconfig.json"," the way tsc does, from the directory the linter runs in. Point them at another file\nwith ",[408,650,651],{},"settings: {mion: {tsconfig: 'tsconfig.lint.json'}}",[420,653,655],{"id":654},"showing-info-messages","Showing Info Messages",[405,657,658,659,662,663,665],{},"The linter hides Info messages, which mark code that works as documented: a method a validator skips,\na validator on a type you wrote as ",[408,660,661],{},"any",". Turn on ",[408,664,507],{}," to show them.",[531,667,669],{"className":580,"code":668,"filename":567,"language":582,"meta":536,"style":536},"import mion from '@mionjs\u002Fdevtools\u002Feslint';\n\nexport default [mion.configs.recommended, {rules: {'mion\u002Finfo': 'warn'}}];\n",[408,670,671,687,691],{"__ignoreMap":536},[540,672,673,675,677,679,681,683,685],{"class":542,"line":543},[540,674,590],{"class":589},[540,676,594],{"class":593},[540,678,597],{"class":589},[540,680,601],{"class":600},[540,682,410],{"class":550},[540,684,606],{"class":600},[540,686,609],{"class":600},[540,688,689],{"class":542,"line":612},[540,690,616],{"emptyLinePlaceholder":615},[540,692,693,695,697,699,701,703,705,708,711,714,718,721,723,725,727,729,731,733,736,738,741,744],{"class":542,"line":619},[540,694,622],{"class":589},[540,696,625],{"class":589},[540,698,628],{"class":593},[540,700,415],{"class":600},[540,702,633],{"class":593},[540,704,415],{"class":600},[540,706,707],{"class":593},"recommended",[540,709,710],{"class":600},",",[540,712,713],{"class":600}," {",[540,715,717],{"class":716},"swJcz","rules",[540,719,720],{"class":600},":",[540,722,713],{"class":600},[540,724,606],{"class":600},[540,726,507],{"class":716},[540,728,606],{"class":600},[540,730,720],{"class":600},[540,732,601],{"class":600},[540,734,735],{"class":550},"warn",[540,737,606],{"class":600},[540,739,740],{"class":600},"}}",[540,742,743],{"class":593},"]",[540,745,609],{"class":600},[420,747,749],{"id":748},"route-checks","Route Checks",[751,752,754],"h3",{"id":753},"public-drizzle-types","Public Drizzle Types",[405,756,757,760],{},[408,758,759],{},"drizzle-type-not-allowed"," warns when a written public parameter or return type uses a Drizzle ORM type.\nUse slim models or plain types, including nested results and selected fields.",[531,762,766],{"className":763,"code":764,"language":765,"meta":536,"style":536},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {eq} from 'drizzle-orm';\nimport {drizzle} from 'drizzle-orm\u002Fpg-proxy';\nimport {createMionRouter} from '@mionjs\u002Frouter';\nimport {toDrizzle} from '@mionjs\u002Fdrizzle-orm-pg-core\u002Fdrizzle';\nimport {schema} from '.\u002Fdrizzle-relations-example.ts';\nimport {\n  authors,\n  posts,\n  type Author,\n  type Post,\n  type AuthorWithPosts,\n} from '.\u002Fdrizzle-relations-schema-example.ts';\n\nconst authorsDb = toDrizzle(authors);\nconst postsDb = toDrizzle(posts);\nconst db = drizzle(async () => ({rows: []}), {schema});\n\nconst mion = createMionRouter();\n\nexport const blogApi = mion.initRoutes({\n  \u002F\u002F whole rows\n  listAuthors: mion.route(\n    async (): Promise\u003CAuthor[]> => db.select().from(authorsDb)\n  ),\n\n  \u002F\u002F selected model fields\n  authorNames: mion.route(\n    async (): Promise\u003CPick\u003CAuthor, 'id' | 'name'>[]> =>\n      db.select({id: authorsDb.id, name: authorsDb.name}).from(authorsDb)\n  ),\n\n  \u002F\u002F one model per joined table\n  postsWithAuthor: mion.route(\n    async (): Promise\u003C{post: Post; author: Author}[]> =>\n      db\n        .select({post: postsDb, author: authorsDb})\n        .from(postsDb)\n        .innerJoin(authorsDb, eq(postsDb.authorId, authorsDb.id))\n  ),\n\n  \u002F\u002F nested models\n  authorsWithPosts: mion.route(\n    async (): Promise\u003CAuthorWithPosts[]> =>\n      db.query.authors.findMany({with: {posts: true}})\n  ),\n});\n","ts",[408,767,768,792,814,836,859,882,890,899,907,918,928,938,954,959,981,998,1054,1059,1076,1081,1107,1114,1132,1175,1183,1188,1194,1210,1256,1304,1311,1316,1322,1338,1375,1381,1413,1423,1456,1463,1468,1474,1490,1510,1554,1561],{"__ignoreMap":536},[540,769,770,772,774,777,780,783,785,788,790],{"class":542,"line":543},[540,771,590],{"class":589},[540,773,713],{"class":600},[540,775,776],{"class":593},"eq",[540,778,779],{"class":600},"}",[540,781,782],{"class":589}," from",[540,784,601],{"class":600},[540,786,787],{"class":550},"drizzle-orm",[540,789,606],{"class":600},[540,791,609],{"class":600},[540,793,794,796,798,801,803,805,807,810,812],{"class":542,"line":612},[540,795,590],{"class":589},[540,797,713],{"class":600},[540,799,800],{"class":593},"drizzle",[540,802,779],{"class":600},[540,804,782],{"class":589},[540,806,601],{"class":600},[540,808,809],{"class":550},"drizzle-orm\u002Fpg-proxy",[540,811,606],{"class":600},[540,813,609],{"class":600},[540,815,816,818,820,823,825,827,829,832,834],{"class":542,"line":619},[540,817,590],{"class":589},[540,819,713],{"class":600},[540,821,822],{"class":593},"createMionRouter",[540,824,779],{"class":600},[540,826,782],{"class":589},[540,828,601],{"class":600},[540,830,831],{"class":550},"@mionjs\u002Frouter",[540,833,606],{"class":600},[540,835,609],{"class":600},[540,837,839,841,843,846,848,850,852,855,857],{"class":542,"line":838},4,[540,840,590],{"class":589},[540,842,713],{"class":600},[540,844,845],{"class":593},"toDrizzle",[540,847,779],{"class":600},[540,849,782],{"class":589},[540,851,601],{"class":600},[540,853,854],{"class":550},"@mionjs\u002Fdrizzle-orm-pg-core\u002Fdrizzle",[540,856,606],{"class":600},[540,858,609],{"class":600},[540,860,862,864,866,869,871,873,875,878,880],{"class":542,"line":861},5,[540,863,590],{"class":589},[540,865,713],{"class":600},[540,867,868],{"class":593},"schema",[540,870,779],{"class":600},[540,872,782],{"class":589},[540,874,601],{"class":600},[540,876,877],{"class":550},".\u002Fdrizzle-relations-example.ts",[540,879,606],{"class":600},[540,881,609],{"class":600},[540,883,885,887],{"class":542,"line":884},6,[540,886,590],{"class":589},[540,888,889],{"class":600}," {\n",[540,891,893,896],{"class":542,"line":892},7,[540,894,895],{"class":593},"  authors",[540,897,898],{"class":600},",\n",[540,900,902,905],{"class":542,"line":901},8,[540,903,904],{"class":593},"  posts",[540,906,898],{"class":600},[540,908,910,913,916],{"class":542,"line":909},9,[540,911,912],{"class":589},"  type",[540,914,915],{"class":593}," Author",[540,917,898],{"class":600},[540,919,921,923,926],{"class":542,"line":920},10,[540,922,912],{"class":589},[540,924,925],{"class":593}," Post",[540,927,898],{"class":600},[540,929,931,933,936],{"class":542,"line":930},11,[540,932,912],{"class":589},[540,934,935],{"class":593}," AuthorWithPosts",[540,937,898],{"class":600},[540,939,941,943,945,947,950,952],{"class":542,"line":940},12,[540,942,779],{"class":600},[540,944,782],{"class":589},[540,946,601],{"class":600},[540,948,949],{"class":550},".\u002Fdrizzle-relations-schema-example.ts",[540,951,606],{"class":600},[540,953,609],{"class":600},[540,955,957],{"class":542,"line":956},13,[540,958,616],{"emptyLinePlaceholder":615},[540,960,962,966,969,972,976,979],{"class":542,"line":961},14,[540,963,965],{"class":964},"spNyl","const",[540,967,968],{"class":593}," authorsDb ",[540,970,971],{"class":600},"=",[540,973,975],{"class":974},"s2Zo4"," toDrizzle",[540,977,978],{"class":593},"(authors)",[540,980,609],{"class":600},[540,982,984,986,989,991,993,996],{"class":542,"line":983},15,[540,985,965],{"class":964},[540,987,988],{"class":593}," postsDb ",[540,990,971],{"class":600},[540,992,975],{"class":974},[540,994,995],{"class":593},"(posts)",[540,997,609],{"class":600},[540,999,1001,1003,1006,1008,1011,1014,1017,1020,1023,1026,1029,1032,1034,1037,1039,1042,1044,1046,1048,1050,1052],{"class":542,"line":1000},16,[540,1002,965],{"class":964},[540,1004,1005],{"class":593}," db ",[540,1007,971],{"class":600},[540,1009,1010],{"class":974}," drizzle",[540,1012,1013],{"class":593},"(",[540,1015,1016],{"class":964},"async",[540,1018,1019],{"class":600}," ()",[540,1021,1022],{"class":964}," =>",[540,1024,1025],{"class":593}," (",[540,1027,1028],{"class":600},"{",[540,1030,1031],{"class":716},"rows",[540,1033,720],{"class":600},[540,1035,1036],{"class":593}," []",[540,1038,779],{"class":600},[540,1040,1041],{"class":593},")",[540,1043,710],{"class":600},[540,1045,713],{"class":600},[540,1047,868],{"class":593},[540,1049,779],{"class":600},[540,1051,1041],{"class":593},[540,1053,609],{"class":600},[540,1055,1057],{"class":542,"line":1056},17,[540,1058,616],{"emptyLinePlaceholder":615},[540,1060,1062,1064,1066,1068,1071,1074],{"class":542,"line":1061},18,[540,1063,965],{"class":964},[540,1065,594],{"class":593},[540,1067,971],{"class":600},[540,1069,1070],{"class":974}," createMionRouter",[540,1072,1073],{"class":593},"()",[540,1075,609],{"class":600},[540,1077,1079],{"class":542,"line":1078},19,[540,1080,616],{"emptyLinePlaceholder":615},[540,1082,1084,1086,1089,1092,1094,1097,1099,1102,1104],{"class":542,"line":1083},20,[540,1085,622],{"class":589},[540,1087,1088],{"class":964}," const",[540,1090,1091],{"class":593}," blogApi ",[540,1093,971],{"class":600},[540,1095,1096],{"class":593}," mion",[540,1098,415],{"class":600},[540,1100,1101],{"class":974},"initRoutes",[540,1103,1013],{"class":593},[540,1105,1106],{"class":600},"{\n",[540,1108,1110],{"class":542,"line":1109},21,[540,1111,1113],{"class":1112},"sHwdD","  \u002F\u002F whole rows\n",[540,1115,1117,1120,1122,1124,1126,1129],{"class":542,"line":1116},22,[540,1118,1119],{"class":716},"  listAuthors",[540,1121,720],{"class":600},[540,1123,1096],{"class":593},[540,1125,415],{"class":600},[540,1127,1128],{"class":974},"route",[540,1130,1131],{"class":593},"(\n",[540,1133,1135,1138,1141,1144,1147,1150,1153,1156,1158,1161,1163,1166,1168,1170,1172],{"class":542,"line":1134},23,[540,1136,1137],{"class":964},"    async",[540,1139,1140],{"class":600}," ():",[540,1142,1143],{"class":546}," Promise",[540,1145,1146],{"class":600},"\u003C",[540,1148,1149],{"class":546},"Author",[540,1151,1152],{"class":593},"[]",[540,1154,1155],{"class":600},">",[540,1157,1022],{"class":964},[540,1159,1160],{"class":593}," db",[540,1162,415],{"class":600},[540,1164,1165],{"class":974},"select",[540,1167,1073],{"class":593},[540,1169,415],{"class":600},[540,1171,597],{"class":974},[540,1173,1174],{"class":593},"(authorsDb)\n",[540,1176,1178,1181],{"class":542,"line":1177},24,[540,1179,1180],{"class":593},"  )",[540,1182,898],{"class":600},[540,1184,1186],{"class":542,"line":1185},25,[540,1187,616],{"emptyLinePlaceholder":615},[540,1189,1191],{"class":542,"line":1190},26,[540,1192,1193],{"class":1112},"  \u002F\u002F selected model fields\n",[540,1195,1197,1200,1202,1204,1206,1208],{"class":542,"line":1196},27,[540,1198,1199],{"class":716},"  authorNames",[540,1201,720],{"class":600},[540,1203,1096],{"class":593},[540,1205,415],{"class":600},[540,1207,1128],{"class":974},[540,1209,1131],{"class":593},[540,1211,1213,1215,1217,1219,1221,1224,1226,1228,1230,1232,1235,1237,1240,1242,1245,1247,1249,1251,1253],{"class":542,"line":1212},28,[540,1214,1137],{"class":964},[540,1216,1140],{"class":600},[540,1218,1143],{"class":546},[540,1220,1146],{"class":600},[540,1222,1223],{"class":546},"Pick",[540,1225,1146],{"class":600},[540,1227,1149],{"class":546},[540,1229,710],{"class":600},[540,1231,601],{"class":600},[540,1233,1234],{"class":550},"id",[540,1236,606],{"class":600},[540,1238,1239],{"class":600}," |",[540,1241,601],{"class":600},[540,1243,1244],{"class":550},"name",[540,1246,606],{"class":600},[540,1248,1155],{"class":600},[540,1250,1152],{"class":593},[540,1252,1155],{"class":600},[540,1254,1255],{"class":964}," =>\n",[540,1257,1259,1262,1264,1266,1268,1270,1272,1274,1277,1279,1281,1283,1286,1288,1290,1292,1294,1296,1298,1300,1302],{"class":542,"line":1258},29,[540,1260,1261],{"class":593},"      db",[540,1263,415],{"class":600},[540,1265,1165],{"class":974},[540,1267,1013],{"class":593},[540,1269,1028],{"class":600},[540,1271,1234],{"class":716},[540,1273,720],{"class":600},[540,1275,1276],{"class":593}," authorsDb",[540,1278,415],{"class":600},[540,1280,1234],{"class":593},[540,1282,710],{"class":600},[540,1284,1285],{"class":716}," name",[540,1287,720],{"class":600},[540,1289,1276],{"class":593},[540,1291,415],{"class":600},[540,1293,1244],{"class":593},[540,1295,779],{"class":600},[540,1297,1041],{"class":593},[540,1299,415],{"class":600},[540,1301,597],{"class":974},[540,1303,1174],{"class":593},[540,1305,1307,1309],{"class":542,"line":1306},30,[540,1308,1180],{"class":593},[540,1310,898],{"class":600},[540,1312,1314],{"class":542,"line":1313},31,[540,1315,616],{"emptyLinePlaceholder":615},[540,1317,1319],{"class":542,"line":1318},32,[540,1320,1321],{"class":1112},"  \u002F\u002F one model per joined table\n",[540,1323,1325,1328,1330,1332,1334,1336],{"class":542,"line":1324},33,[540,1326,1327],{"class":716},"  postsWithAuthor",[540,1329,720],{"class":600},[540,1331,1096],{"class":593},[540,1333,415],{"class":600},[540,1335,1128],{"class":974},[540,1337,1131],{"class":593},[540,1339,1341,1343,1345,1347,1350,1353,1355,1357,1360,1363,1365,1367,1369,1371,1373],{"class":542,"line":1340},34,[540,1342,1137],{"class":964},[540,1344,1140],{"class":600},[540,1346,1143],{"class":546},[540,1348,1349],{"class":600},"\u003C{",[540,1351,1352],{"class":716},"post",[540,1354,720],{"class":600},[540,1356,925],{"class":546},[540,1358,1359],{"class":600},";",[540,1361,1362],{"class":716}," author",[540,1364,720],{"class":600},[540,1366,915],{"class":546},[540,1368,779],{"class":600},[540,1370,1152],{"class":593},[540,1372,1155],{"class":600},[540,1374,1255],{"class":964},[540,1376,1378],{"class":542,"line":1377},35,[540,1379,1380],{"class":593},"      db\n",[540,1382,1384,1387,1389,1391,1393,1395,1397,1400,1402,1404,1406,1408,1410],{"class":542,"line":1383},36,[540,1385,1386],{"class":600},"        .",[540,1388,1165],{"class":974},[540,1390,1013],{"class":593},[540,1392,1028],{"class":600},[540,1394,1352],{"class":716},[540,1396,720],{"class":600},[540,1398,1399],{"class":593}," postsDb",[540,1401,710],{"class":600},[540,1403,1362],{"class":716},[540,1405,720],{"class":600},[540,1407,1276],{"class":593},[540,1409,779],{"class":600},[540,1411,1412],{"class":593},")\n",[540,1414,1416,1418,1420],{"class":542,"line":1415},37,[540,1417,1386],{"class":600},[540,1419,597],{"class":974},[540,1421,1422],{"class":593},"(postsDb)\n",[540,1424,1426,1428,1431,1434,1436,1439,1442,1444,1447,1449,1451,1453],{"class":542,"line":1425},38,[540,1427,1386],{"class":600},[540,1429,1430],{"class":974},"innerJoin",[540,1432,1433],{"class":593},"(authorsDb",[540,1435,710],{"class":600},[540,1437,1438],{"class":974}," eq",[540,1440,1441],{"class":593},"(postsDb",[540,1443,415],{"class":600},[540,1445,1446],{"class":593},"authorId",[540,1448,710],{"class":600},[540,1450,1276],{"class":593},[540,1452,415],{"class":600},[540,1454,1455],{"class":593},"id))\n",[540,1457,1459,1461],{"class":542,"line":1458},39,[540,1460,1180],{"class":593},[540,1462,898],{"class":600},[540,1464,1466],{"class":542,"line":1465},40,[540,1467,616],{"emptyLinePlaceholder":615},[540,1469,1471],{"class":542,"line":1470},41,[540,1472,1473],{"class":1112},"  \u002F\u002F nested models\n",[540,1475,1477,1480,1482,1484,1486,1488],{"class":542,"line":1476},42,[540,1478,1479],{"class":716},"  authorsWithPosts",[540,1481,720],{"class":600},[540,1483,1096],{"class":593},[540,1485,415],{"class":600},[540,1487,1128],{"class":974},[540,1489,1131],{"class":593},[540,1491,1493,1495,1497,1499,1501,1504,1506,1508],{"class":542,"line":1492},43,[540,1494,1137],{"class":964},[540,1496,1140],{"class":600},[540,1498,1143],{"class":546},[540,1500,1146],{"class":600},[540,1502,1503],{"class":546},"AuthorWithPosts",[540,1505,1152],{"class":593},[540,1507,1155],{"class":600},[540,1509,1255],{"class":964},[540,1511,1513,1515,1517,1520,1522,1525,1527,1530,1532,1534,1537,1539,1541,1544,1546,1550,1552],{"class":542,"line":1512},44,[540,1514,1261],{"class":593},[540,1516,415],{"class":600},[540,1518,1519],{"class":593},"query",[540,1521,415],{"class":600},[540,1523,1524],{"class":593},"authors",[540,1526,415],{"class":600},[540,1528,1529],{"class":974},"findMany",[540,1531,1013],{"class":593},[540,1533,1028],{"class":600},[540,1535,1536],{"class":716},"with",[540,1538,720],{"class":600},[540,1540,713],{"class":600},[540,1542,1543],{"class":716},"posts",[540,1545,720],{"class":600},[540,1547,1549],{"class":1548},"sfNiH"," true",[540,1551,740],{"class":600},[540,1553,1412],{"class":593},[540,1555,1557,1559],{"class":542,"line":1556},45,[540,1558,1180],{"class":593},[540,1560,898],{"class":600},[540,1562,1564,1566,1568],{"class":542,"line":1563},46,[540,1565,779],{"class":600},[540,1567,1041],{"class":593},[540,1569,609],{"class":600},[642,1571,1572,1573,1576],{},"Your handler body can use Drizzle queries and types; this rule currently skips context parameters.\nAn inferred Drizzle database in ",[408,1574,1575],{},"contextDataFactory"," can slow client type checking, even when public types are slim.",[751,1578,1580],{"id":1579},"separating-database-code","Separating Database Code",[405,1582,1583,1586,1587,1589,1590,1592,1593,1597],{},[408,1584,1585],{},"drizzle-mixed-types"," reports a RuntimeError when a file defining slim tables or models imports Drizzle or ",[408,1588,845],{},".\nKeep them in one file, and ",[408,1591,845],{},", connections, relations and queries in a companion file.\nClients then type-check and bundle only the models, never your database code (",[428,1594,1596],{"href":1595},"\u002Fruntypes\u002Fdrizzle-orm\u002Fdrizzle-overview#organising-schema-and-database-files","measured",").",[531,1599,1601],{"className":763,"code":1600,"language":765,"meta":536,"style":536},"import * as DZ from '@mionjs\u002Fdrizzle-orm-pg-core';\nimport {tableRef, type InferSelectModel} from '@mionjs\u002Fdrizzle-orm';\n\nexport const authors = DZ.pgTable('authors', {\n  id: DZ.uuid('id', {defaultRandom: true, primaryKey: true}),\n  name: DZ.varchar('name', {length: 100, notNull: true}),\n});\n\nexport const posts = DZ.pgTable('posts', {\n  id: DZ.uuid('id', {defaultRandom: true, primaryKey: true}),\n  authorId: DZ.uuid('author_id', {\n    notNull: true,\n    references: [() => tableRef(authors, 'id'), {onDelete: 'cascade'}],\n  }),\n  title: DZ.varchar('title', {length: 200, notNull: true}),\n});\n\n\u002F\u002F route and client models\nexport type Author = InferSelectModel\u003Ctypeof authors>;\nexport type Post = InferSelectModel\u003Ctypeof posts>;\n\n\u002F\u002F start-nested-model\nexport interface AuthorWithPosts extends Author {\n  posts: Post[];\n}\n\u002F\u002F end-nested-model\n",[408,1602,1603,1627,1657,1661,1692,1740,1790,1798,1802,1831,1875,1901,1912,1964,1973,2020,2028,2032,2037,2059,2078,2082,2087,2103,2115,2120],{"__ignoreMap":536},[540,1604,1605,1607,1610,1613,1616,1618,1620,1623,1625],{"class":542,"line":543},[540,1606,590],{"class":589},[540,1608,1609],{"class":600}," *",[540,1611,1612],{"class":589}," as",[540,1614,1615],{"class":593}," DZ ",[540,1617,597],{"class":589},[540,1619,601],{"class":600},[540,1621,1622],{"class":550},"@mionjs\u002Fdrizzle-orm-pg-core",[540,1624,606],{"class":600},[540,1626,609],{"class":600},[540,1628,1629,1631,1633,1636,1638,1641,1644,1646,1648,1650,1653,1655],{"class":542,"line":612},[540,1630,590],{"class":589},[540,1632,713],{"class":600},[540,1634,1635],{"class":593},"tableRef",[540,1637,710],{"class":600},[540,1639,1640],{"class":589}," type",[540,1642,1643],{"class":593}," InferSelectModel",[540,1645,779],{"class":600},[540,1647,782],{"class":589},[540,1649,601],{"class":600},[540,1651,1652],{"class":550},"@mionjs\u002Fdrizzle-orm",[540,1654,606],{"class":600},[540,1656,609],{"class":600},[540,1658,1659],{"class":542,"line":619},[540,1660,616],{"emptyLinePlaceholder":615},[540,1662,1663,1665,1667,1670,1672,1675,1677,1680,1682,1684,1686,1688,1690],{"class":542,"line":838},[540,1664,622],{"class":589},[540,1666,1088],{"class":964},[540,1668,1669],{"class":593}," authors ",[540,1671,971],{"class":600},[540,1673,1674],{"class":593}," DZ",[540,1676,415],{"class":600},[540,1678,1679],{"class":974},"pgTable",[540,1681,1013],{"class":593},[540,1683,606],{"class":600},[540,1685,1524],{"class":550},[540,1687,606],{"class":600},[540,1689,710],{"class":600},[540,1691,889],{"class":600},[540,1693,1694,1697,1699,1701,1703,1706,1708,1710,1712,1714,1716,1718,1721,1723,1725,1727,1730,1732,1734,1736,1738],{"class":542,"line":861},[540,1695,1696],{"class":716},"  id",[540,1698,720],{"class":600},[540,1700,1674],{"class":593},[540,1702,415],{"class":600},[540,1704,1705],{"class":974},"uuid",[540,1707,1013],{"class":593},[540,1709,606],{"class":600},[540,1711,1234],{"class":550},[540,1713,606],{"class":600},[540,1715,710],{"class":600},[540,1717,713],{"class":600},[540,1719,1720],{"class":716},"defaultRandom",[540,1722,720],{"class":600},[540,1724,1549],{"class":1548},[540,1726,710],{"class":600},[540,1728,1729],{"class":716}," primaryKey",[540,1731,720],{"class":600},[540,1733,1549],{"class":1548},[540,1735,779],{"class":600},[540,1737,1041],{"class":593},[540,1739,898],{"class":600},[540,1741,1742,1745,1747,1749,1751,1754,1756,1758,1760,1762,1764,1766,1769,1771,1775,1777,1780,1782,1784,1786,1788],{"class":542,"line":884},[540,1743,1744],{"class":716},"  name",[540,1746,720],{"class":600},[540,1748,1674],{"class":593},[540,1750,415],{"class":600},[540,1752,1753],{"class":974},"varchar",[540,1755,1013],{"class":593},[540,1757,606],{"class":600},[540,1759,1244],{"class":550},[540,1761,606],{"class":600},[540,1763,710],{"class":600},[540,1765,713],{"class":600},[540,1767,1768],{"class":716},"length",[540,1770,720],{"class":600},[540,1772,1774],{"class":1773},"sbssI"," 100",[540,1776,710],{"class":600},[540,1778,1779],{"class":716}," notNull",[540,1781,720],{"class":600},[540,1783,1549],{"class":1548},[540,1785,779],{"class":600},[540,1787,1041],{"class":593},[540,1789,898],{"class":600},[540,1791,1792,1794,1796],{"class":542,"line":892},[540,1793,779],{"class":600},[540,1795,1041],{"class":593},[540,1797,609],{"class":600},[540,1799,1800],{"class":542,"line":901},[540,1801,616],{"emptyLinePlaceholder":615},[540,1803,1804,1806,1808,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829],{"class":542,"line":909},[540,1805,622],{"class":589},[540,1807,1088],{"class":964},[540,1809,1810],{"class":593}," posts ",[540,1812,971],{"class":600},[540,1814,1674],{"class":593},[540,1816,415],{"class":600},[540,1818,1679],{"class":974},[540,1820,1013],{"class":593},[540,1822,606],{"class":600},[540,1824,1543],{"class":550},[540,1826,606],{"class":600},[540,1828,710],{"class":600},[540,1830,889],{"class":600},[540,1832,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865,1867,1869,1871,1873],{"class":542,"line":920},[540,1834,1696],{"class":716},[540,1836,720],{"class":600},[540,1838,1674],{"class":593},[540,1840,415],{"class":600},[540,1842,1705],{"class":974},[540,1844,1013],{"class":593},[540,1846,606],{"class":600},[540,1848,1234],{"class":550},[540,1850,606],{"class":600},[540,1852,710],{"class":600},[540,1854,713],{"class":600},[540,1856,1720],{"class":716},[540,1858,720],{"class":600},[540,1860,1549],{"class":1548},[540,1862,710],{"class":600},[540,1864,1729],{"class":716},[540,1866,720],{"class":600},[540,1868,1549],{"class":1548},[540,1870,779],{"class":600},[540,1872,1041],{"class":593},[540,1874,898],{"class":600},[540,1876,1877,1880,1882,1884,1886,1888,1890,1892,1895,1897,1899],{"class":542,"line":930},[540,1878,1879],{"class":716},"  authorId",[540,1881,720],{"class":600},[540,1883,1674],{"class":593},[540,1885,415],{"class":600},[540,1887,1705],{"class":974},[540,1889,1013],{"class":593},[540,1891,606],{"class":600},[540,1893,1894],{"class":550},"author_id",[540,1896,606],{"class":600},[540,1898,710],{"class":600},[540,1900,889],{"class":600},[540,1902,1903,1906,1908,1910],{"class":542,"line":940},[540,1904,1905],{"class":716},"    notNull",[540,1907,720],{"class":600},[540,1909,1549],{"class":1548},[540,1911,898],{"class":600},[540,1913,1914,1917,1919,1922,1924,1926,1929,1932,1934,1936,1938,1940,1942,1944,1946,1949,1951,1953,1956,1958,1960,1962],{"class":542,"line":956},[540,1915,1916],{"class":716},"    references",[540,1918,720],{"class":600},[540,1920,1921],{"class":593}," [",[540,1923,1073],{"class":600},[540,1925,1022],{"class":964},[540,1927,1928],{"class":974}," tableRef",[540,1930,1931],{"class":593},"(authors",[540,1933,710],{"class":600},[540,1935,601],{"class":600},[540,1937,1234],{"class":550},[540,1939,606],{"class":600},[540,1941,1041],{"class":593},[540,1943,710],{"class":600},[540,1945,713],{"class":600},[540,1947,1948],{"class":716},"onDelete",[540,1950,720],{"class":600},[540,1952,601],{"class":600},[540,1954,1955],{"class":550},"cascade",[540,1957,606],{"class":600},[540,1959,779],{"class":600},[540,1961,743],{"class":593},[540,1963,898],{"class":600},[540,1965,1966,1969,1971],{"class":542,"line":961},[540,1967,1968],{"class":600},"  }",[540,1970,1041],{"class":593},[540,1972,898],{"class":600},[540,1974,1975,1978,1980,1982,1984,1986,1988,1990,1993,1995,1997,1999,2001,2003,2006,2008,2010,2012,2014,2016,2018],{"class":542,"line":983},[540,1976,1977],{"class":716},"  title",[540,1979,720],{"class":600},[540,1981,1674],{"class":593},[540,1983,415],{"class":600},[540,1985,1753],{"class":974},[540,1987,1013],{"class":593},[540,1989,606],{"class":600},[540,1991,1992],{"class":550},"title",[540,1994,606],{"class":600},[540,1996,710],{"class":600},[540,1998,713],{"class":600},[540,2000,1768],{"class":716},[540,2002,720],{"class":600},[540,2004,2005],{"class":1773}," 200",[540,2007,710],{"class":600},[540,2009,1779],{"class":716},[540,2011,720],{"class":600},[540,2013,1549],{"class":1548},[540,2015,779],{"class":600},[540,2017,1041],{"class":593},[540,2019,898],{"class":600},[540,2021,2022,2024,2026],{"class":542,"line":1000},[540,2023,779],{"class":600},[540,2025,1041],{"class":593},[540,2027,609],{"class":600},[540,2029,2030],{"class":542,"line":1056},[540,2031,616],{"emptyLinePlaceholder":615},[540,2033,2034],{"class":542,"line":1061},[540,2035,2036],{"class":1112},"\u002F\u002F route and client models\n",[540,2038,2039,2041,2043,2045,2048,2050,2053,2056],{"class":542,"line":1078},[540,2040,622],{"class":589},[540,2042,1640],{"class":964},[540,2044,915],{"class":546},[540,2046,2047],{"class":600}," =",[540,2049,1643],{"class":546},[540,2051,2052],{"class":600},"\u003Ctypeof",[540,2054,2055],{"class":593}," authors",[540,2057,2058],{"class":600},">;\n",[540,2060,2061,2063,2065,2067,2069,2071,2073,2076],{"class":542,"line":1083},[540,2062,622],{"class":589},[540,2064,1640],{"class":964},[540,2066,925],{"class":546},[540,2068,2047],{"class":600},[540,2070,1643],{"class":546},[540,2072,2052],{"class":600},[540,2074,2075],{"class":593}," posts",[540,2077,2058],{"class":600},[540,2079,2080],{"class":542,"line":1109},[540,2081,616],{"emptyLinePlaceholder":615},[540,2083,2084],{"class":542,"line":1116},[540,2085,2086],{"class":1112},"\u002F\u002F start-nested-model\n",[540,2088,2089,2091,2094,2096,2099,2101],{"class":542,"line":1134},[540,2090,622],{"class":589},[540,2092,2093],{"class":964}," interface",[540,2095,935],{"class":546},[540,2097,2098],{"class":964}," extends",[540,2100,915],{"class":546},[540,2102,889],{"class":600},[540,2104,2105,2107,2109,2111,2113],{"class":542,"line":1177},[540,2106,904],{"class":716},[540,2108,720],{"class":600},[540,2110,925],{"class":546},[540,2112,1152],{"class":593},[540,2114,609],{"class":600},[540,2116,2117],{"class":542,"line":1185},[540,2118,2119],{"class":600},"}\n",[540,2121,2122],{"class":542,"line":1190},[540,2123,2124],{"class":1112},"\u002F\u002F end-nested-model\n",[515,2126,2127],{},"Router and query files may import slim models and Drizzle unless they define slim schemas or models.",[751,2129,2131],{"id":2130},"typed-handlers","Typed Handlers",[405,2133,2134,2137,2138,2141],{},[408,2135,2136],{},"rpc-handler-missing-return-type"," and ",[408,2139,2140],{},"rpc-handler-missing-param-type"," report a route or middleware handler without explicit return or parameter types. mion builds validation and the JSON round trip from those types, so without them it cannot check incoming data or encode responses. Only the call context needs no type, since it is never sent over the network.",[2143,2144,2146],"h4",{"id":2145},"valid-examples","✅ Valid Examples",[405,2148,2149],{},[2150,2151,2152],"strong",{},"Inline handlers:",[531,2154,2156],{"className":763,"code":2155,"language":765,"meta":536,"style":536},"mion.route((ctx, name: string): string => `hello ${name}`);\nmion.middleware((ctx, data: number): void => {\n  console.log(data);\n});\nmion.headersMiddleware(\n  (ctx: CallContext, {headers}: HeadersSubset\u003C'x-trace-id'>): void => {\n    \u002F\u002F do something\n  }\n);\n",[408,2157,2158,2209,2243,2262,2270,2281,2324,2329,2334],{"__ignoreMap":536},[540,2159,2160,2163,2165,2167,2169,2171,2175,2177,2179,2181,2184,2187,2189,2191,2194,2197,2200,2202,2205,2207],{"class":542,"line":543},[540,2161,2162],{"class":593},"mion",[540,2164,415],{"class":600},[540,2166,1128],{"class":974},[540,2168,1013],{"class":593},[540,2170,1013],{"class":600},[540,2172,2174],{"class":2173},"sHdIc","ctx",[540,2176,710],{"class":600},[540,2178,1285],{"class":2173},[540,2180,720],{"class":600},[540,2182,2183],{"class":546}," string",[540,2185,2186],{"class":600},"):",[540,2188,2183],{"class":546},[540,2190,1022],{"class":964},[540,2192,2193],{"class":600}," `",[540,2195,2196],{"class":550},"hello ",[540,2198,2199],{"class":600},"${",[540,2201,1244],{"class":593},[540,2203,2204],{"class":600},"}`",[540,2206,1041],{"class":593},[540,2208,609],{"class":600},[540,2210,2211,2213,2215,2218,2220,2222,2224,2226,2229,2231,2234,2236,2239,2241],{"class":542,"line":612},[540,2212,2162],{"class":593},[540,2214,415],{"class":600},[540,2216,2217],{"class":974},"middleware",[540,2219,1013],{"class":593},[540,2221,1013],{"class":600},[540,2223,2174],{"class":2173},[540,2225,710],{"class":600},[540,2227,2228],{"class":2173}," data",[540,2230,720],{"class":600},[540,2232,2233],{"class":546}," number",[540,2235,2186],{"class":600},[540,2237,2238],{"class":546}," void",[540,2240,1022],{"class":964},[540,2242,889],{"class":600},[540,2244,2245,2248,2250,2253,2255,2258,2260],{"class":542,"line":619},[540,2246,2247],{"class":593},"  console",[540,2249,415],{"class":600},[540,2251,2252],{"class":974},"log",[540,2254,1013],{"class":716},[540,2256,2257],{"class":593},"data",[540,2259,1041],{"class":716},[540,2261,609],{"class":600},[540,2263,2264,2266,2268],{"class":542,"line":838},[540,2265,779],{"class":600},[540,2267,1041],{"class":593},[540,2269,609],{"class":600},[540,2271,2272,2274,2276,2279],{"class":542,"line":861},[540,2273,2162],{"class":593},[540,2275,415],{"class":600},[540,2277,2278],{"class":974},"headersMiddleware",[540,2280,1131],{"class":593},[540,2282,2283,2286,2288,2290,2293,2295,2297,2300,2303,2306,2308,2310,2313,2315,2318,2320,2322],{"class":542,"line":884},[540,2284,2285],{"class":600},"  (",[540,2287,2174],{"class":2173},[540,2289,720],{"class":600},[540,2291,2292],{"class":546}," CallContext",[540,2294,710],{"class":600},[540,2296,713],{"class":600},[540,2298,2299],{"class":2173},"headers",[540,2301,2302],{"class":600},"}:",[540,2304,2305],{"class":546}," HeadersSubset",[540,2307,1146],{"class":600},[540,2309,606],{"class":600},[540,2311,2312],{"class":550},"x-trace-id",[540,2314,606],{"class":600},[540,2316,2317],{"class":600},">):",[540,2319,2238],{"class":546},[540,2321,1022],{"class":964},[540,2323,889],{"class":600},[540,2325,2326],{"class":542,"line":892},[540,2327,2328],{"class":1112},"    \u002F\u002F do something\n",[540,2330,2331],{"class":542,"line":901},[540,2332,2333],{"class":600},"  }\n",[540,2335,2336,2338],{"class":542,"line":909},[540,2337,1041],{"class":593},[540,2339,609],{"class":600},[405,2341,2342],{},[2150,2343,2344],{},"Function references:",[531,2346,2348],{"className":763,"code":2347,"language":765,"meta":536,"style":536},"function validHandler(ctx, name: string): string {\n  return `hello ${name}`;\n}\nconst validArrowHandler = (ctx, name: string): string => `hello ${name}`;\nmion.route(validHandler);\nmion.route(validArrowHandler);\n",[408,2349,2350,2376,2393,2397,2436,2449],{"__ignoreMap":536},[540,2351,2352,2355,2358,2360,2362,2364,2366,2368,2370,2372,2374],{"class":542,"line":543},[540,2353,2354],{"class":964},"function",[540,2356,2357],{"class":974}," validHandler",[540,2359,1013],{"class":600},[540,2361,2174],{"class":2173},[540,2363,710],{"class":600},[540,2365,1285],{"class":2173},[540,2367,720],{"class":600},[540,2369,2183],{"class":546},[540,2371,2186],{"class":600},[540,2373,2183],{"class":546},[540,2375,889],{"class":600},[540,2377,2378,2381,2383,2385,2387,2389,2391],{"class":542,"line":612},[540,2379,2380],{"class":589},"  return",[540,2382,2193],{"class":600},[540,2384,2196],{"class":550},[540,2386,2199],{"class":600},[540,2388,1244],{"class":593},[540,2390,2204],{"class":600},[540,2392,609],{"class":600},[540,2394,2395],{"class":542,"line":619},[540,2396,2119],{"class":600},[540,2398,2399,2401,2404,2406,2408,2410,2412,2414,2416,2418,2420,2422,2424,2426,2428,2430,2432,2434],{"class":542,"line":838},[540,2400,965],{"class":964},[540,2402,2403],{"class":593}," validArrowHandler ",[540,2405,971],{"class":600},[540,2407,1025],{"class":600},[540,2409,2174],{"class":2173},[540,2411,710],{"class":600},[540,2413,1285],{"class":2173},[540,2415,720],{"class":600},[540,2417,2183],{"class":546},[540,2419,2186],{"class":600},[540,2421,2183],{"class":546},[540,2423,1022],{"class":964},[540,2425,2193],{"class":600},[540,2427,2196],{"class":550},[540,2429,2199],{"class":600},[540,2431,1244],{"class":593},[540,2433,2204],{"class":600},[540,2435,609],{"class":600},[540,2437,2438,2440,2442,2444,2447],{"class":542,"line":861},[540,2439,2162],{"class":593},[540,2441,415],{"class":600},[540,2443,1128],{"class":974},[540,2445,2446],{"class":593},"(validHandler)",[540,2448,609],{"class":600},[540,2450,2451,2453,2455,2457,2460],{"class":542,"line":884},[540,2452,2162],{"class":593},[540,2454,415],{"class":600},[540,2456,1128],{"class":974},[540,2458,2459],{"class":593},"(validArrowHandler)",[540,2461,609],{"class":600},[405,2463,2464],{},[2150,2465,2466],{},"Type annotations:",[531,2468,2470],{"className":763,"code":2469,"language":765,"meta":536,"style":536},"const typedHandler: Handler = (ctx, name: string): string => `hello ${name}`;\nconst typedHeaderHandler: HeaderHandler = (\n  ctx: CallContext,\n  {headers}: HeadersSubset\u003C'x-trace-id'>\n): void => {\n  const traceId = headers['x-trace-id'];\n  console.log(traceId);\n};\n",[408,2471,2472,2516,2533,2544,2566,2578,2604,2621],{"__ignoreMap":536},[540,2473,2474,2476,2479,2481,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510,2512,2514],{"class":542,"line":543},[540,2475,965],{"class":964},[540,2477,2478],{"class":593}," typedHandler",[540,2480,720],{"class":600},[540,2482,2483],{"class":546}," Handler",[540,2485,2047],{"class":600},[540,2487,1025],{"class":600},[540,2489,2174],{"class":2173},[540,2491,710],{"class":600},[540,2493,1285],{"class":2173},[540,2495,720],{"class":600},[540,2497,2183],{"class":546},[540,2499,2186],{"class":600},[540,2501,2183],{"class":546},[540,2503,1022],{"class":964},[540,2505,2193],{"class":600},[540,2507,2196],{"class":550},[540,2509,2199],{"class":600},[540,2511,1244],{"class":593},[540,2513,2204],{"class":600},[540,2515,609],{"class":600},[540,2517,2518,2520,2523,2525,2528,2530],{"class":542,"line":612},[540,2519,965],{"class":964},[540,2521,2522],{"class":593}," typedHeaderHandler",[540,2524,720],{"class":600},[540,2526,2527],{"class":546}," HeaderHandler",[540,2529,2047],{"class":600},[540,2531,2532],{"class":593}," (\n",[540,2534,2535,2538,2540,2542],{"class":542,"line":619},[540,2536,2537],{"class":2173},"  ctx",[540,2539,720],{"class":600},[540,2541,2292],{"class":546},[540,2543,898],{"class":600},[540,2545,2546,2549,2551,2553,2555,2557,2559,2561,2563],{"class":542,"line":838},[540,2547,2548],{"class":600},"  {",[540,2550,2299],{"class":2173},[540,2552,2302],{"class":600},[540,2554,2305],{"class":546},[540,2556,1146],{"class":600},[540,2558,606],{"class":600},[540,2560,2312],{"class":550},[540,2562,606],{"class":600},[540,2564,2565],{"class":600},">\n",[540,2567,2568,2570,2572,2574,2576],{"class":542,"line":861},[540,2569,1041],{"class":593},[540,2571,720],{"class":600},[540,2573,2238],{"class":546},[540,2575,1022],{"class":964},[540,2577,889],{"class":600},[540,2579,2580,2583,2586,2588,2591,2594,2596,2598,2600,2602],{"class":542,"line":884},[540,2581,2582],{"class":964},"  const",[540,2584,2585],{"class":593}," traceId",[540,2587,2047],{"class":600},[540,2589,2590],{"class":593}," headers",[540,2592,2593],{"class":716},"[",[540,2595,606],{"class":600},[540,2597,2312],{"class":550},[540,2599,606],{"class":600},[540,2601,743],{"class":716},[540,2603,609],{"class":600},[540,2605,2606,2608,2610,2612,2614,2617,2619],{"class":542,"line":892},[540,2607,2247],{"class":593},[540,2609,415],{"class":600},[540,2611,2252],{"class":974},[540,2613,1013],{"class":716},[540,2615,2616],{"class":593},"traceId",[540,2618,1041],{"class":716},[540,2620,609],{"class":600},[540,2622,2623],{"class":542,"line":901},[540,2624,2625],{"class":600},"};\n",[405,2627,2628],{},[2150,2629,2630,2633],{},[408,2631,2632],{},"satisfies"," expressions:",[531,2635,2637],{"className":763,"code":2636,"language":765,"meta":536,"style":536},"const satisfiesHandler = ((ctx, name: string): string =>\n  `hello ${name}`) satisfies Handler;\nconst satisfiesHeaderHandler = ((\n  ctx: CallContext,\n  {headers}: HeadersSubset\u003C'x-trace-id'>\n): void => {\n  const traceId = headers['x-trace-id'];\n  console.log(traceId);\n}) satisfies HeaderHandler;\n",[408,2638,2639,2668,2690,2702,2712,2732,2744,2766,2782],{"__ignoreMap":536},[540,2640,2641,2643,2646,2648,2650,2652,2654,2656,2658,2660,2662,2664,2666],{"class":542,"line":543},[540,2642,965],{"class":964},[540,2644,2645],{"class":593}," satisfiesHandler ",[540,2647,971],{"class":600},[540,2649,1025],{"class":593},[540,2651,1013],{"class":600},[540,2653,2174],{"class":2173},[540,2655,710],{"class":600},[540,2657,1285],{"class":2173},[540,2659,720],{"class":600},[540,2661,2183],{"class":546},[540,2663,2186],{"class":600},[540,2665,2183],{"class":546},[540,2667,1255],{"class":964},[540,2669,2670,2673,2675,2677,2679,2681,2684,2686,2688],{"class":542,"line":612},[540,2671,2672],{"class":600},"  `",[540,2674,2196],{"class":550},[540,2676,2199],{"class":600},[540,2678,1244],{"class":593},[540,2680,2204],{"class":600},[540,2682,2683],{"class":593},") ",[540,2685,2632],{"class":589},[540,2687,2483],{"class":546},[540,2689,609],{"class":600},[540,2691,2692,2694,2697,2699],{"class":542,"line":619},[540,2693,965],{"class":964},[540,2695,2696],{"class":593}," satisfiesHeaderHandler ",[540,2698,971],{"class":600},[540,2700,2701],{"class":593}," ((\n",[540,2703,2704,2706,2708,2710],{"class":542,"line":838},[540,2705,2537],{"class":2173},[540,2707,720],{"class":600},[540,2709,2292],{"class":546},[540,2711,898],{"class":600},[540,2713,2714,2716,2718,2720,2722,2724,2726,2728,2730],{"class":542,"line":861},[540,2715,2548],{"class":600},[540,2717,2299],{"class":2173},[540,2719,2302],{"class":600},[540,2721,2305],{"class":546},[540,2723,1146],{"class":600},[540,2725,606],{"class":600},[540,2727,2312],{"class":550},[540,2729,606],{"class":600},[540,2731,2565],{"class":600},[540,2733,2734,2736,2738,2740,2742],{"class":542,"line":884},[540,2735,1041],{"class":593},[540,2737,720],{"class":600},[540,2739,2238],{"class":546},[540,2741,1022],{"class":964},[540,2743,889],{"class":600},[540,2745,2746,2748,2750,2752,2754,2756,2758,2760,2762,2764],{"class":542,"line":892},[540,2747,2582],{"class":964},[540,2749,2585],{"class":593},[540,2751,2047],{"class":600},[540,2753,2590],{"class":593},[540,2755,2593],{"class":716},[540,2757,606],{"class":600},[540,2759,2312],{"class":550},[540,2761,606],{"class":600},[540,2763,743],{"class":716},[540,2765,609],{"class":600},[540,2767,2768,2770,2772,2774,2776,2778,2780],{"class":542,"line":901},[540,2769,2247],{"class":593},[540,2771,415],{"class":600},[540,2773,2252],{"class":974},[540,2775,1013],{"class":716},[540,2777,2616],{"class":593},[540,2779,1041],{"class":716},[540,2781,609],{"class":600},[540,2783,2784,2786,2788,2790,2792],{"class":542,"line":909},[540,2785,779],{"class":600},[540,2787,2683],{"class":593},[540,2789,2632],{"class":589},[540,2791,2527],{"class":546},[540,2793,609],{"class":600},[405,2795,2796],{},[2150,2797,2798],{},"JSDoc tags:",[531,2800,2802],{"className":763,"code":2801,"language":765,"meta":536,"style":536},"\u002F**\n * @mion:route\n *\u002F\nfunction routeWithJSDoc(ctx, name: string): string {\n  return `hello ${name}`;\n}\n\n\u002F**\n * @mion:middleware\n *\u002F\nconst middlewareWithJSDoc = (ctx, data: number): void => {\n  console.log(data);\n};\n\n\u002F**\n * @mion:headersMiddleware\n *\u002F\nfunction headersMiddlewareWithJSDoc(\n  ctx: CallContext,\n  {headers}: HeadersSubset\u003C'x-trace-id'>\n): void {\n  const traceId = headers['x-trace-id'];\n  console.log(traceId);\n}\n",[408,2803,2804,2809,2814,2819,2844,2860,2864,2868,2872,2877,2881,2910,2926,2930,2934,2938,2943,2947,2956,2966,2986,2994,3016,3032],{"__ignoreMap":536},[540,2805,2806],{"class":542,"line":543},[540,2807,2808],{"class":1112},"\u002F**\n",[540,2810,2811],{"class":542,"line":612},[540,2812,2813],{"class":1112}," * @mion:route\n",[540,2815,2816],{"class":542,"line":619},[540,2817,2818],{"class":1112}," *\u002F\n",[540,2820,2821,2823,2826,2828,2830,2832,2834,2836,2838,2840,2842],{"class":542,"line":838},[540,2822,2354],{"class":964},[540,2824,2825],{"class":974}," routeWithJSDoc",[540,2827,1013],{"class":600},[540,2829,2174],{"class":2173},[540,2831,710],{"class":600},[540,2833,1285],{"class":2173},[540,2835,720],{"class":600},[540,2837,2183],{"class":546},[540,2839,2186],{"class":600},[540,2841,2183],{"class":546},[540,2843,889],{"class":600},[540,2845,2846,2848,2850,2852,2854,2856,2858],{"class":542,"line":861},[540,2847,2380],{"class":589},[540,2849,2193],{"class":600},[540,2851,2196],{"class":550},[540,2853,2199],{"class":600},[540,2855,1244],{"class":593},[540,2857,2204],{"class":600},[540,2859,609],{"class":600},[540,2861,2862],{"class":542,"line":884},[540,2863,2119],{"class":600},[540,2865,2866],{"class":542,"line":892},[540,2867,616],{"emptyLinePlaceholder":615},[540,2869,2870],{"class":542,"line":901},[540,2871,2808],{"class":1112},[540,2873,2874],{"class":542,"line":909},[540,2875,2876],{"class":1112}," * @mion:middleware\n",[540,2878,2879],{"class":542,"line":920},[540,2880,2818],{"class":1112},[540,2882,2883,2885,2888,2890,2892,2894,2896,2898,2900,2902,2904,2906,2908],{"class":542,"line":930},[540,2884,965],{"class":964},[540,2886,2887],{"class":593}," middlewareWithJSDoc ",[540,2889,971],{"class":600},[540,2891,1025],{"class":600},[540,2893,2174],{"class":2173},[540,2895,710],{"class":600},[540,2897,2228],{"class":2173},[540,2899,720],{"class":600},[540,2901,2233],{"class":546},[540,2903,2186],{"class":600},[540,2905,2238],{"class":546},[540,2907,1022],{"class":964},[540,2909,889],{"class":600},[540,2911,2912,2914,2916,2918,2920,2922,2924],{"class":542,"line":940},[540,2913,2247],{"class":593},[540,2915,415],{"class":600},[540,2917,2252],{"class":974},[540,2919,1013],{"class":716},[540,2921,2257],{"class":593},[540,2923,1041],{"class":716},[540,2925,609],{"class":600},[540,2927,2928],{"class":542,"line":956},[540,2929,2625],{"class":600},[540,2931,2932],{"class":542,"line":961},[540,2933,616],{"emptyLinePlaceholder":615},[540,2935,2936],{"class":542,"line":983},[540,2937,2808],{"class":1112},[540,2939,2940],{"class":542,"line":1000},[540,2941,2942],{"class":1112}," * @mion:headersMiddleware\n",[540,2944,2945],{"class":542,"line":1056},[540,2946,2818],{"class":1112},[540,2948,2949,2951,2954],{"class":542,"line":1061},[540,2950,2354],{"class":964},[540,2952,2953],{"class":974}," headersMiddlewareWithJSDoc",[540,2955,1131],{"class":600},[540,2957,2958,2960,2962,2964],{"class":542,"line":1078},[540,2959,2537],{"class":2173},[540,2961,720],{"class":600},[540,2963,2292],{"class":546},[540,2965,898],{"class":600},[540,2967,2968,2970,2972,2974,2976,2978,2980,2982,2984],{"class":542,"line":1083},[540,2969,2548],{"class":600},[540,2971,2299],{"class":2173},[540,2973,2302],{"class":600},[540,2975,2305],{"class":546},[540,2977,1146],{"class":600},[540,2979,606],{"class":600},[540,2981,2312],{"class":550},[540,2983,606],{"class":600},[540,2985,2565],{"class":600},[540,2987,2988,2990,2992],{"class":542,"line":1109},[540,2989,2186],{"class":600},[540,2991,2238],{"class":546},[540,2993,889],{"class":600},[540,2995,2996,2998,3000,3002,3004,3006,3008,3010,3012,3014],{"class":542,"line":1116},[540,2997,2582],{"class":964},[540,2999,2585],{"class":593},[540,3001,2047],{"class":600},[540,3003,2590],{"class":593},[540,3005,2593],{"class":716},[540,3007,606],{"class":600},[540,3009,2312],{"class":550},[540,3011,606],{"class":600},[540,3013,743],{"class":716},[540,3015,609],{"class":600},[540,3017,3018,3020,3022,3024,3026,3028,3030],{"class":542,"line":1134},[540,3019,2247],{"class":593},[540,3021,415],{"class":600},[540,3023,2252],{"class":974},[540,3025,1013],{"class":716},[540,3027,2616],{"class":593},[540,3029,1041],{"class":716},[540,3031,609],{"class":600},[540,3033,3034],{"class":542,"line":1177},[540,3035,2119],{"class":600},[2143,3037,3039],{"id":3038},"invalid-examples","❌ Invalid Examples",[405,3041,3042],{},[2150,3043,2152],{},[531,3045,3047],{"className":763,"code":3046,"language":765,"meta":536,"style":536},"mion.route((ctx, name) => `hello ${name}`); \u002F\u002F Missing both param type and return type\nmion.middleware((ctx, data: number) => {\n  console.log(data);\n}); \u002F\u002F Missing return type\nmion.headersMiddleware((ctx: CallContext, [traceId]): void => {\n  \u002F\u002F do something\n}); \u002F\u002F Missing param type\n",[408,3048,3049,3088,3116,3132,3143,3176,3181],{"__ignoreMap":536},[540,3050,3051,3053,3055,3057,3059,3061,3063,3065,3067,3069,3071,3073,3075,3077,3079,3081,3083,3085],{"class":542,"line":543},[540,3052,2162],{"class":593},[540,3054,415],{"class":600},[540,3056,1128],{"class":974},[540,3058,1013],{"class":593},[540,3060,1013],{"class":600},[540,3062,2174],{"class":2173},[540,3064,710],{"class":600},[540,3066,1285],{"class":2173},[540,3068,1041],{"class":600},[540,3070,1022],{"class":964},[540,3072,2193],{"class":600},[540,3074,2196],{"class":550},[540,3076,2199],{"class":600},[540,3078,1244],{"class":593},[540,3080,2204],{"class":600},[540,3082,1041],{"class":593},[540,3084,1359],{"class":600},[540,3086,3087],{"class":1112}," \u002F\u002F Missing both param type and return type\n",[540,3089,3090,3092,3094,3096,3098,3100,3102,3104,3106,3108,3110,3112,3114],{"class":542,"line":612},[540,3091,2162],{"class":593},[540,3093,415],{"class":600},[540,3095,2217],{"class":974},[540,3097,1013],{"class":593},[540,3099,1013],{"class":600},[540,3101,2174],{"class":2173},[540,3103,710],{"class":600},[540,3105,2228],{"class":2173},[540,3107,720],{"class":600},[540,3109,2233],{"class":546},[540,3111,1041],{"class":600},[540,3113,1022],{"class":964},[540,3115,889],{"class":600},[540,3117,3118,3120,3122,3124,3126,3128,3130],{"class":542,"line":619},[540,3119,2247],{"class":593},[540,3121,415],{"class":600},[540,3123,2252],{"class":974},[540,3125,1013],{"class":716},[540,3127,2257],{"class":593},[540,3129,1041],{"class":716},[540,3131,609],{"class":600},[540,3133,3134,3136,3138,3140],{"class":542,"line":838},[540,3135,779],{"class":600},[540,3137,1041],{"class":593},[540,3139,1359],{"class":600},[540,3141,3142],{"class":1112}," \u002F\u002F Missing return type\n",[540,3144,3145,3147,3149,3151,3153,3155,3157,3159,3161,3163,3165,3167,3170,3172,3174],{"class":542,"line":861},[540,3146,2162],{"class":593},[540,3148,415],{"class":600},[540,3150,2278],{"class":974},[540,3152,1013],{"class":593},[540,3154,1013],{"class":600},[540,3156,2174],{"class":2173},[540,3158,720],{"class":600},[540,3160,2292],{"class":546},[540,3162,710],{"class":600},[540,3164,1921],{"class":600},[540,3166,2616],{"class":2173},[540,3168,3169],{"class":600},"]):",[540,3171,2238],{"class":546},[540,3173,1022],{"class":964},[540,3175,889],{"class":600},[540,3177,3178],{"class":542,"line":884},[540,3179,3180],{"class":1112},"  \u002F\u002F do something\n",[540,3182,3183,3185,3187,3189],{"class":542,"line":892},[540,3184,779],{"class":600},[540,3186,1041],{"class":593},[540,3188,1359],{"class":600},[540,3190,3191],{"class":1112}," \u002F\u002F Missing param type\n",[405,3193,3194],{},[2150,3195,2344],{},[531,3197,3199],{"className":763,"code":3198,"language":765,"meta":536,"style":536},"function invalidHandler(ctx, name) {\n  return `hello ${name}`;\n}\nconst invalidArrowHandler = (ctx, name) => `hello ${name}`;\nmion.route(invalidHandler); \u002F\u002F Should error: missing both types\nmion.route(invalidArrowHandler); \u002F\u002F Should error: missing both types\n",[408,3200,3201,3220,3236,3240,3273,3289],{"__ignoreMap":536},[540,3202,3203,3205,3208,3210,3212,3214,3216,3218],{"class":542,"line":543},[540,3204,2354],{"class":964},[540,3206,3207],{"class":974}," invalidHandler",[540,3209,1013],{"class":600},[540,3211,2174],{"class":2173},[540,3213,710],{"class":600},[540,3215,1285],{"class":2173},[540,3217,1041],{"class":600},[540,3219,889],{"class":600},[540,3221,3222,3224,3226,3228,3230,3232,3234],{"class":542,"line":612},[540,3223,2380],{"class":589},[540,3225,2193],{"class":600},[540,3227,2196],{"class":550},[540,3229,2199],{"class":600},[540,3231,1244],{"class":593},[540,3233,2204],{"class":600},[540,3235,609],{"class":600},[540,3237,3238],{"class":542,"line":619},[540,3239,2119],{"class":600},[540,3241,3242,3244,3247,3249,3251,3253,3255,3257,3259,3261,3263,3265,3267,3269,3271],{"class":542,"line":838},[540,3243,965],{"class":964},[540,3245,3246],{"class":593}," invalidArrowHandler ",[540,3248,971],{"class":600},[540,3250,1025],{"class":600},[540,3252,2174],{"class":2173},[540,3254,710],{"class":600},[540,3256,1285],{"class":2173},[540,3258,1041],{"class":600},[540,3260,1022],{"class":964},[540,3262,2193],{"class":600},[540,3264,2196],{"class":550},[540,3266,2199],{"class":600},[540,3268,1244],{"class":593},[540,3270,2204],{"class":600},[540,3272,609],{"class":600},[540,3274,3275,3277,3279,3281,3284,3286],{"class":542,"line":861},[540,3276,2162],{"class":593},[540,3278,415],{"class":600},[540,3280,1128],{"class":974},[540,3282,3283],{"class":593},"(invalidHandler)",[540,3285,1359],{"class":600},[540,3287,3288],{"class":1112}," \u002F\u002F Should error: missing both types\n",[540,3290,3291,3293,3295,3297,3300,3302],{"class":542,"line":884},[540,3292,2162],{"class":593},[540,3294,415],{"class":600},[540,3296,1128],{"class":974},[540,3298,3299],{"class":593},"(invalidArrowHandler)",[540,3301,1359],{"class":600},[540,3303,3288],{"class":1112},[3305,3306],"hr",{},[751,3308,3310],{"id":3309},"returning-errors-instead-of-throwing","Returning Errors Instead of Throwing",[405,3312,3313,3316,3317,3320,3321,3324],{},[408,3314,3315],{},"rpc-handler-throws"," reports a ",[408,3318,3319],{},"throw"," that escapes a route, query, mutation, middleware or headersMiddleware handler. A returned error stays in the signature, so the client gets it typed. A thrown one goes to ",[408,3322,3323],{},"@thrownErrors",", the client sees only its public message, and the declared return type is no longer true.",[531,3326,3328],{"className":763,"code":3327,"language":765,"meta":536,"style":536},"return new RpcError({...});   \u002F\u002F the client gets it typed, the rest of the chain keeps running\nreturn new FatalError({...}); \u002F\u002F the client gets it typed, the request stops here\n",[408,3329,3330,3353],{"__ignoreMap":536},[540,3331,3332,3335,3338,3341,3343,3346,3348,3350],{"class":542,"line":543},[540,3333,3334],{"class":589},"return",[540,3336,3337],{"class":600}," new",[540,3339,3340],{"class":974}," RpcError",[540,3342,1013],{"class":593},[540,3344,3345],{"class":600},"{...}",[540,3347,1041],{"class":593},[540,3349,1359],{"class":600},[540,3351,3352],{"class":1112},"   \u002F\u002F the client gets it typed, the rest of the chain keeps running\n",[540,3354,3355,3357,3359,3362,3364,3366,3368,3370],{"class":542,"line":612},[540,3356,3334],{"class":589},[540,3358,3337],{"class":600},[540,3360,3361],{"class":974}," FatalError",[540,3363,1013],{"class":593},[540,3365,3345],{"class":600},[540,3367,1041],{"class":593},[540,3369,1359],{"class":600},[540,3371,3372],{"class":1112}," \u002F\u002F the client gets it typed, the request stops here\n",[642,3374,3375,3376,3378,3379,3382],{},"A ",[408,3377,3319],{}," is still the way out for an error nobody declared, such as a bug or an infrastructure failure. Add ",[408,3380,3381],{},"\u002F\u002F @mion-expect-error rpc-handler-throws"," on the line above it, and a comment saying why.",[2143,3384,2146],{"id":3385},"valid-examples-1",[531,3387,3389],{"className":763,"code":3388,"language":765,"meta":536,"style":536},"\u002F\u002F 1. Return the error, so it stays in the signature and the client gets it typed\nmion.route((ctx, id: string): string | RpcError\u003C'not-found'> => {\n  if (!id)\n    return new RpcError({type: 'not-found', publicMessage: 'No id given'});\n  return `hello ${id}`;\n});\n\n\u002F\u002F 2. A gate returns a FatalError, which ends the request\nmion.middleware((ctx): void | FatalError\u003C'not-authorized'> => {\n  if (!ctx.request.headers.get('cookie'))\n    return new FatalError({\n      type: 'not-authorized',\n      publicMessage: 'Not Authorized',\n    });\n});\n\n\u002F\u002F 3. A throw caught inside the handler never reaches the router\nmion.route((ctx, id: string): string | RpcError\u003C'db-error'> => {\n  try {\n    if (!id) throw new Error('empty id');\n    return `hello ${id}`;\n  } catch {\n    return new RpcError({type: 'db-error', publicMessage: 'Lookup failed'});\n  }\n});\n",[408,3390,3391,3396,3442,3456,3500,3516,3524,3528,3533,3570,3606,3618,3633,3649,3658,3666,3670,3675,3720,3727,3760,3776,3785,3826,3830],{"__ignoreMap":536},[540,3392,3393],{"class":542,"line":543},[540,3394,3395],{"class":1112},"\u002F\u002F 1. Return the error, so it stays in the signature and the client gets it typed\n",[540,3397,3398,3400,3402,3404,3406,3408,3410,3412,3415,3417,3419,3421,3423,3425,3427,3429,3431,3434,3436,3438,3440],{"class":542,"line":612},[540,3399,2162],{"class":593},[540,3401,415],{"class":600},[540,3403,1128],{"class":974},[540,3405,1013],{"class":593},[540,3407,1013],{"class":600},[540,3409,2174],{"class":2173},[540,3411,710],{"class":600},[540,3413,3414],{"class":2173}," id",[540,3416,720],{"class":600},[540,3418,2183],{"class":546},[540,3420,2186],{"class":600},[540,3422,2183],{"class":546},[540,3424,1239],{"class":600},[540,3426,3340],{"class":546},[540,3428,1146],{"class":600},[540,3430,606],{"class":600},[540,3432,3433],{"class":550},"not-found",[540,3435,606],{"class":600},[540,3437,1155],{"class":600},[540,3439,1022],{"class":964},[540,3441,889],{"class":600},[540,3443,3444,3447,3449,3452,3454],{"class":542,"line":619},[540,3445,3446],{"class":589},"  if",[540,3448,1025],{"class":716},[540,3450,3451],{"class":600},"!",[540,3453,1234],{"class":593},[540,3455,1412],{"class":716},[540,3457,3458,3461,3463,3465,3467,3469,3472,3474,3476,3478,3480,3482,3485,3487,3489,3492,3494,3496,3498],{"class":542,"line":838},[540,3459,3460],{"class":589},"    return",[540,3462,3337],{"class":600},[540,3464,3340],{"class":974},[540,3466,1013],{"class":716},[540,3468,1028],{"class":600},[540,3470,3471],{"class":716},"type",[540,3473,720],{"class":600},[540,3475,601],{"class":600},[540,3477,3433],{"class":550},[540,3479,606],{"class":600},[540,3481,710],{"class":600},[540,3483,3484],{"class":716}," publicMessage",[540,3486,720],{"class":600},[540,3488,601],{"class":600},[540,3490,3491],{"class":550},"No id given",[540,3493,606],{"class":600},[540,3495,779],{"class":600},[540,3497,1041],{"class":716},[540,3499,609],{"class":600},[540,3501,3502,3504,3506,3508,3510,3512,3514],{"class":542,"line":861},[540,3503,2380],{"class":589},[540,3505,2193],{"class":600},[540,3507,2196],{"class":550},[540,3509,2199],{"class":600},[540,3511,1234],{"class":593},[540,3513,2204],{"class":600},[540,3515,609],{"class":600},[540,3517,3518,3520,3522],{"class":542,"line":884},[540,3519,779],{"class":600},[540,3521,1041],{"class":593},[540,3523,609],{"class":600},[540,3525,3526],{"class":542,"line":892},[540,3527,616],{"emptyLinePlaceholder":615},[540,3529,3530],{"class":542,"line":901},[540,3531,3532],{"class":1112},"\u002F\u002F 2. A gate returns a FatalError, which ends the request\n",[540,3534,3535,3537,3539,3541,3543,3545,3547,3549,3551,3553,3555,3557,3559,3562,3564,3566,3568],{"class":542,"line":909},[540,3536,2162],{"class":593},[540,3538,415],{"class":600},[540,3540,2217],{"class":974},[540,3542,1013],{"class":593},[540,3544,1013],{"class":600},[540,3546,2174],{"class":2173},[540,3548,2186],{"class":600},[540,3550,2238],{"class":546},[540,3552,1239],{"class":600},[540,3554,3361],{"class":546},[540,3556,1146],{"class":600},[540,3558,606],{"class":600},[540,3560,3561],{"class":550},"not-authorized",[540,3563,606],{"class":600},[540,3565,1155],{"class":600},[540,3567,1022],{"class":964},[540,3569,889],{"class":600},[540,3571,3572,3574,3576,3578,3580,3582,3585,3587,3589,3591,3594,3596,3598,3601,3603],{"class":542,"line":920},[540,3573,3446],{"class":589},[540,3575,1025],{"class":716},[540,3577,3451],{"class":600},[540,3579,2174],{"class":593},[540,3581,415],{"class":600},[540,3583,3584],{"class":593},"request",[540,3586,415],{"class":600},[540,3588,2299],{"class":593},[540,3590,415],{"class":600},[540,3592,3593],{"class":974},"get",[540,3595,1013],{"class":716},[540,3597,606],{"class":600},[540,3599,3600],{"class":550},"cookie",[540,3602,606],{"class":600},[540,3604,3605],{"class":716},"))\n",[540,3607,3608,3610,3612,3614,3616],{"class":542,"line":930},[540,3609,3460],{"class":589},[540,3611,3337],{"class":600},[540,3613,3361],{"class":974},[540,3615,1013],{"class":716},[540,3617,1106],{"class":600},[540,3619,3620,3623,3625,3627,3629,3631],{"class":542,"line":940},[540,3621,3622],{"class":716},"      type",[540,3624,720],{"class":600},[540,3626,601],{"class":600},[540,3628,3561],{"class":550},[540,3630,606],{"class":600},[540,3632,898],{"class":600},[540,3634,3635,3638,3640,3642,3645,3647],{"class":542,"line":956},[540,3636,3637],{"class":716},"      publicMessage",[540,3639,720],{"class":600},[540,3641,601],{"class":600},[540,3643,3644],{"class":550},"Not Authorized",[540,3646,606],{"class":600},[540,3648,898],{"class":600},[540,3650,3651,3654,3656],{"class":542,"line":961},[540,3652,3653],{"class":600},"    }",[540,3655,1041],{"class":716},[540,3657,609],{"class":600},[540,3659,3660,3662,3664],{"class":542,"line":983},[540,3661,779],{"class":600},[540,3663,1041],{"class":593},[540,3665,609],{"class":600},[540,3667,3668],{"class":542,"line":1000},[540,3669,616],{"emptyLinePlaceholder":615},[540,3671,3672],{"class":542,"line":1056},[540,3673,3674],{"class":1112},"\u002F\u002F 3. A throw caught inside the handler never reaches the router\n",[540,3676,3677,3679,3681,3683,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3712,3714,3716,3718],{"class":542,"line":1061},[540,3678,2162],{"class":593},[540,3680,415],{"class":600},[540,3682,1128],{"class":974},[540,3684,1013],{"class":593},[540,3686,1013],{"class":600},[540,3688,2174],{"class":2173},[540,3690,710],{"class":600},[540,3692,3414],{"class":2173},[540,3694,720],{"class":600},[540,3696,2183],{"class":546},[540,3698,2186],{"class":600},[540,3700,2183],{"class":546},[540,3702,1239],{"class":600},[540,3704,3340],{"class":546},[540,3706,1146],{"class":600},[540,3708,606],{"class":600},[540,3710,3711],{"class":550},"db-error",[540,3713,606],{"class":600},[540,3715,1155],{"class":600},[540,3717,1022],{"class":964},[540,3719,889],{"class":600},[540,3721,3722,3725],{"class":542,"line":1078},[540,3723,3724],{"class":589},"  try",[540,3726,889],{"class":600},[540,3728,3729,3732,3734,3736,3738,3740,3742,3744,3747,3749,3751,3754,3756,3758],{"class":542,"line":1083},[540,3730,3731],{"class":589},"    if",[540,3733,1025],{"class":716},[540,3735,3451],{"class":600},[540,3737,1234],{"class":593},[540,3739,2683],{"class":716},[540,3741,3319],{"class":589},[540,3743,3337],{"class":600},[540,3745,3746],{"class":974}," Error",[540,3748,1013],{"class":716},[540,3750,606],{"class":600},[540,3752,3753],{"class":550},"empty id",[540,3755,606],{"class":600},[540,3757,1041],{"class":716},[540,3759,609],{"class":600},[540,3761,3762,3764,3766,3768,3770,3772,3774],{"class":542,"line":1109},[540,3763,3460],{"class":589},[540,3765,2193],{"class":600},[540,3767,2196],{"class":550},[540,3769,2199],{"class":600},[540,3771,1234],{"class":593},[540,3773,2204],{"class":600},[540,3775,609],{"class":600},[540,3777,3778,3780,3783],{"class":542,"line":1116},[540,3779,1968],{"class":600},[540,3781,3782],{"class":589}," catch",[540,3784,889],{"class":600},[540,3786,3787,3789,3791,3793,3795,3797,3799,3801,3803,3805,3807,3809,3811,3813,3815,3818,3820,3822,3824],{"class":542,"line":1134},[540,3788,3460],{"class":589},[540,3790,3337],{"class":600},[540,3792,3340],{"class":974},[540,3794,1013],{"class":716},[540,3796,1028],{"class":600},[540,3798,3471],{"class":716},[540,3800,720],{"class":600},[540,3802,601],{"class":600},[540,3804,3711],{"class":550},[540,3806,606],{"class":600},[540,3808,710],{"class":600},[540,3810,3484],{"class":716},[540,3812,720],{"class":600},[540,3814,601],{"class":600},[540,3816,3817],{"class":550},"Lookup failed",[540,3819,606],{"class":600},[540,3821,779],{"class":600},[540,3823,1041],{"class":716},[540,3825,609],{"class":600},[540,3827,3828],{"class":542,"line":1177},[540,3829,2333],{"class":600},[540,3831,3832,3834,3836],{"class":542,"line":1185},[540,3833,779],{"class":600},[540,3835,1041],{"class":593},[540,3837,609],{"class":600},[2143,3839,3039],{"id":3840},"invalid-examples-1",[531,3842,3844],{"className":763,"code":3843,"language":765,"meta":536,"style":536},"\u002F\u002F 1. Throwing drops the error from the signature, so the client cannot handle it typed\nmion.route((ctx, id: string): string => {\n  throw new RpcError({type: 'not-found', publicMessage: 'No id given'});\n});\n\n\u002F\u002F 2. A throw inside a callback in the handler body still reaches the router\nmion.route((ctx, ids: string[]): string[] =>\n  ids.map((id) => {\n    throw new Error('bad id');\n  })\n);\n\n\u002F\u002F 3. Rethrowing from the catch clause escapes the handler too\nmion.route((ctx, id: string): string => {\n  try {\n    return `hello ${id}`;\n  } catch (err) {\n    throw err;\n  }\n});\n",[408,3845,3846,3851,3881,3922,3930,3934,3939,3974,3996,4018,4024,4030,4034,4039,4069,4075,4091,4106,4115,4119],{"__ignoreMap":536},[540,3847,3848],{"class":542,"line":543},[540,3849,3850],{"class":1112},"\u002F\u002F 1. Throwing drops the error from the signature, so the client cannot handle it typed\n",[540,3852,3853,3855,3857,3859,3861,3863,3865,3867,3869,3871,3873,3875,3877,3879],{"class":542,"line":612},[540,3854,2162],{"class":593},[540,3856,415],{"class":600},[540,3858,1128],{"class":974},[540,3860,1013],{"class":593},[540,3862,1013],{"class":600},[540,3864,2174],{"class":2173},[540,3866,710],{"class":600},[540,3868,3414],{"class":2173},[540,3870,720],{"class":600},[540,3872,2183],{"class":546},[540,3874,2186],{"class":600},[540,3876,2183],{"class":546},[540,3878,1022],{"class":964},[540,3880,889],{"class":600},[540,3882,3883,3886,3888,3890,3892,3894,3896,3898,3900,3902,3904,3906,3908,3910,3912,3914,3916,3918,3920],{"class":542,"line":619},[540,3884,3885],{"class":589},"  throw",[540,3887,3337],{"class":600},[540,3889,3340],{"class":974},[540,3891,1013],{"class":716},[540,3893,1028],{"class":600},[540,3895,3471],{"class":716},[540,3897,720],{"class":600},[540,3899,601],{"class":600},[540,3901,3433],{"class":550},[540,3903,606],{"class":600},[540,3905,710],{"class":600},[540,3907,3484],{"class":716},[540,3909,720],{"class":600},[540,3911,601],{"class":600},[540,3913,3491],{"class":550},[540,3915,606],{"class":600},[540,3917,779],{"class":600},[540,3919,1041],{"class":716},[540,3921,609],{"class":600},[540,3923,3924,3926,3928],{"class":542,"line":838},[540,3925,779],{"class":600},[540,3927,1041],{"class":593},[540,3929,609],{"class":600},[540,3931,3932],{"class":542,"line":861},[540,3933,616],{"emptyLinePlaceholder":615},[540,3935,3936],{"class":542,"line":884},[540,3937,3938],{"class":1112},"\u002F\u002F 2. A throw inside a callback in the handler body still reaches the router\n",[540,3940,3941,3943,3945,3947,3949,3951,3953,3955,3958,3960,3962,3964,3966,3968,3971],{"class":542,"line":892},[540,3942,2162],{"class":593},[540,3944,415],{"class":600},[540,3946,1128],{"class":974},[540,3948,1013],{"class":593},[540,3950,1013],{"class":600},[540,3952,2174],{"class":2173},[540,3954,710],{"class":600},[540,3956,3957],{"class":2173}," ids",[540,3959,720],{"class":600},[540,3961,2183],{"class":546},[540,3963,1152],{"class":593},[540,3965,2186],{"class":600},[540,3967,2183],{"class":546},[540,3969,3970],{"class":593},"[] ",[540,3972,3973],{"class":964},"=>\n",[540,3975,3976,3979,3981,3984,3986,3988,3990,3992,3994],{"class":542,"line":901},[540,3977,3978],{"class":593},"  ids",[540,3980,415],{"class":600},[540,3982,3983],{"class":974},"map",[540,3985,1013],{"class":593},[540,3987,1013],{"class":600},[540,3989,1234],{"class":2173},[540,3991,1041],{"class":600},[540,3993,1022],{"class":964},[540,3995,889],{"class":600},[540,3997,3998,4001,4003,4005,4007,4009,4012,4014,4016],{"class":542,"line":909},[540,3999,4000],{"class":589},"    throw",[540,4002,3337],{"class":600},[540,4004,3746],{"class":974},[540,4006,1013],{"class":716},[540,4008,606],{"class":600},[540,4010,4011],{"class":550},"bad id",[540,4013,606],{"class":600},[540,4015,1041],{"class":716},[540,4017,609],{"class":600},[540,4019,4020,4022],{"class":542,"line":920},[540,4021,1968],{"class":600},[540,4023,1412],{"class":593},[540,4025,4026,4028],{"class":542,"line":930},[540,4027,1041],{"class":593},[540,4029,609],{"class":600},[540,4031,4032],{"class":542,"line":940},[540,4033,616],{"emptyLinePlaceholder":615},[540,4035,4036],{"class":542,"line":956},[540,4037,4038],{"class":1112},"\u002F\u002F 3. Rethrowing from the catch clause escapes the handler too\n",[540,4040,4041,4043,4045,4047,4049,4051,4053,4055,4057,4059,4061,4063,4065,4067],{"class":542,"line":961},[540,4042,2162],{"class":593},[540,4044,415],{"class":600},[540,4046,1128],{"class":974},[540,4048,1013],{"class":593},[540,4050,1013],{"class":600},[540,4052,2174],{"class":2173},[540,4054,710],{"class":600},[540,4056,3414],{"class":2173},[540,4058,720],{"class":600},[540,4060,2183],{"class":546},[540,4062,2186],{"class":600},[540,4064,2183],{"class":546},[540,4066,1022],{"class":964},[540,4068,889],{"class":600},[540,4070,4071,4073],{"class":542,"line":983},[540,4072,3724],{"class":589},[540,4074,889],{"class":600},[540,4076,4077,4079,4081,4083,4085,4087,4089],{"class":542,"line":1000},[540,4078,3460],{"class":589},[540,4080,2193],{"class":600},[540,4082,2196],{"class":550},[540,4084,2199],{"class":600},[540,4086,1234],{"class":593},[540,4088,2204],{"class":600},[540,4090,609],{"class":600},[540,4092,4093,4095,4097,4099,4102,4104],{"class":542,"line":1056},[540,4094,1968],{"class":600},[540,4096,3782],{"class":589},[540,4098,1025],{"class":716},[540,4100,4101],{"class":593},"err",[540,4103,2683],{"class":716},[540,4105,1106],{"class":600},[540,4107,4108,4110,4113],{"class":542,"line":1061},[540,4109,4000],{"class":589},[540,4111,4112],{"class":593}," err",[540,4114,609],{"class":600},[540,4116,4117],{"class":542,"line":1078},[540,4118,2333],{"class":600},[540,4120,4121,4123,4125],{"class":542,"line":1083},[540,4122,779],{"class":600},[540,4124,1041],{"class":593},[540,4126,609],{"class":600},[3305,4128],{},[751,4130,4132],{"id":4131},"returned-error-types","Returned Error Types",[405,4134,4135,4138,4139,4142,4143,4145,4146,4149,4150,4152],{},[408,4136,4137],{},"rpc-handler-returns-non-rpc-error"," reports a handler whose declared return type can be an error that is not an ",[408,4140,4141],{},"RpcError",". Only ",[408,4144,4141],{}," and its subclasses, such as ",[408,4147,4148],{},"FatalError"," or your own, get a typed slot in the response. Any other error fails the request and goes to ",[408,4151,3323],{},", so the code compiles but the client never gets the error its type promised.",[2143,4154,2146],{"id":4155},"valid-examples-2",[531,4157,4159],{"className":763,"code":4158,"language":765,"meta":536,"style":536},"\u002F\u002F 1. An RpcError lands in its own typed slot and the chain keeps running\nmion.route((ctx, id: string): string | RpcError\u003C'not-found'> => {\n  if (!id)\n    return new RpcError({type: 'not-found', publicMessage: 'No id given'});\n  return `hello ${id}`;\n});\n\n\u002F\u002F 2. A FatalError is an RpcError subclass, so it is typed too, and it ends the request\nmion.middleware((ctx, id: string): void | FatalError\u003C'not-authorized'> => {\n  if (!id)\n    return new FatalError({\n      type: 'not-authorized',\n      publicMessage: 'Not Authorized',\n    });\n});\n\n\u002F\u002F 3. Your own subclass of RpcError keeps the brand, so it is fine as well\nclass PetNotFound extends RpcError\u003C'pet-not-found'> {}\nmion.route((ctx, id: string): string | PetNotFound => `hello ${id}`);\n",[408,4160,4161,4166,4210,4222,4262,4278,4286,4290,4295,4339,4351,4363,4377,4391,4399,4407,4411,4416,4442],{"__ignoreMap":536},[540,4162,4163],{"class":542,"line":543},[540,4164,4165],{"class":1112},"\u002F\u002F 1. An RpcError lands in its own typed slot and the chain keeps running\n",[540,4167,4168,4170,4172,4174,4176,4178,4180,4182,4184,4186,4188,4190,4192,4194,4196,4198,4200,4202,4204,4206,4208],{"class":542,"line":612},[540,4169,2162],{"class":593},[540,4171,415],{"class":600},[540,4173,1128],{"class":974},[540,4175,1013],{"class":593},[540,4177,1013],{"class":600},[540,4179,2174],{"class":2173},[540,4181,710],{"class":600},[540,4183,3414],{"class":2173},[540,4185,720],{"class":600},[540,4187,2183],{"class":546},[540,4189,2186],{"class":600},[540,4191,2183],{"class":546},[540,4193,1239],{"class":600},[540,4195,3340],{"class":546},[540,4197,1146],{"class":600},[540,4199,606],{"class":600},[540,4201,3433],{"class":550},[540,4203,606],{"class":600},[540,4205,1155],{"class":600},[540,4207,1022],{"class":964},[540,4209,889],{"class":600},[540,4211,4212,4214,4216,4218,4220],{"class":542,"line":619},[540,4213,3446],{"class":589},[540,4215,1025],{"class":716},[540,4217,3451],{"class":600},[540,4219,1234],{"class":593},[540,4221,1412],{"class":716},[540,4223,4224,4226,4228,4230,4232,4234,4236,4238,4240,4242,4244,4246,4248,4250,4252,4254,4256,4258,4260],{"class":542,"line":838},[540,4225,3460],{"class":589},[540,4227,3337],{"class":600},[540,4229,3340],{"class":974},[540,4231,1013],{"class":716},[540,4233,1028],{"class":600},[540,4235,3471],{"class":716},[540,4237,720],{"class":600},[540,4239,601],{"class":600},[540,4241,3433],{"class":550},[540,4243,606],{"class":600},[540,4245,710],{"class":600},[540,4247,3484],{"class":716},[540,4249,720],{"class":600},[540,4251,601],{"class":600},[540,4253,3491],{"class":550},[540,4255,606],{"class":600},[540,4257,779],{"class":600},[540,4259,1041],{"class":716},[540,4261,609],{"class":600},[540,4263,4264,4266,4268,4270,4272,4274,4276],{"class":542,"line":861},[540,4265,2380],{"class":589},[540,4267,2193],{"class":600},[540,4269,2196],{"class":550},[540,4271,2199],{"class":600},[540,4273,1234],{"class":593},[540,4275,2204],{"class":600},[540,4277,609],{"class":600},[540,4279,4280,4282,4284],{"class":542,"line":884},[540,4281,779],{"class":600},[540,4283,1041],{"class":593},[540,4285,609],{"class":600},[540,4287,4288],{"class":542,"line":892},[540,4289,616],{"emptyLinePlaceholder":615},[540,4291,4292],{"class":542,"line":901},[540,4293,4294],{"class":1112},"\u002F\u002F 2. A FatalError is an RpcError subclass, so it is typed too, and it ends the request\n",[540,4296,4297,4299,4301,4303,4305,4307,4309,4311,4313,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333,4335,4337],{"class":542,"line":909},[540,4298,2162],{"class":593},[540,4300,415],{"class":600},[540,4302,2217],{"class":974},[540,4304,1013],{"class":593},[540,4306,1013],{"class":600},[540,4308,2174],{"class":2173},[540,4310,710],{"class":600},[540,4312,3414],{"class":2173},[540,4314,720],{"class":600},[540,4316,2183],{"class":546},[540,4318,2186],{"class":600},[540,4320,2238],{"class":546},[540,4322,1239],{"class":600},[540,4324,3361],{"class":546},[540,4326,1146],{"class":600},[540,4328,606],{"class":600},[540,4330,3561],{"class":550},[540,4332,606],{"class":600},[540,4334,1155],{"class":600},[540,4336,1022],{"class":964},[540,4338,889],{"class":600},[540,4340,4341,4343,4345,4347,4349],{"class":542,"line":920},[540,4342,3446],{"class":589},[540,4344,1025],{"class":716},[540,4346,3451],{"class":600},[540,4348,1234],{"class":593},[540,4350,1412],{"class":716},[540,4352,4353,4355,4357,4359,4361],{"class":542,"line":930},[540,4354,3460],{"class":589},[540,4356,3337],{"class":600},[540,4358,3361],{"class":974},[540,4360,1013],{"class":716},[540,4362,1106],{"class":600},[540,4364,4365,4367,4369,4371,4373,4375],{"class":542,"line":940},[540,4366,3622],{"class":716},[540,4368,720],{"class":600},[540,4370,601],{"class":600},[540,4372,3561],{"class":550},[540,4374,606],{"class":600},[540,4376,898],{"class":600},[540,4378,4379,4381,4383,4385,4387,4389],{"class":542,"line":956},[540,4380,3637],{"class":716},[540,4382,720],{"class":600},[540,4384,601],{"class":600},[540,4386,3644],{"class":550},[540,4388,606],{"class":600},[540,4390,898],{"class":600},[540,4392,4393,4395,4397],{"class":542,"line":961},[540,4394,3653],{"class":600},[540,4396,1041],{"class":716},[540,4398,609],{"class":600},[540,4400,4401,4403,4405],{"class":542,"line":983},[540,4402,779],{"class":600},[540,4404,1041],{"class":593},[540,4406,609],{"class":600},[540,4408,4409],{"class":542,"line":1000},[540,4410,616],{"emptyLinePlaceholder":615},[540,4412,4413],{"class":542,"line":1056},[540,4414,4415],{"class":1112},"\u002F\u002F 3. Your own subclass of RpcError keeps the brand, so it is fine as well\n",[540,4417,4418,4421,4424,4426,4428,4430,4432,4435,4437,4439],{"class":542,"line":1061},[540,4419,4420],{"class":964},"class",[540,4422,4423],{"class":546}," PetNotFound",[540,4425,2098],{"class":964},[540,4427,3340],{"class":546},[540,4429,1146],{"class":600},[540,4431,606],{"class":600},[540,4433,4434],{"class":550},"pet-not-found",[540,4436,606],{"class":600},[540,4438,1155],{"class":600},[540,4440,4441],{"class":600}," {}\n",[540,4443,4444,4446,4448,4450,4452,4454,4456,4458,4460,4462,4464,4466,4468,4470,4472,4474,4476,4478,4480,4482,4484,4486],{"class":542,"line":1078},[540,4445,2162],{"class":593},[540,4447,415],{"class":600},[540,4449,1128],{"class":974},[540,4451,1013],{"class":593},[540,4453,1013],{"class":600},[540,4455,2174],{"class":2173},[540,4457,710],{"class":600},[540,4459,3414],{"class":2173},[540,4461,720],{"class":600},[540,4463,2183],{"class":546},[540,4465,2186],{"class":600},[540,4467,2183],{"class":546},[540,4469,1239],{"class":600},[540,4471,4423],{"class":546},[540,4473,1022],{"class":964},[540,4475,2193],{"class":600},[540,4477,2196],{"class":550},[540,4479,2199],{"class":600},[540,4481,1234],{"class":593},[540,4483,2204],{"class":600},[540,4485,1041],{"class":593},[540,4487,609],{"class":600},[2143,4489,3039],{"id":4490},"invalid-examples-2",[531,4492,4494],{"className":763,"code":4493,"language":765,"meta":536,"style":536},"\u002F\u002F 1. A plain Error carries no mion brand, so it never reaches the typed slot\nmion.route((ctx, id: string): string | Error => new Error('no id'));\n\n\u002F\u002F 2. Your own class extending Error has the same problem\nclass NotFoundError extends Error {}\nmion.route((ctx, id: string): string | NotFoundError => new NotFoundError());\n\n\u002F\u002F 3. TypedError is branded, but as the base class it has no public message or status code to show\nmion.route(\n  (ctx, id: string): string | TypedError\u003C'not-found'> =>\n    new TypedError({type: 'not-found'})\n);\n",[408,4495,4496,4501,4551,4555,4560,4573,4614,4618,4623,4633,4668,4693],{"__ignoreMap":536},[540,4497,4498],{"class":542,"line":543},[540,4499,4500],{"class":1112},"\u002F\u002F 1. A plain Error carries no mion brand, so it never reaches the typed slot\n",[540,4502,4503,4505,4507,4509,4511,4513,4515,4517,4519,4521,4523,4525,4527,4529,4531,4533,4535,4537,4539,4541,4544,4546,4549],{"class":542,"line":612},[540,4504,2162],{"class":593},[540,4506,415],{"class":600},[540,4508,1128],{"class":974},[540,4510,1013],{"class":593},[540,4512,1013],{"class":600},[540,4514,2174],{"class":2173},[540,4516,710],{"class":600},[540,4518,3414],{"class":2173},[540,4520,720],{"class":600},[540,4522,2183],{"class":546},[540,4524,2186],{"class":600},[540,4526,2183],{"class":546},[540,4528,1239],{"class":600},[540,4530,3746],{"class":546},[540,4532,1022],{"class":964},[540,4534,3337],{"class":600},[540,4536,3746],{"class":974},[540,4538,1013],{"class":593},[540,4540,606],{"class":600},[540,4542,4543],{"class":550},"no id",[540,4545,606],{"class":600},[540,4547,4548],{"class":593},"))",[540,4550,609],{"class":600},[540,4552,4553],{"class":542,"line":619},[540,4554,616],{"emptyLinePlaceholder":615},[540,4556,4557],{"class":542,"line":838},[540,4558,4559],{"class":1112},"\u002F\u002F 2. Your own class extending Error has the same problem\n",[540,4561,4562,4564,4567,4569,4571],{"class":542,"line":861},[540,4563,4420],{"class":964},[540,4565,4566],{"class":546}," NotFoundError",[540,4568,2098],{"class":964},[540,4570,3746],{"class":546},[540,4572,4441],{"class":600},[540,4574,4575,4577,4579,4581,4583,4585,4587,4589,4591,4593,4595,4597,4599,4601,4603,4605,4607,4609,4612],{"class":542,"line":884},[540,4576,2162],{"class":593},[540,4578,415],{"class":600},[540,4580,1128],{"class":974},[540,4582,1013],{"class":593},[540,4584,1013],{"class":600},[540,4586,2174],{"class":2173},[540,4588,710],{"class":600},[540,4590,3414],{"class":2173},[540,4592,720],{"class":600},[540,4594,2183],{"class":546},[540,4596,2186],{"class":600},[540,4598,2183],{"class":546},[540,4600,1239],{"class":600},[540,4602,4566],{"class":546},[540,4604,1022],{"class":964},[540,4606,3337],{"class":600},[540,4608,4566],{"class":974},[540,4610,4611],{"class":593},"())",[540,4613,609],{"class":600},[540,4615,4616],{"class":542,"line":892},[540,4617,616],{"emptyLinePlaceholder":615},[540,4619,4620],{"class":542,"line":901},[540,4621,4622],{"class":1112},"\u002F\u002F 3. TypedError is branded, but as the base class it has no public message or status code to show\n",[540,4624,4625,4627,4629,4631],{"class":542,"line":909},[540,4626,2162],{"class":593},[540,4628,415],{"class":600},[540,4630,1128],{"class":974},[540,4632,1131],{"class":593},[540,4634,4635,4637,4639,4641,4643,4645,4647,4649,4651,4653,4656,4658,4660,4662,4664,4666],{"class":542,"line":920},[540,4636,2285],{"class":600},[540,4638,2174],{"class":2173},[540,4640,710],{"class":600},[540,4642,3414],{"class":2173},[540,4644,720],{"class":600},[540,4646,2183],{"class":546},[540,4648,2186],{"class":600},[540,4650,2183],{"class":546},[540,4652,1239],{"class":600},[540,4654,4655],{"class":546}," TypedError",[540,4657,1146],{"class":600},[540,4659,606],{"class":600},[540,4661,3433],{"class":550},[540,4663,606],{"class":600},[540,4665,1155],{"class":600},[540,4667,1255],{"class":964},[540,4669,4670,4673,4675,4677,4679,4681,4683,4685,4687,4689,4691],{"class":542,"line":930},[540,4671,4672],{"class":600},"    new",[540,4674,4655],{"class":974},[540,4676,1013],{"class":593},[540,4678,1028],{"class":600},[540,4680,3471],{"class":716},[540,4682,720],{"class":600},[540,4684,601],{"class":600},[540,4686,3433],{"class":550},[540,4688,606],{"class":600},[540,4690,779],{"class":600},[540,4692,1412],{"class":593},[540,4694,4695,4697],{"class":542,"line":940},[540,4696,1041],{"class":593},[540,4698,609],{"class":600},[3305,4700],{},[751,4702,4704],{"id":4703},"unsafe-property-names","Unsafe Property Names",[405,4706,4707,4710,4711,4714],{},[408,4708,4709],{},"rpc-handler-non-data-property"," reports a property named ",[408,4712,4713],{},"__proto__"," in any interface, type literal or class, optional or not, at any depth. Writing that key on a plain object changes its prototype instead of storing a value, so every compiled function drops the member and its value is lost. TypeScript accepts it, so the linter reports the declaration in your editor, even for types no route uses yet.",[405,4716,4717,4718,2137,4721,415],{},"It allows ",[408,4719,4720],{},"prototype",[408,4722,4723],{},"constructor",[2143,4725,2146],{"id":4726},"valid-examples-3",[531,4728,4730],{"className":763,"code":4729,"language":765,"meta":536,"style":536},"interface Settings {\n  builder: string;\n  constructor: string;\n  prototype: string;\n}\n\nclass Box {\n  size: number;\n  constructor(size: number) {\n    this.size = size;\n  }\n}\n",[408,4731,4732,4742,4753,4764,4775,4779,4783,4792,4803,4820,4834,4838],{"__ignoreMap":536},[540,4733,4734,4737,4740],{"class":542,"line":543},[540,4735,4736],{"class":964},"interface",[540,4738,4739],{"class":546}," Settings",[540,4741,889],{"class":600},[540,4743,4744,4747,4749,4751],{"class":542,"line":612},[540,4745,4746],{"class":716},"  builder",[540,4748,720],{"class":600},[540,4750,2183],{"class":546},[540,4752,609],{"class":600},[540,4754,4755,4758,4760,4762],{"class":542,"line":619},[540,4756,4757],{"class":716},"  constructor",[540,4759,720],{"class":600},[540,4761,2183],{"class":546},[540,4763,609],{"class":600},[540,4765,4766,4769,4771,4773],{"class":542,"line":838},[540,4767,4768],{"class":716},"  prototype",[540,4770,720],{"class":600},[540,4772,2183],{"class":546},[540,4774,609],{"class":600},[540,4776,4777],{"class":542,"line":861},[540,4778,2119],{"class":600},[540,4780,4781],{"class":542,"line":884},[540,4782,616],{"emptyLinePlaceholder":615},[540,4784,4785,4787,4790],{"class":542,"line":892},[540,4786,4420],{"class":964},[540,4788,4789],{"class":546}," Box",[540,4791,889],{"class":600},[540,4793,4794,4797,4799,4801],{"class":542,"line":901},[540,4795,4796],{"class":716},"  size",[540,4798,720],{"class":600},[540,4800,2233],{"class":546},[540,4802,609],{"class":600},[540,4804,4805,4807,4809,4812,4814,4816,4818],{"class":542,"line":909},[540,4806,4757],{"class":964},[540,4808,1013],{"class":600},[540,4810,4811],{"class":2173},"size",[540,4813,720],{"class":600},[540,4815,2233],{"class":546},[540,4817,1041],{"class":600},[540,4819,889],{"class":600},[540,4821,4822,4825,4827,4829,4832],{"class":542,"line":920},[540,4823,4824],{"class":600},"    this.",[540,4826,4811],{"class":593},[540,4828,2047],{"class":600},[540,4830,4831],{"class":593}," size",[540,4833,609],{"class":600},[540,4835,4836],{"class":542,"line":930},[540,4837,2333],{"class":600},[540,4839,4840],{"class":542,"line":940},[540,4841,2119],{"class":600},[2143,4843,3039],{"id":4844},"invalid-examples-3",[531,4846,4848],{"className":763,"code":4847,"language":765,"meta":536,"style":536},"interface Settings {\n  __proto__: string;\n}\n\ntype Poison = {\n  __proto__: {admin: boolean};\n};\n",[408,4849,4850,4858,4869,4873,4877,4888,4906],{"__ignoreMap":536},[540,4851,4852,4854,4856],{"class":542,"line":543},[540,4853,4736],{"class":964},[540,4855,4739],{"class":546},[540,4857,889],{"class":600},[540,4859,4860,4863,4865,4867],{"class":542,"line":612},[540,4861,4862],{"class":716},"  __proto__",[540,4864,720],{"class":600},[540,4866,2183],{"class":546},[540,4868,609],{"class":600},[540,4870,4871],{"class":542,"line":619},[540,4872,2119],{"class":600},[540,4874,4875],{"class":542,"line":838},[540,4876,616],{"emptyLinePlaceholder":615},[540,4878,4879,4881,4884,4886],{"class":542,"line":861},[540,4880,3471],{"class":964},[540,4882,4883],{"class":546}," Poison",[540,4885,2047],{"class":600},[540,4887,889],{"class":600},[540,4889,4890,4892,4894,4896,4899,4901,4904],{"class":542,"line":884},[540,4891,4862],{"class":716},[540,4893,720],{"class":600},[540,4895,713],{"class":600},[540,4897,4898],{"class":716},"admin",[540,4900,720],{"class":600},[540,4902,4903],{"class":546}," boolean",[540,4905,2625],{"class":600},[540,4907,4908],{"class":542,"line":892},[540,4909,2625],{"class":600},[3305,4911],{},[751,4913,4915],{"id":4914},"api-type-imports","API Type Imports",[405,4917,4918,4921,4922,4925,4926,4928],{},[408,4919,4920],{},"rpc-client-imports-server-value"," reports a client file that imports the API type it passes to ",[408,4923,4924],{},"initClient"," without ",[408,4927,3471],{},". A normal import can put your server code and the mion router in your client bundle. The build reports it too, as a RuntimeError.",[405,4930,4931],{},"Only that import is checked: a test can start your server and call it in the same file.",[2143,4933,2146],{"id":4934},"valid-examples-4",[531,4936,4938],{"className":763,"code":4937,"language":765,"meta":536,"style":536},"import type {MyApi} from '.\u002FmyApi.routes.ts';\n\nexport const {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n",[408,4939,4940,4964,4968],{"__ignoreMap":536},[540,4941,4942,4944,4946,4948,4951,4953,4955,4957,4960,4962],{"class":542,"line":543},[540,4943,590],{"class":589},[540,4945,1640],{"class":589},[540,4947,713],{"class":600},[540,4949,4950],{"class":593},"MyApi",[540,4952,779],{"class":600},[540,4954,782],{"class":589},[540,4956,601],{"class":600},[540,4958,4959],{"class":550},".\u002FmyApi.routes.ts",[540,4961,606],{"class":600},[540,4963,609],{"class":600},[540,4965,4966],{"class":542,"line":612},[540,4967,616],{"emptyLinePlaceholder":615},[540,4969,4970,4972,4974,4976,4979,4981,4983,4986,4988,4990,4992,4994,4996,4999,5001,5003,5006,5008,5010,5012],{"class":542,"line":619},[540,4971,622],{"class":589},[540,4973,1088],{"class":964},[540,4975,713],{"class":600},[540,4977,4978],{"class":593},"routes",[540,4980,779],{"class":600},[540,4982,2047],{"class":600},[540,4984,4985],{"class":974}," initClient",[540,4987,1146],{"class":600},[540,4989,4950],{"class":546},[540,4991,1155],{"class":600},[540,4993,1013],{"class":593},[540,4995,1028],{"class":600},[540,4997,4998],{"class":716},"baseURL",[540,5000,720],{"class":600},[540,5002,601],{"class":600},[540,5004,5005],{"class":550},"http:\u002F\u002Flocalhost:3000",[540,5007,606],{"class":600},[540,5009,779],{"class":600},[540,5011,1041],{"class":593},[540,5013,609],{"class":600},[2143,5015,3039],{"id":5016},"invalid-examples-4",[531,5018,5020],{"className":763,"code":5019,"language":765,"meta":536,"style":536},"import {MyApi} from '.\u002FmyApi.routes.ts'; \u002F\u002F rpc-client-imports-server-value: imported without `type`\n\nexport const {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n",[408,5021,5022,5045,5049],{"__ignoreMap":536},[540,5023,5024,5026,5028,5030,5032,5034,5036,5038,5040,5042],{"class":542,"line":543},[540,5025,590],{"class":589},[540,5027,713],{"class":600},[540,5029,4950],{"class":593},[540,5031,779],{"class":600},[540,5033,782],{"class":589},[540,5035,601],{"class":600},[540,5037,4959],{"class":550},[540,5039,606],{"class":600},[540,5041,1359],{"class":600},[540,5043,5044],{"class":1112}," \u002F\u002F rpc-client-imports-server-value: imported without `type`\n",[540,5046,5047],{"class":542,"line":612},[540,5048,616],{"emptyLinePlaceholder":615},[540,5050,5051,5053,5055,5057,5059,5061,5063,5065,5067,5069,5071,5073,5075,5077,5079,5081,5083,5085,5087,5089],{"class":542,"line":619},[540,5052,622],{"class":589},[540,5054,1088],{"class":964},[540,5056,713],{"class":600},[540,5058,4978],{"class":593},[540,5060,779],{"class":600},[540,5062,2047],{"class":600},[540,5064,4985],{"class":974},[540,5066,1146],{"class":600},[540,5068,4950],{"class":546},[540,5070,1155],{"class":600},[540,5072,1013],{"class":593},[540,5074,1028],{"class":600},[540,5076,4998],{"class":716},[540,5078,720],{"class":600},[540,5080,601],{"class":600},[540,5082,5005],{"class":550},[540,5084,606],{"class":600},[540,5086,779],{"class":600},[540,5088,1041],{"class":593},[540,5090,609],{"class":600},[5092,5093,5094],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .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}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}",{"title":536,"searchDepth":612,"depth":612,"links":5096},[5097,5098,5099,5100,5101],{"id":422,"depth":612,"text":423},{"id":528,"depth":612,"text":529},{"id":560,"depth":612,"text":561},{"id":654,"depth":612,"text":655},{"id":748,"depth":612,"text":749,"children":5102},[5103,5104,5105,5106,5107,5108,5109],{"id":753,"depth":619,"text":754},{"id":1579,"depth":619,"text":1580},{"id":2130,"depth":619,"text":2131},{"id":3309,"depth":619,"text":3310},{"id":4131,"depth":619,"text":4132},{"id":4703,"depth":619,"text":4704},{"id":4914,"depth":619,"text":4915},"Lint rules that catch mistakes in mion routes as you write them.","md",null,{},{"title":143,"description":5110},"6ny_moZDZguvABuhQf-Z5SMKdlDIW104qxiWh1ZvETE",1793324371209]