kopytko-linter 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 (102) hide show
  1. package/README.md +190 -0
  2. package/dist/bin/kopytko-lint.d.ts +3 -0
  3. package/dist/bin/kopytko-lint.d.ts.map +1 -0
  4. package/dist/bin/kopytko-lint.js +118 -0
  5. package/dist/bin/kopytko-lint.js.map +1 -0
  6. package/dist/src/analysis/fsWrapper.d.ts +19 -0
  7. package/dist/src/analysis/fsWrapper.d.ts.map +1 -0
  8. package/dist/src/analysis/fsWrapper.js +62 -0
  9. package/dist/src/analysis/fsWrapper.js.map +1 -0
  10. package/dist/src/analysis/functionIndex.d.ts +19 -0
  11. package/dist/src/analysis/functionIndex.d.ts.map +1 -0
  12. package/dist/src/analysis/functionIndex.js +69 -0
  13. package/dist/src/analysis/functionIndex.js.map +1 -0
  14. package/dist/src/analysis/globMatcher.d.ts +8 -0
  15. package/dist/src/analysis/globMatcher.d.ts.map +1 -0
  16. package/dist/src/analysis/globMatcher.js +27 -0
  17. package/dist/src/analysis/globMatcher.js.map +1 -0
  18. package/dist/src/analysis/importParser.d.ts +22 -0
  19. package/dist/src/analysis/importParser.d.ts.map +1 -0
  20. package/dist/src/analysis/importParser.js +131 -0
  21. package/dist/src/analysis/importParser.js.map +1 -0
  22. package/dist/src/analysis/patternSiblings.d.ts +13 -0
  23. package/dist/src/analysis/patternSiblings.d.ts.map +1 -0
  24. package/dist/src/analysis/patternSiblings.js +91 -0
  25. package/dist/src/analysis/patternSiblings.js.map +1 -0
  26. package/dist/src/analysis/scopeAnalysis.d.ts +17 -0
  27. package/dist/src/analysis/scopeAnalysis.d.ts.map +1 -0
  28. package/dist/src/analysis/scopeAnalysis.js +180 -0
  29. package/dist/src/analysis/scopeAnalysis.js.map +1 -0
  30. package/dist/src/analysis/testUtils.d.ts +17 -0
  31. package/dist/src/analysis/testUtils.d.ts.map +1 -0
  32. package/dist/src/analysis/testUtils.js +124 -0
  33. package/dist/src/analysis/testUtils.js.map +1 -0
  34. package/dist/src/analysis/textUtils.d.ts +9 -0
  35. package/dist/src/analysis/textUtils.d.ts.map +1 -0
  36. package/dist/src/analysis/textUtils.js +45 -0
  37. package/dist/src/analysis/textUtils.js.map +1 -0
  38. package/dist/src/catalog/builtins.d.ts +26 -0
  39. package/dist/src/catalog/builtins.d.ts.map +1 -0
  40. package/dist/src/catalog/builtins.js +123 -0
  41. package/dist/src/catalog/builtins.js.map +1 -0
  42. package/dist/src/catalog/components.d.ts +8 -0
  43. package/dist/src/catalog/components.d.ts.map +1 -0
  44. package/dist/src/catalog/components.js +35 -0
  45. package/dist/src/catalog/components.js.map +1 -0
  46. package/dist/src/config.d.ts +23 -0
  47. package/dist/src/config.d.ts.map +1 -0
  48. package/dist/src/config.js +167 -0
  49. package/dist/src/config.js.map +1 -0
  50. package/dist/src/context.d.ts +22 -0
  51. package/dist/src/context.d.ts.map +1 -0
  52. package/dist/src/context.js +3 -0
  53. package/dist/src/context.js.map +1 -0
  54. package/dist/src/index.d.ts +28 -0
  55. package/dist/src/index.d.ts.map +1 -0
  56. package/dist/src/index.js +54 -0
  57. package/dist/src/index.js.map +1 -0
  58. package/dist/src/jsonc.d.ts +6 -0
  59. package/dist/src/jsonc.d.ts.map +1 -0
  60. package/dist/src/jsonc.js +46 -0
  61. package/dist/src/jsonc.js.map +1 -0
  62. package/dist/src/linter.d.ts +19 -0
  63. package/dist/src/linter.d.ts.map +1 -0
  64. package/dist/src/linter.js +274 -0
  65. package/dist/src/linter.js.map +1 -0
  66. package/dist/src/output/jsonFormatter.d.ts +3 -0
  67. package/dist/src/output/jsonFormatter.d.ts.map +1 -0
  68. package/dist/src/output/jsonFormatter.js +26 -0
  69. package/dist/src/output/jsonFormatter.js.map +1 -0
  70. package/dist/src/output/sarifFormatter.d.ts +3 -0
  71. package/dist/src/output/sarifFormatter.d.ts.map +1 -0
  72. package/dist/src/output/sarifFormatter.js +110 -0
  73. package/dist/src/output/sarifFormatter.js.map +1 -0
  74. package/dist/src/output/textFormatter.d.ts +3 -0
  75. package/dist/src/output/textFormatter.d.ts.map +1 -0
  76. package/dist/src/output/textFormatter.js +61 -0
  77. package/dist/src/output/textFormatter.js.map +1 -0
  78. package/dist/src/rules/identifierRules.d.ts +6 -0
  79. package/dist/src/rules/identifierRules.d.ts.map +1 -0
  80. package/dist/src/rules/identifierRules.js +322 -0
  81. package/dist/src/rules/identifierRules.js.map +1 -0
  82. package/dist/src/rules/importRules.d.ts +6 -0
  83. package/dist/src/rules/importRules.d.ts.map +1 -0
  84. package/dist/src/rules/importRules.js +164 -0
  85. package/dist/src/rules/importRules.js.map +1 -0
  86. package/dist/src/rules/index.d.ts +4 -0
  87. package/dist/src/rules/index.d.ts.map +1 -0
  88. package/dist/src/rules/index.js +21 -0
  89. package/dist/src/rules/index.js.map +1 -0
  90. package/dist/src/rules/syntaxRules.d.ts +6 -0
  91. package/dist/src/rules/syntaxRules.d.ts.map +1 -0
  92. package/dist/src/rules/syntaxRules.js +221 -0
  93. package/dist/src/rules/syntaxRules.js.map +1 -0
  94. package/dist/src/rules/testRules.d.ts +3 -0
  95. package/dist/src/rules/testRules.d.ts.map +1 -0
  96. package/dist/src/rules/testRules.js +79 -0
  97. package/dist/src/rules/testRules.js.map +1 -0
  98. package/dist/src/types.d.ts +54 -0
  99. package/dist/src/types.d.ts.map +1 -0
  100. package/dist/src/types.js +3 -0
  101. package/dist/src/types.js.map +1 -0
  102. package/package.json +52 -0
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatText = formatText;
4
+ const SEVERITY_COLORS = {
5
+ error: '\x1b[31m', // red
6
+ warning: '\x1b[33m', // yellow
7
+ info: '\x1b[36m', // cyan
8
+ hint: '\x1b[90m', // gray
9
+ };
10
+ const RESET = '\x1b[0m';
11
+ const BOLD = '\x1b[1m';
12
+ const DIM = '\x1b[2m';
13
+ function groupByFile(diagnostics) {
14
+ const groups = new Map();
15
+ for (const d of diagnostics) {
16
+ const existing = groups.get(d.filePath) ?? [];
17
+ existing.push(d);
18
+ groups.set(d.filePath, existing);
19
+ }
20
+ return groups;
21
+ }
22
+ function formatText(result, useColors = true) {
23
+ const c = useColors ? SEVERITY_COLORS : { error: '', warning: '', info: '', hint: '' };
24
+ const reset = useColors ? RESET : '';
25
+ const bold = useColors ? BOLD : '';
26
+ const dim = useColors ? DIM : '';
27
+ const lines = [];
28
+ const grouped = groupByFile(result.diagnostics);
29
+ for (const [filePath, diagnostics] of grouped) {
30
+ lines.push('');
31
+ lines.push(`${bold}${filePath}${reset}`);
32
+ const sorted = diagnostics.sort((a, b) => a.line - b.line || a.column - b.column);
33
+ for (const d of sorted) {
34
+ const sevColor = c[d.severity] ?? '';
35
+ const loc = `${dim}${d.line + 1}:${d.column + 1}${reset}`;
36
+ const sev = `${sevColor}${d.severity.padEnd(7)}${reset}`;
37
+ const code = `${dim}${d.code}${reset}`;
38
+ lines.push(` ${loc} ${sev} ${d.message} ${code}`);
39
+ }
40
+ }
41
+ if (result.diagnostics.length > 0) {
42
+ lines.push('');
43
+ const parts = [];
44
+ if (result.errorCount > 0)
45
+ parts.push(`${c['error']}${result.errorCount} error${result.errorCount !== 1 ? 's' : ''}${reset}`);
46
+ if (result.warningCount > 0)
47
+ parts.push(`${c['warning']}${result.warningCount} warning${result.warningCount !== 1 ? 's' : ''}${reset}`);
48
+ if (result.infoCount > 0)
49
+ parts.push(`${c['info']}${result.infoCount} info${reset}`);
50
+ if (result.hintCount > 0)
51
+ parts.push(`${c['hint']}${result.hintCount} hint${result.hintCount !== 1 ? 's' : ''}${reset}`);
52
+ lines.push(`✖ ${parts.join(', ')} in ${result.fileCount} file${result.fileCount !== 1 ? 's' : ''}`);
53
+ }
54
+ else {
55
+ lines.push('');
56
+ lines.push(`✓ No issues found in ${result.fileCount} file${result.fileCount !== 1 ? 's' : ''}`);
57
+ }
58
+ lines.push('');
59
+ return lines.join('\n');
60
+ }
61
+ //# sourceMappingURL=textFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textFormatter.js","sourceRoot":"","sources":["../../../src/output/textFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { LintDiagnostic, RuleContext } from '../types';
2
+ export declare function checkUndefinedCalls(ctx: RuleContext): LintDiagnostic[];
3
+ export declare function checkUndefinedVariables(ctx: RuleContext): LintDiagnostic[];
4
+ export declare function checkShadowedBuiltins(ctx: RuleContext): LintDiagnostic[];
5
+ export declare function checkUnusedParameters(ctx: RuleContext): LintDiagnostic[];
6
+ //# sourceMappingURL=identifierRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifierRules.d.ts","sourceRoot":"","sources":["../../../src/rules/identifierRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAqD5D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CA6EtE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CA0E1E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CA+DxE;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CAsDxE"}
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkUndefinedCalls = checkUndefinedCalls;
4
+ exports.checkUndefinedVariables = checkUndefinedVariables;
5
+ exports.checkShadowedBuiltins = checkShadowedBuiltins;
6
+ exports.checkUnusedParameters = checkUnusedParameters;
7
+ const builtins_1 = require("../catalog/builtins");
8
+ const textUtils_1 = require("../analysis/textUtils");
9
+ const textUtils_2 = require("../analysis/textUtils");
10
+ const scopeAnalysis_1 = require("../analysis/scopeAnalysis");
11
+ const CALL_RE = /(?<![.\w])([a-zA-Z_]\w*)\s*\(/g;
12
+ const DECL_RE = /^\s*(?:function|sub)\s+\w+\s*\(/i;
13
+ const EXPR_IDENT_RE = /(?<![.\w])([a-zA-Z_]\w*)/g;
14
+ const _alwaysValidVarIdents = new Set(['m']);
15
+ function collectLocalNames(lines) {
16
+ const names = new Set();
17
+ const ASSIGN_RE = /^\s*(?:m\.)?([a-zA-Z_]\w*)[&%!#$]?(?:\s*\[[^\]]*\])?\s*(?:\+|-|\*|\/|\\|<<|>>)?=/;
18
+ const FOR_RE = /^\s*for\s+(?:each\s+)?([a-zA-Z_]\w*)\b/i;
19
+ const CATCH_VAR_RE = /^\s*catch\s+\(?([a-zA-Z_]\w*)\)?/i;
20
+ for (const line of lines) {
21
+ const assignMatch = ASSIGN_RE.exec(line);
22
+ if (assignMatch) {
23
+ const n = assignMatch[1].toLowerCase();
24
+ if (!builtins_1.keywordNames.has(n))
25
+ names.add(n);
26
+ }
27
+ const forMatch = FOR_RE.exec(line);
28
+ if (forMatch)
29
+ names.add(forMatch[1].toLowerCase());
30
+ const strippedForParams = (0, textUtils_1.stripStringLiterals)(line, true);
31
+ const paramListMatch = scopeAnalysis_1.PARAM_LIST_RE.exec(strippedForParams);
32
+ if (paramListMatch && paramListMatch[1].trim()) {
33
+ for (const part of paramListMatch[1].split(',')) {
34
+ const nm = /^\s*([a-zA-Z_]\w*)/.exec(part.trim());
35
+ if (nm) {
36
+ const p = nm[1].toLowerCase();
37
+ if (!builtins_1.keywordNames.has(p))
38
+ names.add(p);
39
+ }
40
+ }
41
+ }
42
+ const catchMatch = CATCH_VAR_RE.exec(line);
43
+ if (catchMatch)
44
+ names.add(catchMatch[1].toLowerCase());
45
+ }
46
+ return names;
47
+ }
48
+ function checkUndefinedCalls(ctx) {
49
+ const { lines, filePath, config, lintContext } = ctx;
50
+ if (config['identifier/undefined-function'] === 'off' && config['identifier/wrong-arg-count'] === 'off')
51
+ return [];
52
+ const isMainFile = /[/\\]main\.brs$/i.test(filePath);
53
+ if (isMainFile)
54
+ return [];
55
+ const localNames = collectLocalNames(lines);
56
+ const inMainBody = (0, scopeAnalysis_1.computeMainBodyLines)(lines);
57
+ const knownFuncNames = lintContext.knownFuncNames;
58
+ const diagnostics = [];
59
+ for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
60
+ const raw = lines[lineIdx];
61
+ if (/^\s*'/.test(raw) || /^\s*rem\b/i.test(raw))
62
+ continue;
63
+ if (/^\s*#/i.test(raw))
64
+ continue;
65
+ if (DECL_RE.test(raw))
66
+ continue;
67
+ if (/^\s*dim\b/i.test(raw))
68
+ continue;
69
+ if (/^\s*throw\b/i.test(raw))
70
+ continue;
71
+ if (inMainBody[lineIdx])
72
+ continue;
73
+ const stripped = (0, textUtils_1.stripStringLiterals)(raw, true);
74
+ CALL_RE.lastIndex = 0;
75
+ let match;
76
+ while ((match = CALL_RE.exec(stripped)) !== null) {
77
+ const name = match[1];
78
+ const nameLower = name.toLowerCase();
79
+ if (builtins_1.keywordNames.has(nameLower))
80
+ continue;
81
+ if (builtins_1.builtinNames.has(nameLower)) {
82
+ if (config['identifier/wrong-arg-count'] !== 'off') {
83
+ const arity = builtins_1.builtinArity.get(nameLower);
84
+ if (arity) {
85
+ const openParenPos = match.index + match[0].length - 1;
86
+ const argCount = (0, scopeAnalysis_1.countCallArgs)(stripped, openParenPos);
87
+ if (argCount !== null && (argCount < arity.min || argCount > arity.max)) {
88
+ const expected = arity.min === arity.max
89
+ ? `${arity.min} argument${arity.min !== 1 ? 's' : ''}`
90
+ : `${arity.min}–${arity.max} arguments`;
91
+ const got = `${argCount} ${argCount !== 1 ? 'were' : 'was'}`;
92
+ diagnostics.push({
93
+ severity: config['identifier/wrong-arg-count'] ?? 'error',
94
+ code: 'identifier/wrong-arg-count',
95
+ message: `'${name}' expects ${expected} but ${got} provided.`,
96
+ line: lineIdx,
97
+ column: match.index,
98
+ endLine: lineIdx,
99
+ endColumn: match.index + name.length,
100
+ filePath,
101
+ });
102
+ }
103
+ }
104
+ }
105
+ continue;
106
+ }
107
+ if (knownFuncNames.has(nameLower))
108
+ continue;
109
+ if (localNames.has(nameLower))
110
+ continue;
111
+ if (config['identifier/undefined-function'] !== 'off') {
112
+ diagnostics.push({
113
+ severity: config['identifier/undefined-function'] ?? 'error',
114
+ code: 'identifier/undefined-function',
115
+ message: `Unknown function '${name}'. It is not defined in this file or any reachable @import.`,
116
+ line: lineIdx,
117
+ column: match.index,
118
+ endLine: lineIdx,
119
+ endColumn: match.index + name.length,
120
+ filePath,
121
+ });
122
+ }
123
+ }
124
+ }
125
+ return diagnostics;
126
+ }
127
+ function checkUndefinedVariables(ctx) {
128
+ const { lines, filePath, config, lintContext } = ctx;
129
+ if (config['identifier/undefined-variable'] === 'off')
130
+ return [];
131
+ const scopes = (0, scopeAnalysis_1.buildFunctionScopes)(lines);
132
+ const knownFuncNames = lintContext.knownFuncNames;
133
+ const diagnostics = [];
134
+ for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
135
+ const raw = lines[lineIdx];
136
+ if (!raw)
137
+ continue;
138
+ if (/^\s*'/.test(raw) || /^\s*rem\b/i.test(raw))
139
+ continue;
140
+ if (/^\s*#/i.test(raw))
141
+ continue;
142
+ if (DECL_RE.test(raw))
143
+ continue;
144
+ if (/^\s*dim\b/i.test(raw))
145
+ continue;
146
+ const scope = (0, scopeAnalysis_1.findScopeAtLine)(scopes, lineIdx);
147
+ if (!scope)
148
+ continue;
149
+ const scopeVars = new Set([...scope.params, ...scope.vars]);
150
+ const stripped = (0, textUtils_1.stripStringLiterals)(raw, true);
151
+ const LVALUE_RE = /^\s*(?:m\.)?([a-zA-Z_]\w*)[&%!#$]?(?:\s*\[[^\]]*\])?\s*(?:\+|-|\*|\/|\\|<<|>>)?=/;
152
+ const lvalueMatch = LVALUE_RE.exec(stripped);
153
+ const lvalue = lvalueMatch ? lvalueMatch[1].toLowerCase() : null;
154
+ EXPR_IDENT_RE.lastIndex = 0;
155
+ let match;
156
+ while ((match = EXPR_IDENT_RE.exec(stripped)) !== null) {
157
+ const name = match[1];
158
+ const nameLower = name.toLowerCase();
159
+ const after = stripped.slice(match.index + name.length).trimStart();
160
+ if (after.startsWith('(') || after.startsWith(':') || after.startsWith('.'))
161
+ continue;
162
+ if (builtins_1.keywordNames.has(nameLower))
163
+ continue;
164
+ if (builtins_1.builtinNames.has(nameLower))
165
+ continue;
166
+ if (_alwaysValidVarIdents.has(nameLower))
167
+ continue;
168
+ if (knownFuncNames.has(nameLower))
169
+ continue;
170
+ if (lvalue !== null && nameLower === lvalue)
171
+ continue;
172
+ if (scopeVars.has(nameLower))
173
+ continue;
174
+ if (lineIdx === scope.startLine && scope.name === '' && match.index < scope.startColumn) {
175
+ const parentScope = (0, scopeAnalysis_1.findParentScopeAtLine)(scopes, lineIdx, scope);
176
+ if (parentScope) {
177
+ const parentVars = new Set([...parentScope.params, ...parentScope.vars]);
178
+ if (parentVars.has(nameLower))
179
+ continue;
180
+ }
181
+ }
182
+ if (lineIdx === scope.endLine) {
183
+ const endKw = /\b(?:end\s*(?:function|sub)|endfunction|endsub)\b/i.exec(stripped);
184
+ if (endKw && match.index >= endKw.index + endKw[0].length) {
185
+ const parentScope = (0, scopeAnalysis_1.findParentScopeAtLine)(scopes, lineIdx, scope);
186
+ if (parentScope) {
187
+ const parentVars = new Set([...parentScope.params, ...parentScope.vars]);
188
+ if (parentVars.has(nameLower))
189
+ continue;
190
+ }
191
+ }
192
+ }
193
+ diagnostics.push({
194
+ severity: config['identifier/undefined-variable'] ?? 'error',
195
+ code: 'identifier/undefined-variable',
196
+ message: `'${name}' is used but never defined in this scope.`,
197
+ line: lineIdx,
198
+ column: match.index,
199
+ endLine: lineIdx,
200
+ endColumn: match.index + name.length,
201
+ filePath,
202
+ });
203
+ }
204
+ }
205
+ return diagnostics;
206
+ }
207
+ function checkShadowedBuiltins(ctx) {
208
+ const { lines, filePath, config } = ctx;
209
+ if (config['identifier/shadows-builtin'] === 'off')
210
+ return [];
211
+ const diagnostics = [];
212
+ const severity = config['identifier/shadows-builtin'] ?? 'error';
213
+ const ASSIGN_RE = /^\s*(?:m\.)?([a-zA-Z_]\w*)[&%!#$]?(?:\s*\[[^\]]*\])?\s*(?:\+|-|\*|\/|\\|<<|>>)?=/;
214
+ const FOR_RE = /^\s*for\s+(?:each\s+)?([a-zA-Z_]\w*)\b/i;
215
+ const DIM_RE = /^\s*dim\s+([a-zA-Z_]\w*)\s*\(/i;
216
+ const CATCH_RE = /^\s*catch\s+\(?([a-zA-Z_]\w*)\)?/i;
217
+ for (let i = 0; i < lines.length; i++) {
218
+ const line = lines[i];
219
+ if (/^\s*'/.test(line) || /^\s*rem\b/i.test(line))
220
+ continue;
221
+ const stripped = (0, textUtils_1.stripStringLiterals)(line, true);
222
+ // Check function/sub parameters
223
+ const funcMatch = /\b(?:function|sub)\b\s*(?:[a-zA-Z_]\w*\s*)?\(([^)]*)\)/i.exec(stripped);
224
+ if (funcMatch && funcMatch[1].trim()) {
225
+ const paramsStr = funcMatch[1];
226
+ const paramsStart = stripped.indexOf(paramsStr, funcMatch.index);
227
+ for (const part of paramsStr.split(',')) {
228
+ const nm = /^\s*([a-zA-Z_]\w*)/.exec(part.trim());
229
+ if (nm) {
230
+ const paramName = nm[1];
231
+ if (builtins_1.builtinNames.has(paramName.toLowerCase())) {
232
+ const col = stripped.indexOf(paramName, paramsStart);
233
+ diagnostics.push({
234
+ severity,
235
+ code: 'identifier/shadows-builtin',
236
+ message: `'${paramName}' shadows the built-in global function '${paramName}'. Use a different name to avoid hiding the built-in.`,
237
+ line: i, column: col >= 0 ? col : 0, endLine: i, endColumn: (col >= 0 ? col : 0) + paramName.length, filePath,
238
+ });
239
+ }
240
+ }
241
+ }
242
+ }
243
+ const checks = [
244
+ { re: ASSIGN_RE, match: ASSIGN_RE.exec(stripped) },
245
+ { re: FOR_RE, match: FOR_RE.exec(stripped) },
246
+ { re: DIM_RE, match: DIM_RE.exec(stripped) },
247
+ { re: CATCH_RE, match: CATCH_RE.exec(stripped) },
248
+ ];
249
+ for (const { match: m } of checks) {
250
+ if (!m)
251
+ continue;
252
+ const varName = m[1];
253
+ if (builtins_1.builtinNames.has(varName.toLowerCase())) {
254
+ const col = stripped.indexOf(varName, m.index);
255
+ diagnostics.push({
256
+ severity,
257
+ code: 'identifier/shadows-builtin',
258
+ message: `'${varName}' shadows the built-in global function '${varName}'. Use a different name to avoid hiding the built-in.`,
259
+ line: i, column: col >= 0 ? col : 0, endLine: i, endColumn: (col >= 0 ? col : 0) + varName.length, filePath,
260
+ });
261
+ }
262
+ }
263
+ }
264
+ return diagnostics;
265
+ }
266
+ function checkUnusedParameters(ctx) {
267
+ const { lines, filePath, config } = ctx;
268
+ if (config['identifier/unused-parameter'] === 'off')
269
+ return [];
270
+ const FUNC_DECL_RE = /^\s*(?:function|sub)\s+\w+\s*\(([^)]*)\)/i;
271
+ const ANON_FUNC_RE = /(?:function|sub)\s*\(([^)]*)\)/i;
272
+ const diagnostics = [];
273
+ for (let i = 0; i < lines.length; i++) {
274
+ const line = lines[i];
275
+ if (/^\s*'/.test(line) || /^\s*rem\b/i.test(line))
276
+ continue;
277
+ const funcMatch = FUNC_DECL_RE.exec(line) || ANON_FUNC_RE.exec(line);
278
+ if (!funcMatch || !funcMatch[1].trim())
279
+ continue;
280
+ const params = [];
281
+ for (const param of funcMatch[1].split(',')) {
282
+ const nameMatch = /^\s*(\w+)/.exec(param.trim());
283
+ if (!nameMatch)
284
+ continue;
285
+ const name = nameMatch[1];
286
+ if (name.startsWith('_'))
287
+ continue;
288
+ const col = line.indexOf(name, funcMatch.index);
289
+ params.push({ name, col: col >= 0 ? col : 0 });
290
+ }
291
+ if (params.length === 0)
292
+ continue;
293
+ const bodyLines = [];
294
+ let depth = 1;
295
+ for (let j = i + 1; j < lines.length && depth > 0; j++) {
296
+ const bLine = lines[j];
297
+ if (/^\s*'/.test(bLine) || /^\s*rem\b/i.test(bLine))
298
+ continue;
299
+ const stripped = bLine.replace(/'.*$/, '');
300
+ if (/\b(?:function|sub)\s*\(/i.test(stripped))
301
+ depth++;
302
+ if (/^\s*end\s*(?:function|sub)\b/i.test(stripped))
303
+ depth--;
304
+ if (depth > 0)
305
+ bodyLines.push((0, textUtils_1.stripStringLiterals)(stripped, true));
306
+ }
307
+ const bodyText = bodyLines.join('\n');
308
+ for (const param of params) {
309
+ const used = new RegExp(`\\b${(0, textUtils_2.escapeRegex)(param.name)}\\b`, 'i').test(bodyText);
310
+ if (!used) {
311
+ diagnostics.push({
312
+ severity: config['identifier/unused-parameter'] ?? 'hint',
313
+ code: 'identifier/unused-parameter',
314
+ message: `Parameter "${param.name}" is never used. Prefix with \`_\` to indicate it is intentionally unused.`,
315
+ line: i, column: param.col, endLine: i, endColumn: param.col + param.name.length, filePath,
316
+ });
317
+ }
318
+ }
319
+ }
320
+ return diagnostics;
321
+ }
322
+ //# sourceMappingURL=identifierRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identifierRules.js","sourceRoot":"","sources":["../../../src/rules/identifierRules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { LintDiagnostic, RuleContext } from '../types';
2
+ /**
3
+ * Checks for duplicate, malformed, wrong-style, build-generated, and unresolved imports.
4
+ */
5
+ export declare function checkImports(ctx: RuleContext): LintDiagnostic[];
6
+ //# sourceMappingURL=importRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importRules.d.ts","sourceRoot":"","sources":["../../../src/rules/importRules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAiB,MAAM,UAAU,CAAC;AAqB3E;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,EAAE,CA2G/D"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkImports = checkImports;
4
+ const globMatcher_1 = require("../analysis/globMatcher");
5
+ const functionIndex_1 = require("../analysis/functionIndex");
6
+ const textUtils_1 = require("../analysis/textUtils");
7
+ const textUtils_2 = require("../analysis/textUtils");
8
+ function lineRange(lineIndex, filePath) {
9
+ return { line: lineIndex, column: 0, endLine: lineIndex, endColumn: Number.MAX_SAFE_INTEGER, filePath };
10
+ }
11
+ const IMPLICIT_MOCK_DEPS = [
12
+ { pathPattern: /\/PromiseResolve\.brs$/i, usagePattern: /\.resolvedValue\s*\(/i },
13
+ { pathPattern: /\/PromiseReject\.brs$/i, usagePattern: /\.rejectedValue\s*\(/i },
14
+ ];
15
+ function isImplicitMockDependency(importPath, corpus) {
16
+ return IMPLICIT_MOCK_DEPS.some((dep) => dep.pathPattern.test(importPath) && dep.usagePattern.test(corpus));
17
+ }
18
+ /**
19
+ * Checks for duplicate, malformed, wrong-style, build-generated, and unresolved imports.
20
+ */
21
+ function checkImports(ctx) {
22
+ const diagnostics = [];
23
+ const { filePath, lines, imports, config, lintContext } = ctx;
24
+ const seenImportKeys = new Set();
25
+ for (const imp of imports) {
26
+ const lineIndex = imp.line - 1;
27
+ const lineText = lines[lineIndex] ?? '';
28
+ const annotationType = imp.isMock ? '@mock' : '@import';
29
+ // import/duplicate
30
+ if (config['import/duplicate'] !== 'off') {
31
+ const importKey = `${imp.importPath}|${imp.fromModule ?? ''}`;
32
+ if (seenImportKeys.has(importKey)) {
33
+ diagnostics.push({
34
+ severity: config['import/duplicate'] ?? 'error',
35
+ code: 'import/duplicate',
36
+ message: `Kopytko ${annotationType}: duplicate import "${imp.importPath}"${imp.fromModule ? ` from "${imp.fromModule}"` : ''}.`,
37
+ ...lineRange(lineIndex, filePath),
38
+ });
39
+ continue;
40
+ }
41
+ seenImportKeys.add(importKey);
42
+ }
43
+ // import/missing-path
44
+ if (config['import/missing-path'] !== 'off') {
45
+ if (!imp.importPath || imp.importPath.trim() === '') {
46
+ diagnostics.push({
47
+ severity: config['import/missing-path'] ?? 'error',
48
+ code: 'import/missing-path',
49
+ message: `Kopytko ${annotationType}: missing import path.`,
50
+ ...lineRange(lineIndex, filePath),
51
+ });
52
+ continue;
53
+ }
54
+ }
55
+ // import/path-not-absolute
56
+ if (config['import/path-not-absolute'] !== 'off') {
57
+ if (!imp.importPath.startsWith('/')) {
58
+ diagnostics.push({
59
+ severity: config['import/path-not-absolute'] ?? 'warning',
60
+ code: 'import/path-not-absolute',
61
+ message: `Kopytko ${annotationType}: path "${imp.importPath}" should start with "/".`,
62
+ ...lineRange(lineIndex, filePath),
63
+ });
64
+ }
65
+ }
66
+ // import/wrong-comment-style
67
+ if (config['import/wrong-comment-style'] !== 'off') {
68
+ if (lineText.includes('"@import') || lineText.includes('"@mock')) {
69
+ diagnostics.push({
70
+ severity: config['import/wrong-comment-style'] ?? 'error',
71
+ code: 'import/wrong-comment-style',
72
+ message: `Kopytko ${annotationType} must be written as a line comment starting with an apostrophe ('), not a double quote.`,
73
+ ...lineRange(lineIndex, filePath),
74
+ });
75
+ }
76
+ }
77
+ // File resolution checks
78
+ const resolved = lintContext.resolveImportPath(imp.importPath, imp.fromModule);
79
+ if (resolved !== null) {
80
+ // Skip unused-import check for @mock
81
+ if (!imp.isMock && config['import/unused'] !== 'off') {
82
+ const unusedDiag = checkUnusedImport(resolved, imp, lineIndex, lines, filePath, ctx);
83
+ if (unusedDiag)
84
+ diagnostics.push(unusedDiag);
85
+ }
86
+ continue;
87
+ }
88
+ // import/build-generated
89
+ if (config['import/build-generated'] !== 'off') {
90
+ const matchedPattern = (0, globMatcher_1.findMatchingGlob)(imp.importPath, lintContext.generatedPaths)
91
+ ?? lintContext.generatedModules.find((gm) => (0, globMatcher_1.matchesGlob)(imp.importPath, gm.path))?.path;
92
+ if (matchedPattern) {
93
+ diagnostics.push({
94
+ severity: config['import/build-generated'] ?? 'info',
95
+ code: 'import/build-generated',
96
+ message: `Kopytko ${annotationType}: "${imp.importPath}" is not on disk — it is expected to be generated during the build process (matches configured pattern "${matchedPattern}").`,
97
+ ...lineRange(lineIndex, filePath),
98
+ });
99
+ continue;
100
+ }
101
+ }
102
+ // import/unresolved
103
+ if (config['import/unresolved'] !== 'off') {
104
+ const label = imp.fromModule
105
+ ? `"${imp.importPath}" from "${imp.fromModule}"`
106
+ : `"${imp.importPath}"`;
107
+ const message = imp.fromModule
108
+ ? `Kopytko ${annotationType}: cannot resolve ${label}. Is "${imp.fromModule}" installed as an NPM dependency?`
109
+ : `Kopytko ${annotationType}: cannot resolve ${label}. Check the file path and the sourceDir configuration.`;
110
+ diagnostics.push({
111
+ severity: config['import/unresolved'] ?? 'warning',
112
+ code: 'import/unresolved',
113
+ message,
114
+ ...lineRange(lineIndex, filePath),
115
+ });
116
+ }
117
+ }
118
+ return diagnostics;
119
+ }
120
+ function checkUnusedImport(resolvedPath, imp, lineIndex, fileLines, documentPath, ctx) {
121
+ const importedText = ctx.lintContext.readFile(resolvedPath);
122
+ if (importedText === null)
123
+ return null;
124
+ const fns = (0, functionIndex_1.parseFunctionDefs)(importedText, resolvedPath);
125
+ if (fns.length === 0)
126
+ return null;
127
+ const linesToCorpus = (lines, skipIndex = -1) => lines
128
+ .filter((_, i) => i !== skipIndex)
129
+ .map((line) => {
130
+ if (/^\s*'/.test(line) || /^\s*rem\b/i.test(line))
131
+ return '';
132
+ return (0, textUtils_1.stripStringLiterals)(line, true);
133
+ })
134
+ .join('\n');
135
+ const corpora = [linesToCorpus(fileLines, lineIndex)];
136
+ for (const siblingPath of ctx.lintContext.getSiblingFiles(documentPath)) {
137
+ const siblingText = ctx.lintContext.readFile(siblingPath);
138
+ if (siblingText !== null) {
139
+ corpora.push(linesToCorpus(siblingText.split(/\r?\n/)));
140
+ }
141
+ }
142
+ if (ctx.lintContext.isTestFile(documentPath)) {
143
+ for (const siblingTest of ctx.lintContext.getTestSiblings(documentPath)) {
144
+ const sibText = ctx.lintContext.readFile(siblingTest);
145
+ if (sibText !== null) {
146
+ corpora.push(linesToCorpus(sibText.split(/\r?\n/)));
147
+ }
148
+ }
149
+ }
150
+ const corpus = corpora.join('\n');
151
+ const anyUsed = fns.some((fn) => new RegExp(`\\b${(0, textUtils_2.escapeRegex)(fn.name)}\\b`, 'i').test(corpus));
152
+ if (anyUsed)
153
+ return null;
154
+ if (ctx.lintContext.isTestFile(documentPath) && isImplicitMockDependency(imp.importPath, corpus)) {
155
+ return null;
156
+ }
157
+ return {
158
+ severity: (ctx.config['import/unused'] === 'off' ? 'warning' : ctx.config['import/unused']) ?? 'warning',
159
+ code: 'import/unused',
160
+ message: `Kopytko @import: "${imp.importPath}" is imported but none of its exported functions are referenced in this file.`,
161
+ ...lineRange(lineIndex, documentPath),
162
+ };
163
+ }
164
+ //# sourceMappingURL=importRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importRules.js","sourceRoot":"","sources":["../../../src/rules/importRules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { RuleDefinition } from '../types';
2
+ /** All rule groups as single functions that check multiple codes internally. */
3
+ export declare const ALL_RULE_GROUPS: RuleDefinition[];
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM/C,gFAAgF;AAChF,eAAO,MAAM,eAAe,EAAE,cAAc,EAW3C,CAAC"}