kopytko-linter 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/analysis/importParser.d.ts +3 -2
- package/dist/src/analysis/importParser.d.ts.map +1 -1
- package/dist/src/analysis/importParser.js +30 -22
- package/dist/src/analysis/importParser.js.map +1 -1
- package/dist/src/catalog/testGlobals.d.ts +8 -0
- package/dist/src/catalog/testGlobals.d.ts.map +1 -0
- package/dist/src/catalog/testGlobals.js +21 -0
- package/dist/src/catalog/testGlobals.js.map +1 -0
- package/dist/src/linter.d.ts.map +1 -1
- package/dist/src/linter.js +116 -109
- package/dist/src/linter.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,14 +7,15 @@ export interface ImportResolverOptions {
|
|
|
7
7
|
}
|
|
8
8
|
export declare class ImportResolver {
|
|
9
9
|
private readonly options;
|
|
10
|
-
private
|
|
10
|
+
private readonly existsCache;
|
|
11
|
+
private readonly resolveCache;
|
|
11
12
|
constructor(options: ImportResolverOptions);
|
|
13
|
+
private cachedExists;
|
|
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,
|
|
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,OAAO,CAAC,YAAY;IAUpB,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
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
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 (
|
|
106
|
+
if (this.cachedExists(withSource))
|
|
94
107
|
return withSource;
|
|
95
108
|
const direct = nodePath.join(folder, importPath);
|
|
96
|
-
if (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
131
|
+
if (this.cachedExists(modulePath)) {
|
|
123
132
|
const kopytkoDir = readKopytkoModuleDir(modulePath);
|
|
124
133
|
const candidate = nodePath.join(modulePath, kopytkoDir, importPath);
|
|
125
|
-
if (
|
|
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 (
|
|
137
|
+
if (this.cachedExists(candidateRoot))
|
|
130
138
|
return candidateRoot;
|
|
131
|
-
return undefined;
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oCAkBC;AAxBD,+CAAiC;AAEjC,4DAAoC;AAEpC,MAAM,cAAc,GAAG,wDAAwD,CAAC;AAEhF,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YACpB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS;YACjC,IAAI,EAAE,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAQD,MAAa,cAAc;IACR,OAAO,CAAwB;
|
|
1
|
+
{"version":3,"file":"importParser.js","sourceRoot":"","sources":["../../../src/analysis/importParser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oCAkBC;AAxBD,+CAAiC;AAEjC,4DAAoC;AAEpC,MAAM,cAAc,GAAG,wDAAwD,CAAC;AAEhF,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,OAAO,CAAC,IAAI,CAAC;YACX,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;YACpB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS;YACjC,IAAI,EAAE,CAAC,GAAG,CAAC;YACX,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAQD,MAAa,cAAc;IACR,OAAO,CAAwB;IAC/B,WAAW,GAAG,IAAI,GAAG,EAAmB,CAAC;IACzC,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;IAEtE,YAAY,OAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEO,YAAY,CAAC,QAAgB;QACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG,mBAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACvC,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,iBAAiB,CAAC,GAAkB,EAAE,YAAoB;QACxD,6FAA6F;QAC7F,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,IAAI,SAAS,CAAC;QAErD,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU;YAC3B,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC;YAC1E,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE7D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,GAAkB,EAAE,YAAoB;QACnD,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,KAAK,SAAS,CAAC;IACjE,CAAC;IAEO,qBAAqB,CAAC,UAAkB,EAAE,YAAoB;QACpE,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAErD,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAChE,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;gBAAE,OAAO,UAAU,CAAC;YAErD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAG,yBAAyB,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;QACrD,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QAEjD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,qBAAqB,CAAC,UAAkB,EAAE,UAAkB,EAAE,YAAoB;QACxF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc;YAAE,OAAO,SAAS,CAAC;QAEnD,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YAClE,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;gBAClC,MAAM,UAAU,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;gBACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;gBACpE,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;oBAAE,OAAO,SAAS,CAAC;gBAEnD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBAC5D,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC;oBAAE,OAAO,aAAa,CAAC;gBAE3D,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,GAAG;gBAAE,MAAM;YAC1B,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAlGD,wCAkGC;AAED,0EAA0E;AAC1E,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,mBAAS,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkC,CAAC;QACjE,OAAO,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAAC,QAAgB;IACjD,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,eAAe,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC5D,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAC3D,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACb,OAAO,IAAI,GAAG,OAAO,CAAC;AACxB,CAAC"}
|
|
@@ -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"}
|
package/dist/src/linter.d.ts.map
CHANGED
|
@@ -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;
|
|
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;AAU7C;;;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,CA2BZ;AAmLD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQzF"}
|
package/dist/src/linter.js
CHANGED
|
@@ -46,6 +46,7 @@ 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 testGlobals_1 = require("./catalog/testGlobals");
|
|
49
50
|
const fsWrapper_1 = __importDefault(require("./analysis/fsWrapper"));
|
|
50
51
|
/**
|
|
51
52
|
* Lints a single file with a pre-built context.
|
|
@@ -81,19 +82,15 @@ function lintProject(projectRoot, configOverride) {
|
|
|
81
82
|
...(0, config_1.resolveConfig)(projectRoot),
|
|
82
83
|
...configOverride,
|
|
83
84
|
};
|
|
84
|
-
const context = buildProjectContext(projectRoot, config);
|
|
85
|
-
const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
|
|
85
|
+
const { context, brsFiles, fileContentsCache } = buildProjectContext(projectRoot, config);
|
|
86
86
|
const allDiagnostics = [];
|
|
87
87
|
for (const file of brsFiles) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
catch {
|
|
95
|
-
// skip unreadable files
|
|
96
|
-
}
|
|
88
|
+
const content = fileContentsCache.get(nodePath.normalize(file));
|
|
89
|
+
if (!content)
|
|
90
|
+
continue;
|
|
91
|
+
const fileContext = createFileContext(context, file);
|
|
92
|
+
const diagnostics = lintFile(file, content, fileContext, config);
|
|
93
|
+
allDiagnostics.push(...diagnostics);
|
|
97
94
|
}
|
|
98
95
|
return {
|
|
99
96
|
diagnostics: allDiagnostics,
|
|
@@ -110,107 +107,127 @@ function buildProjectContext(projectRoot, config) {
|
|
|
110
107
|
sourceDir: config.sourceDir,
|
|
111
108
|
resolveModules: config.resolveModules,
|
|
112
109
|
});
|
|
113
|
-
// Build a project-wide function index
|
|
110
|
+
// Build a project-wide function index — single pass over all files
|
|
114
111
|
const brsFiles = collectBrsFiles(projectRoot, config.sourceDir);
|
|
115
112
|
const allFunctions = new Map();
|
|
116
113
|
const fileFunctions = new Map();
|
|
114
|
+
const fileImports = new Map();
|
|
115
|
+
const fileContentsCache = new Map();
|
|
117
116
|
for (const file of brsFiles) {
|
|
118
117
|
try {
|
|
119
118
|
const text = fsWrapper_1.default.readFileSync(file, 'utf-8');
|
|
120
|
-
const
|
|
121
|
-
|
|
119
|
+
const normalized = nodePath.normalize(file);
|
|
120
|
+
fileContentsCache.set(normalized, text);
|
|
121
|
+
fileFunctions.set(normalized, (0, functionIndex_1.parseFunctionDefs)(text, file).map(f => f.nameLower));
|
|
122
|
+
fileImports.set(normalized, (0, importParser_1.parseImports)(text));
|
|
122
123
|
}
|
|
123
124
|
catch { /* skip */ }
|
|
124
125
|
}
|
|
126
|
+
// Helper: read a file, using cache when available
|
|
127
|
+
const readFileCached = (filePath) => {
|
|
128
|
+
const normalized = nodePath.normalize(filePath);
|
|
129
|
+
const cached = fileContentsCache.get(normalized);
|
|
130
|
+
if (cached !== undefined)
|
|
131
|
+
return cached;
|
|
132
|
+
try {
|
|
133
|
+
const text = fsWrapper_1.default.readFileSync(filePath, 'utf-8');
|
|
134
|
+
fileContentsCache.set(normalized, text);
|
|
135
|
+
return text;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
// Helper: get parsed functions for a file, using cache
|
|
142
|
+
const getFunctions = (filePath) => {
|
|
143
|
+
const normalized = nodePath.normalize(filePath);
|
|
144
|
+
const cached = fileFunctions.get(normalized);
|
|
145
|
+
if (cached)
|
|
146
|
+
return cached;
|
|
147
|
+
const text = readFileCached(filePath);
|
|
148
|
+
if (!text)
|
|
149
|
+
return [];
|
|
150
|
+
const fns = (0, functionIndex_1.parseFunctionDefs)(text, filePath).map(f => f.nameLower);
|
|
151
|
+
fileFunctions.set(normalized, fns);
|
|
152
|
+
return fns;
|
|
153
|
+
};
|
|
154
|
+
// Helper: get parsed imports for a file, using cache
|
|
155
|
+
const getImports = (filePath) => {
|
|
156
|
+
const normalized = nodePath.normalize(filePath);
|
|
157
|
+
const cached = fileImports.get(normalized);
|
|
158
|
+
if (cached)
|
|
159
|
+
return cached;
|
|
160
|
+
const text = readFileCached(filePath);
|
|
161
|
+
if (!text)
|
|
162
|
+
return [];
|
|
163
|
+
const imports = (0, importParser_1.parseImports)(text);
|
|
164
|
+
fileImports.set(normalized, imports);
|
|
165
|
+
return imports;
|
|
166
|
+
};
|
|
125
167
|
// For each file, compute its known function names from imports + siblings + self
|
|
126
168
|
for (const file of brsFiles) {
|
|
169
|
+
const normalizedFile = nodePath.normalize(file);
|
|
127
170
|
const known = new Set();
|
|
128
|
-
const
|
|
129
|
-
for (const fn of selfFns)
|
|
171
|
+
for (const fn of (fileFunctions.get(normalizedFile) ?? []))
|
|
130
172
|
known.add(fn);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
173
|
+
// Add test framework globals for test files
|
|
174
|
+
if ((0, testUtils_1.isTestFile)(file)) {
|
|
175
|
+
for (const fn of testGlobals_1.TEST_FRAMEWORK_GLOBALS)
|
|
176
|
+
known.add(fn);
|
|
177
|
+
}
|
|
178
|
+
// Collect functions from imports (transitively)
|
|
179
|
+
const visited = new Set();
|
|
180
|
+
const collectFromImports = (sourceFile, imps) => {
|
|
181
|
+
for (const imp of imps) {
|
|
182
|
+
if (imp.isMock)
|
|
183
|
+
continue;
|
|
184
|
+
const resolved = importResolver.resolveImportPath(imp, sourceFile);
|
|
185
|
+
if (!resolved)
|
|
186
|
+
continue;
|
|
187
|
+
const normalizedResolved = nodePath.normalize(resolved);
|
|
188
|
+
if (visited.has(normalizedResolved))
|
|
189
|
+
continue;
|
|
190
|
+
visited.add(normalizedResolved);
|
|
191
|
+
for (const fn of getFunctions(resolved))
|
|
192
|
+
known.add(fn);
|
|
193
|
+
collectFromImports(resolved, getImports(resolved));
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
collectFromImports(file, getImports(file));
|
|
197
|
+
// Add sibling functions (and their imports)
|
|
198
|
+
for (const siblingPath of (0, patternSiblings_1.findSiblingFiles)(file, config.siblingPatterns)) {
|
|
199
|
+
const normalizedSibling = nodePath.normalize(siblingPath);
|
|
200
|
+
if (!visited.has(normalizedSibling)) {
|
|
201
|
+
visited.add(normalizedSibling);
|
|
202
|
+
for (const fn of getFunctions(siblingPath))
|
|
203
|
+
known.add(fn);
|
|
204
|
+
collectFromImports(siblingPath, getImports(siblingPath));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// For test files, add tested file functions and test siblings
|
|
208
|
+
if ((0, testUtils_1.isTestFile)(file)) {
|
|
209
|
+
for (const testedPath of (0, testUtils_1.resolveTestedFiles)(file)) {
|
|
210
|
+
const normalizedTested = nodePath.normalize(testedPath);
|
|
211
|
+
if (!visited.has(normalizedTested)) {
|
|
212
|
+
visited.add(normalizedTested);
|
|
213
|
+
for (const fn of getFunctions(testedPath))
|
|
169
214
|
known.add(fn);
|
|
215
|
+
collectFromImports(testedPath, getImports(testedPath));
|
|
170
216
|
}
|
|
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));
|
|
175
|
-
}
|
|
176
|
-
catch { /* skip */ }
|
|
177
217
|
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
|
|
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 */ }
|
|
193
|
-
}
|
|
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)
|
|
199
|
-
known.add(fn);
|
|
200
|
-
}
|
|
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 */ }
|
|
218
|
+
for (const siblingTest of (0, testUtils_1.findTestSiblings)(file)) {
|
|
219
|
+
const normalizedSibTest = nodePath.normalize(siblingTest);
|
|
220
|
+
if (!visited.has(normalizedSibTest)) {
|
|
221
|
+
visited.add(normalizedSibTest);
|
|
222
|
+
for (const fn of getFunctions(siblingTest))
|
|
223
|
+
known.add(fn);
|
|
224
|
+
collectFromImports(siblingTest, getImports(siblingTest));
|
|
207
225
|
}
|
|
208
226
|
}
|
|
209
227
|
}
|
|
210
|
-
|
|
211
|
-
allFunctions.set(nodePath.normalize(file), known);
|
|
228
|
+
allFunctions.set(normalizedFile, known);
|
|
212
229
|
}
|
|
213
|
-
|
|
230
|
+
const context = {
|
|
214
231
|
get knownFuncNames() { return new Set(); },
|
|
215
232
|
parseImports(text) {
|
|
216
233
|
return (0, importParser_1.parseImports)(text);
|
|
@@ -223,24 +240,10 @@ function buildProjectContext(projectRoot, config) {
|
|
|
223
240
|
return this.resolveImportPath(importPath, documentPath, fromModule) !== null;
|
|
224
241
|
},
|
|
225
242
|
readFile(filePath) {
|
|
226
|
-
|
|
227
|
-
return fsWrapper_1.default.readFileSync(filePath, 'utf-8');
|
|
228
|
-
}
|
|
229
|
-
catch {
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
243
|
+
return readFileCached(filePath);
|
|
232
244
|
},
|
|
233
245
|
parseFunctionsFromFile(filePath) {
|
|
234
|
-
|
|
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
|
-
}
|
|
246
|
+
return getFunctions(filePath);
|
|
244
247
|
},
|
|
245
248
|
getSiblingFiles(filePath) {
|
|
246
249
|
return (0, patternSiblings_1.findSiblingFiles)(filePath, config.siblingPatterns);
|
|
@@ -254,7 +257,11 @@ function buildProjectContext(projectRoot, config) {
|
|
|
254
257
|
generatedPaths: config.generatedPaths,
|
|
255
258
|
generatedModules: config.generatedModules,
|
|
256
259
|
siblingPatterns: config.siblingPatterns,
|
|
257
|
-
|
|
260
|
+
};
|
|
261
|
+
return {
|
|
262
|
+
context: Object.assign(context, { _allFunctions: allFunctions }),
|
|
263
|
+
brsFiles,
|
|
264
|
+
fileContentsCache,
|
|
258
265
|
};
|
|
259
266
|
}
|
|
260
267
|
/**
|
package/dist/src/linter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"linter.js","sourceRoot":"","sources":["../../src/linter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,4BA4BC;AAMD,kCA8BC;AAuLD,8CAQC;AAhRD,+CAAiC;AAIjC,qCAAyC;AACzC,yCAAgD;AAChD,0DAAuE;AACvE,4DAA6D;AAC7D,gEAA8D;AAC9D,oDAAwF;AACxF,uDAA+D;AAC/D,qEAA6C;AAE7C;;;GAGG;AACH,SAAgB,QAAQ,CACtB,QAAgB,EAChB,OAAe,EACf,OAAoB,EACpB,MAAoB;IAEpB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAgB;QAC/B,QAAQ;QACR,KAAK;QACL,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO;KACrB,CAAC;IAEF,MAAM,WAAW,GAAqB,EAAE,CAAC;IAEzC,KAAK,MAAM,SAAS,IAAI,uBAAe,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,SAAgB,WAAW,CACzB,WAAmB,EACnB,cAAsC;IAEtC,MAAM,MAAM,GAAG;QACb,GAAG,IAAA,sBAAa,EAAC,WAAW,CAAC;QAC7B,GAAG,cAAc;KAClB,CAAC;IAEF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,mBAAmB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAE1F,MAAM,cAAc,GAAqB,EAAE,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QACjE,cAAc,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,OAAO;QACL,WAAW,EAAE,cAAc;QAC3B,SAAS,EAAE,QAAQ,CAAC,MAAM;QAC1B,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM;QACrE,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM;QACzE,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;QACnE,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM;KACpE,CAAC;AACJ,CAAC;AAQD,SAAS,mBAAmB,CAAC,WAAmB,EAAE,MAAoB;IACpE,MAAM,cAAc,GAAG,IAAI,6BAAc,CAAC;QACxC,gBAAgB,EAAE,CAAC,WAAW,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;IAEH,mEAAmE;IACnE,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;IACpD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAoB,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IACvD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEpD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,mBAAS,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,IAAA,iCAAiB,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACnF,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,IAAA,2BAAY,EAAC,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC;IAED,kDAAkD;IAClD,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAiB,EAAE;QACzD,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,mBAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvD,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,uDAAuD;IACvD,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAY,EAAE;QAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAA,iCAAiB,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpE,aAAa,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,qDAAqD;IACrD,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAmB,EAAE;QACvD,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,IAAA,2BAAY,EAAC,IAAI,CAAC,CAAC;QACnC,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,iFAAiF;IACjF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,KAAK,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE1E,4CAA4C;QAC5C,IAAI,IAAA,sBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACrB,KAAK,MAAM,EAAE,IAAI,oCAAsB;gBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,gDAAgD;QAChD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,kBAAkB,GAAG,CAAC,UAAkB,EAAE,IAAqB,EAAQ,EAAE;YAC7E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,GAAG,CAAC,MAAM;oBAAE,SAAS;gBACzB,MAAM,QAAQ,GAAG,cAAc,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;gBACnE,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBACxB,MAAM,kBAAkB,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACxD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;oBAAE,SAAS;gBAC9C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAEhC,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,QAAQ,CAAC;oBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvD,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,CAAC;QACF,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAE3C,4CAA4C;QAC5C,KAAK,MAAM,WAAW,IAAI,IAAA,kCAAgB,EAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;YACzE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,WAAW,CAAC;oBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1D,kBAAkB,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,IAAA,sBAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACrB,KAAK,MAAM,UAAU,IAAI,IAAA,8BAAkB,EAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAC9B,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,UAAU,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACzD,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YACD,KAAK,MAAM,WAAW,IAAI,IAAA,4BAAgB,EAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;oBAC/B,KAAK,MAAM,EAAE,IAAI,YAAY,CAAC,WAAW,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC1D,kBAAkB,CAAC,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;QAED,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,OAAO,GAAgB;QAC3B,IAAI,cAAc,KAAK,OAAO,IAAI,GAAG,EAAU,CAAC,CAAC,CAAC;QAElD,YAAY,CAAC,IAAY;YACvB,OAAO,IAAA,2BAAY,EAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,iBAAiB,CAAC,UAAkB,EAAE,YAAoB,EAAE,UAAmB;YAC7E,MAAM,GAAG,GAAkB,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACxE,OAAO,cAAc,CAAC,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC;QACrE,CAAC;QAED,YAAY,CAAC,UAAkB,EAAE,YAAoB,EAAE,UAAmB;YACxE,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;QAC/E,CAAC;QAED,QAAQ,CAAC,QAAgB;YACvB,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAED,sBAAsB,CAAC,QAAgB;YACrC,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED,eAAe,CAAC,QAAgB;YAC9B,OAAO,IAAA,kCAAgB,EAAC,QAAQ,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;QAC5D,CAAC;QAED,eAAe,CAAC,QAAgB;YAC9B,OAAO,IAAA,4BAAgB,EAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,UAAU,CAAC,QAAgB;YACzB,OAAO,IAAA,sBAAU,EAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,CAAgB;QAC/E,QAAQ;QACR,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,WAAwB,EAAE,QAAgB;IAC1E,MAAM,oBAAoB,GAAG,WAAyE,CAAC;IACvG,MAAM,SAAS,GAAG,oBAAoB,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;IAE7G,OAAO;QACL,GAAG,WAAW;QACd,cAAc,EAAE,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,SAAiB;IACrD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,IAAI,CAAC,UAAkB;QAC9B,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,mBAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;oBAAE,SAAS;gBACrE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,mBAAS,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|