@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.
- package/README.md +38 -0
- package/dist/config.d.ts +147 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +550 -0
- package/dist/config.js.map +1 -0
- package/dist/csharp/analyser.d.ts +14 -0
- package/dist/csharp/analyser.d.ts.map +1 -0
- package/dist/csharp/analyser.js +436 -0
- package/dist/csharp/analyser.js.map +1 -0
- package/dist/csharp/lexer.d.ts +29 -0
- package/dist/csharp/lexer.d.ts.map +1 -0
- package/dist/csharp/lexer.js +182 -0
- package/dist/csharp/lexer.js.map +1 -0
- package/dist/duplicates.d.ts +53 -0
- package/dist/duplicates.d.ts.map +1 -0
- package/dist/duplicates.js +491 -0
- package/dist/duplicates.js.map +1 -0
- package/dist/fileAnalyser.d.ts +4 -0
- package/dist/fileAnalyser.d.ts.map +1 -0
- package/dist/fileAnalyser.js +8 -0
- package/dist/fileAnalyser.js.map +1 -0
- package/dist/fileNaming.d.ts +68 -0
- package/dist/fileNaming.d.ts.map +1 -0
- package/dist/fileNaming.js +343 -0
- package/dist/fileNaming.js.map +1 -0
- package/dist/gate.d.ts +49 -0
- package/dist/gate.d.ts.map +1 -0
- package/dist/gate.js +242 -0
- package/dist/gate.js.map +1 -0
- package/dist/go/analyser.d.ts +5 -0
- package/dist/go/analyser.d.ts.map +1 -0
- package/dist/go/analyser.js +576 -0
- package/dist/go/analyser.js.map +1 -0
- package/dist/guards.d.ts +16 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +355 -0
- package/dist/guards.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +110 -0
- package/dist/index.js.map +1 -0
- package/dist/languages.d.ts +46 -0
- package/dist/languages.d.ts.map +1 -0
- package/dist/languages.js +155 -0
- package/dist/languages.js.map +1 -0
- package/dist/lines.d.ts +9 -0
- package/dist/lines.d.ts.map +1 -0
- package/dist/lines.js +58 -0
- package/dist/lines.js.map +1 -0
- package/dist/python/analyser.d.ts +5 -0
- package/dist/python/analyser.d.ts.map +1 -0
- package/dist/python/analyser.js +630 -0
- package/dist/python/analyser.js.map +1 -0
- package/dist/qualitySignals.d.ts +30 -0
- package/dist/qualitySignals.d.ts.map +1 -0
- package/dist/qualitySignals.js +101 -0
- package/dist/qualitySignals.js.map +1 -0
- package/dist/ruby/analyser.d.ts +5 -0
- package/dist/ruby/analyser.d.ts.map +1 -0
- package/dist/ruby/analyser.js +450 -0
- package/dist/ruby/analyser.js.map +1 -0
- package/dist/scoring.d.ts +4 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +37 -0
- package/dist/scoring.js.map +1 -0
- package/dist/secrets.d.ts +5 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +245 -0
- package/dist/secrets.js.map +1 -0
- package/dist/securityContext.d.ts +2 -0
- package/dist/securityContext.d.ts.map +1 -0
- package/dist/securityContext.js +16 -0
- package/dist/securityContext.js.map +1 -0
- package/dist/sfc.d.ts +32 -0
- package/dist/sfc.d.ts.map +1 -0
- package/dist/sfc.js +228 -0
- package/dist/sfc.js.map +1 -0
- package/dist/slop.d.ts +37 -0
- package/dist/slop.d.ts.map +1 -0
- package/dist/slop.js +81 -0
- package/dist/slop.js.map +1 -0
- package/dist/suppressions.d.ts +19 -0
- package/dist/suppressions.d.ts.map +1 -0
- package/dist/suppressions.js +152 -0
- package/dist/suppressions.js.map +1 -0
- package/dist/ts/analyser.d.ts +4 -0
- package/dist/ts/analyser.d.ts.map +1 -0
- package/dist/ts/analyser.js +769 -0
- package/dist/ts/analyser.js.map +1 -0
- package/dist/types.d.ts +139 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +46 -0
- package/dist/types.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transformCSharp = transformCSharp;
|
|
4
|
+
exports.stripCSharpComments = stripCSharpComments;
|
|
5
|
+
exports.csharpCodeOnly = csharpCodeOnly;
|
|
6
|
+
/**
|
|
7
|
+
* The C# lexical layer, in its own module because TWO callers need it: the C#
|
|
8
|
+
* analyser (every structural rule) and `detectParseErrorReason` in guards.ts
|
|
9
|
+
* (the delimiter balance check that decides whether a file is analysed at all).
|
|
10
|
+
*
|
|
11
|
+
* That second caller is the reason this is not a private helper. The generic
|
|
12
|
+
* sanitiser treats `\"` as an escaped quote, so the everyday C# verbatim string
|
|
13
|
+
* `@"C:\logs\"` read as UNTERMINATED, every brace after it landed at the wrong
|
|
14
|
+
* depth, and the file was reported as a parse error with all findings zeroed.
|
|
15
|
+
* A Windows path in a verbatim string is not an edge case in C#.
|
|
16
|
+
*
|
|
17
|
+
* ONE scanner serves both "strip comments" and "strip comments and strings":
|
|
18
|
+
* C# has five string forms and keeping two copies of that lexer is how they
|
|
19
|
+
* drift. Both modes are LENGTH-PRESERVING and keep every CR/LF, so a finding's
|
|
20
|
+
* offset still maps to its native line with no remapping layer.
|
|
21
|
+
*
|
|
22
|
+
* Handled forms: line and block comments, char literals, regular ("..." with
|
|
23
|
+
* backslash escapes), verbatim (@"..." where "" is the escape and a backslash is
|
|
24
|
+
* literal), interpolated ($"...", $@"...", @$"..."), and C# 11 raw strings
|
|
25
|
+
* ("""...""", any delimiter length, $-interpolated included). Raw strings are the
|
|
26
|
+
* trap: scanned naively, a `"""` opens and closes on its own first two quotes and
|
|
27
|
+
* every following brace lands in the wrong nesting level.
|
|
28
|
+
*/
|
|
29
|
+
function transformCSharp(source, blankStrings) {
|
|
30
|
+
let result = '';
|
|
31
|
+
let i = 0;
|
|
32
|
+
const blank = (ch) => (ch === '\n' ? '\n' : ' ');
|
|
33
|
+
const emit = (ch) => { result += blankStrings ? blank(ch) : ch; };
|
|
34
|
+
while (i < source.length) {
|
|
35
|
+
const ch = source[i];
|
|
36
|
+
if (ch === '/' && source[i + 1] === '/') {
|
|
37
|
+
while (i < source.length && source[i] !== '\n') {
|
|
38
|
+
result += ' ';
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (ch === '/' && source[i + 1] === '*') {
|
|
44
|
+
result += ' ';
|
|
45
|
+
i += 2;
|
|
46
|
+
while (i < source.length) {
|
|
47
|
+
if (source[i] === '*' && source[i + 1] === '/') {
|
|
48
|
+
result += ' ';
|
|
49
|
+
i += 2;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
result += blank(source[i]);
|
|
53
|
+
i++;
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (ch === '"' || ch === '$' || ch === '@') {
|
|
58
|
+
// Read any $ / @ prefix, then the run of quotes that opens the literal.
|
|
59
|
+
let j = i;
|
|
60
|
+
let verbatim = false;
|
|
61
|
+
while (source[j] === '$' || source[j] === '@') {
|
|
62
|
+
if (source[j] === '@')
|
|
63
|
+
verbatim = true;
|
|
64
|
+
j++;
|
|
65
|
+
}
|
|
66
|
+
if (source[j] !== '"') {
|
|
67
|
+
// A bare $ or @: an escaped identifier (@class, @event) or an
|
|
68
|
+
// interpolation hole, neither of which opens a literal.
|
|
69
|
+
result += ch;
|
|
70
|
+
i++;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
let quoteRun = 0;
|
|
74
|
+
while (source[j + quoteRun] === '"')
|
|
75
|
+
quoteRun++;
|
|
76
|
+
// Two quotes open an EMPTY regular/verbatim string, not a raw one: only a
|
|
77
|
+
// run of three or more is a raw-string delimiter.
|
|
78
|
+
const openLength = quoteRun >= 3 ? quoteRun : 1;
|
|
79
|
+
// Prefix and opening delimiter are never content, so they are blanked in
|
|
80
|
+
// code mode and preserved in comment-only mode (the SQL interpolation
|
|
81
|
+
// check reads the `$"` marker off that output).
|
|
82
|
+
for (let k = i; k < j + openLength; k++)
|
|
83
|
+
emit(source[k]);
|
|
84
|
+
i = j + openLength;
|
|
85
|
+
if (quoteRun >= 3) {
|
|
86
|
+
// Raw string: ends at the next run of at least `quoteRun` quotes.
|
|
87
|
+
while (i < source.length) {
|
|
88
|
+
if (source[i] === '"') {
|
|
89
|
+
let run = 0;
|
|
90
|
+
while (source[i + run] === '"')
|
|
91
|
+
run++;
|
|
92
|
+
for (let k = 0; k < run; k++)
|
|
93
|
+
emit('"');
|
|
94
|
+
i += run;
|
|
95
|
+
if (run >= quoteRun)
|
|
96
|
+
break;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
emit(source[i]);
|
|
100
|
+
i++;
|
|
101
|
+
}
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (verbatim) {
|
|
105
|
+
// Verbatim: "" is the escape, a backslash is literal, newlines are part
|
|
106
|
+
// of the string.
|
|
107
|
+
while (i < source.length) {
|
|
108
|
+
if (source[i] === '"' && source[i + 1] === '"') {
|
|
109
|
+
emit('"');
|
|
110
|
+
emit('"');
|
|
111
|
+
i += 2;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (source[i] === '"') {
|
|
115
|
+
emit('"');
|
|
116
|
+
i++;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
emit(source[i]);
|
|
120
|
+
i++;
|
|
121
|
+
}
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
// Regular or interpolated string. A newline ends it: the file is already
|
|
125
|
+
// broken at that point, and running to EOF would blank the rest of it.
|
|
126
|
+
while (i < source.length) {
|
|
127
|
+
const current = source[i];
|
|
128
|
+
if (current === '\n')
|
|
129
|
+
break;
|
|
130
|
+
if (current === '\\') {
|
|
131
|
+
emit(current);
|
|
132
|
+
i++;
|
|
133
|
+
if (i < source.length && source[i] !== '\n') {
|
|
134
|
+
emit(source[i]);
|
|
135
|
+
i++;
|
|
136
|
+
}
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
emit(current);
|
|
140
|
+
i++;
|
|
141
|
+
if (current === '"')
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (ch === "'") {
|
|
147
|
+
emit(ch);
|
|
148
|
+
i++;
|
|
149
|
+
while (i < source.length) {
|
|
150
|
+
const current = source[i];
|
|
151
|
+
if (current === '\n')
|
|
152
|
+
break;
|
|
153
|
+
if (current === '\\') {
|
|
154
|
+
emit(current);
|
|
155
|
+
i++;
|
|
156
|
+
if (i < source.length) {
|
|
157
|
+
emit(source[i]);
|
|
158
|
+
i++;
|
|
159
|
+
}
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
emit(current);
|
|
163
|
+
i++;
|
|
164
|
+
if (current === "'")
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
result += ch;
|
|
170
|
+
i++;
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
/** Comments blanked, string contents intact. */
|
|
175
|
+
function stripCSharpComments(source) {
|
|
176
|
+
return transformCSharp(source, false);
|
|
177
|
+
}
|
|
178
|
+
/** Comments AND string contents blanked: the input for anything structural. */
|
|
179
|
+
function csharpCodeOnly(source) {
|
|
180
|
+
return transformCSharp(source, true);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=lexer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lexer.js","sourceRoot":"","sources":["../../src/csharp/lexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DuplicateBlockFinding } from './types';
|
|
2
|
+
export interface DuplicateLocation {
|
|
3
|
+
file: string;
|
|
4
|
+
startLine: number;
|
|
5
|
+
endLine: number;
|
|
6
|
+
}
|
|
7
|
+
export interface DuplicateBlock {
|
|
8
|
+
/** length of the matched run in normalised tokens */
|
|
9
|
+
tokens: number;
|
|
10
|
+
a: DuplicateLocation;
|
|
11
|
+
b: DuplicateLocation;
|
|
12
|
+
}
|
|
13
|
+
export interface DuplicateFileInput {
|
|
14
|
+
path: string;
|
|
15
|
+
content: string;
|
|
16
|
+
}
|
|
17
|
+
export interface DuplicateDetectionResult {
|
|
18
|
+
blocks: DuplicateBlock[];
|
|
19
|
+
/** files excluded from comparison (too large / minified) — never silently dropped */
|
|
20
|
+
skippedFiles: string[];
|
|
21
|
+
}
|
|
22
|
+
/** Files above this line count are excluded from duplicate comparison */
|
|
23
|
+
export declare const DUPLICATE_MAX_FILE_LINES = 5000;
|
|
24
|
+
/** A single line longer than this marks the file as generated/minified and excludes it */
|
|
25
|
+
export declare const DUPLICATE_MAX_LINE_LENGTH = 500;
|
|
26
|
+
/** Hard cap on reported blocks per scan (longest first) so boilerplate-heavy repos stay usable */
|
|
27
|
+
export declare const DUPLICATE_MAX_BLOCKS = 500;
|
|
28
|
+
interface Token {
|
|
29
|
+
norm: string;
|
|
30
|
+
line: number;
|
|
31
|
+
}
|
|
32
|
+
/** Lex source into normalised tokens with original line numbers. Never throws. */
|
|
33
|
+
export declare function tokeniseNormalised(source: string, filePath: string): Token[];
|
|
34
|
+
/**
|
|
35
|
+
* Blanks import/re-export statements so they never participate in matching
|
|
36
|
+
* (newlines are preserved, so reported line numbers stay exact). Import
|
|
37
|
+
* headers are structural boilerplate - two Next.js pages importing the same
|
|
38
|
+
* twenty UI components are not copy-paste debt, and established duplication
|
|
39
|
+
* engines (e.g. SonarQube's CPD) exclude imports for the same reason.
|
|
40
|
+
*/
|
|
41
|
+
export declare function stripImports(source: string, filePath: string): string;
|
|
42
|
+
export declare function detectDuplicates(files: DuplicateFileInput[], minTokens?: number): DuplicateDetectionResult;
|
|
43
|
+
/**
|
|
44
|
+
* Converts a detected block into per-file smell findings. A within-file block
|
|
45
|
+
* yields one finding; a cross-file block yields a primary finding on the first
|
|
46
|
+
* file and a non-primary mirror on the second, so totals never double-count.
|
|
47
|
+
*/
|
|
48
|
+
export declare function duplicateBlockToFindings(block: DuplicateBlock): Array<{
|
|
49
|
+
file: string;
|
|
50
|
+
finding: DuplicateBlockFinding;
|
|
51
|
+
}>;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=duplicates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicates.d.ts","sourceRoot":"","sources":["../src/duplicates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAc/C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAA;IACd,CAAC,EAAE,iBAAiB,CAAA;IACpB,CAAC,EAAE,iBAAiB,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,qFAAqF;IACrF,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,OAAO,CAAA;AAC5C,0FAA0F;AAC1F,eAAO,MAAM,yBAAyB,MAAM,CAAA;AAC5C,kGAAkG;AAClG,eAAO,MAAM,oBAAoB,MAAM,CAAA;AAyBvC,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAUD,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,CAiG5E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuFrE;AAmCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE,SAAS,SAAK,GAAG,wBAAwB,CA6KtG;AAoCD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAA;CAAE,CAAC,CA6BvH"}
|