@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
@@ -0,0 +1,54 @@
1
+ import { LANGUAGE_ROWS } from "./contract/contract.generated.ts";
2
+ import { globExpression } from "./text/glob.ts";
3
+
4
+ export const JAVASCRIPT_FILE = /\.(?:js|jsx|mjs|cjs)$/u;
5
+
6
+ /** The patterns the TypeScript row of `languages.json` skips files by, each matched against a name alone. */
7
+ const MINIFIED_NAMES = LANGUAGE_ROWS.ts.skippedFiles.map((pattern) => ({
8
+ pattern,
9
+ expression: globExpression(pattern),
10
+ }));
11
+ const MINIFIED_BYTES = 10_240;
12
+ const MINIFIED_LINE = 500;
13
+
14
+ /** What a minified file is decided by where its text is not read. */
15
+ const LONG_LINES = "long lines";
16
+
17
+ /** The skipped-file pattern one file's name matches, which decides it minified without its text. */
18
+ export function minifiedByName(fileName: string): string | undefined {
19
+ const name = fileName.slice(fileName.lastIndexOf("/") + 1);
20
+ return MINIFIED_NAMES.find((one) => one.expression.test(name))?.pattern;
21
+ }
22
+
23
+ /**
24
+ * What decides one JavaScript file minified: the skipped-file pattern its name matches, or
25
+ * {@link LONG_LINES} for a text of the size whose mean line is longer than the limit;
26
+ * undefined for a file that is not minified.
27
+ */
28
+ export function minifiedBy(fileName: string, text: string): string | undefined {
29
+ if (!JAVASCRIPT_FILE.test(fileName)) {
30
+ return undefined;
31
+ }
32
+ const named = minifiedByName(fileName);
33
+ if (named !== undefined) {
34
+ return named;
35
+ }
36
+ // A UTF-16 unit encodes to at most three UTF-8 bytes, so a shorter text is below the size.
37
+ if (text.length * 3 < MINIFIED_BYTES) {
38
+ return undefined;
39
+ }
40
+ const lines = text.split(/\r?\n/u).length;
41
+ return utf8Bytes(text) >= MINIFIED_BYTES && text.length / lines > MINIFIED_LINE
42
+ ? LONG_LINES
43
+ : undefined;
44
+ }
45
+
46
+ /** The length of a text in UTF-8, a lone surrogate counting as the three bytes of U+FFFD. */
47
+ function utf8Bytes(text: string): number {
48
+ let bytes = 0;
49
+ for (const character of text) {
50
+ const point = character.codePointAt(0) ?? 0;
51
+ bytes += point < 0x80 ? 1 : point < 0x800 ? 2 : point < 0x10000 ? 3 : 4;
52
+ }
53
+ return bytes;
54
+ }
@@ -1,122 +1,276 @@
1
+ import type { Position } from "./position.ts";
2
+
3
+ /** A place inside a document: each member name a string, each array index a number. */
4
+ export type Place = readonly (string | number)[];
5
+
1
6
  /**
2
- * A read of a strict JSON document beside its parse: what a parse into a value cannot
3
- * report, the offset of each record of one array and a member written twice.
7
+ * A text that is not one strict JSON document: a syntax error, data after the value, a
8
+ * member one object writes twice, or nesting past {@link MAX_DEPTH}. `place` is the
9
+ * value the fault is in, followed by the member written twice.
4
10
  */
11
+ export class StrictJSONError extends Error {
12
+ readonly offset: number;
13
+ readonly place: Place;
5
14
 
6
- import type { Position } from "./position.ts";
15
+ constructor(reason: string, offset: number, place: Place) {
16
+ super(reason);
17
+ this.name = "StrictJSONError";
18
+ this.offset = offset;
19
+ this.place = place;
20
+ }
21
+ }
7
22
 
