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.
Files changed (83) hide show
  1. package/.prettierrc.json +6 -0
  2. package/.vscode/launch.json +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +3 -0
  5. package/dist/module/computeAnalyzedInfo.d.ts +3 -0
  6. package/dist/module/computeAnalyzedInfo.js +297 -0
  7. package/dist/module/computeAnalyzedInfo.js.map +1 -0
  8. package/dist/module/computeBaseInfo.d.ts +24 -0
  9. package/dist/module/computeBaseInfo.js +564 -0
  10. package/dist/module/computeBaseInfo.js.map +1 -0
  11. package/dist/module/computeResolvedInfo.d.ts +7 -0
  12. package/dist/module/computeResolvedInfo.js +361 -0
  13. package/dist/module/computeResolvedInfo.js.map +1 -0
  14. package/dist/module/module.d.ts +20 -0
  15. package/dist/module/module.js +224 -0
  16. package/dist/module/module.js.map +1 -0
  17. package/dist/module/util.d.ts +44 -0
  18. package/dist/module/util.js +67 -0
  19. package/dist/module/util.js.map +1 -0
  20. package/dist/plugin.d.ts +19 -0
  21. package/dist/plugin.js +57 -0
  22. package/dist/plugin.js.map +1 -0
  23. package/dist/rules/circular/circular.d.ts +2 -0
  24. package/dist/rules/circular/circular.js +107 -0
  25. package/dist/rules/circular/circular.js.map +1 -0
  26. package/dist/rules/entryPoint/entryPoint.d.ts +1 -0
  27. package/dist/rules/entryPoint/entryPoint.js +38 -0
  28. package/dist/rules/entryPoint/entryPoint.js.map +1 -0
  29. package/dist/rules/externalBarrelReexports/externalBarrelReexports.d.ts +1 -0
  30. package/dist/rules/externalBarrelReexports/externalBarrelReexports.js +41 -0
  31. package/dist/rules/externalBarrelReexports/externalBarrelReexports.js.map +1 -0
  32. package/dist/rules/missing/missing.d.ts +1 -0
  33. package/dist/rules/missing/missing.js +59 -0
  34. package/dist/rules/missing/missing.js.map +1 -0
  35. package/dist/rules/testInProd/testInProd.d.ts +1 -0
  36. package/dist/rules/testInProd/testInProd.js +42 -0
  37. package/dist/rules/testInProd/testInProd.js.map +1 -0
  38. package/dist/rules/unused/unused.d.ts +3 -0
  39. package/dist/rules/unused/unused.js +77 -0
  40. package/dist/rules/unused/unused.js.map +1 -0
  41. package/dist/rules/util.d.ts +11 -0
  42. package/dist/rules/util.js +107 -0
  43. package/dist/rules/util.js.map +1 -0
  44. package/dist/settings/settings.d.ts +12 -0
  45. package/dist/settings/settings.js +123 -0
  46. package/dist/settings/settings.js.map +1 -0
  47. package/dist/settings/typescript.d.ts +3 -0
  48. package/dist/settings/typescript.js +39 -0
  49. package/dist/settings/typescript.js.map +1 -0
  50. package/dist/settings/user.d.ts +45 -0
  51. package/dist/settings/user.js +52 -0
  52. package/dist/settings/user.js.map +1 -0
  53. package/dist/settings/util.d.ts +2 -0
  54. package/dist/settings/util.js +33 -0
  55. package/dist/settings/util.js.map +1 -0
  56. package/dist/types/analyzed.d.ts +120 -0
  57. package/dist/types/analyzed.js +2 -0
  58. package/dist/types/analyzed.js.map +1 -0
  59. package/dist/types/base.d.ts +230 -0
  60. package/dist/types/base.js +2 -0
  61. package/dist/types/base.js.map +1 -0
  62. package/dist/types/context.d.ts +2 -0
  63. package/dist/types/context.js +2 -0
  64. package/dist/types/context.js.map +1 -0
  65. package/dist/types/resolved.d.ts +60 -0
  66. package/dist/types/resolved.js +2 -0
  67. package/dist/types/resolved.js.map +1 -0
  68. package/dist/util/code.d.ts +1 -0
  69. package/dist/util/code.js +6 -0
  70. package/dist/util/code.js.map +1 -0
  71. package/dist/util/error.d.ts +14 -0
  72. package/dist/util/error.js +19 -0
  73. package/dist/util/error.js.map +1 -0
  74. package/dist/util/files.d.ts +10 -0
  75. package/dist/util/files.js +122 -0
  76. package/dist/util/files.js.map +1 -0
  77. package/dist/util/logging.d.ts +5 -0
  78. package/dist/util/logging.js +19 -0
  79. package/dist/util/logging.js.map +1 -0
  80. package/eslint.config.mjs +85 -0
  81. package/jest.config.ts +10 -0
  82. package/package.json +49 -0
  83. 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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"}