kopytko-linter 0.1.3 → 0.2.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.
@@ -7,14 +7,15 @@ export interface ImportResolverOptions {
7
7
  }
8
8
  export declare class ImportResolver {
9
9
  private readonly options;
10
- private packageCache;
10
+ private readonly existsCache;
11
+ private readonly resolveCache;
11
12
  constructor(options: ImportResolverOptions);
13
+ cachedExists(filePath: string): boolean;
12
14
  getWorkspaceFolders(): string[];
13
15
  getSourceDir(): string;
14
16
  parseImports(text: string): KopytkoImport[];
15
17
  resolveImportPath(imp: KopytkoImport, documentPath: string): string | undefined;
16
18
  importExists(imp: KopytkoImport, documentPath: string): boolean;
17
- invalidatePackageCache(): void;
18
19
  private resolveInternalImport;
19
20
  private resolveExternalImport;
20
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"importParser.d.ts","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAkB1D;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,YAAY,CAAoC;gBAE5C,OAAO,EAAE,qBAAqB;IAI1C,mBAAmB,IAAI,MAAM,EAAE;IAI/B,YAAY,IAAI,MAAM;IAItB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAI3C,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAO/E,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAI/D,sBAAsB,IAAI,IAAI;IAI9B,OAAO,CAAC,qBAAqB;IA4B7B,OAAO,CAAC,qBAAqB;CA0B9B"}
1
+ {"version":3,"file":"importParser.d.ts","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAkB1D;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyC;gBAE1D,OAAO,EAAE,qBAAqB;IAI1C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUvC,mBAAmB,IAAI,MAAM,EAAE;IAI/B,YAAY,IAAI,MAAM;IAItB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAI3C,iBAAiB,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe/E,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAI/D,OAAO,CAAC,qBAAqB;IAwB7B,OAAO,CAAC,qBAAqB;CAwB9B"}
@@ -60,10 +60,20 @@ function parseImports(text) {
60
60
  }
