@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.
- package/README.md +3 -1
- package/THIRD_PARTY_NOTICES.md +27 -0
- package/dist/bin/mapper-connection.js +2 -1
- package/dist/bin/node-host.js +24 -5
- package/dist/src/alias-chain.js +35 -9
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +274 -496
- package/dist/src/augmentations.js +64 -3
- package/dist/src/automatic-types.js +10 -29
- package/dist/src/bindings.js +382 -0
- package/dist/src/commands/held.js +499 -0
- package/dist/src/commands/read.js +161 -0
- package/dist/src/commands/shell.js +169 -0
- package/dist/src/commands/tools.js +1847 -0
- package/dist/src/component-files.js +3 -2
- package/dist/src/component-layer.js +4 -2
- package/dist/src/config.js +6 -82
- package/dist/src/conformance-record.js +2 -2
- package/dist/src/consumers.js +10 -38
- package/dist/src/contextual-uses.js +57 -26
- package/dist/src/contract/config.generated.js +561 -0
- package/dist/src/contract/contract.generated.js +1370 -0
- package/dist/src/contract/report.generated.js +866 -0
- package/dist/src/dependencies.js +165 -122
- package/dist/src/destructuring.js +1 -19
- package/dist/src/edges.js +38 -122
- package/dist/src/element-access.js +181 -168
- package/dist/src/entries/build-scripts.js +222 -0
- package/dist/src/{configuration-files.js → entries/configuration-files.js} +52 -256
- package/dist/src/{convention-rows.js → entries/convention-rows.js} +170 -30
- package/dist/src/entries/conventions.js +740 -0
- package/dist/src/{html-entries.js → entries/html-entries.js} +12 -42
- package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +5 -28
- package/dist/src/entries/run-directories.js +77 -0
- package/dist/src/entries/sources.js +144 -0
- package/dist/src/entries/static-module.js +670 -0
- package/dist/src/entries/test-runners.js +650 -0
- package/dist/src/entries/workflow-steps.js +345 -0
- package/dist/src/exemptions/argument-places.js +131 -0
- package/dist/src/exemptions/calls.js +338 -0
- package/dist/src/exemptions/classes.js +13 -0
- package/dist/src/{decorator.js → exemptions/decorator.js} +19 -30
- package/dist/src/exemptions/detectors.js +48 -0
- package/dist/src/{enum-group.js → exemptions/enum-group.js} +9 -16
- package/dist/src/{erased-stores.js → exemptions/erased-stores.js} +7 -11
- package/dist/src/{framework-lifecycle.js → exemptions/framework-lifecycle.js} +76 -54
- package/dist/src/exemptions/generated-file.js +241 -0
- package/dist/src/{injection-container.js → exemptions/injection-container.js} +20 -26
- package/dist/src/exemptions/installed-globals.js +173 -0
- package/dist/src/{interface-satisfaction.js → exemptions/interface-satisfaction.js} +52 -121
- package/dist/src/exemptions/lifecycle.js +150 -0
- package/dist/src/{reflective-lookup.js → exemptions/reflective-lookup.js} +3 -3
- package/dist/src/exemptions/serialization-contract.js +1276 -0
- package/dist/src/exemptions/sites.js +182 -0
- package/dist/src/{template-field.js → exemptions/template-field.js} +13 -23
- package/dist/src/{value-reach.js → exemptions/value-reach.js} +14 -7
- package/dist/src/exposure.js +400 -0
- package/dist/src/extensions.js +37 -0
- package/dist/src/facts.js +38 -0
- package/dist/src/failure.js +36 -0
- package/dist/src/file-facts.js +3 -26
- package/dist/src/findings/completion.js +109 -56
- package/dist/src/findings/dependencies-and-module-machinery.js +4 -5
- package/dist/src/findings/emitters.js +27 -41
- package/dist/src/{implementations.js → findings/implementations.js} +3 -3
- package/dist/src/{in-operands.js → findings/in-operands.js} +3 -2
- package/dist/src/findings/interfaces.js +4 -5
- package/dist/src/findings/intra-function.js +16 -13
- package/dist/src/findings/non-code-artifacts.js +17 -12
- package/dist/src/findings/reads-and-writes.js +86 -27
- package/dist/src/findings/self-check.js +44 -30
- package/dist/src/findings/unused-declarations.js +29 -45
- package/dist/src/findings/visibility-narrowing.js +23 -31
- package/dist/src/findings-pass.js +13 -21
- package/dist/src/fs/document.js +52 -0
- package/dist/src/fs/manifest.js +67 -0
- package/dist/src/fs/tree.js +88 -0
- package/dist/src/git-ignore.js +39 -26
- package/dist/src/import-bindings.js +73 -28
- package/dist/src/index/sites.js +557 -0
- package/dist/src/index/values.js +124 -0
- package/dist/src/index.js +2 -2
- package/dist/src/indexed-access.js +523 -478
- package/dist/src/intra-function-parts.js +63 -43
- package/dist/src/inventory/commonjs.js +507 -0
- package/dist/src/inventory/enumerate.js +167 -0
- package/dist/src/inventory/syntax.js +236 -0
- package/dist/src/inventory.js +323 -724
- package/dist/src/javascript-file.js +48 -0
- package/dist/src/json-document.js +198 -67
- package/dist/src/keyof-comparisons.js +126 -107
- package/dist/src/kinds.js +3 -366
- package/dist/src/{components.js → liveness/components.js} +2 -3
- package/dist/src/{graph.js → liveness/graph.js} +52 -28
- package/dist/src/liveness/matrix.js +99 -0
- package/dist/src/liveness/sweep.js +558 -0
- package/dist/src/load/classify.js +289 -0
- package/dist/src/load/diagnostics.js +87 -0
- package/dist/src/load/discover.js +285 -0
- package/dist/src/{emit-map.js → load/emit-map.js} +1 -1
- package/dist/src/load/expected-module.js +136 -0
- package/dist/src/load/load.js +27 -0
- package/dist/src/load/module-lookup.js +37 -0
- package/dist/src/load/package-scope.js +56 -0
- package/dist/src/load/plan.js +313 -0
- package/dist/src/load/specifiers.js +113 -0
- package/dist/src/load/synthesize.js +152 -0
- package/dist/src/load/test-globals.js +207 -0
- package/dist/src/load/test-joins.js +82 -0
- package/dist/src/{workspace-manifests.js → load/workspace-manifests.js} +4 -4
- package/dist/src/{workspace-programs.js → load/workspace-programs.js} +89 -66
- package/dist/src/{workspace-resolution.js → load/workspace-resolution.js} +24 -66
- package/dist/src/{workspace-run.js → load/workspace-run.js} +7 -7
- package/dist/src/{workspace.js → load/workspace.js} +62 -124
- package/dist/src/module-declarations.js +70 -85
- package/dist/src/overrides.js +134 -112
- package/dist/src/partial.js +2 -1
- package/dist/src/paths.js +82 -16
- package/dist/src/platform-calls.js +78 -0
- package/dist/src/platform-symbols.js +134 -0
- package/dist/src/position.js +43 -1
- package/dist/src/print.js +11 -79
- package/dist/src/product.js +13 -0
- package/dist/src/query.js +95 -0
- package/dist/src/ref.js +12 -20
- package/dist/src/references/read-rule.js +1 -0
- package/dist/src/references/read-rules.js +48 -0
- package/dist/src/references/sink.js +237 -0
- package/dist/src/references/sources.js +450 -0
- package/dist/src/references.js +117 -1074
- package/dist/src/report-schema.js +51 -0
- package/dist/src/report.js +57 -41
- package/dist/src/reporters/annotations.js +15 -8
- package/dist/src/reporters/sarif.js +16 -10
- package/dist/src/reporters/template.js +4 -19
- package/dist/src/resolve.js +246 -730
- package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +22 -24
- package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +6 -15
- package/dist/src/roots/manifest.js +216 -0
- package/dist/src/roots/published-reach.js +412 -0
- package/dist/src/roots/root-set.js +487 -0
- package/dist/src/roots/unseen-loads.js +236 -0
- package/dist/src/run.js +66 -77
- package/dist/src/schema.js +320 -343
- package/dist/src/scope.js +38 -115
- package/dist/src/session.js +37 -29
- package/dist/src/source-files.js +6 -10
- package/dist/src/stores.js +4 -2
- package/dist/src/suppress-file.js +25 -28
- package/dist/src/suppress-inline.js +36 -83
- package/dist/src/suppress.js +50 -71
- package/dist/src/symbol-keys.js +92 -88
- package/dist/src/tests/file-class.js +76 -0
- package/dist/src/{outside-tests.js → tests/outside.js} +7 -7
- package/dist/src/{test-support.js → tests/support.js} +5 -12
- package/dist/src/text/compare.js +26 -0
- package/dist/src/text/glob.js +194 -0
- package/dist/src/text/named-files.js +298 -0
- package/dist/src/text/yaml.js +684 -0
- package/dist/src/type-errors.js +11 -232
- package/dist/src/type-parameter-reads.js +178 -139
- package/dist/src/unimplemented-callees.js +262 -242
- package/dist/src/unwrap.js +23 -0
- package/dist/src/usage.js +10 -0
- package/dist/src/vendor/unbash/ansi-c.js +132 -0
- package/dist/src/vendor/unbash/arithmetic-parts.js +37 -0
- package/dist/src/vendor/unbash/arithmetic.js +591 -0
- package/dist/src/vendor/unbash/assignment.js +131 -0
- package/dist/src/vendor/unbash/chars.js +48 -0
- package/dist/src/vendor/unbash/command.js +41 -0
- package/dist/src/vendor/unbash/expansion.js +80 -0
- package/dist/src/vendor/unbash/glob.js +268 -0
- package/dist/src/vendor/unbash/heredoc.js +27 -0
- package/dist/src/vendor/unbash/internal-types.js +1 -0
- package/dist/src/vendor/unbash/lexer.js +4274 -0
- package/dist/src/vendor/unbash/limits.js +3 -0
- package/dist/src/vendor/unbash/parser.js +1366 -0
- package/dist/src/vendor/unbash/parts.js +57 -0
- package/dist/src/vendor/unbash/substitution-context.js +8 -0
- package/dist/src/vendor/unbash/traversal.js +212 -0
- package/dist/src/vendor/unbash/types.js +1 -0
- package/dist/src/vendor/unbash/word-value.js +61 -0
- package/dist/src/vendor/unbash/word.js +40 -0
- package/dist/src/verbs/analyze.js +194 -127
- package/dist/src/verbs/describe.js +13 -18
- package/dist/src/verbs/explain.js +85 -139
- package/dist/src/verbs/print-config.js +2 -1
- package/dist/src/verbs/print-projects.js +6 -4
- package/dist/src/verbs/print-retained.js +30 -6
- package/dist/src/verbs/print-roots.js +4 -2
- package/dist/src/verbs/verb.js +1 -5
- package/dist/src/verbs/version.js +14 -3
- package/jsr.json +2 -1
- package/package.json +14 -8
- package/src/alias-chain.ts +40 -11
- package/src/amd.ts +130 -0
- package/src/analysis.ts +426 -733
- package/src/augmentations.ts +93 -4
- package/src/automatic-types.ts +12 -30
- package/src/bindings.ts +460 -0
- package/src/commands/held.ts +632 -0
- package/src/commands/read.ts +242 -0
- package/src/commands/shell.ts +228 -0
- package/src/commands/tools.ts +2382 -0
- package/src/component-files.ts +4 -2
- package/src/component-layer.ts +4 -2
- package/src/config.ts +31 -302
- package/src/conformance-record.ts +2 -2
- package/src/consumers.ts +16 -66
- package/src/contextual-uses.ts +66 -34
- package/src/contract/config.generated.ts +821 -0
- package/src/contract/contract.generated.ts +1453 -0
- package/src/contract/report.generated.ts +1241 -0
- package/src/dependencies.ts +223 -128
- package/src/destructuring.ts +1 -31
- package/src/edges.ts +41 -140
- package/src/element-access.ts +190 -187
- package/src/entries/build-scripts.ts +292 -0
- package/src/{configuration-files.ts → entries/configuration-files.ts} +68 -278
- package/src/{convention-rows.ts → entries/convention-rows.ts} +227 -31
- package/src/{conventions.ts → entries/conventions.ts} +367 -583
- package/src/{html-entries.ts → entries/html-entries.ts} +22 -48
- package/src/{mdx-entries.ts → entries/mdx-entries.ts} +7 -30
- package/src/entries/run-directories.ts +108 -0
- package/src/entries/sources.ts +266 -0
- package/src/entries/static-module.ts +858 -0
- package/src/entries/test-runners.ts +835 -0
- package/src/entries/workflow-steps.ts +432 -0
- package/src/exemptions/argument-places.ts +198 -0
- package/src/exemptions/calls.ts +483 -0
- package/src/exemptions/classes.ts +49 -0
- package/src/exemptions/decorator.ts +56 -0
- package/src/exemptions/detectors.ts +75 -0
- package/src/{enum-group.ts → exemptions/enum-group.ts} +10 -19
- package/src/{erased-stores.ts → exemptions/erased-stores.ts} +7 -14
- package/src/{framework-lifecycle.ts → exemptions/framework-lifecycle.ts} +85 -66
- package/src/exemptions/generated-file.ts +318 -0
- package/src/{injection-container.ts → exemptions/injection-container.ts} +29 -34
- package/src/exemptions/installed-globals.ts +255 -0
- package/src/{interface-satisfaction.ts → exemptions/interface-satisfaction.ts} +69 -160
- package/src/exemptions/lifecycle.ts +286 -0
- package/src/{reflective-lookup.ts → exemptions/reflective-lookup.ts} +5 -5
- package/src/exemptions/serialization-contract.ts +1729 -0
- package/src/exemptions/sites.ts +293 -0
- package/src/{template-field.ts → exemptions/template-field.ts} +22 -32
- package/src/{value-reach.ts → exemptions/value-reach.ts} +16 -8
- package/src/exposure.ts +492 -0
- package/src/extensions.ts +45 -0
- package/src/facts.ts +46 -0
- package/src/failure.ts +63 -0
- package/src/file-facts.ts +15 -25
- package/src/finding.ts +10 -10
- package/src/findings/boundary.ts +11 -0
- package/src/findings/completion.ts +133 -64
- package/src/findings/dependencies-and-module-machinery.ts +4 -7
- package/src/findings/emitter.ts +9 -10
- package/src/findings/emitters.ts +38 -52
- package/src/{implementations.ts → findings/implementations.ts} +4 -4
- package/src/{in-operands.ts → findings/in-operands.ts} +4 -3
- package/src/findings/interfaces.ts +7 -9
- package/src/findings/intra-function.ts +16 -14
- package/src/findings/non-code-artifacts.ts +24 -15
- package/src/findings/reads-and-writes.ts +118 -41
- package/src/findings/self-check.ts +51 -38
- package/src/findings/unused-declarations.ts +31 -49
- package/src/findings/visibility-narrowing.ts +36 -40
- package/src/findings-pass.ts +15 -31
- package/src/fs/document.ts +70 -0
- package/src/fs/manifest.ts +96 -0
- package/src/fs/tree.ts +110 -0
- package/src/git-ignore.ts +50 -26
- package/src/host.ts +12 -5
- package/src/import-bindings.ts +98 -29
- package/src/index/sites.ts +781 -0
- package/src/index/values.ts +170 -0
- package/src/index.ts +2 -2
- package/src/indexed-access.ts +570 -527
- package/src/intra-function-parts.ts +73 -44
- package/src/inventory/commonjs.ts +696 -0
- package/src/inventory/enumerate.ts +203 -0
- package/src/inventory/syntax.ts +311 -0
- package/src/inventory.ts +442 -895
- package/src/javascript-file.ts +54 -0
- package/src/json-document.ts +241 -76
- package/src/keyof-comparisons.ts +133 -122
- package/src/kinds.ts +5 -413
- package/src/{components.ts → liveness/components.ts} +4 -6
- package/src/{graph.ts → liveness/graph.ts} +100 -35
- package/src/liveness/matrix.ts +162 -0
- package/src/liveness/sweep.ts +855 -0
- package/src/load/classify.ts +433 -0
- package/src/load/diagnostics.ts +154 -0
- package/src/load/discover.ts +471 -0
- package/src/{emit-map.ts → load/emit-map.ts} +1 -1
- package/src/load/expected-module.ts +194 -0
- package/src/load/load.ts +73 -0
- package/src/load/module-lookup.ts +50 -0
- package/src/load/package-scope.ts +74 -0
- package/src/load/plan.ts +513 -0
- package/src/load/specifiers.ts +171 -0
- package/src/load/synthesize.ts +230 -0
- package/src/load/test-globals.ts +251 -0
- package/src/load/test-joins.ts +98 -0
- package/src/{workspace-manifests.ts → load/workspace-manifests.ts} +5 -5
- package/src/{workspace-programs.ts → load/workspace-programs.ts} +128 -85
- package/src/{workspace-resolution.ts → load/workspace-resolution.ts} +41 -77
- package/src/{workspace-run.ts → load/workspace-run.ts} +18 -16
- package/src/{workspace.ts → load/workspace.ts} +90 -134
- package/src/module-declarations.ts +74 -98
- package/src/overrides.ts +162 -134
- package/src/partial.ts +3 -2
- package/src/paths.ts +92 -16
- package/src/platform-calls.ts +119 -0
- package/src/platform-symbols.ts +189 -0
- package/src/position.ts +44 -1
- package/src/print.ts +12 -92
- package/src/product.ts +18 -0
- package/src/query.ts +201 -10
- package/src/ref.ts +12 -20
- package/src/references/read-rule.ts +60 -0
- package/src/references/read-rules.ts +55 -0
- package/src/references/sink.ts +314 -0
- package/src/references/sources.ts +632 -0
- package/src/references.ts +187 -1450
- package/src/report-schema.ts +68 -0
- package/src/report.ts +103 -226
- package/src/reporters/annotations.ts +22 -11
- package/src/reporters/json.ts +1 -1
- package/src/reporters/reporter.ts +2 -4
- package/src/reporters/reporters.ts +1 -1
- package/src/reporters/sarif.ts +29 -16
- package/src/reporters/template.ts +4 -20
- package/src/reporters/text.ts +3 -3
- package/src/resolve.ts +284 -1115
- package/src/{configured-declarations.ts → roots/configured-declarations.ts} +26 -29
- package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +7 -16
- package/src/roots/manifest.ts +303 -0
- package/src/roots/published-reach.ts +486 -0
- package/src/{roots.ts → roots/root-set.ts} +286 -469
- package/src/roots/unseen-loads.ts +345 -0
- package/src/run.ts +75 -91
- package/src/schema.ts +391 -388
- package/src/scope.ts +46 -138
- package/src/session.ts +87 -55
- package/src/source-files.ts +6 -11
- package/src/stores.ts +15 -3
- package/src/suppress-file.ts +24 -33
- package/src/suppress-inline.ts +55 -91
- package/src/suppress.ts +78 -79
- package/src/symbol-keys.ts +104 -107
- package/src/tests/file-class.ts +135 -0
- package/src/{outside-tests.ts → tests/outside.ts} +16 -10
- package/src/{test-support.ts → tests/support.ts} +15 -21
- package/src/text/compare.ts +27 -0
- package/src/text/glob.ts +210 -0
- package/src/text/named-files.ts +388 -0
- package/src/text/yaml.ts +747 -0
- package/src/type-errors.ts +18 -288
- package/src/type-parameter-reads.ts +187 -158
- package/src/unimplemented-callees.ts +297 -280
- package/src/unwrap.ts +34 -0
- package/src/usage.ts +10 -0
- package/src/vendor/unbash/LICENSE +15 -0
- package/src/vendor/unbash/VENDORED.md +16 -0
- package/src/vendor/unbash/ansi-c.ts +132 -0
- package/src/vendor/unbash/arithmetic-parts.ts +53 -0
- package/src/vendor/unbash/arithmetic.ts +641 -0
- package/src/vendor/unbash/assignment.ts +163 -0
- package/src/vendor/unbash/chars.ts +48 -0
- package/src/vendor/unbash/command.ts +47 -0
- package/src/vendor/unbash/expansion.ts +144 -0
- package/src/vendor/unbash/glob.ts +284 -0
- package/src/vendor/unbash/heredoc.ts +34 -0
- package/src/vendor/unbash/internal-types.ts +94 -0
- package/src/vendor/unbash/lexer.ts +4352 -0
- package/src/vendor/unbash/limits.ts +3 -0
- package/src/vendor/unbash/parser.ts +1612 -0
- package/src/vendor/unbash/parts.ts +96 -0
- package/src/vendor/unbash/substitution-context.ts +20 -0
- package/src/vendor/unbash/traversal.ts +182 -0
- package/src/vendor/unbash/types.ts +660 -0
- package/src/vendor/unbash/word-value.ts +64 -0
- package/src/vendor/unbash/word.ts +50 -0
- package/src/verbs/analyze.ts +255 -164
- package/src/verbs/describe.ts +19 -17
- package/src/verbs/explain.ts +93 -169
- package/src/verbs/print-config.ts +2 -1
- package/src/verbs/print-projects.ts +6 -4
- package/src/verbs/print-retained.ts +36 -6
- package/src/verbs/print-roots.ts +4 -2
- package/src/verbs/verb.ts +2 -8
- package/src/verbs/version.ts +15 -3
- package/dist/src/base-url.js +0 -18
- package/dist/src/calls.js +0 -155
- package/dist/src/conventions.js +0 -937
- package/dist/src/discover.js +0 -468
- package/dist/src/entry-points.js +0 -529
- package/dist/src/exempt-classes.js +0 -75
- package/dist/src/exempt.js +0 -209
- package/dist/src/generated-file.js +0 -95
- package/dist/src/glob.js +0 -65
- package/dist/src/manifest.js +0 -165
- package/dist/src/matrix.js +0 -246
- package/dist/src/pnpm-workspace.js +0 -120
- package/dist/src/roots.js +0 -672
- package/dist/src/serialization-contract.js +0 -611
- package/dist/src/setup-failure.js +0 -23
- package/dist/src/sweep.js +0 -224
- package/dist/src/test-joins.js +0 -101
- package/dist/src/value-flow.js +0 -74
- package/dist/src/version.js +0 -7
- package/dist/src/workflow-steps.js +0 -185
- package/src/base-url.ts +0 -24
- package/src/calls.ts +0 -225
- package/src/decorator.ts +0 -78
- package/src/discover.ts +0 -653
- package/src/entry-points.ts +0 -687
- package/src/exempt-classes.ts +0 -123
- package/src/exempt.ts +0 -323
- package/src/generated-file.ts +0 -111
- package/src/glob.ts +0 -67
- package/src/manifest.ts +0 -234
- package/src/matrix.ts +0 -423
- package/src/pnpm-workspace.ts +0 -135
- package/src/serialization-contract.ts +0 -849
- package/src/setup-failure.ts +0 -39
- package/src/sweep.ts +0 -347
- package/src/test-joins.ts +0 -120
- package/src/value-flow.ts +0 -104
- package/src/version.ts +0 -7
- package/src/workflow-steps.ts +0 -216
package/src/file-facts.ts
CHANGED
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { SourceFile } from "@typescript/native/ast";
|
|
8
|
-
import { IGNORED_DIRECTORIES } from "./discover.ts";
|
|
9
8
|
import type { Host } from "./host.ts";
|
|
10
|
-
import { packageScope } from "./
|
|
9
|
+
import { packageScope } from "./load/package-scope.ts";
|
|
11
10
|
import { dirnamePath, joinPath, relativePath, resolvePath } from "./paths.ts";
|
|
12
11
|
import { renderRef } from "./ref.ts";
|
|
13
12
|
import type { ProjectView } from "./session.ts";
|
|
13
|
+
import type { UnseenLoad } from "./roots/unseen-loads.ts";
|
|
14
|
+
import { filesBelow } from "./fs/tree.ts";
|
|
14
15
|
|
|
15
16
|
/** A file name the compiler reads as a source file. */
|
|
16
17
|
const SOURCE_FILE = /\.(?:ts|tsx|mts|cts)$/u;
|
|
@@ -51,6 +52,13 @@ export interface FileFacts {
|
|
|
51
52
|
readonly generated?: ReadonlySet<string>;
|
|
52
53
|
/** The property names an `in` expression of a production file tests by a literal. */
|
|
53
54
|
readonly inOperands?: ReadonlySet<string>;
|
|
55
|
+
/** The loads of production files whose target the analysis cannot resolve. */
|
|
56
|
+
readonly unseenLoads?: readonly UnseenLoad[];
|
|
57
|
+
/**
|
|
58
|
+
* The directories below the target root, `.` for the root, of the packages a command of
|
|
59
|
+
* which may run a file whose path no word of it writes (`roots.13`).
|
|
60
|
+
*/
|
|
61
|
+
readonly unwrittenRuns?: ReadonlySet<string>;
|
|
54
62
|
}
|
|
55
63
|
|
|
56
64
|
/** The line of the last character of one text, counted from one; an empty text is one line. */
|
|
@@ -71,29 +79,11 @@ function lastLine(text: string): number {
|
|
|
71
79
|
* that cannot be read is skipped, as discovery skips it.
|
|
72
80
|
*/
|
|
73
81
|
export function sourcePaths(host: Host, targetRoot: string): readonly string[] {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
entries = host.readDirectory(joinPath(targetRoot, dir));
|
|
80
|
-
} catch {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
for (const entry of entries) {
|
|
84
|
-
const path = dir === "" ? entry.name : `${dir}/${entry.name}`;
|
|
85
|
-
if (entry.directory) {
|
|
86
|
-
if (!IGNORED_DIRECTORIES.has(entry.name)) {
|
|
87
|
-
pending.push(path);
|
|
88
|
-
}
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
if (SOURCE_FILE.test(entry.name) && !DECLARATION_FILE.test(entry.name)) {
|
|
92
|
-
found.push(path);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return found.sort((a, b) => (a < b ? -1 : 1));
|
|
82
|
+
return filesBelow(
|
|
83
|
+
host,
|
|
84
|
+
targetRoot,
|
|
85
|
+
(name) => SOURCE_FILE.test(name) && !DECLARATION_FILE.test(name),
|
|
86
|
+
);
|
|
97
87
|
}
|
|
98
88
|
|
|
99
89
|
/**
|
package/src/finding.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { Confidence, Severity } from "./
|
|
2
|
-
import type { Fixability } from "./kinds.ts";
|
|
1
|
+
import type { Fixability, Confidence, Severity } from "./contract/contract.generated.ts";
|
|
3
2
|
import type { DependencySection } from "./ref.ts";
|
|
4
3
|
import type { Mechanism } from "./suppress.ts";
|
|
5
|
-
import type { Relation } from "./sweep.ts";
|
|
4
|
+
import type { Relation } from "./liveness/sweep.ts";
|
|
5
|
+
import type { FindingSymbol } from "./contract/report.generated.ts";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* The finding: what an emitter decides about one subject, and every member the
|
|
@@ -29,7 +29,7 @@ interface FindingSubject {
|
|
|
29
29
|
/** The stable symbol reference, or for a configured root the root as written. */
|
|
30
30
|
readonly ref: string;
|
|
31
31
|
/** The subject kind, from the closed vocabulary of the finding schema. */
|
|
32
|
-
readonly kind:
|
|
32
|
+
readonly kind: FindingSymbol["kind"];
|
|
33
33
|
/** The display name a text line renders. */
|
|
34
34
|
readonly name: string;
|
|
35
35
|
/** The number of source lines the subject spans. */
|
|
@@ -55,19 +55,19 @@ export interface PositionedSymbol {
|
|
|
55
55
|
*/
|
|
56
56
|
export interface FindingDetails {
|
|
57
57
|
/**
|
|
58
|
-
* On `
|
|
58
|
+
* On `DS1501` and `DS1503`: the widest scope that holds every reference to the
|
|
59
59
|
* subject, which is the visibility its references support.
|
|
60
60
|
*/
|
|
61
61
|
readonly narrowerVisibility?: "file" | "package";
|
|
62
|
-
/** On `DS1201` and `
|
|
62
|
+
/** On `DS1201` and `DS1202`: the classes implementing the interface, in site order. */
|
|
63
63
|
readonly implementations?: readonly PositionedSymbol[];
|
|
64
|
-
/** On `DS1301` and `
|
|
64
|
+
/** On `DS1301` and `DS1404`: every position the subject is written at, in site order. */
|
|
65
65
|
readonly writePositions?: readonly FindingPosition[];
|
|
66
|
-
/** On `
|
|
66
|
+
/** On `DS1701`: the manifest section that declares the dependency. */
|
|
67
67
|
readonly dependencyClass?: DependencySection;
|
|
68
|
-
/** On `
|
|
68
|
+
/** On `DS9001` and `DS9002`: the document that holds the refused suppression. */
|
|
69
69
|
readonly mechanism?: Mechanism;
|
|
70
|
-
/** On `
|
|
70
|
+
/** On `DS9001` and `DS9002`: the refused suppression as written, a member absent where it lacks one. */
|
|
71
71
|
readonly entry?: SuppressionEntry;
|
|
72
72
|
/** On the intra-function kinds: the external rules that report the same kind, as the vocabulary lists them. */
|
|
73
73
|
readonly overlap?: readonly string[];
|
package/src/findings/boundary.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Carriers } from "../exposure.ts";
|
|
2
|
+
|
|
1
3
|
/** Which side of a declared cross-language edge, as the edges document spells it. */
|
|
2
4
|
export type EdgeSideName = "provides" | "used_by";
|
|
3
5
|
|
|
@@ -25,4 +27,13 @@ export interface Boundary {
|
|
|
25
27
|
readonly encapsulated: boolean;
|
|
26
28
|
/** Every side of a declared cross-language edge that names a symbol of this language. */
|
|
27
29
|
readonly edges: readonly EdgeSide[];
|
|
30
|
+
/** The members a function outside the analysis fills, which it may read unseen. */
|
|
31
|
+
readonly filledOutside?: ReadonlySet<string>;
|
|
32
|
+
/** The files and declarations only a bundler's retry of an import Node leaves unresolved names. */
|
|
33
|
+
readonly possiblyLoaded?: ReadonlySet<string>;
|
|
34
|
+
/**
|
|
35
|
+
* The types of the target each declaration hands to code that holds its values, which a
|
|
36
|
+
* reference from outside the package reaches through it.
|
|
37
|
+
*/
|
|
38
|
+
readonly carriers?: Carriers;
|
|
28
39
|
}
|
|
@@ -4,39 +4,38 @@
|
|
|
4
4
|
* together with every finding that falls with a root they withhold.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import {
|
|
8
|
+
CODE,
|
|
9
|
+
FAMILY_KEY_LENGTH,
|
|
10
|
+
type Confidence,
|
|
11
|
+
type Severity,
|
|
12
|
+
KIND_ROWS,
|
|
13
|
+
type KindRow,
|
|
14
|
+
} from "../contract/contract.generated.ts";
|
|
7
15
|
import type { RunSweep } from "../analysis.ts";
|
|
8
|
-
import { componentId, type Component } from "../components.ts";
|
|
9
|
-
import { deadComponents } from "../
|
|
10
|
-
import type { Cascade
|
|
16
|
+
import { componentId, type Component } from "../liveness/components.ts";
|
|
17
|
+
import { deadComponents } from "../liveness/sweep.ts";
|
|
18
|
+
import type { Cascade } from "../config.ts";
|
|
11
19
|
import type { CompletedFinding, Finding, FindingComponent, PositionedSymbol } from "../finding.ts";
|
|
12
|
-
import { OUTSIDE, type Graph } from "../graph.ts";
|
|
20
|
+
import { OUTSIDE, type Graph } from "../liveness/graph.ts";
|
|
13
21
|
import type { SymbolKind } from "../inventory.ts";
|
|
14
|
-
import { KINDS
|
|
22
|
+
import { KINDS } from "../kinds.ts";
|
|
15
23
|
import { byPosition, positionKey } from "../position.ts";
|
|
16
24
|
import { declarationKey } from "../ref.ts";
|
|
17
|
-
import { FAMILY_KEY_LENGTH } from "../resolve.ts";
|
|
18
25
|
import { isPartSubject, isRowSubject, type Dials } from "../suppress.ts";
|
|
19
|
-
import type { Candidate } from "../sweep.ts";
|
|
26
|
+
import type { Candidate } from "../liveness/sweep.ts";
|
|
20
27
|
import type { Boundary } from "./boundary.ts";
|
|
21
28
|
import type { EmitterInput } from "./emitter.ts";
|
|
22
29
|
|
|
23
|
-
/** The unused-file code, whose deletion removes every use its file writes. */
|
|
24
|
-
const FILE_NEVER_IMPORTED = "DS1502";
|
|
25
|
-
|
|
26
30
|
/**
|
|
27
|
-
* The codes whose subject the run that counts test references holds live,
|
|
28
|
-
*
|
|
29
|
-
* none of a dead declaration's sweep facts.
|
|
31
|
+
* The codes whose subject the run that counts test references holds live, so a test
|
|
32
|
+
* file's candidate reported under one carries none of a dead declaration's sweep facts.
|
|
30
33
|
*/
|
|
31
|
-
const LIVE_SUBJECT: ReadonlySet<string> = new Set(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"DS1104",
|
|
35
|
-
"DS1204",
|
|
36
|
-
"DS1301",
|
|
37
|
-
]);
|
|
34
|
+
const LIVE_SUBJECT: ReadonlySet<string> = new Set(
|
|
35
|
+
KIND_ROWS.filter((row) => row.holdsLive).map((row) => row.code),
|
|
36
|
+
);
|
|
38
37
|
|
|
39
|
-
/** The fixability grammar/analysis.md
|
|
38
|
+
/** The fixability grammar/analysis/fixability.md gives a finding about a held declaration. */
|
|
40
39
|
const MANUAL = "manual";
|
|
41
40
|
|
|
42
41
|
/** The member kinds an object property can declare, which an `in` expression tests by name. */
|
|
@@ -66,10 +65,9 @@ function everyDeclaredLoaded(boundary: Boundary): boolean {
|
|
|
66
65
|
* naming its family, else the code's default.
|
|
67
66
|
*/
|
|
68
67
|
function severityOf(input: EmitterInput, code: string, fallback: Severity): Severity {
|
|
69
|
-
const {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
);
|
|
68
|
+
const { severity } = input.config;
|
|
69
|
+
const key = [code, code.slice(0, FAMILY_KEY_LENGTH)].find((one) => Object.hasOwn(severity, one));
|
|
70
|
+
return key === undefined ? fallback : (severity[key] ?? fallback);
|
|
73
71
|
}
|
|
74
72
|
|
|
75
73
|
/**
|
|
@@ -112,10 +110,13 @@ function testedByIn(input: EmitterInput): ReadonlySet<string> {
|
|
|
112
110
|
* published API, a public member of a published type included, is `certain` where the
|
|
113
111
|
* run loaded every consumer the scope declared and declared one, `probable` where one did
|
|
114
112
|
* not load, and `possible` where it declared none, whatever the configuration says of the
|
|
115
|
-
* consumer set. A member an `in` expression tests by name
|
|
113
|
+
* consumer set. A member an `in` expression tests by name, one a function outside the
|
|
114
|
+
* analysis fills, and one {@link possiblyLoaded} names, is `possible`.
|
|
116
115
|
*/
|
|
117
|
-
function reachabilityClasses(input: EmitterInput): (id: string) => Confidence {
|
|
116
|
+
export function reachabilityClasses(input: EmitterInput): (id: string) => Confidence {
|
|
118
117
|
const tested = testedByIn(input);
|
|
118
|
+
const filled = input.boundary.filledOutside ?? new Set<string>();
|
|
119
|
+
const possible = possiblyLoaded(input);
|
|
119
120
|
const published = publishedIds(input.swept.matrix.union);
|
|
120
121
|
const { declared } = input.boundary.consumers;
|
|
121
122
|
const outside: Confidence =
|
|
@@ -125,7 +126,7 @@ function reachabilityClasses(input: EmitterInput): (id: string) => Confidence {
|
|
|
125
126
|
? "certain"
|
|
126
127
|
: "probable";
|
|
127
128
|
return (id) => {
|
|
128
|
-
if (tested.has(id)) {
|
|
129
|
+
if (tested.has(id) || filled.has(id) || possible.has(id)) {
|
|
129
130
|
return "possible";
|
|
130
131
|
}
|
|
131
132
|
return published.has(id) ? outside : "certain";
|
|
@@ -168,9 +169,39 @@ function testCeilings(
|
|
|
168
169
|
: "certain";
|
|
169
170
|
}
|
|
170
171
|
|
|
172
|
+
/**
|
|
173
|
+
* What only a bundler's retry of an import Node leaves unresolved names (program.38), and each
|
|
174
|
+
* dead declaration that reaches through dead declarations, as confidence.20 reads what only
|
|
175
|
+
* tests reach: each is dead only while no loader the analysis does not see loads the file.
|
|
176
|
+
*/
|
|
177
|
+
function possiblyLoaded(input: EmitterInput): ReadonlySet<string> {
|
|
178
|
+
const seeds = input.boundary.possiblyLoaded ?? new Set<string>();
|
|
179
|
+
if (seeds.size === 0) {
|
|
180
|
+
return seeds;
|
|
181
|
+
}
|
|
182
|
+
const union = input.swept.matrix.union;
|
|
183
|
+
const dead = new Set(input.swept.sweep.candidates.map((one) => one.id));
|
|
184
|
+
const reached = new Set<string>();
|
|
185
|
+
const pending = union.symbols.flatMap((symbol, at) => (seeds.has(symbol.id) ? [at] : []));
|
|
186
|
+
for (let at = pending.pop(); at !== undefined; at = pending.pop()) {
|
|
187
|
+
const symbol = union.symbols[at];
|
|
188
|
+
if (symbol === undefined || reached.has(symbol.id)) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
reached.add(symbol.id);
|
|
192
|
+
for (const edge of union.out[at] ?? []) {
|
|
193
|
+
const to = union.symbols[edge.to];
|
|
194
|
+
if (to !== undefined && dead.has(to.id)) {
|
|
195
|
+
pending.push(edge.to);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return reached;
|
|
200
|
+
}
|
|
201
|
+
|
|
171
202
|
/**
|
|
172
203
|
* The subjects dead only because production code only tests use is: each declaration the
|
|
173
|
-
* sweep marks test-used, each `
|
|
204
|
+
* sweep marks test-used, each `DS1602` file of such code, and each test of dead code every
|
|
174
205
|
* target of which is one. Nothing they hold references a dead declaration outside them, so
|
|
175
206
|
* the rest of a component they share is reported without them.
|
|
176
207
|
*/
|
|
@@ -197,17 +228,21 @@ function testUsedSubjects(input: EmitterInput): {
|
|
|
197
228
|
|
|
198
229
|
/**
|
|
199
230
|
* The ceiling the roots the run found put on one dead subject: a subject other declarations
|
|
200
|
-
* reference, found dead only because no root reaches them, is `probable` unless
|
|
201
|
-
*
|
|
202
|
-
*
|
|
231
|
+
* reference, found dead only because no root reaches them, is `probable` unless the
|
|
232
|
+
* configuration declares the roots complete and no configuration holding the subject loads
|
|
233
|
+
* a module the analysis cannot resolve, because a root the analysis cannot see would make
|
|
234
|
+
* it live; every other declaration has none below `certain`.
|
|
203
235
|
*/
|
|
204
236
|
function rootsCeiling(
|
|
205
237
|
input: EmitterInput,
|
|
206
238
|
finding: Finding,
|
|
207
239
|
candidate: Candidate | undefined,
|
|
240
|
+
configurations: readonly string[],
|
|
208
241
|
): Confidence {
|
|
209
242
|
const unreachable = candidate?.relation === "reachability" || finding.unreachableOnly === true;
|
|
210
|
-
|
|
243
|
+
const unseen = new Set((input.files.unseenLoads ?? []).map((load) => load.configuration));
|
|
244
|
+
const complete = input.config.ts.roots_complete && !configurations.some((one) => unseen.has(one));
|
|
245
|
+
return unreachable && !complete ? "probable" : "certain";
|
|
211
246
|
}
|
|
212
247
|
|
|
213
248
|
/**
|
|
@@ -225,9 +260,28 @@ function findingComponents(
|
|
|
225
260
|
held.set(member, component);
|
|
226
261
|
}
|
|
227
262
|
}
|
|
263
|
+
const listed = membersListed(swept);
|
|
264
|
+
return (id) => {
|
|
265
|
+
const component = held.get(id);
|
|
266
|
+
return component === undefined
|
|
267
|
+
? undefined
|
|
268
|
+
: {
|
|
269
|
+
id: component.id,
|
|
270
|
+
root: component.roots.includes(id),
|
|
271
|
+
symbolCount: component.members.length,
|
|
272
|
+
deletableLines: component.deletableLines,
|
|
273
|
+
...(cascade === "full" ? { members: listed(component.members) } : {}),
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** The members of a component as the run lists them, positioned and in the canonical order. */
|
|
279
|
+
function membersListed(
|
|
280
|
+
swept: RunSweep,
|
|
281
|
+
): (members: readonly string[]) => readonly PositionedSymbol[] {
|
|
228
282
|
const symbols = new Map(swept.matrix.union.symbols.map((symbol) => [symbol.id, symbol]));
|
|
229
|
-
|
|
230
|
-
|
|
283
|
+
return (members) =>
|
|
284
|
+
members
|
|
231
285
|
.flatMap((member) => {
|
|
232
286
|
const symbol = symbols.get(member);
|
|
233
287
|
return symbol === undefined
|
|
@@ -244,22 +298,10 @@ function findingComponents(
|
|
|
244
298
|
];
|
|
245
299
|
})
|
|
246
300
|
.sort((a, b) => byPosition(a.position, b.position));
|
|
247
|
-
return (id) => {
|
|
248
|
-
const component = held.get(id);
|
|
249
|
-
return component === undefined
|
|
250
|
-
? undefined
|
|
251
|
-
: {
|
|
252
|
-
id: component.id,
|
|
253
|
-
root: component.roots.includes(id),
|
|
254
|
-
symbolCount: component.members.length,
|
|
255
|
-
deletableLines: component.deletableLines,
|
|
256
|
-
...(cascade === "full" ? { members: listed(component) } : {}),
|
|
257
|
-
};
|
|
258
|
-
};
|
|
259
301
|
}
|
|
260
302
|
|
|
261
303
|
/**
|
|
262
|
-
* The run's dead components with each file a `
|
|
304
|
+
* The run's dead components with each file a `DS1602` finding reports dead among them, so
|
|
263
305
|
* the file's declarations fall with it, and with the components each subject that is no
|
|
264
306
|
* declaration falls with joined into one.
|
|
265
307
|
*/
|
|
@@ -273,7 +315,7 @@ function runComponents(
|
|
|
273
315
|
} {
|
|
274
316
|
const union = swept.matrix.union;
|
|
275
317
|
const reported = new Set(
|
|
276
|
-
findings.filter((one) => one.code ===
|
|
318
|
+
findings.filter((one) => one.code === CODE.fileNeverImported).map((one) => one.position.path),
|
|
277
319
|
);
|
|
278
320
|
const files = new Map(
|
|
279
321
|
union.symbols.flatMap((symbol, at) =>
|
|
@@ -348,6 +390,9 @@ export function completed(
|
|
|
348
390
|
union.symbols.map((symbol, at) => [declarationKey(symbol.ref, symbol.position.path), at]),
|
|
349
391
|
);
|
|
350
392
|
const candidates = new Map(swept.sweep.candidates.map((candidate) => [candidate.id, candidate]));
|
|
393
|
+
const fileIds = new Map(
|
|
394
|
+
union.symbols.flatMap((one) => (one.kind === "file" ? [[one.position.path, one.id]] : [])),
|
|
395
|
+
);
|
|
351
396
|
const classOf = reachabilityClasses(input);
|
|
352
397
|
const ceilingOf = testCeilings(input, classOf);
|
|
353
398
|
const testUsed = testUsedSubjects(input);
|
|
@@ -357,12 +402,13 @@ export function completed(
|
|
|
357
402
|
// A join keeps its first component's identifier, so a minted one counts past every computed one.
|
|
358
403
|
let minted = computed;
|
|
359
404
|
const dead = new Set(components.map((component) => component.id));
|
|
360
|
-
const fallingWith = new Map<string,
|
|
361
|
-
for (const { heldByTests } of swept.sweep.candidates) {
|
|
405
|
+
const fallingWith = new Map<string, string[]>();
|
|
406
|
+
for (const { id, heldByTests } of swept.sweep.candidates) {
|
|
362
407
|
if (heldByTests !== undefined) {
|
|
363
|
-
fallingWith.set(heldByTests, (fallingWith.get(heldByTests) ??
|
|
408
|
+
fallingWith.set(heldByTests, [...(fallingWith.get(heldByTests) ?? []), id]);
|
|
364
409
|
}
|
|
365
410
|
}
|
|
411
|
+
const listed = membersListed(swept);
|
|
366
412
|
|
|
367
413
|
const done = findings.map((finding): CompletedFinding => {
|
|
368
414
|
const row = kinds.get(finding.code);
|
|
@@ -391,7 +437,7 @@ export function completed(
|
|
|
391
437
|
const fallsWith = finding.fallsWith?.[0];
|
|
392
438
|
const joined = fallsWith === undefined ? undefined : componentOf(fallsWith);
|
|
393
439
|
const file =
|
|
394
|
-
finding.code ===
|
|
440
|
+
finding.code === CODE.fileNeverImported ? files.get(finding.position.path) : undefined;
|
|
395
441
|
const found =
|
|
396
442
|
joined !== undefined
|
|
397
443
|
? { ...joined, root: false }
|
|
@@ -413,11 +459,25 @@ export function completed(
|
|
|
413
459
|
let component = found;
|
|
414
460
|
if (component === undefined) {
|
|
415
461
|
minted += 1;
|
|
462
|
+
const falling = symbol?.kind === "interface" ? fallingWith.get(symbol.id) : undefined;
|
|
416
463
|
component = {
|
|
417
464
|
id: componentId(minted),
|
|
418
465
|
root: true,
|
|
419
|
-
symbolCount:
|
|
466
|
+
symbolCount: falling?.length ?? 1,
|
|
420
467
|
deletableLines: 0,
|
|
468
|
+
...(input.config.reporters.cascade !== "full"
|
|
469
|
+
? {}
|
|
470
|
+
: falling === undefined
|
|
471
|
+
? {
|
|
472
|
+
members: [
|
|
473
|
+
{
|
|
474
|
+
ref: finding.symbol.ref,
|
|
475
|
+
name: finding.symbol.name,
|
|
476
|
+
position: finding.position,
|
|
477
|
+
},
|
|
478
|
+
],
|
|
479
|
+
}
|
|
480
|
+
: { members: listed(falling) }),
|
|
421
481
|
};
|
|
422
482
|
}
|
|
423
483
|
const counts =
|
|
@@ -425,14 +485,27 @@ export function completed(
|
|
|
425
485
|
? union.made[at]
|
|
426
486
|
: { production: candidate.productionRefs, test: candidate.testRefs };
|
|
427
487
|
const ownClass =
|
|
428
|
-
judged
|
|
488
|
+
judged !== undefined
|
|
489
|
+
? classOf(judged.id)
|
|
490
|
+
: (finding.reachabilityClass ??
|
|
491
|
+
(finding.code === CODE.fileNeverImported
|
|
492
|
+
? classOf(fileIds.get(finding.position.path) ?? "")
|
|
493
|
+
: "certain"));
|
|
429
494
|
const used =
|
|
430
495
|
judged !== undefined
|
|
431
496
|
? candidate !== undefined && testUsed.declarations.has(judged.id)
|
|
432
|
-
: finding.code ===
|
|
497
|
+
: finding.code === CODE.fileNeverImported && testUsed.files.has(finding.position.path);
|
|
433
498
|
const reachabilityClass = used && candidate?.testOfDeadCode !== true ? "possible" : ownClass;
|
|
499
|
+
const configurations =
|
|
500
|
+
candidate?.configurations ??
|
|
501
|
+
(judged === undefined && !part
|
|
502
|
+
? swept.matrix.configurations
|
|
503
|
+
: (swept.matrix.heldIn[at] ?? swept.matrix.configurations));
|
|
434
504
|
const untested = capped(
|
|
435
|
-
capped(
|
|
505
|
+
capped(
|
|
506
|
+
capped(ownClass, row.maxClass),
|
|
507
|
+
rootsCeiling(input, finding, candidate, configurations),
|
|
508
|
+
),
|
|
436
509
|
judged === undefined ? "certain" : ceilingOf(judged.id),
|
|
437
510
|
);
|
|
438
511
|
const generated = input.files.generated?.has(finding.position.path) === true;
|
|
@@ -449,7 +522,7 @@ export function completed(
|
|
|
449
522
|
? undefined
|
|
450
523
|
: candidate !== undefined
|
|
451
524
|
? input.dependencies.lastUses.get(candidate.id)
|
|
452
|
-
: finding.code ===
|
|
525
|
+
: finding.code === CODE.fileNeverImported
|
|
453
526
|
? input.dependencies.fileLastUses.get(finding.position.path)
|
|
454
527
|
: undefined;
|
|
455
528
|
return {
|
|
@@ -466,11 +539,7 @@ export function completed(
|
|
|
466
539
|
generated,
|
|
467
540
|
component,
|
|
468
541
|
retainedBy: [],
|
|
469
|
-
configurations
|
|
470
|
-
candidate?.configurations ??
|
|
471
|
-
(judged === undefined && !part
|
|
472
|
-
? swept.matrix.configurations
|
|
473
|
-
: (swept.matrix.heldIn[at] ?? swept.matrix.configurations)),
|
|
542
|
+
configurations,
|
|
474
543
|
consumersLoaded: input.boundary.consumers.loaded,
|
|
475
544
|
fixability,
|
|
476
545
|
severity: severityOf(input, finding.code, row.defaultSeverity),
|
|
@@ -540,7 +609,7 @@ export function dialsOf(
|
|
|
540
609
|
input: EmitterInput,
|
|
541
610
|
findings: readonly CompletedFinding[],
|
|
542
611
|
): Dials<CompletedFinding> {
|
|
543
|
-
const minConfidence = input.config.analysis.
|
|
612
|
+
const minConfidence = input.config.analysis.min_confidence;
|
|
544
613
|
const components = new Set(
|
|
545
614
|
findings
|
|
546
615
|
.filter(
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
+
import { CODE } from "../contract/contract.generated.ts";
|
|
1
2
|
import { declarationKey, type Dependencies } from "../dependencies.ts";
|
|
2
3
|
import type { Finding } from "../finding.ts";
|
|
3
4
|
import { renderRef, type DependencySection } from "../ref.ts";
|
|
4
5
|
import type { Emitter, EmitterInput } from "./emitter.ts";
|
|
5
6
|
import { nonCodeArtifacts } from "./non-code-artifacts.ts";
|
|
6
7
|
|
|
7
|
-
const UNUSED_DEPENDENCY = "DS1601";
|
|
8
|
-
|
|
9
|
-
const FILE_NEVER_IMPORTED = "DS1502";
|
|
10
|
-
|
|
11
8
|
const MESSAGES: Readonly<Record<DependencySection, string>> = {
|
|
12
9
|
dependency: "no import in the target needs the declared dependency",
|
|
13
10
|
"dev-dependency": "no import in the target needs the declared development dependency",
|
|
@@ -46,7 +43,7 @@ function deadCode(input: EmitterInput): DeadCode {
|
|
|
46
43
|
);
|
|
47
44
|
for (const finding of nonCodeArtifacts(input)) {
|
|
48
45
|
const id = files.get(finding.position.path);
|
|
49
|
-
if (finding.code ===
|
|
46
|
+
if (finding.code === CODE.fileNeverImported && id !== undefined) {
|
|
50
47
|
dead.add(id);
|
|
51
48
|
if (finding.unreachableOnly === true) {
|
|
52
49
|
reachedOnly.add(id);
|
|
@@ -81,7 +78,7 @@ function unusedDependencies(input: EmitterInput, dependencies: Dependencies): Fi
|
|
|
81
78
|
const atPossible = unbuilt || users?.some((id) => published.has(id)) === true;
|
|
82
79
|
return [
|
|
83
80
|
{
|
|
84
|
-
code:
|
|
81
|
+
code: CODE.unusedDependency,
|
|
85
82
|
position: dependency.position,
|
|
86
83
|
symbol: {
|
|
87
84
|
ref: renderRef(dependency.manifest, {
|
|
@@ -105,6 +102,6 @@ function unusedDependencies(input: EmitterInput, dependencies: Dependencies): Fi
|
|
|
105
102
|
});
|
|
106
103
|
}
|
|
107
104
|
|
|
108
|
-
/** The findings of the dependencies
|
|
105
|
+
/** The findings of the dependencies family, `DS1700` to `DS1799`. */
|
|
109
106
|
export const dependenciesAndModuleMachinery: Emitter = (input) =>
|
|
110
107
|
unusedDependencies(input, input.dependencies);
|
package/src/findings/emitter.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { RunSweep } from "../analysis.ts";
|
|
2
|
-
import type {
|
|
2
|
+
import type { ResolvedConfig } from "../config.ts";
|
|
3
3
|
import type { Dependencies } from "../dependencies.ts";
|
|
4
4
|
import type { FileFacts } from "../file-facts.ts";
|
|
5
5
|
import type { Finding } from "../finding.ts";
|
|
6
|
-
import type { Implementations } from "
|
|
6
|
+
import type { Implementations } from "./implementations.ts";
|
|
7
7
|
import type { IntraFunctionFacts } from "../intra-function-parts.ts";
|
|
8
8
|
import type { Stores } from "../stores.ts";
|
|
9
9
|
import type { Boundary } from "./boundary.ts";
|
|
@@ -11,10 +11,10 @@ import type { SelfCheckFacts } from "./self-check.ts";
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* What every emitter reads: the configuration the run resolved, the run's sweep, and
|
|
14
|
-
* the facts about the run each
|
|
14
|
+
* the facts about the run each emitter reads beside the sweep.
|
|
15
15
|
*/
|
|
16
16
|
export interface EmitterInput {
|
|
17
|
-
readonly config:
|
|
17
|
+
readonly config: ResolvedConfig;
|
|
18
18
|
/** The production sweep a report is built from, beside the matrix it judged. */
|
|
19
19
|
readonly swept: RunSweep;
|
|
20
20
|
/** The declarations carrying the deprecation marker in any configuration of the run. */
|
|
@@ -29,18 +29,17 @@ export interface EmitterInput {
|
|
|
29
29
|
readonly files: FileFacts;
|
|
30
30
|
/** What can reach the target from outside it: consumers, declared edges, and `exports`. */
|
|
31
31
|
readonly boundary: Boundary;
|
|
32
|
-
/** The run's suppression outcomes and configured roots, which the
|
|
32
|
+
/** The run's suppression outcomes and configured roots, which the configuration family reports. */
|
|
33
33
|
readonly selfCheck: SelfCheckFacts;
|
|
34
|
-
/** The parts of the run's declarations, which the
|
|
34
|
+
/** The parts of the run's declarations, which the inside-functions family reports. */
|
|
35
35
|
readonly intraFunction: IntraFunctionFacts;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
|
-
* One
|
|
40
|
-
*
|
|
41
|
-
* configuration sets, in no particular order.
|
|
39
|
+
* One emitter's rule over one run: every finding of the codes it reports, whatever
|
|
40
|
+
* severity and minimum confidence the configuration sets, in no particular order.
|
|
42
41
|
*/
|
|
43
42
|
export type Emitter = (input: EmitterInput) => readonly Finding[];
|
|
44
43
|
|
|
45
|
-
/**
|
|
44
|
+
/** Every emitter this analyzer runs, by the name its tests select it by. */
|
|
46
45
|
export type Emitters = ReadonlyMap<string, Emitter>;
|