@cplieger/deadset-ts 8.0.0-dev.2 → 8.0.0-dev.21

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 (431) hide show
  1. package/README.md +3 -1
  2. package/THIRD_PARTY_NOTICES.md +27 -0
  3. package/dist/bin/mapper-connection.js +2 -1
  4. package/dist/bin/node-host.js +24 -5
  5. package/dist/src/alias-chain.js +35 -9
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +274 -496
  8. package/dist/src/augmentations.js +64 -3
  9. package/dist/src/automatic-types.js +10 -29
  10. package/dist/src/bindings.js +382 -0
  11. package/dist/src/commands/held.js +499 -0
  12. package/dist/src/commands/read.js +161 -0
  13. package/dist/src/commands/shell.js +169 -0
  14. package/dist/src/commands/tools.js +1847 -0
  15. package/dist/src/component-files.js +3 -2
  16. package/dist/src/component-layer.js +4 -2
  17. package/dist/src/config.js +6 -82
  18. package/dist/src/conformance-record.js +2 -2
  19. package/dist/src/consumers.js +10 -38
  20. package/dist/src/contextual-uses.js +57 -26
  21. package/dist/src/contract/config.generated.js +561 -0
  22. package/dist/src/contract/contract.generated.js +1370 -0
  23. package/dist/src/contract/report.generated.js +866 -0
  24. package/dist/src/dependencies.js +165 -122
  25. package/dist/src/destructuring.js +1 -19
  26. package/dist/src/edges.js +38 -122
  27. package/dist/src/element-access.js +181 -168
  28. package/dist/src/entries/build-scripts.js +222 -0
  29. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  30. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  31. package/dist/src/entries/conventions.js +740 -0
  32. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  33. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  34. package/dist/src/entries/run-directories.js +77 -0
  35. package/dist/src/entries/sources.js +144 -0
  36. package/dist/src/entries/static-module.js +670 -0
  37. package/dist/src/entries/test-runners.js +650 -0
  38. package/dist/src/entries/workflow-steps.js +345 -0
  39. package/dist/src/exemptions/argument-places.js +131 -0
  40. package/dist/src/exemptions/calls.js +338 -0
  41. package/dist/src/exemptions/classes.js +13 -0
  42. package/dist/src/{decorator.js → exemptions/decorator.js} +19 -30
  43. package/dist/src/exemptions/detectors.js +48 -0
  44. package/dist/src/{enum-group.js → exemptions/enum-group.js} +9 -16
  45. package/dist/src/{erased-stores.js → exemptions/erased-stores.js} +7 -11
  46. package/dist/src/{framework-lifecycle.js → exemptions/framework-lifecycle.js} +76 -54
  47. package/dist/src/exemptions/generated-file.js +241 -0
  48. package/dist/src/{injection-container.js → exemptions/injection-container.js} +20 -26
  49. package/dist/src/exemptions/installed-globals.js +173 -0
  50. package/dist/src/{interface-satisfaction.js → exemptions/interface-satisfaction.js} +52 -121
  51. package/dist/src/exemptions/lifecycle.js +150 -0
  52. package/dist/src/{reflective-lookup.js → exemptions/reflective-lookup.js} +3 -3
  53. package/dist/src/exemptions/serialization-contract.js +1276 -0
  54. package/dist/src/exemptions/sites.js +182 -0
  55. package/dist/src/{template-field.js → exemptions/template-field.js} +13 -23
  56. package/dist/src/{value-reach.js → exemptions/value-reach.js} +14 -7
  57. package/dist/src/exposure.js +400 -0
  58. package/dist/src/extensions.js +37 -0
  59. package/dist/src/facts.js +38 -0
  60. package/dist/src/failure.js +36 -0
  61. package/dist/src/file-facts.js +3 -26
  62. package/dist/src/findings/completion.js +109 -56
  63. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  64. package/dist/src/findings/emitters.js +27 -41
  65. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  66. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  67. package/dist/src/findings/interfaces.js +4 -5
  68. package/dist/src/findings/intra-function.js +16 -13
  69. package/dist/src/findings/non-code-artifacts.js +17 -12
  70. package/dist/src/findings/reads-and-writes.js +86 -27
  71. package/dist/src/findings/self-check.js +44 -30
  72. package/dist/src/findings/unused-declarations.js +29 -45
  73. package/dist/src/findings/visibility-narrowing.js +23 -31
  74. package/dist/src/findings-pass.js +13 -21
  75. package/dist/src/fs/document.js +52 -0
  76. package/dist/src/fs/manifest.js +67 -0
  77. package/dist/src/fs/tree.js +88 -0
  78. package/dist/src/git-ignore.js +39 -26
  79. package/dist/src/import-bindings.js +73 -28
  80. package/dist/src/index/sites.js +557 -0
  81. package/dist/src/index/values.js +124 -0
  82. package/dist/src/index.js +2 -2
  83. package/dist/src/indexed-access.js +523 -478
  84. package/dist/src/intra-function-parts.js +63 -43
  85. package/dist/src/inventory/commonjs.js +507 -0
  86. package/dist/src/inventory/enumerate.js +167 -0
  87. package/dist/src/inventory/syntax.js +236 -0
  88. package/dist/src/inventory.js +323 -724
  89. package/dist/src/javascript-file.js +48 -0
  90. package/dist/src/json-document.js +198 -67
  91. package/dist/src/keyof-comparisons.js +126 -107
  92. package/dist/src/kinds.js +3 -366
  93. package/dist/src/{components.js → liveness/components.js} +2 -3
  94. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  95. package/dist/src/liveness/matrix.js +99 -0
  96. package/dist/src/liveness/sweep.js +558 -0
  97. package/dist/src/load/classify.js +289 -0
  98. package/dist/src/load/diagnostics.js +87 -0
  99. package/dist/src/load/discover.js +285 -0
  100. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  101. package/dist/src/load/expected-module.js +136 -0
  102. package/dist/src/load/load.js +27 -0
  103. package/dist/src/load/module-lookup.js +37 -0
  104. package/dist/src/load/package-scope.js +56 -0
  105. package/dist/src/load/plan.js +313 -0
  106. package/dist/src/load/specifiers.js +113 -0
  107. package/dist/src/load/synthesize.js +152 -0
  108. package/dist/src/load/test-globals.js +207 -0
  109. package/dist/src/load/test-joins.js +82 -0
  110. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  111. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  112. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  113. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  114. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  115. package/dist/src/module-declarations.js +70 -85
  116. package/dist/src/overrides.js +134 -112
  117. package/dist/src/partial.js +2 -1
  118. package/dist/src/paths.js +82 -16
  119. package/dist/src/platform-calls.js +78 -0
  120. package/dist/src/platform-symbols.js +134 -0
  121. package/dist/src/position.js +43 -1
  122. package/dist/src/print.js +11 -79
  123. package/dist/src/product.js +13 -0
  124. package/dist/src/query.js +95 -0
  125. package/dist/src/ref.js +12 -20
  126. package/dist/src/references/read-rule.js +1 -0
  127. package/dist/src/references/read-rules.js +48 -0
  128. package/dist/src/references/sink.js +237 -0
  129. package/dist/src/references/sources.js +450 -0
  130. package/dist/src/references.js +117 -1074
  131. package/dist/src/report-schema.js +51 -0
  132. package/dist/src/report.js +57 -41
  133. package/dist/src/reporters/annotations.js +15 -8
  134. package/dist/src/reporters/sarif.js +16 -10
  135. package/dist/src/reporters/template.js +4 -19
  136. package/dist/src/resolve.js +246 -730
  137. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  138. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  139. package/dist/src/roots/manifest.js +216 -0
  140. package/dist/src/roots/published-reach.js +412 -0
  141. package/dist/src/roots/root-set.js +487 -0
  142. package/dist/src/roots/unseen-loads.js +236 -0
  143. package/dist/src/run.js +66 -77
  144. package/dist/src/schema.js +320 -343
  145. package/dist/src/scope.js +38 -115
  146. package/dist/src/session.js +37 -29
  147. package/dist/src/source-files.js +6 -10
  148. package/dist/src/stores.js +4 -2
  149. package/dist/src/suppress-file.js +25 -28
  150. package/dist/src/suppress-inline.js +36 -83
  151. package/dist/src/suppress.js +50 -71
  152. package/dist/src/symbol-keys.js +92 -88
  153. package/dist/src/tests/file-class.js +76 -0
  154. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  155. package/dist/src/{test-support.js → tests/support.js} +5 -12
  156. package/dist/src/text/compare.js +26 -0
  157. package/dist/src/text/glob.js +194 -0
  158. package/dist/src/text/named-files.js +298 -0
  159. package/dist/src/text/yaml.js +684 -0
  160. package/dist/src/type-errors.js +11 -232
  161. package/dist/src/type-parameter-reads.js +178 -139
  162. package/dist/src/unimplemented-callees.js +262 -242
  163. package/dist/src/unwrap.js +23 -0
  164. package/dist/src/usage.js +10 -0
  165. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  166. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  167. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  168. package/dist/src/vendor/unbash/assignment.js +131 -0
  169. package/dist/src/vendor/unbash/chars.js +48 -0
  170. package/dist/src/vendor/unbash/command.js +41 -0
  171. package/dist/src/vendor/unbash/expansion.js +80 -0
  172. package/dist/src/vendor/unbash/glob.js +268 -0
  173. package/dist/src/vendor/unbash/heredoc.js +27 -0
  174. package/dist/src/vendor/unbash/internal-types.js +1 -0
  175. package/dist/src/vendor/unbash/lexer.js +4274 -0
  176. package/dist/src/vendor/unbash/limits.js +3 -0
  177. package/dist/src/vendor/unbash/parser.js +1366 -0
  178. package/dist/src/vendor/unbash/parts.js +57 -0
  179. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  180. package/dist/src/vendor/unbash/traversal.js +212 -0
  181. package/dist/src/vendor/unbash/types.js +1 -0
  182. package/dist/src/vendor/unbash/word-value.js +61 -0
  183. package/dist/src/vendor/unbash/word.js +40 -0
  184. package/dist/src/verbs/analyze.js +194 -127
  185. package/dist/src/verbs/describe.js +13 -18
  186. package/dist/src/verbs/explain.js +85 -139
  187. package/dist/src/verbs/print-config.js +2 -1
  188. package/dist/src/verbs/print-projects.js +6 -4
  189. package/dist/src/verbs/print-retained.js +30 -6
  190. package/dist/src/verbs/print-roots.js +4 -2
  191. package/dist/src/verbs/verb.js +1 -5
  192. package/dist/src/verbs/version.js +14 -3
  193. package/jsr.json +2 -1
  194. package/package.json +14 -8
  195. package/src/alias-chain.ts +40 -11
  196. package/src/amd.ts +130 -0
  197. package/src/analysis.ts +426 -733
  198. package/src/augmentations.ts +93 -4
  199. package/src/automatic-types.ts +12 -30
  200. package/src/bindings.ts +460 -0
  201. package/src/commands/held.ts +632 -0
  202. package/src/commands/read.ts +242 -0
  203. package/src/commands/shell.ts +228 -0
  204. package/src/commands/tools.ts +2382 -0
  205. package/src/component-files.ts +4 -2
  206. package/src/component-layer.ts +4 -2
  207. package/src/config.ts +31 -302
  208. package/src/conformance-record.ts +2 -2
  209. package/src/consumers.ts +16 -66
  210. package/src/contextual-uses.ts +66 -34
  211. package/src/contract/config.generated.ts +821 -0
  212. package/src/contract/contract.generated.ts +1453 -0
  213. package/src/contract/report.generated.ts +1241 -0
  214. package/src/dependencies.ts +223 -128
  215. package/src/destructuring.ts +1 -31
  216. package/src/edges.ts +41 -140
  217. package/src/element-access.ts +190 -187
  218. package/src/entries/build-scripts.ts +292 -0
  219. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  220. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  221. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  222. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  223. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  224. package/src/entries/run-directories.ts +108 -0
  225. package/src/entries/sources.ts +266 -0
  226. package/src/entries/static-module.ts +858 -0
  227. package/src/entries/test-runners.ts +835 -0
  228. package/src/entries/workflow-steps.ts +432 -0
  229. package/src/exemptions/argument-places.ts +198 -0
  230. package/src/exemptions/calls.ts +483 -0
  231. package/src/exemptions/classes.ts +49 -0
  232. package/src/exemptions/decorator.ts +56 -0
  233. package/src/exemptions/detectors.ts +75 -0
  234. package/src/{enum-group.ts → exemptions/enum-group.ts} +10 -19
  235. package/src/{erased-stores.ts → exemptions/erased-stores.ts} +7 -14
  236. package/src/{framework-lifecycle.ts → exemptions/framework-lifecycle.ts} +85 -66
  237. package/src/exemptions/generated-file.ts +318 -0
  238. package/src/{injection-container.ts → exemptions/injection-container.ts} +29 -34
  239. package/src/exemptions/installed-globals.ts +255 -0
  240. package/src/{interface-satisfaction.ts → exemptions/interface-satisfaction.ts} +69 -160
  241. package/src/exemptions/lifecycle.ts +286 -0
  242. package/src/{reflective-lookup.ts → exemptions/reflective-lookup.ts} +5 -5
  243. package/src/exemptions/serialization-contract.ts +1729 -0
  244. package/src/exemptions/sites.ts +293 -0
  245. package/src/{template-field.ts → exemptions/template-field.ts} +22 -32
  246. package/src/{value-reach.ts → exemptions/value-reach.ts} +16 -8
  247. package/src/exposure.ts +492 -0
  248. package/src/extensions.ts +45 -0
  249. package/src/facts.ts +46 -0
  250. package/src/failure.ts +63 -0
  251. package/src/file-facts.ts +15 -25
  252. package/src/finding.ts +10 -10
  253. package/src/findings/boundary.ts +11 -0
  254. package/src/findings/completion.ts +133 -64
  255. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  256. package/src/findings/emitter.ts +9 -10
  257. package/src/findings/emitters.ts +38 -52
  258. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  259. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  260. package/src/findings/interfaces.ts +7 -9
  261. package/src/findings/intra-function.ts +16 -14
  262. package/src/findings/non-code-artifacts.ts +24 -15
  263. package/src/findings/reads-and-writes.ts +118 -41
  264. package/src/findings/self-check.ts +51 -38
  265. package/src/findings/unused-declarations.ts +31 -49
  266. package/src/findings/visibility-narrowing.ts +36 -40
  267. package/src/findings-pass.ts +15 -31
  268. package/src/fs/document.ts +70 -0
  269. package/src/fs/manifest.ts +96 -0
  270. package/src/fs/tree.ts +110 -0
  271. package/src/git-ignore.ts +50 -26
  272. package/src/host.ts +12 -5
  273. package/src/import-bindings.ts +98 -29
  274. package/src/index/sites.ts +781 -0
  275. package/src/index/values.ts +170 -0
  276. package/src/index.ts +2 -2
  277. package/src/indexed-access.ts +570 -527
  278. package/src/intra-function-parts.ts +73 -44
  279. package/src/inventory/commonjs.ts +696 -0
  280. package/src/inventory/enumerate.ts +203 -0
  281. package/src/inventory/syntax.ts +311 -0
  282. package/src/inventory.ts +442 -895
  283. package/src/javascript-file.ts +54 -0
  284. package/src/json-document.ts +241 -76
  285. package/src/keyof-comparisons.ts +133 -122
  286. package/src/kinds.ts +5 -413
  287. package/src/{components.ts → liveness/components.ts} +4 -6
  288. package/src/{graph.ts → liveness/graph.ts} +100 -35
  289. package/src/liveness/matrix.ts +162 -0
  290. package/src/liveness/sweep.ts +855 -0
  291. package/src/load/classify.ts +433 -0
  292. package/src/load/diagnostics.ts +154 -0
  293. package/src/load/discover.ts +471 -0
  294. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  295. package/src/load/expected-module.ts +194 -0
  296. package/src/load/load.ts +73 -0
  297. package/src/load/module-lookup.ts +50 -0
  298. package/src/load/package-scope.ts +74 -0
  299. package/src/load/plan.ts +513 -0
  300. package/src/load/specifiers.ts +171 -0
  301. package/src/load/synthesize.ts +230 -0
  302. package/src/load/test-globals.ts +251 -0
  303. package/src/load/test-joins.ts +98 -0
  304. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  305. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  306. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  307. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  308. package/src/{workspace.ts → load/workspace.ts} +90 -134
  309. package/src/module-declarations.ts +74 -98
  310. package/src/overrides.ts +162 -134
  311. package/src/partial.ts +3 -2
  312. package/src/paths.ts +92 -16
  313. package/src/platform-calls.ts +119 -0
  314. package/src/platform-symbols.ts +189 -0
  315. package/src/position.ts +44 -1
  316. package/src/print.ts +12 -92
  317. package/src/product.ts +18 -0
  318. package/src/query.ts +201 -10
  319. package/src/ref.ts +12 -20
  320. package/src/references/read-rule.ts +60 -0
  321. package/src/references/read-rules.ts +55 -0
  322. package/src/references/sink.ts +314 -0
  323. package/src/references/sources.ts +632 -0
  324. package/src/references.ts +187 -1450
  325. package/src/report-schema.ts +68 -0
  326. package/src/report.ts +103 -226
  327. package/src/reporters/annotations.ts +22 -11
  328. package/src/reporters/json.ts +1 -1
  329. package/src/reporters/reporter.ts +2 -4
  330. package/src/reporters/reporters.ts +1 -1
  331. package/src/reporters/sarif.ts +29 -16
  332. package/src/reporters/template.ts +4 -20
  333. package/src/reporters/text.ts +3 -3
  334. package/src/resolve.ts +284 -1115
  335. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +26 -29
  336. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  337. package/src/roots/manifest.ts +303 -0
  338. package/src/roots/published-reach.ts +486 -0
  339. package/src/{roots.ts → roots/root-set.ts} +286 -469
  340. package/src/roots/unseen-loads.ts +345 -0
  341. package/src/run.ts +75 -91
  342. package/src/schema.ts +391 -388
  343. package/src/scope.ts +46 -138
  344. package/src/session.ts +87 -55
  345. package/src/source-files.ts +6 -11
  346. package/src/stores.ts +15 -3
  347. package/src/suppress-file.ts +24 -33
  348. package/src/suppress-inline.ts +55 -91
  349. package/src/suppress.ts +78 -79
  350. package/src/symbol-keys.ts +104 -107
  351. package/src/tests/file-class.ts +135 -0
  352. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  353. package/src/{test-support.ts → tests/support.ts} +15 -21
  354. package/src/text/compare.ts +27 -0
  355. package/src/text/glob.ts +210 -0
  356. package/src/text/named-files.ts +388 -0
  357. package/src/text/yaml.ts +747 -0
  358. package/src/type-errors.ts +18 -288
  359. package/src/type-parameter-reads.ts +187 -158
  360. package/src/unimplemented-callees.ts +297 -280
  361. package/src/unwrap.ts +34 -0
  362. package/src/usage.ts +10 -0
  363. package/src/vendor/unbash/LICENSE +15 -0
  364. package/src/vendor/unbash/VENDORED.md +16 -0
  365. package/src/vendor/unbash/ansi-c.ts +132 -0
  366. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  367. package/src/vendor/unbash/arithmetic.ts +641 -0
  368. package/src/vendor/unbash/assignment.ts +163 -0
  369. package/src/vendor/unbash/chars.ts +48 -0
  370. package/src/vendor/unbash/command.ts +47 -0
  371. package/src/vendor/unbash/expansion.ts +144 -0
  372. package/src/vendor/unbash/glob.ts +284 -0
  373. package/src/vendor/unbash/heredoc.ts +34 -0
  374. package/src/vendor/unbash/internal-types.ts +94 -0
  375. package/src/vendor/unbash/lexer.ts +4352 -0
  376. package/src/vendor/unbash/limits.ts +3 -0
  377. package/src/vendor/unbash/parser.ts +1612 -0
  378. package/src/vendor/unbash/parts.ts +96 -0
  379. package/src/vendor/unbash/substitution-context.ts +20 -0
  380. package/src/vendor/unbash/traversal.ts +182 -0
  381. package/src/vendor/unbash/types.ts +660 -0
  382. package/src/vendor/unbash/word-value.ts +64 -0
  383. package/src/vendor/unbash/word.ts +50 -0
  384. package/src/verbs/analyze.ts +255 -164
  385. package/src/verbs/describe.ts +19 -17
  386. package/src/verbs/explain.ts +93 -169
  387. package/src/verbs/print-config.ts +2 -1
  388. package/src/verbs/print-projects.ts +6 -4
  389. package/src/verbs/print-retained.ts +36 -6
  390. package/src/verbs/print-roots.ts +4 -2
  391. package/src/verbs/verb.ts +2 -8
  392. package/src/verbs/version.ts +15 -3
  393. package/dist/src/base-url.js +0 -18
  394. package/dist/src/calls.js +0 -155
  395. package/dist/src/conventions.js +0 -937
  396. package/dist/src/discover.js +0 -468
  397. package/dist/src/entry-points.js +0 -529
  398. package/dist/src/exempt-classes.js +0 -75
  399. package/dist/src/exempt.js +0 -209
  400. package/dist/src/generated-file.js +0 -95
  401. package/dist/src/glob.js +0 -65
  402. package/dist/src/manifest.js +0 -165
  403. package/dist/src/matrix.js +0 -246
  404. package/dist/src/pnpm-workspace.js +0 -120
  405. package/dist/src/roots.js +0 -672
  406. package/dist/src/serialization-contract.js +0 -611
  407. package/dist/src/setup-failure.js +0 -23
  408. package/dist/src/sweep.js +0 -224
  409. package/dist/src/test-joins.js +0 -101
  410. package/dist/src/value-flow.js +0 -74
  411. package/dist/src/version.js +0 -7
  412. package/dist/src/workflow-steps.js +0 -185
  413. package/src/base-url.ts +0 -24
  414. package/src/calls.ts +0 -225
  415. package/src/decorator.ts +0 -78
  416. package/src/discover.ts +0 -653
  417. package/src/entry-points.ts +0 -687
  418. package/src/exempt-classes.ts +0 -123
  419. package/src/exempt.ts +0 -323
  420. package/src/generated-file.ts +0 -111
  421. package/src/glob.ts +0 -67
  422. package/src/manifest.ts +0 -234
  423. package/src/matrix.ts +0 -423
  424. package/src/pnpm-workspace.ts +0 -135
  425. package/src/serialization-contract.ts +0 -849
  426. package/src/setup-failure.ts +0 -39
  427. package/src/sweep.ts +0 -347
  428. package/src/test-joins.ts +0 -120
  429. package/src/value-flow.ts +0 -104
  430. package/src/version.ts +0 -7
  431. package/src/workflow-steps.ts +0 -216
