@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
@@ -7,20 +7,28 @@
7
7
  * itself is that dependency's need, not the target's.
8
8
  */
9
9
  import { isArrayLiteralExpression, isCallExpression, isExportDeclaration, isExpressionStatement, isExternalModuleReference, isIdentifier, isImportDeclaration, isImportEqualsDeclaration, isMetaProperty, isNamespaceExport, isObjectLiteralExpression, isPropertyAccessExpression, isPropertyAssignment, isShorthandPropertyAssignment, isStringLiteral, isNoSubstitutionTemplateLiteral, SyntaxKind, } from "@typescript/native/ast";
10
+ import { amdLoadOf, amdPlatform } from "./amd.js";
10
11
  import { automaticTypes } from "./automatic-types.js";
11
- import { configurationFiles, declaredIn as declaredBeside, dependenciesNamed, moduleStrings, outsideChain, } from "./configuration-files.js";
12
- import { nodeKey, packageScope } from "./inventory.js";
13
- import { scriptTokens } from "./manifest.js";
14
- import { dirnamePath, isAbsolutePath, joinPath, relativePath, resolvePath } from "./paths.js";
12
+ import { declaredIn as declaredBeside, dependenciesNamed, moduleStrings, outsideChain, } from "./entries/configuration-files.js";
13
+ import { declarationBindings } from "./import-bindings.js";
14
+ import { nodeKey } from "./inventory.js";
15
+ import { packageScope } from "./load/package-scope.js";
16
+ import { ancestors, cannotStartPackageName, dirnamePath, joinPath, relativePath, resolvePath, } from "./paths.js";
15
17
  import { UNANSWERED } from "./query.js";
16
18
  import { sourceFilesOf } from "./source-files.js";
17
- import { workflowTokens } from "./workflow-steps.js";
18
- const MANIFEST = "package.json";
19
- const MODULES_DIR = "node_modules";
20
- const MODULES_SEGMENT = `/${MODULES_DIR}/`;
19
+ import { manifestCommands, nodemonTexts } from "./roots/manifest.js";
20
+ import { writtenName } from "./platform-calls.js";
21
+ import { callsPlatform } from "./platform-symbols.js";
22
+ import { parenthesesRemoved } from "./unwrap.js";
23
+ import { pathsNamed, preloadedPackages, readCommands, } from "./commands/read.js";
24
+ import { heldNames } from "./text/named-files.js";
25
+ import { bytewise } from "./text/compare.js";
26
+ import { isRecord } from "./json-document.js";
27
+ import { inInstalledPackages, INSTALLED_PACKAGES, MANIFEST, readDocument } from "./fs/manifest.js";
28
+ const MODULES_SEGMENT = `/${INSTALLED_PACKAGES}/`;
21
29
  const TYPES_SCOPE = "@types/";
