From 967114b29dd198160aff7cefb2ae17af84c84acb Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 10 Jan 2020 03:56:24 +0100 Subject: [PATCH 1/7] fix(typescript-estree): fix persisted parse for vue files --- .../src/create-program/createWatchProgram.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/typescript-estree/src/create-program/createWatchProgram.ts b/packages/typescript-estree/src/create-program/createWatchProgram.ts index 5d975f7d6d14..f60905a98790 100644 --- a/packages/typescript-estree/src/create-program/createWatchProgram.ts +++ b/packages/typescript-estree/src/create-program/createWatchProgram.ts @@ -395,11 +395,12 @@ function maybeInvalidateProgram( const folderWatchCallbacks = folderWatchCallbackTrackingMap.get(current); if (folderWatchCallbacks) { folderWatchCallbacks.forEach(cb => { - cb(currentDir, ts.FileWatcherEventKind.Changed); + if (currentDir !== current) { + cb(currentDir, ts.FileWatcherEventKind.Changed); + } cb(current!, ts.FileWatcherEventKind.Changed); }); hasCallback = true; - break; } next = canonicalDirname(current); From 1ff7eb24cec0415b64afde82a55e78192dc9b083 Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 10 Jan 2020 22:22:08 +0100 Subject: [PATCH 2/7] test(typescript-estree): relative path and persisted parse --- .../src/create-program/createWatchProgram.ts | 1 + .../tests/lib/persistentParse.ts | 40 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/typescript-estree/src/create-program/createWatchProgram.ts b/packages/typescript-estree/src/create-program/createWatchProgram.ts index f60905a98790..7440e30bda74 100644 --- a/packages/typescript-estree/src/create-program/createWatchProgram.ts +++ b/packages/typescript-estree/src/create-program/createWatchProgram.ts @@ -401,6 +401,7 @@ function maybeInvalidateProgram( cb(current!, ts.FileWatcherEventKind.Changed); }); hasCallback = true; + break; } next = canonicalDirname(current); diff --git a/packages/typescript-estree/tests/lib/persistentParse.ts b/packages/typescript-estree/tests/lib/persistentParse.ts index bdeed2f55389..b09eac558d5d 100644 --- a/packages/typescript-estree/tests/lib/persistentParse.ts +++ b/packages/typescript-estree/tests/lib/persistentParse.ts @@ -10,6 +10,7 @@ const CONTENTS = { 'bat/baz/bar': 'console.log("bat/baz/bar")', }; +const cwdCopy = process.cwd(); const tmpDirs = new Set(); afterEach(() => { // stop watching the files and folders @@ -18,6 +19,9 @@ afterEach(() => { // clean up the temporary files and folders tmpDirs.forEach(t => t.removeCallback()); tmpDirs.clear(); + + // restore original cwd + process.chdir(cwdCopy); }); function writeTSConfig(dirName: string, config: Record): void { @@ -54,14 +58,24 @@ function setup(tsconfig: Record, writeBar = true): string { return tmpDir.name; } -function parseFile(filename: keyof typeof CONTENTS, tmpDir: string): void { +function parseFile( + filename: keyof typeof CONTENTS, + tmpDir: string, + relative?: boolean, +): void { parseAndGenerateServices(CONTENTS.foo, { project: './tsconfig.json', tsconfigRootDir: tmpDir, - filePath: path.join(tmpDir, 'src', `${filename}.ts`), + filePath: relative + ? path.join('src', `${filename}.ts`) + : path.join(tmpDir, 'src', `${filename}.ts`), }); } +function existsSync(filename: keyof typeof CONTENTS, tmpDir: string = '') { + return fs.existsSync(path.join(tmpDir, 'src', `${filename}.ts`)); +} + function baseTests( tsConfigExcludeBar: Record, tsConfigIncludeAll: Record, @@ -161,6 +175,28 @@ function baseTests( expect(() => parseFile('foo', PROJECT_DIR)).not.toThrow(); expect(() => parseFile('bar', PROJECT_DIR)).not.toThrow(); }); + + it('should work with relative paths', () => { + const PROJECT_DIR = setup(tsConfigIncludeAll, false); + console.log(process.cwd()); + process.chdir(PROJECT_DIR); + + // parse once to: assert the config as correct, and to make sure the program is setup + expect(() => parseFile('foo', PROJECT_DIR, true)).not.toThrow(); + // bar should throw because it doesn't exist yet + expect(() => parseFile('bar', PROJECT_DIR, true)).toThrow(); + + // write a new file and attempt to parse it + writeFile(PROJECT_DIR, 'bar'); + + // make sure that file is correctly created + expect(existsSync('bar')).toEqual(true); + expect(existsSync('bar', PROJECT_DIR)).toEqual(true); + + // both files should parse fine now + expect(() => parseFile('foo', PROJECT_DIR, true)).not.toThrow(); + expect(() => parseFile('bar', PROJECT_DIR, true)).not.toThrow(); + }); } describe('persistent parse', () => { From 6544f0b2c831c9be66104fdf5a53924e8b52b07d Mon Sep 17 00:00:00 2001 From: Armano Date: Fri, 10 Jan 2020 22:56:13 +0100 Subject: [PATCH 3/7] fix(typescript-estree): relative path and persisted parse --- .../src/create-program/createProjectProgram.ts | 3 ++- .../typescript-estree/src/create-program/shared.ts | 13 ++++++++----- .../typescript-estree/tests/lib/persistentParse.ts | 1 - 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/typescript-estree/src/create-program/createProjectProgram.ts b/packages/typescript-estree/src/create-program/createProjectProgram.ts index 32f81a40f667..db4c8275e673 100644 --- a/packages/typescript-estree/src/create-program/createProjectProgram.ts +++ b/packages/typescript-estree/src/create-program/createProjectProgram.ts @@ -3,7 +3,7 @@ import path from 'path'; import { getProgramsForProjects } from './createWatchProgram'; import { firstDefined } from '../node-utils'; import { Extra } from '../parser-options'; -import { ASTAndProgram } from './shared'; +import { ASTAndProgram, ensureAbsolutePath } from './shared'; const log = debug('typescript-eslint:typescript-estree:createProjectProgram'); @@ -21,6 +21,7 @@ function createProjectProgram( extra: Extra, ): ASTAndProgram | undefined { log('Creating project program for: %s', extra.filePath); + extra.filePath = ensureAbsolutePath(extra.filePath, extra); const astAndProgram = firstDefined( getProgramsForProjects(code, extra.filePath, extra), diff --git a/packages/typescript-estree/src/create-program/shared.ts b/packages/typescript-estree/src/create-program/shared.ts index 8aceb204c474..556d0af562aa 100644 --- a/packages/typescript-estree/src/create-program/shared.ts +++ b/packages/typescript-estree/src/create-program/shared.ts @@ -38,12 +38,14 @@ function getCanonicalFileName(filePath: string): CanonicalPath { return correctPathCasing(normalized) as CanonicalPath; } +function ensureAbsolutePath(p: string, extra: Extra): string { + return path.isAbsolute(p) + ? p + : path.join(extra.tsconfigRootDir || process.cwd(), p); +} + function getTsconfigPath(tsconfigPath: string, extra: Extra): CanonicalPath { - return getCanonicalFileName( - path.isAbsolute(tsconfigPath) - ? tsconfigPath - : path.join(extra.tsconfigRootDir || process.cwd(), tsconfigPath), - ); + return getCanonicalFileName(ensureAbsolutePath(tsconfigPath, extra)); } function canonicalDirname(p: CanonicalPath): CanonicalPath { @@ -81,6 +83,7 @@ function getScriptKind( export { ASTAndProgram, + ensureAbsolutePath, canonicalDirname, CanonicalPath, DEFAULT_COMPILER_OPTIONS, diff --git a/packages/typescript-estree/tests/lib/persistentParse.ts b/packages/typescript-estree/tests/lib/persistentParse.ts index b09eac558d5d..6cbbb0cd9371 100644 --- a/packages/typescript-estree/tests/lib/persistentParse.ts +++ b/packages/typescript-estree/tests/lib/persistentParse.ts @@ -178,7 +178,6 @@ function baseTests( it('should work with relative paths', () => { const PROJECT_DIR = setup(tsConfigIncludeAll, false); - console.log(process.cwd()); process.chdir(PROJECT_DIR); // parse once to: assert the config as correct, and to make sure the program is setup From 8edb8b826bf03cc06db2446e83697e5ff4790186 Mon Sep 17 00:00:00 2001 From: Armano Date: Sat, 11 Jan 2020 00:53:08 +0100 Subject: [PATCH 4/7] fix(typescript-estree): ensure that passed path in parser is absolute --- .../src/create-program/createProjectProgram.ts | 3 +-- packages/typescript-estree/src/create-program/shared.ts | 2 +- packages/typescript-estree/src/parser.ts | 2 ++ packages/typescript-estree/tests/lib/persistentParse.ts | 5 ++++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/typescript-estree/src/create-program/createProjectProgram.ts b/packages/typescript-estree/src/create-program/createProjectProgram.ts index db4c8275e673..32f81a40f667 100644 --- a/packages/typescript-estree/src/create-program/createProjectProgram.ts +++ b/packages/typescript-estree/src/create-program/createProjectProgram.ts @@ -3,7 +3,7 @@ import path from 'path'; import { getProgramsForProjects } from './createWatchProgram'; import { firstDefined } from '../node-utils'; import { Extra } from '../parser-options'; -import { ASTAndProgram, ensureAbsolutePath } from './shared'; +import { ASTAndProgram } from './shared'; const log = debug('typescript-eslint:typescript-estree:createProjectProgram'); @@ -21,7 +21,6 @@ function createProjectProgram( extra: Extra, ): ASTAndProgram | undefined { log('Creating project program for: %s', extra.filePath); - extra.filePath = ensureAbsolutePath(extra.filePath, extra); const astAndProgram = firstDefined( getProgramsForProjects(code, extra.filePath, extra), diff --git a/packages/typescript-estree/src/create-program/shared.ts b/packages/typescript-estree/src/create-program/shared.ts index 556d0af562aa..be60f245374a 100644 --- a/packages/typescript-estree/src/create-program/shared.ts +++ b/packages/typescript-estree/src/create-program/shared.ts @@ -83,10 +83,10 @@ function getScriptKind( export { ASTAndProgram, - ensureAbsolutePath, canonicalDirname, CanonicalPath, DEFAULT_COMPILER_OPTIONS, + ensureAbsolutePath, getCanonicalFileName, getScriptKind, getTsconfigPath, diff --git a/packages/typescript-estree/src/parser.ts b/packages/typescript-estree/src/parser.ts index fb62c090bb79..6a9e0a1c6b5d 100644 --- a/packages/typescript-estree/src/parser.ts +++ b/packages/typescript-estree/src/parser.ts @@ -11,6 +11,7 @@ import { createSourceFile } from './create-program/createSourceFile'; import { Extra, TSESTreeOptions, ParserServices } from './parser-options'; import { getFirstSemanticOrSyntacticError } from './semantic-or-syntactic-errors'; import { TSESTree } from './ts-estree'; +import { ensureAbsolutePath } from './create-program/shared'; /** * This needs to be kept in sync with the top-level README.md in the @@ -145,6 +146,7 @@ function applyParserOptionsToExtra(options: TSESTreeOptions): void { } else { extra.filePath = getFileName(extra); } + extra.filePath = ensureAbsolutePath(extra.filePath, extra); /** * The JSX AST changed the node type for string literals diff --git a/packages/typescript-estree/tests/lib/persistentParse.ts b/packages/typescript-estree/tests/lib/persistentParse.ts index 6cbbb0cd9371..0ece9bc95f18 100644 --- a/packages/typescript-estree/tests/lib/persistentParse.ts +++ b/packages/typescript-estree/tests/lib/persistentParse.ts @@ -72,7 +72,10 @@ function parseFile( }); } -function existsSync(filename: keyof typeof CONTENTS, tmpDir: string = '') { +function existsSync( + filename: keyof typeof CONTENTS, + tmpDir: string = '', +): boolean { return fs.existsSync(path.join(tmpDir, 'src', `${filename}.ts`)); } From c245a20594ddf7577a8b7a4c160d18c044ea6abc Mon Sep 17 00:00:00 2001 From: Armano Date: Sat, 11 Jan 2020 01:08:45 +0100 Subject: [PATCH 5/7] chore(typescript-estree): lint fix --- packages/typescript-estree/tests/lib/persistentParse.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/typescript-estree/tests/lib/persistentParse.ts b/packages/typescript-estree/tests/lib/persistentParse.ts index 0ece9bc95f18..85d2cb6b2b81 100644 --- a/packages/typescript-estree/tests/lib/persistentParse.ts +++ b/packages/typescript-estree/tests/lib/persistentParse.ts @@ -72,10 +72,7 @@ function parseFile( }); } -function existsSync( - filename: keyof typeof CONTENTS, - tmpDir: string = '', -): boolean { +function existsSync(filename: keyof typeof CONTENTS, tmpDir = ''): boolean { return fs.existsSync(path.join(tmpDir, 'src', `${filename}.ts`)); } From b182332d77e053969ad79f419562471078a45484 Mon Sep 17 00:00:00 2001 From: Armano Date: Sat, 11 Jan 2020 15:52:29 +0100 Subject: [PATCH 6/7] test(typescript-estree): correct code in parseFile --- packages/typescript-estree/tests/lib/persistentParse.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/typescript-estree/tests/lib/persistentParse.ts b/packages/typescript-estree/tests/lib/persistentParse.ts index 85d2cb6b2b81..fd9cbdc93bbc 100644 --- a/packages/typescript-estree/tests/lib/persistentParse.ts +++ b/packages/typescript-estree/tests/lib/persistentParse.ts @@ -63,7 +63,7 @@ function parseFile( tmpDir: string, relative?: boolean, ): void { - parseAndGenerateServices(CONTENTS.foo, { + parseAndGenerateServices(CONTENTS[filename], { project: './tsconfig.json', tsconfigRootDir: tmpDir, filePath: relative From d4704e53c9e1f1c03094e99b3647420bedc2bb38 Mon Sep 17 00:00:00 2001 From: Armano Date: Sat, 11 Jan 2020 15:53:39 +0100 Subject: [PATCH 7/7] fix(typescript-estree): correct vscode issue for custom extensions - this issue is specific to vscode --- .../typescript-estree/src/create-program/createWatchProgram.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/typescript-estree/src/create-program/createWatchProgram.ts b/packages/typescript-estree/src/create-program/createWatchProgram.ts index 7440e30bda74..f60905a98790 100644 --- a/packages/typescript-estree/src/create-program/createWatchProgram.ts +++ b/packages/typescript-estree/src/create-program/createWatchProgram.ts @@ -401,7 +401,6 @@ function maybeInvalidateProgram( cb(current!, ts.FileWatcherEventKind.Changed); }); hasCallback = true; - break; } next = canonicalDirname(current);