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-Bk6iOz9n.mjs";
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
@@ -85,6 +85,7 @@ interface AnalyzeOptions {
85
85
  readonly expandWorkspaces?: boolean;
86
86
  readonly projectOnly?: boolean;
87
87
  readonly includeBuiltins?: boolean;
88
+ readonly trackUnusedImports?: boolean;
88
89
  }
89
90
  //#endregion
90
91
  //#region src/types/dependency-kind.d.ts
@@ -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":"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"}
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-Bk6iOz9n.mjs";
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
- const readResult = ts.readConfigFile(configPath, ts.sys.readFile);
767
- if (readResult.error !== void 0) throw new Error(`Failed to read TypeScript config at ${configPath}: ${formatDiagnostic(readResult.error)}`);
768
- const parsed = ts.parseJsonConfigFileContent(readResult.config, ts.sys, path.dirname(configPath), defaultCompilerOptions(), configPath);
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, this.options);
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-Bk6iOz9n.mjs.map
2861
+ //# sourceMappingURL=react-CLWQWjrh.mjs.map