@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
|
@@ -11,9 +11,19 @@ import {
|
|
|
11
11
|
type SourceFile,
|
|
12
12
|
} from "@typescript/native/ast";
|
|
13
13
|
import { resolveRelativeSpecifier, type ParseFile } from "./configuration-files.ts";
|
|
14
|
-
import type { Host } from "
|
|
15
|
-
import {
|
|
16
|
-
|
|
14
|
+
import type { Host } from "../host.ts";
|
|
15
|
+
import {
|
|
16
|
+
ancestors,
|
|
17
|
+
dirnamePath,
|
|
18
|
+
hasURLScheme,
|
|
19
|
+
isAbsolutePath,
|
|
20
|
+
isExplicitPath,
|
|
21
|
+
joinPath,
|
|
22
|
+
resolvePath,
|
|
23
|
+
} from "../paths.ts";
|
|
24
|
+
import type { SourceFiles } from "../source-files.ts";
|
|
25
|
+
import { filesBelow } from "../fs/tree.ts";
|
|
26
|
+
import { holdsManifest } from "../fs/manifest.ts";
|
|
17
27
|
|
|
18
28
|
/** One file a script loads, and the value or specifier that named it. */
|
|
19
29
|
interface HTMLEntry {
|
|
@@ -21,9 +31,6 @@ interface HTMLEntry {
|
|
|
21
31
|
readonly source: string;
|
|
22
32
|
}
|
|
23
33
|
|
|
24
|
-
/** The directory no HTML file is read below. */
|
|
25
|
-
const SKIPPED = "node_modules";
|
|
26
|
-
|
|
27
34
|
/** A `<script` start tag, its attribute text captured. */
|
|
28
35
|
const SCRIPT_TAG = /<script(?=[\s>/])([^>]*)>/giu;
|
|
29
36
|
|
|
@@ -33,37 +40,9 @@ const SCRIPT_END = /<\/script\s*>/iu;
|
|
|
33
40
|
/** One attribute: a name, then a double-quoted, single-quoted or unquoted value. */
|
|
34
41
|
const ATTRIBUTE = /([^\s"'=<>/]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))?/gu;
|
|
35
42
|
|
|
36
|
-
/** A value that names a resource on another origin, or by another scheme. */
|
|
37
|
-
const ELSEWHERE = /^(?:\/\/|[A-Za-z][A-Za-z\d+.-]*:)/u;
|
|
38
|
-
|
|
39
43
|
/** The `type` values a classic script carries, compared in lowercase. */
|
|
40
44
|
const CLASSIC_TYPES: ReadonlySet<string> = new Set(["text/javascript", "application/javascript"]);
|
|
41
45
|
|
|
42
|
-
/** The prefixes an inline script's specifier names a file of the target with. */
|
|
43
|
-
const FILE_PREFIXES = ["/", "./", "../"] as const;
|
|
44
|
-
|
|
45
|
-
/** Every HTML file below `dir`, outside every `node_modules` directory, by absolute path. */
|
|
46
|
-
function htmlFiles(host: Host, dir: string): readonly string[] {
|
|
47
|
-
let entries;
|
|
48
|
-
try {
|
|
49
|
-
entries = host.readDirectory(dir);
|
|
50
|
-
} catch {
|
|
51
|
-
return [];
|
|
52
|
-
}
|
|
53
|
-
const found: string[] = [];
|
|
54
|
-
for (const entry of entries) {
|
|
55
|
-
const path = joinPath(dir, entry.name);
|
|
56
|
-
if (entry.directory) {
|
|
57
|
-
if (entry.name !== SKIPPED) {
|
|
58
|
-
found.push(...htmlFiles(host, path));
|
|
59
|
-
}
|
|
60
|
-
} else if (entry.name.endsWith(".html")) {
|
|
61
|
-
found.push(path);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return found.sort();
|
|
65
|
-
}
|
|
66
|
-
|
|
67
46
|
/** Each attribute of one start tag's attribute text, by its lowercase name. */
|
|
68
47
|
function attributes(text: string): ReadonlyMap<string, string> {
|
|
69
48
|
const found = new Map<string, string>();
|
|
@@ -117,9 +96,7 @@ function scriptValues(parse: ParseFile | undefined, path: string, text: string):
|
|
|
117
96
|
const end = rest.search(SCRIPT_END);
|
|
118
97
|
const content = end === -1 ? rest : rest.slice(0, end);
|
|
119
98
|
values.push(
|
|
120
|
-
...specifiersOf(parse, `${path}.${String(start)}.ts`, content).filter(
|
|
121
|
-
FILE_PREFIXES.some((prefix) => specifier.startsWith(prefix)),
|
|
122
|
-
),
|
|
99
|
+
...specifiersOf(parse, `${path}.${String(start)}.ts`, content).filter(isExplicitPath),
|
|
123
100
|
);
|
|
124
101
|
}
|
|
125
102
|
return values;
|
|
@@ -127,12 +104,7 @@ function scriptValues(parse: ParseFile | undefined, path: string, text: string):
|
|
|
127
104
|
|
|
128
105
|
/** The directory of the nearest `package.json` at or above `dir`, inside `root`, else `root`. */
|
|
129
106
|
function manifestDirectory(host: Host, root: string, dir: string): string {
|
|
130
|
-
|
|
131
|
-
if (host.kindOf(joinPath(at, "package.json")) === "file") {
|
|
132
|
-
return at;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
return root;
|
|
107
|
+
return ancestors(dir, root).find((at) => holdsManifest(host, at)) ?? root;
|
|
136
108
|
}
|
|
137
109
|
|
|
138
110
|
/**
|
|
@@ -150,7 +122,8 @@ export function htmlEntries(
|
|
|
150
122
|
): readonly HTMLEntry[] {
|
|
151
123
|
const root = resolvePath(host.workingDirectory(), targetRoot);
|
|
152
124
|
const found: HTMLEntry[] = [];
|
|
153
|
-
for (const
|
|
125
|
+
for (const below of filesBelow(host, root, (name) => name.endsWith(".html"))) {
|
|
126
|
+
const path = joinPath(root, below);
|
|
154
127
|
let text: string;
|
|
155
128
|
try {
|
|
156
129
|
text = host.readFile(path);
|
|
@@ -159,18 +132,19 @@ export function htmlEntries(
|
|
|
159
132
|
}
|
|
160
133
|
const dir = dirnamePath(path);
|
|
161
134
|
for (const value of scriptValues(parse, path, text)) {
|
|
162
|
-
|
|
135
|
+
// A value with a scheme, or one starting `//`, names a resource on another origin.
|
|
136
|
+
if (value.startsWith("//") || hasURLScheme(value)) {
|
|
163
137
|
continue;
|
|
164
138
|
}
|
|
165
|
-
const base = value
|
|
166
|
-
const relative = value
|
|
139
|
+
const base = isAbsolutePath(value) ? manifestDirectory(host, root, dir) : dir;
|
|
140
|
+
const relative = isAbsolutePath(value) ? `.${value}` : value;
|
|
167
141
|
const reached = resolveRelativeSpecifier(host, base, relative);
|
|
168
142
|
const file = reached === undefined ? undefined : files.byName.get(reached);
|
|
169
143
|
if (file !== undefined) {
|
|
170
144
|
found.push({ file, source: value });
|
|
171
145
|
continue;
|
|
172
146
|
}
|
|
173
|
-
const served = value
|
|
147
|
+
const served = isAbsolutePath(value)
|
|
174
148
|
? files.outputDirs.filter((outDir) => outDir === dir)
|
|
175
149
|
: [];
|
|
176
150
|
const emitting = [base, ...served].flatMap((against) =>
|
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
|
|
7
7
|
import type { SourceFile } from "@typescript/native/ast";
|
|
8
8
|
import { resolveRelativeSpecifier } from "./configuration-files.ts";
|
|
9
|
-
import type { Host } from "
|
|
10
|
-
import { dirnamePath, joinPath, resolvePath } from "
|
|
11
|
-
import type { SourceFiles } from "
|
|
9
|
+
import type { Host } from "../host.ts";
|
|
10
|
+
import { dirnamePath, joinPath, resolvePath, startsRelativePath } from "../paths.ts";
|
|
11
|
+
import type { SourceFiles } from "../source-files.ts";
|
|
12
|
+
import { filesBelow } from "../fs/tree.ts";
|
|
12
13
|
|
|
13
14
|
/** One file a document imports, the specifier that named it, and the export names it reads. */
|
|
14
15
|
interface DocumentEntry {
|
|
@@ -18,9 +19,6 @@ interface DocumentEntry {
|
|
|
18
19
|
readonly names: readonly string[] | undefined;
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
/** The directories no document is read below. */
|
|
22
|
-
const SKIPPED: ReadonlySet<string> = new Set(["node_modules", ".git"]);
|
|
23
|
-
|
|
24
22
|
/** The extensions of a document whose imports an MDX compiler reads. */
|
|
25
23
|
const DOCUMENT = /\.mdx?$/u;
|
|
26
24
|
|
|
@@ -129,28 +127,6 @@ function clauseNames(clause: string): readonly string[] | undefined {
|
|
|
129
127
|
return names;
|
|
130
128
|
}
|
|
131
129
|
|
|
132
|
-
/** Every document below `dir`, outside every skipped directory, by absolute path. */
|
|
133
|
-
function documents(host: Host, dir: string): readonly string[] {
|
|
134
|
-
let entries;
|
|
135
|
-
try {
|
|
136
|
-
entries = host.readDirectory(dir);
|
|
137
|
-
} catch {
|
|
138
|
-
return [];
|
|
139
|
-
}
|
|
140
|
-
const found: string[] = [];
|
|
141
|
-
for (const entry of entries) {
|
|
142
|
-
const path = joinPath(dir, entry.name);
|
|
143
|
-
if (entry.directory) {
|
|
144
|
-
if (!SKIPPED.has(entry.name)) {
|
|
145
|
-
found.push(...documents(host, path));
|
|
146
|
-
}
|
|
147
|
-
} else if (DOCUMENT.test(entry.name)) {
|
|
148
|
-
found.push(path);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return found.sort();
|
|
152
|
-
}
|
|
153
|
-
|
|
154
130
|
/** The relative specifiers one document's import lines name, its fenced code blocks skipped. */
|
|
155
131
|
function importedBy(
|
|
156
132
|
text: string,
|
|
@@ -178,7 +154,7 @@ function importedBy(
|
|
|
178
154
|
}
|
|
179
155
|
const matched = open === undefined ? IMPORT_LINE.exec(line) : null;
|
|
180
156
|
const specifier = matched?.[2];
|
|
181
|
-
if (specifier
|
|
157
|
+
if (specifier !== undefined && startsRelativePath(specifier)) {
|
|
182
158
|
found.push({ specifier, names: clauseNames(matched?.[1] ?? "") });
|
|
183
159
|
}
|
|
184
160
|
}
|
|
@@ -205,7 +181,8 @@ function documentImports(host: Host, root: string): readonly DocumentImports[] {
|
|
|
205
181
|
if (known !== undefined) {
|
|
206
182
|
return known;
|
|
207
183
|
}
|
|
208
|
-
const found =
|
|
184
|
+
const found = filesBelow(host, root, (name) => DOCUMENT.test(name)).flatMap((below) => {
|
|
185
|
+
const path = joinPath(root, below);
|
|
209
186
|
try {
|
|
210
187
|
return [{ path, imports: importedBy(host.readFile(path)) }];
|
|
211
188
|
} catch {
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import type { ParseFile } from "./configuration-files.ts";
|
|
2
|
+
import { membersNamed, staticModule, textsOf } from "./static-module.ts";
|
|
3
|
+
import { holdsManifest } from "../fs/manifest.ts";
|
|
4
|
+
import type { Host } from "../host.ts";
|
|
5
|
+
import { ancestors, dirnamePath, joinPath, resolvePath } from "../paths.ts";
|
|
6
|
+
|
|
7
|
+
/** The directories a tool run over one file starts from, read before any of its loads is resolved. */
|
|
8
|
+
export interface RunDirectories {
|
|
9
|
+
/**
|
|
10
|
+
* The directory a package manager runs the scripts of the file's package in, the package's
|
|
11
|
+
* root (https://docs.npmjs.com/cli/v11/using-npm/scripts#best-practices): the nearest
|
|
12
|
+
* directory at or above the file, up to the run's top, holding a manifest, else the top.
|
|
13
|
+
*/
|
|
14
|
+
workingDirectoryOf(fileName: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* The bundler's project root a `/` glob is read against
|
|
17
|
+
* (https://vite.dev/guide/features.html#glob-import): the directory of the nearest bundler
|
|
18
|
+
* configuration at or above the file, moved by a literal `root` it writes, else the
|
|
19
|
+
* working directory. Undefined where a configuration there may move it to a place its
|
|
20
|
+
* text does not state.
|
|
21
|
+
*/
|
|
22
|
+
bundlerRootOf(fileName: string): string | undefined;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** The configuration file names the bundler and its test runner read their root from. */
|
|
26
|
+
const BUNDLER_CONFIGS = ["vite.config", "vitest.config"].flatMap((stem) =>
|
|
27
|
+
["js", "mjs", "cjs", "ts", "mts", "cts"].map((extension) => `${stem}.${extension}`),
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The root the configurations of one directory state: the directory where none writes a
|
|
32
|
+
* `root`, the one literal they all write, or undefined where one cannot be read, writes a
|
|
33
|
+
* value that is not a literal, or two disagree.
|
|
34
|
+
*/
|
|
35
|
+
function statedRoot(
|
|
36
|
+
host: Host,
|
|
37
|
+
parse: ParseFile,
|
|
38
|
+
dir: string,
|
|
39
|
+
configs: readonly string[],
|
|
40
|
+
): string | undefined {
|
|
41
|
+
const roots = new Set<string>();
|
|
42
|
+
for (const name of configs) {
|
|
43
|
+
const path = joinPath(dir, name);
|
|
44
|
+
let text: string;
|
|
45
|
+
try {
|
|
46
|
+
text = host.readFile(path);
|
|
47
|
+
} catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
const objects = staticModule(parse(path, text)).defaultExport;
|
|
51
|
+
if (objects.length === 0) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
for (const object of objects) {
|
|
55
|
+
const values = object.kind === "object" ? membersNamed(object, "root") : undefined;
|
|
56
|
+
if (values === undefined) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
for (const value of values) {
|
|
60
|
+
const [root] = textsOf(value, false) ?? [];
|
|
61
|
+
if (root === undefined) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
roots.add(resolvePath(dir, root));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (roots.size > 1) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
return [...roots][0] ?? dir;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** The directories of one run below `top`, each read once per directory. */
|
|
75
|
+
export function runDirectories(host: Host, top: string, parse: ParseFile): RunDirectories {
|
|
76
|
+
const working = new Map<string, string>();
|
|
77
|
+
const bundler = new Map<string, string | undefined>();
|
|
78
|
+
const workingDirectoryOf = (fileName: string): string => {
|
|
79
|
+
const dir = dirnamePath(fileName);
|
|
80
|
+
let found = working.get(dir);
|
|
81
|
+
if (found === undefined) {
|
|
82
|
+
found = ancestors(dir, top).find((at) => holdsManifest(host, at)) ?? top;
|
|
83
|
+
working.set(dir, found);
|
|
84
|
+
}
|
|
85
|
+
return found;
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
workingDirectoryOf,
|
|
89
|
+
bundlerRootOf: (fileName) => {
|
|
90
|
+
const dir = dirnamePath(fileName);
|
|
91
|
+
if (bundler.has(dir)) {
|
|
92
|
+
return bundler.get(dir);
|
|
93
|
+
}
|
|
94
|
+
let found: string | undefined = workingDirectoryOf(fileName);
|
|
95
|
+
for (const at of ancestors(dir, top)) {
|
|
96
|
+
const configs = BUNDLER_CONFIGS.filter(
|
|
97
|
+
(name) => host.kindOf(joinPath(at, name)) === "file",
|
|
98
|
+
);
|
|
99
|
+
if (configs.length > 0) {
|
|
100
|
+
found = statedRoot(host, parse, at, configs);
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
bundler.set(dir, found);
|
|
105
|
+
return found;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sources that enter a project's files with no import naming them, read once per
|
|
3
|
+
* project into one record every stage reads: the roots stage reads the files they enter,
|
|
4
|
+
* the dependency stage the configuration files' strings, and the reference pass the test
|
|
5
|
+
* files. A value a source does not find written out names nothing.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { SourceFile } from "@typescript/native/ast";
|
|
9
|
+
import { buildScriptEntries } from "./build-scripts.ts";
|
|
10
|
+
import {
|
|
11
|
+
configurationFiles,
|
|
12
|
+
filesNamedBy,
|
|
13
|
+
moduleStrings,
|
|
14
|
+
type ConfigurationFiles,
|
|
15
|
+
type ParseFile,
|
|
16
|
+
} from "./configuration-files.ts";
|
|
17
|
+
import {
|
|
18
|
+
conventionEntries,
|
|
19
|
+
conventionTestFiles,
|
|
20
|
+
generatedFiles,
|
|
21
|
+
type Conventions,
|
|
22
|
+
type Selected,
|
|
23
|
+
} from "./conventions.ts";
|
|
24
|
+
import type { Host } from "../host.ts";
|
|
25
|
+
import { htmlEntries } from "./html-entries.ts";
|
|
26
|
+
import { documentEntries } from "./mdx-entries.ts";
|
|
27
|
+
import { dirnamePath } from "../paths.ts";
|
|
28
|
+
import type { SourceFiles } from "../source-files.ts";
|
|
29
|
+
import { globExpression } from "../text/glob.ts";
|
|
30
|
+
import { workflowEntries, type Workflows } from "./workflow-steps.ts";
|
|
31
|
+
|
|
32
|
+
/** Which source entered a file. */
|
|
33
|
+
export type EntryRule =
|
|
34
|
+
/** A configuration module, by the form of its name. */
|
|
35
|
+
| "configuration-file"
|
|
36
|
+
/** A file a relative string of a configuration module or a JSON configuration file names. */
|
|
37
|
+
| "configuration-string"
|
|
38
|
+
/** An entry a build script's bundler call names, whose exports the bundle exposes. */
|
|
39
|
+
| "bundler-entry"
|
|
40
|
+
/** A test file `ts.test_files` or an applied convention row names. */
|
|
41
|
+
| "test-runner"
|
|
42
|
+
/** A file an applied convention row's globs match. */
|
|
43
|
+
| "convention"
|
|
44
|
+
/** A file a module script of an HTML file below the target root loads. */
|
|
45
|
+
| "html-entry"
|
|
46
|
+
/** A file a `run:` step of a workflow in the target root's `.github/workflows` names. */
|
|
47
|
+
| "workflow-step"
|
|
48
|
+
/** A file an import line of a Markdown or MDX document below the target root names. */
|
|
49
|
+
| "document-import";
|
|
50
|
+
|
|
51
|
+
/** One file a source enters. */
|
|
52
|
+
interface EntryPoint {
|
|
53
|
+
readonly file: SourceFile;
|
|
54
|
+
readonly rule: EntryRule;
|
|
55
|
+
/**
|
|
56
|
+
* What named the file: the file-name convention the tool looks for, the row, the
|
|
57
|
+
* test-file pattern or string that classified it, or the literal a configuration or a
|
|
58
|
+
* call writes.
|
|
59
|
+
*/
|
|
60
|
+
readonly source: string;
|
|
61
|
+
/**
|
|
62
|
+
* Whether what the file exports is read too. A tool loading a configuration reads its
|
|
63
|
+
* default export; a runtime executing a test file runs its top level and names none of
|
|
64
|
+
* its exports.
|
|
65
|
+
*/
|
|
66
|
+
readonly exports: boolean;
|
|
67
|
+
/** Where the file is entered for some of its exports only, their export names. */
|
|
68
|
+
readonly names?: readonly string[];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** What the sources of one project are read from. */
|
|
72
|
+
interface SourceContext {
|
|
73
|
+
readonly host: Host;
|
|
74
|
+
readonly targetRoot: string;
|
|
75
|
+
readonly files: SourceFiles;
|
|
76
|
+
/** The parser the files no program holds are read with, where they are read. */
|
|
77
|
+
readonly parse?: ParseFile | undefined;
|
|
78
|
+
/** `ts.test_files` from the resolved configuration. */
|
|
79
|
+
readonly testFiles: readonly string[];
|
|
80
|
+
/** The convention rows the run applied. */
|
|
81
|
+
readonly conventions?: Conventions | undefined;
|
|
82
|
+
/** The target root's workflow steps, git hooks and makefile, read once per run. */
|
|
83
|
+
readonly workflows: Workflows;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** What the sources of one project enter and name. */
|
|
87
|
+
export interface SourceFacts {
|
|
88
|
+
/** Every file a source enters, once per source and string that enters it. */
|
|
89
|
+
readonly entered: readonly EntryPoint[];
|
|
90
|
+
/** The files, absolute, a test runner loads. */
|
|
91
|
+
readonly testFiles: ReadonlySet<string>;
|
|
92
|
+
/** The own files below a directory an applied row generates, by path below the target root, each with the row. */
|
|
93
|
+
readonly generated: ReadonlyMap<string, string>;
|
|
94
|
+
/** The configuration files, whose strings name files and dependencies. */
|
|
95
|
+
readonly configuration: ConfigurationFiles;
|
|
96
|
+
/** The target root's workflow steps, git hooks and makefile the entries were read from. */
|
|
97
|
+
readonly workflows: Workflows;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** One file a test runner loads, and the pattern or string naming it. */
|
|
101
|
+
interface TestFile {
|
|
102
|
+
readonly file: SourceFile;
|
|
103
|
+
readonly source: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** What every source reads: the context, and the configuration files and test files read once. */
|
|
107
|
+
interface SourceInput extends SourceContext {
|
|
108
|
+
readonly configuration: ConfigurationFiles;
|
|
109
|
+
readonly tests: readonly TestFile[];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** One source: the files it enters in one project. */
|
|
113
|
+
type EntrySource = (input: SourceInput) => readonly EntryPoint[];
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Each configuration module, with what it exports, and each own file a relative string of
|
|
117
|
+
* a configuration module or a JSON configuration file names, read against that file's
|
|
118
|
+
* directory. A string at a selection key of an applied convention row, or naming a test
|
|
119
|
+
* file, names no file here.
|
|
120
|
+
*/
|
|
121
|
+
const configurationSource: EntrySource = ({ files, configuration, conventions }) => {
|
|
122
|
+
const selected: ReadonlyMap<string, Selected> = conventions?.selected ?? new Map();
|
|
123
|
+
const found: EntryPoint[] = [];
|
|
124
|
+
const unselected = (file: SourceFile): readonly string[] => {
|
|
125
|
+
const starts = selected.get(file.fileName)?.starts;
|
|
126
|
+
return moduleStrings(file)
|
|
127
|
+
.filter((one) => starts?.has(one.node.getStart()) !== true)
|
|
128
|
+
.map((one) => one.text);
|
|
129
|
+
};
|
|
130
|
+
const unselectedIn = (path: string, texts: readonly string[]): readonly string[] => {
|
|
131
|
+
const left = [...(selected.get(path)?.texts ?? [])];
|
|
132
|
+
return texts.filter((text) => {
|
|
133
|
+
const at = left.indexOf(text);
|
|
134
|
+
if (at < 0) {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
left.splice(at, 1);
|
|
138
|
+
return false;
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
const strings = (dir: string, texts: readonly string[]): void => {
|
|
142
|
+
for (const text of texts) {
|
|
143
|
+
for (const file of filesNamedBy(files, dir, text)) {
|
|
144
|
+
found.push({ file, rule: "configuration-string", source: text, exports: true });
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
for (const { file, form } of configuration.modules) {
|
|
149
|
+
found.push({ file, rule: "configuration-file", source: form, exports: true });
|
|
150
|
+
strings(dirnamePath(file.fileName), unselected(file));
|
|
151
|
+
}
|
|
152
|
+
for (const document of configuration.documents) {
|
|
153
|
+
strings(dirnamePath(document.path), unselectedIn(document.path, document.strings));
|
|
154
|
+
}
|
|
155
|
+
for (const { file } of configuration.outside) {
|
|
156
|
+
strings(dirnamePath(file.fileName), unselected(file));
|
|
157
|
+
}
|
|
158
|
+
return found;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const testSource: EntrySource = ({ tests }) =>
|
|
162
|
+
tests.map(({ file, source }) => ({ file, rule: "test-runner", source, exports: false }));
|
|
163
|
+
|
|
164
|
+
const conventionSource: EntrySource = ({ files, conventions }) =>
|
|
165
|
+
conventions === undefined
|
|
166
|
+
? []
|
|
167
|
+
: conventionEntries(conventions, files).map(({ file, row }) => ({
|
|
168
|
+
file,
|
|
169
|
+
rule: "convention",
|
|
170
|
+
source: row,
|
|
171
|
+
exports: true,
|
|
172
|
+
}));
|
|
173
|
+
|
|
174
|
+
const htmlSource: EntrySource = ({ host, targetRoot, files, parse }) =>
|
|
175
|
+
htmlEntries(host, targetRoot, files, parse).map(({ file, source }) => ({
|
|
176
|
+
file,
|
|
177
|
+
rule: "html-entry",
|
|
178
|
+
source,
|
|
179
|
+
exports: true,
|
|
180
|
+
}));
|
|
181
|
+
|
|
182
|
+
const documentSource: EntrySource = ({ host, targetRoot, files }) =>
|
|
183
|
+
documentEntries(host, targetRoot, files).map(({ file, source, names }) => ({
|
|
184
|
+
file,
|
|
185
|
+
rule: "document-import",
|
|
186
|
+
source,
|
|
187
|
+
exports: true,
|
|
188
|
+
...(names === undefined ? {} : { names }),
|
|
189
|
+
}));
|
|
190
|
+
|
|
191
|
+
const buildScriptSource: EntrySource = ({ host, targetRoot, files, parse }) =>
|
|
192
|
+
buildScriptEntries(host, targetRoot, files, parse).map(({ file, source }) => ({
|
|
193
|
+
file,
|
|
194
|
+
rule: "bundler-entry",
|
|
195
|
+
source,
|
|
196
|
+
exports: true,
|
|
197
|
+
}));
|
|
198
|
+
|
|
199
|
+
const workflowSource: EntrySource = ({ workflows, files }) =>
|
|
200
|
+
workflowEntries(workflows, files).map(({ file, source }) => ({
|
|
201
|
+
file,
|
|
202
|
+
rule: "workflow-step",
|
|
203
|
+
source,
|
|
204
|
+
exports: true,
|
|
205
|
+
}));
|
|
206
|
+
|
|
207
|
+
/** Every source, each read once per project. */
|
|
208
|
+
const ENTRY_SOURCES: readonly EntrySource[] = [
|
|
209
|
+
configurationSource,
|
|
210
|
+
conventionSource,
|
|
211
|
+
testSource,
|
|
212
|
+
htmlSource,
|
|
213
|
+
documentSource,
|
|
214
|
+
buildScriptSource,
|
|
215
|
+
workflowSource,
|
|
216
|
+
];
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* The files a test runner loads in one project: each `ts.test_files` pattern's matches
|
|
220
|
+
* below the target root, then each file an applied row names, once per pattern or row
|
|
221
|
+
* string that names it.
|
|
222
|
+
*/
|
|
223
|
+
function testFilesOf(context: SourceContext): readonly TestFile[] {
|
|
224
|
+
const found: TestFile[] = [];
|
|
225
|
+
for (const pattern of context.testFiles) {
|
|
226
|
+
const expression = globExpression(pattern);
|
|
227
|
+
for (const [path, file] of context.files.byPath) {
|
|
228
|
+
if (expression.test(path)) {
|
|
229
|
+
found.push({ file, source: pattern });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const named =
|
|
234
|
+
context.conventions === undefined
|
|
235
|
+
? []
|
|
236
|
+
: conventionTestFiles(context.conventions, context.files);
|
|
237
|
+
for (const [name, source] of named) {
|
|
238
|
+
const file = context.files.byName.get(name);
|
|
239
|
+
if (file !== undefined) {
|
|
240
|
+
found.push({ file, source });
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return found;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** Reads every source of one project once. */
|
|
247
|
+
export function readSources(context: SourceContext): SourceFacts {
|
|
248
|
+
const configuration = configurationFiles(
|
|
249
|
+
context.host,
|
|
250
|
+
context.targetRoot,
|
|
251
|
+
context.files,
|
|
252
|
+
context.parse,
|
|
253
|
+
);
|
|
254
|
+
const tests = testFilesOf(context);
|
|
255
|
+
const input: SourceInput = { ...context, configuration, tests };
|
|
256
|
+
return {
|
|
257
|
+
entered: ENTRY_SOURCES.flatMap((source) => source(input)),
|
|
258
|
+
testFiles: new Set(tests.map(({ file }) => file.fileName)),
|
|
259
|
+
generated:
|
|
260
|
+
context.conventions === undefined
|
|
261
|
+
? new Map()
|
|
262
|
+
: generatedFiles(context.conventions, context.files),
|
|
263
|
+
configuration,
|
|
264
|
+
workflows: context.workflows,
|
|
265
|
+
};
|
|
266
|
+
}
|