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

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 (402) 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 +2 -7
  6. package/dist/src/amd.js +81 -0
  7. package/dist/src/analysis.js +269 -432
  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/calls.js +279 -43
  12. package/dist/src/commands/held.js +499 -0
  13. package/dist/src/commands/read.js +161 -0
  14. package/dist/src/commands/shell.js +169 -0
  15. package/dist/src/commands/tools.js +1847 -0
  16. package/dist/src/component-files.js +3 -2
  17. package/dist/src/component-layer.js +4 -2
  18. package/dist/src/config.js +6 -82
  19. package/dist/src/conformance-record.js +1 -1
  20. package/dist/src/consumers.js +10 -38
  21. package/dist/src/contextual-uses.js +57 -26
  22. package/dist/src/contract/config.generated.js +561 -0
  23. package/dist/src/contract/contract.generated.js +1369 -0
  24. package/dist/src/contract/report.generated.js +866 -0
  25. package/dist/src/dependencies.js +164 -121
  26. package/dist/src/destructuring.js +1 -19
  27. package/dist/src/edges.js +38 -122
  28. package/dist/src/element-access.js +181 -168
  29. package/dist/src/entries/build-scripts.js +222 -0
  30. package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
  31. package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
  32. package/dist/src/entries/conventions.js +740 -0
  33. package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
  34. package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
  35. package/dist/src/entries/run-directories.js +77 -0
  36. package/dist/src/entries/sources.js +144 -0
  37. package/dist/src/entries/static-module.js +670 -0
  38. package/dist/src/entries/test-runners.js +650 -0
  39. package/dist/src/entries/workflow-steps.js +345 -0
  40. package/dist/src/enum-group.js +3 -10
  41. package/dist/src/erased-stores.js +4 -6
  42. package/dist/src/exempt-classes.js +1 -63
  43. package/dist/src/exempt.js +21 -66
  44. package/dist/src/exposure.js +400 -0
  45. package/dist/src/extensions.js +37 -0
  46. package/dist/src/facts.js +38 -0
  47. package/dist/src/failure.js +36 -0
  48. package/dist/src/file-facts.js +3 -26
  49. package/dist/src/findings/completion.js +109 -56
  50. package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
  51. package/dist/src/findings/emitters.js +27 -41
  52. package/dist/src/{implementations.js → findings/implementations.js} +3 -3
  53. package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
  54. package/dist/src/findings/interfaces.js +4 -5
  55. package/dist/src/findings/intra-function.js +16 -13
  56. package/dist/src/findings/non-code-artifacts.js +17 -12
  57. package/dist/src/findings/reads-and-writes.js +86 -27
  58. package/dist/src/findings/self-check.js +44 -30
  59. package/dist/src/findings/unused-declarations.js +29 -45
  60. package/dist/src/findings/visibility-narrowing.js +23 -31
  61. package/dist/src/findings-pass.js +13 -21
  62. package/dist/src/framework-lifecycle.js +46 -19
  63. package/dist/src/fs/document.js +52 -0
  64. package/dist/src/fs/manifest.js +67 -0
  65. package/dist/src/fs/tree.js +88 -0
  66. package/dist/src/generated-file.js +174 -28
  67. package/dist/src/git-ignore.js +39 -26
  68. package/dist/src/import-bindings.js +73 -28
  69. package/dist/src/index/sites.js +557 -0
  70. package/dist/src/index.js +2 -2
  71. package/dist/src/indexed-access.js +523 -478
  72. package/dist/src/injection-container.js +2 -2
  73. package/dist/src/interface-satisfaction.js +1 -1
  74. package/dist/src/intra-function-parts.js +63 -43
  75. package/dist/src/inventory/commonjs.js +507 -0
  76. package/dist/src/inventory/enumerate.js +167 -0
  77. package/dist/src/inventory/syntax.js +236 -0
  78. package/dist/src/inventory.js +323 -724
  79. package/dist/src/javascript-file.js +48 -0
  80. package/dist/src/json-document.js +198 -67
  81. package/dist/src/keyof-comparisons.js +126 -107
  82. package/dist/src/kinds.js +3 -366
  83. package/dist/src/{components.js → liveness/components.js} +2 -3
  84. package/dist/src/{graph.js → liveness/graph.js} +52 -28
  85. package/dist/src/liveness/matrix.js +99 -0
  86. package/dist/src/liveness/sweep.js +558 -0
  87. package/dist/src/load/classify.js +289 -0
  88. package/dist/src/load/diagnostics.js +87 -0
  89. package/dist/src/load/discover.js +285 -0
  90. package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
  91. package/dist/src/load/expected-module.js +136 -0
  92. package/dist/src/load/load.js +27 -0
  93. package/dist/src/load/module-lookup.js +37 -0
  94. package/dist/src/load/package-scope.js +56 -0
  95. package/dist/src/load/plan.js +313 -0
  96. package/dist/src/load/specifiers.js +113 -0
  97. package/dist/src/load/synthesize.js +152 -0
  98. package/dist/src/load/test-globals.js +207 -0
  99. package/dist/src/load/test-joins.js +82 -0
  100. package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
  101. package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
  102. package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
  103. package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
  104. package/dist/src/{workspace.js → load/workspace.js} +62 -124
  105. package/dist/src/module-declarations.js +70 -85
  106. package/dist/src/overrides.js +134 -112
  107. package/dist/src/partial.js +2 -1
  108. package/dist/src/paths.js +82 -16
  109. package/dist/src/platform-calls.js +78 -0
  110. package/dist/src/platform-symbols.js +134 -0
  111. package/dist/src/position.js +43 -1
  112. package/dist/src/print.js +11 -79
  113. package/dist/src/product.js +13 -0
  114. package/dist/src/query.js +47 -0
  115. package/dist/src/ref.js +12 -20
  116. package/dist/src/references/read-rule.js +1 -0
  117. package/dist/src/references/read-rules.js +48 -0
  118. package/dist/src/references/sink.js +237 -0
  119. package/dist/src/references/sources.js +450 -0
  120. package/dist/src/references.js +117 -1074
  121. package/dist/src/report-schema.js +51 -0
  122. package/dist/src/report.js +57 -41
  123. package/dist/src/reporters/annotations.js +15 -8
  124. package/dist/src/reporters/sarif.js +16 -10
  125. package/dist/src/reporters/template.js +4 -19
  126. package/dist/src/resolve.js +246 -730
  127. package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
  128. package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
  129. package/dist/src/roots/manifest.js +216 -0
  130. package/dist/src/roots/published-reach.js +412 -0
  131. package/dist/src/roots/root-set.js +487 -0
  132. package/dist/src/roots/unseen-loads.js +236 -0
  133. package/dist/src/run.js +66 -77
  134. package/dist/src/schema.js +320 -343
  135. package/dist/src/scope.js +38 -115
  136. package/dist/src/serialization-contract.js +601 -22
  137. package/dist/src/session.js +37 -29
  138. package/dist/src/source-files.js +6 -10
  139. package/dist/src/stores.js +4 -2
  140. package/dist/src/suppress-file.js +25 -28
  141. package/dist/src/suppress-inline.js +36 -83
  142. package/dist/src/suppress.js +50 -71
  143. package/dist/src/symbol-keys.js +92 -88
  144. package/dist/src/template-field.js +9 -19
  145. package/dist/src/tests/file-class.js +76 -0
  146. package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
  147. package/dist/src/{test-support.js → tests/support.js} +5 -12
  148. package/dist/src/text/compare.js +26 -0
  149. package/dist/src/text/glob.js +194 -0
  150. package/dist/src/text/named-files.js +298 -0
  151. package/dist/src/text/yaml.js +684 -0
  152. package/dist/src/type-errors.js +11 -232
  153. package/dist/src/type-parameter-reads.js +178 -139
  154. package/dist/src/unimplemented-callees.js +262 -242
  155. package/dist/src/unwrap.js +23 -0
  156. package/dist/src/usage.js +10 -0
  157. package/dist/src/vendor/unbash/ansi-c.js +132 -0
  158. package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
  159. package/dist/src/vendor/unbash/arithmetic.js +591 -0
  160. package/dist/src/vendor/unbash/assignment.js +131 -0
  161. package/dist/src/vendor/unbash/chars.js +48 -0
  162. package/dist/src/vendor/unbash/command.js +41 -0
  163. package/dist/src/vendor/unbash/expansion.js +80 -0
  164. package/dist/src/vendor/unbash/glob.js +268 -0
  165. package/dist/src/vendor/unbash/heredoc.js +27 -0
  166. package/dist/src/vendor/unbash/internal-types.js +1 -0
  167. package/dist/src/vendor/unbash/lexer.js +4274 -0
  168. package/dist/src/vendor/unbash/limits.js +3 -0
  169. package/dist/src/vendor/unbash/parser.js +1366 -0
  170. package/dist/src/vendor/unbash/parts.js +57 -0
  171. package/dist/src/vendor/unbash/substitution-context.js +8 -0
  172. package/dist/src/vendor/unbash/traversal.js +212 -0
  173. package/dist/src/vendor/unbash/types.js +1 -0
  174. package/dist/src/vendor/unbash/word-value.js +61 -0
  175. package/dist/src/vendor/unbash/word.js +40 -0
  176. package/dist/src/verbs/analyze.js +194 -127
  177. package/dist/src/verbs/describe.js +13 -18
  178. package/dist/src/verbs/explain.js +85 -139
  179. package/dist/src/verbs/print-config.js +2 -1
  180. package/dist/src/verbs/print-projects.js +6 -4
  181. package/dist/src/verbs/print-retained.js +7 -5
  182. package/dist/src/verbs/print-roots.js +4 -2
  183. package/dist/src/verbs/verb.js +1 -5
  184. package/dist/src/verbs/version.js +14 -3
  185. package/jsr.json +2 -1
  186. package/package.json +14 -8
  187. package/src/alias-chain.ts +2 -9
  188. package/src/amd.ts +130 -0
  189. package/src/analysis.ts +424 -650
  190. package/src/augmentations.ts +93 -4
  191. package/src/automatic-types.ts +12 -30
  192. package/src/bindings.ts +460 -0
  193. package/src/calls.ts +338 -46
  194. package/src/commands/held.ts +632 -0
  195. package/src/commands/read.ts +242 -0
  196. package/src/commands/shell.ts +228 -0
  197. package/src/commands/tools.ts +2382 -0
  198. package/src/component-files.ts +4 -2
  199. package/src/component-layer.ts +4 -2
  200. package/src/config.ts +31 -302
  201. package/src/conformance-record.ts +1 -1
  202. package/src/consumers.ts +16 -66
  203. package/src/contextual-uses.ts +66 -34
  204. package/src/contract/config.generated.ts +821 -0
  205. package/src/contract/contract.generated.ts +1452 -0
  206. package/src/contract/report.generated.ts +1241 -0
  207. package/src/dependencies.ts +222 -127
  208. package/src/destructuring.ts +1 -31
  209. package/src/edges.ts +41 -140
  210. package/src/element-access.ts +190 -187
  211. package/src/entries/build-scripts.ts +292 -0
  212. package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
  213. package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
  214. package/src/{conventions.ts → entries/conventions.ts} +367 -583
  215. package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
  216. package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
  217. package/src/entries/run-directories.ts +108 -0
  218. package/src/entries/sources.ts +266 -0
  219. package/src/entries/static-module.ts +858 -0
  220. package/src/entries/test-runners.ts +835 -0
  221. package/src/entries/workflow-steps.ts +432 -0
  222. package/src/enum-group.ts +2 -11
  223. package/src/erased-stores.ts +3 -7
  224. package/src/exempt-classes.ts +1 -75
  225. package/src/exempt.ts +70 -98
  226. package/src/exposure.ts +492 -0
  227. package/src/extensions.ts +45 -0
  228. package/src/facts.ts +46 -0
  229. package/src/failure.ts +63 -0
  230. package/src/file-facts.ts +15 -25
  231. package/src/finding.ts +10 -10
  232. package/src/findings/boundary.ts +11 -0
  233. package/src/findings/completion.ts +133 -64
  234. package/src/findings/dependencies-and-module-machinery.ts +4 -7
  235. package/src/findings/emitter.ts +9 -10
  236. package/src/findings/emitters.ts +38 -52
  237. package/src/{implementations.ts → findings/implementations.ts} +4 -4
  238. package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
  239. package/src/findings/interfaces.ts +7 -9
  240. package/src/findings/intra-function.ts +16 -14
  241. package/src/findings/non-code-artifacts.ts +24 -15
  242. package/src/findings/reads-and-writes.ts +118 -41
  243. package/src/findings/self-check.ts +51 -38
  244. package/src/findings/unused-declarations.ts +31 -49
  245. package/src/findings/visibility-narrowing.ts +36 -40
  246. package/src/findings-pass.ts +15 -31
  247. package/src/framework-lifecycle.ts +47 -19
  248. package/src/fs/document.ts +70 -0
  249. package/src/fs/manifest.ts +96 -0
  250. package/src/fs/tree.ts +110 -0
  251. package/src/generated-file.ts +242 -35
  252. package/src/git-ignore.ts +50 -26
  253. package/src/host.ts +12 -5
  254. package/src/import-bindings.ts +98 -29
  255. package/src/index/sites.ts +781 -0
  256. package/src/index.ts +2 -2
  257. package/src/indexed-access.ts +570 -527
  258. package/src/injection-container.ts +2 -2
  259. package/src/interface-satisfaction.ts +2 -2
  260. package/src/intra-function-parts.ts +73 -44
  261. package/src/inventory/commonjs.ts +696 -0
  262. package/src/inventory/enumerate.ts +203 -0
  263. package/src/inventory/syntax.ts +311 -0
  264. package/src/inventory.ts +442 -895
  265. package/src/javascript-file.ts +54 -0
  266. package/src/json-document.ts +241 -76
  267. package/src/keyof-comparisons.ts +133 -122
  268. package/src/kinds.ts +5 -413
  269. package/src/{components.ts → liveness/components.ts} +4 -6
  270. package/src/{graph.ts → liveness/graph.ts} +100 -35
  271. package/src/liveness/matrix.ts +162 -0
  272. package/src/liveness/sweep.ts +855 -0
  273. package/src/load/classify.ts +433 -0
  274. package/src/load/diagnostics.ts +154 -0
  275. package/src/load/discover.ts +471 -0
  276. package/src/{emit-map.ts → load/emit-map.ts} +1 -1
  277. package/src/load/expected-module.ts +194 -0
  278. package/src/load/load.ts +73 -0
  279. package/src/load/module-lookup.ts +50 -0
  280. package/src/load/package-scope.ts +74 -0
  281. package/src/load/plan.ts +513 -0
  282. package/src/load/specifiers.ts +171 -0
  283. package/src/load/synthesize.ts +230 -0
  284. package/src/load/test-globals.ts +251 -0
  285. package/src/load/test-joins.ts +98 -0
  286. package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
  287. package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
  288. package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
  289. package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
  290. package/src/{workspace.ts → load/workspace.ts} +90 -134
  291. package/src/module-declarations.ts +74 -98
  292. package/src/overrides.ts +162 -134
  293. package/src/partial.ts +3 -2
  294. package/src/paths.ts +92 -16
  295. package/src/platform-calls.ts +119 -0
  296. package/src/platform-symbols.ts +189 -0
  297. package/src/position.ts +44 -1
  298. package/src/print.ts +12 -92
  299. package/src/product.ts +18 -0
  300. package/src/query.ts +92 -0
  301. package/src/ref.ts +12 -20
  302. package/src/references/read-rule.ts +60 -0
  303. package/src/references/read-rules.ts +55 -0
  304. package/src/references/sink.ts +314 -0
  305. package/src/references/sources.ts +632 -0
  306. package/src/references.ts +187 -1450
  307. package/src/report-schema.ts +68 -0
  308. package/src/report.ts +103 -226
  309. package/src/reporters/annotations.ts +22 -11
  310. package/src/reporters/json.ts +1 -1
  311. package/src/reporters/reporter.ts +2 -4
  312. package/src/reporters/reporters.ts +1 -1
  313. package/src/reporters/sarif.ts +29 -16
  314. package/src/reporters/template.ts +4 -20
  315. package/src/reporters/text.ts +3 -3
  316. package/src/resolve.ts +284 -1115
  317. package/src/{configured-declarations.ts → roots/configured-declarations.ts} +27 -29
  318. package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
  319. package/src/roots/manifest.ts +303 -0
  320. package/src/roots/published-reach.ts +486 -0
  321. package/src/{roots.ts → roots/root-set.ts} +286 -469
  322. package/src/roots/unseen-loads.ts +345 -0
  323. package/src/run.ts +75 -91
  324. package/src/schema.ts +391 -388
  325. package/src/scope.ts +46 -138
  326. package/src/serialization-contract.ts +769 -23
  327. package/src/session.ts +87 -55
  328. package/src/source-files.ts +6 -11
  329. package/src/stores.ts +15 -3
  330. package/src/suppress-file.ts +24 -33
  331. package/src/suppress-inline.ts +55 -91
  332. package/src/suppress.ts +78 -79
  333. package/src/symbol-keys.ts +104 -107
  334. package/src/template-field.ts +15 -25
  335. package/src/tests/file-class.ts +135 -0
  336. package/src/{outside-tests.ts → tests/outside.ts} +16 -10
  337. package/src/{test-support.ts → tests/support.ts} +15 -21
  338. package/src/text/compare.ts +27 -0
  339. package/src/text/glob.ts +210 -0
  340. package/src/text/named-files.ts +388 -0
  341. package/src/text/yaml.ts +747 -0
  342. package/src/type-errors.ts +18 -288
  343. package/src/type-parameter-reads.ts +187 -158
  344. package/src/unimplemented-callees.ts +297 -280
  345. package/src/unwrap.ts +34 -0
  346. package/src/usage.ts +10 -0
  347. package/src/vendor/unbash/LICENSE +15 -0
  348. package/src/vendor/unbash/VENDORED.md +16 -0
  349. package/src/vendor/unbash/ansi-c.ts +132 -0
  350. package/src/vendor/unbash/arithmetic-parts.ts +53 -0
  351. package/src/vendor/unbash/arithmetic.ts +641 -0
  352. package/src/vendor/unbash/assignment.ts +163 -0
  353. package/src/vendor/unbash/chars.ts +48 -0
  354. package/src/vendor/unbash/command.ts +47 -0
  355. package/src/vendor/unbash/expansion.ts +144 -0
  356. package/src/vendor/unbash/glob.ts +284 -0
  357. package/src/vendor/unbash/heredoc.ts +34 -0
  358. package/src/vendor/unbash/internal-types.ts +94 -0
  359. package/src/vendor/unbash/lexer.ts +4352 -0
  360. package/src/vendor/unbash/limits.ts +3 -0
  361. package/src/vendor/unbash/parser.ts +1612 -0
  362. package/src/vendor/unbash/parts.ts +96 -0
  363. package/src/vendor/unbash/substitution-context.ts +20 -0
  364. package/src/vendor/unbash/traversal.ts +182 -0
  365. package/src/vendor/unbash/types.ts +660 -0
  366. package/src/vendor/unbash/word-value.ts +64 -0
  367. package/src/vendor/unbash/word.ts +50 -0
  368. package/src/verbs/analyze.ts +255 -164
  369. package/src/verbs/describe.ts +19 -17
  370. package/src/verbs/explain.ts +93 -169
  371. package/src/verbs/print-config.ts +2 -1
  372. package/src/verbs/print-projects.ts +6 -4
  373. package/src/verbs/print-retained.ts +7 -5
  374. package/src/verbs/print-roots.ts +4 -2
  375. package/src/verbs/verb.ts +2 -8
  376. package/src/verbs/version.ts +15 -3
  377. package/dist/src/base-url.js +0 -18
  378. package/dist/src/conventions.js +0 -937
  379. package/dist/src/discover.js +0 -468
  380. package/dist/src/entry-points.js +0 -529
  381. package/dist/src/glob.js +0 -65
  382. package/dist/src/manifest.js +0 -165
  383. package/dist/src/matrix.js +0 -246
  384. package/dist/src/pnpm-workspace.js +0 -120
  385. package/dist/src/roots.js +0 -672
  386. package/dist/src/setup-failure.js +0 -23
  387. package/dist/src/sweep.js +0 -224
  388. package/dist/src/test-joins.js +0 -101
  389. package/dist/src/version.js +0 -7
  390. package/dist/src/workflow-steps.js +0 -185
  391. package/src/base-url.ts +0 -24
  392. package/src/discover.ts +0 -653
  393. package/src/entry-points.ts +0 -687
  394. package/src/glob.ts +0 -67
  395. package/src/manifest.ts +0 -234
  396. package/src/matrix.ts +0 -423
  397. package/src/pnpm-workspace.ts +0 -135
  398. package/src/setup-failure.ts +0 -39
  399. package/src/sweep.ts +0 -347
  400. package/src/test-joins.ts +0 -120
  401. package/src/version.ts +0 -7
  402. package/src/workflow-steps.ts +0 -216
