@backthread/extractor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/cluster/domain-grouping.d.ts +113 -0
  4. package/dist/cluster/domain-grouping.d.ts.map +1 -0
  5. package/dist/cluster/domain-grouping.js +277 -0
  6. package/dist/cluster/domain-grouping.js.map +1 -0
  7. package/dist/cluster/grouping-gate.d.ts +54 -0
  8. package/dist/cluster/grouping-gate.d.ts.map +1 -0
  9. package/dist/cluster/grouping-gate.js +0 -0
  10. package/dist/cluster/grouping-gate.js.map +1 -0
  11. package/dist/cluster/louvain.d.ts +88 -0
  12. package/dist/cluster/louvain.d.ts.map +1 -0
  13. package/dist/cluster/louvain.js +674 -0
  14. package/dist/cluster/louvain.js.map +1 -0
  15. package/dist/cluster/overrides.d.ts +19 -0
  16. package/dist/cluster/overrides.d.ts.map +1 -0
  17. package/dist/cluster/overrides.js +32 -0
  18. package/dist/cluster/overrides.js.map +1 -0
  19. package/dist/cluster/subsystem.d.ts +45 -0
  20. package/dist/cluster/subsystem.d.ts.map +1 -0
  21. package/dist/cluster/subsystem.js +299 -0
  22. package/dist/cluster/subsystem.js.map +1 -0
  23. package/dist/cluster/workspaces.d.ts +64 -0
  24. package/dist/cluster/workspaces.d.ts.map +1 -0
  25. package/dist/cluster/workspaces.js +739 -0
  26. package/dist/cluster/workspaces.js.map +1 -0
  27. package/dist/extract.d.ts +52 -0
  28. package/dist/extract.d.ts.map +1 -0
  29. package/dist/extract.js +48 -0
  30. package/dist/extract.js.map +1 -0
  31. package/dist/framework/celery/celery.d.ts +17 -0
  32. package/dist/framework/celery/celery.d.ts.map +1 -0
  33. package/dist/framework/celery/celery.js +524 -0
  34. package/dist/framework/celery/celery.js.map +1 -0
  35. package/dist/framework/contribute-step.d.ts +38 -0
  36. package/dist/framework/contribute-step.d.ts.map +1 -0
  37. package/dist/framework/contribute-step.js +403 -0
  38. package/dist/framework/contribute-step.js.map +1 -0
  39. package/dist/framework/detect-step.d.ts +8 -0
  40. package/dist/framework/detect-step.d.ts.map +1 -0
  41. package/dist/framework/detect-step.js +54 -0
  42. package/dist/framework/detect-step.js.map +1 -0
  43. package/dist/framework/detect-util.d.ts +24 -0
  44. package/dist/framework/detect-util.d.ts.map +1 -0
  45. package/dist/framework/detect-util.js +59 -0
  46. package/dist/framework/detect-util.js.map +1 -0
  47. package/dist/framework/django/django.d.ts +22 -0
  48. package/dist/framework/django/django.d.ts.map +1 -0
  49. package/dist/framework/django/django.js +940 -0
  50. package/dist/framework/django/django.js.map +1 -0
  51. package/dist/framework/fastapi/fastapi.d.ts +27 -0
  52. package/dist/framework/fastapi/fastapi.d.ts.map +1 -0
  53. package/dist/framework/fastapi/fastapi.js +477 -0
  54. package/dist/framework/fastapi/fastapi.js.map +1 -0
  55. package/dist/framework/faststream/faststream.d.ts +19 -0
  56. package/dist/framework/faststream/faststream.d.ts.map +1 -0
  57. package/dist/framework/faststream/faststream.js +765 -0
  58. package/dist/framework/faststream/faststream.js.map +1 -0
  59. package/dist/framework/flask/flask.d.ts +17 -0
  60. package/dist/framework/flask/flask.d.ts.map +1 -0
  61. package/dist/framework/flask/flask.js +507 -0
  62. package/dist/framework/flask/flask.js.map +1 -0
  63. package/dist/framework/graphql/graphql.d.ts +17 -0
  64. package/dist/framework/graphql/graphql.d.ts.map +1 -0
  65. package/dist/framework/graphql/graphql.js +708 -0
  66. package/dist/framework/graphql/graphql.js.map +1 -0
  67. package/dist/framework/grpc/grpc.d.ts +22 -0
  68. package/dist/framework/grpc/grpc.d.ts.map +1 -0
  69. package/dist/framework/grpc/grpc.js +618 -0
  70. package/dist/framework/grpc/grpc.js.map +1 -0
  71. package/dist/framework/litestar/litestar.d.ts +17 -0
  72. package/dist/framework/litestar/litestar.d.ts.map +1 -0
  73. package/dist/framework/litestar/litestar.js +536 -0
  74. package/dist/framework/litestar/litestar.js.map +1 -0
  75. package/dist/framework/nest/nest.d.ts +19 -0
  76. package/dist/framework/nest/nest.d.ts.map +1 -0
  77. package/dist/framework/nest/nest.js +613 -0
  78. package/dist/framework/nest/nest.js.map +1 -0
  79. package/dist/framework/next/next.d.ts +22 -0
  80. package/dist/framework/next/next.d.ts.map +1 -0
  81. package/dist/framework/next/next.js +449 -0
  82. package/dist/framework/next/next.js.map +1 -0
  83. package/dist/framework/node/node.d.ts +24 -0
  84. package/dist/framework/node/node.d.ts.map +1 -0
  85. package/dist/framework/node/node.js +1009 -0
  86. package/dist/framework/node/node.js.map +1 -0
  87. package/dist/framework/orchestrator/orchestrator.d.ts +34 -0
  88. package/dist/framework/orchestrator/orchestrator.d.ts.map +1 -0
  89. package/dist/framework/orchestrator/orchestrator.js +691 -0
  90. package/dist/framework/orchestrator/orchestrator.js.map +1 -0
  91. package/dist/framework/orm/orm.d.ts +61 -0
  92. package/dist/framework/orm/orm.d.ts.map +1 -0
  93. package/dist/framework/orm/orm.js +620 -0
  94. package/dist/framework/orm/orm.js.map +1 -0
  95. package/dist/framework/python/analyze.d.ts +38 -0
  96. package/dist/framework/python/analyze.d.ts.map +1 -0
  97. package/dist/framework/python/analyze.js +98 -0
  98. package/dist/framework/python/analyze.js.map +1 -0
  99. package/dist/framework/python/py-ast.d.ts +130 -0
  100. package/dist/framework/python/py-ast.d.ts.map +1 -0
  101. package/dist/framework/python/py-ast.js +344 -0
  102. package/dist/framework/python/py-ast.js.map +1 -0
  103. package/dist/framework/python-orm/python-orm.d.ts +19 -0
  104. package/dist/framework/python-orm/python-orm.d.ts.map +1 -0
  105. package/dist/framework/python-orm/python-orm.js +516 -0
  106. package/dist/framework/python-orm/python-orm.js.map +1 -0
  107. package/dist/framework/react-native/react-native.d.ts +35 -0
  108. package/dist/framework/react-native/react-native.d.ts.map +1 -0
  109. package/dist/framework/react-native/react-native.js +1181 -0
  110. package/dist/framework/react-native/react-native.js.map +1 -0
  111. package/dist/framework/register.d.ts +2 -0
  112. package/dist/framework/register.d.ts.map +1 -0
  113. package/dist/framework/register.js +59 -0
  114. package/dist/framework/register.js.map +1 -0
  115. package/dist/framework/registry.d.ts +31 -0
  116. package/dist/framework/registry.d.ts.map +1 -0
  117. package/dist/framework/registry.js +70 -0
  118. package/dist/framework/registry.js.map +1 -0
  119. package/dist/framework/routing/expo-router.d.ts +31 -0
  120. package/dist/framework/routing/expo-router.d.ts.map +1 -0
  121. package/dist/framework/routing/expo-router.js +356 -0
  122. package/dist/framework/routing/expo-router.js.map +1 -0
  123. package/dist/framework/routing/index.d.ts +4 -0
  124. package/dist/framework/routing/index.d.ts.map +1 -0
  125. package/dist/framework/routing/index.js +16 -0
  126. package/dist/framework/routing/index.js.map +1 -0
  127. package/dist/framework/routing/next-router.d.ts +45 -0
  128. package/dist/framework/routing/next-router.d.ts.map +1 -0
  129. package/dist/framework/routing/next-router.js +378 -0
  130. package/dist/framework/routing/next-router.js.map +1 -0
  131. package/dist/framework/routing/route-tree.d.ts +73 -0
  132. package/dist/framework/routing/route-tree.d.ts.map +1 -0
  133. package/dist/framework/routing/route-tree.js +120 -0
  134. package/dist/framework/routing/route-tree.js.map +1 -0
  135. package/dist/framework/types.d.ts +230 -0
  136. package/dist/framework/types.d.ts.map +1 -0
  137. package/dist/framework/types.js +25 -0
  138. package/dist/framework/types.js.map +1 -0
  139. package/dist/graph/cross-language.d.ts +11 -0
  140. package/dist/graph/cross-language.d.ts.map +1 -0
  141. package/dist/graph/cross-language.js +123 -0
  142. package/dist/graph/cross-language.js.map +1 -0
  143. package/dist/graph/extract.d.ts +13 -0
  144. package/dist/graph/extract.d.ts.map +1 -0
  145. package/dist/graph/extract.js +79 -0
  146. package/dist/graph/extract.js.map +1 -0
  147. package/dist/graph/file-graph.d.ts +186 -0
  148. package/dist/graph/file-graph.d.ts.map +1 -0
  149. package/dist/graph/file-graph.js +427 -0
  150. package/dist/graph/file-graph.js.map +1 -0
  151. package/dist/graph/http-callsites.d.ts +14 -0
  152. package/dist/graph/http-callsites.d.ts.map +1 -0
  153. package/dist/graph/http-callsites.js +107 -0
  154. package/dist/graph/http-callsites.js.map +1 -0
  155. package/dist/graph/incremental.d.ts +122 -0
  156. package/dist/graph/incremental.d.ts.map +1 -0
  157. package/dist/graph/incremental.js +448 -0
  158. package/dist/graph/incremental.js.map +1 -0
  159. package/dist/graph/language.d.ts +31 -0
  160. package/dist/graph/language.d.ts.map +1 -0
  161. package/dist/graph/language.js +146 -0
  162. package/dist/graph/language.js.map +1 -0
  163. package/dist/graph/noise-filter.d.ts +46 -0
  164. package/dist/graph/noise-filter.d.ts.map +1 -0
  165. package/dist/graph/noise-filter.js +199 -0
  166. package/dist/graph/noise-filter.js.map +1 -0
  167. package/dist/graph/python-adapter.d.ts +36 -0
  168. package/dist/graph/python-adapter.d.ts.map +1 -0
  169. package/dist/graph/python-adapter.js +402 -0
  170. package/dist/graph/python-adapter.js.map +1 -0
  171. package/dist/graph/python-manifest.d.ts +22 -0
  172. package/dist/graph/python-manifest.d.ts.map +1 -0
  173. package/dist/graph/python-manifest.js +137 -0
  174. package/dist/graph/python-manifest.js.map +1 -0
  175. package/dist/graph/python-stdlib.d.ts +2 -0
  176. package/dist/graph/python-stdlib.d.ts.map +1 -0
  177. package/dist/graph/python-stdlib.js +53 -0
  178. package/dist/graph/python-stdlib.js.map +1 -0
  179. package/dist/graph/ts-morph-adapter.d.ts +65 -0
  180. package/dist/graph/ts-morph-adapter.d.ts.map +1 -0
  181. package/dist/graph/ts-morph-adapter.js +265 -0
  182. package/dist/graph/ts-morph-adapter.js.map +1 -0
  183. package/dist/graph/types.d.ts +37 -0
  184. package/dist/graph/types.d.ts.map +1 -0
  185. package/dist/graph/types.js +50 -0
  186. package/dist/graph/types.js.map +1 -0
  187. package/dist/index.d.ts +45 -0
  188. package/dist/index.d.ts.map +1 -0
  189. package/dist/index.js +51 -0
  190. package/dist/index.js.map +1 -0
  191. package/dist/infra/aws/aws-parse.d.ts +39 -0
  192. package/dist/infra/aws/aws-parse.d.ts.map +1 -0
  193. package/dist/infra/aws/aws-parse.js +149 -0
  194. package/dist/infra/aws/aws-parse.js.map +1 -0
  195. package/dist/infra/aws/aws.d.ts +6 -0
  196. package/dist/infra/aws/aws.d.ts.map +1 -0
  197. package/dist/infra/aws/aws.js +425 -0
  198. package/dist/infra/aws/aws.js.map +1 -0
  199. package/dist/infra/azure/azure-parse.d.ts +73 -0
  200. package/dist/infra/azure/azure-parse.d.ts.map +1 -0
  201. package/dist/infra/azure/azure-parse.js +178 -0
  202. package/dist/infra/azure/azure-parse.js.map +1 -0
  203. package/dist/infra/azure/azure.d.ts +12 -0
  204. package/dist/infra/azure/azure.d.ts.map +1 -0
  205. package/dist/infra/azure/azure.js +673 -0
  206. package/dist/infra/azure/azure.js.map +1 -0
  207. package/dist/infra/cloudflare/cloudflare.d.ts +50 -0
  208. package/dist/infra/cloudflare/cloudflare.d.ts.map +1 -0
  209. package/dist/infra/cloudflare/cloudflare.js +382 -0
  210. package/dist/infra/cloudflare/cloudflare.js.map +1 -0
  211. package/dist/infra/cloudflare/wrangler-parse.d.ts +6 -0
  212. package/dist/infra/cloudflare/wrangler-parse.d.ts.map +1 -0
  213. package/dist/infra/cloudflare/wrangler-parse.js +278 -0
  214. package/dist/infra/cloudflare/wrangler-parse.js.map +1 -0
  215. package/dist/infra/compose/compose-parse.d.ts +24 -0
  216. package/dist/infra/compose/compose-parse.d.ts.map +1 -0
  217. package/dist/infra/compose/compose-parse.js +77 -0
  218. package/dist/infra/compose/compose-parse.js.map +1 -0
  219. package/dist/infra/compose/compose.d.ts +12 -0
  220. package/dist/infra/compose/compose.d.ts.map +1 -0
  221. package/dist/infra/compose/compose.js +201 -0
  222. package/dist/infra/compose/compose.js.map +1 -0
  223. package/dist/infra/convex/convex-parse.d.ts +28 -0
  224. package/dist/infra/convex/convex-parse.d.ts.map +1 -0
  225. package/dist/infra/convex/convex-parse.js +74 -0
  226. package/dist/infra/convex/convex-parse.js.map +1 -0
  227. package/dist/infra/convex/convex.d.ts +18 -0
  228. package/dist/infra/convex/convex.d.ts.map +1 -0
  229. package/dist/infra/convex/convex.js +199 -0
  230. package/dist/infra/convex/convex.js.map +1 -0
  231. package/dist/infra/digitalocean/digitalocean.d.ts +33 -0
  232. package/dist/infra/digitalocean/digitalocean.d.ts.map +1 -0
  233. package/dist/infra/digitalocean/digitalocean.js +204 -0
  234. package/dist/infra/digitalocean/digitalocean.js.map +1 -0
  235. package/dist/infra/firebase/firebase.d.ts +43 -0
  236. package/dist/infra/firebase/firebase.d.ts.map +1 -0
  237. package/dist/infra/firebase/firebase.js +271 -0
  238. package/dist/infra/firebase/firebase.js.map +1 -0
  239. package/dist/infra/fly/fly-parse.d.ts +52 -0
  240. package/dist/infra/fly/fly-parse.d.ts.map +1 -0
  241. package/dist/infra/fly/fly-parse.js +114 -0
  242. package/dist/infra/fly/fly-parse.js.map +1 -0
  243. package/dist/infra/fly/fly.d.ts +15 -0
  244. package/dist/infra/fly/fly.d.ts.map +1 -0
  245. package/dist/infra/fly/fly.js +265 -0
  246. package/dist/infra/fly/fly.js.map +1 -0
  247. package/dist/infra/gcp/gcp-parse.d.ts +24 -0
  248. package/dist/infra/gcp/gcp-parse.d.ts.map +1 -0
  249. package/dist/infra/gcp/gcp-parse.js +123 -0
  250. package/dist/infra/gcp/gcp-parse.js.map +1 -0
  251. package/dist/infra/gcp/gcp.d.ts +10 -0
  252. package/dist/infra/gcp/gcp.d.ts.map +1 -0
  253. package/dist/infra/gcp/gcp.js +502 -0
  254. package/dist/infra/gcp/gcp.js.map +1 -0
  255. package/dist/infra/heroku/heroku-parse.d.ts +33 -0
  256. package/dist/infra/heroku/heroku-parse.d.ts.map +1 -0
  257. package/dist/infra/heroku/heroku-parse.js +63 -0
  258. package/dist/infra/heroku/heroku-parse.js.map +1 -0
  259. package/dist/infra/heroku/heroku.d.ts +24 -0
  260. package/dist/infra/heroku/heroku.d.ts.map +1 -0
  261. package/dist/infra/heroku/heroku.js +253 -0
  262. package/dist/infra/heroku/heroku.js.map +1 -0
  263. package/dist/infra/image-resolve.d.ts +56 -0
  264. package/dist/infra/image-resolve.d.ts.map +1 -0
  265. package/dist/infra/image-resolve.js +229 -0
  266. package/dist/infra/image-resolve.js.map +1 -0
  267. package/dist/infra/infra-step.d.ts +39 -0
  268. package/dist/infra/infra-step.d.ts.map +1 -0
  269. package/dist/infra/infra-step.js +57 -0
  270. package/dist/infra/infra-step.js.map +1 -0
  271. package/dist/infra/k8s/index.d.ts +78 -0
  272. package/dist/infra/k8s/index.d.ts.map +1 -0
  273. package/dist/infra/k8s/index.js +251 -0
  274. package/dist/infra/k8s/index.js.map +1 -0
  275. package/dist/infra/kamal/kamal-parse.d.ts +23 -0
  276. package/dist/infra/kamal/kamal-parse.d.ts.map +1 -0
  277. package/dist/infra/kamal/kamal-parse.js +66 -0
  278. package/dist/infra/kamal/kamal-parse.js.map +1 -0
  279. package/dist/infra/kamal/kamal.d.ts +17 -0
  280. package/dist/infra/kamal/kamal.d.ts.map +1 -0
  281. package/dist/infra/kamal/kamal.js +162 -0
  282. package/dist/infra/kamal/kamal.js.map +1 -0
  283. package/dist/infra/netlify/netlify.d.ts +33 -0
  284. package/dist/infra/netlify/netlify.d.ts.map +1 -0
  285. package/dist/infra/netlify/netlify.js +247 -0
  286. package/dist/infra/netlify/netlify.js.map +1 -0
  287. package/dist/infra/opentofu/opentofu.d.ts +3 -0
  288. package/dist/infra/opentofu/opentofu.d.ts.map +1 -0
  289. package/dist/infra/opentofu/opentofu.js +157 -0
  290. package/dist/infra/opentofu/opentofu.js.map +1 -0
  291. package/dist/infra/pulumi/pulumi-parse.d.ts +60 -0
  292. package/dist/infra/pulumi/pulumi-parse.d.ts.map +1 -0
  293. package/dist/infra/pulumi/pulumi-parse.js +155 -0
  294. package/dist/infra/pulumi/pulumi-parse.js.map +1 -0
  295. package/dist/infra/pulumi/pulumi.d.ts +23 -0
  296. package/dist/infra/pulumi/pulumi.d.ts.map +1 -0
  297. package/dist/infra/pulumi/pulumi.js +260 -0
  298. package/dist/infra/pulumi/pulumi.js.map +1 -0
  299. package/dist/infra/railway/railway-parse.d.ts +54 -0
  300. package/dist/infra/railway/railway-parse.d.ts.map +1 -0
  301. package/dist/infra/railway/railway-parse.js +200 -0
  302. package/dist/infra/railway/railway-parse.js.map +1 -0
  303. package/dist/infra/railway/railway.d.ts +19 -0
  304. package/dist/infra/railway/railway.d.ts.map +1 -0
  305. package/dist/infra/railway/railway.js +397 -0
  306. package/dist/infra/railway/railway.js.map +1 -0
  307. package/dist/infra/register.d.ts +2 -0
  308. package/dist/infra/register.d.ts.map +1 -0
  309. package/dist/infra/register.js +81 -0
  310. package/dist/infra/register.js.map +1 -0
  311. package/dist/infra/registry.d.ts +64 -0
  312. package/dist/infra/registry.d.ts.map +1 -0
  313. package/dist/infra/registry.js +205 -0
  314. package/dist/infra/registry.js.map +1 -0
  315. package/dist/infra/relevance.d.ts +16 -0
  316. package/dist/infra/relevance.d.ts.map +1 -0
  317. package/dist/infra/relevance.js +132 -0
  318. package/dist/infra/relevance.js.map +1 -0
  319. package/dist/infra/render/render-parse.d.ts +76 -0
  320. package/dist/infra/render/render-parse.d.ts.map +1 -0
  321. package/dist/infra/render/render-parse.js +155 -0
  322. package/dist/infra/render/render-parse.js.map +1 -0
  323. package/dist/infra/render/render.d.ts +11 -0
  324. package/dist/infra/render/render.d.ts.map +1 -0
  325. package/dist/infra/render/render.js +303 -0
  326. package/dist/infra/render/render.js.map +1 -0
  327. package/dist/infra/sst/sst-parse.d.ts +25 -0
  328. package/dist/infra/sst/sst-parse.d.ts.map +1 -0
  329. package/dist/infra/sst/sst-parse.js +45 -0
  330. package/dist/infra/sst/sst-parse.js.map +1 -0
  331. package/dist/infra/sst/sst.d.ts +19 -0
  332. package/dist/infra/sst/sst.d.ts.map +1 -0
  333. package/dist/infra/sst/sst.js +236 -0
  334. package/dist/infra/sst/sst.js.map +1 -0
  335. package/dist/infra/supabase/supabase-parse.d.ts +34 -0
  336. package/dist/infra/supabase/supabase-parse.d.ts.map +1 -0
  337. package/dist/infra/supabase/supabase-parse.js +113 -0
  338. package/dist/infra/supabase/supabase-parse.js.map +1 -0
  339. package/dist/infra/supabase/supabase.d.ts +15 -0
  340. package/dist/infra/supabase/supabase.d.ts.map +1 -0
  341. package/dist/infra/supabase/supabase.js +198 -0
  342. package/dist/infra/supabase/supabase.js.map +1 -0
  343. package/dist/infra/terraform/hcl-parse.d.ts +34 -0
  344. package/dist/infra/terraform/hcl-parse.d.ts.map +1 -0
  345. package/dist/infra/terraform/hcl-parse.js +203 -0
  346. package/dist/infra/terraform/hcl-parse.js.map +1 -0
  347. package/dist/infra/terraform/terraform.d.ts +14 -0
  348. package/dist/infra/terraform/terraform.d.ts.map +1 -0
  349. package/dist/infra/terraform/terraform.js +264 -0
  350. package/dist/infra/terraform/terraform.js.map +1 -0
  351. package/dist/infra/types.d.ts +151 -0
  352. package/dist/infra/types.d.ts.map +1 -0
  353. package/dist/infra/types.js +14 -0
  354. package/dist/infra/types.js.map +1 -0
  355. package/dist/infra/vercel/vercel-parse.d.ts +70 -0
  356. package/dist/infra/vercel/vercel-parse.d.ts.map +1 -0
  357. package/dist/infra/vercel/vercel-parse.js +194 -0
  358. package/dist/infra/vercel/vercel-parse.js.map +1 -0
  359. package/dist/infra/vercel/vercel.d.ts +30 -0
  360. package/dist/infra/vercel/vercel.d.ts.map +1 -0
  361. package/dist/infra/vercel/vercel.js +523 -0
  362. package/dist/infra/vercel/vercel.js.map +1 -0
  363. package/dist/infra/walk.d.ts +36 -0
  364. package/dist/infra/walk.d.ts.map +1 -0
  365. package/dist/infra/walk.js +85 -0
  366. package/dist/infra/walk.js.map +1 -0
  367. package/dist/safety.d.ts +13 -0
  368. package/dist/safety.d.ts.map +1 -0
  369. package/dist/safety.js +67 -0
  370. package/dist/safety.js.map +1 -0
  371. package/dist/types.d.ts +47 -0
  372. package/dist/types.d.ts.map +1 -0
  373. package/dist/types.js +111 -0
  374. package/dist/types.js.map +1 -0
  375. package/dist/version.d.ts +2 -0
  376. package/dist/version.d.ts.map +1 -0
  377. package/dist/version.js +35 -0
  378. package/dist/version.js.map +1 -0
  379. package/package.json +65 -0
