foresthouse 1.0.1-dev.3 → 1.0.1-dev.5
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/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { a as printReactUsageTree, c as printPackageDependencyTree, f as analyzeReactUsage, g as analyzePackageDependencies, h as analyzePackageDependencyDiff, i as graphToSerializablePackageTree, m as isSourceCodeFile, n as graphToSerializableTree, o as printDependencyTree, p as analyzeDependencies, r as diffGraphToSerializablePackageTree, s as printPackageDependencyDiffTree, t as graphToSerializableReactTree } from "./react-
|
|
2
|
+
import { a as printReactUsageTree, c as printPackageDependencyTree, f as analyzeReactUsage, g as analyzePackageDependencies, h as analyzePackageDependencyDiff, i as graphToSerializablePackageTree, m as isSourceCodeFile, n as graphToSerializableTree, o as printDependencyTree, p as analyzeDependencies, r as diffGraphToSerializablePackageTree, s as printPackageDependencyDiffTree, t as graphToSerializableReactTree } from "./react-CLWQWjrh.mjs";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path from "node:path";
|
package/dist/index.d.mts
CHANGED
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/package-dependency-change-kind.ts","../src/types/package-dependency-diff-dependency.ts","../src/types/package-dependency-diff-node.ts","../src/types/package-dependency-diff-graph.ts","../src/analyzers/deps/diff.ts","../src/types/package-manifest-dependency.ts","../src/types/package-dependency-node.ts","../src/types/package-dependency-graph.ts","../src/analyzers/deps/index.ts","../src/types/analyze-options.ts","../src/types/dependency-kind.ts","../src/types/reference-kind.ts","../src/types/dependency-edge.ts","../src/types/source-module-node.ts","../src/types/dependency-graph.ts","../src/analyzers/import/index.ts","../src/types/react-usage-location.ts","../src/types/react-usage-entry.ts","../src/types/react-symbol-kind.ts","../src/types/react-usage-edge-kind.ts","../src/types/react-usage-edge.ts","../src/types/react-usage-node.ts","../src/types/react-usage-graph.ts","../src/analyzers/react/index.ts","../src/types/react-usage-filter.ts","../src/analyzers/react/queries.ts","../src/types/color-mode.ts","../src/types/print-package-tree-options.ts","../src/output/ascii/deps.ts","../src/types/print-tree-options.ts","../src/output/ascii/import.ts","../src/types/print-react-tree-options.ts","../src/output/ascii/react.ts","../src/output/json/deps.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"mappings":";KAAY,2BAAA;;;UCGK,0BAAA;EAAA,SACN,MAAA;EAAA,SACA,SAAA;EAAA,SACA,eAAA;EAAA,SACA,WAAA;AAAA;AAAA,UAGD,mCAAA;EAAA,SACC,IAAA;EAAA,SACA,MAAA,EAAQ,2BAAA;EAAA,SACR,MAAA,GAAS,0BAAA;EAAA,SACT,KAAA,GAAQ,0BAAA;AAAA;AAAA,UAGF,6BAAA,SACP,mCAAA;EAAA,SACC,IAAA;EAAA,SACA,gBAAA;EAAA,SACA,sBAAA;EAAA,SACA,kBAAA;AAAA;AAAA,UAGM,8BAAA,SACP,mCAAA;EAAA,SACC,IAAA;EAAA,SACA,IAAA,EAAM,yBAAA;AAAA;AAAA,KAGL,+BAAA,GACR,6BAAA,GACA,8BAAA;;;UC9Ba,yBAAA;EAAA,SACN,IAAA;EAAA,SACA,KAAA;EAAA,SACA,WAAA;EAAA,SACA,IAAA;EAAA,SACA,MAAA,EAAQ,2BAAA;EAAA,SACR,iBAAA;EAAA,SACA,gBAAA;EAAA,SACA,YAAA,WAAuB,+BAAA;AAAA;;;UCTjB,0BAAA;EAAA,SACN,cAAA;EAAA,SACA,IAAA,EAAM,yBAAA;AAAA;;;iBCwDD,4BAAA,CACd,SAAA,UACA,IAAA,WACC,0BAAA;;;UC/Dc,iCAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,SAAA;AAAA;AAAA,UAGM,kCAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;EAAA,SACA,SAAA;EAAA,SACA,MAAA;AAAA;AAAA,KAGC,yBAAA,GACR,iCAAA,GACA,kCAAA;;;UCba,qBAAA;EAAA,SACN,UAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA,WAAuB,yBAAA;AAAA;;;UCHjB,sBAAA;EAAA,SACN,cAAA;EAAA,SACA,MAAA;EAAA,SACA,KAAA,EAAO,WAAA,SAAoB,qBAAA;AAAA;;;iBC0BtB,0BAAA,CACd,SAAA,WACC,sBAAA;;;UCjCc,cAAA;EAAA,SACN,GAAA;EAAA,SACA,UAAA;EAAA,SACA,gBAAA;EAAA,SACA,WAAA;EAAA,SACA,eAAA;AAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types/package-dependency-change-kind.ts","../src/types/package-dependency-diff-dependency.ts","../src/types/package-dependency-diff-node.ts","../src/types/package-dependency-diff-graph.ts","../src/analyzers/deps/diff.ts","../src/types/package-manifest-dependency.ts","../src/types/package-dependency-node.ts","../src/types/package-dependency-graph.ts","../src/analyzers/deps/index.ts","../src/types/analyze-options.ts","../src/types/dependency-kind.ts","../src/types/reference-kind.ts","../src/types/dependency-edge.ts","../src/types/source-module-node.ts","../src/types/dependency-graph.ts","../src/analyzers/import/index.ts","../src/types/react-usage-location.ts","../src/types/react-usage-entry.ts","../src/types/react-symbol-kind.ts","../src/types/react-usage-edge-kind.ts","../src/types/react-usage-edge.ts","../src/types/react-usage-node.ts","../src/types/react-usage-graph.ts","../src/analyzers/react/index.ts","../src/types/react-usage-filter.ts","../src/analyzers/react/queries.ts","../src/types/color-mode.ts","../src/types/print-package-tree-options.ts","../src/output/ascii/deps.ts","../src/types/print-tree-options.ts","../src/output/ascii/import.ts","../src/types/print-react-tree-options.ts","../src/output/ascii/react.ts","../src/output/json/deps.ts","../src/output/json/import.ts","../src/output/json/react.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as printReactUsageTree, c as printPackageDependencyTree, d as getReactUsageRoots, f as analyzeReactUsage, g as analyzePackageDependencies, h as analyzePackageDependencyDiff, i as graphToSerializablePackageTree, l as getFilteredUsages, n as graphToSerializableTree, o as printDependencyTree, p as analyzeDependencies, r as diffGraphToSerializablePackageTree, s as printPackageDependencyDiffTree, t as graphToSerializableReactTree, u as getReactUsageEntries } from "./react-
|
|
1
|
+
import { a as printReactUsageTree, c as printPackageDependencyTree, d as getReactUsageRoots, f as analyzeReactUsage, g as analyzePackageDependencies, h as analyzePackageDependencyDiff, i as graphToSerializablePackageTree, l as getFilteredUsages, n as graphToSerializableTree, o as printDependencyTree, p as analyzeDependencies, r as diffGraphToSerializablePackageTree, s as printPackageDependencyDiffTree, t as graphToSerializableReactTree, u as getReactUsageEntries } from "./react-CLWQWjrh.mjs";
|
|
2
2
|
export { analyzeDependencies, analyzePackageDependencies, analyzePackageDependencyDiff, analyzeReactUsage, diffGraphToSerializablePackageTree, getFilteredUsages, getReactUsageEntries, getReactUsageRoots, graphToSerializablePackageTree, graphToSerializableReactTree, graphToSerializableTree, printDependencyTree, printPackageDependencyDiffTree, printPackageDependencyTree, printReactUsageTree };
|
|
@@ -39,8 +39,8 @@ var PackageDependencyAnalyzer = class extends BaseAnalyzer {
|
|
|
39
39
|
}
|
|
40
40
|
doAnalyze() {
|
|
41
41
|
const rootPackageDir = findNearestPackageDirectory(resolveInputDirectory(this.inputPath));
|
|
42
|
-
const workspaceRootDir = findWorkspaceRoot(rootPackageDir) ?? rootPackageDir;
|
|
43
|
-
const workspacePackages = discoverWorkspacePackages(workspaceRootDir);
|
|
42
|
+
const workspaceRootDir = findWorkspaceRoot$1(rootPackageDir) ?? rootPackageDir;
|
|
43
|
+
const workspacePackages = discoverWorkspacePackages$1(workspaceRootDir);
|
|
44
44
|
const nodes = /* @__PURE__ */ new Map();
|
|
45
45
|
visitPackage(rootPackageDir, workspaceRootDir, workspacePackages, nodes);
|
|
46
46
|
return {
|
|
@@ -52,7 +52,7 @@ var PackageDependencyAnalyzer = class extends BaseAnalyzer {
|
|
|
52
52
|
};
|
|
53
53
|
function visitPackage(packageDir, repositoryRoot, workspacePackages, nodes) {
|
|
54
54
|
if (nodes.has(packageDir)) return;
|
|
55
|
-
const manifest = readPackageManifest(packageDir);
|
|
55
|
+
const manifest = readPackageManifest$1(packageDir);
|
|
56
56
|
const packageName = resolvePackageName(manifest, packageDir);
|
|
57
57
|
const dependencies = packageDir === repositoryRoot && workspacePackages.size > 0 ? collectRepositoryRootDependencies(manifest, workspacePackages, repositoryRoot) : collectManifestDependencies(manifest, workspacePackages, repositoryRoot);
|
|
58
58
|
nodes.set(packageDir, {
|
|
@@ -82,13 +82,13 @@ function findNearestPackageDirectory(startDirectory) {
|
|
|
82
82
|
}
|
|
83
83
|
throw new Error(`No package.json found from ${startDirectory}`);
|
|
84
84
|
}
|
|
85
|
-
function findWorkspaceRoot(packageDir) {
|
|
85
|
+
function findWorkspaceRoot$1(packageDir) {
|
|
86
86
|
let currentDirectory = packageDir;
|
|
87
87
|
while (true) {
|
|
88
88
|
const packageJsonPath = path.join(currentDirectory, "package.json");
|
|
89
89
|
if (fs.existsSync(packageJsonPath)) {
|
|
90
|
-
const manifest = readPackageManifest(currentDirectory);
|
|
91
|
-
const workspacePatterns = resolveWorkspacePatterns(currentDirectory, manifest);
|
|
90
|
+
const manifest = readPackageManifest$1(currentDirectory);
|
|
91
|
+
const workspacePatterns = resolveWorkspacePatterns$1(currentDirectory, manifest);
|
|
92
92
|
if (workspacePatterns.length > 0 && currentDirectory === packageDir) return currentDirectory;
|
|
93
93
|
if (workspacePatterns.length > 0 && isWorkspaceMatch(currentDirectory, workspacePatterns, packageDir)) return currentDirectory;
|
|
94
94
|
}
|
|
@@ -97,18 +97,18 @@ function findWorkspaceRoot(packageDir) {
|
|
|
97
97
|
currentDirectory = parentDirectory;
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
function discoverWorkspacePackages(repositoryRoot) {
|
|
101
|
-
const workspacePatterns = resolveWorkspacePatterns(repositoryRoot, readPackageManifest(repositoryRoot));
|
|
100
|
+
function discoverWorkspacePackages$1(repositoryRoot) {
|
|
101
|
+
const workspacePatterns = resolveWorkspacePatterns$1(repositoryRoot, readPackageManifest$1(repositoryRoot));
|
|
102
102
|
if (workspacePatterns.length === 0) return /* @__PURE__ */ new Map();
|
|
103
103
|
const workspacePackageDirs = /* @__PURE__ */ new Set();
|
|
104
104
|
workspacePatterns.forEach((pattern) => {
|
|
105
|
-
expandWorkspacePattern(repositoryRoot, pattern).forEach((packageDir) => {
|
|
105
|
+
expandWorkspacePattern$1(repositoryRoot, pattern).forEach((packageDir) => {
|
|
106
106
|
workspacePackageDirs.add(packageDir);
|
|
107
107
|
});
|
|
108
108
|
});
|
|
109
109
|
const workspacePackages = /* @__PURE__ */ new Map();
|
|
110
110
|
Array.from(workspacePackageDirs).sort((left, right) => left.localeCompare(right)).forEach((packageDir) => {
|
|
111
|
-
const workspaceName = resolvePackageName(readPackageManifest(packageDir), packageDir);
|
|
111
|
+
const workspaceName = resolvePackageName(readPackageManifest$1(packageDir), packageDir);
|
|
112
112
|
if (workspacePackages.has(workspaceName)) throw new Error(`Duplicate workspace package name: ${workspaceName}`);
|
|
113
113
|
workspacePackages.set(workspaceName, {
|
|
114
114
|
name: workspaceName,
|
|
@@ -160,13 +160,13 @@ function collectRepositoryRootDependencies(manifest, workspacePackages, _reposit
|
|
|
160
160
|
})).sort((left, right) => left.name.localeCompare(right.name));
|
|
161
161
|
return [...topLevelWorkspaceDependencies, ...externalDependencies];
|
|
162
162
|
}
|
|
163
|
-
function readPackageManifest(packageDir) {
|
|
163
|
+
function readPackageManifest$1(packageDir) {
|
|
164
164
|
const packageJsonPath = path.join(packageDir, "package.json");
|
|
165
165
|
if (!fs.existsSync(packageJsonPath)) throw new Error(`Missing package.json in ${packageDir}`);
|
|
166
166
|
const manifestText = fs.readFileSync(packageJsonPath, "utf8");
|
|
167
167
|
try {
|
|
168
168
|
const parsed = JSON.parse(manifestText);
|
|
169
|
-
if (!isRecord(parsed)) throw new Error("package.json must contain an object");
|
|
169
|
+
if (!isRecord$1(parsed)) throw new Error("package.json must contain an object");
|
|
170
170
|
return parsed;
|
|
171
171
|
} catch (error) {
|
|
172
172
|
const message = error instanceof Error ? error.message : "Unknown JSON parse error";
|
|
@@ -177,17 +177,17 @@ function resolvePackageName(manifest, packageDir) {
|
|
|
177
177
|
if (typeof manifest.name === "string" && manifest.name.trim().length > 0) return manifest.name;
|
|
178
178
|
throw new Error(`Package at ${packageDir} is missing a valid name`);
|
|
179
179
|
}
|
|
180
|
-
function getWorkspacePatterns(manifest) {
|
|
180
|
+
function getWorkspacePatterns$1(manifest) {
|
|
181
181
|
if (Array.isArray(manifest.workspaces)) return manifest.workspaces.filter((pattern) => typeof pattern === "string" && pattern.length > 0);
|
|
182
|
-
if (isRecord(manifest.workspaces) && Array.isArray(manifest.workspaces.packages)) return manifest.workspaces.packages.filter((pattern) => typeof pattern === "string" && pattern.length > 0);
|
|
182
|
+
if (isRecord$1(manifest.workspaces) && Array.isArray(manifest.workspaces.packages)) return manifest.workspaces.packages.filter((pattern) => typeof pattern === "string" && pattern.length > 0);
|
|
183
183
|
return [];
|
|
184
184
|
}
|
|
185
|
-
function resolveWorkspacePatterns(repositoryRoot, manifest) {
|
|
186
|
-
const manifestPatterns = getWorkspacePatterns(manifest);
|
|
185
|
+
function resolveWorkspacePatterns$1(repositoryRoot, manifest) {
|
|
186
|
+
const manifestPatterns = getWorkspacePatterns$1(manifest);
|
|
187
187
|
if (manifestPatterns.length > 0) return manifestPatterns;
|
|
188
|
-
return readPnpmWorkspacePatterns(repositoryRoot);
|
|
188
|
+
return readPnpmWorkspacePatterns$1(repositoryRoot);
|
|
189
189
|
}
|
|
190
|
-
function readPnpmWorkspacePatterns(repositoryRoot) {
|
|
190
|
+
function readPnpmWorkspacePatterns$1(repositoryRoot) {
|
|
191
191
|
const pnpmWorkspacePath = path.join(repositoryRoot, PNPM_WORKSPACE_FILE$1);
|
|
192
192
|
if (!fs.existsSync(pnpmWorkspacePath)) return [];
|
|
193
193
|
const lines = fs.readFileSync(pnpmWorkspacePath, "utf8").split(/\r?\n/);
|
|
@@ -202,49 +202,49 @@ function readPnpmWorkspacePatterns(repositoryRoot) {
|
|
|
202
202
|
}
|
|
203
203
|
if (!line.startsWith(" ") && !line.startsWith(" ")) break;
|
|
204
204
|
if (!trimmedLine.startsWith("- ")) continue;
|
|
205
|
-
const pattern = unquoteWorkspacePattern(trimmedLine.slice(2).trim());
|
|
205
|
+
const pattern = unquoteWorkspacePattern$1(trimmedLine.slice(2).trim());
|
|
206
206
|
if (pattern.length > 0) patterns.push(pattern);
|
|
207
207
|
}
|
|
208
208
|
return patterns;
|
|
209
209
|
}
|
|
210
|
-
function unquoteWorkspacePattern(pattern) {
|
|
210
|
+
function unquoteWorkspacePattern$1(pattern) {
|
|
211
211
|
if (pattern.startsWith("\"") && pattern.endsWith("\"") || pattern.startsWith("'") && pattern.endsWith("'")) return pattern.slice(1, -1);
|
|
212
212
|
return pattern;
|
|
213
213
|
}
|
|
214
214
|
function isWorkspaceMatch(repositoryRoot, patterns, packageDir) {
|
|
215
|
-
return patterns.some((pattern) => expandWorkspacePattern(repositoryRoot, pattern).includes(packageDir));
|
|
215
|
+
return patterns.some((pattern) => expandWorkspacePattern$1(repositoryRoot, pattern).includes(packageDir));
|
|
216
216
|
}
|
|
217
|
-
function expandWorkspacePattern(repositoryRoot, pattern) {
|
|
218
|
-
return matchWorkspaceSegments(repositoryRoot, normalizeWorkspacePattern(pattern), 0).filter((packageDir) => fs.existsSync(path.join(packageDir, "package.json")));
|
|
217
|
+
function expandWorkspacePattern$1(repositoryRoot, pattern) {
|
|
218
|
+
return matchWorkspaceSegments$1(repositoryRoot, normalizeWorkspacePattern(pattern), 0).filter((packageDir) => fs.existsSync(path.join(packageDir, "package.json")));
|
|
219
219
|
}
|
|
220
220
|
function normalizeWorkspacePattern(pattern) {
|
|
221
221
|
return pattern.split(/[\\/]+/).filter((segment) => segment.length > 0 && segment !== ".");
|
|
222
222
|
}
|
|
223
|
-
function matchWorkspaceSegments(currentDirectory, segments, index) {
|
|
223
|
+
function matchWorkspaceSegments$1(currentDirectory, segments, index) {
|
|
224
224
|
if (index >= segments.length) return [currentDirectory];
|
|
225
225
|
const segment = segments[index];
|
|
226
226
|
if (segment === void 0) return [currentDirectory];
|
|
227
227
|
if (segment === "**") {
|
|
228
|
-
const results = new Set(matchWorkspaceSegments(currentDirectory, segments, index + 1));
|
|
229
|
-
listSubdirectories(currentDirectory).forEach((subdirectory) => {
|
|
230
|
-
matchWorkspaceSegments(subdirectory, segments, index).forEach((match) => {
|
|
228
|
+
const results = new Set(matchWorkspaceSegments$1(currentDirectory, segments, index + 1));
|
|
229
|
+
listSubdirectories$1(currentDirectory).forEach((subdirectory) => {
|
|
230
|
+
matchWorkspaceSegments$1(subdirectory, segments, index).forEach((match) => {
|
|
231
231
|
results.add(match);
|
|
232
232
|
});
|
|
233
233
|
});
|
|
234
234
|
return [...results];
|
|
235
235
|
}
|
|
236
|
-
const matcher = createWorkspaceSegmentMatcher(segment);
|
|
236
|
+
const matcher = createWorkspaceSegmentMatcher$1(segment);
|
|
237
237
|
const results = [];
|
|
238
|
-
listSubdirectories(currentDirectory).forEach((subdirectory) => {
|
|
238
|
+
listSubdirectories$1(currentDirectory).forEach((subdirectory) => {
|
|
239
239
|
if (!matcher(path.basename(subdirectory))) return;
|
|
240
|
-
results.push(...matchWorkspaceSegments(subdirectory, segments, index + 1));
|
|
240
|
+
results.push(...matchWorkspaceSegments$1(subdirectory, segments, index + 1));
|
|
241
241
|
});
|
|
242
242
|
return results;
|
|
243
243
|
}
|
|
244
|
-
function listSubdirectories(directory) {
|
|
244
|
+
function listSubdirectories$1(directory) {
|
|
245
245
|
return fs.readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name !== "node_modules" && entry.name !== ".git").map((entry) => path.join(directory, entry.name));
|
|
246
246
|
}
|
|
247
|
-
function createWorkspaceSegmentMatcher(segment) {
|
|
247
|
+
function createWorkspaceSegmentMatcher$1(segment) {
|
|
248
248
|
if (!segment.includes("*")) return (name) => name === segment;
|
|
249
249
|
const escapedSegment = escapeRegExp(segment).replaceAll("*", "[^/]*");
|
|
250
250
|
const pattern = new RegExp(`^${escapedSegment}$`);
|
|
@@ -253,7 +253,7 @@ function createWorkspaceSegmentMatcher(segment) {
|
|
|
253
253
|
function escapeRegExp(value) {
|
|
254
254
|
return value.replaceAll(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
255
255
|
}
|
|
256
|
-
function isRecord(value) {
|
|
256
|
+
function isRecord$1(value) {
|
|
257
257
|
return typeof value === "object" && value !== null;
|
|
258
258
|
}
|
|
259
259
|
//#endregion
|
|
@@ -759,13 +759,58 @@ function getCommandErrorMessage(error) {
|
|
|
759
759
|
return error.message;
|
|
760
760
|
}
|
|
761
761
|
//#endregion
|
|
762
|
+
//#region src/typescript/program.ts
|
|
763
|
+
function createProgram(entryFile, compilerOptions, currentDirectory) {
|
|
764
|
+
const host = ts.createCompilerHost(compilerOptions, true);
|
|
765
|
+
host.getCurrentDirectory = () => currentDirectory;
|
|
766
|
+
if (ts.sys.realpath !== void 0) host.realpath = ts.sys.realpath;
|
|
767
|
+
return ts.createProgram({
|
|
768
|
+
rootNames: [entryFile],
|
|
769
|
+
options: compilerOptions,
|
|
770
|
+
host
|
|
771
|
+
});
|
|
772
|
+
}
|
|
773
|
+
function createSourceFile(filePath) {
|
|
774
|
+
const sourceText = fs.readFileSync(filePath, "utf8");
|
|
775
|
+
return ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, getScriptKind(filePath));
|
|
776
|
+
}
|
|
777
|
+
function createModuleResolutionHost(currentDirectory) {
|
|
778
|
+
return {
|
|
779
|
+
fileExists: ts.sys.fileExists,
|
|
780
|
+
readFile: ts.sys.readFile,
|
|
781
|
+
directoryExists: ts.sys.directoryExists,
|
|
782
|
+
getCurrentDirectory: () => currentDirectory,
|
|
783
|
+
getDirectories: ts.sys.getDirectories,
|
|
784
|
+
...ts.sys.realpath === void 0 ? {} : { realpath: ts.sys.realpath }
|
|
785
|
+
};
|
|
786
|
+
}
|
|
787
|
+
function getScriptKind(filePath) {
|
|
788
|
+
switch (path.extname(filePath).toLowerCase()) {
|
|
789
|
+
case ".js":
|
|
790
|
+
case ".mjs":
|
|
791
|
+
case ".cjs": return ts.ScriptKind.JS;
|
|
792
|
+
case ".jsx": return ts.ScriptKind.JSX;
|
|
793
|
+
case ".tsx": return ts.ScriptKind.TSX;
|
|
794
|
+
case ".json": return ts.ScriptKind.JSON;
|
|
795
|
+
default: return ts.ScriptKind.TS;
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
//#endregion
|
|
762
799
|
//#region src/typescript/config.ts
|
|
800
|
+
const workspaceRootCache = /* @__PURE__ */ new Map();
|
|
801
|
+
const workspacePackageCache = /* @__PURE__ */ new Map();
|
|
763
802
|
function loadCompilerOptions(searchFrom, explicitConfigPath) {
|
|
764
803
|
const configPath = explicitConfigPath === void 0 ? findNearestConfig(searchFrom) : path.resolve(searchFrom, explicitConfigPath);
|
|
765
804
|
if (configPath === void 0) return { compilerOptions: defaultCompilerOptions() };
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
805
|
+
let fatalDiagnostic;
|
|
806
|
+
const parsed = ts.getParsedCommandLineOfConfigFile(configPath, defaultCompilerOptions(), createParseConfigHost(configPath, (diagnostic) => {
|
|
807
|
+
fatalDiagnostic = diagnostic;
|
|
808
|
+
}));
|
|
809
|
+
if (parsed === void 0) {
|
|
810
|
+
const diagnostic = fatalDiagnostic;
|
|
811
|
+
if (diagnostic === void 0) throw new Error(`Failed to parse TypeScript config at ${configPath}.`);
|
|
812
|
+
throw new Error(`Failed to read TypeScript config at ${configPath}: ${formatDiagnostic(diagnostic)}`);
|
|
813
|
+
}
|
|
769
814
|
if (parsed.errors.length > 0) {
|
|
770
815
|
const [firstError] = parsed.errors;
|
|
771
816
|
if (firstError === void 0) throw new Error(`Failed to parse TypeScript config at ${configPath}.`);
|
|
@@ -790,6 +835,97 @@ function findNearestConfig(searchFrom) {
|
|
|
790
835
|
currentDirectory = parentDirectory;
|
|
791
836
|
}
|
|
792
837
|
}
|
|
838
|
+
function createParseConfigHost(configPath, onUnRecoverableConfigFileDiagnostic) {
|
|
839
|
+
const rewrittenConfigs = /* @__PURE__ */ new Map();
|
|
840
|
+
return {
|
|
841
|
+
useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames,
|
|
842
|
+
fileExists: ts.sys.fileExists,
|
|
843
|
+
readDirectory: ts.sys.readDirectory,
|
|
844
|
+
directoryExists: ts.sys.directoryExists,
|
|
845
|
+
getCurrentDirectory: () => path.dirname(configPath),
|
|
846
|
+
getDirectories: ts.sys.getDirectories,
|
|
847
|
+
onUnRecoverableConfigFileDiagnostic,
|
|
848
|
+
readFile(filePath) {
|
|
849
|
+
const normalizedPath = path.resolve(filePath);
|
|
850
|
+
const cachedText = rewrittenConfigs.get(normalizedPath);
|
|
851
|
+
if (cachedText !== void 0) return cachedText;
|
|
852
|
+
const fileText = ts.sys.readFile(normalizedPath);
|
|
853
|
+
if (fileText === void 0) return;
|
|
854
|
+
const rewrittenText = rewriteConfigExtends(normalizedPath, fileText, rewrittenConfigs);
|
|
855
|
+
rewrittenConfigs.set(normalizedPath, rewrittenText);
|
|
856
|
+
return rewrittenText;
|
|
857
|
+
},
|
|
858
|
+
...ts.sys.realpath === void 0 ? {} : { realpath: ts.sys.realpath }
|
|
859
|
+
};
|
|
860
|
+
}
|
|
861
|
+
function rewriteConfigExtends(configPath, fileText, rewrittenConfigs) {
|
|
862
|
+
const parsed = ts.parseConfigFileTextToJson(configPath, fileText);
|
|
863
|
+
if (parsed.error !== void 0 || !isRecord(parsed.config)) return fileText;
|
|
864
|
+
const rewrittenConfig = rewriteExtendsField(configPath, parsed.config);
|
|
865
|
+
if (rewrittenConfig === parsed.config) return fileText;
|
|
866
|
+
const rewrittenText = `${JSON.stringify(rewrittenConfig, null, 2)}\n`;
|
|
867
|
+
rewrittenConfigs.set(configPath, rewrittenText);
|
|
868
|
+
return rewrittenText;
|
|
869
|
+
}
|
|
870
|
+
function rewriteExtendsField(configPath, config) {
|
|
871
|
+
const extendsField = config.extends;
|
|
872
|
+
if (typeof extendsField === "string") {
|
|
873
|
+
const resolved = resolveExtendsSpecifier(configPath, extendsField);
|
|
874
|
+
if (resolved === extendsField) return config;
|
|
875
|
+
return {
|
|
876
|
+
...config,
|
|
877
|
+
extends: resolved
|
|
878
|
+
};
|
|
879
|
+
}
|
|
880
|
+
if (!Array.isArray(extendsField)) return config;
|
|
881
|
+
let changed = false;
|
|
882
|
+
const rewrittenExtends = extendsField.map((value) => {
|
|
883
|
+
if (typeof value !== "string") return value;
|
|
884
|
+
const resolved = resolveExtendsSpecifier(configPath, value);
|
|
885
|
+
if (resolved !== value) changed = true;
|
|
886
|
+
return resolved;
|
|
887
|
+
});
|
|
888
|
+
if (!changed) return config;
|
|
889
|
+
return {
|
|
890
|
+
...config,
|
|
891
|
+
extends: rewrittenExtends
|
|
892
|
+
};
|
|
893
|
+
}
|
|
894
|
+
function resolveExtendsSpecifier(configPath, specifier) {
|
|
895
|
+
if (isPathLikeSpecifier(specifier)) return specifier;
|
|
896
|
+
const resolvedWithNodeModules = resolveConfigModuleSpecifier(configPath, specifier);
|
|
897
|
+
if (resolvedWithNodeModules !== void 0) return resolvedWithNodeModules;
|
|
898
|
+
return resolveWorkspaceConfigSpecifier(path.dirname(configPath), specifier) ?? specifier;
|
|
899
|
+
}
|
|
900
|
+
function resolveConfigModuleSpecifier(configPath, specifier) {
|
|
901
|
+
return ts.resolveModuleName(specifier, configPath, defaultCompilerOptions(), createModuleResolutionHost(path.dirname(configPath))).resolvedModule?.resolvedFileName;
|
|
902
|
+
}
|
|
903
|
+
function resolveWorkspaceConfigSpecifier(directory, specifier) {
|
|
904
|
+
const workspaceRoot = findWorkspaceRoot(directory);
|
|
905
|
+
if (workspaceRoot === void 0) return;
|
|
906
|
+
const { packageName, subpath } = parsePackageSpecifier(specifier);
|
|
907
|
+
if (packageName === void 0) return;
|
|
908
|
+
const packageDir = discoverWorkspacePackages(workspaceRoot).get(packageName);
|
|
909
|
+
if (packageDir === void 0) return;
|
|
910
|
+
if (subpath === void 0 || subpath.length === 0) return resolveWorkspacePackageEntry(packageDir);
|
|
911
|
+
return resolveExistingPath$1(path.join(packageDir, subpath));
|
|
912
|
+
}
|
|
913
|
+
function resolveWorkspacePackageEntry(packageDir) {
|
|
914
|
+
const manifest = readPackageManifest(packageDir);
|
|
915
|
+
if (typeof manifest.main === "string" && manifest.main.length > 0) {
|
|
916
|
+
const resolvedMain = resolveExistingPath$1(path.join(packageDir, manifest.main));
|
|
917
|
+
if (resolvedMain !== void 0) return resolvedMain;
|
|
918
|
+
}
|
|
919
|
+
return resolveExistingPath$1(path.join(packageDir, "tsconfig.json"));
|
|
920
|
+
}
|
|
921
|
+
function resolveExistingPath$1(candidatePath) {
|
|
922
|
+
const normalizedPath = path.resolve(candidatePath);
|
|
923
|
+
if (fs.existsSync(normalizedPath)) return normalizedPath;
|
|
924
|
+
if (path.extname(normalizedPath).length === 0) {
|
|
925
|
+
const jsonPath = `${normalizedPath}.json`;
|
|
926
|
+
if (fs.existsSync(jsonPath)) return jsonPath;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
793
929
|
function defaultCompilerOptions() {
|
|
794
930
|
return {
|
|
795
931
|
allowJs: true,
|
|
@@ -804,6 +940,145 @@ function defaultCompilerOptions() {
|
|
|
804
940
|
function formatDiagnostic(diagnostic) {
|
|
805
941
|
return ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
|
|
806
942
|
}
|
|
943
|
+
function findWorkspaceRoot(startDirectory) {
|
|
944
|
+
const cachedWorkspaceRoot = workspaceRootCache.get(startDirectory);
|
|
945
|
+
if (cachedWorkspaceRoot !== void 0 || workspaceRootCache.has(startDirectory)) return cachedWorkspaceRoot;
|
|
946
|
+
let currentDirectory = path.resolve(startDirectory);
|
|
947
|
+
const traversedDirectories = [];
|
|
948
|
+
while (true) {
|
|
949
|
+
traversedDirectories.push(currentDirectory);
|
|
950
|
+
if (hasWorkspaceConfig(currentDirectory)) {
|
|
951
|
+
traversedDirectories.forEach((directory) => {
|
|
952
|
+
workspaceRootCache.set(directory, currentDirectory);
|
|
953
|
+
});
|
|
954
|
+
return currentDirectory;
|
|
955
|
+
}
|
|
956
|
+
const parentDirectory = path.dirname(currentDirectory);
|
|
957
|
+
if (parentDirectory === currentDirectory) {
|
|
958
|
+
traversedDirectories.forEach((directory) => {
|
|
959
|
+
workspaceRootCache.set(directory, void 0);
|
|
960
|
+
});
|
|
961
|
+
return;
|
|
962
|
+
}
|
|
963
|
+
currentDirectory = parentDirectory;
|
|
964
|
+
}
|
|
965
|
+
}
|
|
966
|
+
function hasWorkspaceConfig(directory) {
|
|
967
|
+
if (fs.existsSync(path.join(directory, "pnpm-workspace.yaml"))) return true;
|
|
968
|
+
const packageJsonPath = path.join(directory, "package.json");
|
|
969
|
+
if (!fs.existsSync(packageJsonPath)) return false;
|
|
970
|
+
return getWorkspacePatterns(readPackageManifest(directory)).length > 0;
|
|
971
|
+
}
|
|
972
|
+
function discoverWorkspacePackages(workspaceRoot) {
|
|
973
|
+
const cachedPackages = workspacePackageCache.get(workspaceRoot);
|
|
974
|
+
if (cachedPackages !== void 0) return cachedPackages;
|
|
975
|
+
const workspacePatterns = resolveWorkspacePatterns(workspaceRoot, readPackageManifest(workspaceRoot));
|
|
976
|
+
const workspacePackages = /* @__PURE__ */ new Map();
|
|
977
|
+
workspacePatterns.forEach((pattern) => {
|
|
978
|
+
expandWorkspacePattern(workspaceRoot, pattern).forEach((packageDir) => {
|
|
979
|
+
const manifest = readPackageManifest(packageDir);
|
|
980
|
+
if (typeof manifest.name !== "string" || manifest.name.length === 0) return;
|
|
981
|
+
workspacePackages.set(manifest.name, packageDir);
|
|
982
|
+
});
|
|
983
|
+
});
|
|
984
|
+
workspacePackageCache.set(workspaceRoot, workspacePackages);
|
|
985
|
+
return workspacePackages;
|
|
986
|
+
}
|
|
987
|
+
function readPackageManifest(packageDir) {
|
|
988
|
+
const manifestPath = path.join(packageDir, "package.json");
|
|
989
|
+
const manifestText = fs.readFileSync(manifestPath, "utf8");
|
|
990
|
+
return JSON.parse(manifestText);
|
|
991
|
+
}
|
|
992
|
+
function getWorkspacePatterns(manifest) {
|
|
993
|
+
if (Array.isArray(manifest.workspaces)) return manifest.workspaces.filter((pattern) => typeof pattern === "string" && pattern.length > 0);
|
|
994
|
+
if (isRecord(manifest.workspaces) && Array.isArray(manifest.workspaces.packages)) return manifest.workspaces.packages.filter((pattern) => typeof pattern === "string" && pattern.length > 0);
|
|
995
|
+
return [];
|
|
996
|
+
}
|
|
997
|
+
function resolveWorkspacePatterns(workspaceRoot, manifest) {
|
|
998
|
+
const manifestPatterns = getWorkspacePatterns(manifest);
|
|
999
|
+
if (manifestPatterns.length > 0) return manifestPatterns;
|
|
1000
|
+
return readPnpmWorkspacePatterns(workspaceRoot);
|
|
1001
|
+
}
|
|
1002
|
+
function readPnpmWorkspacePatterns(workspaceRoot) {
|
|
1003
|
+
const workspacePath = path.join(workspaceRoot, "pnpm-workspace.yaml");
|
|
1004
|
+
if (!fs.existsSync(workspacePath)) return [];
|
|
1005
|
+
const lines = fs.readFileSync(workspacePath, "utf8").split(/\r?\n/);
|
|
1006
|
+
const patterns = [];
|
|
1007
|
+
let inPackagesBlock = false;
|
|
1008
|
+
for (const line of lines) {
|
|
1009
|
+
const trimmedLine = line.trim();
|
|
1010
|
+
if (trimmedLine.length === 0 || trimmedLine.startsWith("#")) continue;
|
|
1011
|
+
if (!inPackagesBlock) {
|
|
1012
|
+
if (trimmedLine === "packages:") inPackagesBlock = true;
|
|
1013
|
+
continue;
|
|
1014
|
+
}
|
|
1015
|
+
if (!line.startsWith(" ") && !line.startsWith(" ")) break;
|
|
1016
|
+
if (!trimmedLine.startsWith("- ")) continue;
|
|
1017
|
+
const pattern = unquoteWorkspacePattern(trimmedLine.slice(2).trim());
|
|
1018
|
+
if (pattern.length > 0) patterns.push(pattern);
|
|
1019
|
+
}
|
|
1020
|
+
return patterns;
|
|
1021
|
+
}
|
|
1022
|
+
function unquoteWorkspacePattern(pattern) {
|
|
1023
|
+
if (pattern.startsWith("\"") && pattern.endsWith("\"") || pattern.startsWith("'") && pattern.endsWith("'")) return pattern.slice(1, -1);
|
|
1024
|
+
return pattern;
|
|
1025
|
+
}
|
|
1026
|
+
function expandWorkspacePattern(workspaceRoot, pattern) {
|
|
1027
|
+
return matchWorkspaceSegments(workspaceRoot, pattern.split(/[\\/]+/).filter((segment) => segment.length > 0 && segment !== "."), 0).filter((packageDir) => fs.existsSync(path.join(packageDir, "package.json")));
|
|
1028
|
+
}
|
|
1029
|
+
function matchWorkspaceSegments(currentDirectory, segments, index) {
|
|
1030
|
+
if (index >= segments.length) return [currentDirectory];
|
|
1031
|
+
const segment = segments[index];
|
|
1032
|
+
if (segment === void 0) return [currentDirectory];
|
|
1033
|
+
if (segment === "**") {
|
|
1034
|
+
const results = new Set(matchWorkspaceSegments(currentDirectory, segments, index + 1));
|
|
1035
|
+
listSubdirectories(currentDirectory).forEach((subdirectory) => {
|
|
1036
|
+
matchWorkspaceSegments(subdirectory, segments, index).forEach((match) => {
|
|
1037
|
+
results.add(match);
|
|
1038
|
+
});
|
|
1039
|
+
});
|
|
1040
|
+
return [...results];
|
|
1041
|
+
}
|
|
1042
|
+
const matcher = createWorkspaceSegmentMatcher(segment);
|
|
1043
|
+
const results = [];
|
|
1044
|
+
listSubdirectories(currentDirectory).forEach((subdirectory) => {
|
|
1045
|
+
if (!matcher(path.basename(subdirectory))) return;
|
|
1046
|
+
results.push(...matchWorkspaceSegments(subdirectory, segments, index + 1));
|
|
1047
|
+
});
|
|
1048
|
+
return results;
|
|
1049
|
+
}
|
|
1050
|
+
function listSubdirectories(directory) {
|
|
1051
|
+
return fs.readdirSync(directory, { withFileTypes: true }).filter((entry) => entry.isDirectory() && entry.name !== "node_modules" && entry.name !== ".git").map((entry) => path.join(directory, entry.name));
|
|
1052
|
+
}
|
|
1053
|
+
function createWorkspaceSegmentMatcher(segment) {
|
|
1054
|
+
if (!segment.includes("*")) return (name) => name === segment;
|
|
1055
|
+
const escapedSegment = segment.replaceAll(/[|\\{}()[\]^$+?.]/g, "\\$&");
|
|
1056
|
+
const pattern = new RegExp(`^${escapedSegment.replaceAll("*", "[^/]*")}$`);
|
|
1057
|
+
return (name) => pattern.test(name);
|
|
1058
|
+
}
|
|
1059
|
+
function parsePackageSpecifier(specifier) {
|
|
1060
|
+
const segments = specifier.split("/");
|
|
1061
|
+
if (segments.length === 0) return { packageName: void 0 };
|
|
1062
|
+
if (specifier.startsWith("@")) {
|
|
1063
|
+
const scope = segments[0];
|
|
1064
|
+
const name = segments[1];
|
|
1065
|
+
if (scope === void 0 || name === void 0) return { packageName: void 0 };
|
|
1066
|
+
return {
|
|
1067
|
+
packageName: `${scope}/${name}`,
|
|
1068
|
+
subpath: segments.slice(2).join("/")
|
|
1069
|
+
};
|
|
1070
|
+
}
|
|
1071
|
+
return {
|
|
1072
|
+
packageName: segments[0],
|
|
1073
|
+
subpath: segments.slice(1).join("/")
|
|
1074
|
+
};
|
|
1075
|
+
}
|
|
1076
|
+
function isPathLikeSpecifier(specifier) {
|
|
1077
|
+
return path.isAbsolute(specifier) || specifier.startsWith("./") || specifier.startsWith("../");
|
|
1078
|
+
}
|
|
1079
|
+
function isRecord(value) {
|
|
1080
|
+
return typeof value === "object" && value !== null;
|
|
1081
|
+
}
|
|
807
1082
|
function isInsideNodeModules$1(filePath) {
|
|
808
1083
|
return filePath.includes(`${path.sep}node_modules${path.sep}`);
|
|
809
1084
|
}
|
|
@@ -836,33 +1111,6 @@ function resolveExistingPath(cwd, entryFile) {
|
|
|
836
1111
|
return normalizedPath;
|
|
837
1112
|
}
|
|
838
1113
|
//#endregion
|
|
839
|
-
//#region src/typescript/program.ts
|
|
840
|
-
function createProgram(entryFile, compilerOptions, currentDirectory) {
|
|
841
|
-
const host = ts.createCompilerHost(compilerOptions, true);
|
|
842
|
-
host.getCurrentDirectory = () => currentDirectory;
|
|
843
|
-
if (ts.sys.realpath !== void 0) host.realpath = ts.sys.realpath;
|
|
844
|
-
return ts.createProgram({
|
|
845
|
-
rootNames: [entryFile],
|
|
846
|
-
options: compilerOptions,
|
|
847
|
-
host
|
|
848
|
-
});
|
|
849
|
-
}
|
|
850
|
-
function createSourceFile(filePath) {
|
|
851
|
-
const sourceText = fs.readFileSync(filePath, "utf8");
|
|
852
|
-
return ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, getScriptKind(filePath));
|
|
853
|
-
}
|
|
854
|
-
function getScriptKind(filePath) {
|
|
855
|
-
switch (path.extname(filePath).toLowerCase()) {
|
|
856
|
-
case ".js":
|
|
857
|
-
case ".mjs":
|
|
858
|
-
case ".cjs": return ts.ScriptKind.JS;
|
|
859
|
-
case ".jsx": return ts.ScriptKind.JSX;
|
|
860
|
-
case ".tsx": return ts.ScriptKind.TSX;
|
|
861
|
-
case ".json": return ts.ScriptKind.JSON;
|
|
862
|
-
default: return ts.ScriptKind.TS;
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
//#endregion
|
|
866
1114
|
//#region src/analyzers/import/unused.ts
|
|
867
1115
|
function collectUnusedImports(sourceFile, checker) {
|
|
868
1116
|
const importUsage = /* @__PURE__ */ new Map();
|
|
@@ -935,7 +1183,7 @@ function tryGetSymbolAtLocation(checker, node) {
|
|
|
935
1183
|
//#region src/analyzers/import/references.ts
|
|
936
1184
|
function collectModuleReferences(sourceFile, checker) {
|
|
937
1185
|
const references = /* @__PURE__ */ new Map();
|
|
938
|
-
const unusedImports = collectUnusedImports(sourceFile, checker);
|
|
1186
|
+
const unusedImports = checker === void 0 ? /* @__PURE__ */ new Map() : collectUnusedImports(sourceFile, checker);
|
|
939
1187
|
function addReference(specifier, referenceKind, isTypeOnly, unused) {
|
|
940
1188
|
const key = `${referenceKind}:${isTypeOnly ? "type" : "value"}:${specifier}`;
|
|
941
1189
|
const existing = references.get(key);
|
|
@@ -1098,7 +1346,7 @@ var DependencyGraphBuilder = class {
|
|
|
1098
1346
|
if (this.nodes.has(normalizedPath)) return;
|
|
1099
1347
|
const config = this.getConfigForFile(normalizedPath);
|
|
1100
1348
|
const program = this.getProgramForFile(normalizedPath, config);
|
|
1101
|
-
const checker = this.getCheckerForFile(normalizedPath, config);
|
|
1349
|
+
const checker = this.options.trackUnusedImports ? this.getCheckerForFile(normalizedPath, config) : void 0;
|
|
1102
1350
|
const dependencies = collectModuleReferences(program.getSourceFile(normalizedPath) ?? createSourceFile(normalizedPath), checker).map((reference) => this.resolveDependencyWithCache(reference, normalizedPath, config, entryConfigPath));
|
|
1103
1351
|
this.nodes.set(normalizedPath, {
|
|
1104
1352
|
id: normalizedPath,
|
|
@@ -1268,7 +1516,8 @@ var MultiEntryImportAnalyzer = class extends BaseAnalyzer {
|
|
|
1268
1516
|
const nodes = buildDependencyGraph(entryConfigs, {
|
|
1269
1517
|
cwd: this.cwd,
|
|
1270
1518
|
expandWorkspaces: this.options.expandWorkspaces ?? true,
|
|
1271
|
-
projectOnly: this.options.projectOnly ?? false
|
|
1519
|
+
projectOnly: this.options.projectOnly ?? false,
|
|
1520
|
+
trackUnusedImports: this.options.trackUnusedImports ?? true
|
|
1272
1521
|
});
|
|
1273
1522
|
const uniqueConfigPaths = [...new Set(entryConfigs.map((entry) => entry.configPath))];
|
|
1274
1523
|
const configPath = uniqueConfigPaths.length === 1 ? uniqueConfigPaths[0] : void 0;
|
|
@@ -1960,7 +2209,10 @@ var ReactAnalyzer = class extends BaseAnalyzer {
|
|
|
1960
2209
|
this.entryFiles = entryFiles;
|
|
1961
2210
|
}
|
|
1962
2211
|
doAnalyze() {
|
|
1963
|
-
const dependencyGraph = analyzeDependenciesForEntries(this.entryFiles,
|
|
2212
|
+
const dependencyGraph = analyzeDependenciesForEntries(this.entryFiles, {
|
|
2213
|
+
...this.options,
|
|
2214
|
+
trackUnusedImports: false
|
|
2215
|
+
});
|
|
1964
2216
|
const fileAnalyses = this.collectFileAnalyses(dependencyGraph);
|
|
1965
2217
|
const nodes = this.createNodes(fileAnalyses);
|
|
1966
2218
|
this.attachUsages(fileAnalyses, nodes);
|
|
@@ -2606,4 +2858,4 @@ function formatReactNodeFilePath(filePath, kind, cwd) {
|
|
|
2606
2858
|
//#endregion
|
|
2607
2859
|
export { printReactUsageTree as a, printPackageDependencyTree as c, getReactUsageRoots as d, analyzeReactUsage as f, analyzePackageDependencies as g, analyzePackageDependencyDiff as h, graphToSerializablePackageTree as i, getFilteredUsages as l, isSourceCodeFile as m, graphToSerializableTree as n, printDependencyTree as o, analyzeDependencies as p, diffGraphToSerializablePackageTree as r, printPackageDependencyDiffTree as s, graphToSerializableReactTree as t, getReactUsageEntries as u };
|
|
2608
2860
|
|
|
2609
|
-
//# sourceMappingURL=react-
|
|
2861
|
+
//# sourceMappingURL=react-CLWQWjrh.mjs.map
|