@sun-asterisk/sunlint 1.3.34 → 1.3.35

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.
Files changed (90) hide show
  1. package/core/architecture-integration.js +16 -7
  2. package/core/auto-performance-manager.js +1 -1
  3. package/core/cli-action-handler.js +92 -2
  4. package/core/cli-program.js +96 -138
  5. package/core/file-targeting-service.js +62 -4
  6. package/core/git-utils.js +19 -12
  7. package/core/github-annotate-service.js +326 -11
  8. package/core/html-report-generator.js +326 -731
  9. package/core/impact-integration.js +433 -0
  10. package/core/output-service.js +293 -21
  11. package/core/scoring-service.js +3 -2
  12. package/engines/arch-detect/core/analyzer.js +413 -0
  13. package/engines/arch-detect/core/index.js +22 -0
  14. package/engines/arch-detect/engine/hybrid-detector.js +176 -0
  15. package/engines/arch-detect/engine/index.js +24 -0
  16. package/engines/arch-detect/engine/rule-executor.js +228 -0
  17. package/engines/arch-detect/engine/score-calculator.js +214 -0
  18. package/engines/arch-detect/engine/violation-detector.js +616 -0
  19. package/engines/arch-detect/index.js +50 -0
  20. package/engines/arch-detect/rules/base-rule.js +187 -0
  21. package/engines/arch-detect/rules/index.js +35 -0
  22. package/engines/arch-detect/rules/layered/index.js +28 -0
  23. package/engines/arch-detect/rules/layered/l001-presentation-layer.js +237 -0
  24. package/engines/arch-detect/rules/layered/l002-business-layer.js +215 -0
  25. package/engines/arch-detect/rules/layered/l003-data-layer.js +229 -0
  26. package/engines/arch-detect/rules/layered/l004-model-layer.js +204 -0
  27. package/engines/arch-detect/rules/layered/l005-layer-separation.js +215 -0
  28. package/engines/arch-detect/rules/layered/l006-dependency-direction.js +221 -0
  29. package/engines/arch-detect/rules/layered/layered-rules-collection.js +445 -0
  30. package/engines/arch-detect/rules/modular/index.js +27 -0
  31. package/engines/arch-detect/rules/modular/m001-feature-modules.js +238 -0
  32. package/engines/arch-detect/rules/modular/m002-core-module.js +169 -0
  33. package/engines/arch-detect/rules/modular/m003-module-declaration.js +186 -0
  34. package/engines/arch-detect/rules/modular/m004-public-api.js +171 -0
  35. package/engines/arch-detect/rules/modular/m005-no-deep-imports.js +220 -0
  36. package/engines/arch-detect/rules/modular/modular-rules-collection.js +357 -0
  37. package/engines/arch-detect/rules/presentation/index.js +27 -0
  38. package/engines/arch-detect/rules/presentation/pr001-view-layer.js +221 -0
  39. package/engines/arch-detect/rules/presentation/pr002-presentation-logic.js +192 -0
  40. package/engines/arch-detect/rules/presentation/pr004-data-binding.js +187 -0
  41. package/engines/arch-detect/rules/presentation/pr006-router-layer.js +185 -0
  42. package/engines/arch-detect/rules/presentation/pr007-interactor-layer.js +181 -0
  43. package/engines/arch-detect/rules/presentation/presentation-rules-collection.js +507 -0
  44. package/engines/arch-detect/rules/project-scanner/index.js +31 -0
  45. package/engines/arch-detect/rules/project-scanner/ps001-project-root.js +213 -0
  46. package/engines/arch-detect/rules/project-scanner/ps002-language-detection.js +192 -0
  47. package/engines/arch-detect/rules/project-scanner/ps003-framework-detection.js +339 -0
  48. package/engines/arch-detect/rules/project-scanner/ps004-build-system.js +171 -0
  49. package/engines/arch-detect/rules/project-scanner/ps005-source-directory.js +163 -0
  50. package/engines/arch-detect/rules/project-scanner/ps006-test-directory.js +184 -0
  51. package/engines/arch-detect/rules/project-scanner/ps007-documentation.js +149 -0
  52. package/engines/arch-detect/rules/project-scanner/ps008-cicd-detection.js +163 -0
  53. package/engines/arch-detect/rules/project-scanner/ps009-code-quality.js +152 -0
  54. package/engines/arch-detect/rules/project-scanner/ps010-statistics.js +180 -0
  55. package/engines/arch-detect/rules/rule-registry.js +111 -0
  56. package/engines/arch-detect/types/context.types.js +60 -0
  57. package/engines/arch-detect/types/enums.js +161 -0
  58. package/engines/arch-detect/types/index.js +25 -0
  59. package/engines/arch-detect/types/result.types.js +7 -0
  60. package/engines/arch-detect/types/rule.types.js +7 -0
  61. package/engines/arch-detect/utils/file-scanner.js +411 -0
  62. package/engines/arch-detect/utils/index.js +23 -0
  63. package/engines/arch-detect/utils/pattern-matcher.js +328 -0
  64. package/engines/impact/cli.js +106 -0
  65. package/engines/impact/config/default-config.js +54 -0
  66. package/engines/impact/core/change-detector.js +258 -0
  67. package/engines/impact/core/detectors/database-detector.js +1317 -0
  68. package/engines/impact/core/detectors/endpoint-detector.js +55 -0
  69. package/engines/impact/core/impact-analyzer.js +124 -0
  70. package/engines/impact/core/report-generator.js +462 -0
  71. package/engines/impact/core/utils/ast-parser.js +241 -0
  72. package/engines/impact/core/utils/dependency-graph.js +159 -0
  73. package/engines/impact/core/utils/file-utils.js +116 -0
  74. package/engines/impact/core/utils/git-utils.js +203 -0
  75. package/engines/impact/core/utils/logger.js +13 -0
  76. package/engines/impact/core/utils/method-call-graph.js +1192 -0
  77. package/engines/impact/index.js +135 -0
  78. package/engines/impact/package.json +29 -0
  79. package/package.json +18 -43
  80. package/scripts/build-release.sh +0 -0
  81. package/scripts/copy-impact-analyzer.js +135 -0
  82. package/scripts/install.sh +0 -0
  83. package/scripts/manual-release.sh +0 -0
  84. package/scripts/pre-release-test.sh +0 -0
  85. package/scripts/prepare-release.sh +0 -0
  86. package/scripts/quick-performance-test.js +0 -0
  87. package/scripts/setup-github-registry.sh +0 -0
  88. package/scripts/trigger-release.sh +0 -0
  89. package/scripts/verify-install.sh +0 -0
  90. package/templates/combined-report.html +1418 -0
@@ -0,0 +1,445 @@
1
+ "use strict";
2
+ /**
3
+ * Layered Rules Collection
4
+ * Định nghĩa các rules còn lại (L007-L015) với cách tiếp cận đơn giản hơn
5
+ */
6
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
7
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
8
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
9
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
10
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
11
+ var _, done = false;
12
+ for (var i = decorators.length - 1; i >= 0; i--) {
13
+ var context = {};
14
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
15
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
16
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
17
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
18
+ if (kind === "accessor") {
19
+ if (result === void 0) continue;
20
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
21
+ if (_ = accept(result.get)) descriptor.get = _;
22
+ if (_ = accept(result.set)) descriptor.set = _;
23
+ if (_ = accept(result.init)) initializers.unshift(_);
24
+ }
25
+ else if (_ = accept(result)) {
26
+ if (kind === "field") initializers.unshift(_);
27
+ else descriptor[key] = _;
28
+ }
29
+ }
30
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
31
+ done = true;
32
+ };
33
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
34
+ var useValue = arguments.length > 2;
35
+ for (var i = 0; i < initializers.length; i++) {
36
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
37
+ }
38
+ return useValue ? value : void 0;
39
+ };
40
+ var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
41
+ if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
42
+ return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.L015InterfaceDefinitions = exports.L014Middleware = exports.L013ConfigLayer = exports.L012Validation = exports.L011ExceptionHandling = exports.L010MapperLayer = exports.L009DtoLayer = exports.L008FrameworkConfig = exports.L007ControllerThin = void 0;
46
+ const enums_1 = require("../../types/enums");
47
+ const base_rule_1 = require("../base-rule");
48
+ const rule_registry_1 = require("../rule-registry");
49
+ // L007: Controller is Thin
50
+ const l007Rule = (0, base_rule_1.createRule)('L007', 'Controller is Thin', 'Xác nhận Controller không chứa business logic', enums_1.RuleCategory.QUALITY, 0.06, [enums_1.PatternType.LAYERED], { filePatterns: ['*Controller.*', '*Handler.*'] }, { tags: ['layered', 'quality', 'thin-controller'] });
51
+ let L007ControllerThin = (() => {
52
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l007Rule)];
53
+ let _classDescriptor;
54
+ let _classExtraInitializers = [];
55
+ let _classThis;
56
+ let _classSuper = base_rule_1.BaseRule;
57
+ var L007ControllerThin = _classThis = class extends _classSuper {
58
+ constructor() {
59
+ super(...arguments);
60
+ this.rule = l007Rule;
61
+ }
62
+ async customDetection(context) {
63
+ const matches = [];
64
+ const violations = [];
65
+ const controllerFiles = context.files
66
+ .filter((f) => /controller/i.test(f.fileName) && !f.isTest)
67
+ .slice(0, 20);
68
+ const totalControllers = controllerFiles.length;
69
+ let thinControllers = 0;
70
+ for (const file of controllerFiles) {
71
+ try {
72
+ const content = await context.helpers.readFile(file.absolutePath);
73
+ // Check for business logic indicators
74
+ const businessPatterns = [
75
+ /for\s*\(/g,
76
+ /while\s*\(/g,
77
+ /calculate/gi,
78
+ /process/gi,
79
+ /validate.*\(/gi,
80
+ /\.query\s*\(/g,
81
+ /\.execute\s*\(/g,
82
+ ];
83
+ let hasBusinessLogic = false;
84
+ for (const pattern of businessPatterns) {
85
+ if (pattern.test(content)) {
86
+ hasBusinessLogic = true;
87
+ violations.push({
88
+ type: 'fat_controller',
89
+ severity: enums_1.Severity.INFO,
90
+ path: file.relativePath,
91
+ message: 'Controller may contain business logic',
92
+ suggestion: 'Consider moving complex logic to service layer',
93
+ });
94
+ break;
95
+ }
96
+ }
97
+ if (!hasBusinessLogic) {
98
+ thinControllers++;
99
+ matches.push({
100
+ type: enums_1.MatchType.FILE,
101
+ path: file.relativePath,
102
+ matchedPattern: 'Thin controller',
103
+ });
104
+ }
105
+ }
106
+ catch {
107
+ // Skip
108
+ }
109
+ }
110
+ const score = totalControllers > 0 ? thinControllers / totalControllers : 0.5;
111
+ return { matches, violations, score };
112
+ }
113
+ };
114
+ __setFunctionName(_classThis, "L007ControllerThin");
115
+ (() => {
116
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
117
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
118
+ L007ControllerThin = _classThis = _classDescriptor.value;
119
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
120
+ __runInitializers(_classThis, _classExtraInitializers);
121
+ })();
122
+ return L007ControllerThin = _classThis;
123
+ })();
124
+ exports.L007ControllerThin = L007ControllerThin;
125
+ // L008: Framework Configuration Exists
126
+ const l008Rule = (0, base_rule_1.createRule)('L008', 'Framework Configuration Exists', 'Xác nhận có configuration files của framework', enums_1.RuleCategory.STRUCTURE, 0.05, [enums_1.PatternType.LAYERED], {
127
+ filePatterns: [
128
+ 'application.properties',
129
+ 'application.yml',
130
+ 'application.yaml',
131
+ 'appsettings.json',
132
+ 'appsettings.*.json',
133
+ 'web.config',
134
+ 'config/*.php',
135
+ '.env',
136
+ ],
137
+ }, { tags: ['layered', 'configuration'] });
138
+ let L008FrameworkConfig = (() => {
139
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l008Rule)];
140
+ let _classDescriptor;
141
+ let _classExtraInitializers = [];
142
+ let _classThis;
143
+ let _classSuper = base_rule_1.BaseRule;
144
+ var L008FrameworkConfig = _classThis = class extends _classSuper {
145
+ constructor() {
146
+ super(...arguments);
147
+ this.rule = l008Rule;
148
+ }
149
+ async customDetection(context) {
150
+ const matches = [];
151
+ const configPatterns = [
152
+ /application\.(properties|ya?ml)$/i,
153
+ /appsettings(\.\w+)?\.json$/i,
154
+ /web\.config$/i,
155
+ /config\.php$/i,
156
+ /settings\.py$/i,
157
+ /\.env$/,
158
+ ];
159
+ for (const file of context.files) {
160
+ for (const pattern of configPatterns) {
161
+ if (pattern.test(file.fileName)) {
162
+ matches.push({
163
+ type: enums_1.MatchType.CONFIG,
164
+ path: file.relativePath,
165
+ matchedPattern: 'Framework config',
166
+ });
167
+ }
168
+ }
169
+ }
170
+ return { matches, violations: [], score: matches.length > 0 ? 1 : 0 };
171
+ }
172
+ };
173
+ __setFunctionName(_classThis, "L008FrameworkConfig");
174
+ (() => {
175
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
176
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
177
+ L008FrameworkConfig = _classThis = _classDescriptor.value;
178
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
179
+ __runInitializers(_classThis, _classExtraInitializers);
180
+ })();
181
+ return L008FrameworkConfig = _classThis;
182
+ })();
183
+ exports.L008FrameworkConfig = L008FrameworkConfig;
184
+ // L009: DTO/Transfer Object Layer Exists
185
+ const l009Rule = (0, base_rule_1.createRule)('L009', 'DTO/Transfer Object Layer Exists', 'Xác nhận có DTO layer để transfer data giữa layers', enums_1.RuleCategory.BONUS, 0.04, [enums_1.PatternType.LAYERED], {
186
+ folderPatterns: ['dtos', 'dto', 'transfer', 'requests', 'responses', 'contracts', 'payloads'],
187
+ filePatterns: ['*Dto.*', '*DTO.*', '*Request.*', '*Response.*', '*Payload.*'],
188
+ }, { tags: ['layered', 'dto'] });
189
+ let L009DtoLayer = (() => {
190
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l009Rule)];
191
+ let _classDescriptor;
192
+ let _classExtraInitializers = [];
193
+ let _classThis;
194
+ let _classSuper = base_rule_1.BaseRule;
195
+ var L009DtoLayer = _classThis = class extends _classSuper {
196
+ constructor() {
197
+ super(...arguments);
198
+ this.rule = l009Rule;
199
+ }
200
+ };
201
+ __setFunctionName(_classThis, "L009DtoLayer");
202
+ (() => {
203
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
204
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
205
+ L009DtoLayer = _classThis = _classDescriptor.value;
206
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
207
+ __runInitializers(_classThis, _classExtraInitializers);
208
+ })();
209
+ return L009DtoLayer = _classThis;
210
+ })();
211
+ exports.L009DtoLayer = L009DtoLayer;
212
+ // L010: Mapper/Converter Layer Exists
213
+ const l010Rule = (0, base_rule_1.createRule)('L010', 'Mapper/Converter Layer Exists', 'Xác nhận có mapper để convert giữa Entity và DTO', enums_1.RuleCategory.BONUS, 0.02, [enums_1.PatternType.LAYERED], {
214
+ folderPatterns: ['mappers', 'converters', 'transformers', 'adapters'],
215
+ filePatterns: ['*Mapper.*', '*Converter.*', '*Transformer.*', '*Assembler.*'],
216
+ }, { tags: ['layered', 'mapper'] });
217
+ let L010MapperLayer = (() => {
218
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l010Rule)];
219
+ let _classDescriptor;
220
+ let _classExtraInitializers = [];
221
+ let _classThis;
222
+ let _classSuper = base_rule_1.BaseRule;
223
+ var L010MapperLayer = _classThis = class extends _classSuper {
224
+ constructor() {
225
+ super(...arguments);
226
+ this.rule = l010Rule;
227
+ }
228
+ };
229
+ __setFunctionName(_classThis, "L010MapperLayer");
230
+ (() => {
231
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
232
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
233
+ L010MapperLayer = _classThis = _classDescriptor.value;
234
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
235
+ __runInitializers(_classThis, _classExtraInitializers);
236
+ })();
237
+ return L010MapperLayer = _classThis;
238
+ })();
239
+ exports.L010MapperLayer = L010MapperLayer;
240
+ // L011: Exception/Error Handling Layer
241
+ const l011Rule = (0, base_rule_1.createRule)('L011', 'Exception/Error Handling Layer', 'Xác nhận có centralized error handling', enums_1.RuleCategory.QUALITY, 0.03, [enums_1.PatternType.LAYERED], {
242
+ folderPatterns: ['exceptions', 'errors', 'handlers'],
243
+ filePatterns: ['*Exception.*', '*Error.*', '*ExceptionHandler.*', 'GlobalExceptionHandler.*'],
244
+ codePatterns: [
245
+ { language: enums_1.Language.JAVA, type: enums_1.CodePatternType.ANNOTATION, pattern: /@ControllerAdvice/ },
246
+ { language: enums_1.Language.JAVA, type: enums_1.CodePatternType.ANNOTATION, pattern: /@ExceptionHandler/ },
247
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.ANNOTATION, pattern: /@Catch\s*\(/ },
248
+ { language: enums_1.Language.CSHARP, type: enums_1.CodePatternType.PATTERN, pattern: /IExceptionHandler/ },
249
+ ],
250
+ }, { tags: ['layered', 'error-handling'] });
251
+ let L011ExceptionHandling = (() => {
252
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l011Rule)];
253
+ let _classDescriptor;
254
+ let _classExtraInitializers = [];
255
+ let _classThis;
256
+ let _classSuper = base_rule_1.BaseRule;
257
+ var L011ExceptionHandling = _classThis = class extends _classSuper {
258
+ constructor() {
259
+ super(...arguments);
260
+ this.rule = l011Rule;
261
+ }
262
+ };
263
+ __setFunctionName(_classThis, "L011ExceptionHandling");
264
+ (() => {
265
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
266
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
267
+ L011ExceptionHandling = _classThis = _classDescriptor.value;
268
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
269
+ __runInitializers(_classThis, _classExtraInitializers);
270
+ })();
271
+ return L011ExceptionHandling = _classThis;
272
+ })();
273
+ exports.L011ExceptionHandling = L011ExceptionHandling;
274
+ // L012: Validation Layer/Mechanism
275
+ const l012Rule = (0, base_rule_1.createRule)('L012', 'Validation Layer/Mechanism', 'Xác nhận có validation mechanism', enums_1.RuleCategory.QUALITY, 0.03, [enums_1.PatternType.LAYERED], {
276
+ codePatterns: [
277
+ { language: enums_1.Language.JAVA, type: enums_1.CodePatternType.ANNOTATION, pattern: /@Valid\b/ },
278
+ { language: enums_1.Language.JAVA, type: enums_1.CodePatternType.ANNOTATION, pattern: /@NotNull\b/ },
279
+ { language: enums_1.Language.JAVA, type: enums_1.CodePatternType.ANNOTATION, pattern: /@NotBlank\b/ },
280
+ {
281
+ language: enums_1.Language.TYPESCRIPT,
282
+ type: enums_1.CodePatternType.ANNOTATION,
283
+ pattern: /@IsString\s*\(/,
284
+ },
285
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.ANNOTATION, pattern: /@IsEmail\s*\(/ },
286
+ { language: enums_1.Language.CSHARP, type: enums_1.CodePatternType.ANNOTATION, pattern: /\[Required\]/ },
287
+ { language: enums_1.Language.CSHARP, type: enums_1.CodePatternType.ANNOTATION, pattern: /\[StringLength/ },
288
+ ],
289
+ }, { tags: ['layered', 'validation'] });
290
+ let L012Validation = (() => {
291
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l012Rule)];
292
+ let _classDescriptor;
293
+ let _classExtraInitializers = [];
294
+ let _classThis;
295
+ let _classSuper = base_rule_1.BaseRule;
296
+ var L012Validation = _classThis = class extends _classSuper {
297
+ constructor() {
298
+ super(...arguments);
299
+ this.rule = l012Rule;
300
+ }
301
+ };
302
+ __setFunctionName(_classThis, "L012Validation");
303
+ (() => {
304
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
305
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
306
+ L012Validation = _classThis = _classDescriptor.value;
307
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
308
+ __runInitializers(_classThis, _classExtraInitializers);
309
+ })();
310
+ return L012Validation = _classThis;
311
+ })();
312
+ exports.L012Validation = L012Validation;
313
+ // L013: Configuration Layer
314
+ const l013Rule = (0, base_rule_1.createRule)('L013', 'Configuration Layer', 'Xác nhận có configuration management riêng', enums_1.RuleCategory.STRUCTURE, 0.02, [enums_1.PatternType.LAYERED], {
315
+ folderPatterns: ['config', 'configuration', 'settings'],
316
+ filePatterns: ['*Config.*', '*Configuration.*', '*Settings.*', '*Options.*'],
317
+ codePatterns: [
318
+ { language: enums_1.Language.JAVA, type: enums_1.CodePatternType.ANNOTATION, pattern: /@Configuration\b/ },
319
+ {
320
+ language: enums_1.Language.JAVA,
321
+ type: enums_1.CodePatternType.ANNOTATION,
322
+ pattern: /@ConfigurationProperties/,
323
+ },
324
+ {
325
+ language: enums_1.Language.TYPESCRIPT,
326
+ type: enums_1.CodePatternType.PATTERN,
327
+ pattern: /ConfigModule\.forRoot/,
328
+ },
329
+ ],
330
+ }, { tags: ['layered', 'configuration'] });
331
+ let L013ConfigLayer = (() => {
332
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l013Rule)];
333
+ let _classDescriptor;
334
+ let _classExtraInitializers = [];
335
+ let _classThis;
336
+ let _classSuper = base_rule_1.BaseRule;
337
+ var L013ConfigLayer = _classThis = class extends _classSuper {
338
+ constructor() {
339
+ super(...arguments);
340
+ this.rule = l013Rule;
341
+ }
342
+ };
343
+ __setFunctionName(_classThis, "L013ConfigLayer");
344
+ (() => {
345
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
346
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
347
+ L013ConfigLayer = _classThis = _classDescriptor.value;
348
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
349
+ __runInitializers(_classThis, _classExtraInitializers);
350
+ })();
351
+ return L013ConfigLayer = _classThis;
352
+ })();
353
+ exports.L013ConfigLayer = L013ConfigLayer;
354
+ // L014: Middleware/Interceptor Layer
355
+ const l014Rule = (0, base_rule_1.createRule)('L014', 'Middleware/Interceptor Layer', 'Xác nhận có middleware/interceptor cho cross-cutting concerns', enums_1.RuleCategory.QUALITY, 0.02, [enums_1.PatternType.LAYERED], {
356
+ folderPatterns: ['middlewares', 'middleware', 'interceptors', 'filters', 'pipes'],
357
+ filePatterns: ['*Middleware.*', '*Interceptor.*', '*Filter.*', '*Pipe.*'],
358
+ codePatterns: [
359
+ {
360
+ language: enums_1.Language.JAVA,
361
+ type: enums_1.CodePatternType.PATTERN,
362
+ pattern: /implements\s+HandlerInterceptor/,
363
+ },
364
+ {
365
+ language: enums_1.Language.TYPESCRIPT,
366
+ type: enums_1.CodePatternType.PATTERN,
367
+ pattern: /implements\s+NestInterceptor/,
368
+ },
369
+ {
370
+ language: enums_1.Language.JAVASCRIPT,
371
+ type: enums_1.CodePatternType.PATTERN,
372
+ pattern: /app\.use\s*\(\s*\(req,\s*res,\s*next\)/,
373
+ },
374
+ ],
375
+ }, { tags: ['layered', 'middleware'] });
376
+ let L014Middleware = (() => {
377
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l014Rule)];
378
+ let _classDescriptor;
379
+ let _classExtraInitializers = [];
380
+ let _classThis;
381
+ let _classSuper = base_rule_1.BaseRule;
382
+ var L014Middleware = _classThis = class extends _classSuper {
383
+ constructor() {
384
+ super(...arguments);
385
+ this.rule = l014Rule;
386
+ }
387
+ };
388
+ __setFunctionName(_classThis, "L014Middleware");
389
+ (() => {
390
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
391
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
392
+ L014Middleware = _classThis = _classDescriptor.value;
393
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
394
+ __runInitializers(_classThis, _classExtraInitializers);
395
+ })();
396
+ return L014Middleware = _classThis;
397
+ })();
398
+ exports.L014Middleware = L014Middleware;
399
+ // L015: Interface/Contract Definitions
400
+ const l015Rule = (0, base_rule_1.createRule)('L015', 'Interface/Contract Definitions', 'Xác nhận có interface definitions cho dependency inversion', enums_1.RuleCategory.QUALITY, 0.03, [enums_1.PatternType.LAYERED], {
401
+ folderPatterns: ['interfaces', 'contracts', 'ports', 'abstractions'],
402
+ filePatterns: ['I*Service.*', 'I*Repository.*', '*Interface.*', '*Contract.*', '*Port.*'],
403
+ codePatterns: [
404
+ {
405
+ language: enums_1.Language.JAVA,
406
+ type: enums_1.CodePatternType.PATTERN,
407
+ pattern: /public\s+interface\s+I?\w+Service/,
408
+ },
409
+ {
410
+ language: enums_1.Language.CSHARP,
411
+ type: enums_1.CodePatternType.PATTERN,
412
+ pattern: /interface\s+I\w+(Service|Repository)/,
413
+ },
414
+ {
415
+ language: enums_1.Language.TYPESCRIPT,
416
+ type: enums_1.CodePatternType.PATTERN,
417
+ pattern: /export\s+interface\s+I?\w+(Service|Repository)/,
418
+ },
419
+ ],
420
+ }, { tags: ['layered', 'interface', 'dependency-inversion'] });
421
+ let L015InterfaceDefinitions = (() => {
422
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(l015Rule)];
423
+ let _classDescriptor;
424
+ let _classExtraInitializers = [];
425
+ let _classThis;
426
+ let _classSuper = base_rule_1.BaseRule;
427
+ var L015InterfaceDefinitions = _classThis = class extends _classSuper {
428
+ constructor() {
429
+ super(...arguments);
430
+ this.rule = l015Rule;
431
+ }
432
+ };
433
+ __setFunctionName(_classThis, "L015InterfaceDefinitions");
434
+ (() => {
435
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
436
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
437
+ L015InterfaceDefinitions = _classThis = _classDescriptor.value;
438
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
439
+ __runInitializers(_classThis, _classExtraInitializers);
440
+ })();
441
+ return L015InterfaceDefinitions = _classThis;
442
+ })();
443
+ exports.L015InterfaceDefinitions = L015InterfaceDefinitions;
444
+ // All classes are exported inline with their declarations
445
+ //# sourceMappingURL=layered-rules-collection.js.map
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Modular Rules Index
4
+ * Export tất cả Modular Architecture rules (M001-M014)
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ __exportStar(require("./m001-feature-modules"), exports);
22
+ __exportStar(require("./m002-core-module"), exports);
23
+ __exportStar(require("./m003-module-declaration"), exports);
24
+ __exportStar(require("./m004-public-api"), exports);
25
+ __exportStar(require("./m005-no-deep-imports"), exports);
26
+ __exportStar(require("./modular-rules-collection"), exports);
27
+ //# sourceMappingURL=index.js.map