# loc-counter 📊
> A powerful lines of code counter with detailed statistics, available as an NPX command.

[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)

## Why loc-counter?
I was working on a monorepo project and wanted to check lines of code metrics across different services. Even though I found some libraries that could do this, I wasn't satisfied with their features or they required too many dependencies. So I decided to create my own tiny package that:
- Runs directly with npx (no installation needed)
- Supports a wide range of programming languages
- Provides beautiful, colorful terminal output
- Shows detailed statistics and breakdowns
- Is easy to use and extend

## Features
- **Zero installation required** - Just run with `npx loc-counter`
- **Multiple language support** - JavaScript, TypeScript, JSX, TSX, Go, Python, C, C++, C#, PHP, SQL, Ruby, and more
- **Detailed statistics** - Total lines, code lines, comment lines, blank lines, and percentages
- **Language breakdown** - See which languages are used the most in your project
- **Top files analysis** - Identifies your largest files by line count
- **Beautiful output** - Colorful tables and statistics in the terminal
- **Respects .gitignore** - Automatically excludes files you don't want to track
- **Highly customizable** - Flexible options for filtering files

## Usage
Simply run it with npx:

```bash
npx @mutasim77/loc-counter
```

This will analyze the current directory and provide detailed statistics.

### Options
```
Options:
  -V, --version              output the version number
  -d, --dir <path>           directory to analyze (default: ".")
  -e, --exclude <patterns...> patterns to exclude
  -i, --include <patterns...> patterns to include
  --no-ignoregit             do not respect .gitignore rules
  -v, --verbose              show verbose output
  -h, --help                 display help for command
```

### Examples
```bash
# Analyze a specific directory
npx loc-counter --dir ./src

# Exclude certain patterns
npx loc-counter --exclude "**/*.test.js" "**/*.spec.js"

# Include only specific patterns
npx loc-counter --include "**/*.ts" "**/*.tsx"
```

## Output Example
When you run loc-counter, you'll see beautiful tables like this:

```
📊 LOC-COUNTER SUMMARY
──────────────────────────────────────────────

📈 LANGUAGES BREAKDOWN
┌───────────┬───────┬────────────┬──────────────┬────────────┬────────────┬────────────┐
│ Language  │ Files │ Code Lines │ Comment Lines│ Blank Lines│ Total Lines│ Percentage │
├───────────┼───────┼────────────┼──────────────┼────────────┼────────────┼────────────┤
│ TypeScript│ 42    │ 3845       │ 578          │ 421        │ 4844       │ 68.53%     │
│ JavaScript│ 15    │ 954        │ 126          │ 103        │ 1183       │ 17.01%     │
│ TSX       │ 10    │ 812        │ 45           │ 56         │ 913        │ 14.47%     │
└───────────┴───────┴────────────┴──────────────┴────────────┴────────────┴────────────┘

📊 TOTAL STATISTICS
┌─────────────┬─────┐
│ Total Files │ 67  │
├─────────────┼─────┤
│ Total Lines │ 6940│
├─────────────┼─────┤
│ Code Lines  │ 5611│
├─────────────┼─────┤
│ Comment Line│ 749 │
├─────────────┼─────┤
│ Blank Lines │ 580 │
└─────────────┴─────┘
```

## Supported Languages

Currently supports the following languages:
- JavaScript (js, mjs, cjs)
- TypeScript (ts, mts, cts)
- JSX, TSX
- Python
- Go
- C and C++
- C#
- PHP
- SQL
- Ruby
- HTML, CSS, SCSS
- Java
- Kotlin
- Swift
- Rust
- Shell scripts

## Adding New Languages

Want to add support for more languages? It's easy! Just add a new entry to the `LANGUAGES` array in `src/constants/languages.ts`:

```typescript
{
  name: 'YourLanguage',
  extensions: ['.ext1', '.ext2'],
  commentPatterns: {
    singleLine: ['//'], // Single line comment markers
    multiLine: [{ start: '/*', end: '*/' }] // Multi-line comment markers
  }
}
```

## Contributing

1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

Distributed under the MIT License. See [LICENSE](./LICENSE) for more information.