From aa8f1e5b6accfa7c9bb80432c82b2c48f2317542 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 14 Aug 2018 15:46:51 -0700 Subject: [PATCH 1/2] Test when module resolution because of path mapping takes to json file Test for #26402 --- ...eWithoutResolveJsonModuleAndPathMapping.js | 14 +++++++++++ ...outResolveJsonModuleAndPathMapping.symbols | 8 +++++++ ...ResolveJsonModuleAndPathMapping.trace.json | 10 ++++++++ ...thoutResolveJsonModuleAndPathMapping.types | 10 ++++++++ ...eWithoutResolveJsonModuleAndPathMapping.ts | 24 +++++++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.js create mode 100644 tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.symbols create mode 100644 tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.trace.json create mode 100644 tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.types create mode 100644 tests/cases/compiler/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.ts diff --git a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.js b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.js new file mode 100644 index 00000000000..c7e1296deb2 --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.js @@ -0,0 +1,14 @@ +//// [tests/cases/compiler/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.ts] //// + +//// [foobar.json] +{ "a": 10 } + +//// [a.ts] +import foobar from "foo/bar/foobar.json"; + + +//// [/bin/node_modules/foo/bar/foobar.json] +{ "a": 10 } +//// [/bin/a.js] +"use strict"; +exports.__esModule = true; diff --git a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.symbols b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.symbols new file mode 100644 index 00000000000..b934b22d66a --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.symbols @@ -0,0 +1,8 @@ +=== /a.ts === +import foobar from "foo/bar/foobar.json"; +>foobar : Symbol(foobar, Decl(a.ts, 0, 6)) + +=== /node_modules/foo/bar/foobar.json === +{ "a": 10 } +>"a" : Symbol("a", Decl(foobar.json, 0, 1)) + diff --git a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.trace.json b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.trace.json new file mode 100644 index 00000000000..ed48ec5baac --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.trace.json @@ -0,0 +1,10 @@ +[ + "======== Resolving module 'foo/bar/foobar.json' from '/a.ts'. ========", + "Module resolution kind is not specified, using 'NodeJs'.", + "'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo/bar/foobar.json'.", + "'paths' option is specified, looking for a pattern to match module name 'foo/bar/foobar.json'.", + "Module name 'foo/bar/foobar.json', matched pattern '*'.", + "Trying substitution 'node_modules/*', candidate module location: 'node_modules/foo/bar/foobar.json'.", + "File '/node_modules/foo/bar/foobar.json' exist - use it as a name resolution result.", + "======== Module name 'foo/bar/foobar.json' was successfully resolved to '/node_modules/foo/bar/foobar.json'. ========" +] \ No newline at end of file diff --git a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.types b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.types new file mode 100644 index 00000000000..129433bbcd6 --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.types @@ -0,0 +1,10 @@ +=== /a.ts === +import foobar from "foo/bar/foobar.json"; +>foobar : { "a": number; } + +=== /node_modules/foo/bar/foobar.json === +{ "a": 10 } +>{ "a": 10 } : { "a": number; } +>"a" : number +>10 : 10 + diff --git a/tests/cases/compiler/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.ts b/tests/cases/compiler/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.ts new file mode 100644 index 00000000000..bd0e1eb16e1 --- /dev/null +++ b/tests/cases/compiler/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.ts @@ -0,0 +1,24 @@ +// @noImplicitReferences: true +// @traceResolution: true +// @allowJs: true +// @esModuleInterop: true +// @fullEmitPaths: true +// @resolveJsonModule: false + +// @Filename: /node_modules/foo/bar/foobar.json +{ "a": 10 } + +// @Filename: /a.ts +import foobar from "foo/bar/foobar.json"; + +// @Filename: /tsconfig.json +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "*": ["node_modules/*", "src/types"] + }, + "allowJs": true, + "outDir": "bin" + } +} From af71d55a49e1f45ceda4517f8ef8aa0c16d91bb3 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 14 Aug 2018 16:10:32 -0700 Subject: [PATCH 2/2] Do not include json file unless --resolveJsonModule is specified Fixes #26402 --- src/compiler/diagnosticMessages.json | 6 ++++- src/compiler/program.ts | 6 ++++- ...ResolveJsonModuleAndPathMapping.errors.txt | 23 +++++++++++++++++++ ...eWithoutResolveJsonModuleAndPathMapping.js | 2 -- ...outResolveJsonModuleAndPathMapping.symbols | 4 ---- ...thoutResolveJsonModuleAndPathMapping.types | 8 +------ 6 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.errors.txt diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 16b064f255c..6000c48de4d 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3941,6 +3941,10 @@ "category": "Error", "code": 7041 }, + "Module '{0}' was resolved to '{1}', but '--resolveJsonModule' is not used.": { + "category": "Error", + "code": 7042 + }, "You cannot rename this element.": { "category": "Error", "code": 8000 @@ -4576,4 +4580,4 @@ "category": "Message", "code": 95066 } -} \ No newline at end of file +} diff --git a/src/compiler/program.ts b/src/compiler/program.ts index e2648907954..d52025f5a30 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -2849,7 +2849,6 @@ namespace ts { switch (extension) { case Extension.Ts: case Extension.Dts: - case Extension.Json: // Since module is resolved to json file only when --resolveJsonModule, we dont need further check // These are always allowed. return undefined; case Extension.Tsx: @@ -2858,6 +2857,8 @@ namespace ts { return needJsx() || needAllowJs(); case Extension.Js: return needAllowJs(); + case Extension.Json: + return needResolveJsonModule(); } function needJsx() { @@ -2866,6 +2867,9 @@ namespace ts { function needAllowJs() { return options.allowJs || !getStrictOptionValue(options, "noImplicitAny") ? undefined : Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type; } + function needResolveJsonModule() { + return options.resolveJsonModule ? undefined : Diagnostics.Module_0_was_resolved_to_1_but_resolveJsonModule_is_not_used; + } } function getModuleNames({ imports, moduleAugmentations }: SourceFile): string[] { diff --git a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.errors.txt b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.errors.txt new file mode 100644 index 00000000000..fee86f2174c --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.errors.txt @@ -0,0 +1,23 @@ +/a.ts(1,20): error TS7042: Module 'foo/bar/foobar.json' was resolved to '/node_modules/foo/bar/foobar.json', but '--resolveJsonModule' is not used. + + +==== /tsconfig.json (0 errors) ==== + { + "compilerOptions": { + "baseUrl": ".", + "paths": { + "*": ["node_modules/*", "src/types"] + }, + "allowJs": true, + "outDir": "bin" + } + } + +==== /a.ts (1 errors) ==== + import foobar from "foo/bar/foobar.json"; + ~~~~~~~~~~~~~~~~~~~~~ +!!! error TS7042: Module 'foo/bar/foobar.json' was resolved to '/node_modules/foo/bar/foobar.json', but '--resolveJsonModule' is not used. + +==== /node_modules/foo/bar/foobar.json (0 errors) ==== + { "a": 10 } + \ No newline at end of file diff --git a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.js b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.js index c7e1296deb2..bda2f7194d3 100644 --- a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.js +++ b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.js @@ -7,8 +7,6 @@ import foobar from "foo/bar/foobar.json"; -//// [/bin/node_modules/foo/bar/foobar.json] -{ "a": 10 } //// [/bin/a.js] "use strict"; exports.__esModule = true; diff --git a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.symbols b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.symbols index b934b22d66a..9cc71ea6e59 100644 --- a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.symbols +++ b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.symbols @@ -2,7 +2,3 @@ import foobar from "foo/bar/foobar.json"; >foobar : Symbol(foobar, Decl(a.ts, 0, 6)) -=== /node_modules/foo/bar/foobar.json === -{ "a": 10 } ->"a" : Symbol("a", Decl(foobar.json, 0, 1)) - diff --git a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.types b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.types index 129433bbcd6..23981045b3c 100644 --- a/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.types +++ b/tests/baselines/reference/requireOfJsonFileWithoutResolveJsonModuleAndPathMapping.types @@ -1,10 +1,4 @@ === /a.ts === import foobar from "foo/bar/foobar.json"; ->foobar : { "a": number; } - -=== /node_modules/foo/bar/foobar.json === -{ "a": 10 } ->{ "a": 10 } : { "a": number; } ->"a" : number ->10 : 10 +>foobar : any