@sun-asterisk/sunlint 1.3.34 → 1.3.36

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 +102 -2
  4. package/core/cli-program.js +102 -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 +551 -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,357 @@
1
+ "use strict";
2
+ /**
3
+ * Modular Rules Collection
4
+ * Định nghĩa các rules còn lại (M006-M014)
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.M014FeatureFlags = exports.M013ModuleDocumentation = exports.M012SharedState = exports.M011TestingIsolation = exports.M010BoundaryEnforcement = exports.M009ModuleCommunication = exports.M008ConsistentStructure = exports.M007LazyLoading = exports.M006ModuleIndependence = 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
+ // M006: Module Independence (Low Coupling)
50
+ const m006Rule = (0, base_rule_1.createRule)('M006', 'Module Independence (Low Coupling)', 'Xác nhận modules có coupling thấp với nhau', enums_1.RuleCategory.QUALITY, 0.08, [enums_1.PatternType.MODULAR], {}, { tags: ['modular', 'coupling'] });
51
+ let M006ModuleIndependence = (() => {
52
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m006Rule)];
53
+ let _classDescriptor;
54
+ let _classExtraInitializers = [];
55
+ let _classThis;
56
+ let _classSuper = base_rule_1.BaseRule;
57
+ var M006ModuleIndependence = _classThis = class extends _classSuper {
58
+ constructor() {
59
+ super(...arguments);
60
+ this.rule = m006Rule;
61
+ }
62
+ async customDetection(_context) {
63
+ // Simplified: Check if modules don't have too many cross-dependencies
64
+ const matches = [];
65
+ matches.push({
66
+ type: enums_1.MatchType.CODE,
67
+ path: '',
68
+ matchedPattern: 'Module independence check',
69
+ });
70
+ return { matches, violations: [], score: 0.5 };
71
+ }
72
+ };
73
+ __setFunctionName(_classThis, "M006ModuleIndependence");
74
+ (() => {
75
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
76
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
77
+ M006ModuleIndependence = _classThis = _classDescriptor.value;
78
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
79
+ __runInitializers(_classThis, _classExtraInitializers);
80
+ })();
81
+ return M006ModuleIndependence = _classThis;
82
+ })();
83
+ exports.M006ModuleIndependence = M006ModuleIndependence;
84
+ // M007: Lazy Loading / Dynamic Loading
85
+ const m007Rule = (0, base_rule_1.createRule)('M007', 'Lazy Loading / Dynamic Loading', 'Xác nhận có cơ chế lazy loading modules', enums_1.RuleCategory.STRUCTURE, 0.06, [enums_1.PatternType.MODULAR], {
86
+ codePatterns: [
87
+ {
88
+ language: enums_1.Language.TYPESCRIPT,
89
+ type: enums_1.CodePatternType.PATTERN,
90
+ pattern: /loadChildren:\s*\(\)\s*=>\s*import\s*\(/,
91
+ },
92
+ {
93
+ language: enums_1.Language.TYPESCRIPT,
94
+ type: enums_1.CodePatternType.PATTERN,
95
+ pattern: /React\.lazy\s*\(\s*\(\)\s*=>\s*import\s*\(/,
96
+ },
97
+ {
98
+ language: enums_1.Language.TYPESCRIPT,
99
+ type: enums_1.CodePatternType.PATTERN,
100
+ pattern: /\(\)\s*=>\s*import\s*\(['"]['"]\.\/.*['"]\)/,
101
+ },
102
+ {
103
+ language: enums_1.Language.JAVASCRIPT,
104
+ type: enums_1.CodePatternType.PATTERN,
105
+ pattern: /forwardRef\s*\(\s*\(\)\s*=>/,
106
+ },
107
+ ],
108
+ }, { tags: ['modular', 'lazy-loading', 'performance'] });
109
+ let M007LazyLoading = (() => {
110
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m007Rule)];
111
+ let _classDescriptor;
112
+ let _classExtraInitializers = [];
113
+ let _classThis;
114
+ let _classSuper = base_rule_1.BaseRule;
115
+ var M007LazyLoading = _classThis = class extends _classSuper {
116
+ constructor() {
117
+ super(...arguments);
118
+ this.rule = m007Rule;
119
+ }
120
+ };
121
+ __setFunctionName(_classThis, "M007LazyLoading");
122
+ (() => {
123
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
124
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
125
+ M007LazyLoading = _classThis = _classDescriptor.value;
126
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
127
+ __runInitializers(_classThis, _classExtraInitializers);
128
+ })();
129
+ return M007LazyLoading = _classThis;
130
+ })();
131
+ exports.M007LazyLoading = M007LazyLoading;
132
+ // M008: Consistent Module Structure
133
+ const m008Rule = (0, base_rule_1.createRule)('M008', 'Consistent Module Structure', 'Xác nhận các modules có cấu trúc nhất quán', enums_1.RuleCategory.QUALITY, 0.04, [enums_1.PatternType.MODULAR], {}, { tags: ['modular', 'consistency'] });
134
+ let M008ConsistentStructure = (() => {
135
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m008Rule)];
136
+ let _classDescriptor;
137
+ let _classExtraInitializers = [];
138
+ let _classThis;
139
+ let _classSuper = base_rule_1.BaseRule;
140
+ var M008ConsistentStructure = _classThis = class extends _classSuper {
141
+ constructor() {
142
+ super(...arguments);
143
+ this.rule = m008Rule;
144
+ }
145
+ async customDetection(_context) {
146
+ const matches = [];
147
+ matches.push({
148
+ type: enums_1.MatchType.FOLDER,
149
+ path: '',
150
+ matchedPattern: 'Module structure consistency check',
151
+ });
152
+ return { matches, violations: [], score: 0.5 };
153
+ }
154
+ };
155
+ __setFunctionName(_classThis, "M008ConsistentStructure");
156
+ (() => {
157
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
158
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
159
+ M008ConsistentStructure = _classThis = _classDescriptor.value;
160
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
161
+ __runInitializers(_classThis, _classExtraInitializers);
162
+ })();
163
+ return M008ConsistentStructure = _classThis;
164
+ })();
165
+ exports.M008ConsistentStructure = M008ConsistentStructure;
166
+ // M009: Module Communication Pattern
167
+ const m009Rule = (0, base_rule_1.createRule)('M009', 'Module Communication Pattern', 'Xác nhận modules communicate đúng cách (events, shared services)', enums_1.RuleCategory.STRUCTURE, 0.05, [enums_1.PatternType.MODULAR], {
168
+ codePatterns: [
169
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /EventEmitter/ },
170
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /Subject</ },
171
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /@Output\s*\(\)/ },
172
+ {
173
+ language: enums_1.Language.TYPESCRIPT,
174
+ type: enums_1.CodePatternType.PATTERN,
175
+ pattern: /@MessagePattern\s*\(/,
176
+ },
177
+ ],
178
+ }, { tags: ['modular', 'communication', 'events'] });
179
+ let M009ModuleCommunication = (() => {
180
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m009Rule)];
181
+ let _classDescriptor;
182
+ let _classExtraInitializers = [];
183
+ let _classThis;
184
+ let _classSuper = base_rule_1.BaseRule;
185
+ var M009ModuleCommunication = _classThis = class extends _classSuper {
186
+ constructor() {
187
+ super(...arguments);
188
+ this.rule = m009Rule;
189
+ }
190
+ };
191
+ __setFunctionName(_classThis, "M009ModuleCommunication");
192
+ (() => {
193
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
194
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
195
+ M009ModuleCommunication = _classThis = _classDescriptor.value;
196
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
197
+ __runInitializers(_classThis, _classExtraInitializers);
198
+ })();
199
+ return M009ModuleCommunication = _classThis;
200
+ })();
201
+ exports.M009ModuleCommunication = M009ModuleCommunication;
202
+ // M010: Module Boundary Enforcement
203
+ const m010Rule = (0, base_rule_1.createRule)('M010', 'Module Boundary Enforcement', 'Xác nhận module boundaries được enforce bằng tooling', enums_1.RuleCategory.QUALITY, 0.05, [enums_1.PatternType.MODULAR], {
204
+ configPatterns: [
205
+ { filePattern: 'nx.json' },
206
+ { filePattern: '.eslintrc*', contains: 'enforce-module-boundaries' },
207
+ { filePattern: '.eslintrc*', contains: 'no-restricted-paths' },
208
+ { filePattern: 'tsconfig*.json', contains: 'paths' },
209
+ ],
210
+ }, { tags: ['modular', 'boundary', 'tooling'] });
211
+ let M010BoundaryEnforcement = (() => {
212
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m010Rule)];
213
+ let _classDescriptor;
214
+ let _classExtraInitializers = [];
215
+ let _classThis;
216
+ let _classSuper = base_rule_1.BaseRule;
217
+ var M010BoundaryEnforcement = _classThis = class extends _classSuper {
218
+ constructor() {
219
+ super(...arguments);
220
+ this.rule = m010Rule;
221
+ }
222
+ };
223
+ __setFunctionName(_classThis, "M010BoundaryEnforcement");
224
+ (() => {
225
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
226
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
227
+ M010BoundaryEnforcement = _classThis = _classDescriptor.value;
228
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
229
+ __runInitializers(_classThis, _classExtraInitializers);
230
+ })();
231
+ return M010BoundaryEnforcement = _classThis;
232
+ })();
233
+ exports.M010BoundaryEnforcement = M010BoundaryEnforcement;
234
+ // M011: Module Testing Isolation
235
+ const m011Rule = (0, base_rule_1.createRule)('M011', 'Module Testing Isolation', 'Xác nhận mỗi module có tests riêng', enums_1.RuleCategory.QUALITY, 0.02, [enums_1.PatternType.MODULAR], {
236
+ filePatterns: ['*.spec.ts', '*.test.ts', '__tests__/*'],
237
+ }, { tags: ['modular', 'testing'] });
238
+ let M011TestingIsolation = (() => {
239
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m011Rule)];
240
+ let _classDescriptor;
241
+ let _classExtraInitializers = [];
242
+ let _classThis;
243
+ let _classSuper = base_rule_1.BaseRule;
244
+ var M011TestingIsolation = _classThis = class extends _classSuper {
245
+ constructor() {
246
+ super(...arguments);
247
+ this.rule = m011Rule;
248
+ }
249
+ };
250
+ __setFunctionName(_classThis, "M011TestingIsolation");
251
+ (() => {
252
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
253
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
254
+ M011TestingIsolation = _classThis = _classDescriptor.value;
255
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
256
+ __runInitializers(_classThis, _classExtraInitializers);
257
+ })();
258
+ return M011TestingIsolation = _classThis;
259
+ })();
260
+ exports.M011TestingIsolation = M011TestingIsolation;
261
+ // M012: Shared State Management
262
+ const m012Rule = (0, base_rule_1.createRule)('M012', 'Shared State Management', 'Xác nhận shared state được quản lý đúng cách', enums_1.RuleCategory.STRUCTURE, 0.03, [enums_1.PatternType.MODULAR], {
263
+ codePatterns: [
264
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /createStore/ },
265
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /configureStore/ },
266
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /@ngrx\/store/ },
267
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /BehaviorSubject/ },
268
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /defineStore/ },
269
+ ],
270
+ }, { tags: ['modular', 'state-management'] });
271
+ let M012SharedState = (() => {
272
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m012Rule)];
273
+ let _classDescriptor;
274
+ let _classExtraInitializers = [];
275
+ let _classThis;
276
+ let _classSuper = base_rule_1.BaseRule;
277
+ var M012SharedState = _classThis = class extends _classSuper {
278
+ constructor() {
279
+ super(...arguments);
280
+ this.rule = m012Rule;
281
+ }
282
+ };
283
+ __setFunctionName(_classThis, "M012SharedState");
284
+ (() => {
285
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
286
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
287
+ M012SharedState = _classThis = _classDescriptor.value;
288
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
289
+ __runInitializers(_classThis, _classExtraInitializers);
290
+ })();
291
+ return M012SharedState = _classThis;
292
+ })();
293
+ exports.M012SharedState = M012SharedState;
294
+ // M013: Module Documentation
295
+ const m013Rule = (0, base_rule_1.createRule)('M013', 'Module Documentation', 'Xác nhận modules có documentation', enums_1.RuleCategory.QUALITY, 0.01, [enums_1.PatternType.MODULAR], {
296
+ filePatterns: ['README.md', 'CHANGELOG.md'],
297
+ }, { tags: ['modular', 'documentation'] });
298
+ let M013ModuleDocumentation = (() => {
299
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m013Rule)];
300
+ let _classDescriptor;
301
+ let _classExtraInitializers = [];
302
+ let _classThis;
303
+ let _classSuper = base_rule_1.BaseRule;
304
+ var M013ModuleDocumentation = _classThis = class extends _classSuper {
305
+ constructor() {
306
+ super(...arguments);
307
+ this.rule = m013Rule;
308
+ }
309
+ };
310
+ __setFunctionName(_classThis, "M013ModuleDocumentation");
311
+ (() => {
312
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
313
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
314
+ M013ModuleDocumentation = _classThis = _classDescriptor.value;
315
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
316
+ __runInitializers(_classThis, _classExtraInitializers);
317
+ })();
318
+ return M013ModuleDocumentation = _classThis;
319
+ })();
320
+ exports.M013ModuleDocumentation = M013ModuleDocumentation;
321
+ // M014: Feature Flag/Toggle Support
322
+ const m014Rule = (0, base_rule_1.createRule)('M014', 'Feature Flag/Toggle Support', 'Xác nhận có feature flag mechanism cho modules', enums_1.RuleCategory.BONUS, 0.01, [enums_1.PatternType.MODULAR], {
323
+ codePatterns: [
324
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
325
+ { language: 'all', type: enums_1.CodePatternType.PATTERN, pattern: /featureFlag/i },
326
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
327
+ { language: 'all', type: enums_1.CodePatternType.PATTERN, pattern: /isEnabled\s*\(/ },
328
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
329
+ { language: 'all', type: enums_1.CodePatternType.PATTERN, pattern: /toggleFeature/i },
330
+ ],
331
+ configPatterns: [{ filePattern: '*feature*flag*' }],
332
+ }, { tags: ['modular', 'feature-flags'] });
333
+ let M014FeatureFlags = (() => {
334
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(m014Rule)];
335
+ let _classDescriptor;
336
+ let _classExtraInitializers = [];
337
+ let _classThis;
338
+ let _classSuper = base_rule_1.BaseRule;
339
+ var M014FeatureFlags = _classThis = class extends _classSuper {
340
+ constructor() {
341
+ super(...arguments);
342
+ this.rule = m014Rule;
343
+ }
344
+ };
345
+ __setFunctionName(_classThis, "M014FeatureFlags");
346
+ (() => {
347
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
348
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
349
+ M014FeatureFlags = _classThis = _classDescriptor.value;
350
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
351
+ __runInitializers(_classThis, _classExtraInitializers);
352
+ })();
353
+ return M014FeatureFlags = _classThis;
354
+ })();
355
+ exports.M014FeatureFlags = M014FeatureFlags;
356
+ // All classes are exported inline with their declarations
357
+ //# sourceMappingURL=modular-rules-collection.js.map
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Presentation Rules Index
4
+ * Export tất cả Presentation (MVVM/VIPER) rules (PR001-PR016)
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("./pr001-view-layer"), exports);
22
+ __exportStar(require("./pr002-presentation-logic"), exports);
23
+ __exportStar(require("./pr004-data-binding"), exports);
24
+ __exportStar(require("./pr006-router-layer"), exports);
25
+ __exportStar(require("./pr007-interactor-layer"), exports);
26
+ __exportStar(require("./presentation-rules-collection"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ /**
3
+ * PR001: View Layer Exists
4
+ * Xác nhận có tầng View tách biệt
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.PR001ViewLayer = 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
+ const rule = (0, base_rule_1.createRule)('PR001', 'View Layer Exists', 'Xác nhận có tầng View tách biệt (Views, Screens, Pages, Components)', enums_1.RuleCategory.CORE, 0.08, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
50
+ folderPatterns: ['views', 'screens', 'pages', 'ui', 'presentation', 'View', 'Screens'],
51
+ filePatterns: [
52
+ '*View.*',
53
+ '*Screen.*',
54
+ '*Page.*',
55
+ '*Activity.*',
56
+ '*Fragment.*',
57
+ '*ViewController.*',
58
+ '*Component.*',
59
+ ],
60
+ codePatterns: [
61
+ // Android
62
+ {
63
+ language: enums_1.Language.KOTLIN,
64
+ type: enums_1.CodePatternType.CLASS,
65
+ pattern: /class\s+\w+Activity\s*:\s*AppCompatActivity/,
66
+ },
67
+ {
68
+ language: enums_1.Language.KOTLIN,
69
+ type: enums_1.CodePatternType.CLASS,
70
+ pattern: /class\s+\w+Fragment\s*:\s*Fragment/,
71
+ },
72
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.ANNOTATION, pattern: /@Composable\s+fun/ },
73
+ // iOS
74
+ {
75
+ language: enums_1.Language.SWIFT,
76
+ type: enums_1.CodePatternType.CLASS,
77
+ pattern: /class\s+\w+ViewController\s*:\s*UIViewController/,
78
+ },
79
+ {
80
+ language: enums_1.Language.SWIFT,
81
+ type: enums_1.CodePatternType.PATTERN,
82
+ pattern: /struct\s+\w+View\s*:\s*View/,
83
+ },
84
+ // Flutter
85
+ {
86
+ language: enums_1.Language.DART,
87
+ type: enums_1.CodePatternType.CLASS,
88
+ pattern: /class\s+\w+\s+extends\s+StatefulWidget/,
89
+ },
90
+ {
91
+ language: enums_1.Language.DART,
92
+ type: enums_1.CodePatternType.CLASS,
93
+ pattern: /class\s+\w+\s+extends\s+StatelessWidget/,
94
+ },
95
+ // React/Vue
96
+ {
97
+ language: enums_1.Language.TYPESCRIPT,
98
+ type: enums_1.CodePatternType.PATTERN,
99
+ pattern: /function\s+\w+\s*\([^)]*\)\s*:\s*JSX\.Element/,
100
+ },
101
+ {
102
+ language: enums_1.Language.TYPESCRIPT,
103
+ type: enums_1.CodePatternType.ANNOTATION,
104
+ pattern: /@Component\s*\(/,
105
+ },
106
+ // WPF
107
+ {
108
+ language: enums_1.Language.CSHARP,
109
+ type: enums_1.CodePatternType.PATTERN,
110
+ pattern: /partial\s+class\s+\w+\s*:\s*Window/,
111
+ },
112
+ ],
113
+ }, {
114
+ tags: ['presentation', 'view', 'ui'],
115
+ });
116
+ let PR001ViewLayer = (() => {
117
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(rule)];
118
+ let _classDescriptor;
119
+ let _classExtraInitializers = [];
120
+ let _classThis;
121
+ let _classSuper = base_rule_1.BaseRule;
122
+ var PR001ViewLayer = _classThis = class extends _classSuper {
123
+ constructor() {
124
+ super(...arguments);
125
+ this.rule = rule;
126
+ }
127
+ async customDetection(context) {
128
+ const matches = [];
129
+ let hasFolders = false;
130
+ let hasFiles = false;
131
+ let hasCode = false;
132
+ // Check for view folders
133
+ const viewFolders = ['views', 'screens', 'pages', 'ui', 'presentation', 'components'];
134
+ for (const folder of viewFolders) {
135
+ const found = context.files.some((f) => f.relativePath.toLowerCase().includes(`/${folder}/`) ||
136
+ f.relativePath.toLowerCase().startsWith(`${folder}/`));
137
+ if (found) {
138
+ matches.push({
139
+ type: enums_1.MatchType.FOLDER,
140
+ path: folder,
141
+ matchedPattern: 'View folder',
142
+ });
143
+ hasFolders = true;
144
+ }
145
+ }
146
+ // Check for view files
147
+ const viewFiles = context.files.filter((f) => /View\.(ts|tsx|js|jsx|swift|kt|dart)$/i.test(f.fileName) ||
148
+ /Screen\.(ts|tsx|js|jsx|swift|kt|dart)$/i.test(f.fileName) ||
149
+ /Page\.(ts|tsx|js|jsx|swift|kt|dart)$/i.test(f.fileName) ||
150
+ /Activity\.(kt|java)$/i.test(f.fileName) ||
151
+ /Fragment\.(kt|java)$/i.test(f.fileName) ||
152
+ /ViewController\.swift$/i.test(f.fileName) ||
153
+ /\.vue$/i.test(f.fileName));
154
+ if (viewFiles.length > 0) {
155
+ for (const file of viewFiles.slice(0, 5)) {
156
+ matches.push({
157
+ type: enums_1.MatchType.FILE,
158
+ path: file.relativePath,
159
+ matchedPattern: 'View file',
160
+ });
161
+ }
162
+ hasFiles = true;
163
+ }
164
+ // Check for code patterns
165
+ const sourceFiles = context.files
166
+ .filter((f) => !f.isTest && !f.isConfig && f.language)
167
+ .slice(0, 50);
168
+ const codePatterns = [
169
+ /@Composable\s+fun/,
170
+ /struct\s+\w+View\s*:\s*View/,
171
+ /class\s+\w+ViewController/,
172
+ /extends\s+(StatefulWidget|StatelessWidget)/,
173
+ /<template>/,
174
+ ];
175
+ for (const file of sourceFiles) {
176
+ try {
177
+ const content = await context.helpers.readFile(file.absolutePath);
178
+ for (const pattern of codePatterns) {
179
+ if (pattern.test(content)) {
180
+ hasCode = true;
181
+ matches.push({
182
+ type: enums_1.MatchType.CODE,
183
+ path: file.relativePath,
184
+ matchedPattern: 'View pattern',
185
+ });
186
+ break;
187
+ }
188
+ }
189
+ if (hasCode && matches.length >= 10)
190
+ break;
191
+ }
192
+ catch {
193
+ // Skip
194
+ }
195
+ }
196
+ // Calculate score
197
+ let score = 0;
198
+ if (hasFolders && hasFiles)
199
+ score = 1;
200
+ else if (hasFiles)
201
+ score = 0.7;
202
+ else if (hasCode)
203
+ score = 0.6;
204
+ else if (hasFolders)
205
+ score = 0.4;
206
+ return { matches, violations: [], score };
207
+ }
208
+ };
209
+ __setFunctionName(_classThis, "PR001ViewLayer");
210
+ (() => {
211
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
212
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
213
+ PR001ViewLayer = _classThis = _classDescriptor.value;
214
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
215
+ __runInitializers(_classThis, _classExtraInitializers);
216
+ })();
217
+ return PR001ViewLayer = _classThis;
218
+ })();
219
+ exports.PR001ViewLayer = PR001ViewLayer;
220
+ exports.default = PR001ViewLayer;
221
+ //# sourceMappingURL=pr001-view-layer.js.map