@iris-code/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +38 -0
  2. package/dist/config.d.ts +147 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +550 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/csharp/analyser.d.ts +14 -0
  7. package/dist/csharp/analyser.d.ts.map +1 -0
  8. package/dist/csharp/analyser.js +436 -0
  9. package/dist/csharp/analyser.js.map +1 -0
  10. package/dist/csharp/lexer.d.ts +29 -0
  11. package/dist/csharp/lexer.d.ts.map +1 -0
  12. package/dist/csharp/lexer.js +182 -0
  13. package/dist/csharp/lexer.js.map +1 -0
  14. package/dist/duplicates.d.ts +53 -0
  15. package/dist/duplicates.d.ts.map +1 -0
  16. package/dist/duplicates.js +491 -0
  17. package/dist/duplicates.js.map +1 -0
  18. package/dist/fileAnalyser.d.ts +4 -0
  19. package/dist/fileAnalyser.d.ts.map +1 -0
  20. package/dist/fileAnalyser.js +8 -0
  21. package/dist/fileAnalyser.js.map +1 -0
  22. package/dist/fileNaming.d.ts +68 -0
  23. package/dist/fileNaming.d.ts.map +1 -0
  24. package/dist/fileNaming.js +343 -0
  25. package/dist/fileNaming.js.map +1 -0
  26. package/dist/gate.d.ts +49 -0
  27. package/dist/gate.d.ts.map +1 -0
  28. package/dist/gate.js +242 -0
  29. package/dist/gate.js.map +1 -0
  30. package/dist/go/analyser.d.ts +5 -0
  31. package/dist/go/analyser.d.ts.map +1 -0
  32. package/dist/go/analyser.js +576 -0
  33. package/dist/go/analyser.js.map +1 -0
  34. package/dist/guards.d.ts +16 -0
  35. package/dist/guards.d.ts.map +1 -0
  36. package/dist/guards.js +355 -0
  37. package/dist/guards.js.map +1 -0
  38. package/dist/index.d.ts +22 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +110 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/languages.d.ts +46 -0
  43. package/dist/languages.d.ts.map +1 -0
  44. package/dist/languages.js +155 -0
  45. package/dist/languages.js.map +1 -0
  46. package/dist/lines.d.ts +9 -0
  47. package/dist/lines.d.ts.map +1 -0
  48. package/dist/lines.js +58 -0
  49. package/dist/lines.js.map +1 -0
  50. package/dist/python/analyser.d.ts +5 -0
  51. package/dist/python/analyser.d.ts.map +1 -0
  52. package/dist/python/analyser.js +630 -0
  53. package/dist/python/analyser.js.map +1 -0
  54. package/dist/qualitySignals.d.ts +30 -0
  55. package/dist/qualitySignals.d.ts.map +1 -0
  56. package/dist/qualitySignals.js +101 -0
  57. package/dist/qualitySignals.js.map +1 -0
  58. package/dist/ruby/analyser.d.ts +5 -0
  59. package/dist/ruby/analyser.d.ts.map +1 -0
  60. package/dist/ruby/analyser.js +450 -0
  61. package/dist/ruby/analyser.js.map +1 -0
  62. package/dist/scoring.d.ts +4 -0
  63. package/dist/scoring.d.ts.map +1 -0
  64. package/dist/scoring.js +37 -0
  65. package/dist/scoring.js.map +1 -0
  66. package/dist/secrets.d.ts +5 -0
  67. package/dist/secrets.d.ts.map +1 -0
  68. package/dist/secrets.js +245 -0
  69. package/dist/secrets.js.map +1 -0
  70. package/dist/securityContext.d.ts +2 -0
  71. package/dist/securityContext.d.ts.map +1 -0
  72. package/dist/securityContext.js +16 -0
  73. package/dist/securityContext.js.map +1 -0
  74. package/dist/sfc.d.ts +32 -0
  75. package/dist/sfc.d.ts.map +1 -0
  76. package/dist/sfc.js +228 -0
  77. package/dist/sfc.js.map +1 -0
  78. package/dist/slop.d.ts +37 -0
  79. package/dist/slop.d.ts.map +1 -0
  80. package/dist/slop.js +81 -0
  81. package/dist/slop.js.map +1 -0
  82. package/dist/suppressions.d.ts +19 -0
  83. package/dist/suppressions.d.ts.map +1 -0
  84. package/dist/suppressions.js +152 -0
  85. package/dist/suppressions.js.map +1 -0
  86. package/dist/ts/analyser.d.ts +4 -0
  87. package/dist/ts/analyser.d.ts.map +1 -0
  88. package/dist/ts/analyser.js +769 -0
  89. package/dist/ts/analyser.js.map +1 -0
  90. package/dist/types.d.ts +139 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +46 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +43 -0