@@ -0,0 +1,378 @@
1
+ // (closes "≥ Next + Expo") — the Next.js file-based routing
2
+ // convention parser, the SECOND convention on the shared route-tree model.
3
+ //
4
+ // Next.js encodes its page/navigation graph + API surface in the directory tree,
5
+ // across TWO routers that can co-exist during a migration:
6
+ // * App Router (`app/` | `src/app/`) — only SPECIAL files are routes:
7
+ // page.{tsx,ts,jsx,js} → role `page` (routed UI; navigable)
8
+ // route.{ts,js} → role `endpoint` (Route Handler / API; not nav)
9
+ // layout.* / template.* → role `layout` (structural wrapper)
10
+ // (co-located components/helpers are NOT route nodes — unlike Expo Router,
11
+ // where every file under `app/` is a route)
12
+ // URL rules: route groups `(group)` + parallel slots `@slot` are STRIPPED from
13
+ // the URL; dynamic `[param]` / catch-all `[...slug]` / optional `[[...slug]]`
14
+ // segments are kept (the shared bracket resolver matches them).
15
+ // * Pages Router (`pages/` | `src/pages/`) — EVERY file is a route, except:
16
+ // _document → not a route (the server doc shell)
17
+ // _app → role `layout` at `/` (the global wrapper)
18
+ // pages/api/** → role `endpoint`
19
+ // everything else → role `page` (`index` → segment root)
20
+ //
21
+ // Mirrors expo-router.ts in style + discipline (LOCKED, ):
22
+ // * Nav edges are `calls`, nothing else (the adapter feeds navEdges through
23
+ // contribute-step). Route NESTING is parentFileId METADATA, never an edge.
24
+ // * Deterministic ids — every keyed value derives from the path/file id.
25
+ // * No silent caps — a dynamic/unresolvable nav target is LOGGED + skipped.
26
+ // Never-store-source: reads the route dirs + file contents server-side, returns
27
+ // only the derived tree/edges; the consuming adapter declares `scansSourcePath`.
28
+ import { readdirSync, statSync } from 'node:fs';
29
+ import { join } from 'node:path';
30
+ import { SyntaxKind, } from 'ts-morph';
31
+ import { buildExtractionProject, toId } from '../../graph/ts-morph-adapter.js';
32
+ import { SOURCE_EXTENSIONS, EXCLUDE_DIRS } from '../../graph/file-graph.js';
33
+ import { buildHrefResolver, } from './route-tree.js';
34
+ export const NEXT_CONVENTION = 'next';
35
+ const SOURCE_EXT_SET = new Set(SOURCE_EXTENSIONS);
36
+ const EXCLUDE_SET = new Set(EXCLUDE_DIRS);
37
+ // `router.<m>('…')` methods whose first arg is a navigation target (the
38
+ // `useRouter()` result, conventionally bound to `router`, from next/navigation or
39
+ // next/router). A different binding name isn't recognized — so it isn't a dropped
40
+ // target either (matching the Expo parser's deliberate literal-name discipline).
41
+ const ROUTER_NAV_METHODS = new Set(['push', 'replace', 'prefetch']);
42
+ const ROUTER_RECEIVERS = new Set(['router']);
43
+ // JSX components whose `href` prop is a navigation target.
44
+ const NAV_COMPONENTS = new Set(['Link']);
45
+ // Bare function nav (`redirect('/x')` / `permanentRedirect('/x')` from
46
+ // next/navigation).
47
+ const NAV_FUNCS = new Set(['redirect', 'permanentRedirect']);
48
+ function isDir(p) {
49
+ try {
50
+ return statSync(p).isDirectory();
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ /**
57
+ * Locate the Next route dirs for a repo (or workspace package). Next uses EITHER
58
+ * the repo-root layout (`app` / `pages`) OR the `src/` layout (`src/app` /
59
+ * `src/pages`) — root takes precedence. Both routers can co-exist (a migration).
60
+ */
61
+ export function findNextRouteDirs(repoDir, rootPath = '') {
62
+ const base = rootPath ? join(repoDir, rootPath) : repoDir;
63
+ const firstDir = (cands) => {
64
+ for (const c of cands) {
65
+ const abs = join(base, c);
66
+ if (isDir(abs))
67
+ return abs;
68
+ }
69
+ return null;
70
+ };
71
+ return {
72
+ appDirAbs: firstDir(['app', join('src', 'app')]),
73
+ pagesDirAbs: firstDir(['pages', join('src', 'pages')]),
74
+ };
75
+ }
76
+ /**
77
+ * Recursively collect repo-relative posix file ids of source files under a dir,
78
+ * skipping dot-entries + excluded dirs (mirror expo-router's walk). Sorted.
79
+ */
80
+ export function walkNextSourceFiles(absDir, repoDir) {
81
+ const out = [];
82
+ const stack = [absDir];
83
+ while (stack.length > 0) {
84
+ const dir = stack.pop();
85
+ let entries;
86
+ try {
87
+ entries = readdirSync(dir, { withFileTypes: true });
88
+ }
89
+ catch {
90
+ continue;
91
+ }
92
+ for (const e of entries) {
93
+ if (e.name.startsWith('.'))
94
+ continue;
95
+ const abs = join(dir, e.name);
96
+ if (e.isDirectory()) {
97
+ if (EXCLUDE_SET.has(e.name))
98
+ continue;
99
+ stack.push(abs);
100
+ }
101
+ else if (e.isFile()) {
102
+ const ext = e.name.split('.').pop();
103
+ if (ext && SOURCE_EXT_SET.has(ext))
104
+ out.push(toId(repoDir, abs));
105
+ }
106
+ }
107
+ }
108
+ return out.sort();
109
+ }
110
+ function stripExt(name) {
111
+ return name.replace(/\.[^.]+$/, '');
112
+ }
113
+ // A URL-invisible directory segment: an App Router route group `(group)` or a
114
+ // parallel-route slot `@slot` (both stripped from the path AND from the segment
115
+ // key used for grouping).
116
+ function isInvisibleSeg(seg) {
117
+ return (seg.startsWith('(') && seg.endsWith(')')) || seg.startsWith('@');
118
+ }
119
+ /**
120
+ * Derive role + URL-shaped route path from a route file's path relative to its
121
+ * route-root dir, or `null` when the file is NOT a route node (an App Router
122
+ * co-located component, or `pages/_document`). Pure — no content read.
123
+ */
124
+ export function nextRouteInfo(relToRoot, router) {
125
+ const segments = relToRoot.split('/');
126
+ const fileName = segments.pop() ?? relToRoot;
127
+ const dirSegments = segments;
128
+ const stem = stripExt(fileName);
129
+ if (router === 'app') {
130
+ // App Router: ONLY the special files are route nodes.
131
+ let role;
132
+ if (stem === 'page')
133
+ role = 'page';
134
+ else if (stem === 'route')
135
+ role = 'endpoint';
136
+ else if (stem === 'layout' || stem === 'template')
137
+ role = 'layout';
138
+ else
139
+ return null; // co-located component/helper — not a route node
140
+ const visible = dirSegments.filter((s) => !isInvisibleSeg(s));
141
+ const routePath = visible.length > 0 ? `/${visible.join('/')}` : '/';
142
+ return { routePath, role };
143
+ }
144
+ // Pages Router: every file is a route, with three special cases.
145
+ if (stem === '_document')
146
+ return null; // the server doc shell — not a route
147
+ if (stem === '_app')
148
+ return { routePath: '/', role: 'layout' }; // global wrapper
149
+ const role = dirSegments[0] === 'api' ? 'endpoint' : 'page';
150
+ const urlSegments = stem === 'index' ? [...dirSegments] : [...dirSegments, stem];
151
+ const visible = urlSegments.filter((s) => !isInvisibleSeg(s));
152
+ const routePath = visible.length > 0 ? `/${visible.join('/')}` : '/';
153
+ return { routePath, role };
154
+ }
155
+ /**
156
+ * The top-level route SEGMENT key a file belongs to (for the route-segment
157
+ * grouping prior): the first URL-visible directory segment, or `''` (the root
158
+ * segment) for a file sitting directly in the route root (or only inside
159
+ * groups/slots). Pure — path only.
160
+ */
161
+ export function nextSegmentKey(relToRoot, _router) {
162
+ const segments = relToRoot.split('/');
163
+ segments.pop(); // drop the filename
164
+ const visible = segments.filter((s) => !isInvisibleSeg(s));
165
+ return visible.length > 0 ? visible[0] : '';
166
+ }
167
+ // dir of a repo-relative file id ('app/blog/[slug]/page.tsx' → 'app/blog/[slug]').
168
+ function dirOf(fileId) {
169
+ const i = fileId.lastIndexOf('/');
170
+ return i === -1 ? '' : fileId.slice(0, i);
171
+ }
172
+ // Ancestor dirs from `dir` up to (and including) `rootDir`, nearest first.
173
+ function ancestorDirs(dir, rootDir) {
174
+ const out = [];
175
+ let cur = dir;
176
+ while (cur === rootDir || cur.startsWith(`${rootDir}/`)) {
177
+ out.push(cur);
178
+ if (cur === rootDir)
179
+ break;
180
+ cur = dirOf(cur);
181
+ }
182
+ return out;
183
+ }
184
+ // ---------------------------------------------------------------------------
185
+ // Nav-target extraction (reads source content via ts-morph) — same shape as the
186
+ // Expo parser, retargeted to Next's primitives (next/link <Link>, redirect()).
187
+ function literalTarget(node) {
188
+ if (!node)
189
+ return null;
190
+ if (node.getKind() === SyntaxKind.StringLiteral)
191
+ return node.getLiteralValue();
192
+ if (node.getKind() === SyntaxKind.ObjectLiteralExpression) {
193
+ const pathname = node.getProperty('pathname');
194
+ if (pathname && pathname.getKind() === SyntaxKind.PropertyAssignment) {
195
+ const init = pathname.getInitializer();
196
+ if (init && init.getKind() === SyntaxKind.StringLiteral) {
197
+ return init.getLiteralValue();
198
+ }
199
+ }
200
+ }
201
+ return null;
202
+ }
203
+ // Pull nav targets from one source file: <Link href> + router.push|replace('…') +
204
+ // redirect|permanentRedirect('…').
205
+ function collectNavTargets(sf) {
206
+ const literals = [];
207
+ let dynamic = 0;
208
+ const jsxEls = [
209
+ ...sf.getDescendantsOfKind(SyntaxKind.JsxOpeningElement),
210
+ ...sf.getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement),
211
+ ];
212
+ for (const el of jsxEls) {
213
+ const tag = el.getTagNameNode().getText();
214
+ const local = tag.split('.').pop() ?? tag; // `NextLink.Link`-style → `Link`
215
+ if (!NAV_COMPONENTS.has(local))
216
+ continue;
217
+ const hrefAttr = el.getAttribute('href');
218
+ if (!hrefAttr || hrefAttr.getKind() !== SyntaxKind.JsxAttribute)
219
+ continue;
220
+ const init = hrefAttr.getInitializer();
221
+ if (!init)
222
+ continue;
223
+ let target = null;
224
+ if (init.getKind() === SyntaxKind.StringLiteral) {
225
+ target = init.getLiteralValue();
226
+ }
227
+ else if (init.getKind() === SyntaxKind.JsxExpression) {
228
+ target = literalTarget(init.getExpression());
229
+ }
230
+ if (target !== null)
231
+ literals.push(target);
232
+ else
233
+ dynamic++;
234
+ }
235
+ for (const call of sf.getDescendantsOfKind(SyntaxKind.CallExpression)) {
236
+ const callee = call.getExpression();
237
+ let isNav = false;
238
+ if (callee.getKind() === SyntaxKind.PropertyAccessExpression) {
239
+ const pae = callee;
240
+ const base = pae.getExpression();
241
+ isNav =
242
+ ROUTER_NAV_METHODS.has(pae.getName()) &&
243
+ base.getKind() === SyntaxKind.Identifier &&
244
+ ROUTER_RECEIVERS.has(base.getText());
245
+ }
246
+ else if (callee.getKind() === SyntaxKind.Identifier) {
247
+ isNav = NAV_FUNCS.has(callee.getText());
248
+ }
249
+ if (!isNav)
250
+ continue;
251
+ const arg = call.getArguments()[0];
252
+ if (!arg)
253
+ continue;
254
+ const target = literalTarget(arg);
255
+ if (target !== null)
256
+ literals.push(target);
257
+ else
258
+ dynamic++;
259
+ }
260
+ return { literals, dynamic };
261
+ }
262
+ /**
263
+ * Extract the Next route tree for a repo (or workspace package), spanning BOTH
264
+ * the App Router and Pages Router when present (a migration). Returns `null` when
265
+ * neither route dir exists or holds route files. Fully deterministic (routes
266
+ * sorted by fileId; navEdges deduped + sorted) — snapshot-stable by construction.
267
+ */
268
+ export function extractNextRouteTree(opts) {
269
+ const { repoDir } = opts;
270
+ const rootPath = opts.rootPath ?? '';
271
+ const { appDirAbs, pagesDirAbs } = findNextRouteDirs(repoDir, rootPath);
272
+ const dirs = [];
273
+ if (appDirAbs)
274
+ dirs.push({ abs: appDirAbs, rootId: toId(repoDir, appDirAbs), router: 'app' });
275
+ if (pagesDirAbs)
276
+ dirs.push({ abs: pagesDirAbs, rootId: toId(repoDir, pagesDirAbs), router: 'pages' });
277
+ if (dirs.length === 0)
278
+ return null;
279
+ // --- route nodes (paths + roles) from file paths -------------------------
280
+ const routes = [];
281
+ const rootIdByFile = new Map(); // fileId → its route-root id (nesting scope)
282
+ const layoutByDir = new Map(); // dir → layout fileId (lexical-first)
283
+ const allFiles = []; // every source file under a route dir (for callers)
284
+ for (const spec of dirs) {
285
+ for (const fileId of walkNextSourceFiles(spec.abs, repoDir)) {
286
+ allFiles.push(fileId);
287
+ const relToRoot = fileId.slice(spec.rootId.length + 1);
288
+ const info = nextRouteInfo(relToRoot, spec.router);
289
+ if (!info)
290
+ continue; // co-located component / _document — not a route node
291
+ routes.push({ routePath: info.routePath, fileId, role: info.role });
292
+ rootIdByFile.set(fileId, spec.rootId);
293
+ if (info.role === 'layout') {
294
+ const dir = dirOf(fileId);
295
+ if (!layoutByDir.has(dir))
296
+ layoutByDir.set(dir, fileId);
297
+ }
298
+ }
299
+ }
300
+ if (routes.length === 0)
301
+ return null;
302
+ // --- nesting (parentFileId = nearest enclosing layout, within the same root) -
303
+ for (const node of routes) {
304
+ const rootId = rootIdByFile.get(node.fileId);
305
+ const fileDir = dirOf(node.fileId);
306
+ // A layout's own dir-layout is itself → its parent must be a STRICT ancestor.
307
+ const searchDirs = node.role === 'layout'
308
+ ? ancestorDirs(fileDir, rootId).slice(1)
309
+ : ancestorDirs(fileDir, rootId);
310
+ for (const dir of searchDirs) {
311
+ const layoutId = layoutByDir.get(dir);
312
+ if (layoutId && layoutId !== node.fileId) {
313
+ node.parentFileId = layoutId;
314
+ break;
315
+ }
316
+ }
317
+ }
318
+ routes.sort((a, b) => (a.fileId < b.fileId ? -1 : a.fileId > b.fileId ? 1 : 0));
319
+ // --- nav edges (statically-resolvable targets; reads source content) -----
320
+ const resolve = buildHrefResolver(routes);
321
+ const project = buildExtractionProject(repoDir);
322
+ const sfById = new Map();
323
+ for (const fileId of allFiles) {
324
+ try {
325
+ sfById.set(fileId, project.addSourceFileAtPath(join(repoDir, fileId)));
326
+ }
327
+ catch {
328
+ // Unreadable/unparseable — its nav edges are skipped (no crash).
329
+ }
330
+ }
331
+ const edgeKeys = new Set();
332
+ const navEdges = [];
333
+ let dynamicTargets = 0;
334
+ const unresolvedTargets = new Set();
335
+ for (const fileId of allFiles) {
336
+ const sf = sfById.get(fileId);
337
+ if (!sf)
338
+ continue;
339
+ const { literals, dynamic } = collectNavTargets(sf);
340
+ dynamicTargets += dynamic;
341
+ for (const href of literals) {
342
+ const targetFile = resolve(href);
343
+ if (!targetFile) {
344
+ unresolvedTargets.add(href);
345
+ continue;
346
+ }
347
+ if (targetFile === fileId)
348
+ continue; // self-nav — not a route→route edge
349
+ const key = `${fileId}→${targetFile}`;
350
+ if (edgeKeys.has(key))
351
+ continue;
352
+ edgeKeys.add(key);
353
+ navEdges.push({ fromFileId: fileId, toFileId: targetFile });
354
+ }
355
+ }
356
+ navEdges.sort((a, b) => a.fromFileId < b.fromFileId
357
+ ? -1
358
+ : a.fromFileId > b.fromFileId
359
+ ? 1
360
+ : a.toFileId < b.toFileId
361
+ ? -1
362
+ : a.toFileId > b.toFileId
363
+ ? 1
364
+ : 0);
365
+ // No silent caps: log every dynamic + unresolvable nav target once.
366
+ if (dynamicTargets > 0 || unresolvedTargets.size > 0) {
367
+ const parts = [];
368
+ if (dynamicTargets > 0)
369
+ parts.push(`${dynamicTargets} dynamic target(s)`);
370
+ if (unresolvedTargets.size > 0) {
371
+ parts.push(`${unresolvedTargets.size} unresolvable target(s): ${[...unresolvedTargets].sort().join(', ')}`);
372
+ }
373
+ console.log(` [next-router] skipped ${parts.join(' · ')} (logged, not silently dropped)`);
374
+ }
375
+ const rootDir = dirs[0].rootId; // informational; the first present route root
376
+ return { convention: NEXT_CONVENTION, rootDir, routes, navEdges };
377
+ }
378
+ //# sourceMappingURL=next-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-router.js","sourceRoot":"","sources":["../../../src/framework/routing/next-router.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,2EAA2E;AAC3E,EAAE;AACF,iFAAiF;AACjF,2DAA2D;AAC3D,2EAA2E;AAC3E,2EAA2E;AAC3E,mFAAmF;AACnF,yEAAyE;AACzE,iFAAiF;AACjF,mDAAmD;AACnD,mFAAmF;AACnF,kFAAkF;AAClF,oEAAoE;AACpE,8EAA8E;AAC9E,kEAAkE;AAClE,yEAAyE;AACzE,+CAA+C;AAC/C,qEAAqE;AACrE,EAAE;AACF,2DAA2D;AAC3D,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,8EAA8E;AAC9E,gFAAgF;AAChF,iFAAiF;AAEjF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,UAAU,GAOX,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EACL,iBAAiB,GAKlB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AAKtC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAS,iBAAiB,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,YAAY,CAAC,CAAC;AAElD,wEAAwE;AACxE,kFAAkF;AAClF,kFAAkF;AAClF,iFAAiF;AACjF,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AACpE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7C,2DAA2D;AAC3D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACzC,uEAAuE;AACvE,oBAAoB;AACpB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE7D,SAAS,KAAK,CAAC,CAAS;IACtB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,QAAQ,GAAG,EAAE;IAEb,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1D,MAAM,QAAQ,GAAG,CAAC,KAAe,EAAiB,EAAE;QAClD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAChD,WAAW,EAAE,QAAQ,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;KACvD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,OAAe;IACjE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACzB,IAAI,OAAmC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACpB,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACtC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;iBAAM,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACpC,IAAI,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,0BAA0B;AAC1B,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,MAAkB;IAElB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;IAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEhC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,sDAAsD;QACtD,IAAI,IAAe,CAAC;QACpB,IAAI,IAAI,KAAK,MAAM;YAAE,IAAI,GAAG,MAAM,CAAC;aAC9B,IAAI,IAAI,KAAK,OAAO;YAAE,IAAI,GAAG,UAAU,CAAC;aACxC,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,UAAU;YAAE,IAAI,GAAG,QAAQ,CAAC;;YAC9D,OAAO,IAAI,CAAC,CAAC,iDAAiD;QACnE,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACrE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,iEAAiE;IACjE,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC,CAAC,qCAAqC;IAC5E,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,iBAAiB;IACjF,MAAM,IAAI,GAAc,WAAW,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IACvE,MAAM,WAAW,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IACrE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAmB;IACnE,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,oBAAoB;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,mFAAmF;AACnF,SAAS,KAAK,CAAC,MAAc;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,2EAA2E;AAC3E,SAAS,YAAY,CAAC,GAAW,EAAE,OAAe;IAChD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,OAAO,GAAG,KAAK,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,IAAI,GAAG,KAAK,OAAO;YAAE,MAAM;QAC3B,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAE/E,SAAS,aAAa,CAAC,IAAyC;IAC9D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,aAAa;QAAE,OAAQ,IAAsB,CAAC,eAAe,EAAE,CAAC;IAClG,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,uBAAuB,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAI,IAAgC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAC3E,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,kBAAkB,EAAE,CAAC;YACrE,MAAM,IAAI,GAAI,QAA+B,CAAC,cAAc,EAAE,CAAC;YAC/D,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;gBACxD,OAAQ,IAAsB,CAAC,eAAe,EAAE,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAOD,kFAAkF;AAClF,mCAAmC;AACnC,SAAS,iBAAiB,CAAC,EAAc;IACvC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG;QACb,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC,iBAAiB,CAAC;QACxD,GAAG,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC,qBAAqB,CAAC;KAC7D,CAAC;IACF,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,iCAAiC;QAC5E,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACzC,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,YAAY;YAAE,SAAS;QAC1E,MAAM,IAAI,GAAI,QAAyB,CAAC,cAAc,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;YAChD,MAAM,GAAI,IAAsB,CAAC,eAAe,EAAE,CAAC;QACrD,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,aAAa,EAAE,CAAC;YACvD,MAAM,GAAG,aAAa,CAAE,IAAsB,CAAC,aAAa,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,MAAM,KAAK,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;YACtC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,wBAAwB,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,MAAkC,CAAC;YAC/C,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;YACjC,KAAK;gBACH,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;oBACrC,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU;oBACxC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;YACtD,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;YACtC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAGpC;IACC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAExE,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,IAAI,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACtG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,4EAA4E;IAC5E,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,6CAA6C;IAC7F,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,sCAAsC;IACrF,MAAM,QAAQ,GAAa,EAAE,CAAC,CAAC,oDAAoD;IAEnF,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,KAAK,MAAM,MAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI;gBAAE,SAAS,CAAC,sDAAsD;YAC3E,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC1B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,gFAAgF;IAChF,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,8EAA8E;QAC9E,MAAM,UAAU,GACd,IAAI,CAAC,IAAI,KAAK,QAAQ;YACpB,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,QAAQ,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;gBAC7B,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhF,4EAA4E;IAC5E,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC7C,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACpD,cAAc,IAAI,OAAO,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC5B,SAAS;YACX,CAAC;YACD,IAAI,UAAU,KAAK,MAAM;gBAAE,SAAS,CAAC,oCAAoC;YACzE,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;YACtC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACrB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;QACzB,CAAC,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;YAC3B,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ;gBACvB,CAAC,CAAC,CAAC,CAAC;gBACJ,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ;oBACvB,CAAC,CAAC,CAAC;oBACH,CAAC,CAAC,CAAC,CACZ,CAAC;IAEF,oEAAoE;IACpE,IAAI,cAAc,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,cAAc,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,oBAAoB,CAAC,CAAC;QAC1E,IAAI,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,IAAI,4BAA4B,CAAC,GAAG,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,8CAA8C;IAC9E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * The role a route file plays. METADATA, not a Module-kind — the locked
3
+ * discipline ("fix the classifier, never weaken the Module-kind enum") holds:
4
+ * an adapter maps these onto an existing ModuleKind (a screen/page → `frontend`,
5
+ * an endpoint → `gateway`/`service`). The finer role is carried for the label.
6
+ *
7
+ * - `page` — a screen/file that renders UI for a concrete URL.
8
+ * - `route` — a routable node we recognize but can't confirm as page vs
9
+ * endpoint (the generic fallback; conventions that always know
10
+ * the answer, like Expo Router, don't emit it).
11
+ * - `layout` — wraps child routes (Expo `_layout`, Next `layout`, SvelteKit
12
+ * `+layout`). Its nesting is the parent pointer, never an edge.
13
+ * - `endpoint` — a server/API handler with no UI (Expo `+api`, Next `route.ts`,
14
+ * SvelteKit `+server`).
15
+ */
16
+ export type RouteRole = 'route' | 'page' | 'layout' | 'endpoint';
17
+ export declare const ROUTE_ROLES: readonly RouteRole[];
18
+ /**
19
+ * One route file. `fileId` is the repo-relative posix path — the same file-id
20
+ * space the NormalizedGraph + contribute-step's `fileModuleMap` key on (so a
21
+ * consuming adapter resolves it to a module for free). `routePath` is the
22
+ * URL-shaped label (dynamic segments kept as `[id]`/`[...rest]`, route groups
23
+ * stripped). `parentFileId` is the nearest enclosing layout — the STRUCTURAL
24
+ * nesting pointer (NOT an edge); absent on the root layout / un-nested routes.
25
+ */
26
+ export interface RouteNode {
27
+ routePath: string;
28
+ fileId: string;
29
+ role: RouteRole;
30
+ parentFileId?: string;
31
+ }
32
+ /**
33
+ * A statically-resolvable navigation between two route files (a `<Link href>`,
34
+ * `router.push('…')`, `<Redirect href>`, `redirect('…')` whose target resolves
35
+ * to a route file). `from`/`to` are repo-relative posix file ids. Every navEdge
36
+ * becomes a `calls` edge when an adapter feeds it through contribute-step.
37
+ */
38
+ export interface RouteNavEdge {
39
+ fromFileId: string;
40
+ toFileId: string;
41
+ }
42
+ /**
43
+ * A repo's (or workspace package's) file-based route tree for one convention.
44
+ */
45
+ export interface RouteTree {
46
+ /** The convention that produced this tree (e.g. 'expo-router'). */
47
+ convention: string;
48
+ /** The repo-relative posix dir the routes were read from (e.g. 'app'). */
49
+ rootDir: string;
50
+ /** Route nodes, sorted by fileId (deterministic). */
51
+ routes: RouteNode[];
52
+ /** Resolvable nav edges, deduped + sorted by (from, to) (deterministic). */
53
+ navEdges: RouteNavEdge[];
54
+ }
55
+ /**
56
+ * Normalize an href to an absolute, query/hash-free, single-slash path — or
57
+ * `null` when it isn't statically resolvable as an absolute URL.
58
+ *
59
+ * RELATIVE hrefs (`./x`, `../x`, bare `x`) return `null` (resolved against the
60
+ * current route — a Slice-2 refinement; logged + skipped for now, never guessed).
61
+ */
62
+ export declare function normalizeHref(raw: string): string | null;
63
+ /**
64
+ * Build a deterministic href→fileId resolver over a route tree's navigable
65
+ * nodes (roles `page` / `route` — layouts + endpoints are never `<Link>`
66
+ * targets). Resolution order: exact route-path match first (covers literal
67
+ * `/profile/[id]` and static `/home`), then the most-specific dynamic-pattern
68
+ * match (covers a concrete `/profile/42` → `/profile/[id]`). Unresolvable ⇒
69
+ * `null`. Specificity tiebreak: fewest dynamic segments, then non-catch-all,
70
+ * then lexical fileId — so the choice never depends on input order.
71
+ */
72
+ export declare function buildHrefResolver(routes: RouteNode[]): (href: string) => string | null;
73
+ //# sourceMappingURL=route-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-tree.d.ts","sourceRoot":"","sources":["../../../src/framework/routing/route-tree.ts"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEjE,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAAqD,CAAC;AAElG;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,4EAA4E;IAC5E,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAgBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQxD;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAkCtF"}
@@ -0,0 +1,120 @@
1
+ // (Slice 1) — the CONVENTION-AGNOSTIC route-tree model.
2
+ //
3
+ // File-system routing frameworks (Expo Router, Next app/pages, Remix, Nuxt,
4
+ // SvelteKit, TanStack) encode the page/navigation graph IN THE DIRECTORY TREE —
5
+ // completely invisible to an import/call graph. This module is the shared shape
6
+ // every per-convention parser targets: a flat list of route nodes (each with a
7
+ // route-path label, a role, and a STRUCTURAL parent pointer) plus the
8
+ // statically-resolvable navigation edges between them.
9
+ //
10
+ // LOCKED design calls (orchestrator-decided 2026-06-26 — see the brief):
11
+ // * Navigation edges are `calls`, nothing else. A `navEdge` becomes a `calls`
12
+ // FrameworkEdge when an adapter feeds it through contribute-step (this module
13
+ // never emits FrameworkEdges itself — it stays decoupled from the framework
14
+ // contract so Next/Remix/… reuse it unchanged).
15
+ // * Route NESTING is NOT an edge. A layout wrapping a page has no taxonomy verb;
16
+ // nesting is carried as STRUCTURAL METADATA (routePath + parentFileId), never
17
+ // a graph edge — and there is NO "nesting"/"contains" verb anywhere.
18
+ // * Deterministic ids: every keyed value derives from the route path / file id,
19
+ // never an index — snapshots stay stable across re-ingest.
20
+ // * No silent caps: a dynamic/unresolvable nav target is LOGGED + skipped by the
21
+ // caller, never silently dropped.
22
+ //
23
+ // This module is PURE-ish: types + a reusable href→fileId resolver (the bracket
24
+ // `[param]` / `[...rest]` dynamic-segment syntax shared by Expo Router AND Next).
25
+ // It reads nothing and persists nothing.
26
+ export const ROUTE_ROLES = ['route', 'page', 'layout', 'endpoint'];
27
+ // ---------------------------------------------------------------------------
28
+ // Shared href resolution (bracket dynamic-segment syntax: `[param]` / `[...rest]`).
29
+ // Reused by Expo Router (this slice) and the Next.js adapter.
30
+ function isDynamicSeg(seg) {
31
+ return seg.startsWith('[') && seg.endsWith(']');
32
+ }
33
+ function isCatchAllSeg(seg) {
34
+ // `[...rest]` (Expo) and `[[...rest]]` (Next optional catch-all) both carry the
35
+ // `...` marker inside the brackets.
36
+ return isDynamicSeg(seg) && seg.includes('...');
37
+ }
38
+ /**
39
+ * Normalize an href to an absolute, query/hash-free, single-slash path — or
40
+ * `null` when it isn't statically resolvable as an absolute URL.
41
+ *
42
+ * RELATIVE hrefs (`./x`, `../x`, bare `x`) return `null` (resolved against the
43
+ * current route — a Slice-2 refinement; logged + skipped for now, never guessed).
44
+ */
45
+ export function normalizeHref(raw) {
46
+ let h = raw.trim();
47
+ h = h.split('?')[0].split('#')[0];
48
+ if (h === '')
49
+ return null;
50
+ if (!h.startsWith('/'))
51
+ return null; // relative / bare — deferred (logged + skipped)
52
+ h = h.replace(/\/{2,}/g, '/');
53
+ if (h.length > 1)
54
+ h = h.replace(/\/+$/, '');
55
+ return h === '' ? '/' : h;
56
+ }
57
+ function splitPath(routePath) {
58
+ return routePath === '/' ? [] : routePath.replace(/^\//, '').split('/');
59
+ }
60
+ // Does a dynamic-segment pattern match a concrete href's segments? A catch-all
61
+ // (always last by convention) absorbs ≥1 trailing segment; a `[param]` matches
62
+ // exactly one; a literal must equal.
63
+ function segMatch(pattern, href) {
64
+ for (let i = 0; i < pattern.length; i++) {
65
+ const p = pattern[i];
66
+ if (isCatchAllSeg(p))
67
+ return href.length - i >= 1;
68
+ if (i >= href.length)
69
+ return false;
70
+ if (isDynamicSeg(p))
71
+ continue;
72
+ if (p !== href[i])
73
+ return false;
74
+ }
75
+ return href.length === pattern.length;
76
+ }
77
+ /**
78
+ * Build a deterministic href→fileId resolver over a route tree's navigable
79
+ * nodes (roles `page` / `route` — layouts + endpoints are never `<Link>`
80
+ * targets). Resolution order: exact route-path match first (covers literal
81
+ * `/profile/[id]` and static `/home`), then the most-specific dynamic-pattern
82
+ * match (covers a concrete `/profile/42` → `/profile/[id]`). Unresolvable ⇒
83
+ * `null`. Specificity tiebreak: fewest dynamic segments, then non-catch-all,
84
+ * then lexical fileId — so the choice never depends on input order.
85
+ */
86
+ export function buildHrefResolver(routes) {
87
+ const navigable = routes
88
+ .filter((r) => r.role === 'page' || r.role === 'route')
89
+ .sort((a, b) => (a.fileId < b.fileId ? -1 : a.fileId > b.fileId ? 1 : 0));
90
+ const exact = new Map();
91
+ const patterns = [];
92
+ for (const r of navigable) {
93
+ if (!exact.has(r.routePath))
94
+ exact.set(r.routePath, r.fileId);
95
+ const segs = splitPath(r.routePath);
96
+ patterns.push({
97
+ segs,
98
+ fileId: r.fileId,
99
+ dyn: segs.filter(isDynamicSeg).length,
100
+ catchAll: segs.some(isCatchAllSeg),
101
+ });
102
+ }
103
+ return (href) => {
104
+ const norm = normalizeHref(href);
105
+ if (norm === null)
106
+ return null;
107
+ const hit = exact.get(norm);
108
+ if (hit)
109
+ return hit;
110
+ const hrefSegs = splitPath(norm);
111
+ const candidates = patterns.filter((p) => segMatch(p.segs, hrefSegs));
112
+ if (candidates.length === 0)
113
+ return null;
114
+ candidates.sort((a, b) => a.dyn - b.dyn ||
115
+ Number(a.catchAll) - Number(b.catchAll) ||
116
+ (a.fileId < b.fileId ? -1 : a.fileId > b.fileId ? 1 : 0));
117
+ return candidates[0].fileId;
118
+ };
119
+ }
120
+ //# sourceMappingURL=route-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-tree.js","sourceRoot":"","sources":["../../../src/framework/routing/route-tree.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,sEAAsE;AACtE,uDAAuD;AACvD,EAAE;AACF,0EAA0E;AAC1E,gFAAgF;AAChF,kFAAkF;AAClF,gFAAgF;AAChF,oDAAoD;AACpD,mFAAmF;AACnF,kFAAkF;AAClF,yEAAyE;AACzE,kFAAkF;AAClF,+DAA+D;AAC/D,mFAAmF;AACnF,sCAAsC;AACtC,EAAE;AACF,gFAAgF;AAChF,kFAAkF;AAClF,yCAAyC;AAmBzC,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;AA0ClG,8EAA8E;AAC9E,oFAAoF;AACpF,8DAA8D;AAE9D,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,gFAAgF;IAChF,oCAAoC;IACpC,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,gDAAgD;IACrF,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC9B,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,SAAS,CAAC,SAAiB;IAClC,OAAO,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,qCAAqC;AACrC,SAAS,QAAQ,CAAC,OAAiB,EAAE,IAAc;IACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,aAAa,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACnC,IAAI,YAAY,CAAC,CAAC,CAAC;YAAE,SAAS;QAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;AACxC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,SAAS,GAAG,MAAM;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;SACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,QAAQ,GAAyE,EAAE,CAAC;IAC1F,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM;YACrC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,IAAY,EAAiB,EAAE;QACrC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG;YACb,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;YACvC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3D,CAAC;QACF,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9B,CAAC,CAAC;AACJ,CAAC"}