architecture-linter 0.1.0
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/README.md +686 -0
- package/dist/aliasResolver.d.ts +37 -0
- package/dist/aliasResolver.d.ts.map +1 -0
- package/dist/aliasResolver.js +94 -0
- package/dist/aliasResolver.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +437 -0
- package/dist/cli.js.map +1 -0
- package/dist/contextParser.d.ts +12 -0
- package/dist/contextParser.d.ts.map +1 -0
- package/dist/contextParser.js +67 -0
- package/dist/contextParser.js.map +1 -0
- package/dist/dependencyScanner.d.ts +17 -0
- package/dist/dependencyScanner.d.ts.map +1 -0
- package/dist/dependencyScanner.js +78 -0
- package/dist/dependencyScanner.js.map +1 -0
- package/dist/explainer.d.ts +23 -0
- package/dist/explainer.d.ts.map +1 -0
- package/dist/explainer.js +113 -0
- package/dist/explainer.js.map +1 -0
- package/dist/presets.d.ts +21 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +118 -0
- package/dist/presets.js.map +1 -0
- package/dist/ruleEngine.d.ts +22 -0
- package/dist/ruleEngine.d.ts.map +1 -0
- package/dist/ruleEngine.js +141 -0
- package/dist/ruleEngine.js.map +1 -0
- package/dist/types.d.ts +91 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruleEngine.js","sourceRoot":"","sources":["../src/ruleEngine.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents the parsed structure of a .context.yml file.
|
|
3
|
+
*/
|
|
4
|
+
export interface ContextConfig {
|
|
5
|
+
/**
|
|
6
|
+
* A built-in preset name (or list of names) to extend.
|
|
7
|
+
* Supported values: 'nestjs', 'clean-architecture', 'hexagonal', 'nextjs'.
|
|
8
|
+
* User rules override preset rules.
|
|
9
|
+
*/
|
|
10
|
+
extends?: string | string[];
|
|
11
|
+
architecture: {
|
|
12
|
+
layers: string[];
|
|
13
|
+
};
|
|
14
|
+
rules: Record<string, LayerRule>;
|
|
15
|
+
/** Project-relative glob patterns for files to exclude from scanning. */
|
|
16
|
+
exclude?: string[];
|
|
17
|
+
/**
|
|
18
|
+
* Manual path alias overrides. Keys are alias prefixes (e.g. '@repositories'),
|
|
19
|
+
* values are project-relative directories (e.g. 'src/repositories').
|
|
20
|
+
* These supplement aliases auto-detected from tsconfig.json compilerOptions.paths.
|
|
21
|
+
*/
|
|
22
|
+
aliases?: Record<string, string>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Rules applied to a single layer.
|
|
26
|
+
* Use cannot_import OR can_only_import — they are mutually exclusive.
|
|
27
|
+
*/
|
|
28
|
+
export interface LayerRule {
|
|
29
|
+
/** Blacklist: this layer must not import from any listed layer. */
|
|
30
|
+
cannot_import?: string[];
|
|
31
|
+
/** Whitelist: this layer may only import from listed layers. Any other layer import is a violation. */
|
|
32
|
+
can_only_import?: string[];
|
|
33
|
+
/** Optional file glob (project-relative). Rule only applies to source files matching this pattern. */
|
|
34
|
+
files?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A single import found in a scanned file.
|
|
38
|
+
* importPath is project-relative (e.g. "repositories/orderRepository").
|
|
39
|
+
* rawSpecifier is the original string in the source (e.g. "../repositories/orderRepository").
|
|
40
|
+
*/
|
|
41
|
+
export interface ImportInfo {
|
|
42
|
+
file: string;
|
|
43
|
+
importPath: string;
|
|
44
|
+
rawSpecifier: string;
|
|
45
|
+
/** Normalised rule strings suppressed via // arch-ignore: comments on the preceding line. */
|
|
46
|
+
archIgnore: string[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The result of scanning a single TypeScript file.
|
|
50
|
+
*/
|
|
51
|
+
export interface FileScan {
|
|
52
|
+
file: string;
|
|
53
|
+
layer: string | null;
|
|
54
|
+
imports: ImportInfo[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A detected architecture rule violation.
|
|
58
|
+
*/
|
|
59
|
+
export interface Violation {
|
|
60
|
+
file: string;
|
|
61
|
+
importPath: string;
|
|
62
|
+
rawSpecifier: string;
|
|
63
|
+
sourceLayer: string;
|
|
64
|
+
targetLayer: string;
|
|
65
|
+
rule: string;
|
|
66
|
+
/** Textual suggestion for resolving the violation (populated when --fix is enabled). */
|
|
67
|
+
fix?: string;
|
|
68
|
+
}
|
|
69
|
+
/** Options passed from the CLI to the scan pipeline. */
|
|
70
|
+
export interface ScanOptions {
|
|
71
|
+
format: 'text' | 'json';
|
|
72
|
+
/** Fail and report files that do not belong to any declared layer. */
|
|
73
|
+
strict: boolean;
|
|
74
|
+
/** Suppress informational output; only print violations. */
|
|
75
|
+
quiet: boolean;
|
|
76
|
+
/** Print a why/impact/fix explanation for each violation. */
|
|
77
|
+
explain: boolean;
|
|
78
|
+
/** Re-run the scan automatically when TypeScript files change. */
|
|
79
|
+
watch: boolean;
|
|
80
|
+
/** Show a suggested fix for each violation. */
|
|
81
|
+
fix: boolean;
|
|
82
|
+
}
|
|
83
|
+
/** Aggregated result returned by the rule engine. */
|
|
84
|
+
export interface RuleCheckResult {
|
|
85
|
+
violations: Violation[];
|
|
86
|
+
/** Populated only in strict mode: files whose directory matches no layer. */
|
|
87
|
+
unclassifiedFiles: string[];
|
|
88
|
+
/** Number of violations per layer name. */
|
|
89
|
+
violationsByLayer: Record<string, number>;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,YAAY,EAAE;QACZ,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,uGAAuG;IACvG,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,sGAAsG;IACtG,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,6FAA6F;IAC7F,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wDAAwD;AACxD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,sEAAsE;IACtE,MAAM,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,KAAK,EAAE,OAAO,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,+CAA+C;IAC/C,GAAG,EAAE,OAAO,CAAC;CACd;AAED,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,6EAA6E;IAC7E,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC3C"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "architecture-linter",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A CLI tool that enforces architecture rules in TypeScript projects",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"architecture",
|
|
7
|
+
"linter",
|
|
8
|
+
"typescript",
|
|
9
|
+
"dependency",
|
|
10
|
+
"layers"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md"
|
|
16
|
+
],
|
|
17
|
+
"bin": {
|
|
18
|
+
"architecture-linter": "dist/cli.js"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc",
|
|
22
|
+
"dev": "ts-node src/cli.ts",
|
|
23
|
+
"start": "node dist/cli.js",
|
|
24
|
+
"clean": "rimraf dist",
|
|
25
|
+
"test": "jest",
|
|
26
|
+
"test:watch": "jest --watch",
|
|
27
|
+
"test:coverage": "jest --coverage"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"chalk": "^4.1.2",
|
|
31
|
+
"chokidar": "^3.6.0",
|
|
32
|
+
"commander": "^12.0.0",
|
|
33
|
+
"fast-glob": "^3.3.2",
|
|
34
|
+
"js-yaml": "^4.1.0",
|
|
35
|
+
"minimatch": "^9.0.4",
|
|
36
|
+
"ts-morph": "^22.0.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/jest": "^30.0.0",
|
|
40
|
+
"@types/js-yaml": "^4.0.9",
|
|
41
|
+
"@types/node": "^20.0.0",
|
|
42
|
+
"jest": "^30.3.0",
|
|
43
|
+
"rimraf": "^5.0.5",
|
|
44
|
+
"ts-jest": "^29.4.6",
|
|
45
|
+
"ts-node": "^10.9.2",
|
|
46
|
+
"typescript": "^5.4.0"
|
|
47
|
+
}
|
|
48
|
+
}
|