eslint-plugin-fast-import 1.0.0-beta2
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/.prettierrc.json +6 -0
- package/.vscode/launch.json +39 -0
- package/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/module/computeAnalyzedInfo.d.ts +3 -0
- package/dist/module/computeAnalyzedInfo.js +297 -0
- package/dist/module/computeAnalyzedInfo.js.map +1 -0
- package/dist/module/computeBaseInfo.d.ts +24 -0
- package/dist/module/computeBaseInfo.js +564 -0
- package/dist/module/computeBaseInfo.js.map +1 -0
- package/dist/module/computeResolvedInfo.d.ts +7 -0
- package/dist/module/computeResolvedInfo.js +361 -0
- package/dist/module/computeResolvedInfo.js.map +1 -0
- package/dist/module/module.d.ts +20 -0
- package/dist/module/module.js +224 -0
- package/dist/module/module.js.map +1 -0
- package/dist/module/util.d.ts +44 -0
- package/dist/module/util.js +67 -0
- package/dist/module/util.js.map +1 -0
- package/dist/plugin.d.ts +19 -0
- package/dist/plugin.js +57 -0
- package/dist/plugin.js.map +1 -0
- package/dist/rules/circular/circular.d.ts +2 -0
- package/dist/rules/circular/circular.js +107 -0
- package/dist/rules/circular/circular.js.map +1 -0
- package/dist/rules/entryPoint/entryPoint.d.ts +1 -0
- package/dist/rules/entryPoint/entryPoint.js +38 -0
- package/dist/rules/entryPoint/entryPoint.js.map +1 -0
- package/dist/rules/externalBarrelReexports/externalBarrelReexports.d.ts +1 -0
- package/dist/rules/externalBarrelReexports/externalBarrelReexports.js +41 -0
- package/dist/rules/externalBarrelReexports/externalBarrelReexports.js.map +1 -0
- package/dist/rules/missing/missing.d.ts +1 -0
- package/dist/rules/missing/missing.js +59 -0
- package/dist/rules/missing/missing.js.map +1 -0
- package/dist/rules/testInProd/testInProd.d.ts +1 -0
- package/dist/rules/testInProd/testInProd.js +42 -0
- package/dist/rules/testInProd/testInProd.js.map +1 -0
- package/dist/rules/unused/unused.d.ts +3 -0
- package/dist/rules/unused/unused.js +77 -0
- package/dist/rules/unused/unused.js.map +1 -0
- package/dist/rules/util.d.ts +11 -0
- package/dist/rules/util.js +107 -0
- package/dist/rules/util.js.map +1 -0
- package/dist/settings/settings.d.ts +12 -0
- package/dist/settings/settings.js +123 -0
- package/dist/settings/settings.js.map +1 -0
- package/dist/settings/typescript.d.ts +3 -0
- package/dist/settings/typescript.js +39 -0
- package/dist/settings/typescript.js.map +1 -0
- package/dist/settings/user.d.ts +45 -0
- package/dist/settings/user.js +52 -0
- package/dist/settings/user.js.map +1 -0
- package/dist/settings/util.d.ts +2 -0
- package/dist/settings/util.js +33 -0
- package/dist/settings/util.js.map +1 -0
- package/dist/types/analyzed.d.ts +120 -0
- package/dist/types/analyzed.js +2 -0
- package/dist/types/analyzed.js.map +1 -0
- package/dist/types/base.d.ts +230 -0
- package/dist/types/base.js +2 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/context.d.ts +2 -0
- package/dist/types/context.js +2 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/resolved.d.ts +60 -0
- package/dist/types/resolved.js +2 -0
- package/dist/types/resolved.js.map +1 -0
- package/dist/util/code.d.ts +1 -0
- package/dist/util/code.js +6 -0
- package/dist/util/code.js.map +1 -0
- package/dist/util/error.d.ts +14 -0
- package/dist/util/error.js +19 -0
- package/dist/util/error.js.map +1 -0
- package/dist/util/files.d.ts +10 -0
- package/dist/util/files.js +122 -0
- package/dist/util/files.js.map +1 -0
- package/dist/util/logging.d.ts +5 -0
- package/dist/util/logging.js +19 -0
- package/dist/util/logging.js.map +1 -0
- package/eslint.config.mjs +85 -0
- package/jest.config.ts +10 -0
- package/package.json +49 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { InternalError } from '../util/error.js';
|
|
2
|
+
import { builtinModules } from 'node:module';
|
|
3
|
+
import { basename, dirname, extname, join, resolve } from 'node:path';
|
|
4
|
+
import { isCodeFile } from '../util/code.js';
|
|
5
|
+
export function computeResolvedInfo(baseProjectInfo) {
|
|
6
|
+
// Always recompute the folder tree when we're starting from scratch
|
|
7
|
+
computeFolderTree(baseProjectInfo);
|
|
8
|
+
const resolvedProjectInfo = {
|
|
9
|
+
...baseProjectInfo,
|
|
10
|
+
files: new Map(),
|
|
11
|
+
};
|
|
12
|
+
for (const [filePath, baseFileDetails] of baseProjectInfo.files) {
|
|
13
|
+
if (baseFileDetails.fileType !== 'code') {
|
|
14
|
+
resolvedProjectInfo.files.set(filePath, {
|
|
15
|
+
fileType: 'other',
|
|
16
|
+
});
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const resolvedCodeFileDetails = {
|
|
20
|
+
fileType: 'code',
|
|
21
|
+
lastUpdatedAt: baseFileDetails.lastUpdatedAt,
|
|
22
|
+
imports: [],
|
|
23
|
+
exports: [],
|
|
24
|
+
reexports: [],
|
|
25
|
+
};
|
|
26
|
+
resolvedProjectInfo.files.set(filePath, resolvedCodeFileDetails);
|
|
27
|
+
populateFileDetails(baseProjectInfo, filePath, baseFileDetails, resolvedCodeFileDetails);
|
|
28
|
+
}
|
|
29
|
+
return resolvedProjectInfo;
|
|
30
|
+
}
|
|
31
|
+
export function addResolvedInfoForFile(filePath, newBaseProjectInfo, previousResolvedProjectInfo) {
|
|
32
|
+
const baseFileInfo = newBaseProjectInfo.files.get(filePath);
|
|
33
|
+
if (!baseFileInfo) {
|
|
34
|
+
throw new InternalError(`Could not get base file info for ${filePath}`);
|
|
35
|
+
}
|
|
36
|
+
if (isCodeFile(filePath)) {
|
|
37
|
+
if (baseFileInfo.fileType !== 'code') {
|
|
38
|
+
throw new InternalError(`Mismatched file types for ${filePath}`);
|
|
39
|
+
}
|
|
40
|
+
const resolvedCodeFileDetails = {
|
|
41
|
+
fileType: 'code',
|
|
42
|
+
lastUpdatedAt: baseFileInfo.lastUpdatedAt,
|
|
43
|
+
imports: [],
|
|
44
|
+
exports: [],
|
|
45
|
+
reexports: [],
|
|
46
|
+
};
|
|
47
|
+
previousResolvedProjectInfo.files.set(filePath, resolvedCodeFileDetails);
|
|
48
|
+
populateFileDetails(newBaseProjectInfo, filePath, baseFileInfo, resolvedCodeFileDetails);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
previousResolvedProjectInfo.files.set(filePath, {
|
|
52
|
+
fileType: 'other',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function updateResolvedInfoForFile(filePath, baseProjectInfo, resolvedProjectInfo) {
|
|
57
|
+
const filePathsToUpdate = [
|
|
58
|
+
filePath,
|
|
59
|
+
...getFileReferences(resolvedProjectInfo, filePath),
|
|
60
|
+
];
|
|
61
|
+
for (const filePathToUpdate of filePathsToUpdate) {
|
|
62
|
+
const baseFileInfo = baseProjectInfo.files.get(filePathToUpdate);
|
|
63
|
+
if (!baseFileInfo) {
|
|
64
|
+
throw new InternalError(`Could not get base file info for ${filePathToUpdate}`);
|
|
65
|
+
}
|
|
66
|
+
if (baseFileInfo.fileType !== 'code') {
|
|
67
|
+
throw new InternalError(`Mismatched file types for ${filePathToUpdate}`);
|
|
68
|
+
}
|
|
69
|
+
const resolvedCodeFileDetails = {
|
|
70
|
+
fileType: 'code',
|
|
71
|
+
lastUpdatedAt: baseFileInfo.lastUpdatedAt,
|
|
72
|
+
imports: [],
|
|
73
|
+
exports: [],
|
|
74
|
+
reexports: [],
|
|
75
|
+
};
|
|
76
|
+
populateFileDetails(baseProjectInfo, filePathToUpdate, baseFileInfo, resolvedCodeFileDetails);
|
|
77
|
+
resolvedProjectInfo.files.set(filePathToUpdate, resolvedCodeFileDetails);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function deleteResolvedInfoForFile(filePath, newBaseProjectInfo, previousResolvedProjectInfo) {
|
|
81
|
+
const baseFileInfo = newBaseProjectInfo.files.get(filePath);
|
|
82
|
+
if (!baseFileInfo) {
|
|
83
|
+
throw new InternalError(`Could not get base file info for ${filePath}`);
|
|
84
|
+
}
|
|
85
|
+
if (baseFileInfo.fileType !== 'code') {
|
|
86
|
+
throw new InternalError(`Mismatched file types for ${filePath}`);
|
|
87
|
+
}
|
|
88
|
+
const filePathsToUpdate = getFileReferences(previousResolvedProjectInfo, filePath);
|
|
89
|
+
previousResolvedProjectInfo.files.delete(filePath);
|
|
90
|
+
for (const filePathToUpdate of filePathsToUpdate) {
|
|
91
|
+
const resolvedCodeFileDetails = {
|
|
92
|
+
fileType: 'code',
|
|
93
|
+
lastUpdatedAt: baseFileInfo.lastUpdatedAt,
|
|
94
|
+
imports: [],
|
|
95
|
+
exports: [],
|
|
96
|
+
reexports: [],
|
|
97
|
+
};
|
|
98
|
+
previousResolvedProjectInfo.files.set(filePathToUpdate, resolvedCodeFileDetails);
|
|
99
|
+
populateFileDetails(newBaseProjectInfo, filePathToUpdate, baseFileInfo, resolvedCodeFileDetails);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export function computeFolderTree(baseInfo) {
|
|
103
|
+
// Reset the cache before we start
|
|
104
|
+
folderTree = {
|
|
105
|
+
folders: {},
|
|
106
|
+
files: {},
|
|
107
|
+
filesAndExtensions: {},
|
|
108
|
+
};
|
|
109
|
+
for (const [file] of baseInfo.files) {
|
|
110
|
+
const folders = file.replace(baseInfo.rootDir + '/', '').split('/');
|
|
111
|
+
const basefile = folders.pop();
|
|
112
|
+
if (!basefile) {
|
|
113
|
+
throw new InternalError(`Could not get basefile for path ${file}`);
|
|
114
|
+
}
|
|
115
|
+
let currentFolderTreeNode = folderTree;
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
117
|
+
while (true) {
|
|
118
|
+
const currentFolder = folders.shift();
|
|
119
|
+
if (!currentFolder) {
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
123
|
+
if (!currentFolderTreeNode.folders[currentFolder]) {
|
|
124
|
+
currentFolderTreeNode.folders[currentFolder] = {
|
|
125
|
+
folders: {},
|
|
126
|
+
files: {},
|
|
127
|
+
filesAndExtensions: {},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
currentFolderTreeNode = currentFolderTreeNode.folders[currentFolder];
|
|
131
|
+
}
|
|
132
|
+
currentFolderTreeNode.files[basefile] = 1;
|
|
133
|
+
const extension = basefile.endsWith('.d.ts')
|
|
134
|
+
? '.d.ts'
|
|
135
|
+
: basefile.endsWith('.d.tsx')
|
|
136
|
+
? '.d.tsx'
|
|
137
|
+
: extname(basefile);
|
|
138
|
+
const baseFileName = basename(basefile, extension);
|
|
139
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
140
|
+
if (!currentFolderTreeNode.filesAndExtensions[baseFileName]) {
|
|
141
|
+
currentFolderTreeNode.filesAndExtensions[baseFileName] = [];
|
|
142
|
+
}
|
|
143
|
+
currentFolderTreeNode.filesAndExtensions[baseFileName].push(extension);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Find all files that import/reexport from this file, or that this file is imported from
|
|
147
|
+
function getFileReferences(previousResolvedProjectInfo, filePath) {
|
|
148
|
+
const fileReferences = [];
|
|
149
|
+
const previousResolvedFileEntry = previousResolvedProjectInfo.files.get(filePath);
|
|
150
|
+
if (!previousResolvedFileEntry) {
|
|
151
|
+
throw new InternalError(`Could not get previous resolved entry for ${filePath}`);
|
|
152
|
+
}
|
|
153
|
+
if (previousResolvedFileEntry.fileType !== 'code') {
|
|
154
|
+
throw new InternalError(`Previous file type for ${filePath} is not code`);
|
|
155
|
+
}
|
|
156
|
+
for (const [candidateFilePath, candidateFileDetails,] of previousResolvedProjectInfo.files) {
|
|
157
|
+
if (candidateFileDetails.fileType !== 'code' ||
|
|
158
|
+
candidateFilePath === filePath) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (
|
|
162
|
+
// Look for imports or the import side of reexports to see if they reference this file
|
|
163
|
+
[...candidateFileDetails.imports, ...candidateFileDetails.reexports].some((i) => 'resolvedModulePath' in i && i.resolvedModulePath === filePath) ||
|
|
164
|
+
// Look for exports or the export side of reexports to see if this file references them
|
|
165
|
+
[
|
|
166
|
+
...previousResolvedFileEntry.imports,
|
|
167
|
+
...previousResolvedFileEntry.reexports,
|
|
168
|
+
].some((i) => i.moduleType === 'firstPartyCode' && i.resolvedModulePath === filePath)) {
|
|
169
|
+
fileReferences.push(candidateFilePath);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return fileReferences;
|
|
173
|
+
}
|
|
174
|
+
function populateFileDetails(baseProjectInfo, filePath, baseCodeFileDetails, resolvedCodeFileDetails) {
|
|
175
|
+
// Resolve imports
|
|
176
|
+
for (const importDetails of baseCodeFileDetails.imports) {
|
|
177
|
+
// TODO: handle dynamic imports with non-static paths, represented by `moduleSpecifier` being undefined?
|
|
178
|
+
if (!importDetails.moduleSpecifier) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const resolvedModuleSpecifier = resolveModuleSpecifier({
|
|
182
|
+
baseProjectInfo,
|
|
183
|
+
filePath,
|
|
184
|
+
moduleSpecifier: importDetails.moduleSpecifier,
|
|
185
|
+
isTypeImport: importDetails.importType === 'single'
|
|
186
|
+
? importDetails.isTypeImport
|
|
187
|
+
: false,
|
|
188
|
+
});
|
|
189
|
+
resolvedCodeFileDetails.imports.push({
|
|
190
|
+
...importDetails,
|
|
191
|
+
...resolvedModuleSpecifier,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Resolve re-exports
|
|
195
|
+
for (const reexportDetails of baseCodeFileDetails.reexports) {
|
|
196
|
+
const resolvedModuleSpecifier = resolveModuleSpecifier({
|
|
197
|
+
baseProjectInfo,
|
|
198
|
+
filePath,
|
|
199
|
+
moduleSpecifier: reexportDetails.moduleSpecifier,
|
|
200
|
+
isTypeImport: reexportDetails.reexportType === 'single'
|
|
201
|
+
? reexportDetails.isTypeReexport
|
|
202
|
+
: false,
|
|
203
|
+
});
|
|
204
|
+
resolvedCodeFileDetails.reexports.push({
|
|
205
|
+
...reexportDetails,
|
|
206
|
+
...resolvedModuleSpecifier,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
// We don't need to do anything for resolved exports, but we _do_ want to deep-ish clone each export's details
|
|
210
|
+
for (const exportDetails of baseCodeFileDetails.exports) {
|
|
211
|
+
resolvedCodeFileDetails.exports.push({
|
|
212
|
+
...exportDetails,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
let folderTree = {
|
|
217
|
+
folders: {},
|
|
218
|
+
files: {},
|
|
219
|
+
filesAndExtensions: {},
|
|
220
|
+
};
|
|
221
|
+
const formattedBuiltinModules = builtinModules.filter((m) => !m.startsWith('_'));
|
|
222
|
+
for (let i = formattedBuiltinModules.length - 1; i >= 0; i--) {
|
|
223
|
+
const builtinModule = formattedBuiltinModules[i];
|
|
224
|
+
formattedBuiltinModules.push(`node:${builtinModule}`);
|
|
225
|
+
}
|
|
226
|
+
function resolveModuleSpecifier({ baseProjectInfo, filePath, moduleSpecifier, isTypeImport, }) {
|
|
227
|
+
// First, check if this is a built-in module
|
|
228
|
+
if (formattedBuiltinModules.includes(moduleSpecifier)) {
|
|
229
|
+
return {
|
|
230
|
+
moduleType: 'builtin',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// This function takes in a bath that is "absolute" but relative to rootDir, excluding the leading /
|
|
234
|
+
function resolveFirstPartyImport(absolutishFilePath) {
|
|
235
|
+
/* eslint-disable @typescript-eslint/no-unnecessary-condition */
|
|
236
|
+
const segments = absolutishFilePath.split('/').filter((s) => s);
|
|
237
|
+
let lastSegment = segments.pop();
|
|
238
|
+
const folderSegments = [...segments];
|
|
239
|
+
if (!lastSegment) {
|
|
240
|
+
throw new InternalError(`lastSegment for ${absolutishFilePath} is undefined`);
|
|
241
|
+
}
|
|
242
|
+
let currentFolderTreeNode = folderTree;
|
|
243
|
+
while (true) {
|
|
244
|
+
const currentFolderSegment = segments.shift();
|
|
245
|
+
if (!currentFolderSegment) {
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
currentFolderTreeNode =
|
|
249
|
+
currentFolderTreeNode.folders[currentFolderSegment];
|
|
250
|
+
// If there is no folder segment present, then that means this is a missing import
|
|
251
|
+
if (!currentFolderTreeNode) {
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function computeFilePath(file) {
|
|
256
|
+
return join(baseProjectInfo.rootDir, folderSegments.join('/'), file);
|
|
257
|
+
}
|
|
258
|
+
// First we check if this directly references a file + extension, and shortcircuit, e.g.:
|
|
259
|
+
// `import { foo } from './foo.ts'` => 'foo.ts'
|
|
260
|
+
if (currentFolderTreeNode.files[lastSegment]) {
|
|
261
|
+
return computeFilePath(lastSegment);
|
|
262
|
+
}
|
|
263
|
+
// Check the special edge case of importing a file in TypeScript with
|
|
264
|
+
// nodenext resolution, where the extension has `.js`, not `.ts`. To support
|
|
265
|
+
// this edge case, we just strip off the .js since we support that anways
|
|
266
|
+
if (lastSegment.endsWith('.js')) {
|
|
267
|
+
lastSegment = lastSegment.slice(0, lastSegment.length - 3);
|
|
268
|
+
}
|
|
269
|
+
function findFileWithExtension(basename) {
|
|
270
|
+
// Now we see if this references a file without an extension (the norm)
|
|
271
|
+
const extensions = currentFolderTreeNode.filesAndExtensions[basename];
|
|
272
|
+
if (!extensions) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
switch (extensions.length) {
|
|
276
|
+
// Normally there's just one extension, so check this case first and return it
|
|
277
|
+
case 1: {
|
|
278
|
+
return computeFilePath(basename + extensions[0]);
|
|
279
|
+
}
|
|
280
|
+
// In the case of a vanilla JS file with a TS definition file, there will be two extensions
|
|
281
|
+
case 2: {
|
|
282
|
+
if (extensions.includes('.d.ts')) {
|
|
283
|
+
if (isTypeImport) {
|
|
284
|
+
return computeFilePath(basename + '.d.ts');
|
|
285
|
+
}
|
|
286
|
+
else if (extensions.includes('.js')) {
|
|
287
|
+
return computeFilePath(basename + '.js');
|
|
288
|
+
}
|
|
289
|
+
else if (extensions.includes('.jsx')) {
|
|
290
|
+
return computeFilePath(basename + '.jsx');
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Intentionally fall through here, since we didn't find an expected pair of files
|
|
294
|
+
}
|
|
295
|
+
// Otherwise the import is ambiguous and we can't determine which file it references
|
|
296
|
+
default: {
|
|
297
|
+
throw new Error(`Module specifier ${moduleSpecifier} in file ${filePath} is ambiguous because there is more than one file with this name`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
let computedFilePath = findFileWithExtension(lastSegment);
|
|
302
|
+
if (computedFilePath) {
|
|
303
|
+
return computedFilePath;
|
|
304
|
+
}
|
|
305
|
+
// Now we check if this references an index file, but only if a folder with this segment exists
|
|
306
|
+
currentFolderTreeNode = currentFolderTreeNode.folders[lastSegment];
|
|
307
|
+
if (!currentFolderTreeNode) {
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
310
|
+
folderSegments.push(lastSegment);
|
|
311
|
+
computedFilePath = findFileWithExtension('index');
|
|
312
|
+
if (computedFilePath) {
|
|
313
|
+
return computedFilePath;
|
|
314
|
+
}
|
|
315
|
+
// If we got here, then we couldn't find a file entry
|
|
316
|
+
return undefined;
|
|
317
|
+
/* eslint-enable @typescript-eslint/no-unnecessary-condition */
|
|
318
|
+
}
|
|
319
|
+
function formatResolvedEntry(resolvedModulePath) {
|
|
320
|
+
if (!resolvedModulePath) {
|
|
321
|
+
return {
|
|
322
|
+
moduleType: 'firstPartyOther',
|
|
323
|
+
resolvedModulePath: undefined,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
return {
|
|
327
|
+
moduleType: isCodeFile(resolvedModulePath)
|
|
328
|
+
? 'firstPartyCode'
|
|
329
|
+
: 'firstPartyOther',
|
|
330
|
+
resolvedModulePath,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const dirPath = dirname(filePath);
|
|
334
|
+
// Check if this path is relative, which means its first party
|
|
335
|
+
if (moduleSpecifier.startsWith('.')) {
|
|
336
|
+
const resolvedPath = resolve(dirPath, moduleSpecifier);
|
|
337
|
+
// We have to account for a very specific edge case. When a user does an
|
|
338
|
+
// import with a specifier like `../..` such that the absolitish path
|
|
339
|
+
// resolves to the root dir itself, then the standard absolitish path is
|
|
340
|
+
// computed to be '' (empty string). In this case, the import may still be
|
|
341
|
+
// valid though if there is an index file in the root door. We pre-apply
|
|
342
|
+
// index in this case so that there are still path segments to resolve.
|
|
343
|
+
const absolutish = resolvedPath === baseProjectInfo.rootDir
|
|
344
|
+
? 'index'
|
|
345
|
+
: resolvedPath.replace(baseProjectInfo.rootDir + '/', '');
|
|
346
|
+
const resolvedModulePath = resolveFirstPartyImport(absolutish);
|
|
347
|
+
return formatResolvedEntry(resolvedModulePath);
|
|
348
|
+
}
|
|
349
|
+
// Check if this path starts with the root import alias, which means its first party
|
|
350
|
+
for (const [alias, path] of Object.entries(baseProjectInfo.alias)) {
|
|
351
|
+
if (moduleSpecifier.startsWith(`${alias}/`)) {
|
|
352
|
+
const resolvedModulePath = resolveFirstPartyImport(join(moduleSpecifier.replace(`${alias}/`, path).replace('./', '')));
|
|
353
|
+
return formatResolvedEntry(resolvedModulePath);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// If we got here, then this is a third party import
|
|
357
|
+
return {
|
|
358
|
+
moduleType: 'thirdParty',
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=computeResolvedInfo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"computeResolvedInfo.js","sourceRoot":"","sources":["../../src/module/computeResolvedInfo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AnalyzedProjectInfo } from '../types/analyzed.js';
|
|
2
|
+
import type { ParsedSettings } from '../settings/settings.js';
|
|
3
|
+
import type { TSESTree } from '@typescript-eslint/utils';
|
|
4
|
+
export declare function _resetProjectInfo(): void;
|
|
5
|
+
export declare function initializeProject({ rootDir, alias, ignorePatterns, entryPoints, }: ParsedSettings): void;
|
|
6
|
+
export declare function getProjectInfo(): AnalyzedProjectInfo;
|
|
7
|
+
type Changes = {
|
|
8
|
+
added: Array<{
|
|
9
|
+
filePath: string;
|
|
10
|
+
latestUpdatedAt: number;
|
|
11
|
+
}>;
|
|
12
|
+
deleted: string[];
|
|
13
|
+
modified: Array<{
|
|
14
|
+
filePath: string;
|
|
15
|
+
latestUpdatedAt: number;
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
18
|
+
export declare function updateCacheFromFileSystem(changes: Changes, settings: ParsedSettings, operationStart: number): boolean;
|
|
19
|
+
export declare function updateCacheForFile(filePath: string, fileContents: string, ast: TSESTree.Program, { entryPoints, rootDir }: ParsedSettings): boolean;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { computeAnalyzedInfo } from './computeAnalyzedInfo.js';
|
|
2
|
+
import { addResolvedInfoForFile, computeFolderTree, computeResolvedInfo, deleteResolvedInfoForFile, updateResolvedInfoForFile, } from './computeResolvedInfo.js';
|
|
3
|
+
import { addBaseInfoForFile, computeBaseInfo, deleteBaseInfoForFile, updateBaseInfoForFile, } from './computeBaseInfo.js';
|
|
4
|
+
import { InternalError } from '../util/error.js';
|
|
5
|
+
import { debug, formatMilliseconds } from '../util/logging.js';
|
|
6
|
+
import { parseFile } from './util.js';
|
|
7
|
+
let baseProjectInfo = null;
|
|
8
|
+
let resolvedProjectInfo = null;
|
|
9
|
+
let analyzedProjectInfo = null;
|
|
10
|
+
function getEntryPointCheck(entryPoints) {
|
|
11
|
+
return (filePath, symbolName) => entryPoints.some(({ file, symbol }) => file === filePath && symbol === symbolName);
|
|
12
|
+
}
|
|
13
|
+
// We need to reset settings between runs, since some tests try different settings
|
|
14
|
+
// eslint-disable-next-line fast-import/no-unused-exports
|
|
15
|
+
export function _resetProjectInfo() {
|
|
16
|
+
baseProjectInfo = null;
|
|
17
|
+
resolvedProjectInfo = null;
|
|
18
|
+
analyzedProjectInfo = null;
|
|
19
|
+
}
|
|
20
|
+
export function initializeProject({ rootDir, alias, ignorePatterns, entryPoints, }) {
|
|
21
|
+
// If we've already analyzed the project and settings haven't changed, bail
|
|
22
|
+
if (analyzedProjectInfo) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const baseStart = Date.now();
|
|
26
|
+
baseProjectInfo = computeBaseInfo({
|
|
27
|
+
rootDir,
|
|
28
|
+
alias,
|
|
29
|
+
ignorePatterns,
|
|
30
|
+
isEntryPointCheck: getEntryPointCheck(entryPoints),
|
|
31
|
+
});
|
|
32
|
+
const baseEnd = Date.now();
|
|
33
|
+
const resolveStart = Date.now();
|
|
34
|
+
resolvedProjectInfo = computeResolvedInfo(baseProjectInfo);
|
|
35
|
+
const resolveEnd = Date.now();
|
|
36
|
+
const analyzestart = Date.now();
|
|
37
|
+
analyzedProjectInfo = computeAnalyzedInfo(resolvedProjectInfo);
|
|
38
|
+
const analyzeEnd = Date.now();
|
|
39
|
+
debug(`Initial computation complete:`);
|
|
40
|
+
debug(` total: ${formatMilliseconds(analyzeEnd - baseStart)}`);
|
|
41
|
+
debug(` base info: ${formatMilliseconds(baseEnd - baseStart)}`);
|
|
42
|
+
debug(` resolved info: ${formatMilliseconds(resolveEnd - resolveStart)}`);
|
|
43
|
+
debug(` analyzed info: ${formatMilliseconds(analyzeEnd - analyzestart)}`);
|
|
44
|
+
}
|
|
45
|
+
export function getProjectInfo() {
|
|
46
|
+
if (!analyzedProjectInfo) {
|
|
47
|
+
throw new InternalError('Project info requested before initialization');
|
|
48
|
+
}
|
|
49
|
+
return analyzedProjectInfo;
|
|
50
|
+
}
|
|
51
|
+
// Batch updates file changes. Note that the order of operations (delete, then
|
|
52
|
+
// add, then modified) is critical
|
|
53
|
+
export function updateCacheFromFileSystem(changes, settings, operationStart) {
|
|
54
|
+
// This shouldn't be possible and is just to make sure TypeScript is happy
|
|
55
|
+
if (!baseProjectInfo || !resolvedProjectInfo || !analyzedProjectInfo) {
|
|
56
|
+
throw new InternalError('Project info not initialized');
|
|
57
|
+
}
|
|
58
|
+
// We may have a list of added/deleted/modified files from the file system,
|
|
59
|
+
// but there's a chance we've already processed those changes through an
|
|
60
|
+
// editor change. We track whether or not the list actually caused in changes.
|
|
61
|
+
// We use this counter to track these actual changes
|
|
62
|
+
let numDeletes = 0;
|
|
63
|
+
let numAdditions = 0;
|
|
64
|
+
let numModified = 0;
|
|
65
|
+
// First, process any file deletes
|
|
66
|
+
const baseStart = Date.now();
|
|
67
|
+
for (const filePath of changes.deleted) {
|
|
68
|
+
if (baseProjectInfo.files.has(filePath)) {
|
|
69
|
+
numDeletes++;
|
|
70
|
+
deleteResolvedInfoForFile(filePath, baseProjectInfo, resolvedProjectInfo);
|
|
71
|
+
deleteBaseInfoForFile(filePath, baseProjectInfo);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const baseEnd = Date.now();
|
|
75
|
+
// Next, process any file adds
|
|
76
|
+
const resolveStart = Date.now();
|
|
77
|
+
for (const { filePath } of changes.added) {
|
|
78
|
+
// We might already have this new file in memory if it was created in editor
|
|
79
|
+
// and previously linted while it was only in memory
|
|
80
|
+
if (!baseProjectInfo.files.has(filePath)) {
|
|
81
|
+
numAdditions++;
|
|
82
|
+
addBaseInfoForFile({
|
|
83
|
+
...parseFile(filePath),
|
|
84
|
+
isEntryPointCheck: getEntryPointCheck(settings.entryPoints),
|
|
85
|
+
}, baseProjectInfo);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// If we added or deleted any files, we fully recompute resolutions to take
|
|
89
|
+
// these changes into account, since files may have been renamed. Renames are
|
|
90
|
+
// especially tricky since it may just be an extension change(.js->.ts), and
|
|
91
|
+
// we might have already seen the new .ts file in a previous update.
|
|
92
|
+
// TODO: it's probably possible to do a more performant+surgical recomputation
|
|
93
|
+
if (numDeletes || numAdditions) {
|
|
94
|
+
resolvedProjectInfo = computeResolvedInfo(baseProjectInfo);
|
|
95
|
+
}
|
|
96
|
+
const resolveEnd = Date.now();
|
|
97
|
+
// Next, process any modified files
|
|
98
|
+
for (const { filePath, latestUpdatedAt } of changes.modified) {
|
|
99
|
+
const previousFileInfo = baseProjectInfo.files.get(filePath);
|
|
100
|
+
if (!previousFileInfo ||
|
|
101
|
+
(previousFileInfo.fileType === 'code' &&
|
|
102
|
+
previousFileInfo.lastUpdatedAt < latestUpdatedAt)) {
|
|
103
|
+
numModified++;
|
|
104
|
+
updateBaseInfoForFile({
|
|
105
|
+
...parseFile(filePath),
|
|
106
|
+
isEntryPointCheck: getEntryPointCheck(settings.entryPoints),
|
|
107
|
+
}, baseProjectInfo);
|
|
108
|
+
updateResolvedInfoForFile(filePath, baseProjectInfo, resolvedProjectInfo);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Finally, recompute analyzed info
|
|
112
|
+
if (numDeletes || numAdditions | numModified) {
|
|
113
|
+
const analyzestart = Date.now();
|
|
114
|
+
analyzedProjectInfo = computeAnalyzedInfo(resolvedProjectInfo);
|
|
115
|
+
const analyzeEnd = Date.now();
|
|
116
|
+
debug(`Synchronized changes from filesystem (deleted=${numDeletes.toLocaleString()} added=${numAdditions.toLocaleString()} modified=${numModified.toLocaleString()}):`);
|
|
117
|
+
debug(` total: ${formatMilliseconds(analyzeEnd - operationStart)}`);
|
|
118
|
+
debug(` base info: ${formatMilliseconds(baseEnd - baseStart)}`);
|
|
119
|
+
debug(` resolved info: ${formatMilliseconds(resolveEnd - resolveStart)}`);
|
|
120
|
+
debug(` analyzed info: ${formatMilliseconds(analyzeEnd - analyzestart)}`);
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
export function updateCacheForFile(filePath, fileContents, ast, { entryPoints, rootDir }) {
|
|
126
|
+
// This shouldn't be possible and is just to make sure TypeScript is happy
|
|
127
|
+
if (!baseProjectInfo || !resolvedProjectInfo || !analyzedProjectInfo) {
|
|
128
|
+
throw new InternalError('Project info not initialized');
|
|
129
|
+
}
|
|
130
|
+
const baseOptions = {
|
|
131
|
+
filePath,
|
|
132
|
+
fileContents,
|
|
133
|
+
ast,
|
|
134
|
+
isEntryPointCheck: (filePath, symbolName) => entryPoints.some(({ file, symbol }) => file === filePath && symbol === symbolName),
|
|
135
|
+
};
|
|
136
|
+
// Check if we're updating file info or adding a new file
|
|
137
|
+
if (analyzedProjectInfo.files.has(filePath)) {
|
|
138
|
+
const baseStart = Date.now();
|
|
139
|
+
const shouldUpdateDerivedProjectInfo = updateBaseInfoForFile(baseOptions, baseProjectInfo);
|
|
140
|
+
const baseEnd = Date.now();
|
|
141
|
+
// If we don't need to update
|
|
142
|
+
if (shouldUpdateDerivedProjectInfo) {
|
|
143
|
+
const resolveStart = Date.now();
|
|
144
|
+
updateResolvedInfoForFile(filePath, baseProjectInfo, resolvedProjectInfo);
|
|
145
|
+
const resolveEnd = Date.now();
|
|
146
|
+
const analyzeStart = Date.now();
|
|
147
|
+
analyzedProjectInfo = computeAnalyzedInfo(resolvedProjectInfo);
|
|
148
|
+
const analyzeEnd = Date.now();
|
|
149
|
+
debug(`Update for ${filePath.replace(rootDir, '')} complete:`);
|
|
150
|
+
debug(` total: ${formatMilliseconds(analyzeEnd - baseStart)}`);
|
|
151
|
+
debug(` base info: ${formatMilliseconds(baseEnd - baseStart)}`);
|
|
152
|
+
debug(` resolved info: ${formatMilliseconds(resolveEnd - resolveStart)}`);
|
|
153
|
+
debug(` analyzed info: ${formatMilliseconds(analyzeEnd - analyzeStart)}`);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Even if we don't need to update information we compute, we still need
|
|
158
|
+
// to update the AST nodes to take into account potentially changed locs
|
|
159
|
+
const baseFileInfo = baseProjectInfo.files.get(filePath);
|
|
160
|
+
const resolvedFileInfo = resolvedProjectInfo.files.get(filePath);
|
|
161
|
+
const analyzedFileInfo = analyzedProjectInfo.files.get(filePath);
|
|
162
|
+
if (!baseFileInfo ||
|
|
163
|
+
baseFileInfo.fileType !== 'code' ||
|
|
164
|
+
!resolvedFileInfo ||
|
|
165
|
+
resolvedFileInfo.fileType !== 'code' ||
|
|
166
|
+
!analyzedFileInfo ||
|
|
167
|
+
analyzedFileInfo.fileType !== 'code') {
|
|
168
|
+
throw new InternalError(`Could not get file info for "${filePath}"`);
|
|
169
|
+
}
|
|
170
|
+
for (let i = 0; i < baseFileInfo.exports.length; i++) {
|
|
171
|
+
resolvedFileInfo.exports[i] = {
|
|
172
|
+
...resolvedFileInfo.exports[i],
|
|
173
|
+
...baseFileInfo.exports[i],
|
|
174
|
+
};
|
|
175
|
+
analyzedFileInfo.exports[i] = {
|
|
176
|
+
...analyzedFileInfo.exports[i],
|
|
177
|
+
...resolvedFileInfo.exports[i],
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
for (let i = 0; i < baseFileInfo.reexports.length; i++) {
|
|
181
|
+
resolvedFileInfo.reexports[i] = {
|
|
182
|
+
...resolvedFileInfo.reexports[i],
|
|
183
|
+
...baseFileInfo.reexports[i],
|
|
184
|
+
};
|
|
185
|
+
analyzedFileInfo.reexports[i] = {
|
|
186
|
+
...analyzedFileInfo.reexports[i],
|
|
187
|
+
...resolvedFileInfo.reexports[i],
|
|
188
|
+
// TODO: figure out why this doesn't work without the cast
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
for (let i = 0; i < baseFileInfo.imports.length; i++) {
|
|
192
|
+
resolvedFileInfo.imports[i] = {
|
|
193
|
+
...resolvedFileInfo.imports[i],
|
|
194
|
+
...baseFileInfo.imports[i],
|
|
195
|
+
};
|
|
196
|
+
analyzedFileInfo.imports[i] = {
|
|
197
|
+
...analyzedFileInfo.imports[i],
|
|
198
|
+
...resolvedFileInfo.imports[i],
|
|
199
|
+
// TODO: figure out why this doesn't work without the cast
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const baseStart = Date.now();
|
|
207
|
+
addBaseInfoForFile(baseOptions, baseProjectInfo);
|
|
208
|
+
const baseEnd = Date.now();
|
|
209
|
+
const resolveStart = Date.now();
|
|
210
|
+
computeFolderTree(baseProjectInfo);
|
|
211
|
+
addResolvedInfoForFile(filePath, baseProjectInfo, resolvedProjectInfo);
|
|
212
|
+
const resolveEnd = Date.now();
|
|
213
|
+
const anazlyzeStart = Date.now();
|
|
214
|
+
analyzedProjectInfo = computeAnalyzedInfo(resolvedProjectInfo);
|
|
215
|
+
const analyzeEnd = Date.now();
|
|
216
|
+
debug(`${filePath.replace(rootDir, '')} add complete:`);
|
|
217
|
+
debug(` total: ${formatMilliseconds(analyzeEnd - baseStart)}`);
|
|
218
|
+
debug(` base info: ${formatMilliseconds(baseEnd - baseStart)}`);
|
|
219
|
+
debug(` resolved info: ${formatMilliseconds(resolveEnd - resolveStart)}`);
|
|
220
|
+
debug(` analyzed info: ${formatMilliseconds(analyzeEnd - anazlyzeStart)}`);
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module/module.ts"],"names":[],"mappings":"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"}
|