@@ -1,23 +1,47 @@
1
1
  /**
2
- * The framework-lifecycle class: a member a `ts.lifecycle_contracts` entry lists is held
3
- * back on each class that is the entry's component, being a class a decorator or a call
4
- * the entry's `components` name is attached to or passes, or one extending, directly or
5
- * through a chain, a class its `bases` name. A component's members are its type's, so a
6
- * member a base class declares answers for every subclass.
2
+ * The framework-lifecycle class: a member a lifecycle contract lists is held back on each
3
+ * class that is the contract's component, being a class a decorator or a call the
4
+ * contract's `components` name is attached to or passes, or one extending, directly or
5
+ * through a chain, a class its `bases` name. The contracts are the platform's custom
6
+ * elements and each `ts.lifecycle_contracts` entry. A component's members are its type's,
7
+ * so a member a base class declares answers for every subclass.
7
8
  */
8
- import { isClassDeclaration, isClassExpression, isHeritageClause, SyntaxKind, } from "@typescript/native/ast";
9
- import { aliasChains } from "./alias-chain.js";
10
- import { calleeName, callsOf, classesPassed, decoratedClasses, decoratorCallee } from "./calls.js";
11
- import { classMembers, memberComponent, typesAt } from "./class-members.js";
12
- import { entriesAt, names, namesADeclaration, resolveEntries, spelledEntry, } from "./configured-declarations.js";
13
- import { nodeKey } from "./inventory.js";
14
- import { renderPosition } from "./position.js";
15
- import { must } from "./query.js";
9
+ import { isHeritageClause, SyntaxKind, } from "@typescript/native/ast";
10
+ import { aliasChains } from "../alias-chain.js";
11
+ import { nameOf } from "../index/values.js";
12
+ import { classesPassed, decoratorCallee, decoratorsOf } from "./calls.js";
13
+ import { classMembers, memberComponent, typesAt } from "../class-members.js";
14
+ import { entriesAt, names, namesADeclaration, resolveEntries, spelledEntry, } from "../roots/configured-declarations.js";
15
+ import { renderPosition } from "../position.js";
16
+ import { must } from "../query.js";
17
+ /**
18
+ * The platform's own contract (references-ts.38): `CustomElementRegistry.define` reads
19
+ * these members off the class it registers, its constructor's and its prototype's
20
+ * (https://html.spec.whatwg.org/multipage/custom-elements.html#dom-customelementregistry-define),
21
+ * and calls each callback as a custom element reaction.
22
+ */
23
+ const CUSTOM_ELEMENTS = {
24
+ components: [{ global: "CustomElementRegistry.define" }],
25
+ members: [
26
+ "observedAttributes:static",
27
+ "disabledFeatures:static",
28
+ "formAssociated:static",
29
+ "connectedCallback",
30
+ "disconnectedCallback",
31
+ "connectedMoveCallback",
32
+ "adoptedCallback",
33
+ "attributeChangedCallback",
34
+ "formAssociatedCallback",
35
+ "formResetCallback",
36
+ "formDisabledCallback",
37
+ "formStateRestoreCallback",
38
+ ],
39
+ };
16
40
  /** Every contract's components and bases, resolved in one pass over the entries. */
