@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,163 @@
1
+ // Code generated by scripts/vendor-unbash.ts from unbash 6.0.0 (968c14992a43dc06ce29c9f51858abd4a87851ea). DO NOT EDIT.
2
+ // @ts-nocheck
3
+ import { Lexer, LexContext, Token } from "./lexer.ts";
4
+ import { skipLineContinuations } from "./chars.ts";
5
+ import { arrayPartsResolver, computeBareWordParts, embeddedPartsResolver, wordPartsResolver } from "./parts.ts";
6
+ import type { ArrayValue, Assignment, Word } from "./internal-types.ts";
7
+ import { WordImpl } from "./word.ts";
8
+ import type { SubstitutionContext } from "./substitution-context.ts";
9
+
10
+ class ArrayValueImpl implements ArrayValue {
11
+ type = "ArrayValue" as const;
12
+ pos: number;
13
+ end: number;
14
+ #source: string;
15
+ #depth: number;
16
+ #context: SubstitutionContext;
17
+ #elements: Word[] | undefined;
18
+
19
+ constructor(source: string, pos: number, end: number, depth: number, context: SubstitutionContext) {
20
+ this.pos = pos;
21
+ this.end = end;
22
+ this.#source = source;
23
+ this.#depth = depth;
24
+ this.#context = context;
25
+ }
26
+
27
+ get elements(): Word[] {
28
+ if (this.#elements) return this.#elements;
29
+ const lexer = new Lexer(this.#source, this.pos + 1, this.end - 1, false, this.#context);
30
+ lexer._nestingDepth = this.#depth;
31
+ const elements: Word[] = [];
32
+ while (lexer.peek(LexContext.ArrayElement).token !== Token.EOF) {
33
+ const token = lexer.next(LexContext.ArrayElement);
34
+ if (token.token !== Token.Word && token.token !== Token.Assignment) continue;
35
+ const text = token.raw ? token.value : this.#source.slice(token.pos, token.end);
36
+ const indexed = text.charCodeAt(0) === 91;
37
+ const context = lexer.getSubstitutionContext();
38
+ const source = !indexed && token.raw && token.keywordEligible ? undefined : this.#source;
39
+ const resolver =
40
+ source === undefined
41
+ ? computeBareWordParts
42
+ : indexed
43
+ ? arrayPartsResolver(context)
44
+ : wordPartsResolver(context);
45
+ elements.push(new WordImpl(text, token.pos, token.end, source, resolver, this.#depth));
46
+ }
47
+ this.#elements = elements;
48
+ return elements;
49
+ }
50
+
51
+ toJSON(): ArrayValue {
52
+ return { type: this.type, pos: this.pos, end: this.end, elements: this.elements };
53
+ }
54
+ }
55
+
56
+ export class AssignmentImpl implements Assignment {
57
+ type = "Assignment" as const;
58
+ pos: number;
59
+ end: number;
60
+ text: string;
61
+ #source: string;
62
+ #depth: number;
63
+ #context: SubstitutionContext;
64
+ #operatorPos: number;
65
+ #name: string | null = null;
66
+ #append: boolean | undefined;
67
+ #index: Word | undefined;
68
+ #value: Word | ArrayValue | null = null;
69
+
70
+ constructor(
71
+ text: string,
72
+ pos: number,
73
+ end: number,
74
+ source: string,
75
+ operatorPos: number,
76
+ depth: number,
77
+ context: SubstitutionContext,
78
+ ) {
79
+ this.pos = pos;
80
+ this.end = end;
81
+ this.text = text;
82
+ this.#source = source;
83
+ this.#operatorPos = operatorPos;
84
+ this.#depth = depth;
85
+ this.#context = context;
86
+ }
87
+
88
+ get name(): string {
89
+ return this.#name ?? this.resolveTarget();
90
+ }
91
+
92
+ get append(): boolean | undefined {
93
+ if (this.#name === null) this.resolveTarget();
94
+ return this.#append;
95
+ }
96
+
97
+ get index(): Word | undefined {
98
+ if (this.#name === null) this.resolveTarget();
99
+ return this.#index;
100
+ }
101
+
102
+ get value(): Word | ArrayValue {
103
+ if (this.#value !== null) return this.#value;
104
+ const start = this.#operatorPos + 1;
105
+ const arrayStart = skipLineContinuations(this.#source, start, this.end);
106
+ this.#value =
107
+ this.#source.charCodeAt(arrayStart) === 40 && this.#source.charCodeAt(this.end - 1) === 41
108
+ ? new ArrayValueImpl(this.#source, arrayStart, this.end, this.#depth, this.#context)
109
+ : new WordImpl(
110
+ this.#source.slice(start, this.end),
111
+ start,
112
+ this.end,
113
+ this.#source,
114
+ wordPartsResolver(this.#context),
115
+ this.#depth,
116
+ );
117
+ return this.#value;
118
+ }
119
+
120
+ private resolveTarget(): string {
121
+ const equal = this.#operatorPos - this.pos;
122
+ let nameEnd = equal;
123
+ let appendPos = equal;
124
+ while (appendPos >= 2 && this.text.charCodeAt(appendPos - 2) === 92 && this.text.charCodeAt(appendPos - 1) === 10)
125
+ appendPos -= 2;
126
+ if (this.text.charCodeAt(appendPos - 1) === 43) {
127
+ this.#append = true;
128
+ nameEnd = appendPos - 1;
129
+ }
130
+ const bracket = this.text.indexOf("[");
131
+ if (bracket > 0 && bracket < nameEnd) {
132
+ const close = this.text.lastIndexOf("]", equal);
133
+ if (close > bracket) {
134
+ const start = this.pos + bracket + 1;
135
+ const end = this.pos + close;
136
+ this.#index = new WordImpl(
137
+ this.#source.slice(start, end),
138
+ start,
139
+ end,
140
+ this.#source,
141
+ embeddedPartsResolver(this.#context),
142
+ this.#depth,
143
+ );
144
+ nameEnd = bracket;
145
+ }
146
+ }
147
+ const name = this.text.slice(0, nameEnd);
148
+ return (this.#name = name.includes("\\\n") ? name.split("\\\n").join("") : name);
149
+ }
150
+
151
+ toJSON(): Assignment {
152
+ return {
153
+ type: this.type,
154
+ pos: this.pos,
155
+ end: this.end,
156
+ text: this.text,
157
+ name: this.name,
158
+ append: this.append,
159
+ index: this.index,
160
+ value: this.value,
161
+ };
162
+ }
163
+ }
@@ -0,0 +1,48 @@
1
+ // Code generated by scripts/vendor-unbash.ts from unbash 6.0.0 (968c14992a43dc06ce29c9f51858abd4a87851ea). DO NOT EDIT.
2
+ // @ts-nocheck
3
+ export const CH_TAB = 9;
4
+ export const CH_NL = 10;
5
+ export const CH_SPACE = 32;
6
+ export const CH_BANG = 33;
7
+ export const CH_DQUOTE = 34;
8
+ export const CH_HASH = 35;
9
+ export const CH_DOLLAR = 36;
10
+ export const CH_PERCENT = 37;
11
+ export const CH_AMP = 38;
12
+ export const CH_SQUOTE = 39;
13
+ export const CH_LPAREN = 40;
14
+ export const CH_RPAREN = 41;
15
+ export const CH_STAR = 42;
16
+ export const CH_PLUS = 43;
17
+ export const CH_COMMA = 44;
18
+ export const CH_DASH = 45;
19
+ export const CH_DOT = 46;
20
+ export const CH_SLASH = 47;
21
+ export const CH_0 = 48;
22
+ export const CH_9 = 57;
23
+ export const CH_COLON = 58;
24
+ export const CH_SEMI = 59;
25
+ export const CH_LT = 60;
26
+ export const CH_EQ = 61;
27
+ export const CH_GT = 62;
28
+ export const CH_QUESTION = 63;
29
+ export const CH_AT = 64;
30
+ export const CH_A = 65;
31
+ export const CH_Z = 90;
32
+ export const CH_LBRACKET = 91;
33
+ export const CH_BACKSLASH = 92;
34
+ export const CH_RBRACKET = 93;
35
+ export const CH_CARET = 94;
36
+ export const CH_UNDERSCORE = 95;
37
+ export const CH_BACKTICK = 96;
38
+ export const CH_a = 97;
39
+ export const CH_z = 122;
40
+ export const CH_LBRACE = 123;
41
+ export const CH_PIPE = 124;
42
+ export const CH_RBRACE = 125;
43
+ export const CH_TILDE = 126;
44
+
45
+ export function skipLineContinuations(source: string, pos: number, end: number): number {
46
+ while (pos + 1 < end && source.charCodeAt(pos) === CH_BACKSLASH && source.charCodeAt(pos + 1) === CH_NL) pos += 2;
47
+ return pos;
48
+ }
@@ -0,0 +1,47 @@
1
+ // Code generated by scripts/vendor-unbash.ts from unbash 6.0.0 (968c14992a43dc06ce29c9f51858abd4a87851ea). DO NOT EDIT.
2
+ // @ts-nocheck
3
+ import type { Command, CommandArgument, Redirection, Word } from "./internal-types.ts";
4
+
5
+ const isArgument = (item: CommandArgument | Redirection): item is CommandArgument =>
6
+ item.type === "Word" || item.type === "Assignment";
7
+
8
+ export class CommandImpl implements Command {
9
+ type = "Command" as const;
10
+ pos: number;
11
+ end: number;
12
+ name: Word | undefined;
13
+ prefix: Command["prefix"];
14
+ suffix: Command["suffix"];
15
+ #args: CommandArgument[] | undefined;
16
+ #redirects: Redirection[] | undefined;
17
+
18
+ constructor(pos: number, end: number, name: Word | undefined, prefix: Command["prefix"], suffix: Command["suffix"]) {
19
+ this.pos = pos;
20
+ this.end = end;
21
+ this.name = name;
22
+ this.prefix = prefix;
23
+ this.suffix = suffix;
24
+ }
25
+
26
+ get args(): CommandArgument[] {
27
+ if (this.#args === undefined) {
28
+ const suffix = this.suffix;
29
+ this.#args = suffix.every(isArgument) ? suffix : suffix.filter(isArgument);
30
+ }
31
+ return this.#args;
32
+ }
33
+
34
+ get redirects(): Redirection[] {
35
+ if (this.#redirects === undefined) {
36
+ const redirects: Redirection[] = [];
37
+ for (const item of this.prefix) if (item.type !== "Assignment") redirects.push(item);
38
+ for (const item of this.suffix) if (!isArgument(item)) redirects.push(item);
39
+ this.#redirects = redirects;
40
+ }
41
+ return this.#redirects;
42
+ }
43
+
44
+ toJSON(): Omit<Command, "args" | "redirects"> {
45
+ return { type: this.type, pos: this.pos, end: this.end, name: this.name, prefix: this.prefix, suffix: this.suffix };
46
+ }
47
+ }
@@ -0,0 +1,144 @@
1
+ // Code generated by scripts/vendor-unbash.ts from unbash 6.0.0 (968c14992a43dc06ce29c9f51858abd4a87851ea). DO NOT EDIT.
2
+ // @ts-nocheck
3
+ import type {
4
+ ArithmeticExpression,
5
+ ArithmeticExpansionPart,
6
+ ParsedScript,
7
+ ProcessSubstitutionPart,
8
+ } from "./internal-types.ts";
9
+ import type { parseRegion } from "./parser.ts";
10
+ import type { parseArithmeticWithParts } from "./arithmetic-parts.ts";
11
+ import type { SubstitutionContext } from "./substitution-context.ts";
12
+
13
+ type ScriptExpansionType = "CommandExpansion" | "ProcessSubstitution" | "ArithmeticCommandExpansion";
14
+
15
+ // Where a deferred script parses: in place over [start, end) of `source`, so every node is born
16
+ // with absolute pos/end and nested substitutions compose by re-lexing the original on demand. A
17
+ // decoded backtick body is its own source: its positions index that string, so it parses with no
18
+ // shared context and the script carries the string as `source`.
19
+ export interface ScriptWindow {
20
+ readonly source: string;
21
+ readonly start: number;
22
+ readonly end: number;
23
+ readonly depth: number;
24
+ readonly parenBoundary: boolean;
25
+ readonly context: SubstitutionContext | undefined;
26
+ }
27
+
28
+ // The window is held only until the script resolves; a part constructed without one has no script.
29
+ export class ScriptExpansionImpl<T extends ScriptExpansionType> {
30
+ static _resolveScript: typeof parseRegion;
31
+
32
+ type: T;
33
+ pos: number;
34
+ end: number;
35
+ text: string;
36
+ #window: ScriptWindow | undefined;
37
+ #script: ParsedScript | undefined = undefined;
38
+
39
+ constructor(type: T, pos: number, end: number, text: string, window?: ScriptWindow) {
40
+ this.type = type;
41
+ this.pos = pos;
42
+ this.end = end;
43
+ this.text = text;
44
+ this.#window = window;
45
+ }
46
+
47
+ get script(): ParsedScript | undefined {
48
+ const window = this.#window;
49
+ if (window !== undefined) {
50
+ const script = ScriptExpansionImpl._resolveScript(
51
+ window.source,
52
+ window.start,
53
+ window.end,
54
+ window.depth,
55
+ window.parenBoundary,
56
+ window.context,
57
+ );
58
+ if (window.context === undefined) script.source = window.source;
59
+ this.script = script;
60
+ }
61
+ return this.#script;
62
+ }
63
+
64
+ set script(script: ParsedScript | undefined) {
65
+ this.#script = script;
66
+ this.#window = undefined;
67
+ }
68
+
69
+ toJSON(): { type: T; pos: number; end: number; text: string; script: ParsedScript | undefined } {
70
+ return { type: this.type, pos: this.pos, end: this.end, text: this.text, script: this.script };
71
+ }
72
+ }
73
+
74
+ export class ProcessSubstitutionImpl extends ScriptExpansionImpl<"ProcessSubstitution"> {
75
+ operator: "<" | ">";
76
+
77
+ constructor(pos: number, end: number, text: string, operator: "<" | ">", window: ScriptWindow | undefined) {
78
+ super("ProcessSubstitution", pos, end, text, window);
79
+ this.operator = operator;
80
+ }
81
+
82
+ toJSON(): ProcessSubstitutionPart {
83
+ return {
84
+ type: this.type,
85
+ pos: this.pos,
86
+ end: this.end,
87
+ text: this.text,
88
+ operator: this.operator,
89
+ script: this.script,
90
+ };
91
+ }
92
+ }
93
+
94
+ // Where a deferred arithmetic expression parses: `body` is the expression text at `offset` in
95
+ // `source`, which embedded words and substitutions re-lex in place.
96
+ export interface ArithmeticWindow {
97
+ readonly source: string;
98
+ readonly body: string;
99
+ readonly offset: number;
100
+ readonly depth: number;
101
+ readonly context: SubstitutionContext;
102
+ }
103
+
104
+ export class ArithmeticExpansionImpl implements ArithmeticExpansionPart {
105
+ static _resolveExpression: typeof parseArithmeticWithParts;
106
+
107
+ type = "ArithmeticExpansion" as const;
108
+ pos: number;
109
+ end: number;
110
+ text: string;
111
+ #window: ArithmeticWindow | undefined;
112
+ #expression: ArithmeticExpression | undefined = undefined;
113
+
114
+ constructor(pos: number, end: number, text: string, window: ArithmeticWindow) {
115
+ this.pos = pos;
116
+ this.end = end;
117
+ this.text = text;
118
+ this.#window = window;
119
+ }
120
+
121
+ get expression(): ArithmeticExpression | undefined {
122
+ const window = this.#window;
123
+ if (window !== undefined) {
124
+ this.expression = ArithmeticExpansionImpl._resolveExpression(
125
+ window.body,
126
+ window.offset,
127
+ window.source,
128
+ window.depth,
129
+ window.context,
130
+ window.depth + 1,
131
+ );
132
+ }
133
+ return this.#expression;
134
+ }
135
+
136
+ set expression(expression: ArithmeticExpression | undefined) {
137
+ this.#expression = expression;
138
+ this.#window = undefined;
139
+ }
140
+
141
+ toJSON(): ArithmeticExpansionPart {
142
+ return { type: this.type, pos: this.pos, end: this.end, text: this.text, expression: this.expression };
143
+ }
144
+ }
@@ -0,0 +1,284 @@
1
+ // Code generated by scripts/vendor-unbash.ts from unbash 6.0.0 (968c14992a43dc06ce29c9f51858abd4a87851ea). DO NOT EDIT.
2
+ // @ts-nocheck
3
+ import type { GlobPart, WordPart } from "./internal-types.ts";
4
+ import { unescapeBareValue, wordPartsValue } from "./word-value.ts";
5
+ import {
6
+ CH_BACKSLASH,
7
+ CH_BANG,
8
+ CH_CARET,
9
+ CH_COLON,
10
+ CH_DASH,
11
+ CH_DOT,
12
+ CH_EQ,
13
+ CH_LBRACKET,
14
+ CH_LPAREN,
15
+ CH_NL,
16
+ CH_QUESTION,
17
+ CH_RBRACKET,
18
+ CH_STAR,
19
+ skipLineContinuations,
20
+ } from "./chars.ts";
21
+
22
+ export function hasGlobCharacters(text: string): boolean {
23
+ return /[*?[]/.test(text);
24
+ }
25
+
26
+ const bracketSyntax = new Uint8Array(128);
27
+ bracketSyntax[CH_BANG] = 1;
28
+ bracketSyntax[CH_CARET] = 1;
29
+ bracketSyntax[CH_LBRACKET] = 1;
30
+ bracketSyntax[CH_RBRACKET] = 1;
31
+ bracketSyntax[CH_COLON] = 1;
32
+ bracketSyntax[CH_DOT] = 1;
33
+ bracketSyntax[CH_EQ] = 1;
34
+ bracketSyntax[CH_DASH] = 1;
35
+ bracketSyntax[CH_BACKSLASH] = 1;
36
+
37
+ // Bracket extents follow Bash's matcher (lib/glob/sm_loop.c, BRACKMATCH and PARSE_SUBBRACKET on
38
+ // the path where no member matches): `[:name:]` and `[=c=]` end at the first `:]` or `=]` unless a
39
+ // raw `]` comes first, `[.sym.]` ends at the first `.]` even past a `]`, a class or equivalence
40
+ // never starts a range, and a `-` range end consumes one member, be it an escape, a plain `[` or a
41
+ // collating symbol (also behind an escaped `[`). Quoted and expanded parts are single opaque
42
+ // members; Bash additionally lets quoted `]`, `:`, `=`, `.` and `[` take part in symbol and range
43
+ // scanning after re-escaping them, which this scan leaves out.
44
+ function bracketEnds(
45
+ source: string,
46
+ start: number,
47
+ end: number,
48
+ parts: WordPart[] | null | undefined,
49
+ offset: number,
50
+ ): Map<number, number> | null {
51
+ let close = end - 1;
52
+ while (close > start && source.charCodeAt(close) !== CH_RBRACKET) close--;
53
+ if (close === start) return null;
54
+
55
+ // Tokens: each special character, and runs of plain members (continuations vanish, quoted or
56
+ // expanded parts are plain). Only specials change an extent, so a run acts as one member except
57
+ // as a range end, which consumes just its first member.
58
+ const positions: number[] = [];
59
+ const kinds: number[] = [];
60
+ const members: number[] = [];
61
+ let partIndex = 0;
62
+ let symbols = false;
63
+ for (let pos = start; pos < end; pos++) {
64
+ while (parts && partIndex < parts.length && parts[partIndex].end <= pos + offset) partIndex++;
65
+ const part = parts?.[partIndex];
66
+ const tokenPos = pos;
67
+ let kind = 0;
68
+ if (part && part.pos <= pos + offset && part.type !== "Literal") {
69
+ pos = part.end - offset - 1;
70
+ } else {
71
+ kind = source.charCodeAt(pos);
72
+ if (kind === CH_BACKSLASH && pos + 1 < end && source.charCodeAt(pos + 1) === CH_NL) {
73
+ pos++;
74
+ continue;
75
+ }
76
+ if (kind >= 128 || !bracketSyntax[kind]) kind = 0;
77
+ }
78
+ const last = kinds.length - 1;
79
+ if (kind === 0 && last >= 0 && kinds[last] === 0) {
80
+ members[last]++;
81
+ continue;
82
+ }
83
+ if (last >= 0 && kinds[last] === CH_LBRACKET && (kind === CH_COLON || kind === CH_EQ || kind === CH_DOT)) {
84
+ symbols = true;
85
+ }
86
+ positions.push(tokenPos);
87
+ kinds.push(kind);
88
+ members.push(1);
89
+ }
90
+ const count = kinds.length;
91
+
92
+ // PARSE_SUBBRACKET memoized per opener: symbolEnd[t] is the token after the `X]` closing the
93
+ // symbol that `[X` opens at token t, or -1. One right-to-left pass tracks the nearest raw `]`
94
+ // and the nearest `:]`, `=]` and `.]` beyond the opener. Escaped characters are separate tokens,
95
+ // so a `\]` still stops a `:` or `=` scan as it does in Bash.
96
+ let symbolEnd: Int32Array | undefined;
97
+ if (symbols) {
98
+ symbolEnd = new Int32Array(count).fill(-1);
99
+ let close = -1;
100
+ let colon = -1;
101
+ let eq = -1;
102
+ let dot = -1;
103
+ for (let i = count - 1; i >= 0; i--) {
104
+ // The scan for the opener at i starts two tokens in, so fold token i + 2 in first.
105
+ const kind = kinds[i + 2];
106
+ if (kind === CH_RBRACKET) close = i + 2;
107
+ else if (kinds[i + 3] === CH_RBRACKET) {
108
+ if (kind === CH_COLON) colon = i + 2;
109
+ else if (kind === CH_EQ) eq = i + 2;
110
+ else if (kind === CH_DOT) dot = i + 2;
111
+ }
112
+ if (kinds[i] !== CH_LBRACKET) continue;
113
+ const type = kinds[i + 1];
114
+ const found = type === CH_COLON ? colon : type === CH_EQ ? eq : type === CH_DOT ? dot : -1;
115
+ if (found !== -1 && (type === CH_DOT || close === -1 || close > found)) symbolEnd[i] = found + 2;
116
+ }
117
+ }
118
+ const subBracket = (open: number): number => (symbolEnd === undefined ? -1 : symbolEnd[open]);
119
+
120
+ // endFrom[t]: the token after the `]` closing a bracket whose next member starts at token t, or
121
+ // -1 when the pattern runs out and the opening `[` stays literal.
122
+ const endFrom = new Int32Array(count + 2).fill(-1);
123
+ const resume = (next: number, range: boolean): number => {
124
+ if (next >= count) return -1;
125
+ if (range && kinds[next] === CH_DASH && next + 1 < count && kinds[next + 1] !== CH_RBRACKET) {
126
+ let last = next + 1;
127
+ if (kinds[last] === CH_BACKSLASH) {
128
+ if (last + 1 >= count) return -1;
129
+ last++;
130
+ }
131
+ let after = last + 1;
132
+ if (kinds[last] === CH_LBRACKET && kinds[last + 1] === CH_DOT) {
133
+ const symbol = subBracket(last);
134
+ if (symbol !== -1) after = symbol;
135
+ } else if (kinds[last] === 0 && members[last] > 1) {
136
+ // The run's later members stay members, and its last one may start the next range.
137
+ return endFrom[last];
138
+ }
139
+ if (after >= count) return -1;
140
+ return kinds[after] === CH_RBRACKET ? after + 1 : endFrom[after];
141
+ }
142
+ return kinds[next] === CH_RBRACKET ? next + 1 : endFrom[next];
143
+ };
144
+ for (let t = count - 1; t >= 0; t--) {
145
+ const kind = kinds[t];
146
+ let after = t + 1;
147
+ let range = true;
148
+ if (kind === CH_BACKSLASH) {
149
+ if (t + 1 >= count) continue;
150
+ after = t + 2;
151
+ } else if (kind === CH_LBRACKET) {
152
+ const type = kinds[t + 1];
153
+ if (type === CH_COLON || type === CH_EQ || type === CH_DOT) {
154
+ const symbol = subBracket(t);
155
+ if (symbol !== -1) {
156
+ after = symbol;
157
+ range = type === CH_DOT;
158
+ }
159
+ }
160
+ }
161
+ endFrom[t] = resume(after, range);
162
+ }
163
+
164
+ const ends = new Map<number, number>();
165
+ for (let t = 0; t < count; t++) {
166
+ if (kinds[t] !== CH_LBRACKET) continue;
167
+ let first = t + 1;
168
+ if (kinds[first] === CH_BANG || kinds[first] === CH_CARET) first++;
169
+ if (first >= count) continue;
170
+ const close = kinds[first] === CH_RBRACKET ? resume(first + 1, true) : endFrom[first];
171
+ if (close !== -1) ends.set(positions[t], positions[close - 1] + 1);
172
+ }
173
+ return ends;
174
+ }
175
+
176
+ function appendRange(
177
+ source: string,
178
+ start: number,
179
+ end: number,
180
+ parts: WordPart[] | null | undefined,
181
+ index: number,
182
+ offset: number,
183
+ result: WordPart[],
184
+ ): number {
185
+ while (start < end) {
186
+ while (parts && index < parts.length && parts[index].end <= start + offset) index++;
187
+ const part = parts?.[index];
188
+ if (part && part.pos === start + offset && part.end <= end + offset) {
189
+ result.push(part);
190
+ start = part.end - offset;
191
+ index++;
192
+ continue;
193
+ }
194
+ const stop = part ? Math.min(end, (part.pos > start + offset ? part.pos : part.end) - offset) : end;
195
+ const text = source.slice(start, stop);
196
+ result.push({ type: "Literal", pos: start + offset, end: stop + offset, text, value: unescapeBareValue(text) });
197
+ start = stop;
198
+ }
199
+ return index;
200
+ }
201
+
202
+ export function parseGlobParts(
203
+ source: string,
204
+ start: number,
205
+ end: number,
206
+ parts: WordPart[] | null | undefined,
207
+ offset = 0,
208
+ ): WordPart[] | undefined {
209
+ let result: WordPart[] | undefined;
210
+ let brackets: Map<number, number> | null | undefined;
211
+ let partIndex = 0;
212
+ let emittedIndex = 0;
213
+ let literalStart = start;
214
+ for (let pos = start; pos < end; pos++) {
215
+ while (parts && partIndex < parts.length && parts[partIndex].end <= pos + offset) partIndex++;
216
+ const part = parts?.[partIndex];
217
+ if (part && part.pos <= pos + offset && part.type !== "Literal") {
218
+ pos = part.end - offset - 1;
219
+ continue;
220
+ }
221
+ const character = source.charCodeAt(pos);
222
+ if (character === CH_BACKSLASH) {
223
+ pos++;
224
+ continue;
225
+ }
226
+
227
+ let globEnd: number;
228
+ if (character === CH_STAR || character === CH_QUESTION) {
229
+ const limit = part ? Math.min(end, part.end - offset) : end;
230
+ // Embedded-word scans can leave extglob operators inside Literal parts.
231
+ const next = skipLineContinuations(source, pos + 1, limit);
232
+ if (next < limit && source.charCodeAt(next) === CH_LPAREN) continue;
233
+ globEnd = pos + 1;
234
+ if (character === CH_STAR) {
235
+ while (globEnd < limit && source.charCodeAt(globEnd) === CH_STAR) {
236
+ const next = skipLineContinuations(source, globEnd + 1, limit);
237
+ if (next < limit && source.charCodeAt(next) === CH_LPAREN) break;
238
+ globEnd++;
239
+ }
240
+ }
241
+ } else if (character === CH_LBRACKET) {
242
+ if (brackets === undefined) brackets = bracketEnds(source, pos, end, parts, offset);
243
+ const close = brackets?.get(pos);
244
+ if (close === undefined) continue;
245
+ globEnd = close;
246
+ } else {
247
+ continue;
248
+ }
249
+
250
+ if (!result) result = [];
251
+ emittedIndex = appendRange(source, literalStart, pos, parts, emittedIndex, offset, result);
252
+ const text = source.slice(pos, globEnd);
253
+ let glob: GlobPart;
254
+ if (character === CH_LBRACKET) {
255
+ const interior: WordPart[] = [];
256
+ emittedIndex = appendRange(source, pos + 1, globEnd - 1, parts, emittedIndex, offset, interior);
257
+ glob = {
258
+ type: "Glob",
259
+ kind: "bracket",
260
+ pos: pos + offset,
261
+ end: globEnd + offset,
262
+ text,
263
+ value: "[" + wordPartsValue(interior) + "]",
264
+ parts: interior,
265
+ };
266
+ } else {
267
+ glob = {
268
+ type: "Glob",
269
+ kind: character === CH_STAR ? "star" : "question",
270
+ pos: pos + offset,
271
+ end: globEnd + offset,
272
+ text,
273
+ value: text,
274
+ parts: undefined,
275
+ };
276
+ }
277
+ result.push(glob);
278
+ literalStart = globEnd;
279
+ pos = globEnd - 1;
280
+ }
281
+ if (!result) return parts ?? undefined;
282
+ appendRange(source, literalStart, end, parts, emittedIndex, offset, result);
283
+ return result;
284
+ }