From 5a45c44eb789f52ceb1aa0e23a230ecb599bfb08 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Wed, 29 Jun 2016 17:04:42 -0700 Subject: [PATCH] Dont load JavaScript if types packages are present --- src/compiler/program.ts | 19 ++++++++++++------- .../amd/maxDepthIncreased/root.js | 6 ++++-- .../nodeModulesMaxDepthIncreased.errors.txt | 18 +++++++++++++++--- .../amd/nodeModulesMaxDepthIncreased.json | 1 + .../node/maxDepthIncreased/root.js | 5 ++++- .../nodeModulesMaxDepthIncreased.errors.txt | 18 +++++++++++++++--- .../node/nodeModulesMaxDepthIncreased.json | 1 + .../node_modules/@types/m4/entry.d.ts | 1 + .../node_modules/@types/m4/package.json | 5 +++++ .../node_modules/m4/entry.js | 1 + .../node_modules/m4/package.json | 5 +++++ .../maxDepthIncreased/root.ts | 8 +++++++- 12 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@types/m4/entry.d.ts create mode 100644 tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@types/m4/package.json create mode 100644 tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/m4/entry.js create mode 100644 tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/m4/package.json diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 5cb3b8dad7..c56debdf25 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -779,13 +779,18 @@ namespace ts { while (true) { const baseName = getBaseFileName(directory); if (baseName !== "node_modules") { - const result = - // first: try to load module as-is - loadModuleFromNodeModulesFolder(moduleName, directory, failedLookupLocations, state) || - // second: try to load module from the scope '@types' - loadModuleFromNodeModulesFolder(combinePaths("@types", moduleName), directory, failedLookupLocations, state); - if (result) { - return result; + // Try to load source from the package + const packageResult = loadModuleFromNodeModulesFolder(moduleName, directory, failedLookupLocations, state); + if (packageResult && hasTypeScriptFileExtension(packageResult)) { + // Always prefer a TypeScript (.ts, .tsx, .d.ts) file shipped with the package + return packageResult; + } + else { + // Else prefer a types package over non-TypeScript results (e.g. JavaScript files) + const typesResult = loadModuleFromNodeModulesFolder(combinePaths("@types", moduleName), directory, failedLookupLocations, state); + if (typesResult || packageResult) { + return typesResult || packageResult; + } } } diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/maxDepthIncreased/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/maxDepthIncreased/root.js index 77951a4889..0024891fbe 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/maxDepthIncreased/root.js +++ b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/maxDepthIncreased/root.js @@ -1,6 +1,8 @@ -define(["require", "exports", "m1"], function (require, exports, m1) { +define(["require", "exports", "m1", "m4"], function (require, exports, m1, m4) { "use strict"; m1.f1("test"); m1.f2.a = 10; - m1.f2.person.age = "10"; // Error: Should be number + m1.f2.person.age = "10"; // Should error if loaded the .js files correctly + var r1 = m4.test.charAt(2); // Should error if correctly not using the .js file but using @types info + var r2 = 3 + m4.foo; // Should be OK if correctly using the @types .d.ts file }); diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/nodeModulesMaxDepthIncreased.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/nodeModulesMaxDepthIncreased.errors.txt index f63c2a789e..473d69bc52 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/nodeModulesMaxDepthIncreased.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/nodeModulesMaxDepthIncreased.errors.txt @@ -1,4 +1,5 @@ -maxDepthIncreased/root.ts(4,1): error TS2322: Type 'string' is not assignable to type 'number'. +maxDepthIncreased/root.ts(7,1): error TS2322: Type 'string' is not assignable to type 'number'. +maxDepthIncreased/root.ts(8,13): error TS2339: Property 'test' does not exist on type 'typeof "C:/src/TypeScript/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@...'. ==== index.js (0 errors) ==== @@ -28,11 +29,22 @@ maxDepthIncreased/root.ts(4,1): error TS2322: Type 'string' is not assignable to exports.f2 = m2; -==== maxDepthIncreased/root.ts (1 errors) ==== +==== entry.d.ts (0 errors) ==== + export declare var foo: number; + +==== maxDepthIncreased/root.ts (2 errors) ==== import * as m1 from "m1"; + import * as m4 from "m4"; + m1.f1("test"); m1.f2.a = 10; - m1.f2.person.age = "10"; // Error: Should be number + + m1.f2.person.age = "10"; // Should error if loaded the .js files correctly ~~~~~~~~~~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. + let r1 = m4.test.charAt(2); // Should error if correctly not using the .js file but using @types info + ~~~~ +!!! error TS2339: Property 'test' does not exist on type 'typeof "C:/src/TypeScript/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@...'. + + let r2 = 3 + m4.foo; // Should be OK if correctly using the @types .d.ts file \ No newline at end of file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/nodeModulesMaxDepthIncreased.json b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/nodeModulesMaxDepthIncreased.json index 1350bf6441..bb3234f1db 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/nodeModulesMaxDepthIncreased.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/amd/nodeModulesMaxDepthIncreased.json @@ -10,6 +10,7 @@ "maxDepthIncreased/node_modules/m2/node_modules/m3/index.js", "maxDepthIncreased/node_modules/m2/entry.js", "maxDepthIncreased/node_modules/m1/index.js", + "maxDepthIncreased/node_modules/@types/m4/entry.d.ts", "maxDepthIncreased/root.ts" ], "emittedFiles": [ diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/maxDepthIncreased/root.js b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/maxDepthIncreased/root.js index 3a0a96991b..ba6d7e9624 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/maxDepthIncreased/root.js +++ b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/maxDepthIncreased/root.js @@ -1,5 +1,8 @@ "use strict"; var m1 = require("m1"); +var m4 = require("m4"); m1.f1("test"); m1.f2.a = 10; -m1.f2.person.age = "10"; // Error: Should be number +m1.f2.person.age = "10"; // Should error if loaded the .js files correctly +var r1 = m4.test.charAt(2); // Should error if correctly not using the .js file but using @types info +var r2 = 3 + m4.foo; // Should be OK if correctly using the @types .d.ts file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/nodeModulesMaxDepthIncreased.errors.txt b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/nodeModulesMaxDepthIncreased.errors.txt index f63c2a789e..473d69bc52 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/nodeModulesMaxDepthIncreased.errors.txt +++ b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/nodeModulesMaxDepthIncreased.errors.txt @@ -1,4 +1,5 @@ -maxDepthIncreased/root.ts(4,1): error TS2322: Type 'string' is not assignable to type 'number'. +maxDepthIncreased/root.ts(7,1): error TS2322: Type 'string' is not assignable to type 'number'. +maxDepthIncreased/root.ts(8,13): error TS2339: Property 'test' does not exist on type 'typeof "C:/src/TypeScript/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@...'. ==== index.js (0 errors) ==== @@ -28,11 +29,22 @@ maxDepthIncreased/root.ts(4,1): error TS2322: Type 'string' is not assignable to exports.f2 = m2; -==== maxDepthIncreased/root.ts (1 errors) ==== +==== entry.d.ts (0 errors) ==== + export declare var foo: number; + +==== maxDepthIncreased/root.ts (2 errors) ==== import * as m1 from "m1"; + import * as m4 from "m4"; + m1.f1("test"); m1.f2.a = 10; - m1.f2.person.age = "10"; // Error: Should be number + + m1.f2.person.age = "10"; // Should error if loaded the .js files correctly ~~~~~~~~~~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. + let r1 = m4.test.charAt(2); // Should error if correctly not using the .js file but using @types info + ~~~~ +!!! error TS2339: Property 'test' does not exist on type 'typeof "C:/src/TypeScript/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@...'. + + let r2 = 3 + m4.foo; // Should be OK if correctly using the @types .d.ts file \ No newline at end of file diff --git a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/nodeModulesMaxDepthIncreased.json b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/nodeModulesMaxDepthIncreased.json index 1350bf6441..bb3234f1db 100644 --- a/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/nodeModulesMaxDepthIncreased.json +++ b/tests/baselines/reference/project/nodeModulesMaxDepthIncreased/node/nodeModulesMaxDepthIncreased.json @@ -10,6 +10,7 @@ "maxDepthIncreased/node_modules/m2/node_modules/m3/index.js", "maxDepthIncreased/node_modules/m2/entry.js", "maxDepthIncreased/node_modules/m1/index.js", + "maxDepthIncreased/node_modules/@types/m4/entry.d.ts", "maxDepthIncreased/root.ts" ], "emittedFiles": [ diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@types/m4/entry.d.ts b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@types/m4/entry.d.ts new file mode 100644 index 0000000000..f0fc245910 --- /dev/null +++ b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@types/m4/entry.d.ts @@ -0,0 +1 @@ +export declare var foo: number; diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@types/m4/package.json b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@types/m4/package.json new file mode 100644 index 0000000000..53ac1558a2 --- /dev/null +++ b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/@types/m4/package.json @@ -0,0 +1,5 @@ +{ + "types": "entry.d.ts", + "name": "m4", + "version": "1.0.0" +} \ No newline at end of file diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/m4/entry.js b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/m4/entry.js new file mode 100644 index 0000000000..a1cb557b18 --- /dev/null +++ b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/m4/entry.js @@ -0,0 +1 @@ +exports.test = "hello, world"; diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/m4/package.json b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/m4/package.json new file mode 100644 index 0000000000..4ae99f312f --- /dev/null +++ b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/node_modules/m4/package.json @@ -0,0 +1,5 @@ +{ + "name": "m4", + "version": "1.0.0", + "main": "entry.js" +} \ No newline at end of file diff --git a/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/root.ts b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/root.ts index 9ed943bebb..5d9f331b24 100644 --- a/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/root.ts +++ b/tests/cases/projects/NodeModulesSearch/maxDepthIncreased/root.ts @@ -1,4 +1,10 @@ import * as m1 from "m1"; +import * as m4 from "m4"; + m1.f1("test"); m1.f2.a = 10; -m1.f2.person.age = "10"; // Error: Should be number + +m1.f2.person.age = "10"; // Should error if loaded the .js files correctly +let r1 = m4.test.charAt(2); // Should error if correctly not using the .js file but using @types info + +let r2 = 3 + m4.foo; // Should be OK if correctly using the @types .d.ts file