Skip to content

fix: honor tsconfig source boundaries or make whole-repository discovery explicit #58

Description

@rahlk

Problem

The analyzer loads one config's compiler options but ignores its files / include / exclude source program. discoverSourceFiles() recursively adds every TypeScript-family file outside a small hard-coded skip list. This makes the output neither a compiler-program graph nor a clearly labeled whole-repository graph.

It also makes --skip-tests heuristic: test files whose path does not match *.spec.*, *.test.*, or one of a few directory names are still included.

Related to #56, but independently observable even in a single-config project.

Reproduction

In OWASP Juice Shop 6244c59:

  • root tsconfig.json explicitly excludes data/static/codefixes/**;
  • analysis.json nevertheless contains all 92 alternate challenge snippet files from that directory and 44 call edges sourced from them;
  • those files are intentionally non-runtime answer/distractor variants and can duplicate or contradict the deployed implementation.

The same --skip-tests run also includes:

  • cypress.config.ts (13 call edges);
  • frontend/src/test-setup.ts;
  • frontend/src/mocks/ng-gallery.ts;
  • four rsn/ development-tool files (43 call edges);
  • frontend build tooling.

For comparison, tsc --listFilesOnly over frontend/src/tsconfig.app.json reports 169 first-party application files; all are present, but the analyzer adds five frontend files outside that production program.

Root cause

  • src/syntactic_analysis/discovery.ts walks the filesystem by extension and hard-coded directory names.
  • src/syntactic_analysis/symbolTable.ts creates the project with skipAddingFilesFromTsConfig: true, then manually adds every discovered file.
  • Compiler-program inclusion/exclusion is therefore never used as the source-of-truth.

Expected behavior

The output should have an explicit, predictable scope. The default should either follow configured compiler projects, or whole-repository analysis should be an explicit mode with scope metadata so consumers can distinguish runtime, test, tooling, and snippet nodes.

Acceptance criteria

Choose and document one of these contracts:

  1. Default to the union of source files in discovered compiler projects; add an explicit --whole-repo mode for recursive discovery; or
  2. Keep whole-repo discovery, but label each module with its owning project/config and scope (application, test, tooling, unowned, etc.), and make --skip-tests use project membership as well as filename heuristics.

Additionally:

  • honor explicit exclude patterns in compiler-program mode;
  • do not include spec-config-only setup/mocks when --skip-tests is active;
  • report unowned discovered files rather than silently mixing them into the runtime graph;
  • add regression coverage for an excluded snippet directory and separate app/spec configs;
  • preserve an opt-in path for repository-wide knowledge-graph use cases.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingfixBug fix

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions