@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
@@ -24,121 +24,136 @@ function nameOf(entry) {
24
24
  }
25
25
  return isQualifiedName(entry.typeName) ? entry.typeName.right : entry.typeName;
26
26
  }
27
- /** Each class of the target whose `extends` clause names a class, with the name node. */
28
- function extending(project, held) {
29
- const found = [];
30
- for (const file of project.ownSourceFiles()) {
31
- const visit = (node) => {
32
- if (isClassDeclaration(node) || isClassExpression(node)) {
33
- const id = held.declarations.get(nodeKey(file, node));
34
- const clause = node.heritageClauses?.find((one) => one.token === SyntaxKind.ExtendsKeyword);
35
- const base = clause?.types[0];
36
- if (id !== undefined && base !== undefined) {
37
- found.push({ id, base: nameOf(base) });
38
- }
39
- }
40
- node.forEachChild(visit);
41
- };
42
- file.forEachChild(visit);
43
- }
44
- return found;
45
- }
46
27
  /**
47
- * The references each base class member makes to its overrides, for the classes of one
48
- * project that extend another class of the target, and each class makes to its members
49
- * that override a member of a class declared outside the target. A member a nearer base
50
- * already overrides is reached through that override. A private member is not
51
- * overridden. Each reference is placed at the override and made by its file.
28
+ * The reads each base class member makes of its overrides, for the classes of the target that
29
+ * extend another class of the target, and each class makes of its members that override a
30
+ * member of a class declared outside the target. A member a nearer base already overrides is
31
+ * reached through that override. A private member is not overridden. Each read is placed at
32
+ * the override. A class whose base the checker leaves unanswered holds every member it could
33
+ * override.
52
34
  */
53
- export function overrideReferences(project, held, chains, testFiles) {
54
- const classes = extending(project, held);
55
- if (classes.length === 0) {
56
- return [];
57
- }
58
- const byId = new Map(held.symbols.map((symbol) => [symbol.id, symbol]));
59
- const members = new Map();
60
- for (const symbol of held.symbols) {
61
- const component = memberComponent(symbol, byId);
62
- if (component === undefined ||
63
- !OVERRIDABLE.has(symbol.kind) ||
64
- symbol.visibility === "private" ||
65
- symbol.visibility === "private-name") {
66
- continue;
67
- }
68
- const own = members.get(symbol.parent) ?? new Map();
69
- own.set(component, symbol);
70
- members.set(symbol.parent, own);
71
- }
72
- const bases = new Map();
73
- const outsideBases = new Map();
74
- const own = project.ownPaths();
75
- const symbols = project.symbolsAt(classes.map((one) => project.handle(one.base)));
76
- classes.forEach(({ id }, index) => {
77
- const symbol = symbols[index];
78
- if (symbol !== undefined && symbol !== UNANSWERED) {
79
- const inTarget = chains
80
- .chainOf(symbol)
81
- .map((target) => target.id)
82
- .filter((target) => byId.get(target)?.kind === "class" && target !== id);
83
- bases.set(id, inTarget);
84
- const declared = (symbol.flags & SymbolFlags.Alias) === 0 ? symbol : project.queries.aliased(symbol);
85
- if (inTarget.length === 0 &&
86
- declared !== UNANSWERED &&
87
- (((declared.flags & SymbolFlags.Class) !== 0 &&
88
- // The target's augmentation of an outside class merges an interface into it,
89
- // so only a class declaration says where the class is.
90
- declared.declarations.some((handle) => CLASS_DECLARATIONS.has(handle.kind) && !own.has(handle.path))) ||
91
- ((declared.flags & SymbolFlags.Interface) !== 0 &&
92
- declared.declarations.some((handle) => handle.kind === SyntaxKind.VariableDeclaration && !own.has(handle.path))))) {
93
- outsideBases.set(id, declared);
94
- }
95
- }
96
- });
97
- /** The nearest member of one component the class or a class it extends declares. */
98
- const declaredAbove = (classId, component, seen) => {
99
- if (seen.has(classId)) {
100
- return [];
101
- }
102
- seen.add(classId);
103
- const own = members.get(classId)?.get(component);
104
- if (own !== undefined) {
105
- return [own.id];
106
- }
107
- return (bases.get(classId) ?? []).flatMap((base) => declaredAbove(base, component, seen));
108
- };
109
- const found = [];
110
- const outsideNames = outsideMemberNames(project, bases, outsideBases);
111
- for (const [classId, names] of outsideNames) {
112
- for (const [component, member] of members.get(classId) ?? []) {
113
- if (names.has(component)) {
114
- found.push({
115
- from: classId,
116
- to: member.id,
117
- position: member.position,
118
- use: "read",
119
- resolution: "override",
120
- test: testFiles.has(member.position.path),
35
+ export const overrides = {
36
+ start() {
37
+ const extending = [];
38
+ return {
39
+ visit(node, { file }) {
40
+ if (isClassDeclaration(node) || isClassExpression(node)) {
41
+ const clause = node.heritageClauses?.find((one) => one.token === SyntaxKind.ExtendsKeyword);
42
+ const base = clause?.types[0];
43
+ if (base !== undefined) {
44
+ extending.push({ node, file, base: nameOf(base) });
45
+ }
46
+ }
47
+ },
48
+ reads({ project, held, chains }) {
49
+ const found = [];
50
+ const classes = extending.flatMap((one) => {
51
+ const id = held.declarations.get(nodeKey(one.file, one.node));
52
+ return id === undefined ? [] : [{ ...one, id }];
121
53
  });
122
- }
123
- }
124
- }
125
- for (const [classId, baseIds] of bases) {
126
- for (const [component, member] of members.get(classId) ?? []) {
127
- const seen = new Set([classId]);
128
- for (const base of baseIds.flatMap((one) => declaredAbove(one, component, seen))) {
129
- found.push({
130
- from: base,
131
- to: member.id,
132
- position: member.position,
133
- use: "read",
134
- resolution: "override",
135
- test: testFiles.has(member.position.path),
54
+ if (classes.length === 0) {
55
+ return found;
56
+ }
57
+ const byId = new Map(held.symbols.map((symbol) => [symbol.id, symbol]));
58
+ const members = new Map();
59
+ for (const symbol of held.symbols) {
60
+ const component = memberComponent(symbol, byId);
61
+ if (component === undefined ||
62
+ !OVERRIDABLE.has(symbol.kind) ||
63
+ symbol.visibility === "private" ||
64
+ symbol.visibility === "private-name") {
65
+ continue;
66
+ }
67
+ const own = members.get(symbol.parent) ?? new Map();
68
+ own.set(component, symbol);
69
+ members.set(symbol.parent, own);
70
+ }
71
+ const bases = new Map();
72
+ const outsideBases = new Map();
73
+ const fileOf = new Map(classes.map((one) => [one.id, one.file]));
74
+ const own = project.ownPaths();
75
+ const unanswered = new Set();
76
+ const symbols = project.symbolsAt(classes.map((one) => project.handle(one.base)));
77
+ classes.forEach(({ id }, index) => {
78
+ const symbol = symbols[index];
79
+ if (symbol === UNANSWERED) {
80
+ unanswered.add(id);
81
+ return;
82
+ }
83
+ if (symbol === undefined) {
84
+ return;
85
+ }
86
+ const inTarget = chains
87
+ .chainOf(symbol)
88
+ .map((target) => target.id)
89
+ .filter((target) => byId.get(target)?.kind === "class" && target !== id);
90
+ bases.set(id, inTarget);
91
+ const declared = (symbol.flags & SymbolFlags.Alias) === 0 ? symbol : project.queries.aliased(symbol);
92
+ if (declared === UNANSWERED) {
93
+ unanswered.add(id);
94
+ return;
95
+ }
96
+ if (inTarget.length === 0 &&
97
+ (((declared.flags & SymbolFlags.Class) !== 0 &&
98
+ // The target's augmentation of an outside class merges an interface into it,
99
+ // so only a class declaration says where the class is.
100
+ declared.declarations.some((handle) => CLASS_DECLARATIONS.has(handle.kind) && !own.has(handle.path))) ||
101
+ ((declared.flags & SymbolFlags.Interface) !== 0 &&
102
+ declared.declarations.some((handle) => handle.kind === SyntaxKind.VariableDeclaration && !own.has(handle.path))))) {
103
+ outsideBases.set(id, declared);
104
+ }
136
105
  });
137
- }
138
- }
139
- }
140
- return found;
141
- }
106
+ /** The nearest member of one component the class or a class it extends declares. */
107
+ const declaredAbove = (classId, component, seen) => {
108
+ if (seen.has(classId)) {
109
+ return [];
110
+ }
111
+ seen.add(classId);
112
+ const member = members.get(classId)?.get(component);
113
+ if (member !== undefined) {
114
+ return [member.id];
115
+ }
116
+ return (bases.get(classId) ?? []).flatMap((base) => declaredAbove(base, component, seen));
117
+ };
118
+ const read = (classId, from, member) => {
119
+ const file = fileOf.get(classId);
120
+ if (file !== undefined) {
121
+ found.push({
122
+ kind: "named",
123
+ from,
124
+ to: member.id,
125
+ file,
126
+ at: member.position,
127
+ use: "read",
128
+ via: "override",
129
+ });
130
+ }
131
+ };
132
+ const outside = outsideMemberNames(project, bases, outsideBases);
133
+ for (const classId of [...unanswered, ...outside.unanswered]) {
134
+ const ids = [...(members.get(classId)?.values() ?? [])].map((member) => member.id);
135
+ found.push({ kind: "held", from: classId, ids });
136
+ }
137
+ for (const [classId, names] of outside.names) {
138
+ for (const [component, member] of members.get(classId) ?? []) {
139
+ if (names.has(component)) {
140
+ read(classId, classId, member);
141
+ }
142
+ }
143
+ }
144
+ for (const [classId, baseIds] of bases) {
145
+ for (const [component, member] of members.get(classId) ?? []) {
146
+ const seen = new Set([classId]);
147
+ for (const base of baseIds.flatMap((one) => declaredAbove(one, component, seen))) {
148
+ read(classId, base, member);
149
+ }
150
+ }
151
+ }
152
+ return found;
153
+ },
154
+ };
155
+ },
156
+ };
142
157
  /**
143
158
  * Per class of the target with a class declared outside the target in its `extends`
144
159
  * chain, the member components that outside class's instances and constructor carry, a
@@ -146,10 +161,17 @@ export function overrideReferences(project, held, chains, testFiles) {
146
161
  */
147
162
  function outsideMemberNames(project, bases, outsideBases) {
148
163
  const direct = new Map();
164
+ const unanswered = [];
149
165
  const error = errorType(project);
150
166
  for (const [classId, base] of outsideBases) {
151
167
  const instance = project.queries.declaredTypeOf(base);
152
168
  const statics = project.queries.typeOfSymbol(base);
169
+ if (instance === UNANSWERED ||
170
+ statics === UNANSWERED ||
171
+ project.queries.propertiesOf(instance) === UNANSWERED ||
172
+ (statics !== undefined && project.queries.propertiesOf(statics) === UNANSWERED)) {
173
+ unanswered.push(classId);
174
+ }
153
175
  const components = [
154
176
  ...namesOf(project, instance === UNANSWERED ? undefined : instance).map(nameComponent),
155
177
  ...(instance !== UNANSWERED && reaches(project, instance, error) ? ["toString"] : []),
@@ -176,7 +198,7 @@ function outsideMemberNames(project, bases, outsideBases) {
176
198
  names.set(classId, found);
177
199
  }
178
200
  }
179
- return names;
201
+ return { names, unanswered };
180
202
  }
181
203
  /** The global `Error` instance type's identifier, where the program's library declares one. */
182
204
  function errorType(project) {
@@ -1,4 +1,5 @@
1
1
  import { relativePath } from "./paths.js";
2
+ import { bytewise } from "./text/compare.js";
2
3
  /** A count with its noun, so a line reads for one as well as for several. */
3
4
  function counted(n, one, many) {
4
5
  return `${String(n)} ${n === 1 ? one : many}`;
@@ -10,7 +11,7 @@ function counted(n, one, many) {
10
11
  */
11
12
  export function partialNotes(partial) {
12
13
  const notes = [...partial.notBuilt]
13
- .sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
14
+ .sort((a, b) => bytewise(a.id, b.id))
14
15
  .map((one) => `the derived configuration ${one.id} was not built and is not analyzed: ${one.error}`);
15
16
  if (partial.unanswered.length > 0) {
16
17
  const byProject = new Map();
package/dist/src/paths.js CHANGED
@@ -1,17 +1,57 @@
1
1
  /**
2
- * Filesystem paths, as the supported platform spells them: a solidus separates
3
- * segments and a leading solidus makes a path absolute.
4
- *
5
- * They are written here rather than taken from the platform's own library because
6
- * every module below the command line stays free of the platform, and because the
7
- * supported platform set is one, so a second spelling would be a rule nothing
8
- * exercises.
2
+ * Filesystem paths as the supported platform spells them: a solidus between segments, a
3
+ * leading one for an absolute path. They are written here rather than taken from the
4
+ * platform's library so every module below the command line stays free of the platform.
9
5
  */
10
6
  const SEPARATOR = "/";
11
7
  /** Whether one path names a place without a directory to resolve it against. */
12
8
  export function isAbsolutePath(path) {
13
9
  return path.startsWith(SEPARATOR);
14
10
  }
11
+ /** Whether a specifier starts a path relative to the file that writes it: `./` or `../`. */
12
+ export function startsRelativePath(specifier) {
13
+ return specifier.startsWith("./") || specifier.startsWith("../");
14
+ }
15
+ /** Whether a specifier names a path relative to the file that writes it: `.`, `..`, `./` or `../` first. */
16
+ export function isRelativeSpecifier(specifier) {
17
+ return specifier === "." || specifier === ".." || startsRelativePath(specifier);
18
+ }
19
+ /**
20
+ * Whether a module specifier names a path rather than a package, as the compiler reads one:
21
+ * a relative specifier or an absolute path.
22
+ */
23
+ export function isPathSpecifier(specifier) {
24
+ return isRelativeSpecifier(specifier) || isAbsolutePath(specifier);
25
+ }
26
+ /**
27
+ * Whether a string starts with `./`, `../` or `/`, the specifiers a browser reads as a URL
28
+ * rather than a bare name, so a bare `.` or `..` stays a request:
29
+ * https://html.spec.whatwg.org/multipage/webappapis.html#resolve-a-url-like-module-specifier
30
+ */
31
+ export function isExplicitPath(text) {
32
+ return startsRelativePath(text) || isAbsolutePath(text);
33
+ }
34
+ /**
35
+ * Whether a string starts with `.` or `/`, which no npm package name does, so a reader that
36
+ * takes any other string as a package's takes it as a path:
37
+ * https://docs.npmjs.com/cli/v11/configuring-npm/package-json#name
38
+ */
39
+ export function cannotStartPackageName(text) {
40
+ return text.startsWith(".") || isAbsolutePath(text);
41
+ }
42
+ /** A URL scheme, `file:` and `node:` among them: https://url.spec.whatwg.org/#url-scheme-string */
43
+ const URL_SCHEME = /^[a-z][a-z\d+.-]*:/iu;
44
+ /** Whether a string starts with a URL scheme. */
45
+ export function hasURLScheme(text) {
46
+ return URL_SCHEME.test(text);
47
+ }
48
+ /**
49
+ * Whether a URL reference is a relative one that does not start with a solidus, the bare
50
+ * name included: https://url.spec.whatwg.org/#relative-url-string
51
+ */
52
+ export function isPathRelativeURL(reference) {
53
+ return reference !== "" && !reference.startsWith(SEPARATOR) && !hasURLScheme(reference);
54
+ }
15
55
  /**
16
56
  * One path with `.` removed, `..` applied to the segment before it, and repeated
17
57
  * separators collapsed. A `..` that walks past the root of an absolute path is
@@ -61,6 +101,24 @@ export function dirnamePath(path) {
61
101
  }
62
102
  return cut === 0 ? SEPARATOR : normalized.slice(0, cut);
63
103
  }
104
+ /**
105
+ * `dir` and every directory above it, nearest first, normalized. With `top`, the list ends
106
+ * at `top` and is empty where `dir` is neither `top` nor below it; without, it ends at the
107
+ * root of the path.
108
+ */
109
+ export function ancestors(dir, top) {
110
+ const end = top === undefined ? undefined : normalizePath(top);
111
+ const found = [];
112
+ for (let at = normalizePath(dir);; at = dirnamePath(at)) {
113
+ if (end !== undefined && at !== end && relativePath(end, at) === undefined) {
114
+ return [];
115
+ }
116
+ found.push(at);
117
+ if (at === end || dirnamePath(at) === at) {
118
+ return found;
119
+ }
120
+ }
121
+ }
64
122
  /**
65
123
  * The extension of one path's last segment, from its last full stop, or the empty string
66
124
  * where it has none. A segment that only starts with a full stop has none.
@@ -74,6 +132,17 @@ export function extensionOf(path) {
74
132
  export function resolvePath(against, path) {
75
133
  return isAbsolutePath(path) ? normalizePath(path) : joinPath(against, path);
76
134
  }
135
+ /**
136
+ * The path a relative URL reference names against `dir`, its query and its fragment
137
+ * removed, which name no part of the file; undefined where the reference is not relative.
138
+ */
139
+ export function relativeURLPath(dir, reference) {
140
+ if (!isPathRelativeURL(reference)) {
141
+ return undefined;
142
+ }
143
+ const cut = reference.search(/[?#]/u);
144
+ return resolvePath(dir, cut < 0 ? reference : reference.slice(0, cut));
145
+ }
77
146
  /**
78
147
  * The relative path before the query of a relative module specifier such as
79
148
  * `./worker.ts?worker`, the module a bundler loads; undefined for a specifier with no
@@ -82,7 +151,7 @@ export function resolvePath(against, path) {
82
151
  */
83
152
  export function queriedModulePath(specifier) {
84
153
  const query = specifier.indexOf("?");
85
- if (query < 0 || !(specifier.startsWith("./") || specifier.startsWith("../"))) {
154
+ if (query < 0 || !startsRelativePath(specifier)) {
86
155
  return undefined;
87
156
  }
88
157
  const raw = specifier
@@ -92,14 +161,11 @@ export function queriedModulePath(specifier) {
92
161
  return raw ? undefined : specifier.slice(0, query);
93
162
  }
94
163
  /**
95
- * One path as it reads below a root, or undefined when it is not below the root.
96
- * Both are normalized first, so a root written with a trailing separator or a `.`
97
- * segment reaches the same answer, and the comparison is then lexical, so a root
98
- * and a path spelled through different symbolic links name nothing in common. The
99
- * root itself is not below itself.
100
- *
101
- * The caller resolves both against the same directory before calling: a relative
102
- * root and an absolute path are two spellings this cannot reconcile.
164
+ * One path as it reads below a root, or undefined when it is not strictly below the root:
165
+ * the root itself is not below itself. Both are normalized, then compared lexically, so a
166
+ * root and a path spelled through different symbolic links name nothing in common. The
167
+ * caller resolves both against the same directory first: a relative root and an absolute
168
+ * path cannot be reconciled.
103
169
  */
104
170
  export function relativePath(root, path) {
105
171
  const at = normalizePath(root);
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Which calls are the platform's `require` or AMD's `define` and which constructions its `URL`
3
+ * (roots.23, references-ts.37, references-ts.1), decided once over the bindings of the names a callee is written with: the
4
+ * checker's in a program, the file's own scopes in a module read outside every program.
5
+ */
6
+ import { isBindingElement, isCallExpression, isExportSpecifier, isIdentifier, isImportSpecifier, isPropertyAccessExpression, isStringLiteral, isVariableDeclaration, } from "@typescript/native/ast";
7
+ import { parenthesesRemoved, unwrapped } from "./unwrap.js";
8
+ /** The name one declaration carries a binding by beside its own: the export an import or a re-export names, or the property a destructuring reads. */
9
+ export function carriedNames(node) {
10
+ if (isImportSpecifier(node) || isExportSpecifier(node)) {
11
+ return [(node.propertyName ?? node.name).text];
12
+ }
13
+ const property = isBindingElement(node) ? node.propertyName : undefined;
14
+ return property !== undefined && (isIdentifier(property) || isStringLiteral(property))
15
+ ? [property.text]
16
+ : [];
17
+ }
18
+ /**
19
+ * A written name's binding as a file states it, with no checker to ask, so nothing is
20
+ * proven the target's own (conventions.3): `declarationOf` names the declaration a name
21
+ * resolves to, and a property is read by how it is written alone.
22
+ */
23
+ export function lexicalBinding(declarationOf) {
24
+ return (written) => {
25
+ const parent = written.parent;
26
+ if (isPropertyAccessExpression(parent) && parent.name === written) {
27
+ return undefined;
28
+ }
29
+ const declaration = declarationOf(written);
30
+ return {
31
+ names: new Set([
32
+ written.text,
33
+ ...(declaration === undefined ? [] : carriedNames(declaration)),
34
+ ]),
35
+ own: declaration === undefined ? [] : [declaration],
36
+ provenOwn: false,
37
+ };
38
+ };
39
+ }
40
+ /** The name a callee or a constructor is written with, parentheses removed: an identifier or a property name. */
41
+ export function writtenName(expression) {
42
+ const at = parenthesesRemoved(expression);
43
+ if (isIdentifier(at)) {
44
+ return at;
45
+ }
46
+ return isPropertyAccessExpression(at) && isIdentifier(at.name) ? at.name : undefined;
47
+ }
48
+ /**
49
+ * Whether a call or construction through `callee` is one of the platform's `name`: never
50
+ * where its binding is proven the target's own; otherwise where it is written or carried
51
+ * by that name, or resolves to a variable of the target whose initializer is such a
52
+ * callee or, for `require`, a call of a `createRequire`. A callee nothing binds is read by
53
+ * how it is written.
54
+ */
55
+ export function callsPlatformBy(name, callee, bindingOf, seen = new Set()) {
56
+ const bound = bindingOf(callee);
57
+ if (bound?.provenOwn === true) {
58
+ return false;
59
+ }
60
+ if (callee.text === name || bound?.names.has(name) === true) {
61
+ return true;
62
+ }
63
+ return (bound?.own ?? []).some((node) => {
64
+ if (seen.has(node) || !isVariableDeclaration(node) || node.initializer === undefined) {
65
+ return false;
66
+ }
67
+ seen.add(node);
68
+ const value = unwrapped(node.initializer);
69
+ if (isCallExpression(value)) {
70
+ const called = writtenName(value.expression);
71
+ return (name === "require" &&
72
+ called !== undefined &&
73
+ callsPlatformBy("createRequire", called, bindingOf, seen));
74
+ }
75
+ const written = writtenName(value);
76
+ return written !== undefined && callsPlatformBy(name, written, bindingOf, seen);
77
+ });
78
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * The platform's names read through a program's checker: its `require` and `URL`, as
3
+ * `platform-calls.ts` decides them, its worker constructors and `navigator`, and Node's
4
+ * `Worker`.
5
+ */
6
+ import { isArrowFunction, isClassDeclaration, isClassExpression, isFunctionDeclaration, isFunctionExpression, isMethodDeclaration, isModuleDeclaration, isPropertyAssignment, isPropertyDeclaration, isSourceFile, isStringLiteralLikeNode, isVariableDeclaration, } from "@typescript/native/ast";
7
+ import { SymbolFlags } from "@typescript/native/sync";
8
+ import { UNANSWERED } from "./query.js";
9
+ import { boundExports, NAMESPACE } from "./entries/static-module.js";
10
+ import { isAmbient } from "./inventory.js";
11
+ import { callsPlatformBy, carriedNames } from "./platform-calls.js";
12
+ import { unwrapped } from "./unwrap.js";
13
+ /** The symbol one symbol names through its aliases, or the symbol itself where it is none. */
14
+ function dealiased(project, symbol) {
15
+ if ((symbol.flags & SymbolFlags.Alias) === 0) {
16
+ return symbol;
17
+ }
18
+ return project.queries.aliased(symbol);
19
+ }
20
+ /** Each declaration of `symbol` in a file of the target, read in this project's program. */
21
+ function ownDeclarations(project, symbol) {
22
+ const own = project.ownPaths();
23
+ return symbol.declarations.flatMap((handle) => {
24
+ const node = own.has(handle.path) ? project.declarationAt(handle)?.node : undefined;
25
+ return node === undefined ? [] : [node];
26
+ });
27
+ }
28
+ /**
29
+ * Whether one declaration writes a function or a class with a body (roots.23): a function
30
+ * or method declaration with a body, a class declaration, or a variable, a property or a
31
+ * class field whose initializer is a function, an arrow function or a class expression,
32
+ * under no `declare` modifier and in no declaration file.
33
+ */
34
+ function writesBody(node) {
35
+ const value = (isVariableDeclaration(node) || isPropertyAssignment(node) || isPropertyDeclaration(node)) &&
36
+ node.initializer !== undefined
37
+ ? unwrapped(node.initializer)
38
+ : node;
39
+ return ((isFunctionDeclaration(value) || isMethodDeclaration(value)
40
+ ? value.body !== undefined
41
+ : isFunctionExpression(value) ||
42
+ isArrowFunction(value) ||
43
+ isClassDeclaration(value) ||
44
+ isClassExpression(value)) && !isAmbient(value.getSourceFile(), value));
45
+ }
46
+ /**
47
+ * What the checker binds `symbol` to, one alias step at a time: every name a step of the
48
+ * chain carries it by, and the declarations of the target its last step reaches, which
49
+ * prove it the target's own where one {@link writesBody}. A chain that ends at no
50
+ * declaration, or that the checker leaves unanswered, reaches none.
51
+ */
52
+ function boundBy(project, symbol) {
53
+ if (typeof symbol !== "object") {
54
+ return undefined;
55
+ }
56
+ const names = new Set();
57
+ const stepped = new Set();
58
+ for (let at = symbol; at !== undefined && !stepped.has(at.id);) {
59
+ stepped.add(at.id);
60
+ names.add(at.name);
61
+ const own = ownDeclarations(project, at);
62
+ for (const node of own) {
63
+ carriedNames(node).forEach((one) => names.add(one));
64
+ }
65
+ if ((at.flags & SymbolFlags.Alias) === 0) {
66
+ return { names, own, provenOwn: own.some(writesBody) };
67
+ }
68
+ const next = project.aliasStepOf(at);
69
+ at = typeof next === "object" ? next : undefined;
70
+ }
71
+ return { names, own: [], provenOwn: false };
72
+ }
73
+ /** Each written name's binding, as this project's checker answers it. */
74
+ function checkerBinding(project) {
75
+ return (written) => boundBy(project, project.symbolsAt([project.handle(written)])[0]);
76
+ }
77
+ /**
78
+ * Whether a call or construction through `callee`, the batch's answer for which is `symbol`,
79
+ * is one of the platform's `require`, AMD's `define` or `URL` (roots.23, references-ts.37,
80
+ * references-ts.1), as {@link callsPlatformBy} decides it over this project's checker.
81
+ */
82
+ export function callsPlatform(project, name, callee, symbol) {
83
+ const others = checkerBinding(project);
84
+ return callsPlatformBy(name, callee, (written) => written === callee ? boundBy(project, symbol) : others(written));
85
+ }
86
+ /**
87
+ * Whether a worker's constructor or `navigator`, the batch's answer for which is `symbol`, is
88
+ * the platform's (references-ts.2): a name the checker leaves unanswered, or one whose symbol
89
+ * is no alias and has a declaration outside the target's files.
90
+ */
91
+ export function isPlatformGlobal(project, symbol) {
92
+ if (symbol === UNANSWERED) {
93
+ return true;
94
+ }
95
+ const own = project.ownPaths();
96
+ return (symbol !== undefined &&
97
+ (symbol.flags & SymbolFlags.Alias) === 0 &&
98
+ symbol.declarations.some((handle) => !own.has(handle.path)));
99
+ }
100
+ /** The module names Node's worker threads are imported by. */
101
+ const THREADS = new Set(["worker_threads", "node:worker_threads"]);
102
+ function namesThreads(node) {
103
+ return node !== undefined && isStringLiteralLikeNode(node) && THREADS.has(node.text);
104
+ }
105
+ /** Whether one declaration is written in the body of `declare module "worker_threads"`. */
106
+ function inThreadsModule(node) {
107
+ for (let at = node; !isSourceFile(at); at = at.parent) {
108
+ if (isModuleDeclaration(at) && namesThreads(at.name)) {
109
+ return true;
110
+ }
111
+ }
112
+ return false;
113
+ }
114
+ /**
115
+ * Whether a `Worker` constructor, the batch's answer for which is `symbol`, is Node's
116
+ * (references-ts.2): its symbol resolves to a declaration of `worker_threads`, or one of its
117
+ * own declarations binds the module's `Worker`, or `holder`, the namespace it is read
118
+ * through, binds the module, each binding read as {@link boundExports} reads one, which
119
+ * decides where the module has no declaration.
120
+ */
121
+ export function startsThread(project, symbol, holder) {
122
+ const bindingOf = checkerBinding(project);
123
+ const declared = (one, member) => typeof one === "object" &&
124
+ ownDeclarations(project, one).some((node) => boundExports(node, (specifier) => THREADS.has(specifier), bindingOf).includes(member));
125
+ if (declared(symbol, "Worker") || declared(holder, NAMESPACE)) {
126
+ return true;
127
+ }
128
+ const named = typeof symbol === "object" ? dealiased(project, symbol) : undefined;
129
+ return (typeof named === "object" &&
130
+ named.declarations.some((handle) => {
131
+ const node = project.declarationAt(handle)?.node;
132
+ return node !== undefined && inThreadsModule(node);
133
+ }));
134
+ }