[{"data":1,"prerenderedAt":1310},["ShallowReactive",2],{"navigation":3,"docs-path-index":268,"-docs-core-features-introspection":348,"-docs-core-features-introspection-surround":1305},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":56},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,57,229,250],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":56},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48,52],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",{"title":53,"path":54,"stem":55},"Introspection","\u002Fdocs\u002Fcore-features\u002Fintrospection","docs\u002F2.core-features\u002F5.introspection",false,{"title":58,"icon":59,"defaultOpen":60,"path":61,"stem":62,"children":63,"page":56},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[64,81,92,108,127,142,150,165,176,191,210,218],{"title":65,"icon":56,"defaultOpen":56,"path":66,"stem":67,"children":68,"page":56},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[69,73,77],{"title":70,"path":71,"stem":72},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":74,"path":75,"stem":76},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":78,"path":79,"stem":80},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":82,"icon":56,"defaultOpen":56,"path":83,"stem":84,"children":85,"page":56},"Devtools","\u002Fdocs\u002Fmodules\u002Fdevtools","docs\u002F3.modules\u002F10.devtools",[86,89],{"title":70,"path":87,"stem":88},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Foverview","docs\u002F3.modules\u002F10.devtools\u002F0.overview",{"title":33,"path":90,"stem":91},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Fconfiguration","docs\u002F3.modules\u002F10.devtools\u002F1.configuration",{"title":93,"path":94,"stem":95,"children":96,"page":56},"Telemetry","\u002Fdocs\u002Fmodules\u002Ftelemetry","docs\u002F3.modules\u002F11.telemetry",[97,100,104],{"title":70,"path":98,"stem":99},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Foverview","docs\u002F3.modules\u002F11.telemetry\u002F0.overview",{"title":101,"path":102,"stem":103},"API","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Fapi","docs\u002F3.modules\u002F11.telemetry\u002F1.api",{"title":105,"path":106,"stem":107},"Instrumentation","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Finstrumentation","docs\u002F3.modules\u002F11.telemetry\u002F2.instrumentation",{"title":109,"path":110,"stem":111,"children":112,"page":56},"Queue","\u002Fdocs\u002Fmodules\u002Fqueue","docs\u002F3.modules\u002F12.queue",[113,116,120,124],{"title":70,"path":114,"stem":115},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Foverview","docs\u002F3.modules\u002F12.queue\u002F0.overview",{"title":117,"path":118,"stem":119},"Consumers","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fconsumers","docs\u002F3.modules\u002F12.queue\u002F1.consumers",{"title":121,"path":122,"stem":123},"Strategies","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fstrategies","docs\u002F3.modules\u002F12.queue\u002F2.strategies",{"title":101,"path":125,"stem":126},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Fapi","docs\u002F3.modules\u002F12.queue\u002F3.api",{"title":128,"icon":56,"defaultOpen":56,"path":129,"stem":130,"children":131,"page":56},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[132,135,139],{"title":70,"path":133,"stem":134},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":136,"path":137,"stem":138},"Drains & Adapters","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":101,"path":140,"stem":141},"\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":143,"icon":56,"defaultOpen":56,"path":144,"stem":145,"children":146,"page":56},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[147],{"title":70,"path":148,"stem":149},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":151,"icon":56,"defaultOpen":56,"path":152,"stem":153,"children":154,"page":56},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[155,158,162],{"title":70,"path":156,"stem":157},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":159,"path":160,"stem":161},"Drivers","\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":101,"path":163,"stem":164},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":166,"icon":56,"defaultOpen":56,"path":167,"stem":168,"children":169,"page":56},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[170,173],{"title":70,"path":171,"stem":172},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":101,"path":174,"stem":175},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":177,"icon":56,"defaultOpen":56,"path":178,"stem":179,"children":180,"page":56},"Schema","\u002Fdocs\u002Fmodules\u002Fschema","docs\u002F3.modules\u002F6.schema",[181,184,187],{"title":70,"path":182,"stem":183},"\u002Fdocs\u002Fmodules\u002Fschema\u002Foverview","docs\u002F3.modules\u002F6.schema\u002F0.overview",{"title":74,"path":185,"stem":186},"\u002Fdocs\u002Fmodules\u002Fschema\u002Fdecorators","docs\u002F3.modules\u002F6.schema\u002F1.decorators",{"title":188,"path":189,"stem":190},"Scalar","\u002Fdocs\u002Fmodules\u002Fschema\u002Fscalar","docs\u002F3.modules\u002F6.schema\u002F2.scalar",{"title":192,"icon":56,"defaultOpen":56,"path":193,"stem":194,"children":195,"page":56},"Nitro","\u002Fdocs\u002Fmodules\u002Fnitro","docs\u002F3.modules\u002F7.nitro",[196,199,202,206],{"title":70,"path":197,"stem":198},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Foverview","docs\u002F3.modules\u002F7.nitro\u002F0.overview",{"title":151,"path":200,"stem":201},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Fstorage","docs\u002F3.modules\u002F7.nitro\u002F1.storage",{"title":203,"path":204,"stem":205},"File-Based Routes","\u002Fdocs\u002Fmodules\u002Fnitro\u002Ffile-based-routes","docs\u002F3.modules\u002F7.nitro\u002F2.file-based-routes",{"title":207,"path":208,"stem":209},"Middleware","\u002Fdocs\u002Fmodules\u002Fnitro\u002Fmiddleware","docs\u002F3.modules\u002F7.nitro\u002F3.middleware",{"title":211,"icon":56,"defaultOpen":56,"path":212,"stem":213,"children":214,"page":56},"Vite","\u002Fdocs\u002Fmodules\u002Fvite","docs\u002F3.modules\u002F8.vite",[215],{"title":70,"path":216,"stem":217},"\u002Fdocs\u002Fmodules\u002Fvite\u002Foverview","docs\u002F3.modules\u002F8.vite\u002F0.overview",{"title":219,"icon":56,"defaultOpen":56,"path":220,"stem":221,"children":222,"page":56},"Cache","\u002Fdocs\u002Fmodules\u002Fcache","docs\u002F3.modules\u002F9.cache",[223,226],{"title":70,"path":224,"stem":225},"\u002Fdocs\u002Fmodules\u002Fcache\u002Foverview","docs\u002F3.modules\u002F9.cache\u002F0.overview",{"title":101,"path":227,"stem":228},"\u002Fdocs\u002Fmodules\u002Fcache\u002Fapi","docs\u002F3.modules\u002F9.cache\u002F1.api",{"title":230,"icon":231,"path":232,"stem":233,"children":234,"page":56},"Deployment","i-lucide-cloud-upload","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[235,238,242,246],{"title":70,"path":236,"stem":237},"\u002Fdocs\u002Fdeployment\u002Foverview","docs\u002F4.deployment\u002F0.overview",{"title":239,"path":240,"stem":241},"Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F4.deployment\u002F1.vercel",{"title":243,"path":244,"stem":245},"AWS Lambda","\u002Fdocs\u002Fdeployment\u002Faws-lambda","docs\u002F4.deployment\u002F2.aws-lambda",{"title":247,"path":248,"stem":249},"Azure Functions","\u002Fdocs\u002Fdeployment\u002Fazure-functions","docs\u002F4.deployment\u002F3.azure-functions",{"title":251,"icon":252,"path":253,"stem":254,"children":255,"page":56},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[256,260,264],{"title":257,"path":258,"stem":259},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":261,"path":262,"stem":263},"Plugins","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",{"title":265,"path":266,"stem":267},"Custom CLI Command","\u002Fdocs\u002Fadvanced\u002Fcustom-cli-command","docs\u002F99.advanced\u002F3.custom-cli-command",[269,271,273,274,275,276,278,279,280,281,282,283,284,286,288,289,290,291,293,294,295,296,297,298,299,300,301,302,304,305,306,307,309,310,312,313,314,315,317,318,319,321,322,323,324,326,327,328,329,330,332,333,335,336,337,339,340,341,342,343,345,346,347],{"path":270},"\u002Fdocs\u002F.navigation",{"path":272},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":277},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":54},{"path":285},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":287},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":71},{"path":75},{"path":79},{"path":292},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002F.navigation",{"path":87},{"path":90},{"path":98},{"path":102},{"path":106},{"path":114},{"path":118},{"path":122},{"path":125},{"path":303},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":133},{"path":137},{"path":140},{"path":308},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":148},{"path":311},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":156},{"path":160},{"path":163},{"path":316},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":171},{"path":174},{"path":320},"\u002Fdocs\u002Fmodules\u002Fschema\u002F.navigation",{"path":182},{"path":185},{"path":189},{"path":325},"\u002Fdocs\u002Fmodules\u002Fnitro\u002F.navigation",{"path":197},{"path":200},{"path":204},{"path":208},{"path":331},"\u002Fdocs\u002Fmodules\u002Fvite\u002F.navigation",{"path":216},{"path":334},"\u002Fdocs\u002Fmodules\u002Fcache\u002F.navigation",{"path":224},{"path":227},{"path":338},"\u002Fdocs\u002Fdeployment\u002F.navigation",{"path":236},{"path":240},{"path":244},{"path":248},{"path":344},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":258},{"path":262},{"path":266},{"id":349,"title":53,"body":350,"description":1299,"extension":1300,"links":1301,"meta":1302,"navigation":60,"path":54,"seo":1303,"stem":55,"__hash__":1304},"docs\u002Fdocs\u002F2.core-features\u002F5.introspection.md",{"type":351,"value":352,"toc":1292},"minimark",[353,366,378,383,686,704,708,831,840,844,851,862,866,1174,1185,1196,1200,1246,1256,1288],[354,355,356,357,361,362,365],"p",{},"Telemetry answers what your application is ",[358,359,360],"em",{},"doing",". Introspection answers what it ",[358,363,364],{},"is",": the route table, the merged configuration, the container bindings, the plugins, the files the scanner found. It is low-volume, request\u002Fresponse shaped data that only changes when your application does, which is why it is not modelled as an OpenTelemetry signal.",[354,367,368,369,373,374,377],{},"Everything goes through one registry, so a consumer asks a single API instead of reaching into ",[370,371,372],"code",{},"Router",", ",[370,375,376],{},"Container"," and the config on its own.",[379,380,382],"h2",{"id":381},"reading-a-section","Reading a section",[384,385,390],"pre",{"className":386,"code":387,"language":388,"meta":389,"style":389},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Inject } from '@vercube\u002Fdi';\nimport { IntrospectionRegistry } from '@vercube\u002Fcore';\n\nclass RouteAudit {\n  @Inject(IntrospectionRegistry)\n  private gIntrospection!: IntrospectionRegistry;\n\n  public async unvalidatedRoutes() {\n    const section = await this.gIntrospection.describe('routes');\n\n    return section!.data.filter((route) =>\n      route.args.some((arg) => arg.type === 'body' && !arg.validated),\n    );\n  }\n}\n","ts","",[370,391,392,428,451,457,471,484,501,506,523,565,570,602,666,674,680],{"__ignoreMap":389},[393,394,397,401,405,409,412,415,418,422,425],"span",{"class":395,"line":396},"line",1,[393,398,400],{"class":399},"s7zQu","import",[393,402,404],{"class":403},"sMK4o"," {",[393,406,408],{"class":407},"sTEyZ"," Inject",[393,410,411],{"class":403}," }",[393,413,414],{"class":399}," from",[393,416,417],{"class":403}," '",[393,419,421],{"class":420},"sfazB","@vercube\u002Fdi",[393,423,424],{"class":403},"'",[393,426,427],{"class":403},";\n",[393,429,431,433,435,438,440,442,444,447,449],{"class":395,"line":430},2,[393,432,400],{"class":399},[393,434,404],{"class":403},[393,436,437],{"class":407}," IntrospectionRegistry",[393,439,411],{"class":403},[393,441,414],{"class":399},[393,443,417],{"class":403},[393,445,446],{"class":420},"@vercube\u002Fcore",[393,448,424],{"class":403},[393,450,427],{"class":403},[393,452,454],{"class":395,"line":453},3,[393,455,456],{"emptyLinePlaceholder":60},"\n",[393,458,460,464,468],{"class":395,"line":459},4,[393,461,463],{"class":462},"spNyl","class",[393,465,467],{"class":466},"sBMFI"," RouteAudit",[393,469,470],{"class":403}," {\n",[393,472,474,477,481],{"class":395,"line":473},5,[393,475,476],{"class":403},"  @",[393,478,480],{"class":479},"s2Zo4","Inject",[393,482,483],{"class":407},"(IntrospectionRegistry)\n",[393,485,487,490,494,497,499],{"class":395,"line":486},6,[393,488,489],{"class":462},"  private",[393,491,493],{"class":492},"swJcz"," gIntrospection",[393,495,496],{"class":403},"!:",[393,498,437],{"class":466},[393,500,427],{"class":403},[393,502,504],{"class":395,"line":503},7,[393,505,456],{"emptyLinePlaceholder":60},[393,507,509,512,515,518,521],{"class":395,"line":508},8,[393,510,511],{"class":462},"  public",[393,513,514],{"class":462}," async",[393,516,517],{"class":492}," unvalidatedRoutes",[393,519,520],{"class":403},"()",[393,522,470],{"class":403},[393,524,526,529,532,535,538,541,544,547,550,553,555,558,560,563],{"class":395,"line":525},9,[393,527,528],{"class":462},"    const",[393,530,531],{"class":407}," section",[393,533,534],{"class":403}," =",[393,536,537],{"class":399}," await",[393,539,540],{"class":403}," this.",[393,542,543],{"class":407},"gIntrospection",[393,545,546],{"class":403},".",[393,548,549],{"class":479},"describe",[393,551,552],{"class":492},"(",[393,554,424],{"class":403},[393,556,557],{"class":420},"routes",[393,559,424],{"class":403},[393,561,562],{"class":492},")",[393,564,427],{"class":403},[393,566,568],{"class":395,"line":567},10,[393,569,456],{"emptyLinePlaceholder":60},[393,571,573,576,578,581,584,586,589,591,593,597,599],{"class":395,"line":572},11,[393,574,575],{"class":399},"    return",[393,577,531],{"class":407},[393,579,580],{"class":403},"!.",[393,582,583],{"class":407},"data",[393,585,546],{"class":403},[393,587,588],{"class":479},"filter",[393,590,552],{"class":492},[393,592,552],{"class":403},[393,594,596],{"class":595},"sHdIc","route",[393,598,562],{"class":403},[393,600,601],{"class":462}," =>\n",[393,603,605,608,610,613,615,618,620,622,625,627,630,633,635,638,641,643,646,648,651,654,656,658,661,663],{"class":395,"line":604},12,[393,606,607],{"class":407},"      route",[393,609,546],{"class":403},[393,611,612],{"class":407},"args",[393,614,546],{"class":403},[393,616,617],{"class":479},"some",[393,619,552],{"class":492},[393,621,552],{"class":403},[393,623,624],{"class":595},"arg",[393,626,562],{"class":403},[393,628,629],{"class":462}," =>",[393,631,632],{"class":407}," arg",[393,634,546],{"class":403},[393,636,637],{"class":407},"type",[393,639,640],{"class":403}," ===",[393,642,417],{"class":403},[393,644,645],{"class":420},"body",[393,647,424],{"class":403},[393,649,650],{"class":403}," &&",[393,652,653],{"class":403}," !",[393,655,624],{"class":407},[393,657,546],{"class":403},[393,659,660],{"class":407},"validated",[393,662,562],{"class":492},[393,664,665],{"class":403},",\n",[393,667,669,672],{"class":395,"line":668},13,[393,670,671],{"class":492},"    )",[393,673,427],{"class":403},[393,675,677],{"class":395,"line":676},14,[393,678,679],{"class":403},"  }\n",[393,681,683],{"class":395,"line":682},15,[393,684,685],{"class":403},"}\n",[354,687,688,691,692,695,696,699,700,703],{},[370,689,690],{},"describe(id)"," returns ",[370,693,694],{},"{ id, title, revision, data }",". ",[370,697,698],{},"list()"," gives every registered section and its current revision without describing any of them, and ",[370,701,702],{},"describeAll()"," describes them all at once.",[379,705,707],{"id":706},"built-in-sections","Built-in sections",[709,710,711,727],"table",{},[712,713,714],"thead",{},[715,716,717,721,724],"tr",{},[718,719,720],"th",{},"Section",[718,722,723],{},"Contributed by",[718,725,726],{},"Contents",[728,729,730,744,758,772,786,801,816],"tbody",{},[715,731,732,737,741],{},[733,734,735],"td",{},[370,736,557],{},[733,738,739],{},[370,740,446],{},[733,742,743],{},"One entry per registration, with controller, handler, arguments and middleware chain",[715,745,746,751,755],{},[733,747,748],{},[370,749,750],{},"config",[733,752,753],{},[370,754,446],{},[733,756,757],{},"The merged configuration and the runtime slice, flattened to dotted paths, with credentials withheld",[715,759,760,765,769],{},[733,761,762],{},[370,763,764],{},"container",[733,766,767],{},[370,768,421],{},[733,770,771],{},"Bindings, dependency edges, detected cycles and what has been instantiated",[715,773,774,779,783],{},[733,775,776],{},[370,777,778],{},"plugins",[733,780,781],{},[370,782,446],{},[733,784,785],{},"Registered plugins and application-wide middlewares",[715,787,788,793,798],{},[733,789,790],{},[370,791,792],{},"discovery",[733,794,795],{},[370,796,797],{},"@vercube\u002Fvite",[733,799,800],{},"What the build-time scanner found, keyed by class name so runtime bindings can be traced back to a file",[715,802,803,808,813],{},[733,804,805],{},[370,806,807],{},"openapi",[733,809,810],{},[370,811,812],{},"@vercube\u002Fschema",[733,814,815],{},"The generated OpenAPI document",[715,817,818,823,828],{},[733,819,820],{},[370,821,822],{},"storage",[733,824,825],{},[370,826,827],{},"@vercube\u002Fdevtools",[733,829,830],{},"Mounted storages and the cache configuration",[354,832,833,836,837,839],{},[370,834,835],{},"@Get"," registers both GET and HEAD, so the ",[370,838,557],{}," section reports both. Folding the pair into one row is a presentation choice and is left to whoever renders the list.",[379,841,843],{"id":842},"revisions","Revisions",[354,845,846,847,850],{},"Every provider reports a ",[370,848,849],{},"revision"," that changes whenever its data would come out different. The registry memoizes a described section against the revision it was built from, which is what stops a dashboard showing four panels from rebuilding the dependency graph four times.",[354,852,853,854,857,858,861],{},"Consumers can use it too. Devtools turns it into an ",[370,855,856],{},"ETag",", so re-opening a panel gets a ",[370,859,860],{},"304"," rather than a fresh graph.",[379,863,865],{"id":864},"contributing-a-section","Contributing a section",[384,867,869],{"className":386,"code":868,"language":388,"meta":389,"style":389},"import { Inject } from '@vercube\u002Fdi';\nimport { BasePlugin, IntrospectionRegistry } from '@vercube\u002Fcore';\nimport type { App } from '@vercube\u002Fcore';\n\nexport class QueuePlugin extends BasePlugin {\n  public override name = 'QueuePlugin';\n\n  public override use(app: App): void {\n    const manager = app.container.get(QueueManager);\n\n    app.container.getOptional(IntrospectionRegistry)?.register({\n      id: 'queues',\n      title: 'Queues',\n      revision: () => manager.revision,\n      describe: () => manager.describe(),\n    });\n  }\n}\n",[370,870,871,891,917,941,945,963,984,988,1015,1045,1049,1081,1097,1113,1133,1154,1164,1169],{"__ignoreMap":389},[393,872,873,875,877,879,881,883,885,887,889],{"class":395,"line":396},[393,874,400],{"class":399},[393,876,404],{"class":403},[393,878,408],{"class":407},[393,880,411],{"class":403},[393,882,414],{"class":399},[393,884,417],{"class":403},[393,886,421],{"class":420},[393,888,424],{"class":403},[393,890,427],{"class":403},[393,892,893,895,897,900,903,905,907,909,911,913,915],{"class":395,"line":430},[393,894,400],{"class":399},[393,896,404],{"class":403},[393,898,899],{"class":407}," BasePlugin",[393,901,902],{"class":403},",",[393,904,437],{"class":407},[393,906,411],{"class":403},[393,908,414],{"class":399},[393,910,417],{"class":403},[393,912,446],{"class":420},[393,914,424],{"class":403},[393,916,427],{"class":403},[393,918,919,921,924,926,929,931,933,935,937,939],{"class":395,"line":453},[393,920,400],{"class":399},[393,922,923],{"class":399}," type",[393,925,404],{"class":403},[393,927,928],{"class":407}," App",[393,930,411],{"class":403},[393,932,414],{"class":399},[393,934,417],{"class":403},[393,936,446],{"class":420},[393,938,424],{"class":403},[393,940,427],{"class":403},[393,942,943],{"class":395,"line":459},[393,944,456],{"emptyLinePlaceholder":60},[393,946,947,950,953,956,959,961],{"class":395,"line":473},[393,948,949],{"class":399},"export",[393,951,952],{"class":462}," class",[393,954,955],{"class":466}," QueuePlugin",[393,957,958],{"class":462}," extends",[393,960,899],{"class":466},[393,962,470],{"class":403},[393,964,965,967,970,973,975,977,980,982],{"class":395,"line":486},[393,966,511],{"class":462},[393,968,969],{"class":462}," override",[393,971,972],{"class":492}," name",[393,974,534],{"class":403},[393,976,417],{"class":403},[393,978,979],{"class":420},"QueuePlugin",[393,981,424],{"class":403},[393,983,427],{"class":403},[393,985,986],{"class":395,"line":503},[393,987,456],{"emptyLinePlaceholder":60},[393,989,990,992,994,997,999,1002,1005,1007,1010,1013],{"class":395,"line":508},[393,991,511],{"class":462},[393,993,969],{"class":462},[393,995,996],{"class":492}," use",[393,998,552],{"class":403},[393,1000,1001],{"class":595},"app",[393,1003,1004],{"class":403},":",[393,1006,928],{"class":466},[393,1008,1009],{"class":403},"):",[393,1011,1012],{"class":466}," void",[393,1014,470],{"class":403},[393,1016,1017,1019,1022,1024,1027,1029,1031,1033,1036,1038,1041,1043],{"class":395,"line":525},[393,1018,528],{"class":462},[393,1020,1021],{"class":407}," manager",[393,1023,534],{"class":403},[393,1025,1026],{"class":407}," app",[393,1028,546],{"class":403},[393,1030,764],{"class":407},[393,1032,546],{"class":403},[393,1034,1035],{"class":479},"get",[393,1037,552],{"class":492},[393,1039,1040],{"class":407},"QueueManager",[393,1042,562],{"class":492},[393,1044,427],{"class":403},[393,1046,1047],{"class":395,"line":567},[393,1048,456],{"emptyLinePlaceholder":60},[393,1050,1051,1054,1056,1058,1060,1063,1065,1068,1070,1073,1076,1078],{"class":395,"line":572},[393,1052,1053],{"class":407},"    app",[393,1055,546],{"class":403},[393,1057,764],{"class":407},[393,1059,546],{"class":403},[393,1061,1062],{"class":479},"getOptional",[393,1064,552],{"class":492},[393,1066,1067],{"class":407},"IntrospectionRegistry",[393,1069,562],{"class":492},[393,1071,1072],{"class":403},"?.",[393,1074,1075],{"class":479},"register",[393,1077,552],{"class":492},[393,1079,1080],{"class":403},"{\n",[393,1082,1083,1086,1088,1090,1093,1095],{"class":395,"line":604},[393,1084,1085],{"class":492},"      id",[393,1087,1004],{"class":403},[393,1089,417],{"class":403},[393,1091,1092],{"class":420},"queues",[393,1094,424],{"class":403},[393,1096,665],{"class":403},[393,1098,1099,1102,1104,1106,1109,1111],{"class":395,"line":668},[393,1100,1101],{"class":492},"      title",[393,1103,1004],{"class":403},[393,1105,417],{"class":403},[393,1107,1108],{"class":420},"Queues",[393,1110,424],{"class":403},[393,1112,665],{"class":403},[393,1114,1115,1118,1120,1123,1125,1127,1129,1131],{"class":395,"line":676},[393,1116,1117],{"class":479},"      revision",[393,1119,1004],{"class":403},[393,1121,1122],{"class":403}," ()",[393,1124,629],{"class":462},[393,1126,1021],{"class":407},[393,1128,546],{"class":403},[393,1130,849],{"class":407},[393,1132,665],{"class":403},[393,1134,1135,1138,1140,1142,1144,1146,1148,1150,1152],{"class":395,"line":682},[393,1136,1137],{"class":479},"      describe",[393,1139,1004],{"class":403},[393,1141,1122],{"class":403},[393,1143,629],{"class":462},[393,1145,1021],{"class":407},[393,1147,546],{"class":403},[393,1149,549],{"class":479},[393,1151,520],{"class":492},[393,1153,665],{"class":403},[393,1155,1157,1160,1162],{"class":395,"line":1156},16,[393,1158,1159],{"class":403},"    }",[393,1161,562],{"class":492},[393,1163,427],{"class":403},[393,1165,1167],{"class":395,"line":1166},17,[393,1168,679],{"class":403},[393,1170,1172],{"class":395,"line":1171},18,[393,1173,685],{"class":403},[354,1175,1176,1177,1180,1181,1184],{},"Two rules are worth respecting. ",[370,1178,1179],{},"describe()"," must be side-effect free: an inspector that constructs the thing it inspects is not an inspector. And ",[370,1182,1183],{},"revision()"," must be cheap, because it is called every time anything asks what has changed.",[354,1186,1187,1188,1191,1192,1195],{},"Call ",[370,1189,1190],{},"registry.touch(id)"," after your data changes to notify live consumers. Without it, the cache still notices on the next read; ",[370,1193,1194],{},"touch"," is what turns that into a push.",[379,1197,1199],{"id":1198},"from-the-command-line","From the command line",[384,1201,1205],{"className":1202,"code":1203,"language":1204,"meta":389,"style":389},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ vercube inspect\n$ vercube inspect --section routes\n$ vercube inspect --section routes,container\n","bash",[370,1206,1207,1218,1233],{"__ignoreMap":389},[393,1208,1209,1212,1215],{"class":395,"line":396},[393,1210,1211],{"class":466},"$",[393,1213,1214],{"class":420}," vercube",[393,1216,1217],{"class":420}," inspect\n",[393,1219,1220,1222,1224,1227,1230],{"class":395,"line":430},[393,1221,1211],{"class":466},[393,1223,1214],{"class":420},[393,1225,1226],{"class":420}," inspect",[393,1228,1229],{"class":420}," --section",[393,1231,1232],{"class":420}," routes\n",[393,1234,1235,1237,1239,1241,1243],{"class":395,"line":453},[393,1236,1211],{"class":466},[393,1238,1214],{"class":420},[393,1240,1226],{"class":420},[393,1242,1229],{"class":420},[393,1244,1245],{"class":420}," routes,container\n",[354,1247,1248,1251,1252,1255],{},[370,1249,1250],{},"inspect"," builds your application and runs its own entry file, stopping it right before it would bind a port, then prints every section as JSON. That is the only way to see the routes and bindings your ",[370,1253,1254],{},"setup"," actually produces, which makes it usable as a CI check:",[384,1257,1259],{"className":1202,"code":1258,"language":1204,"meta":389,"style":389},"$ vercube inspect --section routes | jq '[.routes.data[] | select(.args[]?.validated == false)] | length'\n",[370,1260,1261],{"__ignoreMap":389},[393,1262,1263,1265,1267,1269,1271,1274,1277,1280,1282,1285],{"class":395,"line":396},[393,1264,1211],{"class":466},[393,1266,1214],{"class":420},[393,1268,1226],{"class":420},[393,1270,1229],{"class":420},[393,1272,1273],{"class":420}," routes",[393,1275,1276],{"class":403}," |",[393,1278,1279],{"class":466}," jq",[393,1281,417],{"class":403},[393,1283,1284],{"class":420},"[.routes.data[] | select(.args[]?.validated == false)] | length",[393,1286,1287],{"class":403},"'\n",[1289,1290,1291],"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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .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);}",{"title":389,"searchDepth":396,"depth":430,"links":1293},[1294,1295,1296,1297,1298],{"id":381,"depth":430,"text":382},{"id":706,"depth":430,"text":707},{"id":842,"depth":430,"text":843},{"id":864,"depth":430,"text":865},{"id":1198,"depth":430,"text":1199},"Ask a running Vercube application what it looks like","md",null,{},{"title":53,"description":1299},"kr0HqE1VtSA4WzlbQl-d2iazmkEukQsMEYz_cr3L9XI",[1306,1308],{"title":49,"path":50,"stem":51,"description":1307,"children":-1},"Automatic request validation with Standard Schema support",{"title":70,"path":71,"stem":72,"description":1309,"children":-1},"Flexible authentication system for Vercube applications",1791443498894]