[{"data":1,"prerenderedAt":1816},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fcore-concepts\u002Fproviders":176,"\u002Fdocs\u002Fcore-concepts\u002Fproviders-surround":1811},[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":63,"body":178,"description":1806,"extension":1807,"meta":1808,"navigation":242,"path":64,"seo":1809,"status":11,"stem":65,"__hash__":1810},"docs\u002F1.docs\u002F2.core-concepts\u002F4.providers.md",{"type":179,"value":180,"toc":1795},"minimark",[181,190,195,395,402,461,465,472,611,615,618,721,725,728,791,904,907,911,918,984,988,994,1198,1211,1263,1291,1295,1298,1429,1499,1508,1525,1529,1532,1675,1679,1693,1791],[182,183,184,185,189],"p",{},"Providers are the backbone of MiiaJS's dependency injection (DI) system. Any class decorated with ",[186,187,188],"code",{},"@Injectable()"," can be injected into other classes.",[191,192,194],"h2",{"id":193},"defining-a-provider","Defining a provider",[196,197,202],"pre",{"className":198,"code":199,"language":200,"meta":201,"style":201},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Injectable } from '@miiajs\u002Fcore'\n\n@Injectable()\nclass UserService {\n  findAll() {\n    return [{ id: 1, name: 'Alice' }]\n  }\n\n  findById(id: string) {\n    return { id, name: 'Alice' }\n  }\n}\n","typescript","",[186,203,204,237,244,257,271,283,326,332,337,360,384,389],{"__ignoreMap":201},[205,206,209,213,217,221,224,227,230,234],"span",{"class":207,"line":208},"line",1,[205,210,212],{"class":211},"s7zQu","import",[205,214,216],{"class":215},"sMK4o"," {",[205,218,220],{"class":219},"sTEyZ"," Injectable",[205,222,223],{"class":215}," }",[205,225,226],{"class":211}," from",[205,228,229],{"class":215}," '",[205,231,233],{"class":232},"sfazB","@miiajs\u002Fcore",[205,235,236],{"class":215},"'\n",[205,238,240],{"class":207,"line":239},2,[205,241,243],{"emptyLinePlaceholder":242},true,"\n",[205,245,247,250,254],{"class":207,"line":246},3,[205,248,249],{"class":215},"@",[205,251,253],{"class":252},"s2Zo4","Injectable",[205,255,256],{"class":219},"()\n",[205,258,260,264,268],{"class":207,"line":259},4,[205,261,263],{"class":262},"spNyl","class",[205,265,267],{"class":266},"sBMFI"," UserService",[205,269,270],{"class":215}," {\n",[205,272,274,278,281],{"class":207,"line":273},5,[205,275,277],{"class":276},"swJcz","  findAll",[205,279,280],{"class":215},"()",[205,282,270],{"class":215},[205,284,286,289,292,295,298,301,305,308,311,313,315,318,321,323],{"class":207,"line":285},6,[205,287,288],{"class":211},"    return",[205,290,291],{"class":276}," [",[205,293,294],{"class":215},"{",[205,296,297],{"class":276}," id",[205,299,300],{"class":215},":",[205,302,304],{"class":303},"sbssI"," 1",[205,306,307],{"class":215},",",[205,309,310],{"class":276}," name",[205,312,300],{"class":215},[205,314,229],{"class":215},[205,316,317],{"class":232},"Alice",[205,319,320],{"class":215},"'",[205,322,223],{"class":215},[205,324,325],{"class":276},"]\n",[205,327,329],{"class":207,"line":328},7,[205,330,331],{"class":215},"  }\n",[205,333,335],{"class":207,"line":334},8,[205,336,243],{"emptyLinePlaceholder":242},[205,338,340,343,346,350,352,355,358],{"class":207,"line":339},9,[205,341,342],{"class":276},"  findById",[205,344,345],{"class":215},"(",[205,347,349],{"class":348},"sHdIc","id",[205,351,300],{"class":215},[205,353,354],{"class":266}," string",[205,356,357],{"class":215},")",[205,359,270],{"class":215},[205,361,363,365,367,369,371,373,375,377,379,381],{"class":207,"line":362},10,[205,364,288],{"class":211},[205,366,216],{"class":215},[205,368,297],{"class":219},[205,370,307],{"class":215},[205,372,310],{"class":276},[205,374,300],{"class":215},[205,376,229],{"class":215},[205,378,317],{"class":232},[205,380,320],{"class":215},[205,382,383],{"class":215}," }\n",[205,385,387],{"class":207,"line":386},11,[205,388,331],{"class":215},[205,390,392],{"class":207,"line":391},12,[205,393,394],{"class":215},"}\n",[182,396,397,398,300],{},"Register the provider in a ",[399,400,401],"a",{"href":68},"Module",[196,403,405],{"className":198,"code":404,"language":200,"meta":201,"style":201},"@Module({\n  controllers: [UserController],\n  providers: [UserService],\n})\nclass UserModule {}\n",[186,406,407,418,431,443,451],{"__ignoreMap":201},[205,408,409,411,413,415],{"class":207,"line":208},[205,410,249],{"class":215},[205,412,401],{"class":252},[205,414,345],{"class":219},[205,416,417],{"class":215},"{\n",[205,419,420,423,425,428],{"class":207,"line":239},[205,421,422],{"class":276},"  controllers",[205,424,300],{"class":215},[205,426,427],{"class":219}," [UserController]",[205,429,430],{"class":215},",\n",[205,432,433,436,438,441],{"class":207,"line":246},[205,434,435],{"class":276},"  providers",[205,437,300],{"class":215},[205,439,440],{"class":219}," [UserService]",[205,442,430],{"class":215},[205,444,445,448],{"class":207,"line":259},[205,446,447],{"class":215},"}",[205,449,450],{"class":219},")\n",[205,452,453,455,458],{"class":207,"line":273},[205,454,263],{"class":262},[205,456,457],{"class":266}," UserModule",[205,459,460],{"class":215}," {}\n",[191,462,464],{"id":463},"injecting-dependencies","Injecting dependencies",[182,466,467,468,471],{},"Call ",[186,469,470],{},"inject()"," in a field initializer to resolve a dependency:",[196,473,475],{"className":198,"code":474,"language":200,"meta":201,"style":201},"import { Controller, Get, inject } from '@miiajs\u002Fcore'\n\n@Controller('\u002Fusers')\nclass UserController {\n  private userService = inject(UserService)\n\n  @Get('\u002F')\n  list() {\n    return this.userService.findAll()\n  }\n}\n",[186,476,477,506,510,528,537,553,557,576,585,603,607],{"__ignoreMap":201},[205,478,479,481,483,486,488,491,493,496,498,500,502,504],{"class":207,"line":208},[205,480,212],{"class":211},[205,482,216],{"class":215},[205,484,485],{"class":219}," Controller",[205,487,307],{"class":215},[205,489,490],{"class":219}," Get",[205,492,307],{"class":215},[205,494,495],{"class":219}," inject",[205,497,223],{"class":215},[205,499,226],{"class":211},[205,501,229],{"class":215},[205,503,233],{"class":232},[205,505,236],{"class":215},[205,507,508],{"class":207,"line":239},[205,509,243],{"emptyLinePlaceholder":242},[205,511,512,514,517,519,521,524,526],{"class":207,"line":246},[205,513,249],{"class":215},[205,515,516],{"class":252},"Controller",[205,518,345],{"class":219},[205,520,320],{"class":215},[205,522,523],{"class":232},"\u002Fusers",[205,525,320],{"class":215},[205,527,450],{"class":219},[205,529,530,532,535],{"class":207,"line":259},[205,531,263],{"class":262},[205,533,534],{"class":266}," UserController",[205,536,270],{"class":215},[205,538,539,542,545,548,550],{"class":207,"line":273},[205,540,541],{"class":262},"  private",[205,543,544],{"class":276}," userService",[205,546,547],{"class":215}," =",[205,549,495],{"class":276},[205,551,552],{"class":219},"(UserService)\n",[205,554,555],{"class":207,"line":285},[205,556,243],{"emptyLinePlaceholder":242},[205,558,559,562,565,567,569,572,574],{"class":207,"line":328},[205,560,561],{"class":215},"  @",[205,563,564],{"class":252},"Get",[205,566,345],{"class":219},[205,568,320],{"class":215},[205,570,571],{"class":232},"\u002F",[205,573,320],{"class":215},[205,575,450],{"class":219},[205,577,578,581,583],{"class":207,"line":334},[205,579,580],{"class":276},"  list",[205,582,280],{"class":215},[205,584,270],{"class":215},[205,586,587,589,592,595,598,601],{"class":207,"line":339},[205,588,288],{"class":211},[205,590,591],{"class":215}," this.",[205,593,594],{"class":219},"userService",[205,596,597],{"class":215},".",[205,599,600],{"class":252},"findAll",[205,602,256],{"class":276},[205,604,605],{"class":207,"line":362},[205,606,331],{"class":215},[205,608,609],{"class":207,"line":386},[205,610,394],{"class":215},[191,612,614],{"id":613},"string-tokens","String tokens",[182,616,617],{},"You can register and resolve providers using string tokens instead of class references:",[196,619,621],{"className":198,"code":620,"language":200,"meta":201,"style":201},"\u002F\u002F Registration\ncontainer.register('API_KEY', () => process.env.API_KEY)\n\n\u002F\u002F Injection\nclass MyService {\n  private apiKey = inject\u003Cstring>('API_KEY')\n}\n",[186,622,623,629,669,673,678,687,717],{"__ignoreMap":201},[205,624,625],{"class":207,"line":208},[205,626,628],{"class":627},"sHwdD","\u002F\u002F Registration\n",[205,630,631,634,636,639,641,643,646,648,650,653,656,659,661,664,666],{"class":207,"line":239},[205,632,633],{"class":219},"container",[205,635,597],{"class":215},[205,637,638],{"class":252},"register",[205,640,345],{"class":219},[205,642,320],{"class":215},[205,644,645],{"class":232},"API_KEY",[205,647,320],{"class":215},[205,649,307],{"class":215},[205,651,652],{"class":215}," ()",[205,654,655],{"class":262}," =>",[205,657,658],{"class":219}," process",[205,660,597],{"class":215},[205,662,663],{"class":219},"env",[205,665,597],{"class":215},[205,667,668],{"class":219},"API_KEY)\n",[205,670,671],{"class":207,"line":246},[205,672,243],{"emptyLinePlaceholder":242},[205,674,675],{"class":207,"line":259},[205,676,677],{"class":627},"\u002F\u002F Injection\n",[205,679,680,682,685],{"class":207,"line":273},[205,681,263],{"class":262},[205,683,684],{"class":266}," MyService",[205,686,270],{"class":215},[205,688,689,691,694,696,698,701,704,707,709,711,713,715],{"class":207,"line":285},[205,690,541],{"class":262},[205,692,693],{"class":276}," apiKey",[205,695,547],{"class":215},[205,697,495],{"class":276},[205,699,700],{"class":215},"\u003C",[205,702,703],{"class":266},"string",[205,705,706],{"class":215},">",[205,708,345],{"class":219},[205,710,320],{"class":215},[205,712,645],{"class":232},[205,714,320],{"class":215},[205,716,450],{"class":219},[205,718,719],{"class":207,"line":328},[205,720,394],{"class":215},[191,722,724],{"id":723},"scopes","Scopes",[182,726,727],{},"Providers support three scopes:",[729,730,731,747],"table",{},[732,733,734],"thead",{},[735,736,737,741,744],"tr",{},[738,739,740],"th",{},"Scope",[738,742,743],{},"Behavior",[738,745,746],{},"Use case",[748,749,750,765,778],"tbody",{},[735,751,752,759,762],{},[753,754,755,758],"td",{},[186,756,757],{},"singleton"," (default)",[753,760,761],{},"One instance for the app lifetime",[753,763,764],{},"Services, config, repositories",[735,766,767,772,775],{},[753,768,769],{},[186,770,771],{},"transient",[753,773,774],{},"New instance on every injection",[753,776,777],{},"Stateless utilities, factories",[735,779,780,785,788],{},[753,781,782],{},[186,783,784],{},"request",[753,786,787],{},"New instance per HTTP request",[753,789,790],{},"Request-scoped state, loggers",[196,792,794],{"className":198,"code":793,"language":200,"meta":201,"style":201},"@Injectable({ scope: 'singleton' })\nclass DatabaseService {}\n\n@Injectable({ scope: 'transient' })\nclass RequestParser {}\n\n@Injectable({ scope: 'request' })\nclass RequestLogger {}\n",[186,795,796,821,830,834,858,867,871,895],{"__ignoreMap":201},[205,797,798,800,802,804,806,809,811,813,815,817,819],{"class":207,"line":208},[205,799,249],{"class":215},[205,801,253],{"class":252},[205,803,345],{"class":219},[205,805,294],{"class":215},[205,807,808],{"class":276}," scope",[205,810,300],{"class":215},[205,812,229],{"class":215},[205,814,757],{"class":232},[205,816,320],{"class":215},[205,818,223],{"class":215},[205,820,450],{"class":219},[205,822,823,825,828],{"class":207,"line":239},[205,824,263],{"class":262},[205,826,827],{"class":266}," DatabaseService",[205,829,460],{"class":215},[205,831,832],{"class":207,"line":246},[205,833,243],{"emptyLinePlaceholder":242},[205,835,836,838,840,842,844,846,848,850,852,854,856],{"class":207,"line":259},[205,837,249],{"class":215},[205,839,253],{"class":252},[205,841,345],{"class":219},[205,843,294],{"class":215},[205,845,808],{"class":276},[205,847,300],{"class":215},[205,849,229],{"class":215},[205,851,771],{"class":232},[205,853,320],{"class":215},[205,855,223],{"class":215},[205,857,450],{"class":219},[205,859,860,862,865],{"class":207,"line":273},[205,861,263],{"class":262},[205,863,864],{"class":266}," RequestParser",[205,866,460],{"class":215},[205,868,869],{"class":207,"line":285},[205,870,243],{"emptyLinePlaceholder":242},[205,872,873,875,877,879,881,883,885,887,889,891,893],{"class":207,"line":328},[205,874,249],{"class":215},[205,876,253],{"class":252},[205,878,345],{"class":219},[205,880,294],{"class":215},[205,882,808],{"class":276},[205,884,300],{"class":215},[205,886,229],{"class":215},[205,888,784],{"class":232},[205,890,320],{"class":215},[205,892,223],{"class":215},[205,894,450],{"class":219},[205,896,897,899,902],{"class":207,"line":334},[205,898,263],{"class":262},[205,900,901],{"class":266}," RequestLogger",[205,903,460],{"class":215},[182,905,906],{},"Request-scoped instances are automatically cleared after each HTTP request.",[191,908,910],{"id":909},"optional-injection","Optional injection",[182,912,913,914,917],{},"Use ",[186,915,916],{},"injectOptional()"," when a provider might not be registered:",[196,919,921],{"className":198,"code":920,"language":200,"meta":201,"style":201},"import { injectOptional } from '@miiajs\u002Fcore'\n\n@Injectable()\nclass NotificationService {\n  private email = injectOptional(EmailService) \u002F\u002F null if not registered\n}\n",[186,922,923,942,946,954,963,980],{"__ignoreMap":201},[205,924,925,927,929,932,934,936,938,940],{"class":207,"line":208},[205,926,212],{"class":211},[205,928,216],{"class":215},[205,930,931],{"class":219}," injectOptional",[205,933,223],{"class":215},[205,935,226],{"class":211},[205,937,229],{"class":215},[205,939,233],{"class":232},[205,941,236],{"class":215},[205,943,944],{"class":207,"line":239},[205,945,243],{"emptyLinePlaceholder":242},[205,947,948,950,952],{"class":207,"line":246},[205,949,249],{"class":215},[205,951,253],{"class":252},[205,953,256],{"class":219},[205,955,956,958,961],{"class":207,"line":259},[205,957,263],{"class":262},[205,959,960],{"class":266}," NotificationService",[205,962,270],{"class":215},[205,964,965,967,970,972,974,977],{"class":207,"line":273},[205,966,541],{"class":262},[205,968,969],{"class":276}," email",[205,971,547],{"class":215},[205,973,931],{"class":276},[205,975,976],{"class":219},"(EmailService) ",[205,978,979],{"class":627},"\u002F\u002F null if not registered\n",[205,981,982],{"class":207,"line":285},[205,983,394],{"class":215},[191,985,987],{"id":986},"runtime-di-introspection-resolver","Runtime DI introspection (Resolver)",[182,989,990,993],{},[186,991,992],{},"Resolver"," is a public read-only wrapper over the DI container. Inject it when the token is not known until runtime - plugin systems, conditional resolution, dynamic factories.",[196,995,997],{"className":198,"code":996,"language":200,"meta":201,"style":201},"import { Injectable, inject, Resolver } from '@miiajs\u002Fcore'\n\n@Injectable()\nclass PluginRegistry {\n  private resolver = inject(Resolver)\n\n  load(name: string) {\n    const token = `plugin:${name}`\n    if (!this.resolver.has(token)) {\n      throw new Error(`unknown plugin: ${name}`)\n    }\n    return this.resolver.resolve(token)\n  }\n}\n",[186,998,999,1026,1030,1038,1047,1061,1065,1083,1107,1136,1164,1169,1188,1193],{"__ignoreMap":201},[205,1000,1001,1003,1005,1007,1009,1011,1013,1016,1018,1020,1022,1024],{"class":207,"line":208},[205,1002,212],{"class":211},[205,1004,216],{"class":215},[205,1006,220],{"class":219},[205,1008,307],{"class":215},[205,1010,495],{"class":219},[205,1012,307],{"class":215},[205,1014,1015],{"class":219}," Resolver",[205,1017,223],{"class":215},[205,1019,226],{"class":211},[205,1021,229],{"class":215},[205,1023,233],{"class":232},[205,1025,236],{"class":215},[205,1027,1028],{"class":207,"line":239},[205,1029,243],{"emptyLinePlaceholder":242},[205,1031,1032,1034,1036],{"class":207,"line":246},[205,1033,249],{"class":215},[205,1035,253],{"class":252},[205,1037,256],{"class":219},[205,1039,1040,1042,1045],{"class":207,"line":259},[205,1041,263],{"class":262},[205,1043,1044],{"class":266}," PluginRegistry",[205,1046,270],{"class":215},[205,1048,1049,1051,1054,1056,1058],{"class":207,"line":273},[205,1050,541],{"class":262},[205,1052,1053],{"class":276}," resolver",[205,1055,547],{"class":215},[205,1057,495],{"class":276},[205,1059,1060],{"class":219},"(Resolver)\n",[205,1062,1063],{"class":207,"line":285},[205,1064,243],{"emptyLinePlaceholder":242},[205,1066,1067,1070,1072,1075,1077,1079,1081],{"class":207,"line":328},[205,1068,1069],{"class":276},"  load",[205,1071,345],{"class":215},[205,1073,1074],{"class":348},"name",[205,1076,300],{"class":215},[205,1078,354],{"class":266},[205,1080,357],{"class":215},[205,1082,270],{"class":215},[205,1084,1085,1088,1091,1093,1096,1099,1102,1104],{"class":207,"line":334},[205,1086,1087],{"class":262},"    const",[205,1089,1090],{"class":219}," token",[205,1092,547],{"class":215},[205,1094,1095],{"class":215}," `",[205,1097,1098],{"class":232},"plugin:",[205,1100,1101],{"class":215},"${",[205,1103,1074],{"class":219},[205,1105,1106],{"class":215},"}`\n",[205,1108,1109,1112,1115,1118,1121,1123,1126,1128,1131,1134],{"class":207,"line":339},[205,1110,1111],{"class":211},"    if",[205,1113,1114],{"class":276}," (",[205,1116,1117],{"class":215},"!this.",[205,1119,1120],{"class":219},"resolver",[205,1122,597],{"class":215},[205,1124,1125],{"class":252},"has",[205,1127,345],{"class":276},[205,1129,1130],{"class":219},"token",[205,1132,1133],{"class":276},")) ",[205,1135,417],{"class":215},[205,1137,1138,1141,1144,1147,1149,1152,1155,1157,1159,1162],{"class":207,"line":362},[205,1139,1140],{"class":211},"      throw",[205,1142,1143],{"class":215}," new",[205,1145,1146],{"class":252}," Error",[205,1148,345],{"class":276},[205,1150,1151],{"class":215},"`",[205,1153,1154],{"class":232},"unknown plugin: ",[205,1156,1101],{"class":215},[205,1158,1074],{"class":219},[205,1160,1161],{"class":215},"}`",[205,1163,450],{"class":276},[205,1165,1166],{"class":207,"line":386},[205,1167,1168],{"class":215},"    }\n",[205,1170,1171,1173,1175,1177,1179,1182,1184,1186],{"class":207,"line":391},[205,1172,288],{"class":211},[205,1174,591],{"class":215},[205,1176,1120],{"class":219},[205,1178,597],{"class":215},[205,1180,1181],{"class":252},"resolve",[205,1183,345],{"class":276},[205,1185,1130],{"class":219},[205,1187,450],{"class":276},[205,1189,1191],{"class":207,"line":1190},13,[205,1192,331],{"class":215},[205,1194,1196],{"class":207,"line":1195},14,[205,1197,394],{"class":215},[182,1199,1200,1201,1203,1204,1206,1207,1210],{},"The ",[186,1202,992],{}," exposes only read operations. Mutations (",[186,1205,638],{},", ",[186,1208,1209],{},"destroyAll",") stay internal to keep the public DI surface minimal:",[729,1212,1213,1223],{},[732,1214,1215],{},[735,1216,1217,1220],{},[738,1218,1219],{},"Method",[738,1221,1222],{},"Description",[748,1224,1225,1239,1249],{},[735,1226,1227,1232],{},[753,1228,1229],{},[186,1230,1231],{},"has(token)",[753,1233,1234,1235,1238],{},"Returns ",[186,1236,1237],{},"true"," when a provider is registered for the token.",[735,1240,1241,1246],{},[753,1242,1243],{},[186,1244,1245],{},"resolve\u003CT>(token)",[753,1247,1248],{},"Resolves the provider; throws if the token is not registered.",[735,1250,1251,1256],{},[753,1252,1253],{},[186,1254,1255],{},"resolveOptional\u003CT>(token)",[753,1257,1258,1259,1262],{},"Resolves or returns ",[186,1260,1261],{},"null"," for an unregistered token.",[1264,1265,1266],"tip",{},[182,1267,1268,1280,1281,1283,1284,1286,1287,1290],{},[1269,1270,1271,1272,1275,1276,1279],"strong",{},"Prefer ",[186,1273,1274],{},"inject(Token)"," over ",[186,1277,1278],{},"resolver.resolve(Token)"," whenever you can."," Field-init ",[186,1282,470],{}," is the idiomatic MiiaJS pattern - it composes with lifecycle hooks and keeps deps explicit at the class level. Reach for ",[186,1285,992],{}," only when the token is dynamic or you need a ",[186,1288,1289],{},"has()"," check.",[191,1292,1294],{"id":1293},"lifecycle-hooks","Lifecycle hooks",[182,1296,1297],{},"Singleton providers can implement three lifecycle hooks:",[196,1299,1301],{"className":198,"code":1300,"language":200,"meta":201,"style":201},"@Injectable()\nclass DatabaseService {\n  async onInit() {\n    \u002F\u002F Called during app.init() or lazily on first app.fetch(),\n    \u002F\u002F after every singleton has been instantiated.\n    await this.connect()\n  }\n\n  async onReady() {\n    \u002F\u002F Called after every onInit() has completed. Guaranteed to see\n    \u002F\u002F a fully-initialized container regardless of registration order.\n  }\n\n  async onDestroy() {\n    \u002F\u002F Called during app.destroy().\n    await this.disconnect()\n  }\n}\n",[186,1302,1303,1311,1319,1331,1336,1341,1353,1357,1361,1372,1377,1382,1386,1390,1401,1407,1419,1424],{"__ignoreMap":201},[205,1304,1305,1307,1309],{"class":207,"line":208},[205,1306,249],{"class":215},[205,1308,253],{"class":252},[205,1310,256],{"class":219},[205,1312,1313,1315,1317],{"class":207,"line":239},[205,1314,263],{"class":262},[205,1316,827],{"class":266},[205,1318,270],{"class":215},[205,1320,1321,1324,1327,1329],{"class":207,"line":246},[205,1322,1323],{"class":262},"  async",[205,1325,1326],{"class":276}," onInit",[205,1328,280],{"class":215},[205,1330,270],{"class":215},[205,1332,1333],{"class":207,"line":259},[205,1334,1335],{"class":627},"    \u002F\u002F Called during app.init() or lazily on first app.fetch(),\n",[205,1337,1338],{"class":207,"line":273},[205,1339,1340],{"class":627},"    \u002F\u002F after every singleton has been instantiated.\n",[205,1342,1343,1346,1348,1351],{"class":207,"line":285},[205,1344,1345],{"class":211},"    await",[205,1347,591],{"class":215},[205,1349,1350],{"class":252},"connect",[205,1352,256],{"class":276},[205,1354,1355],{"class":207,"line":328},[205,1356,331],{"class":215},[205,1358,1359],{"class":207,"line":334},[205,1360,243],{"emptyLinePlaceholder":242},[205,1362,1363,1365,1368,1370],{"class":207,"line":339},[205,1364,1323],{"class":262},[205,1366,1367],{"class":276}," onReady",[205,1369,280],{"class":215},[205,1371,270],{"class":215},[205,1373,1374],{"class":207,"line":362},[205,1375,1376],{"class":627},"    \u002F\u002F Called after every onInit() has completed. Guaranteed to see\n",[205,1378,1379],{"class":207,"line":386},[205,1380,1381],{"class":627},"    \u002F\u002F a fully-initialized container regardless of registration order.\n",[205,1383,1384],{"class":207,"line":391},[205,1385,331],{"class":215},[205,1387,1388],{"class":207,"line":1190},[205,1389,243],{"emptyLinePlaceholder":242},[205,1391,1392,1394,1397,1399],{"class":207,"line":1195},[205,1393,1323],{"class":262},[205,1395,1396],{"class":276}," onDestroy",[205,1398,280],{"class":215},[205,1400,270],{"class":215},[205,1402,1404],{"class":207,"line":1403},15,[205,1405,1406],{"class":627},"    \u002F\u002F Called during app.destroy().\n",[205,1408,1410,1412,1414,1417],{"class":207,"line":1409},16,[205,1411,1345],{"class":211},[205,1413,591],{"class":215},[205,1415,1416],{"class":252},"disconnect",[205,1418,256],{"class":276},[205,1420,1422],{"class":207,"line":1421},17,[205,1423,331],{"class":215},[205,1425,1427],{"class":207,"line":1426},18,[205,1428,394],{"class":215},[729,1430,1431,1443],{},[732,1432,1433],{},[735,1434,1435,1438,1441],{},[738,1436,1437],{},"Hook",[738,1439,1440],{},"When called",[738,1442,746],{},[748,1444,1445,1466,1484],{},[735,1446,1447,1452,1463],{},[753,1448,1449],{},[186,1450,1451],{},"onInit()",[753,1453,1454,1455,1458,1459,1462],{},"During ",[186,1456,1457],{},"app.init()"," or lazily on first ",[186,1460,1461],{},"app.fetch()",", after every singleton has been instantiated",[753,1464,1465],{},"Open connections, warm caches, load seed data",[735,1467,1468,1473,1481],{},[753,1469,1470],{},[186,1471,1472],{},"onReady()",[753,1474,1454,1475,1477,1478,1480],{},[186,1476,1457],{},", after every ",[186,1479,1451],{}," has completed",[753,1482,1483],{},"Ambient discovery, cross-wiring between providers",[735,1485,1486,1491,1496],{},[753,1487,1488],{},[186,1489,1490],{},"onDestroy()",[753,1492,1454,1493],{},[186,1494,1495],{},"app.destroy()",[753,1497,1498],{},"Close connections, flush buffers, release resources",[182,1500,1501,1502,1504,1505,1507],{},"All three run on singleton providers only - ",[186,1503,771],{}," and ",[186,1506,784],{}," scopes do not trigger lifecycle hooks.",[182,1509,1510,1511,1514,1515,1518,1519,1521,1522,1524],{},"The ordering gives ",[186,1512,1513],{},"onReady"," a guarantee ",[186,1516,1517],{},"onInit"," lacks: by the time any ",[186,1520,1472],{}," runs, every singleton in the container already has a fully-initialized instance, regardless of registration order. This is what makes the ",[399,1523,47],{"href":48}," safe to use - it can scan every provider for decorator metadata at startup without worrying about which provider was registered first.",[191,1526,1528],{"id":1527},"factory-providers","Factory providers",[182,1530,1531],{},"Register a provider with a custom factory function:",[196,1533,1535],{"className":198,"code":1534,"language":200,"meta":201,"style":201},"@Module({\n  providers: [\n    {\n      token: 'DATABASE',\n      factory: (container) => {\n        const url = container.resolve\u003Cstring>('DATABASE_URL')\n        return createDatabase(url)\n      },\n    },\n  ],\n})\nclass AppModule {}\n",[186,1536,1537,1547,1556,1561,1577,1594,1628,1643,1648,1653,1660,1666],{"__ignoreMap":201},[205,1538,1539,1541,1543,1545],{"class":207,"line":208},[205,1540,249],{"class":215},[205,1542,401],{"class":252},[205,1544,345],{"class":219},[205,1546,417],{"class":215},[205,1548,1549,1551,1553],{"class":207,"line":239},[205,1550,435],{"class":276},[205,1552,300],{"class":215},[205,1554,1555],{"class":219}," [\n",[205,1557,1558],{"class":207,"line":246},[205,1559,1560],{"class":215},"    {\n",[205,1562,1563,1566,1568,1570,1573,1575],{"class":207,"line":259},[205,1564,1565],{"class":276},"      token",[205,1567,300],{"class":215},[205,1569,229],{"class":215},[205,1571,1572],{"class":232},"DATABASE",[205,1574,320],{"class":215},[205,1576,430],{"class":215},[205,1578,1579,1582,1584,1586,1588,1590,1592],{"class":207,"line":273},[205,1580,1581],{"class":252},"      factory",[205,1583,300],{"class":215},[205,1585,1114],{"class":215},[205,1587,633],{"class":348},[205,1589,357],{"class":215},[205,1591,655],{"class":262},[205,1593,270],{"class":215},[205,1595,1596,1599,1602,1604,1607,1609,1611,1613,1615,1617,1619,1621,1624,1626],{"class":207,"line":285},[205,1597,1598],{"class":262},"        const",[205,1600,1601],{"class":219}," url",[205,1603,547],{"class":215},[205,1605,1606],{"class":219}," container",[205,1608,597],{"class":215},[205,1610,1181],{"class":252},[205,1612,700],{"class":215},[205,1614,703],{"class":266},[205,1616,706],{"class":215},[205,1618,345],{"class":276},[205,1620,320],{"class":215},[205,1622,1623],{"class":232},"DATABASE_URL",[205,1625,320],{"class":215},[205,1627,450],{"class":276},[205,1629,1630,1633,1636,1638,1641],{"class":207,"line":328},[205,1631,1632],{"class":211},"        return",[205,1634,1635],{"class":252}," createDatabase",[205,1637,345],{"class":276},[205,1639,1640],{"class":219},"url",[205,1642,450],{"class":276},[205,1644,1645],{"class":207,"line":334},[205,1646,1647],{"class":215},"      },\n",[205,1649,1650],{"class":207,"line":339},[205,1651,1652],{"class":215},"    },\n",[205,1654,1655,1658],{"class":207,"line":362},[205,1656,1657],{"class":219},"  ]",[205,1659,430],{"class":215},[205,1661,1662,1664],{"class":207,"line":386},[205,1663,447],{"class":215},[205,1665,450],{"class":219},[205,1667,1668,1670,1673],{"class":207,"line":391},[205,1669,263],{"class":262},[205,1671,1672],{"class":266}," AppModule",[205,1674,460],{"class":215},[191,1676,1678],{"id":1677},"the-container","The Container",[182,1680,1681,1682,1685,1686,1689,1690,300],{},"Each ",[186,1683,1684],{},"Miia"," instance owns its own ",[186,1687,1688],{},"Container",". The container is accessible via ",[186,1691,1692],{},"app.get()",[196,1694,1696],{"className":198,"code":1695,"language":200,"meta":201,"style":201},"const app = new Miia().register(AppModule)\nawait app.init()\n\nconst userService = app.get(UserService)\nconst config = app.get\u003Cstring>('API_KEY')\n",[186,1697,1698,1723,1738,1742,1760],{"__ignoreMap":201},[205,1699,1700,1703,1706,1709,1711,1714,1716,1718,1720],{"class":207,"line":208},[205,1701,1702],{"class":262},"const",[205,1704,1705],{"class":219}," app ",[205,1707,1708],{"class":215},"=",[205,1710,1143],{"class":215},[205,1712,1713],{"class":252}," Miia",[205,1715,280],{"class":219},[205,1717,597],{"class":215},[205,1719,638],{"class":252},[205,1721,1722],{"class":219},"(AppModule)\n",[205,1724,1725,1728,1731,1733,1736],{"class":207,"line":239},[205,1726,1727],{"class":211},"await",[205,1729,1730],{"class":219}," app",[205,1732,597],{"class":215},[205,1734,1735],{"class":252},"init",[205,1737,256],{"class":219},[205,1739,1740],{"class":207,"line":246},[205,1741,243],{"emptyLinePlaceholder":242},[205,1743,1744,1746,1749,1751,1753,1755,1758],{"class":207,"line":259},[205,1745,1702],{"class":262},[205,1747,1748],{"class":219}," userService ",[205,1750,1708],{"class":215},[205,1752,1730],{"class":219},[205,1754,597],{"class":215},[205,1756,1757],{"class":252},"get",[205,1759,552],{"class":219},[205,1761,1762,1764,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789],{"class":207,"line":273},[205,1763,1702],{"class":262},[205,1765,1766],{"class":219}," config ",[205,1768,1708],{"class":215},[205,1770,1730],{"class":219},[205,1772,597],{"class":215},[205,1774,1757],{"class":252},[205,1776,700],{"class":215},[205,1778,703],{"class":266},[205,1780,706],{"class":215},[205,1782,345],{"class":219},[205,1784,320],{"class":215},[205,1786,645],{"class":232},[205,1788,320],{"class":215},[205,1790,450],{"class":219},[1792,1793,1794],"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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}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}",{"title":201,"searchDepth":239,"depth":239,"links":1796},[1797,1798,1799,1800,1801,1802,1803,1804,1805],{"id":193,"depth":239,"text":194},{"id":463,"depth":239,"text":464},{"id":613,"depth":239,"text":614},{"id":723,"depth":239,"text":724},{"id":909,"depth":239,"text":910},{"id":986,"depth":239,"text":987},{"id":1293,"depth":239,"text":1294},{"id":1527,"depth":239,"text":1528},{"id":1677,"depth":239,"text":1678},"Injectable services, repositories, and the dependency injection system.","md",{},{"title":63,"description":1806},"HaQCrFsJX7XGm1Lfmb1WfDV9gKjdMfGsLqVA23bWvjU",[1812,1814],{"title":59,"path":60,"stem":61,"description":1813,"children":-1},"How MiiaJS matches URLs to handlers - static routes, dynamic parameters, wildcards, and route compilation.",{"title":67,"path":68,"stem":69,"description":1815,"children":-1},"Organize your application into cohesive, composable blocks.",1778575270760]