viberadar 0.3.231 → 0.3.232

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.
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildMicroservicesReport = buildMicroservicesReport;
37
+ const fs = __importStar(require("fs"));
38
+ const BUDGETS = {
39
+ largeKb: 50,
40
+ largeLines: 1200,
41
+ godKb: 150,
42
+ godLines: 3000,
43
+ criticalKb: 300,
44
+ criticalLines: 6000,
45
+ };
46
+ const ARTIFACT_PATH_PATTERNS = [
47
+ /^artifacts\//,
48
+ /^temp\//,
49
+ /^tmp\//,
50
+ /^test-results\//,
51
+ /^playwright-report\//,
52
+ /^coverage\//,
53
+ /^dist\//,
54
+ /^build\//,
55
+ /^\.cache\//,
56
+ /^\.next\//,
57
+ /^\.viberadar\//,
58
+ ];
59
+ function normalizePath(p) {
60
+ return p.replace(/\\/g, '/');
61
+ }
62
+ function isArtifactPath(relativePath) {
63
+ const p = normalizePath(relativePath);
64
+ return ARTIFACT_PATH_PATTERNS.some(re => re.test(p));
65
+ }
66
+ function countLines(filePath) {
67
+ try {
68
+ const raw = fs.readFileSync(filePath, 'utf-8');
69
+ if (!raw)
70
+ return 0;
71
+ return raw.split(/\r?\n/).length;
72
+ }
73
+ catch {
74
+ return 0;
75
+ }
76
+ }
77
+ function sizeCategory(sizeKb, lineCount) {
78
+ if (sizeKb >= BUDGETS.criticalKb || lineCount >= BUDGETS.criticalLines)
79
+ return 'critical';
80
+ if (sizeKb >= BUDGETS.godKb || lineCount >= BUDGETS.godLines)
81
+ return 'god';
82
+ if (sizeKb >= BUDGETS.largeKb || lineCount >= BUDGETS.largeLines)
83
+ return 'large';
84
+ return 'normal';
85
+ }
86
+ function pathHasAny(p, words) {
87
+ return words.some(w => p.includes(w));
88
+ }
89
+ function boundaryHintsForModule(m) {
90
+ const p = normalizePath(m.relativePath).toLowerCase();
91
+ const hints = [];
92
+ if (pathHasAny(p, ['/routes/', '.routes.', '/api/']))
93
+ hints.push('route/api');
94
+ if (pathHasAny(p, ['/worker', '/workers/', '/jobs/', '/queues/', '/cron/']))
95
+ hints.push('worker');
96
+ if (pathHasAny(p, ['service.ts', '-service.ts', '/services/', '.service.']))
97
+ hints.push('service');
98
+ if (pathHasAny(p, ['/repositories/', '.repository.', '/db', 'database', 'schema']))
99
+ hints.push('persistence');
100
+ if (pathHasAny(p, ['/shared/', '/contracts/', '.port.', '/ports/']))
101
+ hints.push('contract/shared');
102
+ if (m.type === 'component')
103
+ hints.push('ui');
104
+ return Array.from(new Set(hints));
105
+ }
106
+ function risk(code, label, severity) {
107
+ return { code, label, severity };
108
+ }
109
+ function fileRisks(m, category, dependencyCount, hints) {
110
+ const risks = [];
111
+ if (category === 'critical')
112
+ risks.push(risk('critical-size', 'critical size budget exceeded', 'high'));
113
+ else if (category === 'god')
114
+ risks.push(risk('god-size', 'god file size budget exceeded', 'high'));
115
+ else if (category === 'large')
116
+ risks.push(risk('large-size', 'large file budget exceeded', 'medium'));
117
+ if (!m.featureKeys || m.featureKeys.length === 0)
118
+ risks.push(risk('unknown-owner', 'no feature ownership', 'medium'));
119
+ if (m.featureKeys && m.featureKeys.length > 1)
120
+ risks.push(risk('multi-feature', 'cross-feature ownership', 'high'));
121
+ if (!m.hasTests)
122
+ risks.push(risk('missing-tests', 'missing linked tests', 'medium'));
123
+ if (m.testStale)
124
+ risks.push(risk('stale-tests', 'tests older than source', 'medium'));
125
+ if (dependencyCount >= 16)
126
+ risks.push(risk('high-coupling', 'many import dependencies', 'high'));
127
+ else if (dependencyCount >= 10)
128
+ risks.push(risk('medium-coupling', 'elevated import dependencies', 'medium'));
129
+ if (hints.includes('persistence') && (!m.featureKeys || m.featureKeys.length !== 1)) {
130
+ risks.push(risk('data-ownership', 'data ownership boundary unclear', 'high'));
131
+ }
132
+ return risks;
133
+ }
134
+ function clampScore(n) {
135
+ return Math.max(0, Math.min(100, Math.round(n)));
136
+ }
137
+ function readinessTier(score) {
138
+ if (score >= 70)
139
+ return 'ready';
140
+ if (score < 40)
141
+ return 'risky';
142
+ return 'watch';
143
+ }
144
+ function categoryWeight(category) {
145
+ if (category === 'critical')
146
+ return 4;
147
+ if (category === 'god')
148
+ return 3;
149
+ if (category === 'large')
150
+ return 2;
151
+ return 1;
152
+ }
153
+ function textMatchesKey(text, key) {
154
+ const a = text.toLowerCase().replace(/[^a-z0-9а-яё]+/gi, '');
155
+ const b = key.toLowerCase().replace(/[^a-z0-9а-яё]+/gi, '');
156
+ return !!a && !!b && (a.includes(b) || b.includes(a));
157
+ }
158
+ function matchingServiceNodes(feature, serviceMap) {
159
+ if (!serviceMap)
160
+ return [];
161
+ return serviceMap.nodes
162
+ .filter(n => textMatchesKey(`${n.id} ${n.label} ${n.group || ''}`, `${feature.key} ${feature.label}`))
163
+ .map(n => n.label || n.id);
164
+ }
165
+ function matchingPipelines(feature, serviceMap) {
166
+ if (!serviceMap)
167
+ return [];
168
+ return serviceMap.pipelines
169
+ .filter(p => textMatchesKey(`${p.id} ${p.label} ${p.description || ''}`, `${feature.key} ${feature.label}`))
170
+ .map(p => p.id);
171
+ }
172
+ function observabilityScore(featureKey, observability) {
173
+ if (!observability?.byFeature)
174
+ return 55;
175
+ const f = observability.byFeature.find(x => x.key === featureKey);
176
+ if (!f)
177
+ return 55;
178
+ return clampScore(f.score);
179
+ }
180
+ function topRiskLabels(files) {
181
+ const counts = new Map();
182
+ for (const f of files) {
183
+ for (const r of f.risks) {
184
+ const prev = counts.get(r.code) || { label: r.label, count: 0 };
185
+ prev.count += 1;
186
+ counts.set(r.code, prev);
187
+ }
188
+ }
189
+ return Array.from(counts.values())
190
+ .sort((a, b) => b.count - a.count)
191
+ .slice(0, 4)
192
+ .map(x => `${x.label}: ${x.count}`);
193
+ }
194
+ function buildUnknownModule(files) {
195
+ if (files.length === 0)
196
+ return null;
197
+ const large = files.filter(f => f.sizeCategory !== 'normal');
198
+ const tested = files.filter(f => f.hasTests).length;
199
+ const largestFile = [...files].sort((a, b) => b.sizeBytes - a.sizeBytes)[0] || null;
200
+ const sizeHealth = clampScore(100 - (large.length / files.length) * 100);
201
+ const ownershipClarity = 0;
202
+ const testReadiness = clampScore((tested / files.length) * 100);
203
+ const boundaryReadiness = 20;
204
+ const observabilityReadiness = 55;
205
+ const readinessScore = clampScore(sizeHealth * 0.28 +
206
+ ownershipClarity * 0.24 +
207
+ testReadiness * 0.22 +
208
+ boundaryReadiness * 0.18 +
209
+ observabilityReadiness * 0.08);
210
+ return {
211
+ key: '__unknown__',
212
+ label: 'Unknown ownership',
213
+ color: '#7d8590',
214
+ description: 'Files that are not mapped to a feature.',
215
+ fileCount: files.length,
216
+ largeFileCount: files.filter(f => f.sizeCategory === 'large').length,
217
+ godFileCount: files.filter(f => f.sizeCategory === 'god').length,
218
+ criticalFileCount: files.filter(f => f.sizeCategory === 'critical').length,
219
+ testedCount: tested,
220
+ staleTestCount: files.filter(f => f.testStale).length,
221
+ unmappedFileCount: files.length,
222
+ multiFeatureFileCount: 0,
223
+ largestFile,
224
+ readinessScore,
225
+ readinessTier: readinessTier(readinessScore),
226
+ sizeHealth,
227
+ ownershipClarity,
228
+ testReadiness,
229
+ boundaryReadiness,
230
+ observabilityReadiness,
231
+ boundaryHints: Array.from(new Set(files.flatMap(f => f.boundaryHints))).slice(0, 8),
232
+ serviceNodes: [],
233
+ pipelineIds: [],
234
+ topRisks: topRiskLabels(files),
235
+ };
236
+ }
237
+ function buildMicroservicesReport(input) {
238
+ const sourceModules = input.modules.filter(m => m.type !== 'test' &&
239
+ !m.isInfra &&
240
+ !isArtifactPath(m.relativePath));
241
+ const files = sourceModules.map(m => {
242
+ const lineCount = countLines(m.path);
243
+ const sizeKb = Math.round(m.size / 1024);
244
+ const category = sizeCategory(sizeKb, lineCount);
245
+ const boundaryHints = boundaryHintsForModule(m);
246
+ const dependencyCount = m.dependencies.length;
247
+ const risks = fileRisks(m, category, dependencyCount, boundaryHints);
248
+ return {
249
+ path: normalizePath(m.relativePath),
250
+ type: m.type,
251
+ sizeBytes: m.size,
252
+ sizeKb,
253
+ lineCount,
254
+ sizeCategory: category,
255
+ featureKeys: m.featureKeys || [],
256
+ riskCodes: risks.map(r => r.code),
257
+ risks,
258
+ dependencyCount,
259
+ hasTests: m.hasTests,
260
+ testStale: !!m.testStale,
261
+ boundaryHints,
262
+ };
263
+ });
264
+ const fileByPath = new Map(files.map(f => [f.path, f]));
265
+ const features = input.features || [];
266
+ const modules = features.map(feature => {
267
+ const featureFiles = sourceModules
268
+ .filter(m => (m.featureKeys || []).includes(feature.key))
269
+ .map(m => fileByPath.get(normalizePath(m.relativePath)))
270
+ .filter((m) => !!m);
271
+ const fileCount = featureFiles.length;
272
+ const largeFiles = featureFiles.filter(f => f.sizeCategory !== 'normal');
273
+ const testedCount = featureFiles.filter(f => f.hasTests).length;
274
+ const staleTestCount = featureFiles.filter(f => f.testStale).length;
275
+ const multiFeatureFileCount = featureFiles.filter(f => f.featureKeys.length > 1).length;
276
+ const largestFile = [...featureFiles].sort((a, b) => b.sizeBytes - a.sizeBytes)[0] || null;
277
+ const serviceNodes = matchingServiceNodes(feature, input.serviceMap);
278
+ const pipelineIds = matchingPipelines(feature, input.serviceMap);
279
+ const docStatus = input.documentation?.features.find(f => f.key === feature.key);
280
+ const sizeHealth = fileCount ? clampScore(100 - (largeFiles.length / fileCount) * 100) : 100;
281
+ const ownershipClarity = fileCount ? clampScore(100 - (multiFeatureFileCount / fileCount) * 100) : 100;
282
+ const testReadiness = fileCount ? clampScore(((testedCount - staleTestCount * 0.5) / fileCount) * 100) : 100;
283
+ const boundaryHints = Array.from(new Set(featureFiles.flatMap(f => f.boundaryHints))).slice(0, 8);
284
+ let boundaryReadiness = 35;
285
+ if (serviceNodes.length > 0)
286
+ boundaryReadiness += 25;
287
+ if (pipelineIds.length > 0)
288
+ boundaryReadiness += 20;
289
+ if (boundaryHints.includes('service'))
290
+ boundaryReadiness += 10;
291
+ if (boundaryHints.includes('route/api') || boundaryHints.includes('worker'))
292
+ boundaryReadiness += 5;
293
+ if (docStatus?.docExists && !docStatus.isStale)
294
+ boundaryReadiness += 5;
295
+ boundaryReadiness = clampScore(boundaryReadiness);
296
+ const observabilityReadiness = observabilityScore(feature.key, input.observability);
297
+ const readinessScore = clampScore(sizeHealth * 0.28 +
298
+ ownershipClarity * 0.24 +
299
+ testReadiness * 0.22 +
300
+ boundaryReadiness * 0.18 +
301
+ observabilityReadiness * 0.08);
302
+ return {
303
+ key: feature.key,
304
+ label: feature.label,
305
+ color: feature.color,
306
+ description: feature.description || '',
307
+ fileCount,
308
+ largeFileCount: featureFiles.filter(f => f.sizeCategory === 'large').length,
309
+ godFileCount: featureFiles.filter(f => f.sizeCategory === 'god').length,
310
+ criticalFileCount: featureFiles.filter(f => f.sizeCategory === 'critical').length,
311
+ testedCount,
312
+ staleTestCount,
313
+ unmappedFileCount: 0,
314
+ multiFeatureFileCount,
315
+ largestFile,
316
+ readinessScore,
317
+ readinessTier: readinessTier(readinessScore),
318
+ sizeHealth,
319
+ ownershipClarity,
320
+ testReadiness,
321
+ boundaryReadiness,
322
+ observabilityReadiness,
323
+ boundaryHints,
324
+ serviceNodes,
325
+ pipelineIds,
326
+ topRisks: topRiskLabels(featureFiles),
327
+ };
328
+ });
329
+ const unknown = buildUnknownModule(files.filter(f => f.featureKeys.length === 0));
330
+ if (unknown)
331
+ modules.push(unknown);
332
+ const topRisks = [...files]
333
+ .filter(f => f.risks.length > 0)
334
+ .sort((a, b) => {
335
+ const severity = (f) => f.risks.reduce((s, r) => s + (r.severity === 'high' ? 3 : r.severity === 'medium' ? 2 : 1), 0);
336
+ return categoryWeight(b.sizeCategory) - categoryWeight(a.sizeCategory) ||
337
+ severity(b) - severity(a) ||
338
+ b.sizeBytes - a.sizeBytes;
339
+ })
340
+ .slice(0, 20);
341
+ return {
342
+ budgets: BUDGETS,
343
+ summary: {
344
+ sourceFiles: files.length,
345
+ modules: modules.length,
346
+ largeFiles: files.filter(f => f.sizeCategory === 'large').length,
347
+ godFiles: files.filter(f => f.sizeCategory === 'god').length,
348
+ criticalFiles: files.filter(f => f.sizeCategory === 'critical').length,
349
+ readyModules: modules.filter(m => m.readinessScore >= 70).length,
350
+ riskyModules: modules.filter(m => m.readinessScore < 40).length,
351
+ unmappedFiles: files.filter(f => f.featureKeys.length === 0).length,
352
+ multiFeatureFiles: files.filter(f => f.featureKeys.length > 1).length,
353
+ },
354
+ files,
355
+ modules: modules.sort((a, b) => a.readinessScore - b.readinessScore ||
356
+ (b.criticalFileCount + b.godFileCount) - (a.criticalFileCount + a.godFileCount)),
357
+ topRisks,
358
+ };
359
+ }
360
+ //# sourceMappingURL=microservices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"microservices.js","sourceRoot":"","sources":["../../src/scanner/microservices.ts"],"names":[],"mappings":"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"}