@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
|
@@ -18,7 +18,6 @@ import {
|
|
|
18
18
|
isIdentifier,
|
|
19
19
|
isMethodDeclaration,
|
|
20
20
|
isNoSubstitutionTemplateLiteral,
|
|
21
|
-
isParenthesizedExpression,
|
|
22
21
|
isParenthesizedTypeNode,
|
|
23
22
|
isPropertyAccessExpression,
|
|
24
23
|
isReturnStatement,
|
|
@@ -28,18 +27,19 @@ import {
|
|
|
28
27
|
type Node,
|
|
29
28
|
type SourceFile,
|
|
30
29
|
} from "@typescript/native/ast";
|
|
30
|
+
import { parenthesesRemoved } from "../unwrap.ts";
|
|
31
31
|
import { TypeFlags, type Type } from "@typescript/native/sync";
|
|
32
|
-
import { aliasChains } from "
|
|
33
|
-
import type { DetectorInput, Evidence } from "./
|
|
34
|
-
import { nodeKey } from "
|
|
35
|
-
import { renderPosition } from "
|
|
36
|
-
import { isAnswered, UNANSWERED, type Answer } from "
|
|
37
|
-
import type { ProjectView } from "
|
|
32
|
+
import { aliasChains } from "../alias-chain.ts";
|
|
33
|
+
import type { DetectorInput, Evidence } from "./lifecycle.ts";
|
|
34
|
+
import { nodeKey } from "../inventory.ts";
|
|
35
|
+
import { renderPosition } from "../position.ts";
|
|
36
|
+
import { isAnswered, UNANSWERED, type Answer } from "../query.ts";
|
|
37
|
+
import type { ProjectView } from "../session.ts";
|
|
38
|
+
import { ERASED } from "./value-reach.ts";
|
|
38
39
|
|
|
39
40
|
/** The operand types a conversion produces an enum value from. */
|
|
40
41
|
const NUMBER = TypeFlags.NumberLike;
|
|
41
42
|
const STRING = TypeFlags.StringLike;
|
|
42
|
-
const DECODED = TypeFlags.Any | TypeFlags.Unknown;
|
|
43
43
|
|
|
44
44
|
/** How one site produces a value of the type it names. */
|
|
45
45
|
type Form = "assertion" | "lookup" | "annotation";
|
|
@@ -55,15 +55,6 @@ interface Site {
|
|
|
55
55
|
readonly at: Node;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
/** The expression one node is, through however many parentheses are written around it. */
|
|
59
|
-
function unparenthesized(node: Node): Node {
|
|
60
|
-
let held = node;
|
|
61
|
-
while (isParenthesizedExpression(held)) {
|
|
62
|
-
held = held.expression;
|
|
63
|
-
}
|
|
64
|
-
return held;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
58
|
/**
|
|
68
59
|
* The name node a type node names its declaration by: the identifier of a type
|
|
69
60
|
* reference, the right side of a qualified one, through parentheses. A type that is no
|
|
@@ -86,7 +77,7 @@ function typeName(type: Node | undefined): Node | undefined {
|
|
|
86
77
|
|
|
87
78
|
/** The name node an expression names an object by: an identifier, or a property access's name. */
|
|
88
79
|
function objectName(expression: Node): Node | undefined {
|
|
89
|
-
const held =
|
|
80
|
+
const held = parenthesesRemoved(expression);
|
|
90
81
|
if (isIdentifier(held)) {
|
|
91
82
|
return held;
|
|
92
83
|
}
|
|
@@ -185,7 +176,7 @@ function detailOf<Brand>(
|
|
|
185
176
|
if (parts.some((part) => (part.flags & STRING) !== 0)) {
|
|
186
177
|
return site.form === "assertion" ? "converted from string" : undefined;
|
|
187
178
|
}
|
|
188
|
-
if (parts.some((part) => (part.flags &
|
|
179
|
+
if (parts.some((part) => (part.flags & ERASED) !== 0)) {
|
|
189
180
|
return `decoded as ${enumName}`;
|
|
190
181
|
}
|
|
191
182
|
return undefined;
|
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
isNoSubstitutionTemplateLiteral,
|
|
17
17
|
isNumericLiteral,
|
|
18
18
|
isObjectLiteralExpression,
|
|
19
|
-
isParenthesizedExpression,
|
|
20
19
|
isPropertyAccessExpression,
|
|
21
20
|
isPropertyAssignment,
|
|
22
21
|
isShorthandPropertyAssignment,
|
|
@@ -27,13 +26,11 @@ import {
|
|
|
27
26
|
type Expression,
|
|
28
27
|
type Node,
|
|
29
28
|
} from "@typescript/native/ast";
|
|
30
|
-
import { SymbolFlags,
|
|
31
|
-
import { must } from "
|
|
32
|
-
import type { ProjectView } from "
|
|
33
|
-
import { checkedTypes } from "./value-reach.ts";
|
|
34
|
-
|
|
35
|
-
/** The types that keep nothing of the value they are given. */
|
|
36
|
-
const ERASED = TypeFlags.Any | TypeFlags.Unknown;
|
|
29
|
+
import { SymbolFlags, type Type } from "@typescript/native/sync";
|
|
30
|
+
import { must } from "../query.ts";
|
|
31
|
+
import type { ProjectView } from "../session.ts";
|
|
32
|
+
import { checkedTypes, ERASED } from "./value-reach.ts";
|
|
33
|
+
import { parenthesesRemoved } from "../unwrap.ts";
|
|
37
34
|
|
|
38
35
|
/** The array methods whose arguments become elements of the array they are called on. */
|
|
39
36
|
const ELEMENT_STORES: ReadonlySet<string> = new Set(["push", "unshift"]);
|
|
@@ -81,10 +78,6 @@ function literalKey(node: Expression): string | undefined {
|
|
|
81
78
|
: undefined;
|
|
82
79
|
}
|
|
83
80
|
|
|
84
|
-
function unwrapped(node: Expression): Expression {
|
|
85
|
-
return isParenthesizedExpression(node) ? unwrapped(node.expression) : node;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
81
|
/**
|
|
89
82
|
* Whether a variable declaration's type can differ from what is stored in it: it carries an
|
|
90
83
|
* annotation, or it has neither an annotation nor an initializer, so its type evolves.
|
|
@@ -150,8 +143,8 @@ function propertyAt(source: Expression, name: string): Expression | undefined {
|
|
|
150
143
|
* here, and a default value is stored in its target too.
|
|
151
144
|
*/
|
|
152
145
|
function patternTargets(pattern: Expression, from: Stored, out: Target[]): void {
|
|
153
|
-
const target =
|
|
154
|
-
const source = from.path.length === 0 ?
|
|
146
|
+
const target = parenthesesRemoved(pattern);
|
|
147
|
+
const source = from.path.length === 0 ? parenthesesRemoved(from.value) : from.value;
|
|
155
148
|
const into = (element: Expression, step: Step, literal: Expression | undefined): void => {
|
|
156
149
|
patternTargets(
|
|
157
150
|
element,
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The framework-lifecycle class: a member a
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* through a chain, a class its `bases` name.
|
|
6
|
-
*
|
|
2
|
+
* The framework-lifecycle class: a member a lifecycle contract lists is held back on each
|
|
3
|
+
* class that is the contract's component, being a class a decorator or a call the
|
|
4
|
+
* contract's `components` name is attached to or passes, or one extending, directly or
|
|
5
|
+
* through a chain, a class its `bases` name. The contracts are the platform's custom
|
|
6
|
+
* elements and each `ts.lifecycle_contracts` entry. A component's members are its type's,
|
|
7
|
+
* so a member a base class declares answers for every subclass.
|
|
7
8
|
*/
|
|
8
9
|
|
|
9
10
|
import {
|
|
10
|
-
isClassDeclaration,
|
|
11
|
-
isClassExpression,
|
|
12
11
|
isHeritageClause,
|
|
13
12
|
SyntaxKind,
|
|
14
13
|
type CallExpression,
|
|
15
14
|
type Node,
|
|
16
15
|
} from "@typescript/native/ast";
|
|
17
16
|
import type { Type } from "@typescript/native/sync";
|
|
18
|
-
import { aliasChains, type AliasChains } from "
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import
|
|
17
|
+
import { aliasChains, type AliasChains } from "../alias-chain.ts";
|
|
18
|
+
import { nameOf } from "../index/values.ts";
|
|
19
|
+
import { classesPassed, decoratorCallee, decoratorsOf } from "./calls.ts";
|
|
20
|
+
import { classMembers, memberComponent, typesAt, type ClassSide } from "../class-members.ts";
|
|
21
|
+
import type { DeclarationEntry, LifecycleContract } from "../config.ts";
|
|
22
22
|
import {
|
|
23
23
|
entriesAt,
|
|
24
24
|
names,
|
|
@@ -26,12 +26,37 @@ import {
|
|
|
26
26
|
resolveEntries,
|
|
27
27
|
spelledEntry,
|
|
28
28
|
type ResolvedEntry,
|
|
29
|
-
} from "
|
|
30
|
-
import type { DetectorInput, Evidence } from "./
|
|
31
|
-
import {
|
|
32
|
-
import { renderPosition } from "
|
|
33
|
-
import { must } from "
|
|
34
|
-
import type { ProjectView } from "
|
|
29
|
+
} from "../roots/configured-declarations.ts";
|
|
30
|
+
import type { DetectorInput, Evidence } from "./lifecycle.ts";
|
|
31
|
+
import type { Inventory } from "../inventory.ts";
|
|
32
|
+
import { renderPosition } from "../position.ts";
|
|
33
|
+
import { must } from "../query.ts";
|
|
34
|
+
import type { ProjectView } from "../session.ts";
|
|
35
|
+
import type { ProjectSites } from "./sites.ts";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The platform's own contract (references-ts.38): `CustomElementRegistry.define` reads
|
|
39
|
+
* these members off the class it registers, its constructor's and its prototype's
|
|
40
|
+
* (https://html.spec.whatwg.org/multipage/custom-elements.html#dom-customelementregistry-define),
|
|
41
|
+
* and calls each callback as a custom element reaction.
|
|
42
|
+
*/
|
|
43
|
+
const CUSTOM_ELEMENTS: LifecycleContract = {
|
|
44
|
+
components: [{ global: "CustomElementRegistry.define" }],
|
|
45
|
+
members: [
|
|
46
|
+
"observedAttributes:static",
|
|
47
|
+
"disabledFeatures:static",
|
|
48
|
+
"formAssociated:static",
|
|
49
|
+
"connectedCallback",
|
|
50
|
+
"disconnectedCallback",
|
|
51
|
+
"connectedMoveCallback",
|
|
52
|
+
"adoptedCallback",
|
|
53
|
+
"attributeChangedCallback",
|
|
54
|
+
"formAssociatedCallback",
|
|
55
|
+
"formResetCallback",
|
|
56
|
+
"formDisabledCallback",
|
|
57
|
+
"formStateRestoreCallback",
|
|
58
|
+
],
|
|
59
|
+
};
|
|
35
60
|
|
|
36
61
|
/** One class that is a component of one contract, and what says it is. */
|
|
37
62
|
interface Component {
|
|
@@ -55,8 +80,8 @@ function resolveContracts<Brand>(
|
|
|
55
80
|
contracts: readonly LifecycleContract[],
|
|
56
81
|
): readonly ResolvedContract[] {
|
|
57
82
|
const entries: DeclarationEntry[] = contracts.flatMap((contract) => [
|
|
58
|
-
...contract.components,
|
|
59
|
-
...contract.bases,
|
|
83
|
+
...(contract.components ?? []),
|
|
84
|
+
...(contract.bases ?? []),
|
|
60
85
|
]);
|
|
61
86
|
const resolved = resolveEntries(project, held, entries);
|
|
62
87
|
let next = 0;
|
|
@@ -67,8 +92,8 @@ function resolveContracts<Brand>(
|
|
|
67
92
|
};
|
|
68
93
|
return contracts.map((contract) => ({
|
|
69
94
|
contract,
|
|
70
|
-
components: take(contract.components
|
|
71
|
-
bases: take(contract.bases
|
|
95
|
+
components: take(contract.components?.length ?? 0),
|
|
96
|
+
bases: take(contract.bases?.length ?? 0),
|
|
72
97
|
}));
|
|
73
98
|
}
|
|
74
99
|
|
|
@@ -76,6 +101,7 @@ function resolveContracts<Brand>(
|
|
|
76
101
|
function byComponents<Brand>(
|
|
77
102
|
project: ProjectView<Brand>,
|
|
78
103
|
held: Inventory,
|
|
104
|
+
sites: ProjectSites,
|
|
79
105
|
chains: AliasChains,
|
|
80
106
|
contracts: readonly ResolvedContract[],
|
|
81
107
|
): readonly Component[] {
|
|
@@ -86,13 +112,18 @@ function byComponents<Brand>(
|
|
|
86
112
|
const contractOf = new Map(
|
|
87
113
|
routed.flatMap((one) => one.components.map((entry) => [entry, one.contract] as const)),
|
|
88
114
|
);
|
|
89
|
-
const calls =
|
|
90
|
-
const
|
|
115
|
+
const calls = sites.calls.map((one) => one.call);
|
|
116
|
+
const invoked = (call: CallExpression): Node | undefined =>
|
|
117
|
+
nameOf(sites.invocations.of(call).callee);
|
|
118
|
+
const decorated = sites.classes.flatMap(({ id, node }) => {
|
|
119
|
+
const decorators = decoratorsOf(node);
|
|
120
|
+
return decorators.length === 0 ? [] : [{ id, decorators }];
|
|
121
|
+
});
|
|
91
122
|
const named = entriesAt(
|
|
92
123
|
project,
|
|
93
124
|
chains,
|
|
94
125
|
[
|
|
95
|
-
...calls.flatMap((call) =>
|
|
126
|
+
...calls.flatMap((call) => invoked(call) ?? []),
|
|
96
127
|
...decorated.flatMap((one) =>
|
|
97
128
|
one.decorators.flatMap((decorator) => decoratorCallee(decorator) ?? []),
|
|
98
129
|
),
|
|
@@ -115,12 +146,12 @@ function byComponents<Brand>(
|
|
|
115
146
|
}
|
|
116
147
|
const matched = new Map<CallExpression, { contract: LifecycleContract; detail: string }[]>();
|
|
117
148
|
for (const call of calls) {
|
|
118
|
-
const routes = naming(
|
|
149
|
+
const routes = naming(invoked(call));
|
|
119
150
|
if (routes.length > 0) {
|
|
120
151
|
matched.set(call, routes);
|
|
121
152
|
}
|
|
122
153
|
}
|
|
123
|
-
for (const [call, uses] of classesPassed(project, held, chains, [...matched.keys()])) {
|
|
154
|
+
for (const [call, uses] of classesPassed(project, held, chains, sites, [...matched.keys()])) {
|
|
124
155
|
for (const route of matched.get(call) ?? []) {
|
|
125
156
|
for (const use of uses) {
|
|
126
157
|
found.push({
|
|
@@ -135,43 +166,28 @@ function byComponents<Brand>(
|
|
|
135
166
|
return found;
|
|
136
167
|
}
|
|
137
168
|
|
|
138
|
-
/** Each class
|
|
139
|
-
|
|
169
|
+
/** Each named class of the target that extends another, with its name and the class its `extends` names. */
|
|
170
|
+
function extendingClasses(sites: ProjectSites): readonly {
|
|
140
171
|
readonly id: string;
|
|
141
172
|
readonly name: Node;
|
|
142
173
|
readonly extended: Node;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if ((isClassDeclaration(node) || isClassExpression(node)) && node.name !== undefined) {
|
|
154
|
-
const id = held.declarations.get(nodeKey(file, node));
|
|
155
|
-
const clause = (node.heritageClauses ?? []).find(
|
|
156
|
-
(one) => isHeritageClause(one) && one.token === SyntaxKind.ExtendsKeyword,
|
|
157
|
-
);
|
|
158
|
-
const extended =
|
|
159
|
-
clause !== undefined && isHeritageClause(clause) ? clause.types[0] : undefined;
|
|
160
|
-
if (id !== undefined && extended !== undefined) {
|
|
161
|
-
found.push({ id, name: node.name, extended });
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
node.forEachChild(visit);
|
|
165
|
-
};
|
|
166
|
-
file.forEachChild(visit);
|
|
167
|
-
}
|
|
168
|
-
return found;
|
|
174
|
+
}[] {
|
|
175
|
+
return sites.classes.flatMap(({ id, node }) => {
|
|
176
|
+
const clause = (node.heritageClauses ?? []).find(
|
|
177
|
+
(one) => isHeritageClause(one) && one.token === SyntaxKind.ExtendsKeyword,
|
|
178
|
+
);
|
|
179
|
+
const extended = clause !== undefined && isHeritageClause(clause) ? clause.types[0] : undefined;
|
|
180
|
+
return node.name === undefined || extended === undefined
|
|
181
|
+
? []
|
|
182
|
+
: [{ id, name: node.name, extended }];
|
|
183
|
+
});
|
|
169
184
|
}
|
|
170
185
|
|
|
171
186
|
/** The classes that extend, directly or through a chain, a class the contracts' bases name. */
|
|
172
187
|
function byBases<Brand>(
|
|
173
188
|
project: ProjectView<Brand>,
|
|
174
189
|
held: Inventory,
|
|
190
|
+
sites: ProjectSites,
|
|
175
191
|
chains: AliasChains,
|
|
176
192
|
contracts: readonly ResolvedContract[],
|
|
177
193
|
): readonly Component[] {
|
|
@@ -179,7 +195,7 @@ function byBases<Brand>(
|
|
|
179
195
|
if (based.length === 0) {
|
|
180
196
|
return [];
|
|
181
197
|
}
|
|
182
|
-
const classes = extendingClasses(
|
|
198
|
+
const classes = extendingClasses(sites);
|
|
183
199
|
if (classes.length === 0) {
|
|
184
200
|
return [];
|
|
185
201
|
}
|
|
@@ -238,25 +254,26 @@ function byBases<Brand>(
|
|
|
238
254
|
|
|
239
255
|
/**
|
|
240
256
|
* The framework-lifecycle detector: each member a contract lists, on each class that
|
|
241
|
-
* is a component of that contract's framework, recorded where the class
|
|
242
|
-
* be one.
|
|
257
|
+
* is a component of that contract's framework, recorded once per place where the class
|
|
258
|
+
* was found to be one.
|
|
243
259
|
*/
|
|
244
260
|
export function frameworkLifecycle<Brand>(input: DetectorInput<Brand>): readonly Evidence[] {
|
|
245
261
|
const { project, held, targetRoot } = input;
|
|
246
|
-
|
|
262
|
+
const declared = [CUSTOM_ELEMENTS, ...input.ts.lifecycle_contracts];
|
|
263
|
+
const contracts = resolveContracts(project, held, declared);
|
|
264
|
+
if (contracts.every((one) => one.components.length === 0 && one.bases.length === 0)) {
|
|
247
265
|
return [];
|
|
248
266
|
}
|
|
249
267
|
const chains = aliasChains(project, held);
|
|
250
|
-
const contracts = resolveContracts(project, held, input.ts.lifecycleContracts);
|
|
251
268
|
const components = [
|
|
252
|
-
...byComponents(project, held, chains, contracts),
|
|
253
|
-
...byBases(project, held, chains, contracts),
|
|
269
|
+
...byComponents(project, held, input.sites, chains, contracts),
|
|
270
|
+
...byBases(project, held, input.sites, chains, contracts),
|
|
254
271
|
];
|
|
255
272
|
if (components.length === 0) {
|
|
256
273
|
return [];
|
|
257
274
|
}
|
|
258
275
|
const ids = new Set(components.map((one) => one.id));
|
|
259
|
-
const sides: readonly ClassSide[] =
|
|
276
|
+
const sides: readonly ClassSide[] = declared.some((contract) =>
|
|
260
277
|
contract.members.some((name) => name.endsWith(":static")),
|
|
261
278
|
)
|
|
262
279
|
? ["instance", "static"]
|
|
@@ -264,7 +281,7 @@ export function frameworkLifecycle<Brand>(input: DetectorInput<Brand>): readonly
|
|
|
264
281
|
const members = sides.map((side) => classMembers(project, held, ids, side));
|
|
265
282
|
const byId = new Map(held.symbols.map((symbol) => [symbol.id, symbol]));
|
|
266
283
|
|
|
267
|
-
const found
|
|
284
|
+
const found = new Map<string, Evidence>();
|
|
268
285
|
for (const component of components) {
|
|
269
286
|
const listed = new Set(component.contract.members);
|
|
270
287
|
const site = renderPosition(
|
|
@@ -275,10 +292,12 @@ export function frameworkLifecycle<Brand>(input: DetectorInput<Brand>): readonly
|
|
|
275
292
|
for (const member of members.flatMap((side) => side.get(component.id) ?? [])) {
|
|
276
293
|
const symbol = byId.get(member.id);
|
|
277
294
|
const spelled = symbol === undefined ? undefined : memberComponent(symbol, byId);
|
|
278
|
-
|
|
279
|
-
|
|
295
|
+
// A configured contract may name the platform's registry too; one record answers both.
|
|
296
|
+
const key = `${member.id}\0${component.detail}\0${site.path}:${String(site.line)}:${String(site.column)}`;
|
|
297
|
+
if (spelled !== undefined && listed.has(spelled) && !found.has(key)) {
|
|
298
|
+
found.set(key, { id: member.id, detail: component.detail, site });
|
|
280
299
|
}
|
|
281
300
|
}
|
|
282
301
|
}
|
|
283
|
-
return found;
|
|
302
|
+
return [...found.values()];
|
|
284
303
|
}
|