61
61
  class ImportResolver {
62
62
  options;
63
- packageCache = null;
63
+ existsCache = new Map();
64
+ resolveCache = new Map();
64
65
  constructor(options) {
65
66
  this.options = options;
66
67
  }
68
+ cachedExists(filePath) {
69
+ const normalized = nodePath.normalize(filePath);
70
+ let result = this.existsCache.get(normalized);
71
+ if (result === undefined) {
72
+ result = fsWrapper_1.default.existsSync(filePath);
73
+ this.existsCache.set(normalized, result);
74
+ }
75
+ return result;
76
+ }
67
77
  getWorkspaceFolders() {
68
78
  return this.options.workspaceFolders;
69
79
  }
@@ -74,61 +84,59 @@ class ImportResolver {
74
84
  return parseImports(text);
75
85
  }
76
86
  resolveImportPath(imp, documentPath) {
77
- if (imp.fromModule) {
78
- return this.resolveExternalImport(imp.importPath, imp.fromModule, documentPath);
79
- }
80
- return this.resolveInternalImport(imp.importPath, documentPath);
87
+ // Cache key: importPath + fromModule + documentDir (resolution depends on where the file is)
88
+ const docDir = nodePath.dirname(nodePath.normalize(documentPath));
89
+ const cacheKey = `${imp.importPath}|${imp.fromModule ?? ''}|${docDir}`;
90
+ const cached = this.resolveCache.get(cacheKey);
91
+ if (cached !== undefined)
92
+ return cached || undefined;
93
+ const result = imp.fromModule
94
+ ? this.resolveExternalImport(imp.importPath, imp.fromModule, documentPath)
95
+ : this.resolveInternalImport(imp.importPath, documentPath);
96
+ this.resolveCache.set(cacheKey, result ?? '');
97
+ return result;
81
98
  }
82
99
  importExists(imp, documentPath) {
83
100
  return this.resolveImportPath(imp, documentPath) !== undefined;
84
101
  }
85
- invalidatePackageCache() {
86
- this.packageCache = null;
87
- }
88
102
  resolveInternalImport(importPath, documentPath) {
89
103
  const { workspaceFolders, sourceDir } = this.options;
90
- // Try each workspace folder: <root>/<sourceDir><importPath> then <root><importPath>
91
104
  for (const folder of workspaceFolders) {
92
105
  const withSource = nodePath.join(folder, sourceDir, importPath);
93
- if (fsWrapper_1.default.existsSync(withSource))
106
+ if (this.cachedExists(withSource))
94
107
  return withSource;
95
108
  const direct = nodePath.join(folder, importPath);
96
- if (fsWrapper_1.default.existsSync(direct))
109
+ if (this.cachedExists(direct))
97
110
  return direct;
98
111
  }
99
- // If the document lives inside a node_modules package, resolve relative
100
- // to that package's kopytkoModuleDir root
101
112
  const pkgRoot = getNodeModulesPackageRoot(documentPath);
102
113
  if (pkgRoot) {
103
114
  const kopytkoDir = readKopytkoModuleDir(pkgRoot);
104
115
  const candidate = nodePath.join(pkgRoot, kopytkoDir, importPath);
105
- if (fsWrapper_1.default.existsSync(candidate))
116
+ if (this.cachedExists(candidate))
106
117
  return candidate;
107
118
  }
108
- // Last resort: resolve relative to the document's directory
109
119
  const relative = nodePath.resolve(nodePath.dirname(documentPath), importPath);
110
- if (fsWrapper_1.default.existsSync(relative))
120
+ if (this.cachedExists(relative))
111
121
  return relative;
112
122
  return undefined;
113
123
  }
114
124
  resolveExternalImport(importPath, moduleName, documentPath) {
115
125
  if (!this.options.resolveModules)
116
126
  return undefined;
117
- // Walk up from documentPath to find node_modules (like npm resolution)
118
127
  let dir = nodePath.dirname(documentPath);
119
128
  const maxDepth = 10;
120
129
  for (let i = 0; i < maxDepth; i++) {
121
130
  const modulePath = nodePath.join(dir, 'node_modules', moduleName);
122
- if (fsWrapper_1.default.existsSync(modulePath)) {
131
+ if (this.cachedExists(modulePath)) {
123
132
  const kopytkoDir = readKopytkoModuleDir(modulePath);
124
133
  const candidate = nodePath.join(modulePath, kopytkoDir, importPath);
125
- if (fsWrapper_1.default.existsSync(candidate))
134
+ if (this.cachedExists(candidate))
126
135
  return candidate;
127
- // Also try without the subdir
128
136
  const candidateRoot = nodePath.join(modulePath, importPath);
129
- if (fsWrapper_1.default.existsSync(candidateRoot))
137
+ if (this.cachedExists(candidateRoot))
130
138
  return candidateRoot;
131
- return undefined; // module found but file not found inside it
139
+ return undefined;
132
140
  }
133
141
  const parent = nodePath.dirname(dir);
134
142
  if (parent === dir)
@@ -1 +1 @@
1
- {"version":3,"file":"importParser.js","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"importParser.js","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Returns raw URI strings from all <script> tags in an XML text.
3
+ */
4
+ export declare function parseXmlScriptUris(xmlText: string): string[];
5
+ /**
6
+ * Resolves a script URI from an XML file to an absolute filesystem path.
7
+ * Supports `pkg:/path/file.brs` and relative paths.
8
+ */
9
+ export declare function resolveScriptUri(uri: string, xmlDir: string, workspaceFolders: string[], sourceDir: string, cachedExists?: (path: string) => boolean): string | undefined;
10
+ /**
11
+ * Returns absolute paths for all BrightScript files listed in an XML's <script> tags.
12
+ */
13
+ export declare function getScriptPathsFromXml(xmlPath: string, xmlText: string, workspaceFolders: string[], sourceDir: string, cachedExists?: (path: string) => boolean): string[];
14
+ /**
15
+ * Returns the `extends` attribute value from a <component> tag, or null.
16
+ */
17
+ export declare function parseXmlExtends(xmlText: string): string | null;
18
+ /**
19
+ * Returns the `name` attribute value from a <component> tag, or null.
20
+ */
21
+ export declare function parseXmlComponentName(xmlText: string): string | null;
22
+ export interface XmlInterfaceField {
23
+ name: string;
24
+ type: string;
25
+ }
26
+ export interface XmlInterfaceFunction {
27
+ name: string;
28
+ }
29
+ export interface ParsedXmlInterface {
30
+ fields: XmlInterfaceField[];
31
+ functions: XmlInterfaceFunction[];
32
+ }
33
+ /**
34
+ * Parses the <interface> section of a SceneGraph XML file.
35
+ */
36
+ export declare function parseXmlInterface(xmlText: string): ParsedXmlInterface;
37
+ /**
38
+ * Finds a component's XML file by name across multiple search roots.
39
+ * Tries exact filename match first, then searches by <component name="..."> attribute.
40
+ */
41
+ export declare function findComponentXml(componentName: string, searchRoots: string[], maxDepth?: number): string | undefined;
42
+ //# sourceMappingURL=xmlParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmlParser.d.ts","sourceRoot":"","sources":["../../../src/analysis/xmlParser.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACvC,MAAM,GAAG,SAAS,CAepB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EAAE,EAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACvC,MAAM,EAAE,CAKV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CA2BrE;AA2DD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EAAE,EACrB,QAAQ,SAAI,GACX,MAAM,GAAG,SAAS,CAYpB"}
@@ -0,0 +1,220 @@
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.parseXmlScriptUris = parseXmlScriptUris;
40
+ exports.resolveScriptUri = resolveScriptUri;
41
+ exports.getScriptPathsFromXml = getScriptPathsFromXml;
42
+ exports.parseXmlExtends = parseXmlExtends;
43
+ exports.parseXmlComponentName = parseXmlComponentName;
44
+ exports.parseXmlInterface = parseXmlInterface;
45
+ exports.findComponentXml = findComponentXml;
46
+ const nodePath = __importStar(require("path"));
47
+ const fsWrapper_1 = __importDefault(require("./fsWrapper"));
48
+ /**
49
+ * Returns raw URI strings from all <script> tags in an XML text.
50
+ */
51
+ function parseXmlScriptUris(xmlText) {
52
+ const uris = [];
53
+ const pattern = /<script\b[^>]*\buri\s*=\s*"([^"]+)"[^>]*>/gi;
54
+ let match;
55
+ while ((match = pattern.exec(xmlText)) !== null) {
56
+ uris.push(match[1]);
57
+ }
58
+ return uris;
59
+ }
60
+ /**
61
+ * Resolves a script URI from an XML file to an absolute filesystem path.
62
+ * Supports `pkg:/path/file.brs` and relative paths.
63
+ */
64
+ function resolveScriptUri(uri, xmlDir, workspaceFolders, sourceDir, cachedExists) {
65
+ const exists = cachedExists ?? fsWrapper_1.default.existsSync;
66
+ if (uri.startsWith('pkg:/')) {
67
+ const rel = uri.slice(5);
68
+ for (const ws of workspaceFolders) {
69
+ const candidate = nodePath.join(ws, sourceDir, rel);
70
+ if (exists(candidate))
71
+ return candidate;
72
+ const candidateRoot = nodePath.join(ws, rel);
73
+ if (exists(candidateRoot))
74
+ return candidateRoot;
75
+ }
76
+ return undefined;
77
+ }
78
+ const candidate = nodePath.join(xmlDir, uri);
79
+ return exists(candidate) ? candidate : undefined;
80
+ }
81
+ /**
82
+ * Returns absolute paths for all BrightScript files listed in an XML's <script> tags.
83
+ */
84
+ function getScriptPathsFromXml(xmlPath, xmlText, workspaceFolders, sourceDir, cachedExists) {
85
+ const xmlDir = nodePath.dirname(xmlPath);
86
+ return parseXmlScriptUris(xmlText)
87
+ .map((uri) => resolveScriptUri(uri, xmlDir, workspaceFolders, sourceDir, cachedExists))
88
+ .filter((p) => p !== undefined);
89
+ }
90
+ /**
91
+ * Returns the `extends` attribute value from a <component> tag, or null.
92
+ */
93
+ function parseXmlExtends(xmlText) {
94
+ const match = /<component\b[^>]*\bextends\s*=\s*["']([^"']+)["']/i.exec(xmlText);
95
+ return match ? match[1] : null;
96
+ }
97
+ /**
98
+ * Returns the `name` attribute value from a <component> tag, or null.
99
+ */
100
+ function parseXmlComponentName(xmlText) {
101
+ const match = /<component\b[^>]*\bname\s*=\s*["']([^"']+)["']/i.exec(xmlText);
102
+ return match ? match[1] : null;
103
+ }
104
+ /**
105
+ * Parses the <interface> section of a SceneGraph XML file.
106
+ */
107
+ function parseXmlInterface(xmlText) {
108
+ const fields = [];
109
+ const functions = [];
110
+ const ifaceMatch = /<interface\b[^>]*>([\s\S]*?)<\/interface>/i.exec(xmlText);
111
+ if (!ifaceMatch)
112
+ return { fields, functions };
113
+ const ifaceText = ifaceMatch[1];
114
+ const fieldRe = /<field\b([^>]*)>/gi;
115
+ let m;
116
+ while ((m = fieldRe.exec(ifaceText)) !== null) {
117
+ const attrs = m[1];
118
+ const idMatch = /\bid\s*=\s*["']([^"']+)["']/i.exec(attrs);
119
+ const typeMatch = /\btype\s*=\s*["']([^"']+)["']/i.exec(attrs);
120
+ if (idMatch) {
121
+ fields.push({ name: idMatch[1], type: typeMatch ? typeMatch[1] : 'dynamic' });
122
+ }
123
+ }
124
+ const funcRe = /<function\b([^>]*)>/gi;
125
+ while ((m = funcRe.exec(ifaceText)) !== null) {
126
+ const attrs = m[1];
127
+ const nameMatch = /\bname\s*=\s*["']([^"']+)["']/i.exec(attrs);
128
+ if (nameMatch)
129
+ functions.push({ name: nameMatch[1] });
130
+ }
131
+ return { fields, functions };
132
+ }
133
+ /**
134
+ * Searches directories recursively for a file by name.
135
+ */
136
+ function findFileInTree(dir, filename, depth) {
137
+ if (depth < 0)
138
+ return undefined;
139
+ let entries;
140
+ try {
141
+ entries = fsWrapper_1.default.readdirTyped(dir);
142
+ }
143
+ catch {
144
+ return undefined;
145
+ }
146
+ for (const entry of entries) {
147
+ if (!entry.isDirectory && entry.name === filename) {
148
+ return nodePath.join(dir, entry.name);
149
+ }
150
+ }
151
+ for (const entry of entries) {
152
+ if (!entry.isDirectory)
153
+ continue;
154
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
155
+ continue;
156
+ const found = findFileInTree(nodePath.join(dir, entry.name), filename, depth - 1);
157
+ if (found)
158
+ return found;
159
+ }
160
+ return undefined;
161
+ }
162
+ /**
163
+ * Searches directories for an XML file whose <component name="..."> matches.
164
+ */
165
+ function findXmlByComponentName(dir, nameLower, depth) {
166
+ if (depth < 0)
167
+ return undefined;
168
+ let entries;
169
+ try {
170
+ entries = fsWrapper_1.default.readdirTyped(dir);
171
+ }
172
+ catch {
173
+ return undefined;
174
+ }
175
+ for (const entry of entries) {
176
+ if (entry.isDirectory)
177
+ continue;
178
+ if (!entry.name.endsWith('.xml'))
179
+ continue;
180
+ const xmlPath = nodePath.join(dir, entry.name);
181
+ try {
182
+ const text = fsWrapper_1.default.readFileSync(xmlPath, 'utf-8');
183
+ const nameMatch = /<component\b[^>]*\bname\s*=\s*"([^"]+)"/i.exec(text);
184
+ if (nameMatch && nameMatch[1].toLowerCase() === nameLower) {
185
+ return xmlPath;
186
+ }
187
+ }
188
+ catch { /* skip */ }
189
+ }
190
+ for (const entry of entries) {
191
+ if (!entry.isDirectory)
192
+ continue;
193
+ if (entry.name.startsWith('.') || entry.name === 'node_modules')
194
+ continue;
195
+ const found = findXmlByComponentName(nodePath.join(dir, entry.name), nameLower, depth - 1);
196
+ if (found)
197
+ return found;
198
+ }
199
+ return undefined;
200
+ }
201
+ /**
202
+ * Finds a component's XML file by name across multiple search roots.
203
+ * Tries exact filename match first, then searches by <component name="..."> attribute.
204
+ */
205
+ function findComponentXml(componentName, searchRoots, maxDepth = 8) {
206
+ const filename = `${componentName}.xml`;
207
+ for (const root of searchRoots) {
208
+ const found = findFileInTree(root, filename, maxDepth);
209
+ if (found)
210
+ return found;
211
+ }
212
+ const nameLower = componentName.toLowerCase();
213
+ for (const root of searchRoots) {
214
+ const found = findXmlByComponentName(root, nameLower, maxDepth);
215
+ if (found)
216
+ return found;
217
+ }
218
+ return undefined;
219
+ }
220
+ //# sourceMappingURL=xmlParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmlParser.js","sourceRoot":"","sources":["../../../src/analysis/xmlParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Kopytko test framework global functions.
3
+ * Available in all .test.brs files without explicit @import.
4
+ *
5
+ * Kept in sync with the extension's src/server/kopytko/testFramework.ts.
6
+ */
7
+ export declare const TEST_FRAMEWORK_GLOBALS: string[];
8
+ //# sourceMappingURL=testGlobals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testGlobals.d.ts","sourceRoot":"","sources":["../../../src/catalog/testGlobals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAU1C,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Kopytko test framework global functions.
4
+ * Available in all .test.brs files without explicit @import.
5
+ *
6
+ * Kept in sync with the extension's src/server/kopytko/testFramework.ts.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.TEST_FRAMEWORK_GLOBALS = void 0;
10
+ exports.TEST_FRAMEWORK_GLOBALS = [
11
+ // Test suite helpers
12
+ 'it', 'test', 'iteach', 'testeach',
13
+ 'beforeeach', 'aftereach', 'beforeall', 'afterall',
14
+ // Assertions & mocking
15
+ 'expect', 'mockfunction',
16
+ // Test utilities
17
+ 'fakeclock', 'initkopytko', 'forceupdate', 'destroykopytko',
18
+ // Test suite object
19
+ 'ts',
20
+ ];
21
+ //# sourceMappingURL=testGlobals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testGlobals.js","sourceRoot":"","sources":["../../../src/catalog/testGlobals.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,sBAAsB,GAAa;IAC9C,qBAAqB;IACrB,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU;IAClC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU;IAClD,uBAAuB;IACvB,QAAQ,EAAE,cAAc;IACxB,iBAAiB;IACjB,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB;IAC3D,oBAAoB;IACpB,IAAI;CACL,CAAC"}
@@ -5,7 +5,7 @@ import type { LinterConfig } from './config';
5
5
  * Lints a single file with a pre-built context.
6
6
  * Used by the extension (library mode) and internally by lintProject.
7
7
  */
8
- export declare function lintFile(filePath: string, content: string, context: LintContext, config: LinterConfig): LintDiagnostic[];
8
+ export declare function lintFile(filePath: string, content: string, context: LintContext, config: LinterConfig, preLines?: string[]): LintDiagnostic[];
9
9
  /**
10
10
  * Lints all .brs files in a project directory.
11
11
  * Used by the CLI (standalone mode).
@@ -1 +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;AA8JD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQzF"}
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;AAW7C;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,YAAY,EACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,cAAc,EAAE,CAuBlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GACrC,UAAU,CA2BZ;AAyVD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQzF"}
@@ -46,13 +46,15 @@ const importParser_1 = require("./analysis/importParser");
46
46
  const functionIndex_1 = require("./analysis/functionIndex");
47
47
  const patternSiblings_1 = require("./analysis/patternSiblings");
48
48
  const testUtils_1 = require("./analysis/testUtils");
49
+ const xmlParser_1 = require("./analysis/xmlParser");
50
+ const testGlobals_1 = require("./catalog/testGlobals");
49
51
  const fsWrapper_1 = __importDefault(require("./analysis/fsWrapper"));
50
52
  /**
51
53
  * Lints a single file with a pre-built context.
52
54
  * Used by the extension (library mode) and internally by lintProject.
53
55
  */
54
- function lintFile(filePath, content, context, config) {
55
- const lines = content.split(/\r?\n/);
56
+ function lintFile(filePath, content, context, config, preLines) {
57
+ const lines = preLines ?? content.split(/\r?\n/);
56
58
  const imports = context.parseImports(content);
57
59
  const ruleContext = {
58
60
  filePath,
@@ -81,19 +83,15 @@ function lintProject(projectRoot, configOverride) {
81
83
  ...(0, config_1.resolveConfig)(projectRoot),
82
84
  ...configOverride,
83
85
  };
84
- const context = buildProjectContext(projectRoot, config);
85
- const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
86
+ const { context, brsFiles, fileContentsCache } = buildProjectContext(projectRoot, config);
86
87
  const allDiagnostics = [];
87
88
  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
- }
89
+ const content = fileContentsCache.get(nodePath.normalize(file));
90
+ if (!content)
91
+ continue;
92
+ const fileContext = createFileContext(context, file);
93
+ const diagnostics = lintFile(file, content, fileContext, config);
94
+ allDiagnostics.push(...diagnostics);
97
95
  }
98
96
  return {
99
97
  diagnostics: allDiagnostics,
@@ -110,107 +108,298 @@ function buildProjectContext(projectRoot, config) {
110
108
  sourceDir: config.sourceDir,
111
109
  resolveModules: config.resolveModules,
112
110
  });
113
- // Build a project-wide function index
114
- const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
115
- const allFunctions = new Map();
111
+ const workspaceFolders = [projectRoot];
112
+ const sourceDir = config.sourceDir;
113
+ // ── Phase 1: Scan all BRS and XML files (project + packages, single pass) ──
114
+ const brsFiles = [];
115
+ const fileContentsCache = new Map();
116
116
  const fileFunctions = new Map();
117
+ const fileImports = new Map();
118
+ const componentNameToXml = new Map(); // lowercase component name → xml path
119
+ const xmlTextCache = new Map(); // normalized xml path → content
120
+ const brsToXmlParents = new Map(); // normalized brs path → xml paths
121
+ // Walk a directory collecting BRS files and indexing XML component names
122
+ function walkAndIndex(dir, collectBrs) {
123
+ let entries;
124
+ try {
125
+ entries = fsWrapper_1.default.readdirTyped(dir);
126
+ }
127
+ catch {
128
+ return;
129
+ }
130
+ for (const entry of entries) {
131
+ const fullPath = nodePath.join(dir, entry.name);
132
+ if (entry.isDirectory) {
133
+ if (entry.name === 'node_modules' || entry.name === '.git')
134
+ continue;
135
+ walkAndIndex(fullPath, collectBrs);
136
+ }
137
+ else if (entry.name.endsWith('.brs') && collectBrs) {
138
+ brsFiles.push(fullPath);
139
+ }
140
+ else if (entry.name.endsWith('.xml')) {
141
+ try {
142
+ const text = fsWrapper_1.default.readFileSync(fullPath, 'utf-8');
143
+ const normalized = nodePath.normalize(fullPath);
144
+ xmlTextCache.set(normalized, text);
145
+ fileContentsCache.set(normalized, text);
146
+ const name = (0, xmlParser_1.parseXmlComponentName)(text);
147
+ if (name)
148
+ componentNameToXml.set(name.toLowerCase(), normalized);
149
+ }
150
+ catch { /* skip */ }
151
+ }
152
+ }
153
+ }
154
+ // Scan project source (collect BRS + XML)
155
+ const sourceRoot = nodePath.join(projectRoot, sourceDir);
156
+ const walkRoot = fsWrapper_1.default.existsSync(sourceRoot) ? sourceRoot : projectRoot;
157
+ walkAndIndex(walkRoot, true);
158
+ // Scan Kopytko packages (XML only — for extends chain resolution)
159
+ const nmDir = nodePath.join(projectRoot, 'node_modules');
160
+ try {
161
+ for (const entry of fsWrapper_1.default.readdirTyped(nmDir)) {
162
+ if (!entry.isDirectory)
163
+ continue;
164
+ if (entry.name.startsWith('@')) {
165
+ try {
166
+ for (const scoped of fsWrapper_1.default.readdirTyped(nodePath.join(nmDir, entry.name))) {
167
+ if (!scoped.isDirectory)
168
+ continue;
169
+ const pkgDir = nodePath.join(nmDir, entry.name, scoped.name);
170
+ const moduleDir = readKopytkoModuleDir(pkgDir);
171
+ if (moduleDir)
172
+ walkAndIndex(nodePath.join(pkgDir, moduleDir), false);
173
+ }
174
+ }
175
+ catch { /* skip */ }
176
+ }
177
+ else {
178
+ const pkgDir = nodePath.join(nmDir, entry.name);
179
+ const moduleDir = readKopytkoModuleDir(pkgDir);
180
+ if (moduleDir)
181
+ walkAndIndex(nodePath.join(pkgDir, moduleDir), false);
182
+ }
183
+ }
184
+ }
185
+ catch { /* no node_modules */ }
186
+ // ── Phase 2: Parse all BRS files ──
117
187
  for (const file of brsFiles) {
118
188
  try {
119
189
  const text = fsWrapper_1.default.readFileSync(file, 'utf-8');
120
- const fns = (0, functionIndex_1.parseFunctionDefs)(text, file);
121
- fileFunctions.set(nodePath.normalize(file), fns.map(f => f.nameLower));
190
+ const normalized = nodePath.normalize(file);
191
+ fileContentsCache.set(normalized, text);
192
+ fileFunctions.set(normalized, (0, functionIndex_1.parseFunctionDefs)(text, file).map(f => f.nameLower));
193
+ fileImports.set(normalized, (0, importParser_1.parseImports)(text));
122
194
  }
123
195
  catch { /* skip */ }
124
196
  }
125
- // For each file, compute its known function names from imports + siblings + self
197
+ // Build BRS→XML parent mapping from indexed XML files
198
+ for (const [xmlPath, xmlText] of xmlTextCache) {
199
+ const scriptPaths = (0, xmlParser_1.getScriptPathsFromXml)(xmlPath, xmlText, workspaceFolders, sourceDir, (p) => importResolver.cachedExists(p));
200
+ for (const scriptPath of scriptPaths) {
201
+ const normalizedScript = nodePath.normalize(scriptPath);
202
+ const parents = brsToXmlParents.get(normalizedScript) ?? [];
203
+ parents.push(xmlPath);
204
+ brsToXmlParents.set(normalizedScript, parents);
205
+ }
206
+ }
207
+ // ── Phase 3: Cached helpers ──
208
+ const allFunctions = new Map();
209
+ const readFileCached = (filePath) => {
210
+ const normalized = nodePath.normalize(filePath);
211
+ const cached = fileContentsCache.get(normalized);
212
+ if (cached !== undefined)
213
+ return cached;
214
+ try {
215
+ const text = fsWrapper_1.default.readFileSync(filePath, 'utf-8');
216
+ fileContentsCache.set(normalized, text);
217
+ return text;
218
+ }
219
+ catch {
220
+ return null;
221
+ }
222
+ };
223
+ const getFunctions = (filePath) => {
224
+ const normalized = nodePath.normalize(filePath);
225
+ const cached = fileFunctions.get(normalized);
226
+ if (cached)
227
+ return cached;
228
+ const text = readFileCached(filePath);
229
+ if (!text)
230
+ return [];
231
+ const fns = (0, functionIndex_1.parseFunctionDefs)(text, filePath).map(f => f.nameLower);
232
+ fileFunctions.set(normalized, fns);
233
+ return fns;
234
+ };
235
+ const getImports = (filePath) => {
236
+ const normalized = nodePath.normalize(filePath);
237
+ const cached = fileImports.get(normalized);
238
+ if (cached)
239
+ return cached;
240
+ const text = readFileCached(filePath);
241
+ if (!text)
242
+ return [];
243
+ const imports = (0, importParser_1.parseImports)(text);
244
+ fileImports.set(normalized, imports);
245
+ return imports;
246
+ };
247
+ // Collect functions from an XML component's extends chain (map-based, no filesystem traversal)
248
+ const extendsCache = new Map();
249
+ const collectFromExtendsChain = (componentNameLower) => {
250
+ const cached = extendsCache.get(componentNameLower);
251
+ if (cached)
252
+ return cached;
253
+ const fns = [];
254
+ const visitedComponents = new Set();
255
+ const walk = (nameLower) => {
256
+ if (visitedComponents.has(nameLower))
257
+ return;
258
+ visitedComponents.add(nameLower);
259
+ const xmlPath = componentNameToXml.get(nameLower);
260
+ if (!xmlPath)
261
+ return;
262
+ const xmlText = xmlTextCache.get(xmlPath) ?? readFileCached(xmlPath);
263
+ if (!xmlText)
264
+ return;
265
+ // Add functions from all BRS scripts listed in this XML
266
+ const scriptPaths = (0, xmlParser_1.getScriptPathsFromXml)(xmlPath, xmlText, workspaceFolders, sourceDir, (p) => importResolver.cachedExists(p));
267
+ for (const scriptPath of scriptPaths) {
268
+ for (const fn of getFunctions(scriptPath))
269
+ fns.push(fn);
270
+ // Follow the script's @import chain
271
+ const visited = new Set();
272
+ const followImports = (file) => {
273
+ for (const imp of getImports(file)) {
274
+ if (imp.isMock)
275
+ continue;
276
+ const resolved = importResolver.resolveImportPath(imp, file);
277
+ if (!resolved)
278
+ continue;
279
+ const norm = nodePath.normalize(resolved);
280
+ if (visited.has(norm))
281
+ continue;
282
+ visited.add(norm);
283
+ for (const fn of getFunctions(resolved))
284
+ fns.push(fn);
285
+ followImports(resolved);
286
+ }
287
+ };
288
+ followImports(scriptPath);
289
+ }
290
+ // Walk up the extends chain
291
+ const parentName = (0, xmlParser_1.parseXmlExtends)(xmlText);
292
+ if (parentName)
293
+ walk(parentName.toLowerCase());
294
+ };
295
+ walk(componentNameLower);
296
+ extendsCache.set(componentNameLower, fns);
297
+ return fns;
298
+ };
299
+ // ── Phase 4: Build per-file known function names ──
126
300
  for (const file of brsFiles) {
301
+ const normalizedFile = nodePath.normalize(file);
127
302
  const known = new Set();
128
- const selfFns = fileFunctions.get(file) ?? [];
129
- for (const fn of selfFns)
303
+ for (const fn of (fileFunctions.get(normalizedFile) ?? []))
130
304
  known.add(fn);
131
- try {
132
- const text = fsWrapper_1.default.readFileSync(file, 'utf-8');
133
- const imports = (0, importParser_1.parseImports)(text);
134
- // Collect functions from imports (transitively)
135
- const visited = new Set();
136
- const collectFromImports = (fileToParse, imps) => {
137
- for (const imp of imps) {
138
- if (imp.isMock)
139
- continue;
140
- const resolved = importResolver.resolveImportPath(imp, fileToParse);
141
- if (!resolved || visited.has(resolved))
142
- continue;
143
- visited.add(resolved);
144
- const normalizedResolved = nodePath.normalize(resolved);
145
- const importedFns = fileFunctions.get(normalizedResolved);
146
- if (importedFns) {
147
- for (const fn of importedFns)
148
- known.add(fn);
149
- }
150
- else {
151
- try {
152
- const impText = fsWrapper_1.default.readFileSync(resolved, 'utf-8');
153
- for (const fn of (0, functionIndex_1.parseFunctionDefs)(impText, resolved))
154
- known.add(fn.nameLower);
155
- // Follow transitive imports
156
- collectFromImports(resolved, (0, importParser_1.parseImports)(impText));
157
- }
158
- catch { /* skip */ }
159
- }
160
- }
161
- };
162
- collectFromImports(file, imports);
163
- // Add sibling functions (and their imports)
164
- for (const siblingPath of (0, patternSiblings_1.findSiblingFiles)(file, config.siblingPatterns)) {
165
- const normalizedSibling = nodePath.normalize(siblingPath);
166
- const siblingFns = fileFunctions.get(normalizedSibling);
167
- if (siblingFns) {
168
- for (const fn of siblingFns)
305
+ // Add test framework globals for test files
306
+ if ((0, testUtils_1.isTestFile)(file)) {
307
+ for (const fn of testGlobals_1.TEST_FRAMEWORK_GLOBALS)
308
+ known.add(fn);
309
+ }
310
+ // Collect functions from @import chain (transitively)
311
+ const visited = new Set();
312
+ const collectFromImports = (sourceFile, imps) => {
313
+ for (const imp of imps) {
314
+ if (imp.isMock)
315
+ continue;
316
+ const resolved = importResolver.resolveImportPath(imp, sourceFile);
317
+ if (!resolved)
318
+ continue;
319
+ const normalizedResolved = nodePath.normalize(resolved);
320
+ if (visited.has(normalizedResolved))
321
+ continue;
322
+ visited.add(normalizedResolved);
323
+ for (const fn of getFunctions(resolved))
324
+ known.add(fn);
325
+ collectFromImports(resolved, getImports(resolved));
326
+ }
327
+ };
328
+ collectFromImports(file, getImports(file));
329
+ // Add XML sibling functions — other BRS files in the same XML component
330
+ const parentXmls = brsToXmlParents.get(normalizedFile) ?? [];
331
+ for (const xmlPath of parentXmls) {
332
+ const xmlText = readFileCached(xmlPath);
333
+ if (!xmlText)
334
+ continue;
335
+ // Add all sibling BRS scripts from this XML
336
+ const scriptPaths = (0, xmlParser_1.getScriptPathsFromXml)(xmlPath, xmlText, workspaceFolders, sourceDir, (p) => importResolver.cachedExists(p));
337
+ for (const scriptPath of scriptPaths) {
338
+ const normalizedScript = nodePath.normalize(scriptPath);
339
+ if (normalizedScript === normalizedFile)
340
+ continue;
341
+ if (!visited.has(normalizedScript)) {
342
+ visited.add(normalizedScript);
343
+ for (const fn of getFunctions(scriptPath))
169
344
  known.add(fn);
345
+ collectFromImports(scriptPath, getImports(scriptPath));
170
346
  }
171
- // Also follow sibling's imports
172
- try {
173
- const sibText = fsWrapper_1.default.readFileSync(normalizedSibling, 'utf-8');
174
- collectFromImports(normalizedSibling, (0, importParser_1.parseImports)(sibText));
347
+ }
348
+ // Walk the extends chain and add inherited functions
349
+ const parentComponentName = (0, xmlParser_1.parseXmlExtends)(xmlText);
350
+ if (parentComponentName) {
351
+ for (const fn of collectFromExtendsChain(parentComponentName.toLowerCase())) {
352
+ known.add(fn);
175
353
  }
176
- catch { /* skip */ }
177
354
  }
178
- // For test files, add tested file functions and test siblings
179
- if ((0, testUtils_1.isTestFile)(file)) {
180
- for (const testedPath of (0, testUtils_1.resolveTestedFiles)(file)) {
181
- const normalizedTested = nodePath.normalize(testedPath);
182
- const testedFns = fileFunctions.get(normalizedTested);
183
- if (testedFns) {
184
- for (const fn of testedFns)
185
- known.add(fn);
186
- }
187
- // Also follow tested file's imports
188
- try {
189
- const testedText = fsWrapper_1.default.readFileSync(normalizedTested, 'utf-8');
190
- collectFromImports(normalizedTested, (0, importParser_1.parseImports)(testedText));
191
- }
192
- catch { /* skip */ }
355
+ }
356
+ // Add pattern sibling functions
357
+ for (const siblingPath of (0, patternSiblings_1.findSiblingFiles)(file, config.siblingPatterns)) {
358
+ const normalizedSibling = nodePath.normalize(siblingPath);
359
+ if (!visited.has(normalizedSibling)) {
360
+ visited.add(normalizedSibling);
361
+ for (const fn of getFunctions(siblingPath))
362
+ known.add(fn);
363
+ collectFromImports(siblingPath, getImports(siblingPath));
364
+ }
365
+ }
366
+ // For test files, add tested file scope
367
+ if ((0, testUtils_1.isTestFile)(file)) {
368
+ for (const testedPath of (0, testUtils_1.resolveTestedFiles)(file)) {
369
+ const normalizedTested = nodePath.normalize(testedPath);
370
+ if (!visited.has(normalizedTested)) {
371
+ visited.add(normalizedTested);
372
+ for (const fn of getFunctions(testedPath))
373
+ known.add(fn);
374
+ collectFromImports(testedPath, getImports(testedPath));
193
375
  }
194
- for (const siblingTest of (0, testUtils_1.findTestSiblings)(file)) {
195
- const normalizedSibTest = nodePath.normalize(siblingTest);
196
- const siblingFns = fileFunctions.get(normalizedSibTest);
197
- if (siblingFns) {
198
- for (const fn of siblingFns)
376
+ // Also add the tested file's XML extends chain
377
+ const testedXmls = brsToXmlParents.get(normalizedTested) ?? [];
378
+ for (const txmlPath of testedXmls) {
379
+ const txmlText = readFileCached(txmlPath);
380
+ if (!txmlText)
381
+ continue;
382
+ const parentName = (0, xmlParser_1.parseXmlExtends)(txmlText);
383
+ if (parentName) {
384
+ for (const fn of collectFromExtendsChain(parentName.toLowerCase())) {
199
385
  known.add(fn);
386
+ }
200
387
  }
201
- // Also follow sibling test's imports
202
- try {
203
- const sibTestText = fsWrapper_1.default.readFileSync(normalizedSibTest, 'utf-8');
204
- collectFromImports(normalizedSibTest, (0, importParser_1.parseImports)(sibTestText));
205
- }
206
- catch { /* skip */ }
388
+ }
389
+ }
390
+ for (const siblingTest of (0, testUtils_1.findTestSiblings)(file)) {
391
+ const normalizedSibTest = nodePath.normalize(siblingTest);
392
+ if (!visited.has(normalizedSibTest)) {
393
+ visited.add(normalizedSibTest);
394
+ for (const fn of getFunctions(siblingTest))
395
+ known.add(fn);
396
+ collectFromImports(siblingTest, getImports(siblingTest));
207
397
  }
208
398
  }
209
399
  }
210
- catch { /* skip */ }
211
- allFunctions.set(nodePath.normalize(file), known);
400
+ allFunctions.set(normalizedFile, known);
212
401
  }
213
- return {
402
+ const context = {
214
403
  get knownFuncNames() { return new Set(); },
215
404
  parseImports(text) {
216
405
  return (0, importParser_1.parseImports)(text);
@@ -223,24 +412,10 @@ function buildProjectContext(projectRoot, config) {
223
412
  return this.resolveImportPath(importPath, documentPath, fromModule) !== null;
224
413
  },
225
414
  readFile(filePath) {
226
- try {
227
- return fsWrapper_1.default.readFileSync(filePath, 'utf-8');
228
- }
229
- catch {
230
- return null;
231
- }
415
+ return readFileCached(filePath);
232
416
  },
233
417
  parseFunctionsFromFile(filePath) {
234
- const fns = fileFunctions.get(nodePath.normalize(filePath));
235
- if (fns)
236
- return fns;
237
- try {
238
- const text = fsWrapper_1.default.readFileSync(filePath, 'utf-8');
239
- return (0, functionIndex_1.parseFunctionDefs)(text, filePath).map(f => f.nameLower);
240
- }
241
- catch {
242
- return [];
243
- }
418
+ return getFunctions(filePath);
244
419
  },
245
420
  getSiblingFiles(filePath) {
246
421
  return (0, patternSiblings_1.findSiblingFiles)(filePath, config.siblingPatterns);
@@ -254,7 +429,11 @@ function buildProjectContext(projectRoot, config) {
254
429
  generatedPaths: config.generatedPaths,
255
430
  generatedModules: config.generatedModules,
256
431
  siblingPatterns: config.siblingPatterns,
257
- _allFunctions: allFunctions,
432
+ };
433
+ return {
434
+ context: Object.assign(context, { _allFunctions: allFunctions }),
435
+ brsFiles,
436
+ fileContentsCache,
258
437
  };
259
438
  }
260
439
  /**
@@ -269,35 +448,15 @@ function createFileContext(baseContext, filePath) {
269
448
  knownFuncNames: fileKnown,
270
449
  };
271
450
  }
272
- function collectBrsFiles(dir, sourceDir) {
273
- const sourceRoot = nodePath.join(dir, sourceDir);
274
- const files = [];
275
- function walk(currentDir) {
276
- let entries;
277
- try {
278
- entries = fsWrapper_1.default.readdirTyped(currentDir);
279
- }
280
- catch {
281
- return;
282
- }
283
- for (const entry of entries) {
284
- const fullPath = nodePath.join(currentDir, entry.name);
285
- if (entry.isDirectory) {
286
- if (entry.name === 'node_modules' || entry.name === '.git')
287
- continue;
288
- walk(fullPath);
289
- }
290
- else if (entry.name.endsWith('.brs')) {
291
- files.push(fullPath);
292
- }
293
- }
294
- }
295
- if (fsWrapper_1.default.existsSync(sourceRoot)) {
296
- walk(sourceRoot);
451
+ /** Read `kopytkoModuleDir` from a package's package.json. Returns null if not a Kopytko package. */
452
+ function readKopytkoModuleDir(pkgDir) {
453
+ try {
454
+ const content = fsWrapper_1.default.readFileSync(nodePath.join(pkgDir, 'package.json'), 'utf-8');
455
+ const pkg = JSON.parse(content);
456
+ return pkg.kopytkoModuleDir ?? null;
297
457
  }
298
- else {
299
- walk(dir);
458
+ catch {
459
+ return null;
300
460
  }
301
- return files;
302
461
  }
303
462
  //# sourceMappingURL=linter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kopytko-linter",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "BrightScript linter for the Kopytko ecosystem. Use as a CLI tool or import as a library.",
5
5
  "license": "MIT",
6
6
  "author": "bchelkowski",