[{"data":1,"prerenderedAt":638},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Froadmap\u002Flong-term":176,"\u002Fdocs\u002Froadmap\u002Flong-term-surround":635},[4,21,86,158],{"title":5,"path":6,"stem":7,"children":8,"status":11,"icon":20},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,16],{"title":10,"path":6,"stem":7,"status":11},"Introduction",null,{"title":13,"path":14,"stem":15,"status":11},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F2.installation",{"title":17,"path":18,"stem":19,"status":11},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","1.docs\u002F1.getting-started\u002F3.quick-start",false,{"title":22,"path":23,"stem":24,"children":25,"status":11,"icon":20},"Core Concepts","\u002Fdocs\u002Fcore-concepts","1.docs\u002F2.core-concepts\u002F1.index",[26,28,32,36,46,50,54,58,62,66,70,74,78,82],{"title":27,"path":23,"stem":24,"status":11},"Overview",{"title":29,"path":30,"stem":31,"status":11},"Response","\u002Fdocs\u002Fcore-concepts\u002Fresponse","1.docs\u002F2.core-concepts\u002F10.response",{"title":33,"path":34,"stem":35,"status":11},"Testing","\u002Fdocs\u002Fcore-concepts\u002Ftesting","1.docs\u002F2.core-concepts\u002F12.testing",{"title":37,"path":38,"stem":39,"children":40,"status":11,"icon":20,"defaultOpen":20},"Decorators","\u002Fdocs\u002Fcore-concepts\u002Fdecorators","1.docs\u002F2.core-concepts\u002F13.decorators\u002F1.index",[41,42],{"title":27,"path":38,"stem":39,"status":11},{"title":43,"path":44,"stem":45,"status":11},"Custom","\u002Fdocs\u002Fcore-concepts\u002Fdecorators\u002Fcustom","1.docs\u002F2.core-concepts\u002F13.decorators\u002F2.custom",{"title":47,"path":48,"stem":49,"status":11},"Discovery Service","\u002Fdocs\u002Fcore-concepts\u002Fdiscovery","1.docs\u002F2.core-concepts\u002F14.discovery",{"title":51,"path":52,"stem":53,"status":11},"Application Lifecycle","\u002Fdocs\u002Fcore-concepts\u002Fapp-lifecycle","1.docs\u002F2.core-concepts\u002F15.app-lifecycle",{"title":55,"path":56,"stem":57,"status":11},"Controllers","\u002Fdocs\u002Fcore-concepts\u002Fcontrollers","1.docs\u002F2.core-concepts\u002F2.controllers",{"title":59,"path":60,"stem":61,"status":11},"Routing","\u002Fdocs\u002Fcore-concepts\u002Frouting","1.docs\u002F2.core-concepts\u002F3.routing",{"title":63,"path":64,"stem":65,"status":11},"Providers","\u002Fdocs\u002Fcore-concepts\u002Fproviders","1.docs\u002F2.core-concepts\u002F4.providers",{"title":67,"path":68,"stem":69,"status":11},"Modules","\u002Fdocs\u002Fcore-concepts\u002Fmodules","1.docs\u002F2.core-concepts\u002F5.modules",{"title":71,"path":72,"stem":73,"status":11},"Configuration","\u002Fdocs\u002Fcore-concepts\u002Fconfiguration","1.docs\u002F2.core-concepts\u002F6.configuration",{"title":75,"path":76,"stem":77,"status":11},"Middleware","\u002Fdocs\u002Fcore-concepts\u002Fmiddleware","1.docs\u002F2.core-concepts\u002F7.middleware",{"title":79,"path":80,"stem":81,"status":11},"Guards","\u002Fdocs\u002Fcore-concepts\u002Fguards","1.docs\u002F2.core-concepts\u002F8.guards",{"title":83,"path":84,"stem":85,"status":11},"Exceptions","\u002Fdocs\u002Fcore-concepts\u002Fexceptions","1.docs\u002F2.core-concepts\u002F9.exceptions",{"title":87,"path":88,"stem":89,"children":90,"status":11,"icon":20},"Packages","\u002Fdocs\u002Fpackages","1.docs\u002F3.packages\u002F1.index",[91,92,97,108,112,130,134,138,142,146,150,154],{"title":27,"path":88,"stem":89,"status":11},{"title":93,"path":94,"stem":95,"status":96},"CLI","\u002Fdocs\u002Fpackages\u002Fcli","1.docs\u002F3.packages\u002F10.cli","experimental",{"title":98,"path":99,"stem":100,"children":101,"status":11,"icon":20,"defaultOpen":20},"Events","\u002Fdocs\u002Fpackages\u002Fmessaging","1.docs\u002F3.packages\u002F11.messaging\u002F1.index",[102,104],{"title":27,"path":99,"stem":100,"status":103},"beta",{"title":105,"path":106,"stem":107,"status":96},"Redis","\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis","1.docs\u002F3.packages\u002F11.messaging\u002F2.redis",{"title":109,"path":110,"stem":111,"status":103},"Serve Static","\u002Fdocs\u002Fpackages\u002Fserve-static","1.docs\u002F3.packages\u002F12.serve-static",{"title":113,"path":114,"stem":115,"children":116,"status":11,"icon":20,"defaultOpen":20},"Auth","\u002Fdocs\u002Fpackages\u002Fauth","1.docs\u002F3.packages\u002F2.auth\u002F1.index",[117,118,122,126],{"title":27,"path":114,"stem":115,"status":103},{"title":119,"path":120,"stem":121,"status":103},"JWT Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Fjwt","1.docs\u002F3.packages\u002F2.auth\u002F2.jwt",{"title":123,"path":124,"stem":125,"status":103},"Local Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Flocal","1.docs\u002F3.packages\u002F2.auth\u002F3.local",{"title":127,"path":128,"stem":129,"status":96},"OAuth2 Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Foauth2","1.docs\u002F3.packages\u002F2.auth\u002F4.oauth2",{"title":131,"path":132,"stem":133,"status":103},"JWT","\u002Fdocs\u002Fpackages\u002Fjwt","1.docs\u002F3.packages\u002F3.jwt",{"title":135,"path":136,"stem":137,"status":103},"Drizzle","\u002Fdocs\u002Fpackages\u002Fdrizzle","1.docs\u002F3.packages\u002F4.drizzle",{"title":139,"path":140,"stem":141,"status":103},"Papr","\u002Fdocs\u002Fpackages\u002Fpapr","1.docs\u002F3.packages\u002F5.papr",{"title":143,"path":144,"stem":145,"status":103},"Mongoose","\u002Fdocs\u002Fpackages\u002Fmongoose","1.docs\u002F3.packages\u002F6.mongoose",{"title":147,"path":148,"stem":149,"status":103},"Swagger","\u002Fdocs\u002Fpackages\u002Fswagger","1.docs\u002F3.packages\u002F7.swagger",{"title":151,"path":152,"stem":153,"status":103},"Node Server","\u002Fdocs\u002Fpackages\u002Fnode-server","1.docs\u002F3.packages\u002F8.node-server",{"title":155,"path":156,"stem":157,"status":103},"uWS Server","\u002Fdocs\u002Fpackages\u002Fuws-server","1.docs\u002F3.packages\u002F9.uws-server",{"title":159,"path":160,"stem":161,"children":162,"status":11,"icon":20},"Roadmap","\u002Fdocs\u002Froadmap","1.docs\u002F4.roadmap\u002F1.index",[163,164,168,172],{"title":27,"path":160,"stem":161,"status":11},{"title":165,"path":166,"stem":167,"status":11},"Short term (0-3 months)","\u002Fdocs\u002Froadmap\u002Fshort-term","1.docs\u002F4.roadmap\u002F2.short-term",{"title":169,"path":170,"stem":171,"status":11},"Mid term (3-9 months)","\u002Fdocs\u002Froadmap\u002Fmid-term","1.docs\u002F4.roadmap\u002F3.mid-term",{"title":173,"path":174,"stem":175,"status":11},"Long term (9-12+ months)","\u002Fdocs\u002Froadmap\u002Flong-term","1.docs\u002F4.roadmap\u002F4.long-term",{"id":177,"title":173,"body":178,"description":629,"extension":630,"meta":631,"navigation":632,"path":174,"seo":633,"status":11,"stem":175,"__hash__":634},"docs\u002F1.docs\u002F4.roadmap\u002F4.long-term.md",{"type":179,"value":180,"toc":614},"minimark",[181,185,197,206,209,232,250,258,262,264,275,281,288,290,302,307,311,313,320,323,348,353,357,359,370,376,380,382,388,418,421,425,427,430,453,457,463,603,607],[182,183,184],"p",{},"By the time these land, mid-term essentials are in production use and the framework has a couple of release versions behind it. Long-term items are bigger ecosystem bets - new transports, foreign protocol integrations, advanced patterns - and each will get a dedicated design discussion before implementation.",[182,186,187,188,192,193,196],{},"Items here are in ",[189,190,191],"code",{},"planned"," or ",[189,194,195],{},"idea"," status. The line between them comes from real demand: items move up when at least two independent users ask for them.",[198,199,201,202,205],"h2",{"id":200},"nats-transport-miiajsmessaging-nats","NATS transport (",[189,203,204],{},"@miiajs\u002Fmessaging-nats",")",[207,208],"badge",{"label":191},[182,210,211,212,219,220,223,224,227,228,231],{},"Native transport for ",[213,214,218],"a",{"href":215,"rel":216},"https:\u002F\u002Fnats.io",[217],"nofollow","NATS Core + JetStream",". Big draws: native request-reply (",[189,221,222],{},"nc.request()","), built-in deduplication via ",[189,225,226],{},"Nats-Msg-Id"," (no extra ",[189,229,230],{},"IdempotencyStore"," needed for short windows), kv store for state, hierarchical subjects.",[182,233,234,235,238,239,242,243,242,246,249],{},"Builds on the existing ",[189,236,237],{},"MessageTransport"," interface - all decorators (",[189,240,241],{},"@On",", ",[189,244,245],{},"@OnRequest",[189,247,248],{},"@Idempotent",") work unchanged.",[182,251,252,253,257],{},"Kafka and RabbitMQ transports are explicitly ",[254,255,256],"strong",{},"not"," on the roadmap until real demand surfaces. NATS covers the core use-cases (event bus + request-reply + KV); other transports get added when a production user asks.",[198,259,261],{"id":260},"request-reply-for-messaging","Request-Reply for messaging",[207,263],{"label":191},[182,265,266,267,270,271,274],{},"RPC over the existing event bus. ",[189,268,269],{},"bus.request\u003CTRes>(topic, payload, { timeout })"," + ",[189,272,273],{},"@OnRequest(topic)"," decorator. Replies correlated through a per-client shared reply topic to avoid subscription churn. Per-transport implementation: NATS native, Redis manual, in-memory trivial.",[182,276,277,280],{},[254,278,279],{},"Why long-term:"," RPC over messaging is niche-r than fire-and-forget events. Lands cleanly once NATS transport exists, since NATS provides this primitive natively and we can validate the abstraction against a real implementation.",[198,282,284,285,205],{"id":283},"graphql-integration-miiajsgraphql","GraphQL integration (",[189,286,287],{},"@miiajs\u002Fgraphql",[207,289],{"label":191},[182,291,292,242,295,242,298,301],{},[189,293,294],{},"@Query",[189,296,297],{},"@Mutation",[189,299,300],{},"@Subscription"," decorators that share DI\u002Fmiddleware\u002Fguards with HTTP controllers. Schema-first or code-first (probably both via Pothos). Subscription transport uses the existing messaging package + WebSocket adapter from mid-term.",[182,303,304,306],{},[254,305,279],{}," GraphQL is a substantial integration - schema generation, federation, subscriptions, complexity analysis. Wants careful design, not a shim.",[198,308,310],{"id":309},"type-safe-rpc-client-generation","Type-safe RPC client generation",[207,312],{"label":195},[182,314,315,316,319],{},"Generate a fully-typed RPC client from controller signatures (tRPC-style), without giving up REST routes. Consumer side gets ",[189,317,318],{},"client.users.create(dto)"," typed end-to-end; server side stays plain HTTP controllers with their normal decorators.",[182,321,322],{},"Three approaches to compare in design:",[324,325,326,334,341],"ul",{},[327,328,329,330,333],"li",{},"Build-time codegen (",[189,331,332],{},"miia generate client",") - simple, no runtime overhead.",[327,335,336,337,340],{},"Inferred types via ",[189,338,339],{},"typeof appRouter"," - zero codegen but ties consumer build to server source.",[327,342,343,344,347],{},"Hybrid: types via ",[189,345,346],{},"typeof",", runtime client via tiny dispatcher.",[182,349,350,352],{},[254,351,279],{}," strongest unique angle for a decorator-driven framework on Web Standards, but worthless without first having stable controller decorators (we have them) and a real consumer story (don't yet).",[198,354,356],{"id":355},"job-scheduling","Job scheduling",[207,358],{"label":195},[182,360,361,362,365,366,369],{},"Cron-like decorator: ",[189,363,364],{},"@Cron('0 *\u002F5 * * *')"," on a method runs it on a schedule. Pluggable store (memory or Redis-backed for distributed deduplication). Backed by the same DI lifecycle so jobs see ",[189,367,368],{},"onInit"," providers.",[182,371,372,373,375],{},"Demoted from mid-term to ",[189,374,195],{}," because scheduling has solid out-of-process answers (k8s CronJob, systemd timer, BullMQ) and embedding it in the framework adds complexity that not every app needs. We'll wait for the second user request.",[198,377,379],{"id":378},"testing-utilities-expansion","Testing utilities expansion",[207,381],{"label":195},[182,383,384,387],{},[189,385,386],{},"TestApp"," covers the basics. Likely additions once we feel the gaps in real test suites:",[324,389,390,401,408,411],{},[327,391,392,393,396,397,400],{},"Transport mocks: ",[189,394,395],{},"MockMessageBus"," with assertion helpers (",[189,398,399],{},"expect(bus).toHaveDispatched('order.created')",").",[327,402,403,404,407],{},"Time control: ",[189,405,406],{},"app.useFakeTimers()"," for retry\u002Fidempotency expiration tests.",[327,409,410],{},"Database fixtures: per-test transaction rollback, snapshot helpers.",[327,412,413,414,417],{},"Request fluent builder: ",[189,415,416],{},"await app.get('\u002Fusers').auth(token).expect(200)",".",[182,419,420],{},"Not urgent - waiting until specific patterns repeat across enough test files to justify the abstraction.",[198,422,424],{"id":423},"performance-work","Performance work",[207,426],{"label":195},[182,428,429],{},"Continuous, not project-managed:",[324,431,432,443,450],{},[327,433,434,435,442],{},"More benchmarks in the ",[213,436,439],{"href":437,"rel":438},"https:\u002F\u002Fgithub.com\u002Fmiiajs\u002Fbenchmarks",[217],[189,440,441],{},"miiajs\u002Fbenchmarks"," repo - extend coverage to messaging and DB scenarios.",[327,444,445,446,449],{},"HMR for ",[189,447,448],{},"miia dev"," (currently restarts the whole process).",[327,451,452],{},"Profile-guided optimization for hot paths once 1.0 is out.",[198,454,456],{"id":455},"things-explicitly-not-on-the-roadmap","Things explicitly NOT on the roadmap",[182,458,459,460,462],{},"Worth being explicit about what we are ",[254,461,256],{}," going to build, so users plan accordingly.",[324,464,465,486,492,498,504,513,519,525,539,561,567,577,583,589],{},[327,466,467,470,471,474,475,477,478,481,482,485],{},[254,468,469],{},"Custom request\u002Fresponse abstractions."," Web Standards ",[189,472,473],{},"Request","\u002F",[189,476,29],{}," are the only types. No ",[189,479,480],{},"MiiaRequest",", no ",[189,483,484],{},"Reply"," object.",[327,487,488,491],{},[254,489,490],{},"Module scoping by default."," Per-app DI container, flat. If a user case requires sub-scopes, we'd add it - but the default stays flat.",[327,493,494,497],{},[254,495,496],{},"A bundled UI \u002F admin panel."," Out of scope - users compose their own.",[327,499,500,503],{},[254,501,502],{},"A bundled ORM."," Drizzle\u002FMongoose\u002FPapr exist; we integrate, we don't build.",[327,505,506,512],{},[254,507,508,511],{},[189,509,510],{},"reflect-metadata"," polyfills."," TC39 native decorators only.",[327,514,515,518],{},[254,516,517],{},"CommonJS dual-package outputs."," ESM-only forever.",[327,520,521,524],{},[254,522,523],{},"Compression middleware."," gzip\u002Fbrotli is the proxy's job (nginx, Caddy, CDN). Embedding it in the runtime burns CPU on every node and complicates streaming responses.",[327,526,527,530,531,534,535,538],{},[254,528,529],{},"Migration CLI wrapper."," ",[189,532,533],{},"drizzle-kit"," already does this well for Drizzle. Mongoose and Papr have no official migration CLI - schema migrations are mostly a non-concern (schemaless storage); data migrations are app-specific scripts that don't fit a generic wrapper. A ",[189,536,537],{},"miia db:migrate"," umbrella would add a layer that breaks in subtle ways without giving anything new.",[327,540,541,544,545,548,549,552,553,556,557,560],{},[254,542,543],{},"Decorator-based transactions."," A ",[189,546,547],{},"@Transactional()"," decorator was considered and rejected. Implementation requires ",[189,550,551],{},"AsyncLocalStorage"," indirection so ",[189,554,555],{},"inject(db)"," returns the in-flight transaction instead of the connection - the clarity cost (silent context-dependent behaviour) is bigger than the ergonomic win (saving one closure level). Use the ORM's native callback API directly: ",[189,558,559],{},"db.transaction(async (tx) => { ... })",". Recipes in docs cover Drizzle\u002FMongoose\u002FPapr patterns.",[327,562,563,566],{},[254,564,565],{},"Separate auth-strategy packages."," OAuth2, API keys, session-based - all stay as recipes in docs. ~50 lines of glue each, no maintenance benefit from shipping them as packages.",[327,568,569,572,573,576],{},[254,570,571],{},"Health checks package."," A recipe + small core helper covers the same ground. Each module exposes a ",[189,574,575],{},"healthCheck()"," function from its module file; the user composes them in a controller.",[327,578,579,582],{},[254,580,581],{},"DI graph visualization."," Useful but not framework-level. If demand appears, lands as an external community tool.",[327,584,585,588],{},[254,586,587],{},"Kafka and RabbitMQ messaging transports."," NATS covers the same surface for our target deployments. We'll add them when a production user asks.",[327,590,591,594,595,598,599,602],{},[254,592,593],{},"Realtime helpers (rooms, presence, typing indicators)."," Considered, dropped. Mid-term WebSocket support + the existing messaging package + the SSE helper in core compose into rooms\u002Fpresence\u002Fbroadcast in ~150 lines of app-specific code, which is exactly the right place for opinionated decisions (delivery guarantees, replay-on-reconnect, presence timeouts). Specialized solutions (Socket.IO, Centrifugo, Liveblocks, PartyKit, Pusher, Ably) cover the rest. We ship recipes and an ",[189,596,597],{},"examples\u002Frealtime-chat"," example, not a ",[189,600,601],{},"@miiajs\u002Frealtime"," package.",[198,604,606],{"id":605},"want-to-suggest-something","Want to suggest something?",[182,608,609,610,613],{},"Open an issue describing the ",[254,611,612],{},"problem"," (not the solution). The strongest signal is a use case from production where MiiaJS doesn't fit. The roadmap moves on real demand.",{"title":615,"searchDepth":616,"depth":616,"links":617},"",2,[618,620,621,623,624,625,626,627,628],{"id":200,"depth":616,"text":619},"NATS transport (@miiajs\u002Fmessaging-nats)",{"id":260,"depth":616,"text":261},{"id":283,"depth":616,"text":622},"GraphQL integration (@miiajs\u002Fgraphql)",{"id":309,"depth":616,"text":310},{"id":355,"depth":616,"text":356},{"id":378,"depth":616,"text":379},{"id":423,"depth":616,"text":424},{"id":455,"depth":616,"text":456},{"id":605,"depth":616,"text":606},"Ecosystem expansion - new transports, integrations, and patterns that broaden where MiiaJS fits.","md",{},true,{"title":173,"description":629},"HivDttS4K2q1tFKYr7zUcEENvQCXOT14s36CHzrvIkE",[636,11],{"title":169,"path":170,"stem":171,"description":637,"children":-1},"Production essentials - features that unblock real-world deployments at scale.",1778575275938]