[{"data":1,"prerenderedAt":2646},["ShallowReactive",2],{"navigation_docs":3,"-rpc-devtools-vite":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":147,"body":401,"description":2640,"extension":2641,"links":2642,"meta":2643,"navigation":536,"path":148,"seo":2644,"stem":149,"__hash__":2645},"docs\u002F01.rpc\u002F07.devtools\u002F02.vite.md",{"type":402,"value":403},"minimark",[404,421,429,434,439,442,715,719,730,741,745,764,771,928,962,972,976,1002,1176,1179,1190,1194,1201,1460,1464,1500,1520,1529,1533,1549,1553,1560,2062,2066,2086,2090,2104,2142,2151,2154,2158,2168,2171,2633,2636],[405,406,407,411,412,415,416,420],"p",{},[408,409,410],"code",{},"mionVitePlugin"," from ",[408,413,414],{},"@mionjs\u002Fdevtools\u002Fvite"," is the one Vite plugin for mion's build-time features: compiling validation and the JSON round trip, the batch transport, and, for fullstack apps, running your API ",[417,418,419],"strong",{},"inside the Vite dev server",".",[405,422,423,424,420],{},"The options are listed in ",[425,426,428],"a",{"href":427},"#all-plugin-options","All Plugin Options",[430,431,433],"h2",{"id":432},"configuration-examples","Configuration Examples",[435,436,438],"h3",{"id":437},"server-only-builds","Server-Only Builds",[405,440,441],{},"Use a plain library build for an API with no client in the same project.",[443,444,449],"pre",{"className":445,"code":446,"filename":26,"language":447,"meta":448,"style":448},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {defineConfig} from 'vite';\nimport {resolve} from 'path';\nimport {mionVitePlugin} from '@mionjs\u002Fdevtools\u002Fvite';\n\nexport default defineConfig({\n  plugins: [mionVitePlugin()],\n  build: {\n    lib: {\n      entry: resolve(__dirname, 'src\u002Fserver.ts'),\n      formats: ['es'],\n    },\n    rollupOptions: {\n      external: [\u002F^[^.\u002F]\u002F],\n    },\n  },\n});\n","ts","",[408,450,451,487,510,531,538,557,578,589,599,628,650,656,666,695,700,706],{"__ignoreMap":448},[452,453,456,460,464,468,471,474,477,481,484],"span",{"class":454,"line":455},"line",1,[452,457,459],{"class":458},"s7zQu","import",[452,461,463],{"class":462},"sMK4o"," {",[452,465,467],{"class":466},"sTEyZ","defineConfig",[452,469,470],{"class":462},"}",[452,472,473],{"class":458}," from",[452,475,476],{"class":462}," '",[452,478,480],{"class":479},"sfazB","vite",[452,482,483],{"class":462},"'",[452,485,486],{"class":462},";\n",[452,488,490,492,494,497,499,501,503,506,508],{"class":454,"line":489},2,[452,491,459],{"class":458},[452,493,463],{"class":462},[452,495,496],{"class":466},"resolve",[452,498,470],{"class":462},[452,500,473],{"class":458},[452,502,476],{"class":462},[452,504,505],{"class":479},"path",[452,507,483],{"class":462},[452,509,486],{"class":462},[452,511,513,515,517,519,521,523,525,527,529],{"class":454,"line":512},3,[452,514,459],{"class":458},[452,516,463],{"class":462},[452,518,410],{"class":466},[452,520,470],{"class":462},[452,522,473],{"class":458},[452,524,476],{"class":462},[452,526,414],{"class":479},[452,528,483],{"class":462},[452,530,486],{"class":462},[452,532,534],{"class":454,"line":533},4,[452,535,537],{"emptyLinePlaceholder":536},true,"\n",[452,539,541,544,547,551,554],{"class":454,"line":540},5,[452,542,543],{"class":458},"export",[452,545,546],{"class":458}," default",[452,548,550],{"class":549},"s2Zo4"," defineConfig",[452,552,553],{"class":466},"(",[452,555,556],{"class":462},"{\n",[452,558,560,564,567,570,572,575],{"class":454,"line":559},6,[452,561,563],{"class":562},"swJcz","  plugins",[452,565,566],{"class":462},":",[452,568,569],{"class":466}," [",[452,571,410],{"class":549},[452,573,574],{"class":466},"()]",[452,576,577],{"class":462},",\n",[452,579,581,584,586],{"class":454,"line":580},7,[452,582,583],{"class":562},"  build",[452,585,566],{"class":462},[452,587,588],{"class":462}," {\n",[452,590,592,595,597],{"class":454,"line":591},8,[452,593,594],{"class":562},"    lib",[452,596,566],{"class":462},[452,598,588],{"class":462},[452,600,602,605,607,610,613,616,618,621,623,626],{"class":454,"line":601},9,[452,603,604],{"class":562},"      entry",[452,606,566],{"class":462},[452,608,609],{"class":549}," resolve",[452,611,612],{"class":466},"(__dirname",[452,614,615],{"class":462},",",[452,617,476],{"class":462},[452,619,620],{"class":479},"src\u002Fserver.ts",[452,622,483],{"class":462},[452,624,625],{"class":466},")",[452,627,577],{"class":462},[452,629,631,634,636,638,640,643,645,648],{"class":454,"line":630},10,[452,632,633],{"class":562},"      formats",[452,635,566],{"class":462},[452,637,569],{"class":466},[452,639,483],{"class":462},[452,641,642],{"class":479},"es",[452,644,483],{"class":462},[452,646,647],{"class":466},"]",[452,649,577],{"class":462},[452,651,653],{"class":454,"line":652},11,[452,654,655],{"class":462},"    },\n",[452,657,659,662,664],{"class":454,"line":658},12,[452,660,661],{"class":562},"    rollupOptions",[452,663,566],{"class":462},[452,665,588],{"class":462},[452,667,669,672,674,676,679,682,685,688,691,693],{"class":454,"line":668},13,[452,670,671],{"class":562},"      external",[452,673,566],{"class":462},[452,675,569],{"class":466},[452,677,678],{"class":462},"\u002F",[452,680,681],{"class":458},"^",[452,683,684],{"class":462},"[^",[452,686,687],{"class":479},".\u002F",[452,689,690],{"class":462},"]\u002F",[452,692,647],{"class":466},[452,694,577],{"class":462},[452,696,698],{"class":454,"line":697},14,[452,699,655],{"class":462},[452,701,703],{"class":454,"line":702},15,[452,704,705],{"class":462},"  },\n",[452,707,709,711,713],{"class":454,"line":708},16,[452,710,470],{"class":462},[452,712,625],{"class":466},[452,714,486],{"class":462},[435,716,718],{"id":717},"one-tsconfig-for-client-and-server","One Tsconfig for Client and Server",[405,720,721,722,725,726,729],{},"mion reads your client and server code as one program. ",[408,723,724],{},"tsConfig"," names the tsconfig that includes both, and defaults to ",[408,727,728],{},"tsconfig.json"," in the Vite root.",[731,732,733,734,737,738,740],"note",{},"A tsconfig with only ",[408,735,736],{},"references"," and no files (the shape Vite starters use) fails the build. Point ",[408,739,724],{}," at the tsconfig that lists your source files.",[435,742,744],{"id":743},"fullstack-apps","Fullstack Apps",[405,746,747,748,751,752,755,756,759,760,763],{},"For a fullstack app (Nuxt, SSR, a frontend's own backend), set ",[408,749,750],{},"server.entry"," to your server entry file. ",[408,753,754],{},"vite dev"," then mounts your API in ",[417,757,758],{},"this"," Vite process as dev-server middleware: one process, one port, one module graph. The frontend calls ",[408,761,762],{},"\u002Fapi\u002F..."," on the origin it is served from.",[405,765,766,767,770],{},"Your server entry needs no changes: ",[408,768,769],{},"mion.initRoutes(routes); startNodeServer();"," registers its routes without opening a port. Batches need nothing either: client and API are one program, and a batch edit reloads the API like any other change.",[443,772,775],{"className":445,"code":773,"filename":774,"language":447,"meta":448,"style":448},"import {defineConfig} from 'vite';\nimport {mionVitePlugin} from '@mionjs\u002Fdevtools\u002Fvite';\n\nexport default defineConfig({\n  plugins: [\n    mionVitePlugin({\n      server: {\n        \u002F\u002F loaded through Vite's SSR pipeline (`ssrLoadModule`), so the same plugin transforms it\n        entry: 'src\u002Fserver.ts',\n        \u002F\u002F optional, reloads the API when its sources change (default true)\n        hotReload: true,\n      },\n    }),\n  ],\n});\n","Client + in-process API",[408,776,777,797,817,821,833,842,851,860,866,881,886,899,904,913,920],{"__ignoreMap":448},[452,778,779,781,783,785,787,789,791,793,795],{"class":454,"line":455},[452,780,459],{"class":458},[452,782,463],{"class":462},[452,784,467],{"class":466},[452,786,470],{"class":462},[452,788,473],{"class":458},[452,790,476],{"class":462},[452,792,480],{"class":479},[452,794,483],{"class":462},[452,796,486],{"class":462},[452,798,799,801,803,805,807,809,811,813,815],{"class":454,"line":489},[452,800,459],{"class":458},[452,802,463],{"class":462},[452,804,410],{"class":466},[452,806,470],{"class":462},[452,808,473],{"class":458},[452,810,476],{"class":462},[452,812,414],{"class":479},[452,814,483],{"class":462},[452,816,486],{"class":462},[452,818,819],{"class":454,"line":512},[452,820,537],{"emptyLinePlaceholder":536},[452,822,823,825,827,829,831],{"class":454,"line":533},[452,824,543],{"class":458},[452,826,546],{"class":458},[452,828,550],{"class":549},[452,830,553],{"class":466},[452,832,556],{"class":462},[452,834,835,837,839],{"class":454,"line":540},[452,836,563],{"class":562},[452,838,566],{"class":462},[452,840,841],{"class":466}," [\n",[452,843,844,847,849],{"class":454,"line":559},[452,845,846],{"class":549},"    mionVitePlugin",[452,848,553],{"class":466},[452,850,556],{"class":462},[452,852,853,856,858],{"class":454,"line":580},[452,854,855],{"class":562},"      server",[452,857,566],{"class":462},[452,859,588],{"class":462},[452,861,862],{"class":454,"line":591},[452,863,865],{"class":864},"sHwdD","        \u002F\u002F loaded through Vite's SSR pipeline (`ssrLoadModule`), so the same plugin transforms it\n",[452,867,868,871,873,875,877,879],{"class":454,"line":601},[452,869,870],{"class":562},"        entry",[452,872,566],{"class":462},[452,874,476],{"class":462},[452,876,620],{"class":479},[452,878,483],{"class":462},[452,880,577],{"class":462},[452,882,883],{"class":454,"line":630},[452,884,885],{"class":864},"        \u002F\u002F optional, reloads the API when its sources change (default true)\n",[452,887,888,891,893,897],{"class":454,"line":652},[452,889,890],{"class":562},"        hotReload",[452,892,566],{"class":462},[452,894,896],{"class":895},"sfNiH"," true",[452,898,577],{"class":462},[452,900,901],{"class":454,"line":658},[452,902,903],{"class":462},"      },\n",[452,905,906,909,911],{"class":454,"line":668},[452,907,908],{"class":462},"    }",[452,910,625],{"class":466},[452,912,577],{"class":462},[452,914,915,918],{"class":454,"line":697},[452,916,917],{"class":466},"  ]",[452,919,577],{"class":462},[452,921,922,924,926],{"class":454,"line":702},[452,923,470],{"class":462},[452,925,625],{"class":466},[452,927,486],{"class":462},[405,929,930,931,934,935,938,939,942,943,945,946,949,950,953,954,957,958,961],{},"The router's ",[408,932,933],{},"basePath"," decides what reaches mion, matched on a path boundary, so ",[408,936,937],{},"\u002Fapi"," never catches ",[408,940,941],{},"\u002Fapidocs",". With no ",[408,944,933],{},", mion serves the root and ",[408,947,948],{},"exclude"," leaves Vite's own URLs (",[408,951,952],{},"\u002F@vite\u002F...",", assets, HMR pings) to Vite; extend ",[408,955,956],{},"DEFAULT_MIDDLEWARE_EXCLUDE"," rather than replace it. Editing a route file reloads the API on the next request, and a failed load answers ",[408,959,960],{},"503"," with the real cause instead of a blank page.",[405,963,964,965,968,969,420],{},"A fetch-based adapter (",[408,966,967],{},"@mionjs\u002Fplatform-bun",") works the same way, in every runtime. For an adapter that starts no server (an edge handler), export its handler from the entry as ",[408,970,971],{},"requestHandler",[435,973,975],{"id":974},"one-config-two-bundles","One Config, Two Bundles",[405,977,978,979,982,983,986,987,990,991,994,995,990,998,1001],{},"Set ",[408,980,981],{},"server.build"," and one ",[408,984,985],{},"vite build"," emits the static client files in ",[408,988,989],{},"build.outDir"," (default ",[408,992,993],{},"dist",") and your API in ",[408,996,997],{},"server.build.outDir",[408,999,1000],{},"dist-server","): static files on a CDN plus an API server, from the same config the dev server uses.",[443,1003,1006],{"className":445,"code":1004,"filename":1005,"language":447,"meta":448,"style":448},"import {defineConfig} from 'vite';\nimport {mionVitePlugin} from '@mionjs\u002Fdevtools\u002Fvite';\n\nexport default defineConfig({\n  plugins: [\n    mionVitePlugin({\n      \u002F\u002F one tsconfig for client and server code (the default)\n      tsConfig: 'tsconfig.json',\n      server: {\n        entry: 'src\u002Fserver.ts',\n        \u002F\u002F opt in to the API bundle; leave it out and `vite build` emits the client half only\n        build: {outDir: 'dist-server'},\n      },\n    }),\n  ],\n});\n","vite.config.ts",[408,1007,1008,1028,1048,1052,1064,1072,1080,1085,1100,1108,1122,1127,1150,1154,1162,1168],{"__ignoreMap":448},[452,1009,1010,1012,1014,1016,1018,1020,1022,1024,1026],{"class":454,"line":455},[452,1011,459],{"class":458},[452,1013,463],{"class":462},[452,1015,467],{"class":466},[452,1017,470],{"class":462},[452,1019,473],{"class":458},[452,1021,476],{"class":462},[452,1023,480],{"class":479},[452,1025,483],{"class":462},[452,1027,486],{"class":462},[452,1029,1030,1032,1034,1036,1038,1040,1042,1044,1046],{"class":454,"line":489},[452,1031,459],{"class":458},[452,1033,463],{"class":462},[452,1035,410],{"class":466},[452,1037,470],{"class":462},[452,1039,473],{"class":458},[452,1041,476],{"class":462},[452,1043,414],{"class":479},[452,1045,483],{"class":462},[452,1047,486],{"class":462},[452,1049,1050],{"class":454,"line":512},[452,1051,537],{"emptyLinePlaceholder":536},[452,1053,1054,1056,1058,1060,1062],{"class":454,"line":533},[452,1055,543],{"class":458},[452,1057,546],{"class":458},[452,1059,550],{"class":549},[452,1061,553],{"class":466},[452,1063,556],{"class":462},[452,1065,1066,1068,1070],{"class":454,"line":540},[452,1067,563],{"class":562},[452,1069,566],{"class":462},[452,1071,841],{"class":466},[452,1073,1074,1076,1078],{"class":454,"line":559},[452,1075,846],{"class":549},[452,1077,553],{"class":466},[452,1079,556],{"class":462},[452,1081,1082],{"class":454,"line":580},[452,1083,1084],{"class":864},"      \u002F\u002F one tsconfig for client and server code (the default)\n",[452,1086,1087,1090,1092,1094,1096,1098],{"class":454,"line":591},[452,1088,1089],{"class":562},"      tsConfig",[452,1091,566],{"class":462},[452,1093,476],{"class":462},[452,1095,728],{"class":479},[452,1097,483],{"class":462},[452,1099,577],{"class":462},[452,1101,1102,1104,1106],{"class":454,"line":601},[452,1103,855],{"class":562},[452,1105,566],{"class":462},[452,1107,588],{"class":462},[452,1109,1110,1112,1114,1116,1118,1120],{"class":454,"line":630},[452,1111,870],{"class":562},[452,1113,566],{"class":462},[452,1115,476],{"class":462},[452,1117,620],{"class":479},[452,1119,483],{"class":462},[452,1121,577],{"class":462},[452,1123,1124],{"class":454,"line":652},[452,1125,1126],{"class":864},"        \u002F\u002F opt in to the API bundle; leave it out and `vite build` emits the client half only\n",[452,1128,1129,1132,1134,1136,1139,1141,1143,1145,1147],{"class":454,"line":658},[452,1130,1131],{"class":562},"        build",[452,1133,566],{"class":462},[452,1135,463],{"class":462},[452,1137,1138],{"class":562},"outDir",[452,1140,566],{"class":462},[452,1142,476],{"class":462},[452,1144,1000],{"class":479},[452,1146,483],{"class":462},[452,1148,1149],{"class":462},"},\n",[452,1151,1152],{"class":454,"line":668},[452,1153,903],{"class":462},[452,1155,1156,1158,1160],{"class":454,"line":697},[452,1157,908],{"class":462},[452,1159,625],{"class":466},[452,1161,577],{"class":462},[452,1163,1164,1166],{"class":454,"line":702},[452,1165,917],{"class":466},[452,1167,577],{"class":462},[452,1169,1170,1172,1174],{"class":454,"line":708},[452,1171,470],{"class":462},[452,1173,625],{"class":466},[452,1175,486],{"class":462},[405,1177,1178],{},"Both bundles come from one program, so a type shared by client and API is compiled once and cannot drift. Each bundle holds only the compiled types of the files it imports: the client gets the routes it calls, never the rest of your API. Keep client and server code in separate files, since a file both sides import puts its types in both bundles.",[1180,1181,1182,1183,1186,1187,420],"tip",{},"For a standalone API with no client, leave out the ",[408,1184,1185],{},"server"," block and use a plain library build, as in ",[425,1188,438],{"href":1189},"#server-only-builds",[435,1191,1193],{"id":1192},"client-tests","Client Tests",[405,1195,1196,1197,1200],{},"Tests that need a real socket start the API in the same process, from a Vitest ",[408,1198,1199],{},"globalSetup",". Client and API stay one program, so the build compiles the batches your tests write into the API they run against.",[443,1202,1205],{"className":445,"code":1203,"filename":1204,"language":447,"meta":448,"style":448},"import {startNodeServer} from '@mionjs\u002Fplatform-node';\nimport type {Server} from 'node:http';\n\u002F\u002F the routes module: importing it registers the router\nimport '..\u002Fhttp\u002Fnode-routes.ts';\n\nlet server: Server | undefined;\n\nexport async function setup() {\n  \u002F\u002F resolves once the socket is listening, so nothing is spawned and no port is polled\n  server = (await startNodeServer({port: 8076})) as Server;\n}\n\nexport async function teardown() {\n  if (server) await new Promise\u003Cvoid>((done) => server?.close(() => done()));\n}\n","globalSetup.ts",[408,1206,1207,1229,1253,1258,1271,1275,1298,1302,1320,1325,1368,1373,1377,1392,1456],{"__ignoreMap":448},[452,1208,1209,1211,1213,1216,1218,1220,1222,1225,1227],{"class":454,"line":455},[452,1210,459],{"class":458},[452,1212,463],{"class":462},[452,1214,1215],{"class":466},"startNodeServer",[452,1217,470],{"class":462},[452,1219,473],{"class":458},[452,1221,476],{"class":462},[452,1223,1224],{"class":479},"@mionjs\u002Fplatform-node",[452,1226,483],{"class":462},[452,1228,486],{"class":462},[452,1230,1231,1233,1236,1238,1240,1242,1244,1246,1249,1251],{"class":454,"line":489},[452,1232,459],{"class":458},[452,1234,1235],{"class":458}," type",[452,1237,463],{"class":462},[452,1239,26],{"class":466},[452,1241,470],{"class":462},[452,1243,473],{"class":458},[452,1245,476],{"class":462},[452,1247,1248],{"class":479},"node:http",[452,1250,483],{"class":462},[452,1252,486],{"class":462},[452,1254,1255],{"class":454,"line":512},[452,1256,1257],{"class":864},"\u002F\u002F the routes module: importing it registers the router\n",[452,1259,1260,1262,1264,1267,1269],{"class":454,"line":533},[452,1261,459],{"class":458},[452,1263,476],{"class":462},[452,1265,1266],{"class":479},"..\u002Fhttp\u002Fnode-routes.ts",[452,1268,483],{"class":462},[452,1270,486],{"class":462},[452,1272,1273],{"class":454,"line":540},[452,1274,537],{"emptyLinePlaceholder":536},[452,1276,1277,1281,1284,1286,1290,1293,1296],{"class":454,"line":559},[452,1278,1280],{"class":1279},"spNyl","let",[452,1282,1283],{"class":466}," server",[452,1285,566],{"class":462},[452,1287,1289],{"class":1288},"sBMFI"," Server",[452,1291,1292],{"class":462}," |",[452,1294,1295],{"class":1288}," undefined",[452,1297,486],{"class":462},[452,1299,1300],{"class":454,"line":580},[452,1301,537],{"emptyLinePlaceholder":536},[452,1303,1304,1306,1309,1312,1315,1318],{"class":454,"line":591},[452,1305,543],{"class":458},[452,1307,1308],{"class":1279}," async",[452,1310,1311],{"class":1279}," function",[452,1313,1314],{"class":549}," setup",[452,1316,1317],{"class":462},"()",[452,1319,588],{"class":462},[452,1321,1322],{"class":454,"line":601},[452,1323,1324],{"class":864},"  \u002F\u002F resolves once the socket is listening, so nothing is spawned and no port is polled\n",[452,1326,1327,1330,1333,1336,1339,1342,1344,1347,1350,1352,1356,1358,1361,1364,1366],{"class":454,"line":630},[452,1328,1329],{"class":466},"  server",[452,1331,1332],{"class":462}," =",[452,1334,1335],{"class":562}," (",[452,1337,1338],{"class":458},"await",[452,1340,1341],{"class":549}," startNodeServer",[452,1343,553],{"class":562},[452,1345,1346],{"class":462},"{",[452,1348,1349],{"class":562},"port",[452,1351,566],{"class":462},[452,1353,1355],{"class":1354},"sbssI"," 8076",[452,1357,470],{"class":462},[452,1359,1360],{"class":562},")) ",[452,1362,1363],{"class":458},"as",[452,1365,1289],{"class":1288},[452,1367,486],{"class":462},[452,1369,1370],{"class":454,"line":652},[452,1371,1372],{"class":462},"}\n",[452,1374,1375],{"class":454,"line":658},[452,1376,537],{"emptyLinePlaceholder":536},[452,1378,1379,1381,1383,1385,1388,1390],{"class":454,"line":668},[452,1380,543],{"class":458},[452,1382,1308],{"class":1279},[452,1384,1311],{"class":1279},[452,1386,1387],{"class":549}," teardown",[452,1389,1317],{"class":462},[452,1391,588],{"class":462},[452,1393,1394,1397,1399,1401,1404,1406,1409,1412,1415,1418,1421,1423,1425,1429,1431,1434,1436,1439,1442,1444,1446,1448,1451,1454],{"class":454,"line":697},[452,1395,1396],{"class":458},"  if",[452,1398,1335],{"class":562},[452,1400,1185],{"class":466},[452,1402,1403],{"class":562},") ",[452,1405,1338],{"class":458},[452,1407,1408],{"class":462}," new",[452,1410,1411],{"class":1288}," Promise",[452,1413,1414],{"class":462},"\u003C",[452,1416,1417],{"class":1288},"void",[452,1419,1420],{"class":462},">",[452,1422,553],{"class":562},[452,1424,553],{"class":462},[452,1426,1428],{"class":1427},"sHdIc","done",[452,1430,625],{"class":462},[452,1432,1433],{"class":1279}," =>",[452,1435,1283],{"class":466},[452,1437,1438],{"class":462},"?.",[452,1440,1441],{"class":549},"close",[452,1443,553],{"class":562},[452,1445,1317],{"class":462},[452,1447,1433],{"class":1279},[452,1449,1450],{"class":549}," done",[452,1452,1453],{"class":562},"()))",[452,1455,486],{"class":462},[452,1457,1458],{"class":454,"line":702},[452,1459,1372],{"class":462},[435,1461,1463],{"id":1462},"vue-single-file-components","Vue Single-File Components",[405,1465,1466,1467,1470,1471,1335,1474,1477,1478,1477,1481,1484,1485,1488,1489,1492,1493,1496,1497,1499],{},"Typed mion code in a ",[408,1468,1469],{},".vue"," ",[408,1472,1473],{},"\u003Cscript>",[408,1475,1476],{},"createValidate*",", ",[408,1479,1480],{},"batch",[408,1482,1483],{},"inputFrom",", any call the plugin compiles) is compiled like code in a ",[408,1486,1487],{},".ts"," file. Keep ",[408,1490,1491],{},"@vitejs\u002Fplugin-vue"," in the same config; ",[408,1494,1495],{},"\u003Cscript setup>"," and classic ",[408,1498,1473],{}," both work, even with a type declared in one and used in the other.",[405,1501,1502,1503,1505,1506,1509,1510,1515,1516,1519],{},"The types a marker reads must live in a ",[408,1504,1487],{}," or ",[408,1507,1508],{},".d.ts"," file or a package. A type imported ",[417,1511,1512,1513],{},"from another ",[408,1514,1469],{}," file cannot be resolved, so the build stops with ",[408,1517,1518],{},"marker-any-from-unresolved-import"," naming that import.",[731,1521,1522,1525,1526,1528],{},[408,1523,1524],{},"runTypes: {sfc: false}"," turns this off. The plugin still warns when a ",[408,1527,1469],{}," file ships a marker with no compiled functions, since that fails at runtime.",[435,1530,1532],{"id":1531},"bundled-client","Bundled Client",[405,1534,1535,1536,1539,1540,1543,1544,1548],{},"By default the build bundles every route the client calls, under ",[408,1537,1538],{},".mion\u002Fapi\u002F",", so a call needs no request and no code built at runtime. Set ",[408,1541,1542],{},"client: {routes: 'fetch'}"," to ",[425,1545,1547],{"href":1546},"\u002Frpc\u002Fmiddlewares\u002Ffetch-metadata#disabling-routes-metadata-bundling","fetch them from the server"," instead.",[435,1550,1552],{"id":1551},"generic-call-helpers","Generic Call Helpers",[405,1554,1555,1556,1559],{},"The build bundles a call only when it can see which route the call names. A helper typed with a plain ",[408,1557,1558],{},"RouteSubRequest\u003Cany>"," hides the route, so keep the helper generic.",[443,1561,1564],{"className":445,"code":1562,"filename":1563,"language":447,"meta":448,"style":448},"import {initClient, type RouteSubRequest} from '@mionjs\u002Fclient';\nimport type {MyApi} from '.\u002Finit.routes.ts';\n\nconst {routes} = initClient\u003CMyApi>({baseURL: 'http:\u002F\u002Flocalhost:3000'});\n\n\u002F\u002F This route is bundled: the call names it, so its functions ship with the app.\nconst [user, error] = await routes.users.getById('u1').call();\n\n\u002F\u002F A helper keeps the route's name when it stays generic, so the build still sees which route it calls.\nasync function callWithRetry\u003CS extends RouteSubRequest\u003Cany>>(\n  sub: S,\n  tries = 2\n) {\n  let last: Awaited\u003CReturnType\u003CS['call']>> | undefined;\n  for (let i = 0; i \u003C tries; i++) {\n    last = (await sub.call()) as Awaited\u003CReturnType\u003CS['call']>>;\n    if (!last[2]['@thrownErrors']) break; \u002F\u002F no untyped error: done\n  }\n  return last!;\n}\n\nconst [again] = await callWithRetry(routes.users.getById('u1'));\n\nconsole.log(user, error, again);\n","client.ts",[408,1565,1566,1595,1619,1623,1668,1672,1677,1731,1735,1740,1768,1780,1790,1796,1838,1877,1923,1963,1969,1980,1985,1990,2032,2037],{"__ignoreMap":448},[452,1567,1568,1570,1572,1575,1577,1579,1582,1584,1586,1588,1591,1593],{"class":454,"line":455},[452,1569,459],{"class":458},[452,1571,463],{"class":462},[452,1573,1574],{"class":466},"initClient",[452,1576,615],{"class":462},[452,1578,1235],{"class":458},[452,1580,1581],{"class":466}," RouteSubRequest",[452,1583,470],{"class":462},[452,1585,473],{"class":458},[452,1587,476],{"class":462},[452,1589,1590],{"class":479},"@mionjs\u002Fclient",[452,1592,483],{"class":462},[452,1594,486],{"class":462},[452,1596,1597,1599,1601,1603,1606,1608,1610,1612,1615,1617],{"class":454,"line":489},[452,1598,459],{"class":458},[452,1600,1235],{"class":458},[452,1602,463],{"class":462},[452,1604,1605],{"class":466},"MyApi",[452,1607,470],{"class":462},[452,1609,473],{"class":458},[452,1611,476],{"class":462},[452,1613,1614],{"class":479},".\u002Finit.routes.ts",[452,1616,483],{"class":462},[452,1618,486],{"class":462},[452,1620,1621],{"class":454,"line":512},[452,1622,537],{"emptyLinePlaceholder":536},[452,1624,1625,1628,1630,1633,1635,1637,1640,1642,1644,1646,1648,1650,1653,1655,1657,1660,1662,1664,1666],{"class":454,"line":533},[452,1626,1627],{"class":1279},"const",[452,1629,463],{"class":462},[452,1631,1632],{"class":466},"routes",[452,1634,470],{"class":462},[452,1636,1332],{"class":462},[452,1638,1639],{"class":549}," initClient",[452,1641,1414],{"class":462},[452,1643,1605],{"class":1288},[452,1645,1420],{"class":462},[452,1647,553],{"class":466},[452,1649,1346],{"class":462},[452,1651,1652],{"class":562},"baseURL",[452,1654,566],{"class":462},[452,1656,476],{"class":462},[452,1658,1659],{"class":479},"http:\u002F\u002Flocalhost:3000",[452,1661,483],{"class":462},[452,1663,470],{"class":462},[452,1665,625],{"class":466},[452,1667,486],{"class":462},[452,1669,1670],{"class":454,"line":540},[452,1671,537],{"emptyLinePlaceholder":536},[452,1673,1674],{"class":454,"line":559},[452,1675,1676],{"class":864},"\u002F\u002F This route is bundled: the call names it, so its functions ship with the app.\n",[452,1678,1679,1681,1683,1686,1688,1691,1693,1695,1698,1701,1703,1706,1708,1711,1713,1715,1718,1720,1722,1724,1727,1729],{"class":454,"line":580},[452,1680,1627],{"class":1279},[452,1682,569],{"class":462},[452,1684,1685],{"class":466},"user",[452,1687,615],{"class":462},[452,1689,1690],{"class":466}," error",[452,1692,647],{"class":462},[452,1694,1332],{"class":462},[452,1696,1697],{"class":458}," await",[452,1699,1700],{"class":466}," routes",[452,1702,420],{"class":462},[452,1704,1705],{"class":466},"users",[452,1707,420],{"class":462},[452,1709,1710],{"class":549},"getById",[452,1712,553],{"class":466},[452,1714,483],{"class":462},[452,1716,1717],{"class":479},"u1",[452,1719,483],{"class":462},[452,1721,625],{"class":466},[452,1723,420],{"class":462},[452,1725,1726],{"class":549},"call",[452,1728,1317],{"class":466},[452,1730,486],{"class":462},[452,1732,1733],{"class":454,"line":591},[452,1734,537],{"emptyLinePlaceholder":536},[452,1736,1737],{"class":454,"line":601},[452,1738,1739],{"class":864},"\u002F\u002F A helper keeps the route's name when it stays generic, so the build still sees which route it calls.\n",[452,1741,1742,1745,1747,1750,1752,1755,1758,1760,1762,1765],{"class":454,"line":630},[452,1743,1744],{"class":1279},"async",[452,1746,1311],{"class":1279},[452,1748,1749],{"class":549}," callWithRetry",[452,1751,1414],{"class":462},[452,1753,1754],{"class":1288},"S",[452,1756,1757],{"class":1279}," extends",[452,1759,1581],{"class":1288},[452,1761,1414],{"class":462},[452,1763,1764],{"class":1288},"any",[452,1766,1767],{"class":462},">>(\n",[452,1769,1770,1773,1775,1778],{"class":454,"line":652},[452,1771,1772],{"class":1427},"  sub",[452,1774,566],{"class":462},[452,1776,1777],{"class":1288}," S",[452,1779,577],{"class":462},[452,1781,1782,1785,1787],{"class":454,"line":658},[452,1783,1784],{"class":1427},"  tries",[452,1786,1332],{"class":462},[452,1788,1789],{"class":1354}," 2\n",[452,1791,1792,1794],{"class":454,"line":668},[452,1793,625],{"class":462},[452,1795,588],{"class":462},[452,1797,1798,1801,1804,1806,1809,1811,1814,1816,1818,1821,1823,1825,1827,1829,1832,1834,1836],{"class":454,"line":697},[452,1799,1800],{"class":1279},"  let",[452,1802,1803],{"class":466}," last",[452,1805,566],{"class":462},[452,1807,1808],{"class":1288}," Awaited",[452,1810,1414],{"class":462},[452,1812,1813],{"class":1288},"ReturnType",[452,1815,1414],{"class":462},[452,1817,1754],{"class":1288},[452,1819,1820],{"class":562},"[",[452,1822,483],{"class":462},[452,1824,1726],{"class":479},[452,1826,483],{"class":462},[452,1828,647],{"class":562},[452,1830,1831],{"class":462},">>",[452,1833,1292],{"class":462},[452,1835,1295],{"class":1288},[452,1837,486],{"class":462},[452,1839,1840,1843,1845,1847,1850,1852,1855,1858,1860,1863,1866,1868,1870,1873,1875],{"class":454,"line":702},[452,1841,1842],{"class":458},"  for",[452,1844,1335],{"class":562},[452,1846,1280],{"class":1279},[452,1848,1849],{"class":466}," i",[452,1851,1332],{"class":462},[452,1853,1854],{"class":1354}," 0",[452,1856,1857],{"class":462},";",[452,1859,1849],{"class":466},[452,1861,1862],{"class":462}," \u003C",[452,1864,1865],{"class":466}," tries",[452,1867,1857],{"class":462},[452,1869,1849],{"class":466},[452,1871,1872],{"class":462},"++",[452,1874,1403],{"class":562},[452,1876,556],{"class":462},[452,1878,1879,1882,1884,1886,1888,1891,1893,1895,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920],{"class":454,"line":708},[452,1880,1881],{"class":466},"    last",[452,1883,1332],{"class":462},[452,1885,1335],{"class":562},[452,1887,1338],{"class":458},[452,1889,1890],{"class":466}," sub",[452,1892,420],{"class":462},[452,1894,1726],{"class":549},[452,1896,1897],{"class":562},"()) ",[452,1899,1363],{"class":458},[452,1901,1808],{"class":1288},[452,1903,1414],{"class":462},[452,1905,1813],{"class":1288},[452,1907,1414],{"class":462},[452,1909,1754],{"class":1288},[452,1911,1820],{"class":562},[452,1913,483],{"class":462},[452,1915,1726],{"class":479},[452,1917,483],{"class":462},[452,1919,647],{"class":562},[452,1921,1922],{"class":462},">>;\n",[452,1924,1926,1929,1931,1934,1937,1939,1942,1945,1947,1950,1952,1955,1958,1960],{"class":454,"line":1925},17,[452,1927,1928],{"class":458},"    if",[452,1930,1335],{"class":562},[452,1932,1933],{"class":462},"!",[452,1935,1936],{"class":466},"last",[452,1938,1820],{"class":562},[452,1940,1941],{"class":1354},"2",[452,1943,1944],{"class":562},"][",[452,1946,483],{"class":462},[452,1948,1949],{"class":479},"@thrownErrors",[452,1951,483],{"class":462},[452,1953,1954],{"class":562},"]) ",[452,1956,1957],{"class":458},"break",[452,1959,1857],{"class":462},[452,1961,1962],{"class":864}," \u002F\u002F no untyped error: done\n",[452,1964,1966],{"class":454,"line":1965},18,[452,1967,1968],{"class":462},"  }\n",[452,1970,1972,1975,1977],{"class":454,"line":1971},19,[452,1973,1974],{"class":458},"  return",[452,1976,1803],{"class":466},[452,1978,1979],{"class":462},"!;\n",[452,1981,1983],{"class":454,"line":1982},20,[452,1984,1372],{"class":462},[452,1986,1988],{"class":454,"line":1987},21,[452,1989,537],{"emptyLinePlaceholder":536},[452,1991,1993,1995,1997,2000,2002,2004,2006,2008,2011,2013,2015,2017,2019,2021,2023,2025,2027,2030],{"class":454,"line":1992},22,[452,1994,1627],{"class":1279},[452,1996,569],{"class":462},[452,1998,1999],{"class":466},"again",[452,2001,647],{"class":462},[452,2003,1332],{"class":462},[452,2005,1697],{"class":458},[452,2007,1749],{"class":549},[452,2009,2010],{"class":466},"(routes",[452,2012,420],{"class":462},[452,2014,1705],{"class":466},[452,2016,420],{"class":462},[452,2018,1710],{"class":549},[452,2020,553],{"class":466},[452,2022,483],{"class":462},[452,2024,1717],{"class":479},[452,2026,483],{"class":462},[452,2028,2029],{"class":466},"))",[452,2031,486],{"class":462},[452,2033,2035],{"class":454,"line":2034},23,[452,2036,537],{"emptyLinePlaceholder":536},[452,2038,2040,2043,2045,2048,2051,2053,2055,2057,2060],{"class":454,"line":2039},24,[452,2041,2042],{"class":466},"console",[452,2044,420],{"class":462},[452,2046,2047],{"class":549},"log",[452,2049,2050],{"class":466},"(user",[452,2052,615],{"class":462},[452,2054,1690],{"class":466},[452,2056,615],{"class":462},[452,2058,2059],{"class":466}," again)",[452,2061,486],{"class":462},[435,2063,2065],{"id":2064},"client-without-the-plugin","Client Without the Plugin",[405,2067,2068,2069,2074,2075,2077,2078,2081,2082,2085],{},"Without the plugin, a client fetches validation and JSON round trip metadata from the server at runtime, so single route calls need no build step once you set up ",[425,2070,2071],{"href":1546},[408,2072,2073],{},"useFetchMetadata",". It cannot send a ",[425,2076,1480],{"href":96},": batch ids come from the build, so ",[408,2079,2080],{},"batch()"," throws ",[408,2083,2084],{},"batch-missing-id",". A client that uses batches must be built in the same program as its API.",[430,2087,2089],{"id":2088},"batch-transport","Batch Transport",[405,2091,2092,2093,2095,2096,2099,2100,2103],{},"A ",[425,2094,1480],{"href":96}," is written in ",[417,2097,2098],{},"client"," code, but the server runs only the batch ids it knows. The build gives each ",[408,2101,2102],{},"batch([...])"," call an id from its routes and mappings, and collects them for the server itself, with no option:",[2105,2106,2107,2125,2139],"ul",{},[2108,2109,2110,2111,2113,2114,2116,2117,2120,2121,2124],"li",{},"It reads every ",[408,2112,2102],{}," call and inline ",[408,2115,1483],{}," mapper in the program. It writes the batch table (",[408,2118,2119],{},"batches.generated.js",") and one module per inline mapper to ",[408,2122,2123],{},".mion\u002Frpc\u002F"," in its gen dir.",[2108,2126,2127,2128,2131,2132,2134,2135,2138],{},"It adds the table's import to the module that calls ",[408,2129,2130],{},"createMionRouter",", so you write nothing. ",[408,2133,985],{}," inlines the table and bundles each mapper, so the output has no ",[408,2136,2137],{},"node:fs"," and stays edge and lambda safe.",[2108,2140,2141],{},"The client calls get each batch's id and each mapper's hash from the same source, so the two sides agree in any build order.",[405,2143,2144,2147,2148,2150],{},[408,2145,2146],{},"mion compile"," in the ",[425,2149,155],{"href":156}," generates the same folder.",[731,2152,2153],{},"A batch the build cannot read (a spread, a route from a function parameter, a mapper it cannot trace) fails the build, because a batch without an id can never be sent.",[430,2155,2157],{"id":2156},"lint-rules","Lint Rules",[405,2159,2160,2161,2164,2165,2167],{},"The lint plugin ships in the same package, on the ",[408,2162,2163],{},"@mionjs\u002Fdevtools\u002Feslint"," entry. See ",[425,2166,143],{"href":144}," for its rules and config.",[430,2169,428],{"id":2170},"all-plugin-options",[443,2172,2176],{"className":2173,"code":2174,"language":2175,"meta":448,"style":448},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {mionVitePlugin} from '@mionjs\u002Fdevtools\u002Fvite';\n\nmionVitePlugin({\n    \u002F\u002F The one tsconfig that includes your client and server code (default: tsconfig.json in the Vite root)\n    tsConfig?: string;\n\n    client?: {\n        \u002F\u002F 'bundle' (default): ship each called route's metadata and compiled functions, no request needed.\n        \u002F\u002F 'fetch': get them from the server on first use (needs useFetchMetadata and mionFetchMetadata).\n        routes?: 'bundle' | 'fetch';\n    },\n\n    \u002F\u002F Fullstack app only: the mion API this Vite run hosts, mounted INSIDE `vite dev`, and a second\n    \u002F\u002F `vite build` bundle with `build` set. Leave it out for an API started on its own.\n    server?: {\n        entry: string;                    \u002F\u002F The server entry file, relative to the Vite root (required)\n\n        \u002F\u002F build: opt in to the second bundle\n        build?: {\n            outDir?: string;              \u002F\u002F Where the API bundle lands (default: 'dist-server')\n        },\n\n        \u002F\u002F dev server\n        exclude?: RegExp[];               \u002F\u002F With no router basePath: paths left to Vite (assets, \u002F@vite\u002F…)\n        hotReload?: boolean;              \u002F\u002F Re-load the API on source changes (default: true)\n    },\n\n    \u002F\u002F Build-time compilation of validation and the JSON round trip\n    runTypes?: {\n        genDir?: string;                  \u002F\u002F Generated-output root (default: \u003CsrcDir>\u002F.mion)\n        emitMode?: 'code' | 'both' | 'ts'; \u002F\u002F What generated functions ship (default: 'code'). MUST be 'both' on edge\n                                          \u002F\u002F runtimes (Cloudflare Workers, Vercel Edge), which forbid the\n                                          \u002F\u002F `new Function` that 'code' runs on first use. 'ts' writes typed .ts modules.\n        downgradeErrors?: string[] | '*'; \u002F\u002F Report these RuntimeErrors as warnings instead of stopping (default: none)\n        levels?: 'all';                   \u002F\u002F Also print Info messages, hidden by default\n        logStyle?: 'grouped' | 'lines';   \u002F\u002F Each message once with its places (default), or one line each\n        patternSampleCount?: number;      \u002F\u002F mockSamples generated per pattern that declares none\n        patternSampleRetries?: number;    \u002F\u002F Generation retries before failing with format-sample-generation-failed\n        derivedPayloadLimits?: boolean;   \u002F\u002F Derive per-route size limits from the types (default: true)\n        jsRuntime?: string;               \u002F\u002F Runtime for the pattern-check sidecar (node\u002Fbun auto-detected)\n        sfc?: boolean;                    \u002F\u002F Transform typed code in Vue SFC \u003Cscript> blocks (default: true)\n    },\n});\n","typescript",[408,2177,2178,2198,2202,2210,2215,2225,2229,2239,2244,2249,2274,2278,2282,2287,2292,2301,2313,2317,2322,2330,2343,2348,2352,2357,2370,2383,2388,2393,2399,2409,2423,2460,2466,2472,2498,2519,2549,2563,2577,2591,2605,2619,2624],{"__ignoreMap":448},[452,2179,2180,2182,2184,2186,2188,2190,2192,2194,2196],{"class":454,"line":455},[452,2181,459],{"class":458},[452,2183,463],{"class":462},[452,2185,410],{"class":466},[452,2187,470],{"class":462},[452,2189,473],{"class":458},[452,2191,476],{"class":462},[452,2193,414],{"class":479},[452,2195,483],{"class":462},[452,2197,486],{"class":462},[452,2199,2200],{"class":454,"line":489},[452,2201,537],{"emptyLinePlaceholder":536},[452,2203,2204,2206,2208],{"class":454,"line":512},[452,2205,410],{"class":549},[452,2207,553],{"class":466},[452,2209,556],{"class":462},[452,2211,2212],{"class":454,"line":533},[452,2213,2214],{"class":864},"    \u002F\u002F The one tsconfig that includes your client and server code (default: tsconfig.json in the Vite root)\n",[452,2216,2217,2220,2222],{"class":454,"line":540},[452,2218,2219],{"class":466},"    tsConfig?",[452,2221,566],{"class":462},[452,2223,2224],{"class":466}," string;\n",[452,2226,2227],{"class":454,"line":559},[452,2228,537],{"emptyLinePlaceholder":536},[452,2230,2231,2234,2237],{"class":454,"line":580},[452,2232,2233],{"class":466},"    client",[452,2235,2236],{"class":462},"?:",[452,2238,588],{"class":462},[452,2240,2241],{"class":454,"line":591},[452,2242,2243],{"class":864},"        \u002F\u002F 'bundle' (default): ship each called route's metadata and compiled functions, no request needed.\n",[452,2245,2246],{"class":454,"line":601},[452,2247,2248],{"class":864},"        \u002F\u002F 'fetch': get them from the server on first use (needs useFetchMetadata and mionFetchMetadata).\n",[452,2250,2251,2254,2256,2258,2261,2263,2265,2267,2270,2272],{"class":454,"line":630},[452,2252,2253],{"class":466},"        routes?",[452,2255,566],{"class":462},[452,2257,476],{"class":462},[452,2259,2260],{"class":479},"bundle",[452,2262,483],{"class":462},[452,2264,1292],{"class":462},[452,2266,476],{"class":462},[452,2268,2269],{"class":479},"fetch",[452,2271,483],{"class":462},[452,2273,486],{"class":466},[452,2275,2276],{"class":454,"line":652},[452,2277,655],{"class":462},[452,2279,2280],{"class":454,"line":658},[452,2281,537],{"emptyLinePlaceholder":536},[452,2283,2284],{"class":454,"line":668},[452,2285,2286],{"class":864},"    \u002F\u002F Fullstack app only: the mion API this Vite run hosts, mounted INSIDE `vite dev`, and a second\n",[452,2288,2289],{"class":454,"line":697},[452,2290,2291],{"class":864},"    \u002F\u002F `vite build` bundle with `build` set. Leave it out for an API started on its own.\n",[452,2293,2294,2297,2299],{"class":454,"line":702},[452,2295,2296],{"class":466},"    server?",[452,2298,566],{"class":462},[452,2300,588],{"class":462},[452,2302,2303,2305,2307,2310],{"class":454,"line":708},[452,2304,870],{"class":562},[452,2306,566],{"class":462},[452,2308,2309],{"class":466}," string;                    ",[452,2311,2312],{"class":864},"\u002F\u002F The server entry file, relative to the Vite root (required)\n",[452,2314,2315],{"class":454,"line":1925},[452,2316,537],{"emptyLinePlaceholder":536},[452,2318,2319],{"class":454,"line":1965},[452,2320,2321],{"class":864},"        \u002F\u002F build: opt in to the second bundle\n",[452,2323,2324,2326,2328],{"class":454,"line":1971},[452,2325,1131],{"class":466},[452,2327,2236],{"class":462},[452,2329,588],{"class":462},[452,2331,2332,2335,2337,2340],{"class":454,"line":1982},[452,2333,2334],{"class":466},"            outDir?",[452,2336,566],{"class":462},[452,2338,2339],{"class":466}," string;              ",[452,2341,2342],{"class":864},"\u002F\u002F Where the API bundle lands (default: 'dist-server')\n",[452,2344,2345],{"class":454,"line":1987},[452,2346,2347],{"class":462},"        },\n",[452,2349,2350],{"class":454,"line":1992},[452,2351,537],{"emptyLinePlaceholder":536},[452,2353,2354],{"class":454,"line":2034},[452,2355,2356],{"class":864},"        \u002F\u002F dev server\n",[452,2358,2359,2362,2364,2367],{"class":454,"line":2039},[452,2360,2361],{"class":466},"        exclude?",[452,2363,566],{"class":462},[452,2365,2366],{"class":466}," RegExp[];               ",[452,2368,2369],{"class":864},"\u002F\u002F With no router basePath: paths left to Vite (assets, \u002F@vite\u002F…)\n",[452,2371,2373,2375,2377,2380],{"class":454,"line":2372},25,[452,2374,890],{"class":466},[452,2376,2236],{"class":462},[452,2378,2379],{"class":466}," boolean;              ",[452,2381,2382],{"class":864},"\u002F\u002F Re-load the API on source changes (default: true)\n",[452,2384,2386],{"class":454,"line":2385},26,[452,2387,655],{"class":462},[452,2389,2391],{"class":454,"line":2390},27,[452,2392,537],{"emptyLinePlaceholder":536},[452,2394,2396],{"class":454,"line":2395},28,[452,2397,2398],{"class":864},"    \u002F\u002F Build-time compilation of validation and the JSON round trip\n",[452,2400,2402,2405,2407],{"class":454,"line":2401},29,[452,2403,2404],{"class":466},"    runTypes?",[452,2406,566],{"class":462},[452,2408,588],{"class":462},[452,2410,2412,2415,2417,2420],{"class":454,"line":2411},30,[452,2413,2414],{"class":466},"        genDir?",[452,2416,566],{"class":462},[452,2418,2419],{"class":466}," string;                  ",[452,2421,2422],{"class":864},"\u002F\u002F Generated-output root (default: \u003CsrcDir>\u002F.mion)\n",[452,2424,2426,2429,2431,2433,2435,2437,2439,2441,2444,2446,2448,2450,2452,2454,2457],{"class":454,"line":2425},31,[452,2427,2428],{"class":466},"        emitMode",[452,2430,2236],{"class":462},[452,2432,476],{"class":462},[452,2434,408],{"class":479},[452,2436,483],{"class":462},[452,2438,1292],{"class":462},[452,2440,476],{"class":462},[452,2442,2443],{"class":479},"both",[452,2445,483],{"class":462},[452,2447,1292],{"class":462},[452,2449,476],{"class":462},[452,2451,447],{"class":479},[452,2453,483],{"class":462},[452,2455,2456],{"class":466},"; ",[452,2458,2459],{"class":864},"\u002F\u002F What generated functions ship (default: 'code'). MUST be 'both' on edge\n",[452,2461,2463],{"class":454,"line":2462},32,[452,2464,2465],{"class":864},"                                          \u002F\u002F runtimes (Cloudflare Workers, Vercel Edge), which forbid the\n",[452,2467,2469],{"class":454,"line":2468},33,[452,2470,2471],{"class":864},"                                          \u002F\u002F `new Function` that 'code' runs on first use. 'ts' writes typed .ts modules.\n",[452,2473,2475,2478,2480,2483,2486,2488,2491,2493,2495],{"class":454,"line":2474},34,[452,2476,2477],{"class":466},"        downgradeErrors",[452,2479,2236],{"class":462},[452,2481,2482],{"class":466}," string[] ",[452,2484,2485],{"class":462},"|",[452,2487,476],{"class":462},[452,2489,2490],{"class":479},"*",[452,2492,483],{"class":462},[452,2494,2456],{"class":466},[452,2496,2497],{"class":864},"\u002F\u002F Report these RuntimeErrors as warnings instead of stopping (default: none)\n",[452,2499,2501,2504,2506,2508,2511,2513,2516],{"class":454,"line":2500},35,[452,2502,2503],{"class":466},"        levels",[452,2505,2236],{"class":462},[452,2507,476],{"class":462},[452,2509,2510],{"class":479},"all",[452,2512,483],{"class":462},[452,2514,2515],{"class":466},";                   ",[452,2517,2518],{"class":864},"\u002F\u002F Also print Info messages, hidden by default\n",[452,2520,2522,2525,2527,2529,2532,2534,2536,2538,2541,2543,2546],{"class":454,"line":2521},36,[452,2523,2524],{"class":466},"        logStyle",[452,2526,2236],{"class":462},[452,2528,476],{"class":462},[452,2530,2531],{"class":479},"grouped",[452,2533,483],{"class":462},[452,2535,1292],{"class":462},[452,2537,476],{"class":462},[452,2539,2540],{"class":479},"lines",[452,2542,483],{"class":462},[452,2544,2545],{"class":466},";   ",[452,2547,2548],{"class":864},"\u002F\u002F Each message once with its places (default), or one line each\n",[452,2550,2552,2555,2557,2560],{"class":454,"line":2551},37,[452,2553,2554],{"class":466},"        patternSampleCount",[452,2556,2236],{"class":462},[452,2558,2559],{"class":466}," number;      ",[452,2561,2562],{"class":864},"\u002F\u002F mockSamples generated per pattern that declares none\n",[452,2564,2566,2569,2571,2574],{"class":454,"line":2565},38,[452,2567,2568],{"class":466},"        patternSampleRetries",[452,2570,2236],{"class":462},[452,2572,2573],{"class":466}," number;    ",[452,2575,2576],{"class":864},"\u002F\u002F Generation retries before failing with format-sample-generation-failed\n",[452,2578,2580,2583,2585,2588],{"class":454,"line":2579},39,[452,2581,2582],{"class":466},"        derivedPayloadLimits",[452,2584,2236],{"class":462},[452,2586,2587],{"class":466}," boolean;   ",[452,2589,2590],{"class":864},"\u002F\u002F Derive per-route size limits from the types (default: true)\n",[452,2592,2594,2597,2599,2602],{"class":454,"line":2593},40,[452,2595,2596],{"class":466},"        jsRuntime",[452,2598,2236],{"class":462},[452,2600,2601],{"class":466}," string;               ",[452,2603,2604],{"class":864},"\u002F\u002F Runtime for the pattern-check sidecar (node\u002Fbun auto-detected)\n",[452,2606,2608,2611,2613,2616],{"class":454,"line":2607},41,[452,2609,2610],{"class":466},"        sfc",[452,2612,2236],{"class":462},[452,2614,2615],{"class":466}," boolean;                    ",[452,2617,2618],{"class":864},"\u002F\u002F Transform typed code in Vue SFC \u003Cscript> blocks (default: true)\n",[452,2620,2622],{"class":454,"line":2621},42,[452,2623,655],{"class":462},[452,2625,2627,2629,2631],{"class":454,"line":2626},43,[452,2628,470],{"class":462},[452,2630,625],{"class":466},[452,2632,486],{"class":462},[731,2634,2635],{},"Build-time compilation is always on, the batch transport is automatic, and scan scope comes from your tsconfig, so none of the three has an option here.",[2637,2638,2639],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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}","Configure the mion Vite plugin for server and client packages.","md",null,{"toc":24},{"title":147,"description":2640},"4LiDHQfZFOG2yLwZLb9iNwky61SsqEDAQDxrVJ86WVE",1793324371327]