From 206c94bddc2d0ed428f41eb954966e8f7ba4c97f Mon Sep 17 00:00:00 2001 From: Armano Date: Wed, 8 Jan 2020 22:26:45 +0100 Subject: [PATCH] fix(typescript-estree): parsing of deeply nested new files in new folder (#1412) Co-authored-by: Brad Zacher --- .../src/create-program/createWatchProgram.ts | 7 +++--- .../tests/lib/persistentParse.ts | 23 +++++++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/packages/typescript-estree/src/create-program/createWatchProgram.ts b/packages/typescript-estree/src/create-program/createWatchProgram.ts index 72b5535c578..5d975f7d6d1 100644 --- a/packages/typescript-estree/src/create-program/createWatchProgram.ts +++ b/packages/typescript-estree/src/create-program/createWatchProgram.ts @@ -394,9 +394,10 @@ function maybeInvalidateProgram( current = next; const folderWatchCallbacks = folderWatchCallbackTrackingMap.get(current); if (folderWatchCallbacks) { - folderWatchCallbacks.forEach(cb => - cb(currentDir, ts.FileWatcherEventKind.Changed), - ); + folderWatchCallbacks.forEach(cb => { + cb(currentDir, ts.FileWatcherEventKind.Changed); + cb(current!, ts.FileWatcherEventKind.Changed); + }); hasCallback = true; break; } diff --git a/packages/typescript-estree/tests/lib/persistentParse.ts b/packages/typescript-estree/tests/lib/persistentParse.ts index 8be08c9c457..bdeed2f5538 100644 --- a/packages/typescript-estree/tests/lib/persistentParse.ts +++ b/packages/typescript-estree/tests/lib/persistentParse.ts @@ -7,6 +7,7 @@ const CONTENTS = { foo: 'console.log("foo")', bar: 'console.log("bar")', 'baz/bar': 'console.log("baz bar")', + 'bat/baz/bar': 'console.log("bat/baz/bar")', }; const tmpDirs = new Set(); @@ -22,7 +23,7 @@ afterEach(() => { function writeTSConfig(dirName: string, config: Record): void { fs.writeFileSync(path.join(dirName, 'tsconfig.json'), JSON.stringify(config)); } -function writeFile(dirName: string, file: 'foo' | 'bar' | 'baz/bar'): void { +function writeFile(dirName: string, file: keyof typeof CONTENTS): void { fs.writeFileSync(path.join(dirName, 'src', `${file}.ts`), CONTENTS[file]); } function renameFile(dirName: string, src: 'bar', dest: 'baz/bar'): void { @@ -53,7 +54,7 @@ function setup(tsconfig: Record, writeBar = true): string { return tmpDir.name; } -function parseFile(filename: 'foo' | 'bar' | 'baz/bar', tmpDir: string): void { +function parseFile(filename: keyof typeof CONTENTS, tmpDir: string): void { parseAndGenerateServices(CONTENTS.foo, { project: './tsconfig.json', tsconfigRootDir: tmpDir, @@ -112,6 +113,24 @@ function baseTests( expect(() => parseFile(bazSlashBar, PROJECT_DIR)).not.toThrow(); }); + it('allows parsing of deeply nested new files in new folder', () => { + const PROJECT_DIR = setup(tsConfigIncludeAll); + + expect(() => parseFile('foo', PROJECT_DIR)).not.toThrow(); + + // Create deep folder structure after first parse (this is important step) + // context: https://github.com/typescript-eslint/typescript-eslint/issues/1394 + fs.mkdirSync(path.join(PROJECT_DIR, 'src', 'bat')); + fs.mkdirSync(path.join(PROJECT_DIR, 'src', 'bat', 'baz')); + + const bazSlashBar = path.join('bat', 'baz', 'bar') as 'bat/baz/bar'; + + // write a new file and attempt to parse it + writeFile(PROJECT_DIR, bazSlashBar); + + expect(() => parseFile(bazSlashBar, PROJECT_DIR)).not.toThrow(); + }); + it('allows renaming of files', () => { const PROJECT_DIR = setup(tsConfigIncludeAll, true); const bazSlashBar = path.join('baz', 'bar') as 'baz/bar';