package/src/glob.ts DELETED
@@ -1,67 +0,0 @@
1
- /**
2
- * Glob patterns over the paths of the target's own files, as the configuration
3
- * writes them. Both `ts.test_files` and `ts.entry_files` name files this way, and
4
- * one grammar answers for both.
5
- *
6
- * A configured root is not written in this grammar. It names a symbol reference
7
- * rather than a path, `*` there spans the solidus and a brace list means nothing,
8
- * so that rule is written where it is read.
9
- */
10
-
11
- /**
12
- * One literal run of a pattern, with every character the expression syntax claims
13
- * escaped.
14
- *
15
- * The set is the syntax characters and the solidus, and it is closed: an escape of any
16
- * other character is refused outright by the expression syntax under the unicode flag,
17
- * so escaping a hyphen, which needs none outside a character class, would refuse every
18
- * pattern that names a hyphenated path.
19
- */
20
- function quoted(text: string): string {
21
- return text.replaceAll(/[.*+?^${}()|[\]\\/]/gu, (character) => `\\${character}`);
22
- }
23
-
24
- /**
25
- * The expression one glob pattern denotes. `**` spans path separators while `*` and `?`
26
- * do not, a brace list is an alternation of its members, and every other character
27
- * stands for itself.
28
- */
29
- export function globExpression(pattern: string): RegExp {
30
- let source = "^";
31
- let at = 0;
32
- while (at < pattern.length) {
33
- const rest = pattern.slice(at);
34
- if (rest.startsWith("**/")) {
35
- source += "(?:[^/]*/)*";
36
- at += 3;
37
- continue;
38
- }
39
- if (rest.startsWith("**")) {
40
- source += ".*";
41
- at += 2;
42
- continue;
43
- }
44
- const character = pattern[at] ?? "";
45
- at += 1;
46
- if (character === "*") {
47
- source += "[^/]*";
48
- continue;
49
- }
50
- if (character === "?") {
51
- source += "[^/]";
52
- continue;
53
- }
54
- if (character === "{") {
55
- const close = pattern.indexOf("}", at);
56
- if (close < 0) {
57
- source += "\\{";
58
- continue;
59
- }
60
- source += `(?:${pattern.slice(at, close).split(",").map(quoted).join("|")})`;
61
- at = close + 1;
62
- continue;
63
- }
64
- source += quoted(character);
65
- }
66
- return new RegExp(`${source}$`, "u");
67
- }
package/src/manifest.ts DELETED
@@ -1,234 +0,0 @@
1
- /**
2
- * The entry points a package manifest names, which are roots because something
3
- * outside the analyzed program reaches them: a consumer importing the package, or a
4
- * shell running its command or one of its scripts. {@link readManifest} reads one
5
- * directory's manifest, {@link packageEntries} those of the packages below the target root.
6
- */
7
-
8
- import type { Host } from "./host.ts";
9
- import { isAbsolutePath, joinPath, relativePath, resolvePath } from "./paths.ts";
10
-
11
- /** The manifest's own name. */
12
- const MANIFEST = "package.json";
13
-
14
- /** The three members that name an entry point beside `exports` and `bin`. */
15
- const LEGACY_MEMBERS = ["main", "module", "types"] as const;
16
-
17
- /** What reaches one entry point the manifest names. */
18
- type EntryRole =
19
- /** A consumer importing the package, which is a caller the analysis cannot see. */
20
- | "import"
21
- /** A shell running the package's command, which is a caller that exists. */
22
- | "run"
23
- /** A token of one of the package's scripts, which the package manager runs. */
24
- | "script";
25
-
26
- /** One entry point the manifest names. */
27
- export interface ManifestEntry {
28
- /**
29
- * The member that named it, spelled as a reader of the manifest reads one:
30
- * `main`, `bin["deadset-ts"]`, `exports["."]["import"]`. It is what a maintainer
31
- * edits, so it is what a root reports as the string that named it.
32
- */
33
- readonly member: string;
34
- /** The target the member carries, resolved against the manifest's directory. */
35
- readonly path: string;
36
- readonly role: EntryRole;
37
- /**
38
- * Whether the member declares what a consumer may import, which is `exports` and
39
- * the three members that preceded it. A command is published too, and is not this:
40
- * `exports` is the surface a library's published API is read from.
41
- */
42
- readonly published: boolean;
43
- /** The directory of the manifest that names it, which `path` was resolved against. */
44
- readonly dir: string;
45
- }
46
-
47
- function isRecord(value: unknown): value is Record<string, unknown> {
48
- return typeof value === "object" && value !== null && !Array.isArray(value);
49
- }
50
-
51
- /**
52
- * Whether one member's value names a file of this package rather than another
53
- * package or a URL. A target written with no leading dot is a path too, which is
54
- * how the members that preceded `exports` are written.
55
- */
56
- function isTarget(value: string, requireDot: boolean): boolean {
57
- if (value === "" || isAbsolutePath(value) || value.includes("://")) {
58
- return false;
59
- }
60
- return !requireDot || value.startsWith("./");
61
- }
62
-
63
- /** Where a script's command line splits into tokens: white space and the shell's operators. */
64
- const SCRIPT_SEPARATORS = /\s+|&&|\|\||;|\|/u;
65
-
66
- /** A token written inside one pair of quotes. */
67
- const QUOTED = /^(["'])(.*)\1$/su;
68
-
69
- /**
70
- * Every token one script's command line holds, each with one pair of enclosing quotes
71
- * removed. A token holding a wildcard is a pattern rather than a path, and names no
72
- * entry point.
73
- */
74
- export function scriptTokens(command: string): readonly string[] {
75
- return command
76
- .split(SCRIPT_SEPARATORS)
77
- .map((token) => token.replace(QUOTED, "$2"))
78
- .filter((token) => token !== "" && !token.includes("*"));
79
- }
80
-
81
- /** One member's spelling below another: `exports` then `exports["."]`. */
82
- function below(member: string, key: string): string {
83
- return `${member}[${JSON.stringify(key)}]`;
84
- }
85
-
86
- /**
87
- * Every target one `exports` value carries, at the member each is written under.
88
- *
89
- * The value nests strings, subpath or condition objects and alternative arrays to
90
- * any depth; a `null` blocks a subpath. Every level is walked, because each
91
- * condition names its own entry file, and a key's meaning is never read.
92
- */
93
- function exportTargets(value: unknown, member: string, found: Omit<ManifestEntry, "dir">[]): void {
94
- if (typeof value === "string") {
95
- if (isTarget(value, true)) {
96
- found.push({ member, path: value, role: "import", published: true });
97
- }
98
- return;
99
- }
100
- if (Array.isArray(value)) {
101
- value.forEach((alternative, index) => {
102
- exportTargets(alternative, below(member, String(index)), found);
103
- });
104
- return;
105
- }
106
- if (!isRecord(value)) {
107
- return;
108
- }
109
- for (const [key, held] of Object.entries(value)) {
110
- exportTargets(held, below(member, key), found);
111
- }
112
- }
113
-
114
- /** The manifest at the target root, decoded, or undefined where there is none to read. */
115
- function manifestOf(host: Host, targetRoot: string): Record<string, unknown> | undefined {
116
- let text: string;
117
- try {
118
- text = host.readFile(joinPath(targetRoot, MANIFEST));
119
- } catch {
120
- return undefined;
121
- }
122
- let value: unknown;
123
- try {
124
- value = JSON.parse(text);
125
- } catch {
126
- // A manifest this program cannot read names no entry point, which is the same
127
- // answer as an absent one. What a manifest's contents say is not refused here:
128
- // the package manager owns that refusal, and an analysis of a tree it rejects
129
- // is not the run's subject.
130
- return undefined;
131
- }
132
- return isRecord(value) ? value : undefined;
133
- }
134
-
135
- /** What one manifest declares about where its package is entered. */
136
- export interface Manifest {
137
- /**
138
- * Every entry point the manifest names, in the order the members are read: `main`,
139
- * `module`, `types`, then each `bin` command, then every target of `exports`, then
140
- * every token of each script, which names a file only where one is at its path. Each
141
- * path is absolute.
142
- */
143
- readonly entries: readonly ManifestEntry[];
144
- /**
145
- * Whether an `exports` member is written at all. A package that declares one has
146
- * said exactly what a consumer may import, so its published API is what `exports`
147
- * reaches; a package that declares none publishes whatever the members that
148
- * preceded it name.
149
- */
150
- readonly declaresExports: boolean;
151
- }
152
-
153
- /**
154
- * What the manifest in `targetRoot` declares about where its package is entered.
155
- *
156
- * A target is taken as written. It is not resolved to a source file here, because
157
- * which file a target names is a fact about the compiler configuration that emits
158
- * it and there is one such configuration per project, while there is one manifest.
159
- */
160
- export function readManifest(host: Host, targetRoot: string): Manifest {
161
- const manifest = manifestOf(host, targetRoot);
162
- if (manifest === undefined) {
163
- return { entries: [], declaresExports: false };
164
- }
165
-
166
- const found: Omit<ManifestEntry, "dir">[] = [];
167
- for (const member of LEGACY_MEMBERS) {
168
- const value = manifest[member];
169
- if (typeof value === "string" && isTarget(value, false)) {
170
- found.push({ member, path: value, role: "import", published: true });
171
- }
172
- }
173
-
174
- const bin = manifest["bin"];
175
- if (typeof bin === "string" && isTarget(bin, false)) {
176
- found.push({ member: "bin", path: bin, role: "run", published: false });
177
- } else if (isRecord(bin)) {
178
- for (const [command, value] of Object.entries(bin)) {
179
- if (typeof value === "string" && isTarget(value, false)) {
180
- found.push({ member: below("bin", command), path: value, role: "run", published: false });
181
- }
182
- }
183
- }
184
-
185
- exportTargets(manifest["exports"], "exports", found);
186
-
187
- const scripts = manifest["scripts"];
188
- if (isRecord(scripts)) {
189
- for (const [name, command] of Object.entries(scripts)) {
190
- if (typeof command !== "string") {
191
- continue;
192
- }
193
- for (const token of new Set(scriptTokens(command))) {
194
- found.push({
195
- member: below("scripts", name),
196
- path: token,
197
- role: "script",
198
- published: false,
199
- });
200
- }
201
- }
202
- }
203
-
204
- return {
205
- entries: found.map((entry) => ({
206
- ...entry,
207
- path: resolvePath(targetRoot, entry.path),
208
- dir: targetRoot,
209
- })),
210
- declaresExports: manifest["exports"] !== undefined,
211
- };
212
- }
213
-
214
- /**
215
- * The entry points the manifests of the nested packages in `dirs` name. Each entry is
216
- * spelled under its manifest's path below the target root, and is published by its own
217
- * manifest's rule, as the target's own entries are.
218
- */
219
- export function packageEntries(
220
- host: Host,
221
- targetRoot: string,
222
- dirs: readonly string[],
223
- ): readonly ManifestEntry[] {
224
- return dirs.flatMap((dir) => {
225
- const manifest = readManifest(host, dir);
226
- const where = `${relativePath(targetRoot, dir) ?? dir}/${MANIFEST}`;
227
- return manifest.entries.map((entry) => ({
228
- ...entry,
229
- member: `${where} ${entry.member}`,
230
- published:
231
- entry.published && (!manifest.declaresExports || entry.member.startsWith("exports")),
232
- }));
233
- });
234
- }