[{"data":1,"prerenderedAt":1336},["ShallowReactive",2],{"navigation_docs":3,"-rpc-introduction-quick-start":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":17,"body":401,"description":1329,"extension":1330,"links":1331,"meta":1332,"navigation":1333,"path":18,"seo":1334,"stem":19,"__hash__":1335},"docs\u002F01.rpc\u002F01.introduction\u002F02.quick-start.md",{"type":402,"value":403},"minimark",[404,413,478,481,486,502,527,774,776,780,788,812,1013,1015,1019,1027,1071,1300,1325],[405,406,407,408,412],"p",{},"mion has three starter projects that set up a fully typed frontend and backend in one step. Each keeps the mion API in its own ",[409,410,411],"code",{},"api\u002F"," package, so you can deploy the frontend and the API independently.",[414,415,416,445,462],"code-group",{},[417,418,424],"pre",{"className":419,"code":420,"filename":421,"language":422,"meta":423,"style":423},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm create @mionjs\u002Fstarter-vue my-app\n","Vue","bash","",[409,425,426],{"__ignoreMap":423},[427,428,431,435,439,442],"span",{"class":429,"line":430},"line",1,[427,432,434],{"class":433},"sBMFI","npm",[427,436,438],{"class":437},"sfazB"," create",[427,440,441],{"class":437}," @mionjs\u002Fstarter-vue",[427,443,444],{"class":437}," my-app\n",[417,446,449],{"className":419,"code":447,"filename":448,"language":422,"meta":423,"style":423},"npm create @mionjs\u002Fstarter-nuxt my-app\n","Nuxt",[409,450,451],{"__ignoreMap":423},[427,452,453,455,457,460],{"class":429,"line":430},[427,454,434],{"class":433},[427,456,438],{"class":437},[427,458,459],{"class":437}," @mionjs\u002Fstarter-nuxt",[427,461,444],{"class":437},[417,463,465],{"className":419,"code":464,"filename":151,"language":422,"meta":423,"style":423},"npm create @mionjs\u002Fstarter-nextjs my-app\n",[409,466,467],{"__ignoreMap":423},[427,468,469,471,473,476],{"class":429,"line":430},[427,470,434],{"class":433},[427,472,438],{"class":437},[427,474,475],{"class":437}," @mionjs\u002Fstarter-nextjs",[427,477,444],{"class":437},[479,480],"spacer",{},[482,483,485],"h2",{"id":484},"vue-starter","Vue Starter",[405,487,488,489,496,497,501],{},"A ",[490,491,495],"a",{"href":492,"rel":493},"https:\u002F\u002Fvuejs.org",[494],"nofollow","Vue 3"," SPA + ",[490,498,147],{"href":499,"rel":500},"https:\u002F\u002Fvitejs.dev",[494]," starter with a standalone mion API.",[503,504,505,509,514,521,524],"ul",{},[506,507,508],"li",{},"Vue Router",[506,510,511,513],{},[409,512,411],{}," package with build targets for Node, Bun, Vercel and Cloudflare Workers",[506,515,516,517,520],{},"Fully typed ",[409,518,519],{},"@mionjs\u002Fclient"," wired to the local API",[506,522,523],{},"mion Vite plugin",[506,525,526],{},"Vitest + Playwright e2e tests preconfigured",[417,528,530],{"className":419,"code":529,"language":422,"meta":423,"style":423},"my-app\u002F\n├── app\u002F                      # Vue 3 SPA source\n│   ├── pages\u002F                # Route views\n│   ├── composables\u002F          # Shared Vue composables\n│   ├── mion-client.ts        # Typed mion client wired to the API\n│   ├── router.ts             # Vue Router setup\n│   └── main.ts               # SPA entry\n├── api\u002F                      # Standalone mion API package\n│   ├── src\u002F\n│   │   ├── api.ts            # Route registry + initApi()\n│   │   ├── models.ts         # Shared API models\n│   │   ├── features\u002F         # Feature modules (handlers, models, repos)\n│   │   ├── server.node.ts    # Node.js entry\n│   │   ├── server.bun.ts     # Bun entry\n│   │   ├── vercel-serverless.ts\n│   │   └── cloudflare-worker.ts\n│   └── vite.config.ts        # mion Vite plugin + multi-target build\n├── e2e\u002F                      # Playwright tests\n└── vite.config.ts            # Frontend Vite config (loads mion plugin)\n",[409,531,532,537,550,565,578,591,604,618,629,639,655,670,685,700,715,727,739,752,763],{"__ignoreMap":423},[427,533,534],{"class":429,"line":430},[427,535,536],{"class":433},"my-app\u002F\n",[427,538,540,543,546],{"class":429,"line":539},2,[427,541,542],{"class":433},"├──",[427,544,545],{"class":437}," app\u002F",[427,547,549],{"class":548},"sHwdD","                      # Vue 3 SPA source\n",[427,551,553,556,559,562],{"class":429,"line":552},3,[427,554,555],{"class":433},"│",[427,557,558],{"class":437},"   ├──",[427,560,561],{"class":437}," pages\u002F",[427,563,564],{"class":548},"                # Route views\n",[427,566,568,570,572,575],{"class":429,"line":567},4,[427,569,555],{"class":433},[427,571,558],{"class":437},[427,573,574],{"class":437}," composables\u002F",[427,576,577],{"class":548},"          # Shared Vue composables\n",[427,579,581,583,585,588],{"class":429,"line":580},5,[427,582,555],{"class":433},[427,584,558],{"class":437},[427,586,587],{"class":437}," mion-client.ts",[427,589,590],{"class":548},"        # Typed mion client wired to the API\n",[427,592,594,596,598,601],{"class":429,"line":593},6,[427,595,555],{"class":433},[427,597,558],{"class":437},[427,599,600],{"class":437}," router.ts",[427,602,603],{"class":548},"             # Vue Router setup\n",[427,605,607,609,612,615],{"class":429,"line":606},7,[427,608,555],{"class":433},[427,610,611],{"class":437},"   └──",[427,613,614],{"class":437}," main.ts",[427,616,617],{"class":548},"               # SPA entry\n",[427,619,621,623,626],{"class":429,"line":620},8,[427,622,542],{"class":433},[427,624,625],{"class":437}," api\u002F",[427,627,628],{"class":548},"                      # Standalone mion API package\n",[427,630,632,634,636],{"class":429,"line":631},9,[427,633,555],{"class":433},[427,635,558],{"class":437},[427,637,638],{"class":437}," src\u002F\n",[427,640,642,644,647,649,652],{"class":429,"line":641},10,[427,643,555],{"class":433},[427,645,646],{"class":437},"   │",[427,648,558],{"class":437},[427,650,651],{"class":437}," api.ts",[427,653,654],{"class":548},"            # Route registry + initApi()\n",[427,656,658,660,662,664,667],{"class":429,"line":657},11,[427,659,555],{"class":433},[427,661,646],{"class":437},[427,663,558],{"class":437},[427,665,666],{"class":437}," models.ts",[427,668,669],{"class":548},"         # Shared API models\n",[427,671,673,675,677,679,682],{"class":429,"line":672},12,[427,674,555],{"class":433},[427,676,646],{"class":437},[427,678,558],{"class":437},[427,680,681],{"class":437}," features\u002F",[427,683,684],{"class":548},"         # Feature modules (handlers, models, repos)\n",[427,686,688,690,692,694,697],{"class":429,"line":687},13,[427,689,555],{"class":433},[427,691,646],{"class":437},[427,693,558],{"class":437},[427,695,696],{"class":437}," server.node.ts",[427,698,699],{"class":548},"    # Node.js entry\n",[427,701,703,705,707,709,712],{"class":429,"line":702},14,[427,704,555],{"class":433},[427,706,646],{"class":437},[427,708,558],{"class":437},[427,710,711],{"class":437}," server.bun.ts",[427,713,714],{"class":548},"     # Bun entry\n",[427,716,718,720,722,724],{"class":429,"line":717},15,[427,719,555],{"class":433},[427,721,646],{"class":437},[427,723,558],{"class":437},[427,725,726],{"class":437}," vercel-serverless.ts\n",[427,728,730,732,734,736],{"class":429,"line":729},16,[427,731,555],{"class":433},[427,733,646],{"class":437},[427,735,611],{"class":437},[427,737,738],{"class":437}," cloudflare-worker.ts\n",[427,740,742,744,746,749],{"class":429,"line":741},17,[427,743,555],{"class":433},[427,745,611],{"class":437},[427,747,748],{"class":437}," vite.config.ts",[427,750,751],{"class":548},"        # mion Vite plugin + multi-target build\n",[427,753,755,757,760],{"class":429,"line":754},18,[427,756,542],{"class":433},[427,758,759],{"class":437}," e2e\u002F",[427,761,762],{"class":548},"                      # Playwright tests\n",[427,764,766,769,771],{"class":429,"line":765},19,[427,767,768],{"class":433},"└──",[427,770,748],{"class":437},[427,772,773],{"class":548},"            # Frontend Vite config (loads mion plugin)\n",[479,775],{},[482,777,779],{"id":778},"nuxt-starter","Nuxt Starter",[405,781,488,782,787],{},[490,783,786],{"href":784,"rel":785},"https:\u002F\u002Fnuxt.com",[494],"Nuxt 4"," starter with mion as a standalone API beside the Nuxt app.",[503,789,790,797,801,806,809],{},[506,791,792,793,796],{},"Nuxt 4 with SSR enabled (use ",[409,794,795],{},"nuxt generate"," for static output)",[506,798,799,513],{},[409,800,411],{},[506,802,516,803,805],{},[409,804,519],{}," available in pages, components, and composables",[506,807,808],{},"mion Vite plugin wired through Nuxt's Vite config",[506,810,811],{},"Playwright e2e tests preconfigured",[417,813,815],{"className":419,"code":814,"language":422,"meta":423,"style":423},"my-app\u002F\n├── app\u002F                      # Nuxt app source\n│   ├── pages\u002F                # File-based routes\n│   ├── composables\u002F          # Composables (includes mion client)\n│   ├── plugins\u002F              # Nuxt plugins\n│   └── app.vue               # Root component\n├── api\u002F                      # Standalone mion API package\n│   ├── src\u002F\n│   │   ├── api.ts            # Route registry + initApi()\n│   │   ├── models.ts         # Shared API models\n│   │   ├── features\u002F         # Feature modules (handlers, models, repos)\n│   │   ├── server.node.ts    # Node.js entry\n│   │   ├── server.bun.ts     # Bun entry\n│   │   ├── vercel-serverless.ts\n│   │   └── cloudflare-worker.ts\n│   ├── mion-plugin.ts        # Shared mion Vite plugin factory\n│   └── vite.config.ts        # Standalone API build\n├── e2e\u002F                      # Playwright tests\n└── nuxt.config.ts            # Nuxt config (loads the mion plugin via Vite)\n",[409,816,817,821,830,841,852,864,876,884,892,904,916,928,940,952,962,972,984,995,1003],{"__ignoreMap":423},[427,818,819],{"class":429,"line":430},[427,820,536],{"class":433},[427,822,823,825,827],{"class":429,"line":539},[427,824,542],{"class":433},[427,826,545],{"class":437},[427,828,829],{"class":548},"                      # Nuxt app source\n",[427,831,832,834,836,838],{"class":429,"line":552},[427,833,555],{"class":433},[427,835,558],{"class":437},[427,837,561],{"class":437},[427,839,840],{"class":548},"                # File-based routes\n",[427,842,843,845,847,849],{"class":429,"line":567},[427,844,555],{"class":433},[427,846,558],{"class":437},[427,848,574],{"class":437},[427,850,851],{"class":548},"          # Composables (includes mion client)\n",[427,853,854,856,858,861],{"class":429,"line":580},[427,855,555],{"class":433},[427,857,558],{"class":437},[427,859,860],{"class":437}," plugins\u002F",[427,862,863],{"class":548},"              # Nuxt plugins\n",[427,865,866,868,870,873],{"class":429,"line":593},[427,867,555],{"class":433},[427,869,611],{"class":437},[427,871,872],{"class":437}," app.vue",[427,874,875],{"class":548},"               # Root component\n",[427,877,878,880,882],{"class":429,"line":606},[427,879,542],{"class":433},[427,881,625],{"class":437},[427,883,628],{"class":548},[427,885,886,888,890],{"class":429,"line":620},[427,887,555],{"class":433},[427,889,558],{"class":437},[427,891,638],{"class":437},[427,893,894,896,898,900,902],{"class":429,"line":631},[427,895,555],{"class":433},[427,897,646],{"class":437},[427,899,558],{"class":437},[427,901,651],{"class":437},[427,903,654],{"class":548},[427,905,906,908,910,912,914],{"class":429,"line":641},[427,907,555],{"class":433},[427,909,646],{"class":437},[427,911,558],{"class":437},[427,913,666],{"class":437},[427,915,669],{"class":548},[427,917,918,920,922,924,926],{"class":429,"line":657},[427,919,555],{"class":433},[427,921,646],{"class":437},[427,923,558],{"class":437},[427,925,681],{"class":437},[427,927,684],{"class":548},[427,929,930,932,934,936,938],{"class":429,"line":672},[427,931,555],{"class":433},[427,933,646],{"class":437},[427,935,558],{"class":437},[427,937,696],{"class":437},[427,939,699],{"class":548},[427,941,942,944,946,948,950],{"class":429,"line":687},[427,943,555],{"class":433},[427,945,646],{"class":437},[427,947,558],{"class":437},[427,949,711],{"class":437},[427,951,714],{"class":548},[427,953,954,956,958,960],{"class":429,"line":702},[427,955,555],{"class":433},[427,957,646],{"class":437},[427,959,558],{"class":437},[427,961,726],{"class":437},[427,963,964,966,968,970],{"class":429,"line":717},[427,965,555],{"class":433},[427,967,646],{"class":437},[427,969,611],{"class":437},[427,971,738],{"class":437},[427,973,974,976,978,981],{"class":429,"line":729},[427,975,555],{"class":433},[427,977,558],{"class":437},[427,979,980],{"class":437}," mion-plugin.ts",[427,982,983],{"class":548},"        # Shared mion Vite plugin factory\n",[427,985,986,988,990,992],{"class":429,"line":741},[427,987,555],{"class":433},[427,989,611],{"class":437},[427,991,748],{"class":437},[427,993,994],{"class":548},"        # Standalone API build\n",[427,996,997,999,1001],{"class":429,"line":754},[427,998,542],{"class":433},[427,1000,759],{"class":437},[427,1002,762],{"class":548},[427,1004,1005,1007,1010],{"class":429,"line":765},[427,1006,768],{"class":433},[427,1008,1009],{"class":437}," nuxt.config.ts",[427,1011,1012],{"class":548},"            # Nuxt config (loads the mion plugin via Vite)\n",[479,1014],{},[482,1016,1018],{"id":1017},"nextjs-starter","Next.js Starter",[405,1020,488,1021,1026],{},[490,1022,1025],{"href":1023,"rel":1024},"https:\u002F\u002Fnextjs.org",[494],"Next.js 16"," + React 19 starter where the Next app hosts the mion API itself.",[503,1028,1029,1032,1037,1044,1047,1052,1065],{},[506,1030,1031],{},"Tailwind CSS 4",[506,1033,1034,1036],{},[409,1035,411],{}," package with build targets for Node, Bun and Vercel",[506,1038,1039,1040,1043],{},"A catch-all route handler at ",[409,1041,1042],{},"app\u002Fapi\u002F[...mion]\u002Froute.ts"," serves the API in dev and production",[506,1045,1046],{},"One app, one program, one deployment",[506,1048,516,1049,1051],{},[409,1050,519],{}," usable from server and client components",[506,1053,1054,1057,1058,1061,1062,1064],{},[409,1055,1056],{},"withMion"," in ",[409,1059,1060],{},"next.config.ts",", and the mion Vite plugin for the ",[409,1063,411],{}," builds",[506,1066,1067,1070],{},[409,1068,1069],{},"@mionjs\u002Fdrizzle-orm-pg-core"," integration and Playwright e2e tests preconfigured",[417,1072,1074],{"className":419,"code":1073,"language":422,"meta":423,"style":423},"my-app\u002F\n├── app\u002F                      # Next.js app router\n│   ├── page.tsx              # Home page\n│   ├── layout.tsx            # Root layout\n│   ├── mion-orders\u002F          # Example feature page\n│   ├── api\u002F\n│   │   └── [...mion]\u002F        # Catch-all route handler\n│   └── globals.css\n├── api\u002F                      # Standalone mion API package\n│   ├── src\u002F\n│   │   ├── api.ts            # Route registry + initApi()\n│   │   ├── models.ts         # Shared API models\n│   │   ├── features\u002F         # Feature modules (handlers, models, repos)\n│   │   ├── db\u002F               # Drizzle schema and client\n│   │   ├── server.node.ts    # Node.js entry\n│   │   ├── server.bun.ts     # Bun entry\n│   │   └── vercel-serverless.ts\n│   ├── drizzle.config.ts     # Drizzle migrations config\n│   └── vite.config.ts        # mion Vite plugin + multi-target build\n├── e2e\u002F                      # Playwright tests\n└── next.config.ts            # Next config (withMion)\n",[409,1075,1076,1080,1089,1101,1113,1125,1134,1149,1158,1166,1174,1186,1198,1210,1224,1236,1248,1258,1270,1280,1289],{"__ignoreMap":423},[427,1077,1078],{"class":429,"line":430},[427,1079,536],{"class":433},[427,1081,1082,1084,1086],{"class":429,"line":539},[427,1083,542],{"class":433},[427,1085,545],{"class":437},[427,1087,1088],{"class":548},"                      # Next.js app router\n",[427,1090,1091,1093,1095,1098],{"class":429,"line":552},[427,1092,555],{"class":433},[427,1094,558],{"class":437},[427,1096,1097],{"class":437}," page.tsx",[427,1099,1100],{"class":548},"              # Home page\n",[427,1102,1103,1105,1107,1110],{"class":429,"line":567},[427,1104,555],{"class":433},[427,1106,558],{"class":437},[427,1108,1109],{"class":437}," layout.tsx",[427,1111,1112],{"class":548},"            # Root layout\n",[427,1114,1115,1117,1119,1122],{"class":429,"line":580},[427,1116,555],{"class":433},[427,1118,558],{"class":437},[427,1120,1121],{"class":437}," mion-orders\u002F",[427,1123,1124],{"class":548},"          # Example feature page\n",[427,1126,1127,1129,1131],{"class":429,"line":593},[427,1128,555],{"class":433},[427,1130,558],{"class":437},[427,1132,1133],{"class":437}," api\u002F\n",[427,1135,1136,1138,1140,1142,1146],{"class":429,"line":606},[427,1137,555],{"class":433},[427,1139,646],{"class":437},[427,1141,611],{"class":437},[427,1143,1145],{"class":1144},"sTEyZ"," [...mion]\u002F        ",[427,1147,1148],{"class":548},"# Catch-all route handler\n",[427,1150,1151,1153,1155],{"class":429,"line":620},[427,1152,555],{"class":433},[427,1154,611],{"class":437},[427,1156,1157],{"class":437}," globals.css\n",[427,1159,1160,1162,1164],{"class":429,"line":631},[427,1161,542],{"class":433},[427,1163,625],{"class":437},[427,1165,628],{"class":548},[427,1167,1168,1170,1172],{"class":429,"line":641},[427,1169,555],{"class":433},[427,1171,558],{"class":437},[427,1173,638],{"class":437},[427,1175,1176,1178,1180,1182,1184],{"class":429,"line":657},[427,1177,555],{"class":433},[427,1179,646],{"class":437},[427,1181,558],{"class":437},[427,1183,651],{"class":437},[427,1185,654],{"class":548},[427,1187,1188,1190,1192,1194,1196],{"class":429,"line":672},[427,1189,555],{"class":433},[427,1191,646],{"class":437},[427,1193,558],{"class":437},[427,1195,666],{"class":437},[427,1197,669],{"class":548},[427,1199,1200,1202,1204,1206,1208],{"class":429,"line":687},[427,1201,555],{"class":433},[427,1203,646],{"class":437},[427,1205,558],{"class":437},[427,1207,681],{"class":437},[427,1209,684],{"class":548},[427,1211,1212,1214,1216,1218,1221],{"class":429,"line":702},[427,1213,555],{"class":433},[427,1215,646],{"class":437},[427,1217,558],{"class":437},[427,1219,1220],{"class":437}," db\u002F",[427,1222,1223],{"class":548},"               # Drizzle schema and client\n",[427,1225,1226,1228,1230,1232,1234],{"class":429,"line":717},[427,1227,555],{"class":433},[427,1229,646],{"class":437},[427,1231,558],{"class":437},[427,1233,696],{"class":437},[427,1235,699],{"class":548},[427,1237,1238,1240,1242,1244,1246],{"class":429,"line":729},[427,1239,555],{"class":433},[427,1241,646],{"class":437},[427,1243,558],{"class":437},[427,1245,711],{"class":437},[427,1247,714],{"class":548},[427,1249,1250,1252,1254,1256],{"class":429,"line":741},[427,1251,555],{"class":433},[427,1253,646],{"class":437},[427,1255,611],{"class":437},[427,1257,726],{"class":437},[427,1259,1260,1262,1264,1267],{"class":429,"line":754},[427,1261,555],{"class":433},[427,1263,558],{"class":437},[427,1265,1266],{"class":437}," drizzle.config.ts",[427,1268,1269],{"class":548},"     # Drizzle migrations config\n",[427,1271,1272,1274,1276,1278],{"class":429,"line":765},[427,1273,555],{"class":433},[427,1275,611],{"class":437},[427,1277,748],{"class":437},[427,1279,751],{"class":548},[427,1281,1283,1285,1287],{"class":429,"line":1282},20,[427,1284,542],{"class":433},[427,1286,759],{"class":437},[427,1288,762],{"class":548},[427,1290,1292,1294,1297],{"class":429,"line":1291},21,[427,1293,768],{"class":433},[427,1295,1296],{"class":437}," next.config.ts",[427,1298,1299],{"class":548},"            # Next config (withMion)\n",[1301,1302,1303,1304,1307,1308,1313,1314,1317,1318,1324],"note",{},"All starters compile validation and the JSON round trip at build time, for faster cold starts: the Vue and Nuxt starters with the ",[490,1305,523],{"href":1306},"..\u002Fdevtools\u002Fvite",", the Next.js starter with ",[490,1309,1311],{"href":1310},"..\u002Fdevtools\u002Fnextjs",[409,1312,1056],{},". To deploy where runtime ",[409,1315,1316],{},"new Function()"," is blocked, set ",[490,1319,1321],{"href":1320},"\u002Frpc\u002Fdevtools\u002Fvite#all-plugin-options",[409,1322,1323],{},"emitMode: 'both'",".",[1326,1327,1328],"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 .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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}","How to get started with mion full stack APIs.","md",null,{"toc":24},true,{"title":17,"description":1329},"507xSPMaKmwYz_ttvxeMc87-3-LXBC-FK7kGTGN6MeE",1793324368896]