17
41
  function resolveContracts(project, held, contracts) {
18
42
  const entries = contracts.flatMap((contract) => [
19
- ...contract.components,
20
- ...contract.bases,
43
+ ...(contract.components ?? []),
44
+ ...(contract.bases ?? []),
21
45
  ]);
22
46
  const resolved = resolveEntries(project, held, entries);
23
47
  let next = 0;
@@ -28,21 +52,25 @@ function resolveContracts(project, held, contracts) {
28
52
  };
29
53
  return contracts.map((contract) => ({
30
54
  contract,
31
- components: take(contract.components.length),
32
- bases: take(contract.bases.length),
55
+ components: take(contract.components?.length ?? 0),
56
+ bases: take(contract.bases?.length ?? 0),
33
57
  }));
34
58
  }
35
59
  /** The classes a decorator or a call the contracts' components name makes a component. */
36
- function byComponents(project, held, chains, contracts) {
60
+ function byComponents(project, held, sites, chains, contracts) {
37
61
  const routed = contracts.filter((one) => one.components.length > 0);
38
62
  if (routed.length === 0) {
39
63
  return [];
40
64
  }
41
65
  const contractOf = new Map(routed.flatMap((one) => one.components.map((entry) => [entry, one.contract])));
42
- const calls = callsOf(project);
43
- const decorated = decoratedClasses(project, held);
66
+ const calls = sites.calls.map((one) => one.call);
67
+ const invoked = (call) => nameOf(sites.invocations.of(call).callee);
68
+ const decorated = sites.classes.flatMap(({ id, node }) => {
69
+ const decorators = decoratorsOf(node);
70
+ return decorators.length === 0 ? [] : [{ id, decorators }];
71
+ });
44
72
  const named = entriesAt(project, chains, [
45
- ...calls.flatMap((call) => calleeName(call.expression) ?? []),
73
+ ...calls.flatMap((call) => invoked(call) ?? []),
46
74
  ...decorated.flatMap((one) => one.decorators.flatMap((decorator) => decoratorCallee(decorator) ?? [])),
47
75
  ], [...contractOf.keys()]);
48
76
  const naming = (node) => (node === undefined ? [] : (named.get(node) ?? [])).flatMap((entry) => {
@@ -59,12 +87,12 @@ function byComponents(project, held, chains, contracts) {
59
87
  }
60
88
  const matched = new Map();
61
89
  for (const call of calls) {
62
- const routes = naming(calleeName(call.expression));
90
+ const routes = naming(invoked(call));
63
91
  if (routes.length > 0) {
64
92
  matched.set(call, routes);
65
93
  }
66
94
  }
67
- for (const [call, uses] of classesPassed(project, held, chains, [...matched.keys()])) {
95
+ for (const [call, uses] of classesPassed(project, held, chains, sites, [...matched.keys()])) {
68
96
  for (const route of matched.get(call) ?? []) {
69
97
  for (const use of uses) {
70
98
  found.push({
@@ -78,32 +106,23 @@ function byComponents(project, held, chains, contracts) {
78
106
  }
79
107
  return found;
80
108
  }
81
- /** The class declarations of the target that extend another class. */
82
- function extendingClasses(project, held) {
83
- const found = [];
84
- for (const file of project.ownSourceFiles()) {
85
- const visit = (node) => {
86
- if ((isClassDeclaration(node) || isClassExpression(node)) && node.name !== undefined) {
87
- const id = held.declarations.get(nodeKey(file, node));
88
- const clause = (node.heritageClauses ?? []).find((one) => isHeritageClause(one) && one.token === SyntaxKind.ExtendsKeyword);
89
- const extended = clause !== undefined && isHeritageClause(clause) ? clause.types[0] : undefined;
90
- if (id !== undefined && extended !== undefined) {
91
- found.push({ id, name: node.name, extended });
92
- }
93
- }
94
- node.forEachChild(visit);
95
- };
96
- file.forEachChild(visit);
97
- }
98
- return found;
109
+ /** Each named class of the target that extends another, with its name and the class its `extends` names. */
110
+ function extendingClasses(sites) {
111
+ return sites.classes.flatMap(({ id, node }) => {
112
+ const clause = (node.heritageClauses ?? []).find((one) => isHeritageClause(one) && one.token === SyntaxKind.ExtendsKeyword);
113
+ const extended = clause !== undefined && isHeritageClause(clause) ? clause.types[0] : undefined;
114
+ return node.name === undefined || extended === undefined
115
+ ? []
116
+ : [{ id, name: node.name, extended }];
117
+ });
99
118
  }
100
119
  /** The classes that extend, directly or through a chain, a class the contracts' bases name. */
101
- function byBases(project, held, chains, contracts) {
120
+ function byBases(project, held, sites, chains, contracts) {
102
121
  const based = contracts.filter((one) => one.bases.length > 0);
103
122
  if (based.length === 0) {
104
123
  return [];
105
124
  }
106
- const classes = extendingClasses(project, held);
125
+ const classes = extendingClasses(sites);
107
126
  if (classes.length === 0) {
108
127
  return [];
109
128
  }
@@ -155,40 +174,43 @@ function byBases(project, held, chains, contracts) {
155
174
  }
156
175
  /**
157
176
  * The framework-lifecycle detector: each member a contract lists, on each class that
158
- * is a component of that contract's framework, recorded where the class was found to
159
- * be one.
177
+ * is a component of that contract's framework, recorded once per place where the class
178
+ * was found to be one.
160
179
  */
161
180
  export function frameworkLifecycle(input) {
162
181
  const { project, held, targetRoot } = input;
163
- if (input.ts.lifecycleContracts.length === 0) {
182
+ const declared = [CUSTOM_ELEMENTS, ...input.ts.lifecycle_contracts];
183
+ const contracts = resolveContracts(project, held, declared);
184
+ if (contracts.every((one) => one.components.length === 0 && one.bases.length === 0)) {
164
185
  return [];
165
186
  }
166
187
  const chains = aliasChains(project, held);
167
- const contracts = resolveContracts(project, held, input.ts.lifecycleContracts);
168
188
  const components = [
169
- ...byComponents(project, held, chains, contracts),
170
- ...byBases(project, held, chains, contracts),
189
+ ...byComponents(project, held, input.sites, chains, contracts),
190
+ ...byBases(project, held, input.sites, chains, contracts),
171
191
  ];
172
192
  if (components.length === 0) {
173
193
  return [];
174
194
  }
175
195
  const ids = new Set(components.map((one) => one.id));
176
- const sides = input.ts.lifecycleContracts.some((contract) => contract.members.some((name) => name.endsWith(":static")))
196
+ const sides = declared.some((contract) => contract.members.some((name) => name.endsWith(":static")))
177
197
  ? ["instance", "static"]
178
198
  : ["instance"];
179
199
  const members = sides.map((side) => classMembers(project, held, ids, side));
180
200
  const byId = new Map(held.symbols.map((symbol) => [symbol.id, symbol]));
181
- const found = [];
201
+ const found = new Map();
182
202
  for (const component of components) {
183
203
  const listed = new Set(component.contract.members);
184
204
  const site = renderPosition(component.site.getSourceFile(), targetRoot, component.site.getStart());
185
205
  for (const member of members.flatMap((side) => side.get(component.id) ?? [])) {
186
206
  const symbol = byId.get(member.id);
187
207
  const spelled = symbol === undefined ? undefined : memberComponent(symbol, byId);
188
- if (spelled !== undefined && listed.has(spelled)) {
189
- found.push({ id: member.id, detail: component.detail, site });
208
+ // A configured contract may name the platform's registry too; one record answers both.
209
+ const key = `${member.id}\0${component.detail}\0${site.path}:${String(site.line)}:${String(site.column)}`;
210
+ if (spelled !== undefined && listed.has(spelled) && !found.has(key)) {
211
+ found.set(key, { id: member.id, detail: component.detail, site });
190
212
  }
191
213
  }
192
214
  }
193
- return found;
215
+ return [...found.values()];
194
216
  }
@@ -0,0 +1,241 @@
1
+ /**
2
+ * The generated-file class on TypeScript: every declaration in a file that marks itself
3
+ * generated, below a directory an applied convention row names as generated, or minified,
4
+ * is retained, because a generator owns the file and a deletion there is undone at the next
5
+ * generation. The same decision is each `generated` entry of the facts document.
6
+ */
7
+ import { isIdentifier, isImportDeclaration, isPropertyAssignment, isStringLiteralLikeNode, isVariableStatement, NodeFlags, } from "@typescript/native/ast";
8
+ import { GENERATORS } from "../contract/contract.generated.js";
9
+ import { minifiedBy } from "../javascript-file.js";
10
+ import { bytewise } from "../text/compare.js";
11
+ import { satisfies } from "../version-range.js";
12
+ /** The generated-code header, matched against each line of a leading comment. */
13
+ const HEADER_LINE = /^\/\/ Code generated .* DO NOT EDIT\.$/u;
14
+ /** The documentation tag `@generated` as a word of a comment. */
15
+ const GENERATED_TAG = /(?<![\w@$])@generated(?![\w$-])/u;
16
+ /** A first comment naming the tool that wrote the file. */
17
+ const GENERATED_BY = /^\/\/ Generated by \S/u;
18
+ /** The word a generator's notice holds, beside one of {@link KEEP_OUT}. */
19
+ const GENERATED_WORD = /\bgenerated\b/iu;
20
+ /** The phrases a generator's notice asks a reader not to edit the file by. */
21
+ const KEEP_OUT = /\b(?:do not edit|will be overwritten|should not make any changes)\b/iu;
22
+ /** The comments before a text's first token, a leading hashbang line skipped, each as its lines. */
23
+ function leadingComments(text) {
24
+ const comments = [];
25
+ const lineAt = (offset) => text.slice(0, offset).split(/\r\n|[\n\r\u2028\u2029]/u).length;
26
+ const lines = (from, to) => {
27
+ const first = lineAt(from);
28
+ return text
29
+ .slice(from, to)
30
+ .split(/\r\n|[\n\r\u2028\u2029]/u)
31
+ .map((one, index) => ({ text: one, line: first + index }));
32
+ };
33
+ let at = text.startsWith("\uFEFF") ? 1 : 0;
34
+ if (text.startsWith("#!", at)) {
35
+ const end = text.indexOf("\n", at);
36
+ at = end === -1 ? text.length : end + 1;
37
+ }
38
+ for (;;) {
39
+ while (at < text.length && /\s/u.test(text.charAt(at))) {
40
+ at++;
41
+ }
42
+ if (text.startsWith("//", at)) {
43
+ const end = text.slice(at).search(/[\r\n\u2028\u2029]/u);
44
+ const stop = end === -1 ? text.length : at + end;
45
+ comments.push(lines(at, stop));
46
+ at = stop;
47
+ }
48
+ else if (text.startsWith("/*", at)) {
49
+ const end = text.indexOf("*/", at + 2);
50
+ if (end === -1) {
51
+ return comments;
52
+ }
53
+ comments.push(lines(at, end + 2));
54
+ at = end + 2;
55
+ }
56
+ else {
57
+ return comments;
58
+ }
59
+ }
60
+ }
61
+ /** The mark one file's leading comments make it generated by, or undefined where they mark nothing. */
62
+ export function generatedMark(text) {
63
+ const lines = leadingComments(text).flat();
64
+ const header = lines.find((one) => HEADER_LINE.test(one.text));
65
+ if (header !== undefined) {
66
+ return { evidence: "header", line: header.line, detail: header.text };
67
+ }
68
+ const tag = lines.find((one) => GENERATED_TAG.test(one.text));
69
+ if (tag !== undefined) {
70
+ return { evidence: "tag", line: tag.line, detail: tag.text };
71
+ }
72
+ const [first] = lines;
73
+ if (first !== undefined && GENERATED_BY.test(first.text)) {
74
+ return { evidence: "notice", line: first.line, detail: first.text };
75
+ }
76
+ const notice = lines.map((one) => one.text).join("\n");
77
+ if (GENERATED_WORD.test(notice) && KEEP_OUT.test(notice)) {
78
+ const marked = lines.find((one) => GENERATED_WORD.test(one.text) || KEEP_OUT.test(one.text));
79
+ return marked === undefined
80
+ ? undefined
81
+ : { evidence: "notice", line: marked.line, detail: marked.text };
82
+ }
83
+ return undefined;
84
+ }
85
+ /** What one form's first group captures, for each line the form matches. */
86
+ function after(lines, form) {
87
+ return lines.flatMap((one) => form.exec(one.text)?.[1] ?? []);
88
+ }
89
+ /**
90
+ * Where each plugin's output states its version and its schema files, as `references-ts.36`
91
+ * states: a plugin missing here states no version, and one with no schema form names none.
92
+ */
93
+ const STATEMENTS = {
94
+ "protoc-gen-es": {
95
+ version: /^\/\/ @generated by protoc-gen-es (\S+)/u,
96
+ schemaFiles: /^\/\/ @generated from file (\S+)/u,
97
+ },
98
+ "protoc-gen-connect-es": {
99
+ version: /^\/\/ @generated by protoc-gen-connect-es (\S+)/u,
100
+ schemaFiles: /^\/\/ @generated from file (\S+)/u,
101
+ },
102
+ "protobuf-ts": {
103
+ version: /^\/\/ @generated by protobuf-ts (\S+)/u,
104
+ schemaFiles: /^\/\/ @generated from protobuf file "([^"]+)"/u,
105
+ },
106
+ "ts-proto": {
107
+ version: /^\/\/\s+protoc-gen-ts_proto\s+(\S+)$/u,
108
+ schemaFiles: /^\/\/ source: (.+)$/u,
109
+ },
110
+ "protoc-gen-grpc-web": {
111
+ version: /^\/\/\s+protoc-gen-grpc-web\s+(\S+)$/u,
112
+ schemaFiles: /^\/\/ source: (.+)$/u,
113
+ },
114
+ "protoc-gen-js": { schemaFiles: /^\/\/ source: (.+)$/u },
115
+ "ts-protoc-gen": { schemaFiles: /^\/\/ file: (.+)$/u },
116
+ };
117
+ /** A ts-proto service path literal: `/<package>.<service>/<method>`. */
118
+ const SERVICE_PATH = /^\/(?:\w+\.)+\w+\/\w+$/u;
119
+ /** Whether one ts-proto file writes a service path, as `references-ts.36` reads one. */
120
+ function writesServicePath(file) {
121
+ const named = file.statements.some((statement) => isVariableStatement(statement) &&
122
+ (statement.declarationList.flags & NodeFlags.Const) !== 0 &&
123
+ statement.declarationList.declarations.some((one) => isIdentifier(one.name) &&
124
+ one.name.text.endsWith("ServiceName") &&
125
+ one.initializer !== undefined &&
126
+ isStringLiteralLikeNode(one.initializer)));
127
+ let found = named;
128
+ const visit = (node) => {
129
+ if (found) {
130
+ return;
131
+ }
132
+ if (isPropertyAssignment(node) &&
133
+ isIdentifier(node.name) &&
134
+ node.name.text === "path" &&
135
+ isStringLiteralLikeNode(node.initializer) &&
136
+ SERVICE_PATH.test(node.initializer.text)) {
137
+ found = true;
138
+ return;
139
+ }
140
+ node.forEachChild(visit);
141
+ };
142
+ file.forEachChild(visit);
143
+ return found;
144
+ }
145
+ /** Whether one file imports a module by its specifier. */
146
+ function imports(file, module) {
147
+ return file.statements.some((statement) => isImportDeclaration(statement) &&
148
+ isStringLiteralLikeNode(statement.moduleSpecifier) &&
149
+ statement.moduleSpecifier.text === module);
150
+ }
151
+ /** The option sets the rows of `references-ts.36` name, by row; every other row's is met by any output. */
152
+ const OPTION_SETS = {
153
+ "ts-proto-2-output-schema": (file) => imports(file, "ts-proto-descriptors"),
154
+ "ts-proto-2": writesServicePath,
155
+ "ts-proto-2-types": (file) => !writesServicePath(file),
156
+ };
157
+ /** The first generator row one file matches, in `generators.json`'s order, as `bindings.3` reads it. */
158
+ export function generatorOf(file) {
159
+ const lines = leadingComments(file.text).flat();
160
+ for (const row of GENERATORS) {
161
+ const header = new RegExp(row.header, "u");
162
+ if (!lines.some((one) => header.test(one.text))) {
163
+ continue;
164
+ }
165
+ const statements = STATEMENTS[row.plugin] ?? {};
166
+ const [version] = statements.version === undefined ? [] : after(lines, statements.version);
167
+ if ("versions" in row &&
168
+ (version === undefined ||
169
+ !satisfies(version.replace(/^v/u, ""), `>=${row.versions.min.replace(/^v/u, "")} <=${row.versions.max.replace(/^v/u, "")}`))) {
170
+ continue;
171
+ }
172
+ if (OPTION_SETS[row.id]?.(file) === false) {
173
+ continue;
174
+ }
175
+ const schemaFiles = statements.schemaFiles === undefined
176
+ ? []
177
+ : [
178
+ ...new Set(after(lines, statements.schemaFiles).filter((one) => one.endsWith(".proto"))),
179
+ ].sort(bytewise);
180
+ return { row: row.id, ...(version === undefined ? {} : { version }), schemaFiles };
181
+ }
182
+ return undefined;
183
+ }
184
+ /**
185
+ * Every own file of one project that is generated, by its path below the target root, with
186
+ * what decided it: its leading comments' mark, else the row naming its directory as
187
+ * generated, else its minified name or text; and the generator row it matches.
188
+ */
189
+ export function generatedFilesOf(files, byRow) {
190
+ const found = new Map();
191
+ for (const [path, file] of files.byPath) {
192
+ const row = byRow.get(path);
193
+ const minified = row === undefined ? minifiedBy(file.fileName, file.text) : undefined;
194
+ const fact = generatedMark(file.text) ??
195
+ (row === undefined
196
+ ? minified === undefined
197
+ ? undefined
198
+ : { evidence: "minified", line: 1, detail: minified }
199
+ : { evidence: "convention", line: 1, detail: row });
200
+ if (fact === undefined) {
201
+ continue;
202
+ }
203
+ const generator = generatorOf(file);
204
+ found.set(path, generator === undefined ? fact : { ...fact, generator });
205
+ }
206
+ return found;
207
+ }
208
+ /** The detail a retention in a generated file names, from what decided the file. */
209
+ function retentionDetail(fact) {
210
+ switch (fact.evidence) {
211
+ case "header":
212
+ return "generated by the header line its leading comments hold";
213
+ case "tag":
214
+ return "generated by the @generated tag its leading comments hold";
215
+ case "notice":
216
+ return "generated by the notice its leading comments hold";
217
+ case "convention":
218
+ return `generated below a directory the convention row ${fact.detail} names`;
219
+ case "minified":
220
+ return "generated as a minified JavaScript file";
221
+ }
222
+ }
223
+ /** The generated-file detector, recording each file's first line. */
224
+ export function generatedFile(input) {
225
+ const generated = input.generated;
226
+ if (generated === undefined || generated.size === 0) {
227
+ return [];
228
+ }
229
+ return input.held.symbols.flatMap((symbol) => {
230
+ const fact = generated.get(symbol.position.path);
231
+ return symbol.kind === "file" || fact === undefined
232
+ ? []
233
+ : [
234
+ {
235
+ id: symbol.id,
236
+ detail: retentionDetail(fact),
237
+ site: { path: symbol.position.path, line: 1, column: 1 },
238
+ },
239
+ ];
240
+ });
241
+ }
@@ -6,13 +6,14 @@
6
6
  * parameter property is injected, decorated or not. A constructor is no declaration of
7
7
  * the inventory, so the class stands for it and the registration referencing it keeps it.
8
8
  */
9
- import { isClassDeclaration, isClassExpression, isConstructorDeclaration, isGetAccessorDeclaration, isPropertyDeclaration, isSetAccessorDeclaration, } from "@typescript/native/ast";
10
- import { aliasChains } from "./alias-chain.js";
11
- import { calleeName, callsOf, classesPassed, decoratorsOf, spelledDecorator } from "./calls.js";
12
- import { classMembers } from "./class-members.js";
13
- import { entriesAt, namesADeclaration, resolveEntries, spelledEntry, } from "./configured-declarations.js";
14
- import { isParameterProperty, nodeKey } from "./inventory.js";
15
- import { renderPosition } from "./position.js";
9
+ import { isConstructorDeclaration, isGetAccessorDeclaration, isPropertyDeclaration, isSetAccessorDeclaration, } from "@typescript/native/ast";
10
+ import { aliasChains } from "../alias-chain.js";
11
+ import { nameOf } from "../index/values.js";
12
+ import { classesPassed, decoratorsOf, spelledDecorator } from "./calls.js";
13
+ import { classMembers } from "../class-members.js";
14
+ import { entriesAt, namesADeclaration, resolveEntries, spelledEntry, } from "../roots/configured-declarations.js";
15
+ import { isParameterProperty } from "../inventory.js";
16
+ import { renderPosition } from "../position.js";
16
17
  /** Whether one member declaration is a parameter property, or a property or accessor carrying a decorator. */
17
18
  function isInjected(node) {
18
19
  return (isParameterProperty(node) ||
@@ -23,23 +24,24 @@ function isInjected(node) {
23
24
  }
24
25
  /** The classes of the target a call whose callee an entry names passes, with that call's entry. */
25
26
  function registrations(input) {
26
- const { project, held } = input;
27
- const resolved = resolveEntries(project, held, input.ts.injectionRegistrations);
27
+ const { project, held, sites } = input;
28
+ const resolved = resolveEntries(project, held, input.ts.injection_registrations);
28
29
  if (!resolved.some(namesADeclaration)) {
29
30
  return [];
30
31
  }
31
32
  const chains = aliasChains(project, held);
32
- const calls = callsOf(project);
33
- const named = entriesAt(project, chains, calls.flatMap((call) => calleeName(call.expression) ?? []), resolved);
33
+ const calls = sites.calls.map((one) => one.call);
34
+ const invoked = (call) => nameOf(sites.invocations.of(call).callee);
35
+ const named = entriesAt(project, chains, calls.flatMap((call) => invoked(call) ?? []), resolved);
34
36
  const matched = new Map();
35
37
  for (const call of calls) {
36
- const name = calleeName(call.expression);
38
+ const name = invoked(call);
37
39
  const [entry] = name === undefined ? [] : (named.get(name) ?? []);
38
40
  if (entry !== undefined) {
39
41
  matched.set(call, entry);
40
42
  }
41
43
  }
42
- return [...classesPassed(project, held, chains, [...matched.keys()])].flatMap(([call, uses]) => {
44
+ return [...classesPassed(project, held, chains, sites, [...matched.keys()])].flatMap(([call, uses]) => {
43
45
  const entry = matched.get(call);
44
46
  const detail = entry === undefined ? "" : `registered by ${spelledEntry(entry.entry, held)}`;
45
47
  return uses.map((use) => ({ id: use.id, site: use.site, detail }));
@@ -50,20 +52,12 @@ function registrations(input) {
50
52
  * with the first such decorator.
51
53
  */
52
54
  function constructedForParameters(input) {
53
- const { project, held } = input;
54
55
  const found = new Map();
55
- for (const file of project.ownSourceFiles()) {
56
- const visit = (node) => {
57
- if (isClassDeclaration(node) || isClassExpression(node)) {
58
- const id = held.declarations.get(nodeKey(file, node));
59
- const [asks] = node.members.flatMap((member) => isConstructorDeclaration(member) ? member.parameters.flatMap(decoratorsOf) : []);
60
- if (id !== undefined && asks !== undefined) {
61
- found.set(id, asks);
62
- }
63
- }
64
- node.forEachChild(visit);
65
- };
66
- file.forEachChild(visit);
56
+ for (const { id, node } of input.sites.classes) {
57
+ const [asks] = node.members.flatMap((member) => isConstructorDeclaration(member) ? member.parameters.flatMap(decoratorsOf) : []);
58
+ if (asks !== undefined) {
59
+ found.set(id, asks);
60
+ }
67
61
  }
68
62
  return found;
69
63
  }