A TypeScript implementation of fumieval/OrderOrder for analysing module dependencies and preventing jumbling of directories.
Try running npx ts-module-isolation in your project directory and you'll see what this is about.
ts-module-isolation analyses TypeScript/JavaScript codebases to ensure directory dependencies form a directed acyclic graph (DAG). When a module in one directory imports from another directory, it can be thought of as a dependency relationship between those directories. Aligning these dependencies helps maintain clean, logical module hierarchies by detecting circular dependencies.
npm install ts-module-isolation
git clone <repository-url>
cd ts-module-isolation
npm install
npm run build
# Analyse current directory (default)
npx ts-module-isolation
# Analyse specific directories
npx ts-module-isolation src/
# Multiple directories
npx ts-module-isolation src/ lib/
# Output to file
npx ts-module-isolation src/ -o report.txt
# Generate Dot graph to stdout
npx ts-module-isolation src/ --dot
# JSON output
npx ts-module-isolation src/ --json
# Verbose mode
npx ts-module-isolation src/ --verbose
# Exclude directories matching patterns
npx ts-module-isolation --exclude "test/**" --exclude "**/*.spec.ts"
# Multiple exclude patterns
npx ts-module-isolation src/ --exclude "node_modules/**" --exclude "dist/**"
ts-module-isolation Analysis Report
========================
Total modules analysed: 25
Total imports analysed: 45
Directories found: 5
Dependency violations found: 2
Feedback arcs detected: 1
❌ Directory dependencies contain cycles
Feedback Arc Set (edges to remove to make graph acyclic):
--------------------------------------------------------
ui/components -> core/utils
ui/components/Button:15 imports core/utils/theme (import)
ui/layouts/Header:8 imports core/config/settings (import)
Recommendations:
---------------
1. Consider restructuring modules to eliminate circular dependencies
2. Move shared code to a common base module
3. Use dependency injection to break tight coupling
4. Consider splitting large modules into smaller, focused ones
ts-module-isolation enforces the principle that if a module in directory ui/components imports from core/utils, then no module in core/utils should import from any module in ui/components. This ensures:
Directory prefixes are determined by directory structure:
ui/components/Button.ts → prefix: ui/components (directory)src/parser.ts → prefix: src (directory)globals.ts (in root) → prefix: globals (individual file)index.ts (in root) → prefix: index (individual file)Generate a DOT graph for visualisation:
npx ts-module-isolation src/ --dot > dependencies.dot
dot -Tpng dependencies.dot -o graph.png
Red edges indicate feedback arcs that should be removed to fix the module structure.
The tool can be configured through command-line options:
--output, -o: Output results to a file instead of stdout--json: Output results in JSON format--dot: Export dependency graph in the Dot format to stdout--verbose: Enable verbose logging--exclude <pattern>: Exclude directories matching the glob pattern (can be specified multiple times)0: No violations found1: Violations or feedback arcs detectedMIT
5 commits
TypeScript
85.2%
JavaScript
14.8%
A TypeScript implementation of fumieval/OrderOrder for analysing module dependencies and preventing jumbling of directories.
Try running npx ts-module-isolation in your project directory and you'll see what this is about.
ts-module-isolation analyses TypeScript/JavaScript codebases to ensure directory dependencies form a directed acyclic graph (DAG). When a module in one directory imports from another directory, it can be thought of as a dependency relationship between those directories. Aligning these dependencies helps maintain clean, logical module hierarchies by detecting circular dependencies.
npm install ts-module-isolation
git clone <repository-url>
cd ts-module-isolation
npm install
npm run build
# Analyse current directory (default)
npx ts-module-isolation
# Analyse specific directories
npx ts-module-isolation src/
# Multiple directories
npx ts-module-isolation src/ lib/
# Output to file
npx ts-module-isolation src/ -o report.txt
# Generate Dot graph to stdout
npx ts-module-isolation src/ --dot
# JSON output
npx ts-module-isolation src/ --json
# Verbose mode
npx ts-module-isolation src/ --verbose
# Exclude directories matching patterns
npx ts-module-isolation --exclude "test/**" --exclude "**/*.spec.ts"
# Multiple exclude patterns
npx ts-module-isolation src/ --exclude "node_modules/**" --exclude "dist/**"
ts-module-isolation Analysis Report
========================
Total modules analysed: 25
Total imports analysed: 45
Directories found: 5
Dependency violations found: 2
Feedback arcs detected: 1
❌ Directory dependencies contain cycles
Feedback Arc Set (edges to remove to make graph acyclic):
--------------------------------------------------------
ui/components -> core/utils
ui/components/Button:15 imports core/utils/theme (import)
ui/layouts/Header:8 imports core/config/settings (import)
Recommendations:
---------------
1. Consider restructuring modules to eliminate circular dependencies
2. Move shared code to a common base module
3. Use dependency injection to break tight coupling
4. Consider splitting large modules into smaller, focused ones
ts-module-isolation enforces the principle that if a module in directory ui/components imports from core/utils, then no module in core/utils should import from any module in ui/components. This ensures:
Directory prefixes are determined by directory structure:
ui/components/Button.ts → prefix: ui/components (directory)src/parser.ts → prefix: src (directory)globals.ts (in root) → prefix: globals (individual file)index.ts (in root) → prefix: index (individual file)Generate a DOT graph for visualisation:
npx ts-module-isolation src/ --dot > dependencies.dot
dot -Tpng dependencies.dot -o graph.png
Red edges indicate feedback arcs that should be removed to fix the module structure.
The tool can be configured through command-line options:
--output, -o: Output results to a file instead of stdout--json: Output results in JSON format--dot: Export dependency graph in the Dot format to stdout--verbose: Enable verbose logging--exclude <pattern>: Exclude directories matching the glob pattern (can be specified multiple times)0: No violations found1: Violations or feedback arcs detectedMIT
5 commits
TypeScript
85.2%
JavaScript
14.8%