8
- /** The token walk over a document `JSON.parse` accepted, so every token is well formed. */
9
- class Walk {
10
- readonly starts: number[] = [];
11
- /** The member written twice, where one is, as the offset of its name. */
12
- twice: { readonly name: string; readonly offset: number } | undefined;
13
- private readonly text: string;
14
- private readonly array: string;
23
+ /** One strict JSON document, read whole. */
24
+ interface StrictDocument {
25
+ readonly value: unknown;
26
+ /**
27
+ * The text of every number written with a fraction or an exponent, by its JSON
28
+ * Pointer: a value reads `100.0` as the integer 100, so only the text tells them apart.
29
+ */
30
+ readonly fractions: ReadonlyMap<string, string>;
31
+ /**
32
+ * The offset of each value inside the top-level member a read names, by its index or
33
+ * its member name, in document order.
34
+ */
35
+ readonly starts: ReadonlyMap<string | number, number>;
36
+ }
37
+
38
+ /**
39
+ * How deep values may nest. A document this analyzer reads nests a few levels, and a
40
+ * bound turns a document built to exhaust the stack into a refusal.
41
+ */
42
+ const MAX_DEPTH = 1000;
43
+
44
+ const SPACE = /[ \t\n\r]*/uy;
45
+ const STRING =
46
+ /"(?:[ !#$%&'()*+,\-./0-9:;<=>?@A-Z[\]-\u{10FFFF}]|\\(?:["\\/bfnrt]|u[0-9A-Fa-f]{4}))*"/uy;
47
+ const NUMBER = /-?(?:0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?/uy;
48
+ const LITERALS: ReadonlyMap<string, unknown> = new Map<string, unknown>([
49
+ ["true", true],
50
+ ["false", false],
51
+ ["null", null],
52
+ ]);
53
+
54
+ /** One member name spelled as a JSON Pointer token. */
55
+ const escaped = (name: string): string => name.replaceAll("~", "~0").replaceAll("/", "~1");
56
+
57
+ /** The member names and indexes a JSON Pointer holds, unescaped. */
58
+ export function pointerSegments(pointer: string): string[] {
59
+ return pointer === ""
60
+ ? []
61
+ : pointer
62
+ .slice(1)
63
+ .split("/")
64
+ .map((token) => token.replaceAll("~1", "/").replaceAll("~0", "~"));
65
+ }
66
+
67
+ /** The JSON Pointer of a place written as segments. */
68
+ export function pointerOf(segments: readonly string[]): string {
69
+ return segments.map((segment) => `/${escaped(segment)}`).join("");
70
+ }
71
+
72
+ /**
73
+ * The place a JSON Pointer names inside `value`, followed by `member` where it is not
74
+ * empty: a pointer's text does not say whether a segment of digits is an index, so the
75
+ * value it points into does.
76
+ */
77
+ export function placeIn(value: unknown, pointer: string, member = ""): (string | number)[] {
78
+ const place: (string | number)[] = [];
79
+ let held = value;
80
+ for (const segment of pointerSegments(pointer)) {
81
+ if (Array.isArray(held)) {
82
+ place.push(Number(segment));
83
+ held = held[Number(segment)];
84
+ } else {
85
+ place.push(segment);
86
+ held = isRecord(held) ? held[segment] : undefined;
87
+ }
88
+ }
89
+ return member === "" ? place : [...place, member];
90
+ }
91
+
92
+ /**
93
+ * A place as a refusal names it: member names joined by full stops and an index in
94
+ * square brackets, as `ts.serializers[0].returns`.
95
+ */
96
+ export function dotted(place: Place): string {
97
+ let path = "";
98
+ for (const segment of place) {
99
+ path +=
100
+ typeof segment === "number" ? `[${String(segment)}]` : path === "" ? segment : `.${segment}`;
101
+ }
102
+ return path;
103
+ }
104
+
105
+ class Reader {
15
106
  private at = 0;
107
+ private readonly path: (string | number)[] = [];
108
+ readonly fractions = new Map<string, string>();
109
+ readonly starts = new Map<string | number, number>();
110
+ private readonly text: string;
111
+ private readonly records: string | undefined;
16
112
 
17
- constructor(text: string, array: string) {
113
+ constructor(text: string, records: string | undefined) {
18
114
  this.text = text;
19
- this.array = array;
115
+ this.records = records;
20
116
  }
21
117
 
22
- run(): void {
23
- this.value("document");
118
+ read(): unknown {
119
+ const value = this.value(0);
120
+ this.match(SPACE);
121
+ if (this.at < this.text.length) {
122
+ this.fail("data follows the document's value");
123
+ }
124
+ return value;
24
125
  }
25
126
 
26
- private skip(): void {
27
- while (/[ \t\r\n]/u.test(this.text[this.at] ?? "")) {
28
- this.at += 1;
29
- }
127
+ private fail(reason: string, offset = this.at, member = ""): never {
128
+ throw new StrictJSONError(
129
+ reason,
130
+ offset,
131
+ member === "" ? [...this.path] : [...this.path, member],
132
+ );
30
133
  }
31
134
 
32
- private string(): string {
33
- const start = this.at;
34
- this.at += 1;
35
- while (this.text[this.at] !== '"') {
36
- this.at += this.text[this.at] === "\\" ? 2 : 1;
135
+ private match(pattern: RegExp): string | undefined {
136
+ pattern.lastIndex = this.at;
137
+ const found = pattern.exec(this.text)?.[0];
138
+ this.at = found === undefined ? this.at : pattern.lastIndex;
139
+ return found;
140
+ }
141
+
142
+ private expect(char: string, what: string): void {
143
+ this.match(SPACE);
144
+ if (this.text[this.at] !== char) {
145
+ this.fail(`${what} is expected`);
37
146
  }
38
147
  this.at += 1;
39
- return JSON.parse(this.text.slice(start, this.at)) as string;
40
148
  }
41
149
 
42
- private value(role: "document" | "array" | "record" | "other"): void {
43
- this.skip();
44
- if (role === "record") {
45
- this.starts.push(this.at);
150
+ private value(depth: number): unknown {
151
+ this.match(SPACE);
152
+ if (depth > MAX_DEPTH) {
153
+ this.fail(`values nest deeper than ${String(MAX_DEPTH)} levels`);
46
154
  }
47
155
  const char = this.text[this.at];
48
156
  if (char === "{") {
49
- this.object(role);
50
- } else if (char === "[") {
51
- this.list(role === "array" ? "record" : "other");
52
- } else if (char === '"') {
53
- this.string();
54
- } else {
55
- while (this.at < this.text.length && !/[,\]} \t\r\n]/u.test(this.text[this.at] ?? "")) {
56
- this.at += 1;
157
+ return this.object(depth);
158
+ }
159
+ if (char === "[") {
160
+ return this.array(depth);
161
+ }
162
+ const string = this.match(STRING);
163
+ if (string !== undefined) {
164
+ return JSON.parse(string) as string;
165
+ }
166
+ NUMBER.lastIndex = this.at;
167
+ const number = NUMBER.exec(this.text);
168
+ if (number !== null) {
169
+ this.at = NUMBER.lastIndex;
170
+ if (number[1] !== undefined || number[2] !== undefined) {
171
+ this.fractions.set(pointerOf(this.path.map(String)), number[0]);
57
172
  }
173
+ return Number(number[0]);
58
174
  }
175
+ for (const [literal, held] of LITERALS) {
176
+ if (this.text.startsWith(literal, this.at)) {
177
+ this.at += literal.length;
178
+ return held;
179
+ }
180
+ }
181
+ return this.fail(
182
+ char === undefined ? "the document ends where a value is expected" : "a value is expected",
183
+ );
59
184
  }
60
185
 
61
- private object(role: string): void {
62
- const seen = new Set<string>();
186
+ private object(depth: number): Record<string, unknown> {
187
+ const held: Record<string, unknown> = {};
63
188
  this.at += 1;
189
+ this.match(SPACE);
190
+ if (this.text[this.at] === "}") {
191
+ this.at += 1;
192
+ return held;
193
+ }
64
194
  for (;;) {
65
- this.skip();
66
- if (this.text[this.at] === "}") {
67
- this.at += 1;
68
- return;
195
+ this.match(SPACE);
196
+ const offset = this.at;
197
+ const spelled = this.match(STRING);
198
+ if (spelled === undefined) {
199
+ return this.fail("a member name is expected");
69
200
  }
70
- if (this.text[this.at] === ",") {
71
- this.at += 1;
72
- this.skip();
201
+ const name = JSON.parse(spelled) as string;
202
+ if (Object.hasOwn(held, name)) {
203
+ this.fail(
204
+ `the member ${JSON.stringify(name)} is written twice, so neither value is chosen`,
205
+ offset,
206
+ name,
207
+ );
73
208
  }
74
- const offset = this.at;
75
- const name = this.string();
76
- if (seen.has(name) && this.twice === undefined) {
77
- this.twice = { name, offset };
209
+ this.expect(":", "a colon after the member name");
210
+ if (depth === 1 && this.path[0] === this.records) {
211
+ this.match(SPACE);
212
+ this.starts.set(name, this.at);
78
213
  }
79
- seen.add(name);
80
- this.skip();
214
+ this.path.push(name);
215
+ Object.defineProperty(held, name, {
216
+ value: this.value(depth + 1),
217
+ enumerable: true,
218
+ writable: true,
219
+ configurable: true,
220
+ });
221
+ this.path.pop();
222
+ this.match(SPACE);
223
+ const next = this.text[this.at];
81
224
  this.at += 1;
82
- this.value(role === "document" && name === this.array ? "array" : "other");
225
+ if (next === "}") {
226
+ return held;
227
+ }
228
+ if (next !== ",") {
229
+ this.at -= 1;
230
+ this.fail("a comma or a closing brace is expected");
231
+ }
83
232
  }
84
233
  }
85
234
 
86
- private list(element: "record" | "other"): void {
235
+ private array(depth: number): unknown[] {
236
+ const held: unknown[] = [];
237
+ const records = depth === 1 && this.path[0] === this.records;
87
238
  this.at += 1;
239
+ this.match(SPACE);
240
+ if (this.text[this.at] === "]") {
241
+ this.at += 1;
242
+ return held;
243
+ }
88
244
  for (;;) {
89
- this.skip();
90
- if (this.text[this.at] === "]") {
91
- this.at += 1;
92
- return;
245
+ this.match(SPACE);
246
+ if (records) {
247
+ this.starts.set(held.length, this.at);
248
+ }
249
+ this.path.push(held.length);
250
+ held.push(this.value(depth + 1));
251
+ this.path.pop();
252
+ this.match(SPACE);
253
+ const next = this.text[this.at];
254
+ this.at += 1;
255
+ if (next === "]") {
256
+ return held;
93
257
  }
94
- if (this.text[this.at] === ",") {
95
- this.at += 1;
258
+ if (next !== ",") {
259
+ this.at -= 1;
260
+ this.fail("a comma or a closing bracket is expected");
96
261
  }
97
- this.value(element);
98
262
  }
99
263
  }
100
264
  }
101
265
 
102
- /** What a walk of one document found. */
103
- interface DocumentWalk {
104
- /** The offset of each element of the document's array member, in order: an object's `{`. */
105
- readonly starts: readonly number[];
106
- /** The first member one object writes twice, at any depth, as the offset of its name. */
107
- readonly twice: { readonly name: string; readonly offset: number } | undefined;
108
- }
109
-
110
266
  /**
111
- * Walks a document `JSON.parse` accepted, whose top-level member `array` holds the
112
- * records. A member one object writes twice reads as though it were written once, its
113
- * later value silently replacing the earlier one, so a document holding one is one a
114
- * reader names rather than reads.
267
+ * Reads `text` as one strict JSON document, or throws a {@link StrictJSONError}.
268
+ * `records` names the top-level member whose values' offsets the read keeps.
115
269
  */
116
- export function walkDocument(text: string, array: string): DocumentWalk {
117
- const walk = new Walk(text, array);
118
- walk.run();
119
- return { starts: walk.starts, twice: walk.twice };
270
+ export function readStrict(text: string, records?: string): StrictDocument {
271
+ const reader = new Reader(text, records);
272
+ const value = reader.read();
273
+ return { value, fractions: reader.fractions, starts: reader.starts };
120
274
  }
121
275
 
122
276
  /**
@@ -128,3 +282,14 @@ export function positionAt(text: string, file: string, offset: number): Position
128
282
  const lineStart = before.lastIndexOf("\n") + 1;
129
283
  return { path: file, line: before.split("\n").length, column: offset - lineStart + 1 };
130
284
  }
285
+
286
+ /** A strict read's fault with the line and column it is at, as a refusal states it. */
287
+ export function locatedFault(text: string, error: StrictJSONError): string {
288
+ const { line, column } = positionAt(text, "", error.offset);
289
+ return `line ${String(line)}, column ${String(column)}: ${error.message}`;
290
+ }
291
+
292
+ /** Whether a decoded JSON value is an object: not `null` and not an array. */
293
+ export function isRecord(value: unknown): value is Record<string, unknown> {
294
+ return typeof value === "object" && value !== null && !Array.isArray(value);
295
+ }