-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor(rewrite): rewrite code - fix #11
- use tsmorph to work on classes directly - filter ignored files early - improve classes usage search - handle all supported component selectors, including multiple (fix #9) - improve cli (fix #7) - make it pipeable (fix #8) - limit output generated for non-tty - use different exit codes depending on result (fix #10)
- Loading branch information
1 parent
d3312d4
commit 48634bc
Showing
15 changed files
with
346 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,3 +3,4 @@ | |
.* | ||
tsconfig.json | ||
commitlint.config.cjs | ||
README.md |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,88 @@ | ||
# Version 2.0.0 is in works | ||
|
||
# Docmentation for version 1.0.0 | ||
|
||
# ngx-unused | ||
|
||
Find declared but unused Angular code. | ||
Find declared but unused Angular classes in your codebase. | ||
|
||
This tool recognizes components, directives, pipes and services in Angular code and cheks if they are used in provided project. | ||
This tool recognizes components, directives, pipes and services in Angular code and checks if they are used in provided | ||
project. | ||
|
||
# Usage | ||
|
||
Simplest way to use is via npx: | ||
|
||
`npx ngx-unused <tsconfig-path>` | ||
`npx ngx-unused <source-root> -p <tsconfig-path>` | ||
|
||
```shell | ||
ngx-unused - find unused classes in Angular codebase | ||
|
||
|
||
Usage: ngx-unused <directory> [-p | --project] <tsconfig-file> | ||
|
||
<directory> - directory to be scanned | ||
to scan multiple directories pass names separated by space | ||
(usages of classes from source roots will be also searched in source roots) | ||
|
||
<tsconfig-file> - main tsconfig file | ||
should be one containing @paths definitions | ||
for NX projects its usually tsconfig.base.json | ||
|
||
|
||
Options: | ||
-p | --project <tsconfigfile> - tsconfig file path (required) | ||
-h | --help - print this help | ||
Source root directories and tsconfig file must be under the same root directory. | ||
|
||
Examples: | ||
ngx-unused . -p tsconfig.base.json | ||
ngx-unused libs apps/my-app -p tsconfig.base.json | ||
``` | ||
|
||
# How does it work? | ||
|
||
Code from provided source root directory (or directories) is analyzed to find [relevant classes](#relevant-classes). | ||
Relevant class is class with on of following Angular decorators: `@Component`,`@Directory`,`@Pipe`,`@Injectable`. | ||
Each class is checked for [relevant usages](#relevant-usages) in codebase. When it has no relevant usages it is | ||
considered unused. | ||
|
||
## Relevant classes | ||
|
||
Class decorated with one of Angular decorators | ||
|
||
- `@Component` | ||
- `@Directive` | ||
- `@Pipe` | ||
- `@Injectable` | ||
|
||
Classes declared in [ignored files](#ignored-files) will be ignored. | ||
|
||
## Relevant usages | ||
|
||
Relevant usage is any usage that is not one of following: | ||
|
||
- import | ||
- export | ||
- usage in `@NgModule` decorator (in `imports`,`exports`, `declarations`, `providers` properties) | ||
- with exception for `useClass` and `useExisting` in provider object | ||
- usage in any of [ignored files](#ignored-files) | ||
|
||
## Ignored files | ||
|
||
Files matching `*.spec.ts` glob will be ignored. | ||
Future version may have option to configure that. | ||
|
||
# Output | ||
|
||
`<tsconfig-path>` - path to tsconfig file _(note: files excluded in given config will not be analyzed)_ | ||
Output is printed to standard output. If `process.stdout.isTTY` is false no decorative texts and no progress will be | ||
printed, so it can be safely piped. | ||
|
||
# Important notes | ||
## Output formatting | ||
|
||
Component - is a class with `Component` decorator. | ||
Output contains progress information and formatted results. | ||
Formatted results is a list of unused classes, grouped by files. | ||
|
||
Directive - is a class with `Directive` decorator. | ||
## Exit codes | ||
|
||
Pipe - is a class with `Pipe` decorator. | ||
`0` No unused classes detected. | ||
|
||
Service - is a class with `Injectable` decorator. | ||
`1` Detected unused component, directive, pipe, or service. | ||
|
||
Only classes with default Angular decorators will be recognized. | ||
`2`: Invalid configuration |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import { Decorator, ObjectLiteralExpression, SyntaxKind } from 'ts-morph'; | ||
|
||
export function getPropertyFromDecoratorCall( | ||
decorator: Decorator, | ||
propertyName: 'selector' | 'name' | 'template' | 'templateUrl' | ||
) { | ||
const decoratorCallArguments = decorator.getArguments(); | ||
const matchedProperty = decoratorCallArguments | ||
.flatMap(argument => | ||
(argument as ObjectLiteralExpression) | ||
.getProperties() | ||
.map(prop => prop.asKind(SyntaxKind.PropertyAssignment)) | ||
.filter(value => value !== undefined) | ||
) | ||
.find(structure => structure!.getName() === propertyName); | ||
|
||
return matchedProperty | ||
?.getInitializerIfKind(SyntaxKind.StringLiteral) | ||
?.getLiteralValue(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import { Decorator } from 'ts-morph'; | ||
import { getPropertyFromDecoratorCall } from './getPropertyFromDecorator.js'; | ||
import { TemplateService } from './templateService.js'; | ||
|
||
export function hasUsagesByPipeName( | ||
decorator: Decorator, | ||
templateService: TemplateService | ||
): boolean { | ||
const name = getPropertyFromDecoratorCall(decorator, 'name'); | ||
return templateService.matchesPipeName(name ?? ''); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,11 @@ | ||
import { Decorator } from 'ts-morph'; | ||
import { getPropertyFromDecoratorCall } from './getPropertyFromDecorator.js'; | ||
import { TemplateService } from './templateService.js'; | ||
|
||
// eslint-disable-next-line @typescript-eslint/no-unused-vars | ||
export function hasUsagesBySelectors(decorator: Decorator): boolean { | ||
return false; | ||
export function hasUsagesBySelectors( | ||
decorator: Decorator, | ||
templateService: TemplateService | ||
): boolean { | ||
const selector = getPropertyFromDecoratorCall(decorator, 'selector'); | ||
return templateService.matchesSelectors(selector?.split(',') ?? []); | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.