diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index bb7f8d013fc..3a715e5acb9 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2084,7 +2084,7 @@ namespace ts { } // May be an untyped module. If so, ignore resolutionDiagnostic. - if (resolvedModule && !extensionIsTypeScript(resolvedModule.extension) && resolutionDiagnostic === undefined || resolutionDiagnostic === Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type) { + if (resolvedModule && !resolutionExtensionIsTypeScriptOrJson(resolvedModule.extension) && resolutionDiagnostic === undefined || resolutionDiagnostic === Diagnostics.Could_not_find_a_declaration_file_for_module_0_1_implicitly_has_an_any_type) { if (isForAugmentation) { const diag = Diagnostics.Invalid_module_name_in_augmentation_Module_0_resolves_to_an_untyped_module_at_1_which_cannot_be_augmented; error(errorNode, diag, moduleReference, resolvedModule.resolvedFileName); diff --git a/src/compiler/core.ts b/src/compiler/core.ts index ecf667237c5..00a28dbbbcd 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -2758,7 +2758,7 @@ namespace ts { } } - const extensionsToRemove = [Extension.Dts, Extension.Ts, Extension.Js, Extension.Tsx, Extension.Jsx]; + const extensionsToRemove = [Extension.Dts, Extension.Ts, Extension.Js, Extension.Tsx, Extension.Jsx, Extension.Json]; export function removeFileExtension(path: string): string { for (const ext of extensionsToRemove) { const extensionless = tryRemoveExtension(path, ext); @@ -3091,6 +3091,10 @@ namespace ts { return ext === Extension.Ts || ext === Extension.Tsx || ext === Extension.Dts; } + export function resolutionExtensionIsTypeScriptOrJson(ext: Extension) { + return extensionIsTypeScript(ext) || ext === Extension.Json; + } + /** * Gets the extension from a path. * Path must have a valid extension. diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 50181bb98e4..30f310cac10 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -48,6 +48,7 @@ namespace ts { enum Extensions { TypeScript, /** '.ts', '.tsx', or '.d.ts' */ JavaScript, /** '.js' or '.jsx' */ + Json, /** '.json' */ DtsOnly /** Only '.d.ts' */ } @@ -730,7 +731,7 @@ namespace ts { const failedLookupLocations: string[] = []; const state: ModuleResolutionState = { compilerOptions, host, traceEnabled }; - const result = jsOnly ? tryResolve(Extensions.JavaScript) : (tryResolve(Extensions.TypeScript) || tryResolve(Extensions.JavaScript)); + const result = (jsOnly ? tryResolve(Extensions.JavaScript) : (tryResolve(Extensions.TypeScript) || tryResolve(Extensions.JavaScript))) || tryResolve(Extensions.Json); if (result && result.value) { const { resolved, originalPath, isExternalLibraryImport } = result.value; return createResolvedModuleWithFailedLookupLocations(resolved, originalPath, isExternalLibraryImport, failedLookupLocations); @@ -889,7 +890,7 @@ namespace ts { // If that didn't work, try stripping a ".js" or ".jsx" extension and replacing it with a TypeScript one; // e.g. "./foo.js" can be matched by "./foo.ts" or "./foo.d.ts" - if (hasJavaScriptFileExtension(candidate)) { + if (hasJavaScriptFileExtension(candidate) || fileExtensionIs(candidate, Extension.Json)) { const extensionless = removeFileExtension(candidate); if (state.traceEnabled) { const extension = candidate.substring(extensionless.length); @@ -916,6 +917,8 @@ namespace ts { return tryExtension(Extension.Ts) || tryExtension(Extension.Tsx) || tryExtension(Extension.Dts); case Extensions.JavaScript: return tryExtension(Extension.Js) || tryExtension(Extension.Jsx); + case Extensions.Json: + return tryExtension(Extension.Json); } function tryExtension(ext: Extension): PathAndExtension | undefined { @@ -1013,7 +1016,7 @@ namespace ts { } function loadModuleFromPackageJson(jsonContent: PackageJsonPathFields, extensions: Extensions, candidate: string, failedLookupLocations: Push, state: ModuleResolutionState): PathAndExtension | undefined { - const file = tryReadPackageJsonFields(extensions !== Extensions.JavaScript, jsonContent, candidate, state); + const file = tryReadPackageJsonFields(extensions !== Extensions.JavaScript && extensions !== Extensions.Json, jsonContent, candidate, state); if (!file) { return undefined; } @@ -1052,6 +1055,8 @@ namespace ts { switch (extensions) { case Extensions.JavaScript: return extension === Extension.Js || extension === Extension.Jsx; + case Extensions.Json: + return extension === Extension.Json; case Extensions.TypeScript: return extension === Extension.Ts || extension === Extension.Tsx || extension === Extension.Dts; case Extensions.DtsOnly: @@ -1127,7 +1132,7 @@ namespace ts { if (packageResult) { return packageResult; } - if (extensions !== Extensions.JavaScript) { + if (extensions !== Extensions.JavaScript && extensions !== Extensions.Json) { const nodeModulesAtTypes = combinePaths(nodeModulesFolder, "@types"); let nodeModulesAtTypesExists = nodeModulesFolderExists; if (nodeModulesFolderExists && !directoryProbablyExists(nodeModulesAtTypes, state.host)) { diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 70ddb7b791d..813a77d71a6 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -260,6 +260,7 @@ namespace ts { return visitNodes(cbNode, cbNodes, (node).statements); case SyntaxKind.SourceFile: return visitNodes(cbNode, cbNodes, (node).statements) || + visitNode(cbNode, (node).jsonObject) || visitNode(cbNode, (node).endOfFileToken); case SyntaxKind.VariableStatement: return visitNodes(cbNode, cbNodes, node.decorators) || @@ -660,6 +661,13 @@ namespace ts { export function parseSourceFile(fileName: string, sourceText: string, languageVersion: ScriptTarget, syntaxCursor: IncrementalParser.SyntaxCursor, setParentNodes?: boolean, scriptKind?: ScriptKind): SourceFile { scriptKind = ensureScriptKind(fileName, scriptKind); + if (scriptKind === ScriptKind.JSON) { + const result = parseJsonText(fileName, sourceText, languageVersion, syntaxCursor, setParentNodes); + result.statements = emptyArray; + result.typeReferenceDirectives = emptyArray; + result.amdDependencies = emptyArray; + return result; + } initializeState(sourceText, languageVersion, syntaxCursor, scriptKind); @@ -681,8 +689,8 @@ namespace ts { return isInvalid ? entityName : undefined; } - export function parseJsonText(fileName: string, sourceText: string): JsonSourceFile { - initializeState(sourceText, ScriptTarget.ES2015, /*syntaxCursor*/ undefined, ScriptKind.JSON); + export function parseJsonText(fileName: string, sourceText: string, languageVersion: ScriptTarget = ScriptTarget.ES2015, syntaxCursor?: IncrementalParser.SyntaxCursor, setParentNodes?: boolean): JsonSourceFile { + initializeState(sourceText, languageVersion, syntaxCursor, ScriptKind.JSON); // Set source file so that errors will be reported with this file name sourceFile = createSourceFile(fileName, ScriptTarget.ES2015, ScriptKind.JSON, /*isDeclaration*/ false); const result = sourceFile; @@ -701,6 +709,10 @@ namespace ts { parseExpected(SyntaxKind.OpenBraceToken); } + if (setParentNodes) { + fixupParentReferences(sourceFile); + } + sourceFile.parseDiagnostics = parseDiagnostics; clearState(); return result; diff --git a/src/compiler/program.ts b/src/compiler/program.ts old mode 100755 new mode 100644 index 1ce672a6a75..0f2cb34ec21 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1975,7 +1975,7 @@ namespace ts { } const isFromNodeModulesSearch = resolution.isExternalLibraryImport; - const isJsFile = !extensionIsTypeScript(resolution.extension); + const isJsFile = !resolutionExtensionIsTypeScriptOrJson(resolution.extension); const isJsFileFromNodeModules = isFromNodeModulesSearch && isJsFile; const resolvedFileName = resolution.resolvedFileName; @@ -2404,6 +2404,7 @@ namespace ts { switch (extension) { case Extension.Ts: case Extension.Dts: + case Extension.Json: // These are always allowed. return undefined; case Extension.Tsx: diff --git a/src/harness/harness.ts b/src/harness/harness.ts index d3bd537ad4c..9fa0ce6087e 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1207,7 +1207,7 @@ namespace Harness { } - const programFileNames = programFiles.map(file => file.unitName); + const programFileNames = programFiles.map(file => file.unitName).filter(fileName => !ts.fileExtensionIs(fileName, ts.Extension.Json)); const compilerHost = createCompilerHost( programFiles.concat(otherFiles), diff --git a/src/harness/unittests/reuseProgramStructure.ts b/src/harness/unittests/reuseProgramStructure.ts index 70325831f51..c43fe2f5528 100644 --- a/src/harness/unittests/reuseProgramStructure.ts +++ b/src/harness/unittests/reuseProgramStructure.ts @@ -471,6 +471,10 @@ namespace ts { "File 'node_modules/a.jsx' does not exist.", "File 'node_modules/a/index.js' does not exist.", "File 'node_modules/a/index.jsx' does not exist.", + "Loading module 'a' from 'node_modules' folder, target file type 'Json'.", + "File 'node_modules/a/package.json' does not exist.", + "File 'node_modules/a.json' does not exist.", + "File 'node_modules/a/index.json' does not exist.", "======== Module name 'a' was not resolved. ========" ], "initialProgram: execute module resolution normally."); diff --git a/src/harness/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts index e09dff2a6d5..517896ca8ca 100644 --- a/src/harness/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -3221,6 +3221,10 @@ namespace ts.projectSystem { "Directory '/a/b/node_modules' does not exist, skipping all lookups in it.", "Directory '/a/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules' does not exist, skipping all lookups in it.", + "Loading module 'lib' from 'node_modules' folder, target file type 'Json'.", + "Directory '/a/b/node_modules' does not exist, skipping all lookups in it.", + "Directory '/a/node_modules' does not exist, skipping all lookups in it.", + "Directory '/node_modules' does not exist, skipping all lookups in it.", "======== Module name 'lib' was not resolved. ========", `Auto discovery for typings is enabled in project '${proj.getProjectName()}'. Running extra resolution pass for module 'lib' using cache location '/a/cache'.`, "File '/a/cache/node_modules/lib.d.ts' does not exist.", diff --git a/tests/baselines/reference/cachedModuleResolution6.trace.json b/tests/baselines/reference/cachedModuleResolution6.trace.json index 50c1c15b3e1..efb20f4ddc1 100644 --- a/tests/baselines/reference/cachedModuleResolution6.trace.json +++ b/tests/baselines/reference/cachedModuleResolution6.trace.json @@ -15,6 +15,13 @@ "Directory '/a/b/node_modules' does not exist, skipping all lookups in it.", "Directory '/a/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules' does not exist, skipping all lookups in it.", + "Loading module 'foo' from 'node_modules' folder, target file type 'Json'.", + "Directory '/a/b/c/d/e/node_modules' does not exist, skipping all lookups in it.", + "Directory '/a/b/c/d/node_modules' does not exist, skipping all lookups in it.", + "Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.", + "Directory '/a/b/node_modules' does not exist, skipping all lookups in it.", + "Directory '/a/node_modules' does not exist, skipping all lookups in it.", + "Directory '/node_modules' does not exist, skipping all lookups in it.", "======== Module name 'foo' was not resolved. ========", "======== Resolving module 'foo' from '/a/b/c/lib.ts'. ========", "Explicitly specified module resolution kind: 'NodeJs'.", diff --git a/tests/baselines/reference/cachedModuleResolution7.trace.json b/tests/baselines/reference/cachedModuleResolution7.trace.json index fa1db9d115e..74c57e04250 100644 --- a/tests/baselines/reference/cachedModuleResolution7.trace.json +++ b/tests/baselines/reference/cachedModuleResolution7.trace.json @@ -11,6 +11,11 @@ "Directory '/a/b/node_modules' does not exist, skipping all lookups in it.", "Directory '/a/node_modules' does not exist, skipping all lookups in it.", "Directory '/node_modules' does not exist, skipping all lookups in it.", + "Loading module 'foo' from 'node_modules' folder, target file type 'Json'.", + "Directory '/a/b/c/node_modules' does not exist, skipping all lookups in it.", + "Directory '/a/b/node_modules' does not exist, skipping all lookups in it.", + "Directory '/a/node_modules' does not exist, skipping all lookups in it.", + "Directory '/node_modules' does not exist, skipping all lookups in it.", "======== Module name 'foo' was not resolved. ========", "======== Resolving module 'foo' from '/a/b/c/d/e/app.ts'. ========", "Explicitly specified module resolution kind: 'NodeJs'.", diff --git a/tests/baselines/reference/importWithTrailingSlash_noResolve.trace.json b/tests/baselines/reference/importWithTrailingSlash_noResolve.trace.json index 1ee467c3789..0f66680ea44 100644 --- a/tests/baselines/reference/importWithTrailingSlash_noResolve.trace.json +++ b/tests/baselines/reference/importWithTrailingSlash_noResolve.trace.json @@ -5,5 +5,7 @@ "Directory '/foo/' does not exist, skipping all lookups in it.", "Loading module as file / folder, candidate module location '/foo/', target file type 'JavaScript'.", "Directory '/foo/' does not exist, skipping all lookups in it.", + "Loading module as file / folder, candidate module location '/foo/', target file type 'Json'.", + "Directory '/foo/' does not exist, skipping all lookups in it.", "======== Module name './foo/' was not resolved. ========" ] \ No newline at end of file diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_unexpected.trace.json b/tests/baselines/reference/moduleResolutionWithExtensions_unexpected.trace.json index 5f32a4bf511..f2cbd45826d 100644 --- a/tests/baselines/reference/moduleResolutionWithExtensions_unexpected.trace.json +++ b/tests/baselines/reference/moduleResolutionWithExtensions_unexpected.trace.json @@ -31,5 +31,18 @@ "Directory '/node_modules/normalize.css/normalize.css' does not exist, skipping all lookups in it.", "File '/node_modules/normalize.css/index.js' does not exist.", "File '/node_modules/normalize.css/index.jsx' does not exist.", + "Loading module 'normalize.css' from 'node_modules' folder, target file type 'Json'.", + "'package.json' does not have a 'typings' field.", + "'package.json' does not have a 'types' field.", + "'package.json' has 'main' field 'normalize.css' that references '/node_modules/normalize.css/normalize.css'.", + "Found 'package.json' at '/node_modules/normalize.css/package.json'.", + "File '/node_modules/normalize.css.json' does not exist.", + "'package.json' has 'main' field 'normalize.css' that references '/node_modules/normalize.css/normalize.css'.", + "File '/node_modules/normalize.css/normalize.css' exist - use it as a name resolution result.", + "File '/node_modules/normalize.css/normalize.css' has an unsupported extension, so skipping it.", + "Loading module as file / folder, candidate module location '/node_modules/normalize.css/normalize.css', target file type 'Json'.", + "File '/node_modules/normalize.css/normalize.css.json' does not exist.", + "Directory '/node_modules/normalize.css/normalize.css' does not exist, skipping all lookups in it.", + "File '/node_modules/normalize.css/index.json' does not exist.", "======== Module name 'normalize.css' was not resolved. ========" ] \ No newline at end of file diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_unexpected2.trace.json b/tests/baselines/reference/moduleResolutionWithExtensions_unexpected2.trace.json index bab6be18d39..3dd0a7861e3 100644 --- a/tests/baselines/reference/moduleResolutionWithExtensions_unexpected2.trace.json +++ b/tests/baselines/reference/moduleResolutionWithExtensions_unexpected2.trace.json @@ -34,5 +34,12 @@ "'package.json' does not have a 'main' field.", "File '/node_modules/foo/index.js' does not exist.", "File '/node_modules/foo/index.jsx' does not exist.", + "Loading module 'foo' from 'node_modules' folder, target file type 'Json'.", + "'package.json' does not have a 'typings' field.", + "'package.json' has 'types' field 'foo.js' that references '/node_modules/foo/foo.js'.", + "Found 'package.json' at '/node_modules/foo/package.json'.", + "File '/node_modules/foo.json' does not exist.", + "'package.json' does not have a 'main' field.", + "File '/node_modules/foo/index.json' does not exist.", "======== Module name 'foo' was not resolved. ========" ] \ No newline at end of file diff --git a/tests/baselines/reference/packageJsonMain_isNonRecursive.trace.json b/tests/baselines/reference/packageJsonMain_isNonRecursive.trace.json index 81f5be11a6d..653f224b43a 100644 --- a/tests/baselines/reference/packageJsonMain_isNonRecursive.trace.json +++ b/tests/baselines/reference/packageJsonMain_isNonRecursive.trace.json @@ -31,5 +31,17 @@ "File '/node_modules/foo/oof/index.jsx' does not exist.", "File '/node_modules/foo/index.js' does not exist.", "File '/node_modules/foo/index.jsx' does not exist.", + "Loading module 'foo' from 'node_modules' folder, target file type 'Json'.", + "'package.json' does not have a 'typings' field.", + "'package.json' does not have a 'types' field.", + "'package.json' has 'main' field 'oof' that references '/node_modules/foo/oof'.", + "Found 'package.json' at '/node_modules/foo/package.json'.", + "File '/node_modules/foo.json' does not exist.", + "'package.json' has 'main' field 'oof' that references '/node_modules/foo/oof'.", + "File '/node_modules/foo/oof' does not exist.", + "Loading module as file / folder, candidate module location '/node_modules/foo/oof', target file type 'Json'.", + "File '/node_modules/foo/oof.json' does not exist.", + "File '/node_modules/foo/oof/index.json' does not exist.", + "File '/node_modules/foo/index.json' does not exist.", "======== Module name 'foo' was not resolved. ========" ] \ No newline at end of file diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution_withExtension_failedLookup.trace.json b/tests/baselines/reference/pathMappingBasedModuleResolution_withExtension_failedLookup.trace.json index 803520f12fd..aa3489d9fe1 100644 --- a/tests/baselines/reference/pathMappingBasedModuleResolution_withExtension_failedLookup.trace.json +++ b/tests/baselines/reference/pathMappingBasedModuleResolution_withExtension_failedLookup.trace.json @@ -17,5 +17,13 @@ "Loading module as file / folder, candidate module location '/foo/foo.ts', target file type 'JavaScript'.", "Loading module 'foo' from 'node_modules' folder, target file type 'JavaScript'.", "Directory '/node_modules' does not exist, skipping all lookups in it.", + "'baseUrl' option is set to '/', using this value to resolve non-relative module name 'foo'.", + "'paths' option is specified, looking for a pattern to match module name 'foo'.", + "Module name 'foo', matched pattern 'foo'.", + "Trying substitution 'foo/foo.ts', candidate module location: 'foo/foo.ts'.", + "File '/foo/foo.ts' does not exist.", + "Loading module as file / folder, candidate module location '/foo/foo.ts', target file type 'Json'.", + "Loading module 'foo' from 'node_modules' folder, target file type 'Json'.", + "Directory '/node_modules' does not exist, skipping all lookups in it.", "======== Module name 'foo' was not resolved. ========" ] \ No newline at end of file diff --git a/tests/baselines/reference/requireOfJsonFile.errors.txt b/tests/baselines/reference/requireOfJsonFile.errors.txt new file mode 100644 index 00000000000..9e123980308 --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFile.errors.txt @@ -0,0 +1,22 @@ +tests/cases/compiler/file1.ts(1,21): error TS2306: File 'tests/cases/compiler/b.json' is not a module. +tests/cases/compiler/file1.ts(3,21): error TS2306: File 'tests/cases/compiler/b.json' is not a module. + + +==== tests/cases/compiler/file1.ts (2 errors) ==== + import b1 = require('./b'); + ~~~~~ +!!! error TS2306: File 'tests/cases/compiler/b.json' is not a module. + let x = b1.a; + import b2 = require('./b.json'); + ~~~~~~~~~~ +!!! error TS2306: File 'tests/cases/compiler/b.json' is not a module. + if (x) { + let b = b2.b; + x = (b1.b === b); + } + +==== tests/cases/compiler/b.json (0 errors) ==== + { + "a": true, + "b": "hello" + } \ No newline at end of file diff --git a/tests/baselines/reference/requireOfJsonFile.js b/tests/baselines/reference/requireOfJsonFile.js new file mode 100644 index 00000000000..b3b37406830 --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFile.js @@ -0,0 +1,28 @@ +//// [tests/cases/compiler/requireOfJsonFile.ts] //// + +//// [file1.ts] +import b1 = require('./b'); +let x = b1.a; +import b2 = require('./b.json'); +if (x) { + let b = b2.b; + x = (b1.b === b); +} + +//// [b.json] +{ + "a": true, + "b": "hello" +} + +//// [b.js] +//// [file1.js] +"use strict"; +exports.__esModule = true; +var b1 = require("./b"); +var x = b1.a; +var b2 = require("./b.json"); +if (x) { + var b = b2.b; + x = (b1.b === b); +} diff --git a/tests/baselines/reference/requireOfJsonFile.symbols b/tests/baselines/reference/requireOfJsonFile.symbols new file mode 100644 index 00000000000..cdf69b0e4bc --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFile.symbols @@ -0,0 +1,32 @@ +=== tests/cases/compiler/file1.ts === +import b1 = require('./b'); +>b1 : Symbol(b1, Decl(file1.ts, 0, 0)) + +let x = b1.a; +>x : Symbol(x, Decl(file1.ts, 1, 3)) +>b1 : Symbol(b1, Decl(file1.ts, 0, 0)) + +import b2 = require('./b.json'); +>b2 : Symbol(b2, Decl(file1.ts, 1, 13)) + +if (x) { +>x : Symbol(x, Decl(file1.ts, 1, 3)) + + let b = b2.b; +>b : Symbol(b, Decl(file1.ts, 4, 7)) +>b2 : Symbol(b2, Decl(file1.ts, 1, 13)) + + x = (b1.b === b); +>x : Symbol(x, Decl(file1.ts, 1, 3)) +>b1 : Symbol(b1, Decl(file1.ts, 0, 0)) +>b : Symbol(b, Decl(file1.ts, 4, 7)) +} + +=== tests/cases/compiler/b.json === +{ + "a": true, +>"a" : Symbol("a", Decl(b.json, 0, 1)) + + "b": "hello" +>"b" : Symbol("b", Decl(b.json, 1, 14)) +} diff --git a/tests/baselines/reference/requireOfJsonFile.types b/tests/baselines/reference/requireOfJsonFile.types new file mode 100644 index 00000000000..01f84ffc0ac --- /dev/null +++ b/tests/baselines/reference/requireOfJsonFile.types @@ -0,0 +1,45 @@ +=== tests/cases/compiler/file1.ts === +import b1 = require('./b'); +>b1 : any + +let x = b1.a; +>x : any +>b1.a : any +>b1 : any +>a : any + +import b2 = require('./b.json'); +>b2 : any + +if (x) { +>x : any + + let b = b2.b; +>b : any +>b2.b : any +>b2 : any +>b : any + + x = (b1.b === b); +>x = (b1.b === b) : boolean +>x : any +>(b1.b === b) : boolean +>b1.b === b : boolean +>b1.b : any +>b1 : any +>b : any +>b : any +} + +=== tests/cases/compiler/b.json === +{ +>{ "a": true, "b": "hello"} : { [x: string]: any; "a": boolean; "b": string; } + + "a": true, +>"a" : boolean +>true : true + + "b": "hello" +>"b" : string +>"hello" : "hello" +} diff --git a/tests/baselines/reference/typeRootsFromMultipleNodeModulesDirectories.trace.json b/tests/baselines/reference/typeRootsFromMultipleNodeModulesDirectories.trace.json index fdcbcdb7ab1..bee93e5be25 100644 --- a/tests/baselines/reference/typeRootsFromMultipleNodeModulesDirectories.trace.json +++ b/tests/baselines/reference/typeRootsFromMultipleNodeModulesDirectories.trace.json @@ -17,6 +17,10 @@ "File '/foo/node_modules/xyz.jsx' does not exist.", "File '/node_modules/xyz.js' does not exist.", "File '/node_modules/xyz.jsx' does not exist.", + "Loading module 'xyz' from 'node_modules' folder, target file type 'Json'.", + "Directory '/foo/bar/node_modules' does not exist, skipping all lookups in it.", + "File '/foo/node_modules/xyz.json' does not exist.", + "File '/node_modules/xyz.json' does not exist.", "======== Module name 'xyz' was not resolved. ========", "======== Resolving module 'pdq' from '/foo/bar/a.ts'. ========", "Module resolution kind is not specified, using 'NodeJs'.", @@ -36,6 +40,10 @@ "File '/foo/node_modules/pdq.jsx' does not exist.", "File '/node_modules/pdq.js' does not exist.", "File '/node_modules/pdq.jsx' does not exist.", + "Loading module 'pdq' from 'node_modules' folder, target file type 'Json'.", + "Directory '/foo/bar/node_modules' does not exist, skipping all lookups in it.", + "File '/foo/node_modules/pdq.json' does not exist.", + "File '/node_modules/pdq.json' does not exist.", "======== Module name 'pdq' was not resolved. ========", "======== Resolving module 'abc' from '/foo/bar/a.ts'. ========", "Module resolution kind is not specified, using 'NodeJs'.", @@ -55,6 +63,10 @@ "File '/foo/node_modules/abc.jsx' does not exist.", "File '/node_modules/abc.js' does not exist.", "File '/node_modules/abc.jsx' does not exist.", + "Loading module 'abc' from 'node_modules' folder, target file type 'Json'.", + "Directory '/foo/bar/node_modules' does not exist, skipping all lookups in it.", + "File '/foo/node_modules/abc.json' does not exist.", + "File '/node_modules/abc.json' does not exist.", "======== Module name 'abc' was not resolved. ========", "======== Resolving type reference directive 'grumpy', containing file '/foo/bar/__inferred type names__.ts', root directory '/foo/node_modules/@types,/node_modules/@types'. ========", "Resolving with primary search path '/foo/node_modules/@types, /node_modules/@types'.", diff --git a/tests/baselines/reference/typeRootsFromNodeModulesInParentDirectory.trace.json b/tests/baselines/reference/typeRootsFromNodeModulesInParentDirectory.trace.json index a15e20239c6..95fdca59f94 100644 --- a/tests/baselines/reference/typeRootsFromNodeModulesInParentDirectory.trace.json +++ b/tests/baselines/reference/typeRootsFromNodeModulesInParentDirectory.trace.json @@ -11,6 +11,9 @@ "Directory '/src/node_modules' does not exist, skipping all lookups in it.", "File '/node_modules/xyz.js' does not exist.", "File '/node_modules/xyz.jsx' does not exist.", + "Loading module 'xyz' from 'node_modules' folder, target file type 'Json'.", + "Directory '/src/node_modules' does not exist, skipping all lookups in it.", + "File '/node_modules/xyz.json' does not exist.", "======== Module name 'xyz' was not resolved. ========", "======== Resolving type reference directive 'foo', containing file '/src/__inferred type names__.ts', root directory '/node_modules/@types'. ========", "Resolving with primary search path '/node_modules/@types'.", diff --git a/tests/cases/compiler/requireOfJsonFile.ts b/tests/cases/compiler/requireOfJsonFile.ts new file mode 100644 index 00000000000..7295dac0179 --- /dev/null +++ b/tests/cases/compiler/requireOfJsonFile.ts @@ -0,0 +1,16 @@ +// @module: commonjs + +// @Filename: file1.ts +import b1 = require('./b'); +let x = b1.a; +import b2 = require('./b.json'); +if (x) { + let b = b2.b; + x = (b1.b === b); +} + +// @Filename: b.json +{ + "a": true, + "b": "hello" +} \ No newline at end of file