22
- /** A script token naming a JavaScript file by a path no expansion changes. */
23
- const SCRIPT_FILE = /^[^$`{*?[~]+\.(?:js|mjs|cjs)$/u;
30
+ /** A path a command names that is a JavaScript file's. */
31
+ const SCRIPT_FILE = /\.(?:js|mjs|cjs)$/u;
24
32
  /** The manifest sections a dependency is declared in, each by the selector its reference spells. */
25
33
  const SECTIONS = [
26
34
  ["dependencies", "dependency"],
@@ -39,25 +47,6 @@ export function configurationNeeds(packages) {
39
47
  }
40
48
  /** The key of {@link ProjectNeeds.at} for a use no file of the target governs. */
41
49
  const ANYWHERE = "";
42
- function isRecord(value) {
43
- return typeof value === "object" && value !== null && !Array.isArray(value);
44
- }
45
- /** One JSON document's decoded value, or undefined where it cannot be read or parsed. */
46
- function readJSON(host, path) {
47
- let text;
48
- try {
49
- text = host.readFile(path);
50
- }
51
- catch {
52
- return undefined;
53
- }
54
- try {
55
- return { text, value: JSON.parse(text) };
56
- }
57
- catch {
58
- return undefined;
59
- }
60
- }
61
50
  /**
62
51
  * The package a bare module specifier names: its first segment, or its first two
63
52
  * where it starts with a scope. A relative, absolute or scheme-prefixed specifier and
@@ -78,7 +67,7 @@ export function packageOfSpecifier(specifier) {
78
67
  return second === undefined || second === "" || first === "@" ? undefined : `${first}/${second}`;
79
68
  }
80
69
  /** The package an installed file belongs to, read below the last dependency directory of its path. */
81
- function packageOfPath(path) {
70
+ export function packageOfPath(path) {
82
71
  const at = path.lastIndexOf(MODULES_SEGMENT);
83
72
  return at < 0 ? undefined : packageOfSpecifier(path.slice(at + MODULES_SEGMENT.length));
84
73
  }
@@ -166,7 +155,7 @@ function configurationPackages(host, configFile, options, programPackages, parse
166
155
  }
167
156
  seen.add(file);
168
157
  for (const entry of extendsOf(host, file, parse)) {
169
- if (entry.startsWith(".") || isAbsolutePath(entry)) {
158
+ if (cannotStartPackageName(entry)) {
170
159
  const local = resolvePath(dirnamePath(file), entry);
171
160
  pending.push(local.endsWith(".json") ? local : `${local}.json`);
172
161
  }
@@ -191,36 +180,19 @@ function importOf(specifier) {
191
180
  }
192
181
  /** The local names one import declaration binds. */
193
182
  function bindingsOf(node) {
194
- if (node === undefined) {
195
- return [];
196
- }
197
- if (isImportEqualsDeclaration(node)) {
198
- return [node.name];
199
- }
200
- if (!isImportDeclaration(node) || node.importClause === undefined) {
201
- return [];
202
- }
203
- const clause = node.importClause;
204
- const names = clause.name === undefined ? [] : [clause.name];
205
- const bindings = clause.namedBindings;
206
- if (bindings !== undefined) {
207
- if (bindings.kind === SyntaxKind.NamespaceImport) {
208
- names.push(bindings.name);
209
- }
210
- else {
211
- names.push(...bindings.elements.map((element) => element.name));
212
- }
213
- }
214
- return names;
183
+ return node !== undefined && (isImportDeclaration(node) || isImportEqualsDeclaration(node))
184
+ ? declarationBindings(node).map((binding) => binding.name)
185
+ : [];
215
186
  }
216
187
  /**
217
188
  * Every package one project needs, and which declaration each use is written in.
218
189
  * One local walk and one batched resolution per file: a use of an import binding is
219
190
  * an identifier resolving to the binding's own symbol, so a local declaration that
220
- * shadows the name is not one. A string of a configuration file uses each dependency
221
- * the manifest beside the file declares that it spells.
191
+ * shadows the name is not one. A string of a configuration file, as the entry sources
192
+ * read them in `configuration`, uses each dependency the manifest beside the file
193
+ * declares that it spells.
222
194
  */
223
- export function projectNeeds(project, held, host, targetRoot, parse) {
195
+ export function projectNeeds(project, held, host, targetRoot, parse, configuration, workflows) {
224
196
  const programPackages = new Set();
225
197
  for (const name of project.program.getSourceFileNames()) {
226
198
  const named = packageOfPath(name);
@@ -271,7 +243,6 @@ export function projectNeeds(project, held, host, targetRoot, parse) {
271
243
  return names;
272
244
  };
273
245
  const files = sourceFilesOf(project, targetRoot);
274
- const configuration = configurationFiles(host, targetRoot, files, parse);
275
246
  for (const { file, manifestDir } of configuration.modules) {
276
247
  const names = declaredAt(joinPath(manifestDir, MANIFEST));
277
248
  for (const { node, text } of moduleStrings(file)) {
@@ -280,16 +251,16 @@ export function projectNeeds(project, held, host, targetRoot, parse) {
280
251
  }
281
252
  for (const { strings, manifestDirs } of configuration.documents) {
282
253
  for (const manifestDir of manifestDirs) {
283
- const names = declaredAt(joinPath(manifestDir, "package.json"));
254
+ const names = declaredAt(joinPath(manifestDir, MANIFEST));
284
255
  for (const text of strings) {
285
256
  use([PROJECT_OWNER], dependenciesNamed(text, names), joinPath(manifestDir, MANIFEST));
286
257
  }
287
258
  }
288
259
  }
289
- const ranFiles = outsideChain(host, targetRoot, files, parse, scriptRunFiles(host, targetRoot, files));
260
+ const ranFiles = outsideChain(host, targetRoot, files, parse, scriptRunFiles(host, targetRoot, files, workflows));
290
261
  for (const { file, manifestDirs } of [...configuration.outside, ...ranFiles]) {
291
262
  for (const manifestDir of manifestDirs) {
292
- const names = declaredAt(joinPath(manifestDir, "package.json"));
263
+ const names = declaredAt(joinPath(manifestDir, MANIFEST));
293
264
  for (const { text } of moduleStrings(file)) {
294
265
  use([PROJECT_OWNER], dependenciesNamed(text, names), joinPath(manifestDir, MANIFEST));
295
266
  }
@@ -298,39 +269,40 @@ export function projectNeeds(project, held, host, targetRoot, parse) {
298
269
  return { uses, at, unanswered };
299
270
  }
300
271
  /**
301
- * The JavaScript files no program holds that a script of a manifest at or above one of the
302
- * project's files runs, each with the directory of that manifest, and those a workflow
303
- * step or git hook runs, with the target root's: a token naming such a file below the
304
- * target root and in no `node_modules`, read against the manifest's directory.
272
+ * The JavaScript files no program holds that a command string of a manifest at or above one of
273
+ * the project's files runs or names, each with the directory of that manifest, and those a
274
+ * workflow step or git hook names, with the target root's: a path `pathsNamed` reads, below the
275
+ * target root and in no `node_modules`.
305
276
  */
306
- function scriptRunFiles(host, targetRoot, files) {
277
+ function scriptRunFiles(host, targetRoot, files, workflows) {
307
278
  const root = resolvePath(host.workingDirectory(), targetRoot);
308
279
  const dirs = new Set([root]);
309
280
  for (const name of files.byName.keys()) {
310
- for (let dir = dirnamePath(name); !dirs.has(dir); dir = dirnamePath(dir)) {
311
- if (relativePath(root, dir) === undefined) {
281
+ for (const dir of ancestors(dirnamePath(name), root)) {
282
+ if (dirs.has(dir)) {
312
283
  break;
313
284
  }
314
285
  dirs.add(dir);
315
286
  }
316
287
  }
317
- const tokens = new Map([
318
- [root, new Set(workflowTokens(host, root))],
288
+ const named = new Map([
289
+ [root, workflows.readings.flatMap(pathsNamed).map((one) => one.path)],
319
290
  ]);
320
291
  for (const dir of dirs) {
321
- const read = readJSON(host, joinPath(dir, MANIFEST));
292
+ const read = readDocument(host, joinPath(dir, MANIFEST));
322
293
  if (read !== undefined && isRecord(read.value)) {
323
- const own = scriptTokensOf(read.value);
324
- tokens.set(dir, dir === root ? new Set([...own, ...(tokens.get(root) ?? [])]) : own);
294
+ const own = manifestReadings(host, dir, read.value)
295
+ .flatMap(pathsNamed)
296
+ .map((one) => one.path);
297
+ named.set(dir, [...own, ...(named.get(dir) ?? [])]);
325
298
  }
326
299
  }
327
300
  const found = [];
328
- for (const [manifestDir, held] of tokens) {
329
- for (const token of held) {
330
- const path = SCRIPT_FILE.test(token) ? resolvePath(manifestDir, token) : undefined;
331
- const below = path === undefined ? undefined : relativePath(root, path);
332
- if (path !== undefined &&
333
- below?.split("/").includes(MODULES_DIR) === false &&
301
+ for (const [manifestDir, paths] of named) {
302
+ for (const path of new Set(paths)) {
303
+ const below = SCRIPT_FILE.test(path) ? relativePath(root, path) : undefined;
304
+ if (below !== undefined &&
305
+ !inInstalledPackages(below) &&
334
306
  !files.byName.has(path) &&
335
307
  host.kindOf(path) === "file") {
336
308
  found.push({ path, manifestDir });
@@ -339,6 +311,30 @@ function scriptRunFiles(host, targetRoot, files) {
339
311
  }
340
312
  return found;
341
313
  }
314
+ /** What the command strings of one manifest, its scripts and nodemon's command, run. */
315
+ function manifestReadings(host, dir, manifest) {
316
+ return manifestCommands(host, dir, manifest).map(({ command }) => readCommands(command, dir));
317
+ }
318
+ /** What one manifest's command strings use, held with the whole text of nodemon's configuration. */
319
+ function manifestUses(host, dir, manifest) {
320
+ const uses = usesOf(manifestReadings(host, dir, manifest));
321
+ const texts = nodemonTexts(host, dir, manifest).map(({ text }) => text);
322
+ return { ...uses, held: [uses.held, ...texts].join("\n") };
323
+ }
324
+ /** What the target root's workflow steps, git hooks and recipes use, held with their files' whole text. */
325
+ function workflowUses(workflows) {
326
+ const uses = usesOf(workflows.readings);
327
+ return { ...uses, held: [uses.held, ...workflows.texts].join("\n") };
328
+ }
329
+ function usesOf(readings) {
330
+ return {
331
+ words: new Set(readings.flatMap((one) => one.commands.flatMap((command) => command.words.flatMap((word) => word ?? [])))),
332
+ preloads: new Set(readings
333
+ .flatMap((one) => one.runs.flatMap(preloadedPackages))
334
+ .flatMap((specifier) => packageOfSpecifier(specifier) ?? [])),
335
+ held: readings.map((one) => one.held).join("\n"),
336
+ };
337
+ }
342
338
  /** The declarations of the inventory a use written at one node belongs to. */
343
339
  function ownersOf(file, held, node) {
344
340
  const parent = node.parent;
@@ -414,7 +410,16 @@ function fileNeeds(project, held, file, { programPackages, automatic }, use) {
414
410
  if (names.size > 0 || automatic.globals.size > 0) {
415
411
  visit(file);
416
412
  }
417
- const asked = [...specifiers, ...bindings.map(({ node }) => node), ...candidates, ...globals];
413
+ const loads = runtimeLoads(file);
414
+ const callees = loads.flatMap((load) => load.callees);
415
+ const amdCallees = new Set(loads.flatMap((load) => (load.amd ? load.callees : [])));
416
+ const asked = [
417
+ ...specifiers,
418
+ ...bindings.map(({ node }) => node),
419
+ ...candidates,
420
+ ...globals,
421
+ ...callees,
422
+ ];
418
423
  const handles = asked.map((node) => project.handle(node));
419
424
  const resolved = project.symbolsAt(handles);
420
425
  const packagesOf = new Map();
@@ -485,33 +490,80 @@ function fileNeeds(project, held, file, { programPackages, automatic }, use) {
485
490
  for (const reference of file.typeReferenceDirectives) {
486
491
  use(ownersOf(file, held, file), typePackages(reference.fileName, programPackages));
487
492
  }
488
- for (const specifier of resolvedSpecifiers(file)) {
489
- const named = packageOfSpecifier(specifier.text);
490
- if (named !== undefined) {
493
+ // A callee the checker leaves unanswered may be a require, so its call holds the
494
+ // dependency it names by live code, as program.33 holds one.
495
+ const calleesAt = unresolvedAt + globals.length;
496
+ const decided = new Map();
497
+ const requires = new Set();
498
+ const unansweredCallees = new Set();
499
+ callees.forEach((callee, index) => {
500
+ const symbol = resolved[calleesAt + index];
501
+ if (symbol === UNANSWERED) {
502
+ unansweredCallees.add(callee);
503
+ return;
504
+ }
505
+ // The decision reads the callee's symbol, its written name and its platform name, and nothing else.
506
+ const platform = amdCallees.has(callee) ? amdPlatform(callee) : "require";
507
+ const key = symbol === undefined ? undefined : `${symbol.id}\u0000${platform}\u0000${callee.text}`;
508
+ const answer = (key === undefined ? undefined : decided.get(key)) ??
509
+ callsPlatform(project, platform, callee, symbol);
510
+ if (key !== undefined) {
511
+ decided.set(key, answer);
512
+ }
513
+ if (answer) {
514
+ requires.add(callee);
515
+ }
516
+ });
517
+ for (const { specifier, named, callees: through } of loads) {
518
+ if (through.length === 0 || through.some((one) => requires.has(one))) {
491
519
  use(ownersOf(file, held, specifier), [named]);
492
520
  }
521
+ else if (through.some((one) => unansweredCallees.has(one))) {
522
+ use([PROJECT_OWNER], [named]);
523
+ }
493
524
  }
494
525
  return resolved.slice(0, specifiers.length).includes(UNANSWERED);
495
526
  }
496
527
  /**
497
- * The literal specifiers one file asks the runtime to resolve, through `import.meta.resolve`
498
- * or `require.resolve`, each of which needs the package it names installed.
528
+ * The calls one file may load or resolve a package with at run time, each of whose first
529
+ * argument is literal text naming a package: a `require()` call, which the compiler lists among
530
+ * a file's imports only in a JavaScript file and only through the bare name; a `.resolve` of
531
+ * another name, which needs it where that name is a `require`; and `import.meta.resolve` or
532
+ * a `.resolve` of the name `require`, whatever it names, a use where it stands; and each id of
533
+ * an AMD dependency list (references-ts.37), which needs it where the call is AMD's.
499
534
  */
500
- function resolvedSpecifiers(file) {
535
+ function runtimeLoads(file) {
501
536
  const found = [];
502
- if (!file.text.includes(".resolve(")) {
503
- return found;
504
- }
505
537
  const visit = (node) => {
506
- if (isCallExpression(node) && isPropertyAccessExpression(node.expression)) {
507
- const callee = node.expression;
538
+ const amd = amdLoadOf(node);
539
+ if (amd !== undefined) {
540
+ for (const { id } of amd.ids) {
541
+ const named = packageOfSpecifier(id.text);
542
+ if (named !== undefined) {
543
+ found.push({ specifier: id, named, callees: [amd.callee], amd: true });
544
+ }
545
+ }
546
+ }
547
+ else if (isCallExpression(node)) {
508
548
  const [argument] = node.arguments;
509
- const receiver = callee.expression;
510
- const resolving = callee.name.text === "resolve" &&
511
- ((isMetaProperty(receiver) && receiver.name.text === "meta") ||
512
- (isIdentifier(receiver) && receiver.text === "require"));
513
- if (resolving && argument !== undefined && isLiteralText(argument)) {
514
- found.push(argument);
549
+ if (argument !== undefined && isLiteralText(argument)) {
550
+ const named = packageOfSpecifier(argument.text);
551
+ const callee = parenthesesRemoved(node.expression);
552
+ const receiver = isPropertyAccessExpression(callee) && callee.name.text === "resolve"
553
+ ? parenthesesRemoved(callee.expression)
554
+ : undefined;
555
+ const stands = receiver !== undefined &&
556
+ ((isMetaProperty(receiver) && receiver.name.text === "meta") ||
557
+ (isIdentifier(receiver) && receiver.text === "require"));
558
+ const callees = stands
559
+ ? []
560
+ : [
561
+ writtenName(callee),
562
+ receiver === undefined ? undefined : writtenName(receiver),
563
+ ].filter((one) => one !== undefined);
564
+ if (named !== undefined && (stands || callees.length > 0)) {
565
+ found.push({ specifier: argument, named, callees, amd: false });
566
+ }
515
567
  }
516
568
  }
517
569
  node.forEachChild(visit);
@@ -600,8 +652,8 @@ function lineAndColumn(text, offset) {
600
652
  }
601
653
  /** The installed copy of one dependency, read where the package manager puts it for the target. */
602
654
  function installedOf(host, root, name) {
603
- for (let dir = root;; dir = dirnamePath(dir)) {
604
- const read = readJSON(host, joinPath(dir, MODULES_DIR, name, MANIFEST));
655
+ for (const dir of ancestors(root)) {
656
+ const read = readDocument(host, joinPath(dir, INSTALLED_PACKAGES, name, MANIFEST));
605
657
  if (read !== undefined && isRecord(read.value)) {
606
658
  const bin = read.value["bin"];
607
659
  const peers = read.value["peerDependencies"];
@@ -617,10 +669,8 @@ function installedOf(host, root, name) {
617
669
  : [],
618
670
  };
619
671
  }
620
- if (dirnamePath(dir) === dir) {
621
- return undefined;
622
- }
623
672
  }
673
+ return undefined;
624
674
  }
625
675
  /** Every dependency the manifest text at `path` declares, in the order the text writes them. */
626
676
  function declaredIn(text, manifest, path, scope) {
@@ -651,19 +701,6 @@ function declaredIn(text, manifest, path, scope) {
651
701
  export function declarationKey(dependency) {
652
702
  return `${dependency.position.path}\u0000${dependency.name}`;
653
703
  }
654
- /** Every token of every value of one manifest's `scripts` member. */
655
- function scriptTokensOf(manifest) {
656
- const scripts = manifest["scripts"];
657
- const found = new Set();
658
- if (isRecord(scripts)) {
659
- for (const command of Object.values(scripts)) {
660
- if (typeof command === "string") {
661
- scriptTokens(command).forEach((token) => found.add(token));
662
- }
663
- }
664
- }
665
- return found;
666
- }
667
704
  /** Whether a path below the target root lies in the directory `dir` below it, `""` being the root. */
668
705
  function isInside(path, dir) {
669
706
  return dir === "" || path.startsWith(`${dir}/`);
@@ -717,7 +754,7 @@ function addNeededPeers(declared, peers, needed, ran) {
717
754
  * manifest declares nothing, nor does a nested package's uninstalled dependency, because
718
755
  * no run requires a nested package to be installed.
719
756
  */
720
- export function dependenciesOf(host, targetRoot, perProject, candidates, members = [], unbuiltMembers = [], nested = []) {
757
+ export function dependenciesOf(host, targetRoot, workflows, perProject, candidates, members = [], unbuiltMembers = [], nested = []) {
721
758
  const root = resolvePath(host.workingDirectory(), targetRoot);
722
759
  const scopeOf = packageScope(host, targetRoot);
723
760
  const manifests = new Map([[root, MANIFEST]]);
@@ -734,29 +771,35 @@ export function dependenciesOf(host, targetRoot, perProject, candidates, members
734
771
  unbuilt.add(path);
735
772
  }
736
773
  }
737
- const workflow = new Set(workflowTokens(host, targetRoot));
774
+ const workflow = workflowUses(workflows);
738
775
  const declared = [];
739
776
  const ran = new Set();
740
777
  const peers = new Map();
741
778
  const uninstalledHere = new Set(nested);
742
779
  for (const [dir, path] of manifests) {
743
- const read = readJSON(host, joinPath(dir, MANIFEST));
780
+ const read = readDocument(host, joinPath(dir, MANIFEST));
744
781
  if (read === undefined || !isRecord(read.value)) {
745
782
  continue;
746
783
  }
747
- const tokens = scriptTokensOf(read.value);
784
+ const own = manifestUses(host, dir, read.value);
785
+ const held = `${own.held}\n${workflow.held}`;
748
786
  for (const dependency of declaredIn(read.text, read.value, path, scopeOf(path))) {
749
787
  const found = installedOf(host, dir, dependency.name);
750
788
  if (found === undefined && uninstalledHere.has(dir)) {
751
789
  continue;
752
790
  }
753
791
  declared.push(dependency);
792
+ if (own.preloads.has(dependency.name) ||
793
+ workflow.preloads.has(dependency.name) ||
794
+ heldNames(held, [dependency.name]).size > 0) {
795
+ ran.add(declarationKey(dependency));
796
+ }
754
797
  if (found === undefined) {
755
798
  continue;
756
799
  }
757
800
  peers.set(declarationKey(dependency), found.peers);
758
- const runs = (command) => tokens.has(command) || workflow.has(command);
759
- if (found.commands.some(runs)) {
801
+ const runs = (command) => own.words.has(command) || workflow.words.has(command);
802
+ if (found.commands.some(runs) || heldNames(held, found.commands).size > 0) {
760
803
  ran.add(declarationKey(dependency));
761
804
  }
762
805
  }
@@ -812,7 +855,7 @@ export function dependenciesOf(host, targetRoot, perProject, candidates, members
812
855
  const heldBy = new Map();
813
856
  for (const [key, held] of holders) {
814
857
  if (!live.has(key) && !ran.has(key)) {
815
- heldBy.set(key, [...held].sort((a, b) => (a < b ? -1 : 1)));
858
+ heldBy.set(key, [...held].sort(bytewise));
816
859
  }
817
860
  }
818
861
  const users = new Map();
@@ -824,7 +867,7 @@ export function dependenciesOf(host, targetRoot, perProject, candidates, members
824
867
  for (const id of candidates) {
825
868
  const sole = [...(uses.get(id) ?? [])].filter((one) => users.get(one) === 1 && names.has(one));
826
869
  if (sole.length > 0) {
827
- lastUses.set(id, sole.sort((a, b) => (a < b ? -1 : 1)));
870
+ lastUses.set(id, sole.sort(bytewise));
828
871
  }
829
872
  }
830
873
  const owners = new Map();
@@ -836,7 +879,7 @@ export function dependenciesOf(host, targetRoot, perProject, candidates, members
836
879
  }
837
880
  }
838
881
  const fileLastUses = new Map();
839
- for (const [one, held] of [...owners].sort(([a], [b]) => (a < b ? -1 : 1))) {
882
+ for (const [one, held] of [...owners].sort(([a], [b]) => bytewise(a, b))) {
840
883
  const paths = new Set([...held].map((owner) => owner.replace(/:\d+:\d+$/u, "")));
841
884
  const [path] = paths;
842
885
  if (paths.size === 1 && path !== undefined && path !== PROJECT_OWNER) {
@@ -156,8 +156,6 @@ function sourceOf(target) {
156
156
  export function destructuring(project, cap, properties = propertyTables(project.queries)) {
157
157
  const queries = project.queries;
158
158
  const tables = new Map();
159
- let patternBatches = 0;
160
- let patternLookups = 0;
161
159
  const tableOf = (type) => {
162
160
  const known = tables.get(type.id);
163
161
  if (known !== undefined) {
@@ -166,7 +164,6 @@ export function destructuring(project, cap, properties = propertyTables(project.
166
164
  let table = new Map();
167
165
  if ((type.flags & TypeFlags.AnyOrUnknown) === 0) {
168
166
  const read = properties.of(type);
169
- patternLookups += read.asked ? 1 : 0;
170
167
  table = isAnswered(read.properties)
171
168
  ? new Map(read.properties.map((property) => [property.name, property]))
172
169
  : UNANSWERED;
@@ -178,7 +175,6 @@ export function destructuring(project, cap, properties = propertyTables(project.
178
175
  if ((type.flags & TypeFlags.Union) === 0) {
179
176
  return type;
180
177
  }
181
- patternLookups += 1;
182
178
  return queries.nonNullable(type);
183
179
  };
184
180
  /**
@@ -193,11 +189,9 @@ export function destructuring(project, cap, properties = propertyTables(project.
193
189
  if (index === undefined) {
194
190
  return undefined;
195
191
  }
196
- patternLookups += 1;
197
192
  const elements = queries.typeArguments(type);
198
193
  return isAnswered(elements) ? elements[index] : UNANSWERED;
199
194
  }
200
- patternLookups += 1;
201
195
  const array = queries.isArray(type);
202
196
  if (!isAnswered(array)) {
203
197
  return UNANSWERED;
@@ -205,7 +199,6 @@ export function destructuring(project, cap, properties = propertyTables(project.
205
199
  if (!array) {
206
200
  return undefined;
207
201
  }
208
- patternLookups += 1;
209
202
  const elements = queries.typeArguments(type);
210
203
  return isAnswered(elements) ? elements[0] : UNANSWERED;
211
204
  };
@@ -222,14 +215,12 @@ export function destructuring(project, cap, properties = propertyTables(project.
222
215
  if (more.length > 0) {
223
216
  return UNANSWERED;
224
217
  }
225
- patternLookups += 1;
226
218
  return queries.typeOfSymbol(property);
227
219
  };
228
220
  const resultOf = (callee) => {
229
221
  if (callee === undefined || callee === UNANSWERED) {
230
222
  return callee;
231
223
  }
232
- patternLookups += 1;
233
224
  const signatures = queries.signaturesOf(callee, SignatureKind.Call);
234
225
  if (!isAnswered(signatures)) {
235
226
  return UNANSWERED;
@@ -238,7 +229,6 @@ export function destructuring(project, cap, properties = propertyTables(project.
238
229
  if (signature === undefined) {
239
230
  return undefined;
240
231
  }
241
- patternLookups += 1;
242
232
  return queries.returnTypeOf(signature);
243
233
  };
244
234
  const iterations = new Map();
@@ -266,7 +256,6 @@ export function destructuring(project, cap, properties = propertyTables(project.
266
256
  if (result !== undefined && result !== UNANSWERED) {
267
257
  let parts = [result];
268
258
  if (result.isUnionType()) {
269
- patternLookups += 1;
270
259
  parts = queries.constituents(result);
271
260
  }
272
261
  const values = isAnswered(parts)
@@ -296,7 +285,6 @@ export function destructuring(project, cap, properties = propertyTables(project.
296
285
  if (property === undefined) {
297
286
  return undefined;
298
287
  }
299
- patternLookups += 1;
300
288
  return queries.typeOfSymbol(property);
301
289
  }
302
290
  return elementOf(defined, next.index);
@@ -317,7 +305,6 @@ export function destructuring(project, cap, properties = propertyTables(project.
317
305
  }
318
306
  }
319
307
  const asked = [...asking];
320
- patternBatches += Math.ceil(asked.length / cap);
321
308
  const answered = new Map();
322
309
  queries.typesAt(asked, cap).forEach((type, index) => {
323
310
  const node = asked[index];
@@ -347,10 +334,5 @@ export function destructuring(project, cap, properties = propertyTables(project.
347
334
  return isAnswered(table) ? table.get(read.name) : UNANSWERED;
348
335
  });
349
336
  };
350
- return {
351
- resolve,
352
- get cost() {
353
- return { patternBatches, patternLookups };
354
- },
355
- };
337
+ return { resolve };
356
338
  }