@cplieger/deadset-ts 8.0.0-dev.15 → 8.0.0-dev.17
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/dist/src/alias-chain.js +0 -5
- package/dist/src/amd.js +81 -0
- package/dist/src/analysis.js +94 -54
- package/dist/src/augmentations.js +23 -24
- package/dist/src/bindings.js +382 -0
- package/dist/src/calls.js +25 -8
- package/dist/src/commands/read.js +6 -7
- package/dist/src/commands/tools.js +5 -9
- package/dist/src/component-files.js +3 -2
- package/dist/src/conformance-record.js +1 -1
- package/dist/src/consumers.js +9 -10
- package/dist/src/contextual-uses.js +1 -17
- package/dist/src/contract/config.generated.js +5 -2
- package/dist/src/contract/contract.generated.js +119 -2
- package/dist/src/contract/report.generated.js +6 -2
- package/dist/src/dependencies.js +98 -71
- package/dist/src/destructuring.js +1 -19
- package/dist/src/element-access.js +179 -164
- package/dist/src/entries/build-scripts.js +222 -0
- package/dist/src/{configuration-files.js → entries/configuration-files.js} +22 -64
- package/dist/src/{convention-rows.js → entries/convention-rows.js} +120 -27
- package/dist/src/entries/conventions.js +739 -0
- package/dist/src/{html-entries.js → entries/html-entries.js} +9 -12
- package/dist/src/{mdx-entries.js → entries/mdx-entries.js} +3 -3
- 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 +684 -0
- package/dist/src/{workflow-steps.js → entries/workflow-steps.js} +18 -8
- package/dist/src/extensions.js +37 -0
- package/dist/src/facts.js +38 -0
- package/dist/src/findings/completion.js +40 -4
- package/dist/src/findings/emitters.js +5 -8
- package/dist/src/{implementations.js → findings/implementations.js} +3 -3
- package/dist/src/{in-operands.js → findings/in-operands.js} +2 -2
- package/dist/src/findings/self-check.js +36 -20
- package/dist/src/findings-pass.js +5 -6
- package/dist/src/framework-lifecycle.js +42 -15
- package/dist/src/fs/manifest.js +15 -20
- package/dist/src/generated-file.js +172 -29
- package/dist/src/graph.js +14 -8
- package/dist/src/import-bindings.js +73 -28
- package/dist/src/index/sites.js +557 -0
- package/dist/src/index.js +1 -1
- package/dist/src/indexed-access.js +523 -478
- package/dist/src/injection-container.js +1 -1
- package/dist/src/interface-satisfaction.js +1 -1
- package/dist/src/inventory/commonjs.js +62 -17
- package/dist/src/inventory/enumerate.js +2 -1
- package/dist/src/javascript-file.js +26 -11
- package/dist/src/keyof-comparisons.js +124 -103
- package/dist/src/load/classify.js +28 -9
- package/dist/src/load/diagnostics.js +8 -1
- package/dist/src/load/discover.js +15 -7
- package/dist/src/load/expected-module.js +2 -2
- package/dist/src/load/plan.js +2 -2
- package/dist/src/load/specifiers.js +2 -4
- package/dist/src/load/synthesize.js +10 -5
- package/dist/src/load/workspace-manifests.js +1 -1
- package/dist/src/load/workspace-resolution.js +2 -2
- package/dist/src/matrix.js +12 -17
- package/dist/src/module-declarations.js +70 -85
- package/dist/src/overrides.js +134 -112
- package/dist/src/paths.js +56 -1
- package/dist/src/platform-calls.js +78 -0
- package/dist/src/platform-symbols.js +134 -0
- package/dist/src/references/read-rule.js +1 -0
- package/dist/src/references/read-rules.js +48 -0
- package/dist/src/references/sink.js +151 -0
- package/dist/src/references/sources.js +450 -0
- package/dist/src/references.js +111 -1116
- package/dist/src/resolve.js +1 -1
- package/dist/src/{configured-declarations.js → roots/configured-declarations.js} +7 -4
- package/dist/src/{entry-point-gaps.js → roots/entry-point-gaps.js} +5 -8
- package/dist/src/{manifest.js → roots/manifest.js} +4 -4
- package/dist/src/roots/published-reach.js +412 -0
- package/dist/src/roots/root-set.js +489 -0
- package/dist/src/roots/unseen-loads.js +236 -0
- package/dist/src/serialization-contract.js +9 -4
- package/dist/src/source-files.js +5 -9
- package/dist/src/stores.js +4 -2
- package/dist/src/suppress.js +30 -32
- package/dist/src/sweep.js +25 -13
- package/dist/src/symbol-keys.js +89 -83
- 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/type-parameter-reads.js +178 -139
- package/dist/src/unimplemented-callees.js +262 -242
- package/dist/src/verbs/analyze.js +15 -3
- package/dist/src/verbs/describe.js +5 -3
- package/dist/src/verbs/explain.js +50 -28
- package/dist/src/verbs/print-retained.js +2 -2
- package/jsr.json +1 -1
- package/package.json +3 -3
- package/src/alias-chain.ts +0 -7
- package/src/amd.ts +130 -0
- package/src/analysis.ts +156 -70
- package/src/augmentations.ts +41 -27
- package/src/automatic-types.ts +1 -1
- package/src/bindings.ts +460 -0
- package/src/calls.ts +25 -7
- package/src/commands/read.ts +6 -8
- package/src/commands/tools.ts +5 -11
- package/src/component-files.ts +4 -2
- package/src/conformance-record.ts +1 -1
- package/src/consumers.ts +12 -11
- package/src/contextual-uses.ts +2 -22
- package/src/contract/config.generated.ts +5 -2
- package/src/contract/contract.generated.ts +138 -2
- package/src/contract/report.generated.ts +6 -2
- package/src/dependencies.ts +117 -71
- package/src/destructuring.ts +1 -31
- package/src/element-access.ts +188 -182
- package/src/entries/build-scripts.ts +292 -0
- package/src/{configuration-files.ts → entries/configuration-files.ts} +33 -82
- package/src/{convention-rows.ts → entries/convention-rows.ts} +167 -28
- package/src/{conventions.ts → entries/conventions.ts} +349 -523
- package/src/{html-entries.ts → entries/html-entries.ts} +19 -18
- package/src/{mdx-entries.ts → entries/mdx-entries.ts} +5 -5
- 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 +868 -0
- package/src/{workflow-steps.ts → entries/workflow-steps.ts} +29 -11
- package/src/exempt.ts +3 -2
- package/src/extensions.ts +45 -0
- package/src/facts.ts +46 -0
- package/src/file-facts.ts +1 -1
- package/src/findings/boundary.ts +2 -0
- package/src/findings/completion.ts +43 -4
- package/src/findings/emitter.ts +1 -1
- package/src/findings/emitters.ts +14 -10
- package/src/{implementations.ts → findings/implementations.ts} +4 -4
- package/src/{in-operands.ts → findings/in-operands.ts} +3 -3
- package/src/findings/self-check.ts +41 -22
- package/src/findings/visibility-narrowing.ts +1 -1
- package/src/findings-pass.ts +5 -12
- package/src/framework-lifecycle.ts +43 -15
- package/src/fs/manifest.ts +25 -21
- package/src/generated-file.ts +240 -36
- package/src/graph.ts +27 -11
- package/src/import-bindings.ts +98 -29
- package/src/index/sites.ts +781 -0
- package/src/index.ts +1 -1
- package/src/indexed-access.ts +570 -527
- package/src/injection-container.ts +1 -1
- package/src/interface-satisfaction.ts +1 -1
- package/src/inventory/commonjs.ts +102 -17
- package/src/inventory/enumerate.ts +2 -1
- package/src/javascript-file.ts +29 -12
- package/src/keyof-comparisons.ts +131 -116
- package/src/load/classify.ts +49 -13
- package/src/load/diagnostics.ts +11 -1
- package/src/load/discover.ts +27 -11
- package/src/load/expected-module.ts +8 -2
- package/src/load/plan.ts +11 -2
- package/src/load/specifiers.ts +8 -5
- package/src/load/synthesize.ts +12 -6
- package/src/load/test-globals.ts +1 -1
- package/src/load/workspace-manifests.ts +1 -1
- package/src/load/workspace-resolution.ts +9 -2
- package/src/load/workspace-run.ts +1 -1
- package/src/matrix.ts +13 -17
- package/src/module-declarations.ts +74 -98
- package/src/overrides.ts +162 -134
- package/src/paths.ts +65 -1
- package/src/platform-calls.ts +119 -0
- package/src/platform-symbols.ts +189 -0
- package/src/references/read-rule.ts +60 -0
- package/src/references/read-rules.ts +55 -0
- package/src/references/sink.ts +213 -0
- package/src/references/sources.ts +632 -0
- package/src/references.ts +174 -1492
- package/src/report.ts +2 -2
- package/src/resolve.ts +1 -1
- package/src/{configured-declarations.ts → roots/configured-declarations.ts} +10 -7
- package/src/{entry-point-gaps.ts → roots/entry-point-gaps.ts} +5 -8
- package/src/{manifest.ts → roots/manifest.ts} +5 -5
- package/src/roots/published-reach.ts +481 -0
- package/src/{roots.ts → roots/root-set.ts} +203 -630
- package/src/roots/unseen-loads.ts +345 -0
- package/src/serialization-contract.ts +9 -4
- package/src/source-files.ts +5 -10
- package/src/stores.ts +13 -2
- package/src/suppress.ts +48 -33
- package/src/sweep.ts +37 -14
- package/src/symbol-keys.ts +102 -102
- package/src/tests/file-class.ts +118 -0
- package/src/{outside-tests.ts → tests/outside.ts} +16 -10
- package/src/{test-support.ts → tests/support.ts} +15 -21
- package/src/type-parameter-reads.ts +187 -158
- package/src/unimplemented-callees.ts +297 -280
- package/src/verbs/analyze.ts +19 -5
- package/src/verbs/describe.ts +5 -2
- package/src/verbs/explain.ts +75 -32
- package/src/verbs/print-retained.ts +2 -2
- package/dist/src/build-scripts.js +0 -418
- package/dist/src/conventions.js +0 -907
- package/dist/src/entry-points.js +0 -444
- package/dist/src/own-body.js +0 -28
- package/dist/src/roots.js +0 -865
- package/dist/src/unseen-loads.js +0 -189
- package/src/build-scripts.ts +0 -536
- package/src/entry-points.ts +0 -584
- package/src/own-body.ts +0 -42
- package/src/unseen-loads.ts +0 -282
|
@@ -5,21 +5,17 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { isExportDeclaration, isImportDeclaration, isStringLiteral, } from "@typescript/native/ast";
|
|
7
7
|
import { resolveRelativeSpecifier } from "./configuration-files.js";
|
|
8
|
-
import { ancestors, dirnamePath, joinPath, resolvePath } from "
|
|
9
|
-
import { filesBelow } from "
|
|
10
|
-
import { holdsManifest } from "
|
|
8
|
+
import { ancestors, dirnamePath, hasURLScheme, isAbsolutePath, isExplicitPath, joinPath, resolvePath, } from "../paths.js";
|
|
9
|
+
import { filesBelow } from "../fs/tree.js";
|
|
10
|
+
import { holdsManifest } from "../fs/manifest.js";
|
|
11
11
|
/** A `<script` start tag, its attribute text captured. */
|
|
12
12
|
const SCRIPT_TAG = /<script(?=[\s>/])([^>]*)>/giu;
|
|
13
13
|
/** The end tag an inline module script's content runs to. */
|
|
14
14
|
const SCRIPT_END = /<\/script\s*>/iu;
|
|
15
15
|
/** One attribute: a name, then a double-quoted, single-quoted or unquoted value. */
|
|
16
16
|
const ATTRIBUTE = /([^\s"'=<>/]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'=<>`]+)))?/gu;
|
|
17
|
-
/** A value that names a resource on another origin, or by another scheme. */
|
|
18
|
-
const ELSEWHERE = /^(?:\/\/|[A-Za-z][A-Za-z\d+.-]*:)/u;
|
|
19
17
|
/** The `type` values a classic script carries, compared in lowercase. */
|
|
20
18
|
const CLASSIC_TYPES = new Set(["text/javascript", "application/javascript"]);
|
|
21
|
-
/** The prefixes an inline script's specifier names a file of the target with. */
|
|
22
|
-
const FILE_PREFIXES = ["/", "./", "../"];
|
|
23
19
|
/** Each attribute of one start tag's attribute text, by its lowercase name. */
|
|
24
20
|
function attributes(text) {
|
|
25
21
|
const found = new Map();
|
|
@@ -69,7 +65,7 @@ function scriptValues(parse, path, text) {
|
|
|
69
65
|
const rest = text.slice(start);
|
|
70
66
|
const end = rest.search(SCRIPT_END);
|
|
71
67
|
const content = end === -1 ? rest : rest.slice(0, end);
|
|
72
|
-
values.push(...specifiersOf(parse, `${path}.${String(start)}.ts`, content).filter(
|
|
68
|
+
values.push(...specifiersOf(parse, `${path}.${String(start)}.ts`, content).filter(isExplicitPath));
|
|
73
69
|
}
|
|
74
70
|
return values;
|
|
75
71
|
}
|
|
@@ -98,18 +94,19 @@ export function htmlEntries(host, targetRoot, files, parse) {
|
|
|
98
94
|
}
|
|
99
95
|
const dir = dirnamePath(path);
|
|
100
96
|
for (const value of scriptValues(parse, path, text)) {
|
|
101
|
-
|
|
97
|
+
// A value with a scheme, or one starting `//`, names a resource on another origin.
|
|
98
|
+
if (value.startsWith("//") || hasURLScheme(value)) {
|
|
102
99
|
continue;
|
|
103
100
|
}
|
|
104
|
-
const base = value
|
|
105
|
-
const relative = value
|
|
101
|
+
const base = isAbsolutePath(value) ? manifestDirectory(host, root, dir) : dir;
|
|
102
|
+
const relative = isAbsolutePath(value) ? `.${value}` : value;
|
|
106
103
|
const reached = resolveRelativeSpecifier(host, base, relative);
|
|
107
104
|
const file = reached === undefined ? undefined : files.byName.get(reached);
|
|
108
105
|
if (file !== undefined) {
|
|
109
106
|
found.push({ file, source: value });
|
|
110
107
|
continue;
|
|
111
108
|
}
|
|
112
|
-
const served = value
|
|
109
|
+
const served = isAbsolutePath(value)
|
|
113
110
|
? files.outputDirs.filter((outDir) => outDir === dir)
|
|
114
111
|
: [];
|
|
115
112
|
const emitting = [base, ...served].flatMap((against) => files.named(resolvePath(against, relative)));
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* is an import declaration, which an MDX compiler hoists into the module it builds.
|
|
5
5
|
*/
|
|
6
6
|
import { resolveRelativeSpecifier } from "./configuration-files.js";
|
|
7
|
-
import { dirnamePath, joinPath, resolvePath } from "
|
|
8
|
-
import { filesBelow } from "
|
|
7
|
+
import { dirnamePath, joinPath, resolvePath, startsRelativePath } from "../paths.js";
|
|
8
|
+
import { filesBelow } from "../fs/tree.js";
|
|
9
9
|
/** The extensions of a document whose imports an MDX compiler reads. */
|
|
10
10
|
const DOCUMENT = /\.mdx?$/u;
|
|
11
11
|
/** A fence line, its marker run and what follows it captured. */
|
|
@@ -122,7 +122,7 @@ function importedBy(text) {
|
|
|
122
122
|
}
|
|
123
123
|
const matched = open === undefined ? IMPORT_LINE.exec(line) : null;
|
|
124
124
|
const specifier = matched?.[2];
|
|
125
|
-
if (specifier
|
|
125
|
+
if (specifier !== undefined && startsRelativePath(specifier)) {
|
|
126
126
|
found.push({ specifier, names: clauseNames(matched?.[1] ?? "") });
|
|
127
127
|
}
|
|
128
128
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { membersNamed, staticModule, textsOf } from "./static-module.js";
|
|
2
|
+
import { holdsManifest } from "../fs/manifest.js";
|
|
3
|
+
import { ancestors, dirnamePath, joinPath, resolvePath } from "../paths.js";
|
|
4
|
+
/** The configuration file names the bundler and its test runner read their root from. */
|
|
5
|
+
const BUNDLER_CONFIGS = ["vite.config", "vitest.config"].flatMap((stem) => ["js", "mjs", "cjs", "ts", "mts", "cts"].map((extension) => `${stem}.${extension}`));
|
|
6
|
+
/**
|
|
7
|
+
* The root the configurations of one directory state: the directory where none writes a
|
|
8
|
+
* `root`, the one literal they all write, or undefined where one cannot be read, writes a
|
|
9
|
+
* value that is not a literal, or two disagree.
|
|
10
|
+
*/
|
|
11
|
+
function statedRoot(host, parse, dir, configs) {
|
|
12
|
+
const roots = new Set();
|
|
13
|
+
for (const name of configs) {
|
|
14
|
+
const path = joinPath(dir, name);
|
|
15
|
+
let text;
|
|
16
|
+
try {
|
|
17
|
+
text = host.readFile(path);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const objects = staticModule(parse(path, text)).defaultExport;
|
|
23
|
+
if (objects.length === 0) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
for (const object of objects) {
|
|
27
|
+
const values = object.kind === "object" ? membersNamed(object, "root") : undefined;
|
|
28
|
+
if (values === undefined) {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
for (const value of values) {
|
|
32
|
+
const [root] = textsOf(value, false) ?? [];
|
|
33
|
+
if (root === undefined) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
roots.add(resolvePath(dir, root));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (roots.size > 1) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
return [...roots][0] ?? dir;
|
|
44
|
+
}
|
|
45
|
+
/** The directories of one run below `top`, each read once per directory. */
|
|
46
|
+
export function runDirectories(host, top, parse) {
|
|
47
|
+
const working = new Map();
|
|
48
|
+
const bundler = new Map();
|
|
49
|
+
const workingDirectoryOf = (fileName) => {
|
|
50
|
+
const dir = dirnamePath(fileName);
|
|
51
|
+
let found = working.get(dir);
|
|
52
|
+
if (found === undefined) {
|
|
53
|
+
found = ancestors(dir, top).find((at) => holdsManifest(host, at)) ?? top;
|
|
54
|
+
working.set(dir, found);
|
|
55
|
+
}
|
|
56
|
+
return found;
|
|
57
|
+
};
|
|
58
|
+
return {
|
|
59
|
+
workingDirectoryOf,
|
|
60
|
+
bundlerRootOf: (fileName) => {
|
|
61
|
+
const dir = dirnamePath(fileName);
|
|
62
|
+
if (bundler.has(dir)) {
|
|
63
|
+
return bundler.get(dir);
|
|
64
|
+
}
|
|
65
|
+
let found = workingDirectoryOf(fileName);
|
|
66
|
+
for (const at of ancestors(dir, top)) {
|
|
67
|
+
const configs = BUNDLER_CONFIGS.filter((name) => host.kindOf(joinPath(at, name)) === "file");
|
|
68
|
+
if (configs.length > 0) {
|
|
69
|
+
found = statedRoot(host, parse, at, configs);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
bundler.set(dir, found);
|
|
74
|
+
return found;
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
import { buildScriptEntries } from "./build-scripts.js";
|
|
8
|
+
import { configurationFiles, filesNamedBy, moduleStrings, } from "./configuration-files.js";
|
|
9
|
+
import { conventionEntries, conventionTestFiles, generatedFiles, } from "./conventions.js";
|
|
10
|
+
import { htmlEntries } from "./html-entries.js";
|
|
11
|
+
import { documentEntries } from "./mdx-entries.js";
|
|
12
|
+
import { dirnamePath } from "../paths.js";
|
|
13
|
+
import { globExpression } from "../text/glob.js";
|
|
14
|
+
import { workflowEntries } from "./workflow-steps.js";
|
|
15
|
+
/**
|
|
16
|
+
* Each configuration module, with what it exports, and each own file a relative string of
|
|
17
|
+
* a configuration module or a JSON configuration file names, read against that file's
|
|
18
|
+
* directory. A string at a selection key of an applied convention row, or naming a test
|
|
19
|
+
* file, names no file here.
|
|
20
|
+
*/
|
|
21
|
+
const configurationSource = ({ files, configuration, conventions }) => {
|
|
22
|
+
const selected = conventions?.selected ?? new Map();
|
|
23
|
+
const found = [];
|
|
24
|
+
const unselected = (file) => {
|
|
25
|
+
const starts = selected.get(file.fileName)?.starts;
|
|
26
|
+
return moduleStrings(file)
|
|
27
|
+
.filter((one) => starts?.has(one.node.getStart()) !== true)
|
|
28
|
+
.map((one) => one.text);
|
|
29
|
+
};
|
|
30
|
+
const unselectedIn = (path, texts) => {
|
|
31
|
+
const left = [...(selected.get(path)?.texts ?? [])];
|
|
32
|
+
return texts.filter((text) => {
|
|
33
|
+
const at = left.indexOf(text);
|
|
34
|
+
if (at < 0) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
left.splice(at, 1);
|
|
38
|
+
return false;
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
const strings = (dir, texts) => {
|
|
42
|
+
for (const text of texts) {
|
|
43
|
+
for (const file of filesNamedBy(files, dir, text)) {
|
|
44
|
+
found.push({ file, rule: "configuration-string", source: text, exports: true });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
for (const { file, form } of configuration.modules) {
|
|
49
|
+
found.push({ file, rule: "configuration-file", source: form, exports: true });
|
|
50
|
+
strings(dirnamePath(file.fileName), unselected(file));
|
|
51
|
+
}
|
|
52
|
+
for (const document of configuration.documents) {
|
|
53
|
+
strings(dirnamePath(document.path), unselectedIn(document.path, document.strings));
|
|
54
|
+
}
|
|
55
|
+
for (const { file } of configuration.outside) {
|
|
56
|
+
strings(dirnamePath(file.fileName), unselected(file));
|
|
57
|
+
}
|
|
58
|
+
return found;
|
|
59
|
+
};
|
|
60
|
+
const testSource = ({ tests }) => tests.map(({ file, source }) => ({ file, rule: "test-runner", source, exports: false }));
|
|
61
|
+
const conventionSource = ({ files, conventions }) => conventions === undefined
|
|
62
|
+
? []
|
|
63
|
+
: conventionEntries(conventions, files).map(({ file, row }) => ({
|
|
64
|
+
file,
|
|
65
|
+
rule: "convention",
|
|
66
|
+
source: row,
|
|
67
|
+
exports: true,
|
|
68
|
+
}));
|
|
69
|
+
const htmlSource = ({ host, targetRoot, files, parse }) => htmlEntries(host, targetRoot, files, parse).map(({ file, source }) => ({
|
|
70
|
+
file,
|
|
71
|
+
rule: "html-entry",
|
|
72
|
+
source,
|
|
73
|
+
exports: true,
|
|
74
|
+
}));
|
|
75
|
+
const documentSource = ({ host, targetRoot, files }) => documentEntries(host, targetRoot, files).map(({ file, source, names }) => ({
|
|
76
|
+
file,
|
|
77
|
+
rule: "document-import",
|
|
78
|
+
source,
|
|
79
|
+
exports: true,
|
|
80
|
+
...(names === undefined ? {} : { names }),
|
|
81
|
+
}));
|
|
82
|
+
const buildScriptSource = ({ host, targetRoot, files, parse }) => buildScriptEntries(host, targetRoot, files, parse).map(({ file, source }) => ({
|
|
83
|
+
file,
|
|
84
|
+
rule: "bundler-entry",
|
|
85
|
+
source,
|
|
86
|
+
exports: true,
|
|
87
|
+
}));
|
|
88
|
+
const workflowSource = ({ workflows, files }) => workflowEntries(workflows, files).map(({ file, source }) => ({
|
|
89
|
+
file,
|
|
90
|
+
rule: "workflow-step",
|
|
91
|
+
source,
|
|
92
|
+
exports: true,
|
|
93
|
+
}));
|
|
94
|
+
/** Every source, each read once per project. */
|
|
95
|
+
const ENTRY_SOURCES = [
|
|
96
|
+
configurationSource,
|
|
97
|
+
conventionSource,
|
|
98
|
+
testSource,
|
|
99
|
+
htmlSource,
|
|
100
|
+
documentSource,
|
|
101
|
+
buildScriptSource,
|
|
102
|
+
workflowSource,
|
|
103
|
+
];
|
|
104
|
+
/**
|
|
105
|
+
* The files a test runner loads in one project: each `ts.test_files` pattern's matches
|
|
106
|
+
* below the target root, then each file an applied row names, once per pattern or row
|
|
107
|
+
* string that names it.
|
|
108
|
+
*/
|
|
109
|
+
function testFilesOf(context) {
|
|
110
|
+
const found = [];
|
|
111
|
+
for (const pattern of context.testFiles) {
|
|
112
|
+
const expression = globExpression(pattern);
|
|
113
|
+
for (const [path, file] of context.files.byPath) {
|
|
114
|
+
if (expression.test(path)) {
|
|
115
|
+
found.push({ file, source: pattern });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
const named = context.conventions === undefined
|
|
120
|
+
? []
|
|
121
|
+
: conventionTestFiles(context.conventions, context.files);
|
|
122
|
+
for (const [name, source] of named) {
|
|
123
|
+
const file = context.files.byName.get(name);
|
|
124
|
+
if (file !== undefined) {
|
|
125
|
+
found.push({ file, source });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return found;
|
|
129
|
+
}
|
|
130
|
+
/** Reads every source of one project once. */
|
|
131
|
+
export function readSources(context) {
|
|
132
|
+
const configuration = configurationFiles(context.host, context.targetRoot, context.files, context.parse);
|
|
133
|
+
const tests = testFilesOf(context);
|
|
134
|
+
const input = { ...context, configuration, tests };
|
|
135
|
+
return {
|
|
136
|
+
entered: ENTRY_SOURCES.flatMap((source) => source(input)),
|
|
137
|
+
testFiles: new Set(tests.map(({ file }) => file.fileName)),
|
|
138
|
+
generated: context.conventions === undefined
|
|
139
|
+
? new Map()
|
|
140
|
+
: generatedFiles(context.conventions, context.files),
|
|
141
|
+
configuration,
|
|
142
|
+
workflows: context.workflows,
|
|
143
|
+
};
|
|
144
|
+
}
|