package/dist/slop.js ADDED
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SLOP_BANDS = exports.SLOP_SATURATION = exports.SLOP_WEIGHTS = void 0;
4
+ exports.computeSlopScore = computeSlopScore;
5
+ exports.SLOP_WEIGHTS = {
6
+ duplication: 30,
7
+ security: 20,
8
+ suppressions: 12,
9
+ 'type-debt': 12,
10
+ 'debug-prints': 8,
11
+ complexity: 10,
12
+ todos: 4,
13
+ 'file-naming': 4,
14
+ };
15
+ // Density at which a component reaches its full weight. Counts are per KLOC;
16
+ // duplication is already a percentage.
17
+ exports.SLOP_SATURATION = {
18
+ duplication: 20,
19
+ security: 4,
20
+ suppressions: 3,
21
+ 'type-debt': 12,
22
+ 'debug-prints': 8,
23
+ complexity: 2,
24
+ todos: 10,
25
+ 'file-naming': 5,
26
+ };
27
+ exports.SLOP_BANDS = {
28
+ cleanMax: 24,
29
+ driftingMax: 54,
30
+ };
31
+ function rounded(value) {
32
+ return Math.round(value * 10) / 10;
33
+ }
34
+ function bandFor(score) {
35
+ if (score <= exports.SLOP_BANDS.cleanMax)
36
+ return 'clean';
37
+ if (score <= exports.SLOP_BANDS.driftingMax)
38
+ return 'drifting';
39
+ return 'slop';
40
+ }
41
+ function computeSlopScore(input) {
42
+ if (input.fileCount <= 0 || input.totalCodeLines <= 0) {
43
+ return { score: 0, band: 'clean', contributors: [] };
44
+ }
45
+ const kloc = Math.max(input.totalCodeLines / 1000, 0.1);
46
+ const raw = {
47
+ duplication: Math.max(0, input.duplicationPercent),
48
+ security: Math.max(0, input.securitySmellCount) / kloc,
49
+ suppressions: Math.max(0, input.bareSuppressionCount + input.suppressedCount * 0.25) / kloc,
50
+ 'type-debt': Math.max(0, input.anyUsageCount + input.missingReturnTypeCount) / kloc,
51
+ 'debug-prints': Math.max(0, input.debugPrintCount) / kloc,
52
+ complexity: Math.max(0, input.highComplexityFileCount) / kloc,
53
+ todos: Math.max(0, input.todoCount) / kloc,
54
+ 'file-naming': Math.max(0, input.namingViolationCount) / kloc,
55
+ };
56
+ const applicable = Object.keys(exports.SLOP_WEIGHTS)
57
+ .filter(key => key !== 'type-debt' || input.typeScriptFileCount > 0);
58
+ const applicableWeight = applicable.reduce((sum, key) => sum + exports.SLOP_WEIGHTS[key], 0);
59
+ const scale = applicableWeight > 0 ? 100 / applicableWeight : 1;
60
+ const contributors = applicable
61
+ .map((key) => ({
62
+ key,
63
+ label: {
64
+ duplication: 'Duplication',
65
+ security: 'Security smells',
66
+ suppressions: 'Suppressions',
67
+ 'type-debt': 'Type debt',
68
+ 'debug-prints': 'Debug prints',
69
+ complexity: 'Complexity spikes',
70
+ todos: 'TODO load',
71
+ 'file-naming': 'File naming',
72
+ }[key],
73
+ rawValue: rounded(raw[key]),
74
+ points: rounded(Math.min(1, raw[key] / exports.SLOP_SATURATION[key]) * exports.SLOP_WEIGHTS[key] * scale),
75
+ }))
76
+ .filter(contributor => contributor.points > 0)
77
+ .sort((a, b) => b.points - a.points || a.label.localeCompare(b.label));
78
+ const score = Math.max(0, Math.min(100, Math.round(contributors.reduce((sum, item) => sum + item.points, 0))));
79
+ return { score, band: bandFor(score), contributors };
80
+ }
81
+ //# sourceMappingURL=slop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slop.js","sourceRoot":"","sources":["../src/slop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { IrisConfig } from './config';
2
+ import { FileAnalysis } from './types';
3
+ export interface SuppressionDirective {
4
+ /** 1-based line the directive comment sits on */
5
+ line: number;
6
+ /** 1-based line the directive applies to (first non-directive line below); irrelevant when fileLevel */
7
+ targetLine: number;
8
+ fileLevel: boolean;
9
+ ruleIds: string[];
10
+ reason: string | null;
11
+ }
12
+ export declare function parseSuppressions(source: string): SuppressionDirective[];
13
+ /**
14
+ * Removes suppressed findings from the analysis, records them (with rule,
15
+ * line, and reason) in `suppressed`, flags bare directives as a smell, and
16
+ * recomputes the health score so suppressed findings no longer count against it.
17
+ */
18
+ export declare function applySuppressions(analysis: FileAnalysis, directives: SuppressionDirective[], config: IrisConfig): FileAnalysis;
19
+ //# sourceMappingURL=suppressions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppressions.d.ts","sourceRoot":"","sources":["../src/suppressions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAErC,OAAO,EAEL,YAAY,EAMb,MAAM,SAAS,CAAA;AAWhB,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,wGAAwG;IACxG,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAgCxE;AA0DD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,oBAAoB,EAAE,EAClC,MAAM,EAAE,UAAU,GACjB,YAAY,CA8Dd"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSuppressions = parseSuppressions;
4
+ exports.applySuppressions = applySuppressions;
5
+ const scoring_1 = require("./scoring");
6
+ const types_1 = require("./types");
7
+ const DIRECTIVE_RE = /^\s*(?:\/\/|#)\s*iris-ignore(-file)?\s*:\s*(.*)$/;
8
+ const VALID_RULE_IDS = new Set(types_1.SUPPRESSIBLE_RULE_IDS);
9
+ function parseSuppressions(source) {
10
+ const lines = source.split(/\r?\n/);
11
+ const directives = [];
12
+ const directiveLines = new Set();
13
+ lines.forEach((text, index) => {
14
+ const match = DIRECTIVE_RE.exec(text);
15
+ if (!match)
16
+ return;
17
+ directiveLines.add(index + 1);
18
+ const rest = match[2];
19
+ const sepIndex = rest.indexOf('--');
20
+ const rulePart = sepIndex === -1 ? rest : rest.slice(0, sepIndex);
21
+ const reasonRaw = sepIndex === -1 ? null : rest.slice(sepIndex + 2).trim();
22
+ directives.push({
23
+ line: index + 1,
24
+ targetLine: index + 2,
25
+ fileLevel: match[1] === '-file',
26
+ ruleIds: rulePart.split(',').map(r => r.trim()).filter(Boolean),
27
+ reason: reasonRaw ? reasonRaw : null,
28
+ });
29
+ });
30
+ // A stack of consecutive directives applies to the first real line below the block.
31
+ for (const directive of directives) {
32
+ while (directiveLines.has(directive.targetLine)) {
33
+ directive.targetLine++;
34
+ }
35
+ }
36
+ return directives;
37
+ }
38
+ function isBare(directive) {
39
+ return (directive.reason === null ||
40
+ directive.ruleIds.length === 0 ||
41
+ directive.ruleIds.some(id => !VALID_RULE_IDS.has(id)));
42
+ }
43
+ function buildMatchers(directives) {
44
+ const matchers = new Map();
45
+ for (const directive of directives) {
46
+ if (isBare(directive))
47
+ continue;
48
+ for (const id of directive.ruleIds) {
49
+ const ruleId = id;
50
+ let matcher = matchers.get(ruleId);
51
+ if (!matcher) {
52
+ matcher = { lineReasons: new Map() };
53
+ matchers.set(ruleId, matcher);
54
+ }
55
+ if (directive.fileLevel) {
56
+ matcher.fileLevelReason = matcher.fileLevelReason ?? directive.reason;
57
+ }
58
+ else {
59
+ matcher.lineReasons.set(directive.targetLine, directive.reason);
60
+ }
61
+ }
62
+ }
63
+ return matchers;
64
+ }
65
+ /** Smell rules whose findings are plain `{ line }`-carrying array entries */
66
+ const SMELL_ARRAY_RULES = [
67
+ ['console-log', 'consoleLogs'],
68
+ ['todo', 'todos'],
69
+ ['magic-number', 'magicNumbers'],
70
+ ['long-param-list', 'longParameterLists'],
71
+ ['unused-var', 'unusedVars'],
72
+ ['unused-function', 'unusedFunctions'],
73
+ ['hardcoded-secret', 'hardcodedSecrets'],
74
+ ['eval-usage', 'evalUsage'],
75
+ ['sql-concatenation', 'sqlConcatenation'],
76
+ ['insecure-random', 'insecureRandom'],
77
+ ['unsafe-regex', 'unsafeRegex'],
78
+ ['hardcoded-localhost', 'hardcodedLocalhost'],
79
+ ['disabled-tls-verification', 'disabledTlsVerification'],
80
+ ['debug-flags-enabled', 'debugFlagsEnabled'],
81
+ ['weak-hashing', 'weakHashing'],
82
+ ['open-redirect', 'openRedirect'],
83
+ ['duplicate-code', 'duplicateBlocks'],
84
+ ['file-naming', 'fileNamingViolations'],
85
+ ];
86
+ /**
87
+ * Removes suppressed findings from the analysis, records them (with rule,
88
+ * line, and reason) in `suppressed`, flags bare directives as a smell, and
89
+ * recomputes the health score so suppressed findings no longer count against it.
90
+ */
91
+ function applySuppressions(analysis, directives, config) {
92
+ if (directives.length === 0)
93
+ return analysis;
94
+ const matchers = buildMatchers(directives);
95
+ const suppressed = [...analysis.suppressed];
96
+ const bareSuppressions = [
97
+ ...analysis.codeSmells.bareSuppressions,
98
+ ...directives.filter(isBare).map(d => ({ line: d.line })),
99
+ ];
100
+ const matchReason = (ruleId, line) => {
101
+ const matcher = matchers.get(ruleId);
102
+ if (!matcher)
103
+ return null;
104
+ if (matcher.fileLevelReason !== undefined)
105
+ return { reason: matcher.fileLevelReason, fileLevel: true };
106
+ const lineReason = matcher.lineReasons.get(line);
107
+ return lineReason !== undefined ? { reason: lineReason, fileLevel: false } : null;
108
+ };
109
+ const filterByLine = (items, ruleId) => items.filter(item => {
110
+ const match = matchReason(ruleId, item.line);
111
+ if (!match)
112
+ return true;
113
+ suppressed.push({ ruleId, line: item.line, reason: match.reason, fileLevel: match.fileLevel });
114
+ return false;
115
+ });
116
+ const codeSmells = { ...analysis.codeSmells, bareSuppressions };
117
+ for (const [ruleId, field] of SMELL_ARRAY_RULES) {
118
+ if (!matchers.has(ruleId))
119
+ continue;
120
+ const items = codeSmells[field];
121
+ codeSmells[field] = filterByLine(items, ruleId);
122
+ }
123
+ const typeScriptMetrics = matchers.has('any-usage')
124
+ ? { ...analysis.typeScriptMetrics, anyUsages: filterByLine(analysis.typeScriptMetrics.anyUsages, 'any-usage') }
125
+ : analysis.typeScriptMetrics;
126
+ // Warning-type rules are suppressible per line like any smell. Kept as a set rather
127
+ // than a single hardcoded id so a new line-carrying warning cannot ship accepting a
128
+ // severityOverride while its iris-ignore directive is silently inert.
129
+ const suppressibleWarnings = types_1.SUPPRESSIBLE_WARNING_TYPES.filter(ruleId => matchers.has(ruleId));
130
+ const warnings = suppressibleWarnings.length
131
+ ? analysis.warnings.filter(warning => {
132
+ const ruleId = suppressibleWarnings.find(candidate => candidate === warning.type);
133
+ if (!ruleId || warning.line === undefined)
134
+ return true;
135
+ const match = matchReason(ruleId, warning.line);
136
+ if (!match)
137
+ return true;
138
+ suppressed.push({ ruleId, line: warning.line, reason: match.reason, fileLevel: match.fileLevel });
139
+ return false;
140
+ })
141
+ : analysis.warnings;
142
+ suppressed.sort((a, b) => a.line - b.line || a.ruleId.localeCompare(b.ruleId));
143
+ return {
144
+ ...analysis,
145
+ warnings,
146
+ typeScriptMetrics,
147
+ codeSmells,
148
+ suppressed,
149
+ healthScore: (0, scoring_1.computeHealthScore)(warnings, typeScriptMetrics, codeSmells, config),
150
+ };
151
+ }
152
+ //# sourceMappingURL=suppressions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppressions.js","sourceRoot":"","sources":["../src/suppressions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { IrisConfig } from '../config';
2
+ import { LanguageAnalysis } from '../types';
3
+ export declare function analyseTs(source: string, config: IrisConfig, filePath?: string): LanguageAnalysis;
4
+ //# sourceMappingURL=analyser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyser.d.ts","sourceRoot":"","sources":["../../src/ts/analyser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAGtC,OAAO,EAOL,gBAAgB,EACjB,MAAM,UAAU,CAAA;AA+tBjB,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,SAAK,GAAG,gBAAgB,CAuC7F"}