[{"data":1,"prerenderedAt":3203},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fts-frameworks":135,"\u002Fdocs\u002Fts-frameworks-surround":3198},[4],{"title":5,"path":6,"stem":7,"children":8,"page":134},"Docs","\u002Fdocs","docs",[9,13,17,21,25,29,33,37,41,45,49,53,57,61,70,74,78,82,86,90,94,98,102,106,110,114,118,122,126,130],{"title":10,"path":11,"stem":12},"AI harnesses: LLM tools, MCP servers and agents","\u002Fdocs\u002Fai-tools","docs\u002Fai-tools",{"title":14,"path":15,"stem":16},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002Farchitecture",{"title":18,"path":19,"stem":20},"Web \u002F native bridges","\u002Fdocs\u002Fbridges","docs\u002Fbridges",{"title":22,"path":23,"stem":24},"Broadcast channels and tests","\u002Fdocs\u002Fchannels-and-tests","docs\u002Fchannels-and-tests",{"title":26,"path":27,"stem":28},"CLI reference","\u002Fdocs\u002Fcli","docs\u002Fcli",{"title":30,"path":31,"stem":32},"Completeness: how far an answer reaches","\u002Fdocs\u002Fcompleteness","docs\u002Fcompleteness",{"title":34,"path":35,"stem":36},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002Fconfiguration",{"title":38,"path":39,"stem":40},"External systems","\u002Fdocs\u002Fexternal","docs\u002Fexternal",{"title":42,"path":43,"stem":44},"Generated, copied and vendored files","\u002Fdocs\u002Fgenerated","docs\u002Fgenerated",{"title":46,"path":47,"stem":48},"Installing and updating cg","\u002Fdocs\u002Finstall","docs\u002Finstall",{"title":50,"path":51,"stem":52},"Java","\u002Fdocs\u002Fjava","docs\u002Fjava",{"title":54,"path":55,"stem":56},"Kotlin","\u002Fdocs\u002Fkotlin","docs\u002Fkotlin",{"title":58,"path":59,"stem":60},"Known limitations","\u002Fdocs\u002Flimitations","docs\u002Flimitations",{"title":62,"path":63,"stem":64,"children":65},"MCP server","\u002Fdocs\u002Fmcp","docs\u002Fmcp",[66],{"title":67,"path":68,"stem":69},"code-graph MCP: sample outputs (real calls via the MCP Python SDK stdio client)","\u002Fdocs\u002Fmcp\u002Fsample_outputs","docs\u002Fmcp\u002Fsample_outputs",{"title":71,"path":72,"stem":73},"Rust, C and C++","\u002Fdocs\u002Fnative","docs\u002Fnative",{"title":75,"path":76,"stem":77},"Port gaps: cg parity","\u002Fdocs\u002Fparity","docs\u002Fparity",{"title":79,"path":80,"stem":81},"PHP","\u002Fdocs\u002Fphp","docs\u002Fphp",{"title":83,"path":84,"stem":85},"Planned changes","\u002Fdocs\u002Fplans","docs\u002Fplans",{"title":87,"path":88,"stem":89},"Platform-specific code","\u002Fdocs\u002Fplatforms","docs\u002Fplatforms",{"title":91,"path":92,"stem":93},"Protocol links","\u002Fdocs\u002Fprotocols","docs\u002Fprotocols",{"title":95,"path":96,"stem":97},"Python","\u002Fdocs\u002Fpython","docs\u002Fpython",{"title":99,"path":100,"stem":101},"Quick start","\u002Fdocs\u002Fquickstart","docs\u002Fquickstart",{"title":103,"path":104,"stem":105},"Graph schema","\u002Fdocs\u002Fschema","docs\u002Fschema",{"title":107,"path":108,"stem":109},"Attack surface","\u002Fdocs\u002Fsurface","docs\u002Fsurface",{"title":111,"path":112,"stem":113},"Swift","\u002Fdocs\u002Fswift","docs\u002Fswift",{"title":115,"path":116,"stem":117},"TypeScript \u002F JavaScript frameworks","\u002Fdocs\u002Fts-frameworks","docs\u002Fts-frameworks",{"title":119,"path":120,"stem":121},"How we validate","\u002Fdocs\u002Fvalidation","docs\u002Fvalidation",{"title":123,"path":124,"stem":125},"Validation log","\u002Fdocs\u002Fvalidation-log","docs\u002Fvalidation-log",{"title":127,"path":128,"stem":129},"Value facts and resolutions","\u002Fdocs\u002Fvalue-facts","docs\u002Fvalue-facts",{"title":131,"path":132,"stem":133},"Visual view","\u002Fdocs\u002Fviz","docs\u002Fviz",false,{"id":136,"title":115,"body":137,"description":3192,"extension":3193,"meta":3194,"navigation":3195,"path":116,"seo":3196,"stem":117,"__hash__":3197},"docs\u002Fdocs\u002Fts-frameworks.md",{"type":138,"value":139,"toc":3179},"minimark",[140,194,197,202,216,566,593,597,605,1001,1005,1049,1361,1365,1437,1606,1630,1634,1653,1876,2053,2064,2068,2139,2514,2518,2582,2888,2892,2901,2940,3011,3026,3030,3175],[141,142,143,144,148,149,152,153,156,157,156,160,163,164,167,168,171,172,174,175,156,178,156,181,184,185,188,189,193],"p",{},"What NestJS, Next.js, Astro, Express-style routers and React Router \u002F Remix add on top of the TypeScript plugin. They share\none program with the Nuxt layer, so aliases and types go through the checker. Plain JavaScript\n(CommonJS or ESM, with or without ",[145,146,147],"code",{},"jsconfig.json",") is indexed with ",[145,150,151],{},"allowJs",". Samples:\n",[145,154,155],{},"examples\u002Fbookstore-nest",", ",[145,158,159],{},"bookstore-next",[145,161,162],{},"bookstore-express",". Without a root tsconfig, the\nprogram is the per-package ",[145,165,166],{},"tsconfig.json"," next to a ",[145,169,170],{},"package.json"," one or two levels down, plus\na ",[145,173,166],{}," in ",[145,176,177],{},"src\u002F",[145,179,180],{},"app\u002F",[145,182,183],{},"lib\u002F"," or ",[145,186,187],{},"web\u002F"," without one. The extractor runs under Node.js 20+ or Bun (",[190,191,46],"a",{"href":192},"\u002Fdocs\u002Finstall#javascript-runtime",").",[141,195,196],{},"Several layers can run on one project. The shared post-pass (env, ORM tables, in-repo links)\nruns once, after the last of them. Extractor facts are described values; the Python plugins\nresolve them.",[198,199,201],"h2",{"id":200},"nestjs","NestJS",[141,203,204,205,184,208,211,212,215],{},"Detect: ",[145,206,207],{},"@nestjs\u002Fcore",[145,209,210],{},"@nestjs\u002Fcommon",", or ",[145,213,214],{},"nest-cli.json",".",[217,218,219,232],"table",{},[220,221,222],"thead",{},[223,224,225,229],"tr",{},[226,227,228],"th",{},"feature",[226,230,231],{},"graph",[233,234,235,255,322,352,373,413,438,511,539,547],"tbody",{},[223,236,237,241],{},[238,239,240],"td",{},"modules",[238,242,243,246,247,250,251,254],{},[145,244,245],{},"@Module"," → BINDS \u002F REFERENCES, ",[145,248,249],{},"attrs.nest_module",". ",[145,252,253],{},"RouterModule.register"," prefixes",[223,256,257,260],{},[238,258,259],{},"routes",[238,261,262,265,266,269,270,269,273,269,276,269,279,269,282,269,285,269,288,291,292,295,296,299,300,250,303,306,307,156,310,313,314,317,318,321],{},[145,263,264],{},"@Controller(prefix | {path})"," + ",[145,267,268],{},"@Get"," \u002F ",[145,271,272],{},"@Post",[145,274,275],{},"@Put",[145,277,278],{},"@Patch",[145,280,281],{},"@Delete",[145,283,284],{},"@All",[145,286,287],{},"@Head",[145,289,290],{},"@Options"," → ",[145,293,294],{},"route:\u003CMETHOD> \u003Curi>"," (entry ",[145,297,298],{},"http_route",") with ROUTES_TO the handler. ",[145,301,302],{},"setGlobalPrefix(p, {exclude})",[145,304,305],{},"enableVersioning"," URI (",[145,308,309],{},"\u002Fv1\u002F...",[145,311,312],{},"defaultVersion",") and ",[145,315,316],{},"@Version",". Header \u002F media-type versioning stays in ",[145,319,320],{},"attrs.version",", not the path",[223,323,324,327],{},[238,325,326],{},"DTOs",[238,328,329,269,332,291,335,269,338,156,341,269,344,347,348,351],{},[145,330,331],{},"@Body() dto: CreateXDto",[145,333,334],{},"@Query() q: XQueryDto",[145,336,337],{},"attrs.body_dto",[145,339,340],{},"body_fields",[145,342,343],{},"query_dto",[145,345,346],{},"query_fields"," (",[145,349,350],{},"?"," marks optional)",[223,353,354,357],{},[238,355,356],{},"enhancers",[238,358,359,362,363,156,366,291,369,372],{},[145,360,361],{},"@UseGuards"," \u002F interceptors \u002F pipes \u002F filters, ",[145,364,365],{},"APP_GUARD",[145,367,368],{},"useGlobalGuards",[145,370,371],{},"attrs.guards"," and USES_MIDDLEWARE",[223,374,375,378],{},[238,376,377],{},"DI",[238,379,380,381,384,385,156,388,156,391,394,395,156,398,401,402,405,406,156,409,412],{},"constructor and ",[145,382,383],{},"@Inject()",". Providers: class, ",[145,386,387],{},"useClass",[145,389,390],{},"useExisting",[145,392,393],{},"useFactory"," (the class it constructs), ",[145,396,397],{},"useValue",[145,399,400],{},"ClientsModule.register",". INJECTS, CALLS ",[145,403,404],{},"via: nest-di",", BOUND_TO from an abstract token to the provider. Library tokens (",[145,407,408],{},"ConfigService",[145,410,411],{},"JwtService",") are external",[223,414,415,418],{},[238,416,417],{},"GraphQL",[238,419,420,265,423,269,426,269,429,269,432,291,435],{},[145,421,422],{},"@Resolver",[145,424,425],{},"@Query",[145,427,428],{},"@Mutation",[145,430,431],{},"@Subscription",[145,433,434],{},"@ResolveField",[145,436,437],{},"route:GRAPHQL Query.\u003Cname>",[223,439,440,443],{},[238,441,442],{},"other entries",[238,444,445,269,448,269,451,291,454,457,458,265,461,464,465,291,468,471,472,475,476,479,480,483,484,471,487,269,490,156,493,496,497,291,500,503,504,291,507,510],{},[145,446,447],{},"@Cron",[145,449,450],{},"@Interval",[145,452,453],{},"@Timeout",[145,455,456],{},"schedule:","; BullMQ ",[145,459,460],{},"@Processor",[145,462,463],{},"WorkerHost.process",", Bull ",[145,466,467],{},"@Process(name)",[145,469,470],{},"job:\u003Cqueue>","; ",[145,473,474],{},"@OnEvent"," (string, array, or ",[145,477,478],{},"{name}",", including a project decorator of that name) → ",[145,481,482],{},"listener:"," with ",[145,485,486],{},"event:\u003Cname>",[145,488,489],{},"@MessagePattern",[145,491,492],{},"@EventPattern",[145,494,495],{},"@SubscribeMessage"," (gateway namespace), ",[145,498,499],{},"@GrpcMethod",[145,501,502],{},"message:\u003Ctransport>:\u003Cpattern>","; nest-commander ",[145,505,506],{},"@Command({name})",[145,508,509],{},"command:nest:\u003Cname>"," (operator-only)",[223,512,513,516],{},[238,514,515],{},"producers",[238,517,518,521,522,156,525,156,528,269,531,534,535,538],{},[145,519,520],{},"queue.add"," on ",[145,523,524],{},"@InjectQueue",[145,526,527],{},"EventEmitter2.emit",[145,529,530],{},"ClientProxy.send",[145,532,533],{},"emit"," → DISPATCHES. An outgoing ",[145,536,537],{},"message:"," node when the handler lives in another service",[223,540,541,544],{},[238,542,543],{},"data",[238,545,546],{},"TypeORM \u002F MikroORM \u002F sequelize \u002F Mongoose → MAPS_TO_TABLE. Prisma, Drizzle, Kysely, knex → READS_TABLE \u002F WRITES_TABLE",[223,548,549,552],{},[238,550,551],{},"config",[238,553,554,156,557,156,560,291,563],{},[145,555,556],{},"process.env.X",[145,558,559],{},"ConfigService.get",[145,561,562],{},"registerAs",[145,564,565],{},"config:ns.key",[141,567,568,569,269,572,156,575,578,579,582,583,156,585,156,587,590,591,215],{},"Tokens: class types, ",[145,570,571],{},"@Inject('TOKEN')",[145,573,574],{},"@Inject(SYMBOL)",[145,576,577],{},"@Dependencies(A, B)"," in JS.\nProviders are found in module arrays, spread arrays, custom-provider files and dynamic\n",[145,580,581],{},"forRoot()",". Library providers (",[145,584,408],{},[145,586,411],{},[145,588,589],{},"@InjectX()",", tokens\nimported from packages) count as external. The GraphQL route's protocol twin is\n",[190,592,91],{"href":92},[198,594,596],{"id":595},"nextjs","Next.js",[141,598,204,599,184,602,215],{},[145,600,601],{},"next",[145,603,604],{},"next.config.*",[217,606,607,615],{},[220,608,609],{},[223,610,611,613],{},[226,612,228],{},[226,614,231],{},[233,616,617,653,698,746,760,786,935,960],{},[223,618,619,622],{},[238,620,621],{},"app router",[238,623,624,291,627,347,630,633,634,637,638,641,642,269,645,648,649,652],{},[145,625,626],{},"page.tsx",[145,628,629],{},"page:",[145,631,632],{},"attrs.uri","). Layouts \u002F loading \u002F error are ",[145,635,636],{},"ui_global"," with USES_LAYOUT. ",[145,639,640],{},"route.ts"," exports ",[145,643,644],{},"GET",[145,646,647],{},"POST",", including ",[145,650,651],{},"withX(handler)"," and re-exports",[223,654,655,658],{},[238,656,657],{},"segments",[238,659,660,291,663,156,666,291,669,156,672,291,675,678,679,682,683,686,687,269,690,693,694,697],{},[145,661,662],{},"[id]",[145,664,665],{},"{id}",[145,667,668],{},"[...slug]",[145,670,671],{},"{slug*}",[145,673,674],{},"[[...slug]]",[145,676,677],{},"{slug*?}",", route groups ",[145,680,681],{},"(x)"," and parallel slots ",[145,684,685],{},"@x"," dropped, intercepting ",[145,688,689],{},"(.)x",[145,691,692],{},"(..)x"," resolved to the intercepted path (best effort), ",[145,695,696],{},"_private"," skipped",[223,699,700,703],{},[238,701,702],{},"pages router",[238,704,705,708,709,156,712,156,715,250,718,721,722,184,725,728,729,732,733,250,736,269,739,269,742,745],{},[145,706,707],{},"pages\u002F**"," minus ",[145,710,711],{},"_app",[145,713,714],{},"_document",[145,716,717],{},"_error",[145,719,720],{},"pages\u002Fapi\u002F**",": method from ",[145,723,724],{},"req.method === 'X'",[145,726,727],{},"switch (req.method)"," (also ",[145,730,731],{},"const { method } = req","), else ",[145,734,735],{},"ANY",[145,737,738],{},"getServerSideProps",[145,740,741],{},"getStaticProps",[145,743,744],{},"generateMetadata"," are reached from the page",[223,747,748,751],{},[238,749,750],{},"server actions",[238,752,753,291,756,759],{},[145,754,755],{},"'use server'",[145,757,758],{},"route:ACTION \u003Cfile>#\u003Cfn>",". Client components CALLS them",[223,761,762,765],{},[238,763,764],{},"middleware",[238,766,767,269,770,773,774,777,778,781,782,785],{},[145,768,769],{},"middleware.ts",[145,771,772],{},"proxy.ts"," ",[145,775,776],{},"config.matcher"," → USES_MIDDLEWARE (",[145,779,780],{},"resolved","). A regex or no matcher links every route (",[145,783,784],{},"heuristic",")",[223,787,788,791],{},[238,789,790],{},"clients",[238,792,793,796,797,269,800,269,803,806,807,269,810,269,813,269,816,819,820,823,824,826,827,830,831,834,835,838,839,269,842,834,845,838,848,851,852,819,855,858,859,269,862,773,865,269,868,870,871,838,874,347,877,156,879,156,881,269,884,773,887,313,890,347,893,156,896,156,899,902,903,905,906,909,910,912,913,156,916,156,919,156,922,156,925,927,928,931,932,785],{},[145,794,795],{},"fetch",", axios (",[145,798,799],{},"post",[145,801,802],{},"put",[145,804,805],{},"patch"," take the body from the second argument; ",[145,808,809],{},"get",[145,811,812],{},"delete",[145,814,815],{},"head",[145,817,818],{},"options"," and ",[145,821,822],{},"request({ method, url, data, params })"," take ",[145,825,543],{}," as the body and ",[145,828,829],{},"params"," as the query, module or instance), ",[145,832,833],{},"ky"," (+ ",[145,836,837],{},"ky.create({prefixUrl})","), ",[145,840,841],{},"ofetch",[145,843,844],{},"$fetch",[145,846,847],{},".create",[145,849,850],{},"useSWR(key)",", OpenAPI ",[145,853,854],{},"this.request({path, method})",[145,856,857],{},"__request(OpenAPI, {method, url})",", Node ",[145,860,861],{},"http",[145,863,864],{},"https",[145,866,867],{},"request",[145,869,809],{}," (options object, URL string or ",[145,872,873],{},"new URL",[145,875,876],{},"undici",[145,878,867],{},[145,880,795],{},[145,882,883],{},"Client",[145,885,886],{},"Pool",[145,888,889],{},".request({path, method})",[145,891,892],{},"got",[145,894,895],{},"got(url)",[145,897,898],{},"got.post",[145,900,901],{},"got.extend({prefixUrl})","), with a host from a literal, ",[145,904,556],{}," or a const map (",[145,907,908],{},"HOSTS[env]",", one endpoint per value, ",[145,911,784],{},"). A file that imports one of those clients (or ",[145,914,915],{},"node-fetch",[145,917,918],{},"superagent",[145,920,921],{},"needle",[145,923,924],{},"phin",[145,926,867],{},"), calls it and makes no endpoint is the ",[145,929,930],{},"ts_unrecognised_http_client"," blind spot Same-repo calls are MATCHES_ROUTE (",[145,933,934],{},"attrs.in_repo",[223,936,937,940],{},[238,938,939],{},"links",[238,941,942,945,946,949,950,953,954,269,957],{},[145,943,944],{},"\u003CLink href>"," from ",[145,947,948],{},"next\u002Flink"," → NAVIGATES_TO (",[145,951,952],{},"via: link","), beside ",[145,955,956],{},"router.push",[145,958,959],{},"replace",[223,961,962,964],{},[238,963,551],{},[238,965,966,967,970,971,974,975,250,978,981,982,156,985,156,988,156,991,156,994,997,998],{},"static ",[145,968,969],{},"basePath","; literal ",[145,972,973],{},"rewrites"," as ",[145,976,977],{},"uri_variants",[145,979,980],{},"NEXT_PUBLIC_*"," (and ",[145,983,984],{},"VITE_",[145,986,987],{},"NUXT_PUBLIC_",[145,989,990],{},"REACT_APP_",[145,992,993],{},"EXPO_PUBLIC_",[145,995,996],{},"PUBLIC_",") is ",[145,999,1000],{},"attrs.public",[198,1002,1004],{"id":1003},"react-router-and-remix","React Router and Remix",[141,1006,204,1007,156,1010,156,1013,184,1016,174,1019,1021,1022,211,1025,1028,1029,184,1032,1035,1036,174,1039,1041,1042,1045,1046,215],{},[145,1008,1009],{},"react-router",[145,1011,1012],{},"react-router-dom",[145,1014,1015],{},"@react-router\u002F*",[145,1017,1018],{},"@remix-run\u002F*",[145,1020,170],{},", or\n",[145,1023,1024],{},"react-router.config.*",[145,1026,1027],{},"app\u002Froutes.ts",". Framework mode when ",[145,1030,1031],{},"@react-router\u002Fdev",[145,1033,1034],{},"@remix-run\u002Fdev","\nis present. A literal ",[145,1037,1038],{},"appDirectory",[145,1040,1024],{}," is the app directory (default ",[145,1043,1044],{},"app",").\nSample: ",[145,1047,1048],{},"examples\u002Fbookstore-react-router",[217,1050,1051,1059],{},[220,1052,1053],{},[223,1054,1055,1057],{},[226,1056,228],{},[226,1058,231],{},[233,1060,1061,1132,1191,1215,1262,1323],{},[223,1062,1063,1066],{},[238,1064,1065],{},"code routers",[238,1067,1068,269,1071,269,1074,269,1077,1080,1081,269,1084,728,1087,1090,1091,156,1094,156,1097,1100,1101,347,1104,1107,1108,156,1111,156,1114,1117,1118,1121,1122,269,1125,250,1128,1131],{},[145,1069,1070],{},"createBrowserRouter",[145,1072,1073],{},"createHashRouter",[145,1075,1076],{},"createMemoryRouter",[145,1078,1079],{},"useRoutes",", and ",[145,1082,1083],{},"\u003CRoutes>",[145,1085,1086],{},"\u003CRoute>",[145,1088,1089],{},"createRoutesFromElements","). Nested ",[145,1092,1093],{},"children",[145,1095,1096],{},"index",[145,1098,1099],{},"path"," joined with the parent. ",[145,1102,1103],{},"page:react-router:\u003Cpath>",[145,1105,1106],{},"attrs.route"," in colon form, ",[145,1109,1110],{},"uri",[145,1112,1113],{},"framework: react-router",[145,1115,1116],{},"router: code",", entry ",[145,1119,1120],{},"ui_page",") RENDERS ",[145,1123,1124],{},"element",[145,1126,1127],{},"Component",[145,1129,1130],{},"lazy: () => import(...)"," resolves the module",[223,1133,1134,1137],{},[238,1135,1136],{},"file routes",[238,1138,1139,1141,1142,269,1145,269,1147,269,1150,1080,1153,1156,1157,156,1160,156,1163,1166,1167,1170,1171,1174,1175,1178,1179,1182,1183,1186,1187,1190],{},[145,1140,1027],{}," helpers ",[145,1143,1144],{},"route",[145,1146,1096],{},[145,1148,1149],{},"layout",[145,1151,1152],{},"prefix",[145,1154,1155],{},"flatRoutes()"," file conventions (",[145,1158,1159],{},"books.$id",[145,1161,1162],{},"_index",[145,1164,1165],{},"$"," splat, ",[145,1168,1169],{},"_"," pathless layouts, ",[145,1172,1173],{},"($param)"," optional segments, ",[145,1176,1177],{},"[.]"," escapes, ",[145,1180,1181],{},"route.tsx"," folders). ",[145,1184,1185],{},"page:\u003Cfile>"," like Next.js, ",[145,1188,1189],{},"attrs.router: framework",", page line 1",[223,1192,1193,1196],{},[238,1194,1195],{},"layouts",[238,1197,1198,1201,1202,347,1205,1207,1208,1211,1212],{},[145,1199,1200],{},"root.tsx"," and layout routes → ",[145,1203,1204],{},"layout:",[145,1206,636],{},"). Pages USES_LAYOUT. Framework id ",[145,1209,1210],{},"layout:\u003Cfile>",". Code layout id ",[145,1213,1214],{},"layout:react-router:\u003Cpath>",[223,1216,1217,1220],{},[238,1218,1219],{},"loaders",[238,1221,1222,1223,291,1226,156,1229,291,1232,1235,1236,1238,1239,269,1242,269,1245,1248,1249,269,1252,1254,1255,269,1258,1261],{},"Framework mode: ",[145,1224,1225],{},"loader",[145,1227,1228],{},"route:GET \u003Curi>",[145,1230,1231],{},"action",[145,1233,1234],{},"route:POST \u003Curi>",", ROUTES_TO the function (entry ",[145,1237,298],{},"). The same action also gets ",[145,1240,1241],{},"route:PUT",[145,1243,1244],{},"route:PATCH",[145,1246,1247],{},"route:DELETE"," when a form or fetcher uses that method. The page CALLS them (",[145,1250,1251],{},"via: loader",[145,1253,1231],{},"). ",[145,1256,1257],{},"clientLoader",[145,1259,1260],{},"clientAction"," stay CALLS and are not routes. A code-router loader \u002F action is a client CALLS only",[223,1263,1264,1267],{},[238,1265,1266],{},"navigation",[238,1268,1269,156,1272,156,1275,156,1278,945,1281,1284,1285,949,1288,773,1291,269,1294,269,1297,1300,1301,1304,1305,250,1308,1311,1312,1315,1316,1319,1320,1322],{},[145,1270,1271],{},"\u003CLink to>",[145,1273,1274],{},"\u003CNavLink to>",[145,1276,1277],{},"\u003CNavigate to>",[145,1279,1280],{},"navigate()",[145,1282,1283],{},"useNavigate()"," (including an import or local alias), and ",[145,1286,1287],{},"redirect()",[145,1289,1290],{},"via",[145,1292,1293],{},"link",[145,1295,1296],{},"navigate",[145,1298,1299],{},"redirect","). A relative ",[145,1302,1303],{},"to"," resolves against the route module that owns the call, including ",[145,1306,1307],{},"..",[145,1309,1310],{},"navigate(-1)"," is a history delta and is ignored. A template literal with a param becomes ",[145,1313,1314],{},"{param}",". A miss stays in ",[145,1317,1318],{},"nav_unresolved"," (coverage). Next.js ",[145,1321,944],{}," uses the same JSX handling",[223,1324,1325,1328],{},[238,1326,1327],{},"forms",[238,1329,1330,156,1333,156,1336,269,1339,156,1342,291,1345,1348,1349,250,1351,1354,1355,1357,1358,1360],{},[145,1331,1332],{},"\u003CForm>",[145,1334,1335],{},"fetcher.Form",[145,1337,1338],{},"fetcher.load",[145,1340,1341],{},"fetcher.submit",[145,1343,1344],{},"useSubmit()",[145,1346,1347],{},"http:\u003CMETHOD> \u003Curi>"," + HTTP_CALLS. The default method is GET. An omitted action is the current route URL. A relative action resolves the same way as ",[145,1350,1303],{},[145,1352,1353],{},"\u003CForm method=\"delete\">"," (and put \u002F patch) matches the action route. Framework mode matches these to the loader \u002F action route (MATCHES_ROUTE, ",[145,1356,934],{},"). A Next.js app that only depends on ",[145,1359,1009],{}," and has no routes is not reported as React Router",[198,1362,1364],{"id":1363},"express-koa-fastify-hono-elysia","Express, Koa, Fastify, Hono, Elysia",[141,1366,204,1367,156,1370,156,1373,156,1376,156,1379,156,1382,1385,1386,269,1389,156,1392,1395,1396,269,1399,269,1402,1405,1406,1409,1410,1413,1414,483,1416,1419,1420,1423,1424,819,1427,1430,1431,250,1434,1436],{},[145,1368,1369],{},"express",[145,1371,1372],{},"koa",[145,1374,1375],{},"@koa\u002Frouter",[145,1377,1378],{},"fastify",[145,1380,1381],{},"hono",[145,1383,1384],{},"elysia",". Router values are followed\nacross ",[145,1387,1388],{},"import",[145,1390,1391],{},"require",[145,1393,1394],{},"module.exports"," and factories. A parameter typed\n",[145,1397,1398],{},"FastifyInstance",[145,1400,1401],{},"Router",[145,1403,1404],{},"Hono",", or an untyped parameter that receives a literal path,\ncounts. A plugin RPC registration ",[145,1407,1408],{},"router.post(\"github.webhooks\", handler)"," (a dotted literal with no\nleading slash, not an HTTP path) is ",[145,1411,1412],{},"POST \u002Fgithub.webhooks"," at ",[145,1415,784],{},[145,1417,1418],{},"attrs.plugin_rpc",",\nincluding when ",[145,1421,1422],{},"router"," is an untyped parameter. ",[145,1425,1426],{},"router.post(\"\u002Forders\")",[145,1428,1429],{},"router.post(\"\u002Facme.events\")","\nstay HTTP routes and do not gain ",[145,1432,1433],{},"plugin_rpc",[145,1435,1384],{}," is its own framework label and uses this router layer.",[217,1438,1439,1447],{},[220,1440,1441],{},[223,1442,1443,1445],{},[226,1444,228],{},[226,1446,231],{},[233,1448,1449,1491,1519,1542,1566,1585],{},[223,1450,1451,1453],{},[238,1452,259],{},[238,1454,1455,269,1458,1461,1462,156,1465,156,1468,250,1471,291,1474,156,1476,269,1479,291,1482,156,1485,291,1488],{},[145,1456,1457],{},".get",[145,1459,1460],{},".post"," \u002F …, ",[145,1463,1464],{},".route(path).get",[145,1466,1467],{},"fastify.route",[145,1469,1470],{},"hono.on",[145,1472,1473],{},":id",[145,1475,665],{},[145,1477,1478],{},":p+",[145,1480,1481],{},"*name",[145,1483,1484],{},"{p*}",[145,1486,1487],{},"*",[145,1489,1490],{},"{p*?}",[223,1492,1493,1496],{},[238,1494,1495],{},"mounting",[238,1497,1498,156,1501,1504,1505,156,1508,156,1511,156,1514,156,1516],{},[145,1499,1500],{},".use",[145,1502,1503],{},"lazyUse",", koa ",[145,1506,1507],{},".routes()",[145,1509,1510],{},"fastify.register({prefix})",[145,1512,1513],{},"hono.route",[145,1515,969],{},[145,1517,1518],{},"routes(app)",[223,1520,1521,1524],{},[238,1522,1523],{},"handlers",[238,1525,1526,1527,156,1530,1533,1534,1537,1538,1541],{},"functions, ",[145,1528,1529],{},"controller.method",[145,1531,1532],{},"exports.x",", wrappers (",[145,1535,1536],{},"asyncHandler","), lazy ",[145,1539,1540],{},"require()"," registries",[223,1543,1544,1546],{},[238,1545,764],{},[238,1547,1548,1549,269,1552,1555,1556,156,1559,1561,1562,1565],{},"route middleware, ",[145,1550,1551],{},"preHandler",[145,1553,1554],{},"onRequest",", fastify ",[145,1557,1558],{},"addHook",[145,1560,1500],{}," registered before the route in the same file, middleware passed with a mount → ",[145,1563,1564],{},"attrs.middleware"," + USES_MIDDLEWARE",[223,1567,1568,1571],{},[238,1569,1570],{},"schemas",[238,1572,1573,1574,269,1577,291,1580,269,1583],{},"Fastify ",[145,1575,1576],{},"schema.body.properties",[145,1578,1579],{},"querystring.properties",[145,1581,1582],{},"attrs.body_fields",[145,1584,346],{},[223,1586,1587,1590],{},[238,1588,1589],{},"confidence",[238,1591,1592,1595,1596,1598,1599,1601,1602,1605],{},[145,1593,1594],{},"exact"," literal path and direct handler; ",[145,1597,780],{}," through a wrapper or alias; ",[145,1600,784],{}," when the router is never mounted (",[145,1603,1604],{},"attrs.unmounted",") or the path is not a literal",[141,1607,1608,1611,1612,1615,1616,1619,1620,1622,1623,1625,1626,1629],{},[145,1609,1610],{},"cg link --backend api.db --frontend web.db"," matches any TS frontend to a Nest, Next or Express\nbackend. A traced ",[145,1613,1614],{},"baseURL"," is exact. ",[145,1617,1618],{},"process.env"," and generated clients align to the end of\nthe route (",[145,1621,784],{},"); the most specific alignment wins. Method and path only: routes carry\n",[145,1624,340],{},", calls carry ",[145,1627,1628],{},"body_keys",", and nothing compares them yet.",[1631,1632,1633],"h3",{"id":1384},"Elysia",[141,1635,1636,1637,1639,1640,1643,1644,1647,1648,1045,1650,215],{},"Detect: an ",[145,1638,1384],{}," dependency. ",[145,1641,1642],{},"cg coverage"," reports ",[145,1645,1646],{},"frameworks: elysia"," (preset ",[145,1649,1369],{},[145,1651,1652],{},"examples\u002Fbookstore-payments",[217,1654,1655,1663],{},[220,1656,1657],{},[223,1658,1659,1661],{},[226,1660,228],{},[226,1662,231],{},[233,1664,1665,1676,1711,1744,1795,1853],{},[223,1666,1667,1670],{},[238,1668,1669],{},"instances",[238,1671,1672,1675],{},[145,1673,1674],{},"new Elysia({ prefix, name })",", an exported const, or a function that returns an instance",[223,1677,1678,1681],{},[238,1679,1680],{},"chains",[238,1682,1683,156,1686,156,1689,156,1692,156,1695,156,1698,156,1701,156,1704,156,1707,1710],{},[145,1684,1685],{},".model",[145,1687,1688],{},".decorate",[145,1690,1691],{},".state",[145,1693,1694],{},".derive",[145,1696,1697],{},".resolve",[145,1699,1700],{},".macro",[145,1702,1703],{},".onError",[145,1705,1706],{},".listen",[145,1708,1709],{},".use(openapi())"," stay on the same instance",[223,1712,1713,1715],{},[238,1714,1495],{},[238,1716,1717,1720,1721,1724,1725,1728,1729,1732,1733,1736,1737,1740,1741,1743],{},[145,1718,1719],{},".use(sub)"," across files, including nested ",[145,1722,1723],{},"new Elysia({ prefix }).use(new Elysia({ prefix }))",", a factory ",[145,1726,1727],{},"function f(prefix) { return new Elysia({ prefix }) }",", the same sub-app mounted twice, and ",[145,1730,1731],{},".group('\u002Fx', app => app.get(...))",". A circular ",[145,1734,1735],{},".use()"," stops. ",[145,1738,1739],{},".use(import('.\u002Fx'))"," is ",[145,1742,784],{},". A plugin with no routes is not a router",[223,1745,1746,1749],{},[238,1747,1748],{},"hooks",[238,1750,1751,156,1754,156,1757,1760,1761,291,1764,250,1766,1769,1770,1773,1774,1777,1778,1780,1781,269,1784,1787,1788,1791,1792],{},[145,1752,1753],{},".onRequest",[145,1755,1756],{},".onBeforeHandle",[145,1758,1759],{},".guard({ beforeHandle })",", route ",[145,1762,1763],{},"{ beforeHandle }",[145,1765,1564],{},[145,1767,1768],{},"local"," affects the instance and descendants mounted after the hook. ",[145,1771,1772],{},"scoped"," also affects the direct parent. ",[145,1775,1776],{},"global"," affects ancestors and plugins mounted on them afterwards. ",[145,1779,1554],{}," is copied onto every ancestor, so it affects every route in that app, including routes registered earlier. Other hooks affect routes registered after them. A hook that sets status 401 or 403, returns ",[145,1782,1783],{},"error(401)",[145,1785,1786],{},"status(401)",", or throws an auth error is ",[145,1789,1790],{},"[auth]"," with those status codes, whatever its name. A hook that only sets headers is not auth. The label is the hook function, or the plugin ",[145,1793,1794],{},"name",[223,1796,1797,1799],{},[238,1798,1570],{},[238,1800,1801,269,1804,269,1807,291,1810,156,1813,156,1815,250,1817,819,1820,1823,1824,1827,1828,1830,1831,1834,1835,1838,1839,1842,1843,156,1845,156,1847,819,1849,1852],{},[145,1802,1803],{},"body",[145,1805,1806],{},"query",[145,1808,1809],{},"params: t.Object({...})",[145,1811,1812],{},"attrs.request.keys",[145,1814,340],{},[145,1816,346],{},[145,1818,1819],{},"{ body: 'name' }",[145,1821,1822],{},"t.Ref('name')"," resolve ",[145,1825,1826],{},".model({...})"," on that instance or a plugin it ",[145,1829,1735],{},"s, including ",[145,1832,1833],{},".model(importedMap)",". A model-map value that is an identifier (",[145,1836,1837],{},"{ CreateRefundBody: refundBodySchema }",") is followed to its ",[145,1840,1841],{},"const"," initializer in the same module or through one import or re-export, for ",[145,1844,1803],{},[145,1846,1806],{},[145,1848,829],{},[145,1850,1851],{},"t.Ref",". One hop only: a const that points to another const stays unknown. A name that does not resolve is an unknown schema, not an empty one",[223,1854,1855,1858],{},[238,1856,1857],{},"paths",[238,1859,1860,291,1862,156,1864,291,1867,156,1870,291,1872,1875],{},[145,1861,1473],{},[145,1863,665],{},[145,1865,1866],{},":id?",[145,1868,1869],{},"{id?}",[145,1871,1487],{},[145,1873,1874],{},"{wildcard*?}",". Extra slashes in a prefix or a path are collapsed",[1877,1878,1883],"pre",{"className":1879,"code":1880,"language":1881,"meta":1882,"style":1882},"language-ts shiki shiki-themes cg-light cg-light cg-dark","export const payments = new Elysia({ prefix: '\u002Fpayments' })\n  .use(signedRequests)\n  .post('\u002F', ({ body }) => createPayment(body), { body: t.Object({ order_id: t.Number(), amount: t.Number() }) })\n","ts","",[145,1884,1885,1941,1953],{"__ignoreMap":1882},[1886,1887,1890,1894,1897,1901,1905,1908,1912,1915,1918,1922,1925,1928,1932,1935,1938],"span",{"class":1888,"line":1889},"line",1,[1886,1891,1893],{"class":1892},"sHkq1","export",[1886,1895,1896],{"class":1892}," const",[1886,1898,1900],{"class":1899},"snmWg"," payments ",[1886,1902,1904],{"class":1903},"sZ_TN","=",[1886,1906,1907],{"class":1892}," new",[1886,1909,1911],{"class":1910},"sZJo5"," Elysia",[1886,1913,1914],{"class":1899},"(",[1886,1916,1917],{"class":1903},"{",[1886,1919,1921],{"class":1920},"s4LKg"," prefix",[1886,1923,1924],{"class":1903},":",[1886,1926,1927],{"class":1903}," '",[1886,1929,1931],{"class":1930},"sha9Y","\u002Fpayments",[1886,1933,1934],{"class":1903},"'",[1886,1936,1937],{"class":1903}," }",[1886,1939,1940],{"class":1899},")\n",[1886,1942,1944,1947,1950],{"class":1888,"line":1943},2,[1886,1945,1946],{"class":1903},"  .",[1886,1948,1949],{"class":1910},"use",[1886,1951,1952],{"class":1899},"(signedRequests)\n",[1886,1954,1956,1958,1960,1962,1964,1967,1969,1972,1975,1978,1981,1984,1987,1990,1992,1995,1998,2000,2003,2005,2008,2010,2012,2015,2017,2019,2021,2024,2027,2029,2032,2034,2036,2038,2040,2043,2046,2049,2051],{"class":1888,"line":1955},3,[1886,1957,1946],{"class":1903},[1886,1959,799],{"class":1910},[1886,1961,1914],{"class":1899},[1886,1963,1934],{"class":1903},[1886,1965,1966],{"class":1930},"\u002F",[1886,1968,1934],{"class":1903},[1886,1970,1971],{"class":1903},",",[1886,1973,1974],{"class":1903}," ({",[1886,1976,1977],{"class":1899}," body ",[1886,1979,1980],{"class":1903},"})",[1886,1982,1983],{"class":1892}," =>",[1886,1985,1986],{"class":1910}," createPayment",[1886,1988,1989],{"class":1899},"(body)",[1886,1991,1971],{"class":1903},[1886,1993,1994],{"class":1903}," {",[1886,1996,1997],{"class":1920}," body",[1886,1999,1924],{"class":1903},[1886,2001,2002],{"class":1899}," t",[1886,2004,215],{"class":1903},[1886,2006,2007],{"class":1910},"Object",[1886,2009,1914],{"class":1899},[1886,2011,1917],{"class":1903},[1886,2013,2014],{"class":1920}," order_id",[1886,2016,1924],{"class":1903},[1886,2018,2002],{"class":1899},[1886,2020,215],{"class":1903},[1886,2022,2023],{"class":1910},"Number",[1886,2025,2026],{"class":1899},"()",[1886,2028,1971],{"class":1903},[1886,2030,2031],{"class":1920}," amount",[1886,2033,1924],{"class":1903},[1886,2035,2002],{"class":1899},[1886,2037,215],{"class":1903},[1886,2039,2023],{"class":1910},[1886,2041,2042],{"class":1899},"() ",[1886,2044,2045],{"class":1903},"}",[1886,2047,2048],{"class":1899},") ",[1886,2050,2045],{"class":1903},[1886,2052,1940],{"class":1899},[141,2054,2055,2056,2059,2060,2063],{},"Eden Treaty clients and ",[145,2057,2058],{},".ws()"," message names are not read. Hook order across files is not known, so a hook and a route in different files both count. A hook that skips some paths itself (an early return on ",[145,2061,2062],{},"request.url",") is still listed on every route it affects.",[198,2065,2067],{"id":2066},"astro","Astro",[141,2069,2070,2071,2073,2074,269,2077,269,2080,2083,2084,269,2087,2090,2091,2094,2095,2098,2099,2102,2103,2105,2106,2109,2110,2113,2114,2116,2117,156,2120,156,2123,156,2126,819,2129,2132,2133,2136,2137,215],{},"An Astro project is detected from an ",[145,2072,2066],{}," dependency or an ",[145,2075,2076],{},"astro.config.mjs",[145,2078,2079],{},".js",[145,2081,2082],{},".ts"," \u002F\n",[145,2085,2086],{},".mts",[145,2088,2089],{},".cjs"," file. Frontmatter between the ",[145,2092,2093],{},"---"," fences and ",[145,2096,2097],{},"\u003Cscript>"," blocks are indexed as\nTypeScript at their real lines in the ",[145,2100,2101],{},".astro"," file, and the template is read too. ",[145,2104,2101],{}," files\nare parsed as TSX, so a ",[145,2107,2108],{},"\u003CT>x"," cast or a ",[145,2111,2112],{},"\u003CT>() =>"," arrow in a ",[145,2115,2101],{}," file is a syntax error.\nLiteral ",[145,2118,2119],{},"srcDir",[145,2121,2122],{},"base",[145,2124,2125],{},"trailingSlash",[145,2127,2128],{},"redirects",[145,2130,2131],{},"i18n"," are read from ",[145,2134,2135],{},"astro.config.*",",\nand routes carry ",[145,2138,2122],{},[217,2140,2141,2149],{},[220,2142,2143],{},[223,2144,2145,2147],{},[226,2146,228],{},[226,2148,231],{},[233,2150,2151,2188,2207,2237,2258,2269,2295,2312,2331,2374,2384,2397,2411,2421,2436,2471],{},[223,2152,2153,2156],{},[238,2154,2155],{},"pages",[238,2157,2158,2161,2162,2165,2166,1254,2168,1740,2170,156,2172,1740,2175,156,2178,1740,2181,2184,2185,2187],{},[145,2159,2160],{},"src\u002Fpages\u002F**.astro"," (or ",[145,2163,2164],{},"\u003CsrcDir>\u002Fpages",") → page (",[145,2167,1120],{},[145,2169,1096],{},[145,2171,1966],{},[145,2173,2174],{},"[slug]",[145,2176,2177],{},"{slug}",[145,2179,2180],{},"[...rest]",[145,2182,2183],{},"{rest*}",". A segment starting with ",[145,2186,1169],{}," is skipped",[223,2189,2190,2193],{},[238,2191,2192],{},"endpoints",[238,2194,2195,2196,269,2198,2200,2201,291,2204,2206],{},"files under the pages directory exporting ",[145,2197,644],{},[145,2199,647],{}," \u002F … (",[145,2202,2203],{},"ALL",[145,2205,735],{},") become routes",[223,2208,2209,2212],{},[238,2210,2211],{},"srcDir \u002F base \u002F i18n",[238,2213,2214,2215,156,2217,156,2219,819,2221,945,2223,2225,2226,2228,2229,2232,2233,2236],{},"literal ",[145,2216,2119],{},[145,2218,2122],{},[145,2220,2125],{},[145,2222,2131],{},[145,2224,2135],{},". Routes carry ",[145,2227,2122],{},". A locale segment sets ",[145,2230,2231],{},"attrs.locale","; otherwise the default locale when ",[145,2234,2235],{},"prefixDefaultLocale"," is false",[223,2238,2239,2241],{},[238,2240,2128],{},[238,2242,2243,2244,2247,2248,269,2251,269,2254,2257],{},"config entries become redirect pages (an external destination is only ",[145,2245,2246],{},"attrs.redirect","), and ",[145,2249,2250],{},"Astro.redirect",[145,2252,2253],{},"rewrite",[145,2255,2256],{},"context.redirect"," are NAVIGATES_TO",[223,2259,2260,2262],{},[238,2261,764],{},[238,2263,2264,2265,2268],{},"USES_MIDDLEWARE from every page and route, in ",[145,2266,2267],{},"sequence"," order",[223,2270,2271,2274],{},[238,2272,2273],{},"actions",[238,2275,2276,2279,2280,2283,2284,2287,2288,2291,2292,2294],{},[145,2277,2278],{},"POST \u002F_actions\u002F\u003Cname>"," routes (nested: ",[145,2281,2282],{},"shelf.clear","), plus CALLS from ",[145,2285,2286],{},"actions.x()"," calls and ",[145,2289,2290],{},"\u003Cform action={actions.x}>"," in any ",[145,2293,2101],{}," file",[223,2296,2297,2300],{},[238,2298,2299],{},"components",[238,2301,2302,2305,2306,2308,2309,2311],{},[145,2303,2304],{},"\u003CCard \u002F>"," → RENDERS. Imports from ",[145,2307,2082],{}," and other ",[145,2310,2101],{}," files resolve",[223,2313,2314,2317],{},[238,2315,2316],{},"template",[238,2318,2319,2322,2323,2326,2327,2330],{},[145,2320,2321],{},"{…}"," expressions, attribute values and ",[145,2324,2325],{},"define:vars"," are code at their real lines; ",[145,2328,2329],{},"is:raw"," children are text",[223,2332,2333,2336],{},[238,2334,2335],{},"islands",[238,2337,2338,269,2341,269,2344,269,2347,269,2350,819,2353,2356,2357,269,2360,269,2363,2366,2367,2370,2371],{},[145,2339,2340],{},"client:load",[145,2342,2343],{},"idle",[145,2345,2346],{},"visible",[145,2348,2349],{},"media",[145,2351,2352],{},"only",[145,2354,2355],{},"server:defer"," → RENDERS ",[145,2358,2359],{},"attrs.client",[145,2361,2362],{},"client_value",[145,2364,2365],{},"server","; React\u002FPreact ",[145,2368,2369],{},".tsx",", Vue ",[145,2372,2373],{},".vue",[223,2375,2376,2378],{},[238,2377,939],{},[238,2379,2380,2383],{},[145,2381,2382],{},"\u003Ca href>"," → NAVIGATES_TO, also inside expressions",[223,2385,2386,2389],{},[238,2387,2388],{},"props \u002F params",[238,2390,2391,156,2394],{},[145,2392,2393],{},"attrs.props",[145,2395,2396],{},"attrs.params",[223,2398,2399,2402],{},[238,2400,2401],{},"functions",[238,2403,2404,2405,2407,2408],{},"functions in a ",[145,2406,2101],{}," file are nodes; the page CALLS ",[145,2409,2410],{},"getStaticPaths",[223,2412,2413,2415],{},[238,2414,2410],{},[238,2416,2417,2420],{},[145,2418,2419],{},"attrs.get_static_paths"," when the frontmatter exports it; the function is not evaluated",[223,2422,2423,2426],{},[238,2424,2425],{},"is:inline",[238,2427,2428,2431,2432,2435],{},[145,2429,2430],{},"\u003Cscript is:inline>"," sets ",[145,2433,2434],{},"attrs.inline_scripts"," to the count",[223,2437,2438,2441],{},[238,2439,2440],{},"markdown pages",[238,2442,2443,269,2446,269,2449,2452,2453,2456,2457,2459,2460,2463,2464,2466,2467,2470],{},[145,2444,2445],{},".md",[145,2447,2448],{},".mdx",[145,2450,2451],{},".html"," under ",[145,2454,2455],{},"pages\u002F"," → page. Frontmatter (",[145,2458,2093],{}," YAML or ",[145,2461,2462],{},"+++"," TOML) ",[145,2465,1149],{}," → RENDERS. Root-relative Markdown links → NAVIGATES_TO. MDX imports, ",[145,2468,2469],{},"\u003CX \u002F>"," and calls of imported functions",[223,2472,2473,2476],{},[238,2474,2475],{},"collections",[238,2477,2478,2481,2482,291,2485,2487,2488,2491,2492,269,2495,269,2498,2501,2502,2505,2506,2509,2510,2513],{},[145,2479,2480],{},"content.config.ts"," \u002F legacy ",[145,2483,2484],{},"content\u002Fconfig.ts",[145,2486,217],{}," nodes with ",[145,2489,2490],{},"attrs.collection",", loader, base and entries. ",[145,2493,2494],{},"getCollection",[145,2496,2497],{},"getEntry",[145,2499,2500],{},"getEntries"," (imported from ",[145,2503,2504],{},"astro:content",") → READS_TABLE from the calling function or page; ",[145,2507,2508],{},"render"," → READS_TABLE when the file reads one collection. ",[145,2511,2512],{},"reference()"," → HAS_RELATION",[198,2515,2517],{"id":2516},"nuxt","Nuxt",[141,2519,204,2520,2523,2524,174,2526,2529,2530,2532,2533,2535,2536,2539,2540,156,2543,156,2546,2549,2550,156,2553,313,2556,2559,2560,2562,2563,819,2565,2567,2568,2571,2572,2575,2576,773,2579,215],{},[145,2521,2522],{},"nuxt.config.{ts,js,mjs}",". Source dirs are the srcDir (literal ",[145,2525,2119],{},[145,2527,2528],{},"nuxt.config",", else ",[145,2531,180],{}," in the\nNuxt 4 layout, ",[145,2534,177],{},", or the project root) plus the root-level ",[145,2537,2538],{},"server\u002F"," (Nitro: ",[145,2541,2542],{},"api\u002F",[145,2544,2545],{},"routes\u002F",[145,2547,2548],{},"middleware\u002F",",\n",[145,2551,2552],{},"plugins\u002F",[145,2554,2555],{},"utils\u002F",[145,2557,2558],{},"shared\u002F"," (Nuxt 4) when the srcDir is not the root. With a root srcDir (the Nuxt 3 default)\n",[145,2561,2538],{}," is already inside it. Files in ",[145,2564,2538],{},[145,2566,2558],{}," are indexed as TypeScript modules with their calls.\nWithout ",[145,2569,2570],{},".nuxt\u002F"," (no ",[145,2573,2574],{},"npx nuxi prepare","), cg generates stand-ins for the auto-imports and global components. Another\ndirectory (a local layer, a module) is read when it is listed in ",[145,2577,2578],{},".cg.yaml",[145,2580,2581],{},"include",[217,2583,2584,2594],{},[220,2585,2586],{},[223,2587,2588,2591],{},[226,2589,2590],{},"area",[226,2592,2593],{},"what is extracted",[233,2595,2596,2627,2705,2741,2796],{},[223,2597,2598,2600],{},[238,2599,2155],{},[238,2601,2602,291,2605,2608,2609,2612,2613,471,2615,2618,2619,471,2621,945,2624],{},[145,2603,2604],{},"pages\u002F**\u002F*.vue",[145,2606,2607],{},"page"," with the route path (",[145,2610,2611],{},"\u002Fshelves\u002F:id","), entry ",[145,2614,1120],{},[145,2616,2617],{},"app.vue",", layouts, global middleware and plugins are ",[145,2620,636],{},[145,2622,2623],{},"USES_LAYOUT",[145,2625,2626],{},"definePageMeta({ layout })",[223,2628,2629,2632],{},[238,2630,2631],{},"Nitro routes",[238,2633,2634,2635,291,2638,2641,2642,291,2645,2571,2648,2651,2652,156,2654,2657,2658,291,2661,156,2663,291,2666,2669,2670,250,2672,2674,2675,1740,2677,156,2679,1740,2681,156,2683,2686,2687,269,2690,2693,2694,2697,2698,156,2701,2704],{},"each file under ",[145,2636,2637],{},"server\u002Fapi\u002F",[145,2639,2640],{},"route:\u003CMETHOD> \u002Fapi\u002F\u003Cpath>",", under ",[145,2643,2644],{},"server\u002Froutes\u002F",[145,2646,2647],{},"route:\u003CMETHOD> \u002F\u003Cpath>",[145,2649,2650],{},"\u002Fapi"," prefix), entry ",[145,2653,298],{},[145,2655,2656],{},"framework: nuxt",". The method comes from the file suffix (",[145,2659,2660],{},"plants.get.ts",[145,2662,644],{},[145,2664,2665],{},"plants\u002F[id].put.ts",[145,2667,2668],{},"PUT \u002Fapi\u002Fplants\u002F{id}","); no suffix is ",[145,2671,735],{},[145,2673,1096],{}," is the directory path, ",[145,2676,662],{},[145,2678,665],{},[145,2680,668],{},[145,2682,671],{},[145,2684,2685],{},"(group)"," directories and ",[145,2688,2689],{},".dev",[145,2691,2692],{},".prod"," suffixes are dropped. ",[145,2695,2696],{},"ROUTES_TO"," the default-export handler (",[145,2699,2700],{},"defineEventHandler",[145,2702,2703],{},"defineCachedEventHandler",", a plain function)",[223,2706,2707,2710],{},[238,2708,2709],{},"Nitro middleware \u002F plugins",[238,2711,2712,2715,2716,2719,2720,2723,2724,2727,2728,2731,2732,347,2735,156,2737,2740],{},[145,2713,2714],{},"server\u002Fmiddleware\u002F*"," handlers are ",[145,2717,2718],{},"USES_MIDDLEWARE"," targets of every Nitro route (",[145,2721,2722],{},"nitro:\u003Cname>","); ",[145,2725,2726],{},"server\u002Fplugins\u002F*"," handlers are entry ",[145,2729,2730],{},"main",". Both have ",[145,2733,2734],{},"attrs.nitro",[145,2736,764],{},[145,2738,2739],{},"plugin","); they are not routes",[223,2742,2743,2746],{},[238,2744,2745],{},"frontend → server",[238,2747,2748,2749,156,2751,156,2754,819,2757,2759,2760,2763,2764,2767,2768,156,2771,819,2774,2777,2778,269,2781,2784,2785,2788,2789,2792,2793],{},"same-origin ",[145,2750,844],{},[145,2752,2753],{},"useFetch",[145,2755,2756],{},"useLazyFetch",[145,2758,841],{}," calls with a literal or template path (",[145,2761,2762],{},"\u002Fapi\u002Fplants\u002F${id}",") get ",[145,2765,2766],{},"MATCHES_ROUTE"," to the matching Nitro route, so ",[145,2769,2770],{},"impact",[145,2772,2773],{},"reaches",[145,2775,2776],{},"api-calls"," cross from a page or composable to the handler. The most specific route wins over a catch-all. A route whose handler calls ",[145,2779,2780],{},"proxyRequest",[145,2782,2783],{},"sendProxy"," has ",[145,2786,2787],{},"attrs.proxy"," and is not a link target. Calls with a configured base URL (",[145,2790,2791],{},"runtimeConfig.public.apiBase",") stay for ",[145,2794,2795],{},"cg link",[223,2797,2798,2800],{},[238,2799,2131],{},[238,2801,2802,156,2805,291,2808,483,2811,2814,2815,269,2817,2819,2820,2823,2824,2827,2828,2831,2832,2835,2836,2839,2840,2843,2844,2847,2848,156,2851,819,2854,2452,2857,156,2860,156,2863,347,2866,2869,2870,313,2873,471,2876,2879,2880,2883,2884,2887],{},[145,2803,2804],{},"$t('key')",[145,2806,2807],{},"t('key')",[145,2809,2810],{},"i18n:\u003Ckey>",[145,2812,2813],{},"USES_I18N"," from the component or page (propagating, so ",[145,2816,2773],{},[145,2818,2770],{}," on a key list the pages showing it). The node's ",[145,2821,2822],{},"file:line"," is the key in the default locale's file (",[145,2825,2826],{},"i18n.defaultLocale",", else the first locale found); ",[145,2829,2830],{},"attrs.definitions"," lists ",[145,2833,2834],{},"{locale, file, line}"," for every locale file and SFC ",[145,2837,2838],{},"\u003Ci18n>"," block, ",[145,2841,2842],{},"attrs.missing_locales"," the locales without the key, ",[145,2845,2846],{},"attrs.uses"," the number of uses. Locale files are ",[145,2849,2850],{},".json",[145,2852,2853],{},".yaml",[145,2855,2856],{},".yml",[145,2858,2859],{},"i18n\u002F\u003ClangDir>",[145,2861,2862],{},"\u003CsrcDir>\u002F\u003ClangDir>",[145,2864,2865],{},"\u003ClangDir>",[145,2867,2868],{},"i18n.langDir",", default ",[145,2871,2872],{},"locales",[145,2874,2875],{},"app\u002Flocales",[145,2877,2878],{},"i18n.locales[].file"," names a file's locale, else its name (",[145,2881,2882],{},"pt-BR.yaml","). A file keyed by locale codes (",[145,2885,2886],{},"{\"es\": {...}, \"pt-BR\": {...}}",") defines each locale",[198,2889,2891],{"id":2890},"stored-fields","Stored fields",[141,2893,2894,347,2897,2900],{},[145,2895,2896],{},"field:\u003Cfile>#\u003CClass>.\u003Cname>",[145,2898,2899],{},"property: stored",") for a non-static class property whose\ninitializer is not a function, and for a constructor parameter property. An arrow-function\nproperty is a method. A static readonly literal is a constant.",[141,2902,2903,2904,269,2907,347,2910,2912,2913,269,2916,156,2918,347,2921,838,2924,347,2927,2930,2931,156,2933,2936,2937,215],{},"The checker’s property access is ",[145,2905,2906],{},"READS_PROP",[145,2908,2909],{},"WRITES_PROP",[145,2911,1594],{},"). Writes: assignment,\n",[145,2914,2915],{},"++",[145,2917,812],{},[145,2919,2920],{},"this.cache[k] =",[145,2922,2923],{},"via: item",[145,2925,2926],{},"this.items.push",[145,2928,2929],{},"via: mutating","). In\n",[145,2932,2079],{},[145,2934,2935],{},"this.x ="," without a declaration is ",[145,2938,2939],{},"declared: this",[141,2941,2942,2943,2946,2947,2950,2951,269,2954,2956,2957,156,2960,2963,2964,269,2967,2970,2971,269,2974,2977,2978,471,2981,1740,2984,2987,2988,184,2991,2994,2995,269,2998,269,3001,3004,3005,819,3008,215],{},"Pinia ",[145,2944,2945],{},"state"," keys and Vue ",[145,2948,2949],{},"data()"," keys use the same edges (",[145,2952,2953],{},"hook: pinia",[145,2955,543],{},"), from\n",[145,2958,2959],{},"this.x",[145,2961,2962],{},"useStore().x",". React ",[145,2965,2966],{},"useState",[145,2968,2969],{},"useReducer"," and Vue ",[145,2972,2973],{},"ref",[145,2975,2976],{},"reactive"," in a\ncomponent or composable are ",[145,2979,2980],{},"property: state",[145,2982,2983],{},"setCount(...)",[145,2985,2986],{},"via: setter",". Passing the\nsetter on is not a write. A ",[145,2989,2990],{},"RENDERS",[145,2992,2993],{},"INSTANTIATES"," edge inside ",[145,2996,2997],{},"if",[145,2999,3000],{},"switch",[145,3002,3003],{},"&&","\ncarries ",[145,3006,3007],{},"branch",[145,3009,3010],{},"branch_line",[141,3012,3013,269,3016,823,3019,3022,3023,215],{},[145,3014,3015],{},"cg readers",[145,3017,3018],{},"cg writers",[145,3020,3021],{},"Class.field",". Public numbers:\n",[190,3024,115],{"href":3025},"\u002Fdocs\u002Fvalidation-log#typescript--javascript-frameworks",[198,3027,3029],{"id":3028},"limitations","Limitations",[3031,3032,3033,3050,3061,3074,3109,3138,3145,3148],"ul",{},[3034,3035,3036,3037,3039,3040,3042,3043,3046,3047,193],"li",{},"Paths built in a loop or from config become ",[145,3038,1314],{}," or are missed. Custom decorators that\nwrap ",[145,3041,268],{}," through ",[145,3044,3045],{},"applyDecorators"," are not routes (a blind spot in\n",[190,3048,3049],{"href":31},"Completeness",[3034,3051,3052,3053,3056,3057,3060],{},"Nest tokens are global. Request-scoped providers are treated as singletons. ",[145,3054,3055],{},"@OnJob"," and other\n",[145,3058,3059],{},"SetMetadata"," systems are not entry points.",[3034,3062,3063,3064,3067,3068,819,3070,3073],{},"Next ",[145,3065,3066],{},"pageExtensions",", MDX-only pages, i18n ",[145,3069,2872],{},[145,3071,3072],{},"generateStaticParams"," are not\napplied. Regex middleware matchers are heuristic.",[3034,3075,3076,3077,773,3080,3083,3084,156,3087,156,3089,156,3092,819,3095,3098,3099,3102,3103,3105,3106,3108],{},"Remix v1 nested-folder routes and ",[145,3078,3079],{},"remix.config.js",[145,3081,3082],{},"routes()"," are not read. Route-module\n",[145,3085,3086],{},"meta",[145,3088,939],{},[145,3090,3091],{},"headers",[145,3093,3094],{},"shouldRevalidate",[145,3096,3097],{},"ErrorBoundary"," are not nodes. Generated\n",[145,3100,3101],{},"+types"," and Vite options other than a literal ",[145,3104,1038],{}," are not read. A component that\nforwards ",[145,3107,1303],{}," through props is not a link. TanStack Router and Expo Router are separate.",[3034,3110,3111,3112,3115,3116,3119,3120,838,3123,3126,3127,3129,3130,3133,3134,3137],{},"Nitro: ",[145,3113,3114],{},"defineEventHandler({ handler })"," object form and handlers re-exported from another file fall back to the\nmodule node (",[145,3117,3118],{},"attrs.handler_unresolved","). Route rules (",[145,3121,3122],{},"routeRules",[145,3124,3125],{},"nitro.handlers"," registered in ",[145,3128,2528],{},"\nand ",[145,3131,3132],{},"server\u002Fapi"," dirs of layers are not read. i18n keys built at run time (",[145,3135,3136],{},"$t(`status.${s}`)",") are not nodes.",[3034,3139,3140,3141,3144],{},"Express middleware order is known inside one file. Dynamic ",[145,3142,3143],{},"require(path)"," is not followed.",[3034,3146,3147],{},"Untyped JavaScript resolves when the checker can see the object literal or the CommonJS\nexport.",[3034,3149,3150,3151,3154,3155,3157,3158,3160,3161,3163,3164,3167,3168,269,3171,3174],{},"Astro ",[145,3152,3153],{},".svelte"," islands are not resolved. MDX expressions resolve by imported name (",[145,3156,780],{},"),\nnot by the type checker, and only relative or root-relative imports. Content reads need a literal\ncollection name (a ",[145,3159,2512],{}," value passed to ",[145,3162,2497],{}," is not followed); relative Markdown\nlinks, Markdoc, custom loaders' entries and MDX inside collection entries are not read. Computed\nconfig values, ",[145,3165,3166],{},"injectRoute"," from integrations, and i18n ",[145,3169,3170],{},"domains",[145,3172,3173],{},"fallback"," are not read.",[3176,3177,3178],"style",{},"html pre.shiki code .sHkq1, html code.shiki .sHkq1{--shiki-light:#6FAF00;--shiki-default:#6FAF00;--shiki-dark:#A3E635}html pre.shiki code .snmWg, html code.shiki .snmWg{--shiki-light:#27272A;--shiki-default:#27272A;--shiki-dark:#E4E4E7}html pre.shiki code .sZ_TN, html code.shiki .sZ_TN{--shiki-light:#71717A;--shiki-default:#71717A;--shiki-dark:#A1A1AA}html pre.shiki code .sZJo5, html code.shiki .sZJo5{--shiki-light:#65A30D;--shiki-default:#65A30D;--shiki-dark:#84CC16}html pre.shiki code .s4LKg, html code.shiki .s4LKg{--shiki-light:#4D7C0F;--shiki-default:#4D7C0F;--shiki-dark:#84CC16}html pre.shiki code .sha9Y, html code.shiki .sha9Y{--shiki-light:#9F8CFF;--shiki-default:#9F8CFF;--shiki-dark:#C4B5FD}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":1882,"searchDepth":3180,"depth":1943,"links":3181},4,[3182,3183,3184,3185,3188,3189,3190,3191],{"id":200,"depth":1943,"text":201},{"id":595,"depth":1943,"text":596},{"id":1003,"depth":1943,"text":1004},{"id":1363,"depth":1943,"text":1364,"children":3186},[3187],{"id":1384,"depth":1955,"text":1633},{"id":2066,"depth":1943,"text":2067},{"id":2516,"depth":1943,"text":2517},{"id":2890,"depth":1943,"text":2891},{"id":3028,"depth":1943,"text":3029},"What NestJS, Next.js, Astro, Express-style routers and React Router \u002F Remix add on top of the TypeScript plugin. They share\none program with the Nuxt layer, so aliases and types go through the checker. Plain JavaScript\n(CommonJS or ESM, with or without jsconfig.json) is indexed with allowJs. Samples:\nexamples\u002Fbookstore-nest, bookstore-next, bookstore-express. Without a root tsconfig, the\nprogram is the per-package tsconfig.json next to a package.json one or two levels down, plus\na tsconfig.json in src\u002F, app\u002F, lib\u002F or web\u002F without one. The extractor runs under Node.js 20+ or Bun (Installing and updating cg).","md",{},true,{"title":115,"description":3192},"v0c5GmfzhP3V17MlOnOmGk_0SKtT5DtW21Fv5EEF08I",[3199,3201],{"title":111,"path":112,"stem":113,"description":3200,"children":-1},"What .swift adds beyond Install, CLI specs, and Graph schema: heuristic vs the Swift index store, the CG_SWIFT_* flags, and the ids those pages do not spell out. Toolchain fit: cg doctor -h. Why a file stayed heuristic: cg coverage.",{"title":119,"path":120,"stem":121,"description":3202,"children":-1},"Public-project checks, not a tutorial. Each area was indexed from a shallow clone (default\nbranch, October 2026) with python -m cg_code_graph.cli index \u003Crepo> on one 8-core Linux box. Wall\ntime includes a cold extractor cache, not a one-off dart compile exe.",1792170236219]