@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,507 @@
1
+ "use strict";
2
+ /**
3
+ * Presentation Rules Collection
4
+ * Định nghĩa các rules còn lại (PR003, PR005, PR008-PR016)
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.PR016SideEffects = exports.PR015UiSeparation = exports.PR014ErrorHandling = exports.PR013Testing = exports.PR012Navigation = exports.PR011DependencyInjection = exports.PR010StateManagement = exports.PR009ViewPassive = exports.PR008ViperStructure = exports.PR005ObservableState = exports.PR003ModelLayer = 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
+ // PR003: Model/Entity Layer Exists
50
+ const pr003Rule = (0, base_rule_1.createRule)('PR003', 'Model/Entity Layer Exists', 'Xác nhận có data models thuần túy', enums_1.RuleCategory.CORE, 0.08, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
51
+ folderPatterns: ['models', 'entities', 'domain', 'data', 'Models', 'Entities'],
52
+ filePatterns: ['*Model.*', '*Entity.*', '*Data.*', '*DTO.*'],
53
+ }, { tags: ['presentation', 'model'] });
54
+ let PR003ModelLayer = (() => {
55
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr003Rule)];
56
+ let _classDescriptor;
57
+ let _classExtraInitializers = [];
58
+ let _classThis;
59
+ let _classSuper = base_rule_1.BaseRule;
60
+ var PR003ModelLayer = _classThis = class extends _classSuper {
61
+ constructor() {
62
+ super(...arguments);
63
+ this.rule = pr003Rule;
64
+ }
65
+ };
66
+ __setFunctionName(_classThis, "PR003ModelLayer");
67
+ (() => {
68
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
69
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
70
+ PR003ModelLayer = _classThis = _classDescriptor.value;
71
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
72
+ __runInitializers(_classThis, _classExtraInitializers);
73
+ })();
74
+ return PR003ModelLayer = _classThis;
75
+ })();
76
+ exports.PR003ModelLayer = PR003ModelLayer;
77
+ // PR005: Observable State Pattern (MVVM)
78
+ const pr005Rule = (0, base_rule_1.createRule)('PR005', 'Observable State Pattern', 'Xác nhận ViewModel expose observable state', enums_1.RuleCategory.CORE, 0.08, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM], {
79
+ codePatterns: [
80
+ // Android/Kotlin - StateFlow
81
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /StateFlow</ },
82
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /MutableStateFlow</ },
83
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /asStateFlow\(\)/ },
84
+ // Android/Kotlin - LiveData
85
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /LiveData</ },
86
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /MutableLiveData</ },
87
+ // Android/Kotlin - Flow
88
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /\.collect\s*\{/ },
89
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /collectAsState/ },
90
+ // iOS/Swift
91
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.ANNOTATION, pattern: /@Published/ },
92
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.ANNOTATION, pattern: /@StateObject/ },
93
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.ANNOTATION, pattern: /@ObservedObject/ },
94
+ // Flutter/Dart
95
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /Stream</ },
96
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /StreamBuilder/ },
97
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /ValueNotifier/ },
98
+ ],
99
+ }, { tags: ['presentation', 'mvvm', 'observable'] });
100
+ let PR005ObservableState = (() => {
101
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr005Rule)];
102
+ let _classDescriptor;
103
+ let _classExtraInitializers = [];
104
+ let _classThis;
105
+ let _classSuper = base_rule_1.BaseRule;
106
+ var PR005ObservableState = _classThis = class extends _classSuper {
107
+ constructor() {
108
+ super(...arguments);
109
+ this.rule = pr005Rule;
110
+ }
111
+ };
112
+ __setFunctionName(_classThis, "PR005ObservableState");
113
+ (() => {
114
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
115
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
116
+ PR005ObservableState = _classThis = _classDescriptor.value;
117
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
118
+ __runInitializers(_classThis, _classExtraInitializers);
119
+ })();
120
+ return PR005ObservableState = _classThis;
121
+ })();
122
+ exports.PR005ObservableState = PR005ObservableState;
123
+ // PR008: VIPER Full Structure per Feature
124
+ const pr008Rule = (0, base_rule_1.createRule)('PR008', 'VIPER Full Structure per Feature', 'Xác nhận có đủ 5 components VIPER trong mỗi feature', enums_1.RuleCategory.STRUCTURE, 0.06, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.VIPER], {
125
+ filePatterns: ['*View.*', '*Interactor.*', '*Presenter.*', '*Entity.*', '*Router.*'],
126
+ }, { requires: ['PR006', 'PR007'], tags: ['presentation', 'viper', 'structure'] });
127
+ let PR008ViperStructure = (() => {
128
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr008Rule)];
129
+ let _classDescriptor;
130
+ let _classExtraInitializers = [];
131
+ let _classThis;
132
+ let _classSuper = base_rule_1.BaseRule;
133
+ var PR008ViperStructure = _classThis = class extends _classSuper {
134
+ constructor() {
135
+ super(...arguments);
136
+ this.rule = pr008Rule;
137
+ }
138
+ async customDetection(context) {
139
+ const matches = [];
140
+ // VIPER components - Router/WireFrame are alternatives
141
+ const viperComponents = [
142
+ { name: 'View', patterns: [/View\.(swift|kt|java)$/i] },
143
+ { name: 'Interactor', patterns: [/Interactor\.(swift|kt|java)$/i] },
144
+ { name: 'Presenter', patterns: [/Presenter\.(swift|kt|java)$/i] },
145
+ { name: 'Entity', patterns: [/Entity\.(swift|kt|java)$/i, /Model\.(swift|kt|java)$/i] },
146
+ {
147
+ name: 'Router',
148
+ patterns: [
149
+ /Router\.(swift|kt|java)$/i,
150
+ /WireFrame\.(swift|kt|java)$/i,
151
+ /Wireframe\.(swift|kt|java)$/i,
152
+ ],
153
+ },
154
+ ];
155
+ const foundComponents = new Set();
156
+ for (const file of context.files) {
157
+ for (const comp of viperComponents) {
158
+ for (const pattern of comp.patterns) {
159
+ if (pattern.test(file.fileName)) {
160
+ foundComponents.add(comp.name);
161
+ break;
162
+ }
163
+ }
164
+ }
165
+ }
166
+ const score = foundComponents.size / viperComponents.length;
167
+ matches.push({
168
+ type: enums_1.MatchType.FILE,
169
+ path: '',
170
+ matchedPattern: `VIPER components: ${Array.from(foundComponents).join(', ')}`,
171
+ });
172
+ return { matches, violations: [], score };
173
+ }
174
+ };
175
+ __setFunctionName(_classThis, "PR008ViperStructure");
176
+ (() => {
177
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
178
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
179
+ PR008ViperStructure = _classThis = _classDescriptor.value;
180
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
181
+ __runInitializers(_classThis, _classExtraInitializers);
182
+ })();
183
+ return PR008ViperStructure = _classThis;
184
+ })();
185
+ exports.PR008ViperStructure = PR008ViperStructure;
186
+ // PR009: View is Passive
187
+ const pr009Rule = (0, base_rule_1.createRule)('PR009', 'View is Passive', 'Xác nhận View không chứa business logic', enums_1.RuleCategory.QUALITY, 0.04, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {}, { tags: ['presentation', 'quality'] });
188
+ let PR009ViewPassive = (() => {
189
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr009Rule)];
190
+ let _classDescriptor;
191
+ let _classExtraInitializers = [];
192
+ let _classThis;
193
+ let _classSuper = base_rule_1.BaseRule;
194
+ var PR009ViewPassive = _classThis = class extends _classSuper {
195
+ constructor() {
196
+ super(...arguments);
197
+ this.rule = pr009Rule;
198
+ }
199
+ async customDetection(_context) {
200
+ // Simplified check
201
+ return { matches: [], violations: [], score: 0.5 };
202
+ }
203
+ };
204
+ __setFunctionName(_classThis, "PR009ViewPassive");
205
+ (() => {
206
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
207
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
208
+ PR009ViewPassive = _classThis = _classDescriptor.value;
209
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
210
+ __runInitializers(_classThis, _classExtraInitializers);
211
+ })();
212
+ return PR009ViewPassive = _classThis;
213
+ })();
214
+ exports.PR009ViewPassive = PR009ViewPassive;
215
+ // PR010: State Management Pattern
216
+ const pr010Rule = (0, base_rule_1.createRule)('PR010', 'State Management Pattern', 'Xác nhận có state management pattern rõ ràng', enums_1.RuleCategory.STRUCTURE, 0.06, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
217
+ codePatterns: [
218
+ // Android/Kotlin
219
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /StateFlow</ },
220
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /MutableStateFlow</ },
221
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /LiveData</ },
222
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /MutableLiveData</ },
223
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /UiState/ },
224
+ // Web/TypeScript
225
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /createStore/ },
226
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /useSelector/ },
227
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /defineStore/ },
228
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /useState/ },
229
+ // Flutter/Dart
230
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /BlocProvider/ },
231
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /flutter_bloc/ },
232
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /ChangeNotifier/ },
233
+ // iOS/Swift
234
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.ANNOTATION, pattern: /@Published/ },
235
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.PATTERN, pattern: /ObservableObject/ },
236
+ ],
237
+ }, { tags: ['presentation', 'state-management'] });
238
+ let PR010StateManagement = (() => {
239
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr010Rule)];
240
+ let _classDescriptor;
241
+ let _classExtraInitializers = [];
242
+ let _classThis;
243
+ let _classSuper = base_rule_1.BaseRule;
244
+ var PR010StateManagement = _classThis = class extends _classSuper {
245
+ constructor() {
246
+ super(...arguments);
247
+ this.rule = pr010Rule;
248
+ }
249
+ };
250
+ __setFunctionName(_classThis, "PR010StateManagement");
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
+ PR010StateManagement = _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 PR010StateManagement = _classThis;
259
+ })();
260
+ exports.PR010StateManagement = PR010StateManagement;
261
+ // PR011: DI in Presentation
262
+ const pr011Rule = (0, base_rule_1.createRule)('PR011', 'Dependency Injection in Presentation', 'Xác nhận có DI cho ViewModel/Presenter', enums_1.RuleCategory.QUALITY, 0.04, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
263
+ codePatterns: [
264
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.ANNOTATION, pattern: /@HiltViewModel/ },
265
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.ANNOTATION, pattern: /@Inject/ },
266
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.PATTERN, pattern: /Resolver/ },
267
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /get_it/ },
268
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.ANNOTATION, pattern: /@injectable/ },
269
+ ],
270
+ }, { tags: ['presentation', 'di'] });
271
+ let PR011DependencyInjection = (() => {
272
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr011Rule)];
273
+ let _classDescriptor;
274
+ let _classExtraInitializers = [];
275
+ let _classThis;
276
+ let _classSuper = base_rule_1.BaseRule;
277
+ var PR011DependencyInjection = _classThis = class extends _classSuper {
278
+ constructor() {
279
+ super(...arguments);
280
+ this.rule = pr011Rule;
281
+ }
282
+ };
283
+ __setFunctionName(_classThis, "PR011DependencyInjection");
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
+ PR011DependencyInjection = _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 PR011DependencyInjection = _classThis;
292
+ })();
293
+ exports.PR011DependencyInjection = PR011DependencyInjection;
294
+ // PR012: Navigation Pattern
295
+ const pr012Rule = (0, base_rule_1.createRule)('PR012', 'Navigation Pattern', 'Xác nhận có navigation pattern rõ ràng', enums_1.RuleCategory.STRUCTURE, 0.04, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
296
+ codePatterns: [
297
+ // Android/Kotlin - Navigation Component
298
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /NavController/ },
299
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /findNavController/ },
300
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /NavHost/ },
301
+ // Android/Kotlin - Traditional
302
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /startActivity\s*\(/ },
303
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /Intent\s*\(/ },
304
+ // Android/Java
305
+ { language: enums_1.Language.JAVA, type: enums_1.CodePatternType.PATTERN, pattern: /startActivity\s*\(/ },
306
+ { language: enums_1.Language.JAVA, type: enums_1.CodePatternType.PATTERN, pattern: /Intent\s*\(/ },
307
+ // iOS/Swift
308
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.PATTERN, pattern: /NavigationStack/ },
309
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.PATTERN, pattern: /NavigationLink/ },
310
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.PATTERN, pattern: /pushViewController/ },
311
+ // Flutter/Dart
312
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /GoRouter/ },
313
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /Navigator\.push/ },
314
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.PATTERN, pattern: /Navigator\.of/ },
315
+ // Web/TypeScript
316
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /useNavigate/ },
317
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /useRouter/ },
318
+ ],
319
+ }, { tags: ['presentation', 'navigation'] });
320
+ let PR012Navigation = (() => {
321
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr012Rule)];
322
+ let _classDescriptor;
323
+ let _classExtraInitializers = [];
324
+ let _classThis;
325
+ let _classSuper = base_rule_1.BaseRule;
326
+ var PR012Navigation = _classThis = class extends _classSuper {
327
+ constructor() {
328
+ super(...arguments);
329
+ this.rule = pr012Rule;
330
+ }
331
+ };
332
+ __setFunctionName(_classThis, "PR012Navigation");
333
+ (() => {
334
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
335
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
336
+ PR012Navigation = _classThis = _classDescriptor.value;
337
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
338
+ __runInitializers(_classThis, _classExtraInitializers);
339
+ })();
340
+ return PR012Navigation = _classThis;
341
+ })();
342
+ exports.PR012Navigation = PR012Navigation;
343
+ // PR013: ViewModel/Presenter Testing
344
+ const pr013Rule = (0, base_rule_1.createRule)('PR013', 'ViewModel/Presenter Testing', 'Xác nhận ViewModel/Presenter có unit tests', enums_1.RuleCategory.QUALITY, 0.02, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
345
+ filePatterns: [
346
+ '*ViewModelTest.*',
347
+ '*PresenterTest.*',
348
+ '*ViewModel.test.*',
349
+ '*Presenter.spec.*',
350
+ ],
351
+ }, { tags: ['presentation', 'testing'] });
352
+ let PR013Testing = (() => {
353
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr013Rule)];
354
+ let _classDescriptor;
355
+ let _classExtraInitializers = [];
356
+ let _classThis;
357
+ let _classSuper = base_rule_1.BaseRule;
358
+ var PR013Testing = _classThis = class extends _classSuper {
359
+ constructor() {
360
+ super(...arguments);
361
+ this.rule = pr013Rule;
362
+ }
363
+ };
364
+ __setFunctionName(_classThis, "PR013Testing");
365
+ (() => {
366
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
367
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
368
+ PR013Testing = _classThis = _classDescriptor.value;
369
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
370
+ __runInitializers(_classThis, _classExtraInitializers);
371
+ })();
372
+ return PR013Testing = _classThis;
373
+ })();
374
+ exports.PR013Testing = PR013Testing;
375
+ // PR014: Error Handling in Presentation
376
+ const pr014Rule = (0, base_rule_1.createRule)('PR014', 'Error Handling in Presentation', 'Xác nhận có error handling trong presentation layer', enums_1.RuleCategory.QUALITY, 0.03, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
377
+ codePatterns: [
378
+ {
379
+ language: enums_1.Language.KOTLIN,
380
+ type: enums_1.CodePatternType.PATTERN,
381
+ pattern: /sealed\s+class\s+\w+UiState/,
382
+ },
383
+ { language: enums_1.Language.KOTLIN, type: enums_1.CodePatternType.PATTERN, pattern: /is\s+\w+\.Error/ },
384
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.PATTERN, pattern: /case\s+error/ },
385
+ { language: enums_1.Language.DART, type: enums_1.CodePatternType.ANNOTATION, pattern: /@freezed/ },
386
+ ],
387
+ }, { tags: ['presentation', 'error-handling'] });
388
+ let PR014ErrorHandling = (() => {
389
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr014Rule)];
390
+ let _classDescriptor;
391
+ let _classExtraInitializers = [];
392
+ let _classThis;
393
+ let _classSuper = base_rule_1.BaseRule;
394
+ var PR014ErrorHandling = _classThis = class extends _classSuper {
395
+ constructor() {
396
+ super(...arguments);
397
+ this.rule = pr014Rule;
398
+ }
399
+ };
400
+ __setFunctionName(_classThis, "PR014ErrorHandling");
401
+ (() => {
402
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
403
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
404
+ PR014ErrorHandling = _classThis = _classDescriptor.value;
405
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
406
+ __runInitializers(_classThis, _classExtraInitializers);
407
+ })();
408
+ return PR014ErrorHandling = _classThis;
409
+ })();
410
+ exports.PR014ErrorHandling = PR014ErrorHandling;
411
+ // PR015: UI/UX Layer Separation
412
+ const pr015Rule = (0, base_rule_1.createRule)('PR015', 'UI/UX Layer Separation', 'Xác nhận UI components tách biệt khỏi logic', enums_1.RuleCategory.QUALITY, 0.03, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
413
+ folderPatterns: [
414
+ // Common
415
+ 'components/ui',
416
+ 'components/common',
417
+ 'ui/components',
418
+ 'widgets',
419
+ // Android
420
+ 'ui',
421
+ 'presentation',
422
+ 'feature',
423
+ 'screen',
424
+ 'view',
425
+ 'ui/theme',
426
+ 'ui/component',
427
+ 'ui/screen',
428
+ // iOS
429
+ 'Views',
430
+ 'Screens',
431
+ 'Components',
432
+ // Web
433
+ 'components',
434
+ 'views',
435
+ 'pages',
436
+ ],
437
+ }, { tags: ['presentation', 'ui', 'separation'] });
438
+ let PR015UiSeparation = (() => {
439
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr015Rule)];
440
+ let _classDescriptor;
441
+ let _classExtraInitializers = [];
442
+ let _classThis;
443
+ let _classSuper = base_rule_1.BaseRule;
444
+ var PR015UiSeparation = _classThis = class extends _classSuper {
445
+ constructor() {
446
+ super(...arguments);
447
+ this.rule = pr015Rule;
448
+ }
449
+ };
450
+ __setFunctionName(_classThis, "PR015UiSeparation");
451
+ (() => {
452
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
453
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
454
+ PR015UiSeparation = _classThis = _classDescriptor.value;
455
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
456
+ __runInitializers(_classThis, _classExtraInitializers);
457
+ })();
458
+ return PR015UiSeparation = _classThis;
459
+ })();
460
+ exports.PR015UiSeparation = PR015UiSeparation;
461
+ // PR016: Side Effect Management
462
+ const pr016Rule = (0, base_rule_1.createRule)('PR016', 'Side Effect Management', 'Xác nhận side effects được quản lý đúng cách', enums_1.RuleCategory.QUALITY, 0.02, [enums_1.PatternType.PRESENTATION, enums_1.PatternType.MVVM, enums_1.PatternType.VIPER], {
463
+ codePatterns: [
464
+ {
465
+ language: enums_1.Language.TYPESCRIPT,
466
+ type: enums_1.CodePatternType.PATTERN,
467
+ pattern: /useEffect\s*\(\s*\(\)\s*=>/,
468
+ },
469
+ { language: enums_1.Language.TYPESCRIPT, type: enums_1.CodePatternType.PATTERN, pattern: /takeUntil\s*\(/ },
470
+ { language: enums_1.Language.SWIFT, type: enums_1.CodePatternType.PATTERN, pattern: /cancellables/ },
471
+ {
472
+ language: enums_1.Language.KOTLIN,
473
+ type: enums_1.CodePatternType.PATTERN,
474
+ pattern: /viewModelScope\.launch/,
475
+ },
476
+ {
477
+ language: enums_1.Language.DART,
478
+ type: enums_1.CodePatternType.PATTERN,
479
+ pattern: /@override\s+void\s+dispose/,
480
+ },
481
+ ],
482
+ }, { tags: ['presentation', 'side-effects'] });
483
+ let PR016SideEffects = (() => {
484
+ let _classDecorators = [(0, rule_registry_1.RegisterRule)(pr016Rule)];
485
+ let _classDescriptor;
486
+ let _classExtraInitializers = [];
487
+ let _classThis;
488
+ let _classSuper = base_rule_1.BaseRule;
489
+ var PR016SideEffects = _classThis = class extends _classSuper {
490
+ constructor() {
491
+ super(...arguments);
492
+ this.rule = pr016Rule;
493
+ }
494
+ };
495
+ __setFunctionName(_classThis, "PR016SideEffects");
496
+ (() => {
497
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
498
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
499
+ PR016SideEffects = _classThis = _classDescriptor.value;
500
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
501
+ __runInitializers(_classThis, _classExtraInitializers);
502
+ })();
503
+ return PR016SideEffects = _classThis;
504
+ })();
505
+ exports.PR016SideEffects = PR016SideEffects;
506
+ // All classes are exported inline with their declarations
507
+ //# sourceMappingURL=presentation-rules-collection.js.map
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * Project Scanner Rules Index
4
+ * Export tất cả Project Scanner rules (PS001-PS010)
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("./ps001-project-root"), exports);
22
+ __exportStar(require("./ps002-language-detection"), exports);
23
+ __exportStar(require("./ps003-framework-detection"), exports);
24
+ __exportStar(require("./ps004-build-system"), exports);
25
+ __exportStar(require("./ps005-source-directory"), exports);
26
+ __exportStar(require("./ps006-test-directory"), exports);
27
+ __exportStar(require("./ps007-documentation"), exports);
28
+ __exportStar(require("./ps008-cicd-detection"), exports);
29
+ __exportStar(require("./ps009-code-quality"), exports);
30
+ __exportStar(require("./ps010-statistics"), exports);
31
+ //# sourceMappingURL=index.js.map