();
+/**
+ * Clear tsconfig caches.
+ * Primarily used for testing.
+ */
+export function clearCaches() {
+ knownWatchProgramMap.clear();
+ watchCallbackTrackingMap.clear();
+ parsedFilesSeen.clear();
+}
+
/**
* Holds information about the file currently being linted
*/
diff --git a/packages/typescript-estree/tests/fixtures/simpleProject/file.ts b/packages/typescript-estree/tests/fixtures/simpleProject/file.ts
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/packages/typescript-estree/tests/fixtures/simpleProject/tsconfig.json b/packages/typescript-estree/tests/fixtures/simpleProject/tsconfig.json
new file mode 100644
index 000000000000..0967ef424bce
--- /dev/null
+++ b/packages/typescript-estree/tests/fixtures/simpleProject/tsconfig.json
@@ -0,0 +1 @@
+{}
diff --git a/packages/typescript-estree/tests/lib/parse.ts b/packages/typescript-estree/tests/lib/parse.ts
index 3d8dfe222e45..57a4bc057424 100644
--- a/packages/typescript-estree/tests/lib/parse.ts
+++ b/packages/typescript-estree/tests/lib/parse.ts
@@ -2,6 +2,9 @@ import * as parser from '../../src/parser';
import * as astConverter from '../../src/ast-converter';
import { TSESTreeOptions } from '../../src/parser-options';
import { createSnapshotTestBlock } from '../../tools/test-utils';
+import { join } from 'path';
+
+const FIXTURES_DIR = './tests/fixtures/simpleProject';
describe('parse()', () => {
describe('basic functionality', () => {
@@ -91,6 +94,7 @@ describe('parse()', () => {
tsconfigRootDir: expect.any(String),
useJSXTextNode: false,
preserveNodeMaps: false,
+ createDefaultProgram: false,
},
false,
);
@@ -137,6 +141,12 @@ describe('parse()', () => {
tokens: true,
range: true,
loc: true,
+ filePath: 'tests/fixtures/simpleProject/file.ts',
+ };
+ const projectConfig: TSESTreeOptions = {
+ ...baseConfig,
+ tsconfigRootDir: join(process.cwd(), FIXTURES_DIR),
+ project: './tsconfig.json',
};
it('should not impact the use of parse()', () => {
@@ -167,10 +177,10 @@ describe('parse()', () => {
expect(noOptionSet.services.esTreeNodeToTSNodeMap).toBeUndefined();
expect(noOptionSet.services.tsNodeToESTreeNodeMap).toBeUndefined();
- const withProjectNoOptionSet = parser.parseAndGenerateServices(code, {
- ...baseConfig,
- project: './tsconfig.json',
- });
+ const withProjectNoOptionSet = parser.parseAndGenerateServices(
+ code,
+ projectConfig,
+ );
expect(withProjectNoOptionSet.services.esTreeNodeToTSNodeMap).toEqual(
expect.any(WeakMap),
@@ -194,9 +204,8 @@ describe('parse()', () => {
);
const withProjectOptionSetToTrue = parser.parseAndGenerateServices(code, {
- ...baseConfig,
+ ...projectConfig,
preserveNodeMaps: true,
- project: './tsconfig.json',
});
expect(withProjectOptionSetToTrue.services.esTreeNodeToTSNodeMap).toEqual(
@@ -218,7 +227,10 @@ describe('parse()', () => {
const withProjectOptionSetToFalse = parser.parseAndGenerateServices(
code,
- { ...baseConfig, preserveNodeMaps: false, project: './tsconfig.json' },
+ {
+ ...projectConfig,
+ preserveNodeMaps: false,
+ },
);
expect(
diff --git a/packages/typescript-estree/tests/lib/semanticInfo.ts b/packages/typescript-estree/tests/lib/semanticInfo.ts
index 3f0a69b30537..7e5c634db9d3 100644
--- a/packages/typescript-estree/tests/lib/semanticInfo.ts
+++ b/packages/typescript-estree/tests/lib/semanticInfo.ts
@@ -13,6 +13,7 @@ import {
ParseAndGenerateServicesResult,
} from '../../src/parser';
import { TSESTree } from '../../src/ts-estree';
+import { clearCaches } from '../../src/tsconfig-parser';
const FIXTURES_DIR = './tests/fixtures/semanticInfo';
const testFiles = glob.sync(`${FIXTURES_DIR}/**/*.src.ts`);
@@ -28,11 +29,14 @@ function createOptions(fileName: string): TSESTreeOptions & { cwd?: string } {
errorOnUnknownASTType: true,
filePath: fileName,
tsconfigRootDir: join(process.cwd(), FIXTURES_DIR),
- project: './tsconfig.json',
+ project: `./tsconfig.json`,
loggerFn: false,
};
}
+// ensure tsconfig-parser caches are clean for each test
+beforeEach(() => clearCaches());
+
describe('semanticInfo', () => {
// test all AST snapshots
testFiles.forEach(filename => {
@@ -193,12 +197,14 @@ describe('semanticInfo', () => {
it('non-existent file tests', () => {
const parseResult = parseCodeAndGenerateServices(
`const x = [parseInt("5")];`,
- createOptions(' '),
+ {
+ ...createOptions(' '),
+ project: undefined,
+ preserveNodeMaps: true,
+ },
);
- // get type checker
- expect(parseResult).toHaveProperty('services.program.getTypeChecker');
- const checker = parseResult.services.program!.getTypeChecker();
+ expect(parseResult.services.program).toBeUndefined();
// get bound name
const boundName = (parseResult.ast.body[0] as TSESTree.VariableDeclaration)
@@ -210,8 +216,6 @@ describe('semanticInfo', () => {
);
expect(tsBoundName).toBeDefined();
- checkNumberArrayType(checker, tsBoundName);
-
expect(parseResult.services.tsNodeToESTreeNodeMap!.get(tsBoundName)).toBe(
boundName,
);
@@ -220,18 +224,21 @@ describe('semanticInfo', () => {
it('non-existent file should provide parents nodes', () => {
const parseResult = parseCodeAndGenerateServices(
`function M() { return Base }`,
- createOptions(' '),
+ { ...createOptions(' '), project: undefined },
);
- // https://github.com/JamesHenry/typescript-estree/issues/77
- expect(parseResult.services.program).toBeDefined();
- expect(
- parseResult.services.program!.getSourceFile(' '),
- ).toBeDefined();
- expect(
- parseResult.services.program!.getSourceFile(' ')!.statements[0]
- .parent,
- ).toBeDefined();
+ expect(parseResult.services.program).toBeUndefined();
+ });
+
+ it(`non-existent file should throw error when project provided`, () => {
+ expect(() =>
+ parseCodeAndGenerateServices(
+ `function M() { return Base }`,
+ createOptions(' '),
+ ),
+ ).toThrow(
+ `If "parserOptions.project" has been set for @typescript-eslint/parser, must be included in at least one of the projects provided.`,
+ );
});
it('non-existent project file', () => {
@@ -260,6 +267,15 @@ describe('semanticInfo', () => {
parseCodeAndGenerateServices(readFileSync(fileName, 'utf8'), badConfig),
).toThrowErrorMatchingSnapshot();
});
+
+ it('default program produced with option', () => {
+ const parseResult = parseCodeAndGenerateServices('var foo = 5;', {
+ ...createOptions(' '),
+ createDefaultProgram: true,
+ });
+
+ expect(parseResult.services.program).toBeDefined();
+ });
});
function testIsolatedFile(
diff --git a/tests/integration/utils/.eslintrc.js b/tests/integration/utils/.eslintrc.js
new file mode 100644
index 000000000000..8ca32766a124
--- /dev/null
+++ b/tests/integration/utils/.eslintrc.js
@@ -0,0 +1,5 @@
+module.exports = {
+ parserOptions: {
+ project: `${__dirname}/jsconfig.json`,
+ },
+};
diff --git a/tests/integration/utils/jsconfig.json b/tests/integration/utils/jsconfig.json
new file mode 100644
index 000000000000..d53d21eadfbb
--- /dev/null
+++ b/tests/integration/utils/jsconfig.json
@@ -0,0 +1,3 @@
+{
+ "exclude": [".eslintrc.js"]
+}
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy