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,54 @@
1
+ "use strict";
2
+ /**
3
+ * kopytko-linter — BrightScript linter for the Kopytko ecosystem.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { lintProject, lintFile, DEFAULT_LINTER_CONFIG } from 'kopytko-linter';
8
+ *
9
+ * // CLI mode: lint a whole project
10
+ * const result = lintProject('/path/to/project');
11
+ *
12
+ * // Library mode: lint a single file with pre-built context
13
+ * const diagnostics = lintFile(filePath, content, context, config);
14
+ * ```
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.escapeRegex = exports.stripStringLiterals = exports.findTestSiblings = exports.getTestBaseName = exports.isTestFile = exports.parseInnerMethodDefs = exports.parseFunctionDefs = exports.ImportResolver = exports.parseImports = exports.findComponent = exports.keywordNames = exports.builtinNames = exports.findBuiltin = exports.BRIGHTSCRIPT_KEYWORDS = exports.BRIGHTSCRIPT_BUILTINS = exports.formatSarif = exports.formatJson = exports.formatText = exports.resolveConfig = exports.parseLinterConfig = exports.DEFAULT_RULE_CONFIG = exports.DEFAULT_LINTER_CONFIG = exports.createFileContext = exports.lintProject = exports.lintFile = void 0;
18
+ var linter_1 = require("./linter");
19
+ Object.defineProperty(exports, "lintFile", { enumerable: true, get: function () { return linter_1.lintFile; } });
20
+ Object.defineProperty(exports, "lintProject", { enumerable: true, get: function () { return linter_1.lintProject; } });
21
+ Object.defineProperty(exports, "createFileContext", { enumerable: true, get: function () { return linter_1.createFileContext; } });
22
+ var config_1 = require("./config");
23
+ Object.defineProperty(exports, "DEFAULT_LINTER_CONFIG", { enumerable: true, get: function () { return config_1.DEFAULT_LINTER_CONFIG; } });
24
+ Object.defineProperty(exports, "DEFAULT_RULE_CONFIG", { enumerable: true, get: function () { return config_1.DEFAULT_RULE_CONFIG; } });
25
+ Object.defineProperty(exports, "parseLinterConfig", { enumerable: true, get: function () { return config_1.parseLinterConfig; } });
26
+ Object.defineProperty(exports, "resolveConfig", { enumerable: true, get: function () { return config_1.resolveConfig; } });
27
+ var textFormatter_1 = require("./output/textFormatter");
28
+ Object.defineProperty(exports, "formatText", { enumerable: true, get: function () { return textFormatter_1.formatText; } });
29
+ var jsonFormatter_1 = require("./output/jsonFormatter");
30
+ Object.defineProperty(exports, "formatJson", { enumerable: true, get: function () { return jsonFormatter_1.formatJson; } });
31
+ var sarifFormatter_1 = require("./output/sarifFormatter");
32
+ Object.defineProperty(exports, "formatSarif", { enumerable: true, get: function () { return sarifFormatter_1.formatSarif; } });
33
+ var builtins_1 = require("./catalog/builtins");
34
+ Object.defineProperty(exports, "BRIGHTSCRIPT_BUILTINS", { enumerable: true, get: function () { return builtins_1.BRIGHTSCRIPT_BUILTINS; } });
35
+ Object.defineProperty(exports, "BRIGHTSCRIPT_KEYWORDS", { enumerable: true, get: function () { return builtins_1.BRIGHTSCRIPT_KEYWORDS; } });
36
+ Object.defineProperty(exports, "findBuiltin", { enumerable: true, get: function () { return builtins_1.findBuiltin; } });
37
+ Object.defineProperty(exports, "builtinNames", { enumerable: true, get: function () { return builtins_1.builtinNames; } });
38
+ Object.defineProperty(exports, "keywordNames", { enumerable: true, get: function () { return builtins_1.keywordNames; } });
39
+ var components_1 = require("./catalog/components");
40
+ Object.defineProperty(exports, "findComponent", { enumerable: true, get: function () { return components_1.findComponent; } });
41
+ var importParser_1 = require("./analysis/importParser");
42
+ Object.defineProperty(exports, "parseImports", { enumerable: true, get: function () { return importParser_1.parseImports; } });
43
+ Object.defineProperty(exports, "ImportResolver", { enumerable: true, get: function () { return importParser_1.ImportResolver; } });
44
+ var functionIndex_1 = require("./analysis/functionIndex");
45
+ Object.defineProperty(exports, "parseFunctionDefs", { enumerable: true, get: function () { return functionIndex_1.parseFunctionDefs; } });
46
+ Object.defineProperty(exports, "parseInnerMethodDefs", { enumerable: true, get: function () { return functionIndex_1.parseInnerMethodDefs; } });
47
+ var testUtils_1 = require("./analysis/testUtils");
48
+ Object.defineProperty(exports, "isTestFile", { enumerable: true, get: function () { return testUtils_1.isTestFile; } });
49
+ Object.defineProperty(exports, "getTestBaseName", { enumerable: true, get: function () { return testUtils_1.getTestBaseName; } });
50
+ Object.defineProperty(exports, "findTestSiblings", { enumerable: true, get: function () { return testUtils_1.findTestSiblings; } });
51
+ var textUtils_1 = require("./analysis/textUtils");
52
+ Object.defineProperty(exports, "stripStringLiterals", { enumerable: true, get: function () { return textUtils_1.stripStringLiterals; } });
53
+ Object.defineProperty(exports, "escapeRegex", { enumerable: true, get: function () { return textUtils_1.escapeRegex; } });
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAEH,mCAAoE;AAA3D,kGAAA,QAAQ,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AACjD,mCAAsH;AAA/F,+GAAA,qBAAqB,OAAA;AAAE,6GAAA,mBAAmB,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAAE,uGAAA,aAAa,OAAA;AAGnG,wDAAoD;AAA3C,2GAAA,UAAU,OAAA;AACnB,wDAAoD;AAA3C,2GAAA,UAAU,OAAA;AACnB,0DAAsD;AAA7C,6GAAA,WAAW,OAAA;AACpB,+CAA2H;AAAlH,iHAAA,qBAAqB,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAAE,uGAAA,WAAW,OAAA;AAAE,wGAAA,YAAY,OAAA;AAAE,wGAAA,YAAY,OAAA;AAC9F,mDAAqD;AAA5C,2GAAA,aAAa,OAAA;AACtB,wDAAuE;AAA9D,4GAAA,YAAY,OAAA;AAAE,8GAAA,cAAc,OAAA;AACrC,0DAAmF;AAA1E,kHAAA,iBAAiB,OAAA;AAAE,qHAAA,oBAAoB,OAAA;AAChD,kDAAqF;AAA5E,uGAAA,UAAU,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AACtD,kDAAwE;AAA/D,gHAAA,mBAAmB,OAAA;AAAE,wGAAA,WAAW,OAAA"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Strips JSONC features (single-line comments, block comments, trailing commas)
3
+ * while respecting string literals, then parses the result with JSON.parse.
4
+ */
5
+ export declare function parseJsonc(text: string): Record<string, unknown>;
6
+ //# sourceMappingURL=jsonc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonc.d.ts","sourceRoot":"","sources":["../../src/jsonc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwChE"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseJsonc = parseJsonc;
4
+ /**
5
+ * Strips JSONC features (single-line comments, block comments, trailing commas)
6
+ * while respecting string literals, then parses the result with JSON.parse.
7
+ */
8
+ function parseJsonc(text) {
9
+ let result = '';
10
+ let i = 0;
11
+ while (i < text.length) {
12
+ // String literal — copy verbatim (including any // or /* inside)
13
+ if (text[i] === '"') {
14
+ const start = i;
15
+ i++;
16
+ while (i < text.length && text[i] !== '"') {
17
+ if (text[i] === '\\')
18
+ i++; // skip escaped char
19
+ i++;
20
+ }
21
+ i++; // closing quote
22
+ result += text.slice(start, i);
23
+ continue;
24
+ }
25
+ // Single-line comment
26
+ if (text[i] === '/' && text[i + 1] === '/') {
27
+ while (i < text.length && text[i] !== '\n')
28
+ i++;
29
+ continue;
30
+ }
31
+ // Block comment
32
+ if (text[i] === '/' && text[i + 1] === '*') {
33
+ i += 2;
34
+ while (i < text.length && !(text[i] === '*' && text[i + 1] === '/'))
35
+ i++;
36
+ i += 2;
37
+ continue;
38
+ }
39
+ result += text[i];
40
+ i++;
41
+ }
42
+ // Remove trailing commas before } or ]
43
+ result = result.replace(/,(\s*[}\]])/g, '$1');
44
+ return JSON.parse(result);
45
+ }
46
+ //# sourceMappingURL=jsonc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonc.js","sourceRoot":"","sources":["../../src/jsonc.ts"],"names":[],"mappings":";;AAIA,gCAwCC;AA5CD;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAY;IACrC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,iEAAiE;QACjE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;oBAAE,CAAC,EAAE,CAAC,CAAC,oBAAoB;gBAC/C,CAAC,EAAE,CAAC;YACN,CAAC;YACD,CAAC,EAAE,CAAC,CAAC,gBAAgB;YACrB,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,sBAAsB;QACtB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,CAAC,EAAE,CAAC;YAChD,SAAS;QACX,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3C,CAAC,IAAI,CAAC,CAAC;YACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;gBAAE,CAAC,EAAE,CAAC;YACzE,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,CAAC;IACN,CAAC;IAED,uCAAuC;IACvC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IAE9C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { LintDiagnostic, LintResult } from './types';
2
+ import type { LintContext } from './context';
3
+ import type { LinterConfig } from './config';
4
+ /**
5
+ * Lints a single file with a pre-built context.
6
+ * Used by the extension (library mode) and internally by lintProject.
7
+ */
8
+ export declare function lintFile(filePath: string, content: string, context: LintContext, config: LinterConfig): LintDiagnostic[];
9
+ /**
10
+ * Lints all .brs files in a project directory.
11
+ * Used by the CLI (standalone mode).
12
+ */
13
+ export declare function lintProject(projectRoot: string, configOverride?: Partial<LinterConfig>): LintResult;
14
+ /**
15
+ * Overrides the context's knownFuncNames for a specific file.
16
+ * Called from lintFile to provide per-file known names.
17
+ */
18
+ export declare function createFileContext(baseContext: LintContext, filePath: string): LintContext;
19
+ //# sourceMappingURL=linter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAA8B,MAAM,SAAS,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAS7C;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,GACnB,cAAc,EAAE,CAuBlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GACrC,UAAU,CA8BZ;AAoID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQzF"}
@@ -0,0 +1,274 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.lintFile = lintFile;
40
+ exports.lintProject = lintProject;
41
+ exports.createFileContext = createFileContext;
42
+ const nodePath = __importStar(require("path"));
43
+ const config_1 = require("./config");
44
+ const index_1 = require("./rules/index");
45
+ const importParser_1 = require("./analysis/importParser");
46
+ const functionIndex_1 = require("./analysis/functionIndex");
47
+ const patternSiblings_1 = require("./analysis/patternSiblings");
48
+ const testUtils_1 = require("./analysis/testUtils");
49
+ const fsWrapper_1 = __importDefault(require("./analysis/fsWrapper"));
50
+ /**
51
+ * Lints a single file with a pre-built context.
52
+ * Used by the extension (library mode) and internally by lintProject.
53
+ */
54
+ function lintFile(filePath, content, context, config) {
55
+ const lines = content.split(/\r?\n/);
56
+ const imports = context.parseImports(content);
57
+ const ruleContext = {
58
+ filePath,
59
+ lines,
60
+ imports,
61
+ config: config.rules,
62
+ lintContext: context,
63
+ };
64
+ const diagnostics = [];
65
+ for (const ruleGroup of index_1.ALL_RULE_GROUPS) {
66
+ try {
67
+ diagnostics.push(...ruleGroup.fn(ruleContext));
68
+ }
69
+ catch {
70
+ // Never let a rule crash the entire lint run
71
+ }
72
+ }
73
+ return diagnostics;
74
+ }
75
+ /**
76
+ * Lints all .brs files in a project directory.
77
+ * Used by the CLI (standalone mode).
78
+ */
79
+ function lintProject(projectRoot, configOverride) {
80
+ const config = {
81
+ ...(0, config_1.resolveConfig)(projectRoot),
82
+ ...configOverride,
83
+ };
84
+ const context = buildProjectContext(projectRoot, config);
85
+ const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
86
+ const allDiagnostics = [];
87
+ for (const file of brsFiles) {
88
+ try {
89
+ const content = fsWrapper_1.default.readFileSync(file, 'utf-8');
90
+ const fileContext = createFileContext(context, file);
91
+ const diagnostics = lintFile(file, content, fileContext, config);
92
+ allDiagnostics.push(...diagnostics);
93
+ }
94
+ catch {
95
+ // skip unreadable files
96
+ }
97
+ }
98
+ return {
99
+ diagnostics: allDiagnostics,
100
+ fileCount: brsFiles.length,
101
+ errorCount: allDiagnostics.filter(d => d.severity === 'error').length,
102
+ warningCount: allDiagnostics.filter(d => d.severity === 'warning').length,
103
+ infoCount: allDiagnostics.filter(d => d.severity === 'info').length,
104
+ hintCount: allDiagnostics.filter(d => d.severity === 'hint').length,
105
+ };
106
+ }
107
+ function buildProjectContext(projectRoot, config) {
108
+ const importResolver = new importParser_1.ImportResolver({
109
+ workspaceFolders: [projectRoot],
110
+ sourceDir: config.sourceDir,
111
+ resolveModules: config.resolveModules,
112
+ });
113
+ // Build a project-wide function index
114
+ const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
115
+ const allFunctions = new Map();
116
+ const fileFunctions = new Map();
117
+ for (const file of brsFiles) {
118
+ try {
119
+ const text = fsWrapper_1.default.readFileSync(file, 'utf-8');
120
+ const fns = (0, functionIndex_1.parseFunctionDefs)(text, file);
121
+ fileFunctions.set(file, fns.map(f => f.nameLower));
122
+ }
123
+ catch { /* skip */ }
124
+ }
125
+ // For each file, compute its known function names from imports + siblings + self
126
+ for (const file of brsFiles) {
127
+ const known = new Set();
128
+ const selfFns = fileFunctions.get(file) ?? [];
129
+ for (const fn of selfFns)
130
+ known.add(fn);
131
+ try {
132
+ const text = fsWrapper_1.default.readFileSync(file, 'utf-8');
133
+ const imports = (0, importParser_1.parseImports)(text);
134
+ for (const imp of imports) {
135
+ if (imp.isMock)
136
+ continue;
137
+ const resolved = importResolver.resolveImportPath(imp, file);
138
+ if (resolved) {
139
+ const importedFns = fileFunctions.get(resolved);
140
+ if (importedFns) {
141
+ for (const fn of importedFns)
142
+ known.add(fn);
143
+ }
144
+ else {
145
+ // File not in our scan (external package) — read and parse
146
+ try {
147
+ const impText = fsWrapper_1.default.readFileSync(resolved, 'utf-8');
148
+ for (const fn of (0, functionIndex_1.parseFunctionDefs)(impText, resolved))
149
+ known.add(fn.nameLower);
150
+ }
151
+ catch { /* skip */ }
152
+ }
153
+ }
154
+ }
155
+ // Add sibling functions
156
+ for (const siblingPath of (0, patternSiblings_1.findSiblingFiles)(file, config.siblingPatterns)) {
157
+ const siblingFns = fileFunctions.get(siblingPath);
158
+ if (siblingFns) {
159
+ for (const fn of siblingFns)
160
+ known.add(fn);
161
+ }
162
+ }
163
+ // For test files, add tested file functions and test siblings
164
+ if ((0, testUtils_1.isTestFile)(file)) {
165
+ for (const testedPath of (0, testUtils_1.resolveTestedFiles)(file)) {
166
+ const testedFns = fileFunctions.get(testedPath);
167
+ if (testedFns) {
168
+ for (const fn of testedFns)
169
+ known.add(fn);
170
+ }
171
+ }
172
+ for (const siblingTest of (0, testUtils_1.findTestSiblings)(file)) {
173
+ const siblingFns = fileFunctions.get(siblingTest);
174
+ if (siblingFns) {
175
+ for (const fn of siblingFns)
176
+ known.add(fn);
177
+ }
178
+ }
179
+ }
180
+ }
181
+ catch { /* skip */ }
182
+ allFunctions.set(file, known);
183
+ }
184
+ return {
185
+ get knownFuncNames() { return new Set(); },
186
+ parseImports(text) {
187
+ return (0, importParser_1.parseImports)(text);
188
+ },
189
+ resolveImportPath(importPath, fromModule) {
190
+ const imp = { raw: '', importPath, fromModule, line: 0 };
191
+ return importResolver.resolveImportPath(imp, projectRoot) ?? null;
192
+ },
193
+ importExists(importPath, fromModule) {
194
+ return this.resolveImportPath(importPath, fromModule) !== null;
195
+ },
196
+ readFile(filePath) {
197
+ try {
198
+ return fsWrapper_1.default.readFileSync(filePath, 'utf-8');
199
+ }
200
+ catch {
201
+ return null;
202
+ }
203
+ },
204
+ parseFunctionsFromFile(filePath) {
205
+ const fns = fileFunctions.get(filePath);
206
+ if (fns)
207
+ return fns;
208
+ try {
209
+ const text = fsWrapper_1.default.readFileSync(filePath, 'utf-8');
210
+ return (0, functionIndex_1.parseFunctionDefs)(text, filePath).map(f => f.nameLower);
211
+ }
212
+ catch {
213
+ return [];
214
+ }
215
+ },
216
+ getSiblingFiles(filePath) {
217
+ return (0, patternSiblings_1.findSiblingFiles)(filePath, config.siblingPatterns);
218
+ },
219
+ getTestSiblings(filePath) {
220
+ return (0, testUtils_1.findTestSiblings)(filePath);
221
+ },
222
+ isTestFile(filePath) {
223
+ return (0, testUtils_1.isTestFile)(filePath);
224
+ },
225
+ generatedPaths: config.generatedPaths,
226
+ generatedModules: config.generatedModules,
227
+ siblingPatterns: config.siblingPatterns,
228
+ _allFunctions: allFunctions,
229
+ };
230
+ }
231
+ /**
232
+ * Overrides the context's knownFuncNames for a specific file.
233
+ * Called from lintFile to provide per-file known names.
234
+ */
235
+ function createFileContext(baseContext, filePath) {
236
+ const contextWithFunctions = baseContext;
237
+ const fileKnown = contextWithFunctions._allFunctions?.get(filePath) ?? new Set();
238
+ return {
239
+ ...baseContext,
240
+ knownFuncNames: fileKnown,
241
+ };
242
+ }
243
+ function collectBrsFiles(dir, sourceDir) {
244
+ const sourceRoot = nodePath.join(dir, sourceDir);
245
+ const files = [];
246
+ function walk(currentDir) {
247
+ let entries;
248
+ try {
249
+ entries = fsWrapper_1.default.readdirTyped(currentDir);
250
+ }
251
+ catch {
252
+ return;
253
+ }
254
+ for (const entry of entries) {
255
+ const fullPath = nodePath.join(currentDir, entry.name);
256
+ if (entry.isDirectory) {
257
+ if (entry.name === 'node_modules' || entry.name === '.git')
258
+ continue;
259
+ walk(fullPath);
260
+ }
261
+ else if (entry.name.endsWith('.brs')) {
262
+ files.push(fullPath);
263
+ }
264
+ }
265
+ }
266
+ if (fsWrapper_1.default.existsSync(sourceRoot)) {
267
+ walk(sourceRoot);
268
+ }
269
+ else {
270
+ walk(dir);
271
+ }
272
+ return files;
273
+ }
274
+ //# sourceMappingURL=linter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LintResult } from '../types';
2
+ export declare function formatJson(result: LintResult): string;
3
+ //# sourceMappingURL=jsonFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonFormatter.d.ts","sourceRoot":"","sources":["../../../src/output/jsonFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAqBrD"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatJson = formatJson;
4
+ function formatJson(result) {
5
+ return JSON.stringify({
6
+ diagnostics: result.diagnostics.map(d => ({
7
+ filePath: d.filePath,
8
+ line: d.line + 1,
9
+ column: d.column + 1,
10
+ endLine: d.endLine !== undefined ? d.endLine + 1 : undefined,
11
+ endColumn: d.endColumn !== undefined ? d.endColumn + 1 : undefined,
12
+ severity: d.severity,
13
+ code: d.code,
14
+ message: d.message,
15
+ })),
16
+ summary: {
17
+ fileCount: result.fileCount,
18
+ errorCount: result.errorCount,
19
+ warningCount: result.warningCount,
20
+ infoCount: result.infoCount,
21
+ hintCount: result.hintCount,
22
+ totalIssues: result.diagnostics.length,
23
+ },
24
+ }, null, 2);
25
+ }
26
+ //# sourceMappingURL=jsonFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonFormatter.js","sourceRoot":"","sources":["../../../src/output/jsonFormatter.ts"],"names":[],"mappings":";;AAEA,gCAqBC;AArBD,SAAgB,UAAU,CAAC,MAAkB;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxC,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5D,SAAS,EAAE,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;YAClE,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;QACH,OAAO,EAAE;YACP,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;SACvC;KACF,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LintResult } from '../types';
2
+ export declare function formatSarif(result: LintResult, projectRoot?: string): string;
3
+ //# sourceMappingURL=sarifFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarifFormatter.d.ts","sourceRoot":"","sources":["../../../src/output/sarifFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAgB,MAAM,UAAU,CAAC;AA6BzD,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CA2C5E"}
@@ -0,0 +1,110 @@
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.formatSarif = formatSarif;
37
+ const config_1 = require("../config");
38
+ const nodePath = __importStar(require("path"));
39
+ const SEVERITY_TO_SARIF = {
40
+ error: 'error',
41
+ warning: 'warning',
42
+ info: 'note',
43
+ hint: 'note',
44
+ };
45
+ function formatSarif(result, projectRoot) {
46
+ const rules = Object.entries(config_1.DEFAULT_RULE_CONFIG).map(([code, severity]) => ({
47
+ id: code,
48
+ shortDescription: { text: getRuleDescription(code) },
49
+ defaultConfiguration: { level: SEVERITY_TO_SARIF[severity] ?? 'warning' },
50
+ }));
51
+ const results = result.diagnostics.map(d => ({
52
+ ruleId: d.code,
53
+ level: SEVERITY_TO_SARIF[d.severity] ?? 'warning',
54
+ message: { text: d.message },
55
+ locations: [{
56
+ physicalLocation: {
57
+ artifactLocation: {
58
+ uri: projectRoot ? nodePath.relative(projectRoot, d.filePath).replace(/\\/g, '/') : d.filePath,
59
+ uriBaseId: '%SRCROOT%',
60
+ },
61
+ region: {
62
+ startLine: d.line + 1,
63
+ startColumn: d.column + 1,
64
+ ...(d.endLine !== undefined ? { endLine: d.endLine + 1 } : {}),
65
+ ...(d.endColumn !== undefined ? { endColumn: d.endColumn + 1 } : {}),
66
+ },
67
+ },
68
+ }],
69
+ }));
70
+ const sarif = {
71
+ $schema: 'https://json.schemastore.org/sarif-2.1.0.json',
72
+ version: '2.1.0',
73
+ runs: [{
74
+ tool: {
75
+ driver: {
76
+ name: 'kopytko-linter',
77
+ informationUri: 'https://github.com/bchelkowski/vscode-kopytko/tree/main/packages/kopytko-linter',
78
+ rules,
79
+ },
80
+ },
81
+ results,
82
+ }],
83
+ };
84
+ return JSON.stringify(sarif, null, 2);
85
+ }
86
+ function getRuleDescription(code) {
87
+ const descriptions = {
88
+ 'import/duplicate': 'Duplicate import detected',
89
+ 'import/missing-path': 'Import annotation missing path',
90
+ 'import/path-not-absolute': 'Import path should start with /',
91
+ 'import/wrong-comment-style': 'Import must use apostrophe comment style',
92
+ 'import/build-generated': 'Import path is build-generated',
93
+ 'import/unresolved': 'Cannot resolve import path',
94
+ 'import/unused': 'Imported file functions are not referenced',
95
+ 'identifier/undefined-function': 'Call to unknown function',
96
+ 'identifier/wrong-arg-count': 'Built-in function called with wrong argument count',
97
+ 'identifier/undefined-variable': 'Variable used but never defined in scope',
98
+ 'identifier/shadows-builtin': 'Variable name shadows a built-in function',
99
+ 'identifier/unused-parameter': 'Function parameter is never used',
100
+ 'throw/invalid-value': 'Invalid throw value type',
101
+ 'throw/missing-message': 'Thrown AA missing message field',
102
+ 'createobject/unknown-component': 'Unknown BrightScript component name',
103
+ 'syntax/trailing-comma': 'Trailing comma after return value',
104
+ 'syntax/flow-outside-loop': 'Loop flow control statement outside loop',
105
+ 'test/missing-mock-annotation': 'mockFunction target not in any @mock file',
106
+ 'test/missing-return-ts': 'Test suite function missing return ts',
107
+ };
108
+ return descriptions[code] ?? code;
109
+ }
110
+ //# sourceMappingURL=sarifFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarifFormatter.js","sourceRoot":"","sources":["../../../src/output/sarifFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LintResult } from '../types';
2
+ export declare function formatText(result: LintResult, useColors?: boolean): string;
3
+ //# sourceMappingURL=textFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textFormatter.d.ts","sourceRoot":"","sources":["../../../src/output/textFormatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,UAAU,CAAC;AAsB3D,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,UAAO,GAAG,MAAM,CAsCvE"}