diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3c98513423af2..20cd214eed1eb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1342,8 +1342,8 @@ namespace ts { return (symbol.flags & meaning) || dontResolveAlias ? symbol : resolveAlias(symbol); } - function resolveExternalModuleName(location: Node, moduleReferenceExpression: Expression): Symbol { - return resolveExternalModuleNameWorker(location, moduleReferenceExpression, Diagnostics.Cannot_find_module_0); + function resolveExternalModuleName(location: Node, moduleReferenceExpression: Expression, reportModuleNotFoundError = true): Symbol { + return resolveExternalModuleNameWorker(location, moduleReferenceExpression, reportModuleNotFoundError ? Diagnostics.Cannot_find_module_0 : undefined); } function resolveExternalModuleNameWorker(location: Node, moduleReferenceExpression: Expression, moduleNotFoundError: DiagnosticMessage): Symbol { @@ -4881,11 +4881,17 @@ namespace ts { } function resolveExternalModuleTypeByLiteral(name: StringLiteral) { - const moduleSym = resolveExternalModuleName(name, name); + const nameIsInJavaScriptFile = isInJavaScriptFile(name); + const moduleSym = resolveExternalModuleName(name, name, /*reportModuleNotFoundError*/ nameIsInJavaScriptFile); if (moduleSym) { - const resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym); - if (resolvedModuleSymbol) { - return getTypeOfSymbol(resolvedModuleSymbol); + const sourceFile = getDeclarationOfKind(moduleSym, SyntaxKind.SourceFile) as SourceFile; + const resolvedFileIsJSON = sourceFile && getScriptKindFromFileName(sourceFile.fileName) === ScriptKind.JSON; + // Treated as external module import if it is in JavaScript file or when JSON is "required" + if (nameIsInJavaScriptFile || resolvedFileIsJSON) { + const resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym); + if (resolvedModuleSymbol) { + return getTypeOfSymbol(resolvedModuleSymbol); + } } } @@ -12824,8 +12830,8 @@ namespace ts { } } - // In JavaScript files, calls to any identifier 'require' are treated as external module imports - if (isInJavaScriptFile(node) && isCommonJsRequire(node)) { + // Calls to commonjs 'require' are treated as external module imports in JavaScript files or when JSON is "required" + if (isCommonJsRequire(node)) { return resolveExternalModuleTypeByLiteral(node.arguments[0]); } @@ -18793,7 +18799,7 @@ namespace ts { (node.parent).moduleSpecifier === node)) { return resolveExternalModuleName(node, node); } - if (isInJavaScriptFile(node) && isRequireCall(node.parent, /*checkArgumentIsStringLiteral*/ false)) { + if (isCommonJsRequire(node.parent)) { return resolveExternalModuleName(node, node); } // Fall through diff --git a/src/compiler/core.ts b/src/compiler/core.ts index d8f8cff42a259..c787e179c601c 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1793,6 +1793,8 @@ namespace ts { return ScriptKind.TS; case ".tsx": return ScriptKind.TSX; + case ".json": + return ScriptKind.JSON; default: return ScriptKind.Unknown; } @@ -1806,6 +1808,7 @@ namespace ts { export const supportedTypescriptExtensionsForExtractExtension = [".d.ts", ".ts", ".tsx"]; export const supportedJavascriptExtensions = [".js", ".jsx"]; const allSupportedExtensions = supportedTypeScriptExtensions.concat(supportedJavascriptExtensions); + export const supportedTypeScriptAndJsonExtensions = supportedTypeScriptExtensions.concat([".json"]); export function getSupportedExtensions(options?: CompilerOptions): string[] { return options && options.allowJs ? allSupportedExtensions : supportedTypeScriptExtensions; diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 3fa54f127e1e6..9d96bd3d887d5 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -514,7 +514,8 @@ namespace ts { export function nodeModuleNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { const containingDirectory = getDirectoryPath(containingFile); - const supportedExtensions = getSupportedExtensions(compilerOptions); + const isCommonJS = getEmitModuleKind(compilerOptions) === ModuleKind.CommonJS; + const supportedExtensions = getSupportedExtensions(compilerOptions).concat(isCommonJS ? [".json"] : []); const traceEnabled = isTraceEnabled(compilerOptions, host); const failedLookupLocations: string[] = []; diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index a5b02f98fd382..b15c01b1fd494 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -636,7 +636,17 @@ namespace ts { nextToken(); processReferenceComments(sourceFile); - sourceFile.statements = parseList(ParsingContext.SourceElements, parseStatement); + if (scriptKind === ScriptKind.JSON) { + const exportAssignment = createNode(SyntaxKind.ExportAssignment); + const json = parseObjectLiteralExpression(); + exportAssignment.expression = json; + exportAssignment.isExportEquals = true; + finishNode(exportAssignment); + sourceFile.statements = >[exportAssignment]; + } + else { + sourceFile.statements = parseList(ParsingContext.SourceElements, parseStatement); + } Debug.assert(token() === SyntaxKind.EndOfFileToken); sourceFile.endOfFileToken = parseTokenNode(); diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 25e85d13dc9a8..fa73d0000dc96 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -583,7 +583,7 @@ namespace ts { getNewLine: () => host.getNewLine(), getSourceFile: program.getSourceFile, getSourceFileByPath: program.getSourceFileByPath, - getSourceFiles: program.getSourceFiles, + getSourceFiles: () => filter(program.getSourceFiles(), sourceFile => sourceFile.scriptKind !== ScriptKind.JSON), isSourceFileFromExternalLibrary: (file: SourceFile) => !!sourceFilesFoundSearchingNodeModules[file.path], writeFile: writeFileCallback || ( (fileName, data, writeByteOrderMark, onError, sourceFiles) => host.writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles)), @@ -984,6 +984,7 @@ namespace ts { const isJavaScriptFile = isSourceFileJavaScript(file); const isExternalModuleFile = isExternalModule(file); + const isCommonJS = getEmitModuleKind(options) === ModuleKind.CommonJS; let imports: LiteralExpression[]; let moduleAugmentations: LiteralExpression[]; @@ -1001,7 +1002,7 @@ namespace ts { for (const node of file.statements) { collectModuleReferences(node, /*inAmbientModule*/ false); - if (isJavaScriptFile) { + if (isJavaScriptFile || isCommonJS) { collectRequireCalls(node); } } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index e6c13235c9b8a..a61c7b54cd209 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3077,7 +3077,8 @@ namespace ts { JS = 1, JSX = 2, TS = 3, - TSX = 4 + TSX = 4, + JSON = 5 } export const enum ScriptTarget { diff --git a/src/harness/unittests/moduleResolution.ts b/src/harness/unittests/moduleResolution.ts index b71d42265e3be..26b503e693b9b 100644 --- a/src/harness/unittests/moduleResolution.ts +++ b/src/harness/unittests/moduleResolution.ts @@ -100,7 +100,7 @@ namespace ts { assert.equal(resolution.resolvedModule.resolvedFileName, moduleFile.name); assert.equal(!!resolution.resolvedModule.isExternalLibraryImport, false); // expect three failed lookup location - attempt to load module as file with all supported extensions - assert.equal(resolution.failedLookupLocations.length, supportedTypeScriptExtensions.length); + assert.equal(resolution.failedLookupLocations.length, supportedTypeScriptAndJsonExtensions.length); } } @@ -154,6 +154,7 @@ namespace ts { "/a/b/foo.ts", "/a/b/foo.tsx", "/a/b/foo.d.ts", + "/a/b/foo.json", "/a/b/foo/index.ts", "/a/b/foo/index.tsx", ]); @@ -589,10 +590,12 @@ import b = require("./moduleB"); "/root/folder1/file2.ts", "/root/folder1/file2.tsx", "/root/folder1/file2.d.ts", + "/root/folder1/file2.json", "/root/folder1/file2/package.json", "/root/folder1/file2/index.ts", "/root/folder1/file2/index.tsx", - "/root/folder1/file2/index.d.ts" + "/root/folder1/file2/index.d.ts", + "/root/folder1/file2/index.json" // then first attempt on 'generated/*' was successful ]); check("folder2/file3", file3, [ @@ -600,14 +603,17 @@ import b = require("./moduleB"); "/root/folder2/file3.ts", "/root/folder2/file3.tsx", "/root/folder2/file3.d.ts", + "/root/folder2/file3.json", "/root/folder2/file3/package.json", "/root/folder2/file3/index.ts", "/root/folder2/file3/index.tsx", "/root/folder2/file3/index.d.ts", + "/root/folder2/file3/index.json", // then use remapped location "/root/generated/folder2/file3.ts", "/root/generated/folder2/file3.tsx", "/root/generated/folder2/file3.d.ts", + "/root/generated/folder2/file3.json", "/root/generated/folder2/file3/package.json", "/root/generated/folder2/file3/index.ts", "/root/generated/folder2/file3/index.tsx", @@ -618,14 +624,17 @@ import b = require("./moduleB"); "/root/folder2/file4.ts", "/root/folder2/file4.tsx", "/root/folder2/file4.d.ts", + "/root/folder2/file4.json", "/root/folder2/file4/package.json", "/root/folder2/file4/index.ts", "/root/folder2/file4/index.tsx", "/root/folder2/file4/index.d.ts", + "/root/folder2/file4/index.json", // try to load from file from remapped location "/root/generated/folder2/file4.ts", "/root/generated/folder2/file4.tsx", - "/root/generated/folder2/file4.d.ts" + "/root/generated/folder2/file4.d.ts", + "/root/generated/folder2/file4.json" // success on loading as from folder ]); check("somefolder/file5", file5, [ @@ -634,6 +643,7 @@ import b = require("./moduleB"); "/root/someanotherfolder/file5.ts", "/root/someanotherfolder/file5.tsx", "/root/someanotherfolder/file5.d.ts", + "/root/someanotherfolder/file5.json", // load from folder "/root/someanotherfolder/file5/package.json", "/root/someanotherfolder/file5/index.ts", @@ -646,21 +656,25 @@ import b = require("./moduleB"); "/root/file6.ts", "/root/file6.tsx", "/root/file6.d.ts", + "/root/file6.json", // load from folder "/root/file6/package.json", "/root/file6/index.ts", "/root/file6/index.tsx", "/root/file6/index.d.ts", + "/root/file6/index.json", // then try 'generated/*' // load from file "/root/generated/file6.ts", "/root/generated/file6.tsx", "/root/generated/file6.d.ts", + "/root/generated/file6.json", // load from folder "/root/generated/file6/package.json", "/root/generated/file6/index.ts", "/root/generated/file6/index.tsx", "/root/generated/file6/index.d.ts", + "/root/generated/file6/index.json", // fallback to standard node behavior // load from file "/root/folder1/node_modules/file6.ts", @@ -774,11 +788,13 @@ import b = require("./moduleB"); "/root/folder1/file2.ts", "/root/folder1/file2.tsx", "/root/folder1/file2.d.ts", + "/root/folder1/file2.json", // load from folder "/root/folder1/file2/package.json", "/root/folder1/file2/index.ts", "/root/folder1/file2/index.tsx", "/root/folder1/file2/index.d.ts", + "/root/folder1/file2/index.json", // success after using alternative rootDir entry ]); check("../folder1/file1", file3, file1, [ @@ -787,11 +803,13 @@ import b = require("./moduleB"); "/root/generated/folder1/file1.ts", "/root/generated/folder1/file1.tsx", "/root/generated/folder1/file1.d.ts", + "/root/generated/folder1/file1.json", // load from module "/root/generated/folder1/file1/package.json", "/root/generated/folder1/file1/index.ts", "/root/generated/folder1/file1/index.tsx", "/root/generated/folder1/file1/index.d.ts", + "/root/generated/folder1/file1/index.json", // success after using alternative rootDir entry ]); check("../folder1/file1_1", file3, file1_1, [ @@ -800,16 +818,19 @@ import b = require("./moduleB"); "/root/generated/folder1/file1_1.ts", "/root/generated/folder1/file1_1.tsx", "/root/generated/folder1/file1_1.d.ts", + "/root/generated/folder1/file1_1.json", // load from folder "/root/generated/folder1/file1_1/package.json", "/root/generated/folder1/file1_1/index.ts", "/root/generated/folder1/file1_1/index.tsx", "/root/generated/folder1/file1_1/index.d.ts", + "/root/generated/folder1/file1_1/index.json", // try alternative rootDir entry // load from file "/root/folder1/file1_1.ts", "/root/folder1/file1_1.tsx", "/root/folder1/file1_1.d.ts", + "/root/folder1/file1_1.json", // load from directory "/root/folder1/file1_1/package.json", "/root/folder1/file1_1/index.ts", @@ -906,6 +927,7 @@ import b = require("./moduleB"); "/root/src/libs/guid.ts", "/root/src/libs/guid.tsx", "/root/src/libs/guid.d.ts", + "/root/src/libs/guid.json", ]); } }); diff --git a/src/services/completions.ts b/src/services/completions.ts index b710aa8cd78bb..453ef13d2b2c5 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -3,6 +3,22 @@ /* @internal */ namespace ts.Completions { export function getCompletionsAtPosition(host: LanguageServiceHost, typeChecker: TypeChecker, log: (message: string) => void, compilerOptions: CompilerOptions, sourceFile: SourceFile, position: number): CompletionInfo { + // export function getCompletionsAtPosition(_host: LanguageServiceHost, _typeChecker: TypeChecker, _log: (message: string) => void, _compilerOptions: CompilerOptions, _sourceFile: SourceFile, _position: number): CompletionInfo { + + // return { + // isGlobalCompletion: false, + // isMemberCompletion: false, + // isNewIdentifierLocation: false, + // entries: [ + // { + // name: "test5", + // kind: ScriptElementKind.classElement, + // kindModifiers: ScriptElementKindModifier.none, + // sortText: "test" + // } + // ] + // }; + if (isInReferenceComment(sourceFile, position)) { return getTripleSlashReferenceCompletion(sourceFile, position); } diff --git a/tests/baselines/reference/importWithTrailingSlash_noResolve.trace.json b/tests/baselines/reference/importWithTrailingSlash_noResolve.trace.json index e010603106f4c..b9a7c1aa708b4 100644 --- a/tests/baselines/reference/importWithTrailingSlash_noResolve.trace.json +++ b/tests/baselines/reference/importWithTrailingSlash_noResolve.trace.json @@ -6,5 +6,6 @@ "File '/foo/index.ts' does not exist.", "File '/foo/index.tsx' does not exist.", "File '/foo/index.d.ts' does not exist.", + "File '/foo/index.json' does not exist.", "======== Module name './foo/' was not resolved. ========" ] \ No newline at end of file diff --git a/tests/baselines/reference/moduleResolutionWithExtensions.trace.json b/tests/baselines/reference/moduleResolutionWithExtensions.trace.json index 5060006ac56bd..5c5088dae250f 100644 --- a/tests/baselines/reference/moduleResolutionWithExtensions.trace.json +++ b/tests/baselines/reference/moduleResolutionWithExtensions.trace.json @@ -11,6 +11,7 @@ "File '/src/a.js.ts' does not exist.", "File '/src/a.js.tsx' does not exist.", "File '/src/a.js.d.ts' does not exist.", + "File '/src/a.js.json' does not exist.", "File name '/src/a.js' has a '.js' extension - stripping it", "File '/src/a.ts' exist - use it as a name resolution result.", "Resolving real path for '/src/a.ts', result '/src/a.ts'", @@ -21,6 +22,7 @@ "File '/src/jquery.js.ts' does not exist.", "File '/src/jquery.js.tsx' does not exist.", "File '/src/jquery.js.d.ts' does not exist.", + "File '/src/jquery.js.json' does not exist.", "File name '/src/jquery.js' has a '.js' extension - stripping it", "File '/src/jquery.ts' does not exist.", "File '/src/jquery.tsx' does not exist.", diff --git a/tests/baselines/reference/moduleResolutionWithSymlinks.trace.json b/tests/baselines/reference/moduleResolutionWithSymlinks.trace.json index f3bfae4b17346..709d200c7d26a 100644 --- a/tests/baselines/reference/moduleResolutionWithSymlinks.trace.json +++ b/tests/baselines/reference/moduleResolutionWithSymlinks.trace.json @@ -5,6 +5,7 @@ "File '/src/library-a.ts' does not exist.", "File '/src/library-a.tsx' does not exist.", "File '/src/library-a.d.ts' does not exist.", + "File '/src/library-a.json' does not exist.", "File '/src/library-a/package.json' does not exist.", "File '/src/library-a/index.ts' exist - use it as a name resolution result.", "Resolving real path for '/src/library-a/index.ts', result '/src/library-a/index.ts'", @@ -15,6 +16,7 @@ "File '/src/library-b.ts' does not exist.", "File '/src/library-b.tsx' does not exist.", "File '/src/library-b.d.ts' does not exist.", + "File '/src/library-b.json' does not exist.", "File '/src/library-b/package.json' does not exist.", "File '/src/library-b/index.ts' exist - use it as a name resolution result.", "Resolving real path for '/src/library-b/index.ts', result '/src/library-b/index.ts'", diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution3_node.trace.json b/tests/baselines/reference/pathMappingBasedModuleResolution3_node.trace.json index ab7210d7d020c..6d23c595bf9c4 100644 --- a/tests/baselines/reference/pathMappingBasedModuleResolution3_node.trace.json +++ b/tests/baselines/reference/pathMappingBasedModuleResolution3_node.trace.json @@ -21,10 +21,12 @@ "File 'c:/root/file4.ts' does not exist.", "File 'c:/root/file4.tsx' does not exist.", "File 'c:/root/file4.d.ts' does not exist.", + "File 'c:/root/file4.json' does not exist.", "File 'c:/root/file4/package.json' does not exist.", "File 'c:/root/file4/index.ts' does not exist.", "File 'c:/root/file4/index.tsx' does not exist.", "File 'c:/root/file4/index.d.ts' does not exist.", + "File 'c:/root/file4/index.json' does not exist.", "Loading module 'file4' from 'node_modules' folder.", "File 'c:/root/folder2/node_modules/file4.ts' does not exist.", "File 'c:/root/folder2/node_modules/file4.tsx' does not exist.", diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution4_node.trace.json b/tests/baselines/reference/pathMappingBasedModuleResolution4_node.trace.json index ab7210d7d020c..6d23c595bf9c4 100644 --- a/tests/baselines/reference/pathMappingBasedModuleResolution4_node.trace.json +++ b/tests/baselines/reference/pathMappingBasedModuleResolution4_node.trace.json @@ -21,10 +21,12 @@ "File 'c:/root/file4.ts' does not exist.", "File 'c:/root/file4.tsx' does not exist.", "File 'c:/root/file4.d.ts' does not exist.", + "File 'c:/root/file4.json' does not exist.", "File 'c:/root/file4/package.json' does not exist.", "File 'c:/root/file4/index.ts' does not exist.", "File 'c:/root/file4/index.tsx' does not exist.", "File 'c:/root/file4/index.d.ts' does not exist.", + "File 'c:/root/file4/index.json' does not exist.", "Loading module 'file4' from 'node_modules' folder.", "File 'c:/root/folder2/node_modules/file4.ts' does not exist.", "File 'c:/root/folder2/node_modules/file4.tsx' does not exist.", diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution5_node.trace.json b/tests/baselines/reference/pathMappingBasedModuleResolution5_node.trace.json index 2efeefa24e5ca..51504c945d755 100644 --- a/tests/baselines/reference/pathMappingBasedModuleResolution5_node.trace.json +++ b/tests/baselines/reference/pathMappingBasedModuleResolution5_node.trace.json @@ -19,10 +19,12 @@ "File 'c:/root/folder3/file2.ts' does not exist.", "File 'c:/root/folder3/file2.tsx' does not exist.", "File 'c:/root/folder3/file2.d.ts' does not exist.", + "File 'c:/root/folder3/file2.json' does not exist.", "File 'c:/root/folder3/file2/package.json' does not exist.", "File 'c:/root/folder3/file2/index.ts' does not exist.", "File 'c:/root/folder3/file2/index.tsx' does not exist.", "File 'c:/root/folder3/file2/index.d.ts' does not exist.", + "File 'c:/root/folder3/file2/index.json' does not exist.", "Trying substitution 'generated/*', candidate module location: 'generated/folder3/file2'.", "Loading module as file / folder, candidate module location 'c:/root/generated/folder3/file2'.", "File 'c:/root/generated/folder3/file2.ts' exist - use it as a name resolution result.", @@ -38,6 +40,7 @@ "File 'c:/root/shared/components/file3.ts' does not exist.", "File 'c:/root/shared/components/file3.tsx' does not exist.", "File 'c:/root/shared/components/file3.d.ts' does not exist.", + "File 'c:/root/shared/components/file3.json' does not exist.", "File 'c:/root/shared/components/file3/package.json' does not exist.", "File 'c:/root/shared/components/file3/index.ts' does not exist.", "File 'c:/root/shared/components/file3/index.tsx' does not exist.", @@ -54,19 +57,23 @@ "File 'c:/root/file4.ts' does not exist.", "File 'c:/root/file4.tsx' does not exist.", "File 'c:/root/file4.d.ts' does not exist.", + "File 'c:/root/file4.json' does not exist.", "File 'c:/root/file4/package.json' does not exist.", "File 'c:/root/file4/index.ts' does not exist.", "File 'c:/root/file4/index.tsx' does not exist.", "File 'c:/root/file4/index.d.ts' does not exist.", + "File 'c:/root/file4/index.json' does not exist.", "Trying substitution 'generated/*', candidate module location: 'generated/file4'.", "Loading module as file / folder, candidate module location 'c:/root/generated/file4'.", "File 'c:/root/generated/file4.ts' does not exist.", "File 'c:/root/generated/file4.tsx' does not exist.", "File 'c:/root/generated/file4.d.ts' does not exist.", + "File 'c:/root/generated/file4.json' does not exist.", "File 'c:/root/generated/file4/package.json' does not exist.", "File 'c:/root/generated/file4/index.ts' does not exist.", "File 'c:/root/generated/file4/index.tsx' does not exist.", "File 'c:/root/generated/file4/index.d.ts' does not exist.", + "File 'c:/root/generated/file4/index.json' does not exist.", "Loading module 'file4' from 'node_modules' folder.", "File 'c:/root/folder1/node_modules/file4.ts' does not exist.", "File 'c:/root/folder1/node_modules/file4.tsx' does not exist.", diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution6_node.trace.json b/tests/baselines/reference/pathMappingBasedModuleResolution6_node.trace.json index 28e51a119152d..a0a8207e843a4 100644 --- a/tests/baselines/reference/pathMappingBasedModuleResolution6_node.trace.json +++ b/tests/baselines/reference/pathMappingBasedModuleResolution6_node.trace.json @@ -10,10 +10,12 @@ "File 'c:/root/src/project/file3.ts' does not exist.", "File 'c:/root/src/project/file3.tsx' does not exist.", "File 'c:/root/src/project/file3.d.ts' does not exist.", + "File 'c:/root/src/project/file3.json' does not exist.", "File 'c:/root/src/project/file3/package.json' does not exist.", "File 'c:/root/src/project/file3/index.ts' does not exist.", "File 'c:/root/src/project/file3/index.tsx' does not exist.", "File 'c:/root/src/project/file3/index.d.ts' does not exist.", + "File 'c:/root/src/project/file3/index.json' does not exist.", "Trying other entries in 'rootDirs'", "Loading 'project/file3' from the root dir 'c:/root/generated/src', candidate location 'c:/root/generated/src/project/file3'", "Loading module as file / folder, candidate module location 'c:/root/generated/src/project/file3'.", @@ -31,16 +33,19 @@ "File 'c:/root/generated/src/file2.ts' does not exist.", "File 'c:/root/generated/src/file2.tsx' does not exist.", "File 'c:/root/generated/src/file2.d.ts' does not exist.", + "File 'c:/root/generated/src/file2.json' does not exist.", "File 'c:/root/generated/src/file2/package.json' does not exist.", "File 'c:/root/generated/src/file2/index.ts' does not exist.", "File 'c:/root/generated/src/file2/index.tsx' does not exist.", "File 'c:/root/generated/src/file2/index.d.ts' does not exist.", + "File 'c:/root/generated/src/file2/index.json' does not exist.", "Trying other entries in 'rootDirs'", "Loading 'file2' from the root dir 'c:/root/src', candidate location 'c:/root/src/file2'", "Loading module as file / folder, candidate module location 'c:/root/src/file2'.", "File 'c:/root/src/file2.ts' does not exist.", "File 'c:/root/src/file2.tsx' does not exist.", "File 'c:/root/src/file2.d.ts' does not exist.", + "File 'c:/root/src/file2.json' does not exist.", "File 'c:/root/src/file2/package.json' does not exist.", "File 'c:/root/src/file2/index.ts' does not exist.", "File 'c:/root/src/file2/index.tsx' does not exist.", diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7_node.trace.json b/tests/baselines/reference/pathMappingBasedModuleResolution7_node.trace.json index 48633c85e3b48..d1a17c72483c4 100644 --- a/tests/baselines/reference/pathMappingBasedModuleResolution7_node.trace.json +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7_node.trace.json @@ -10,10 +10,12 @@ "File 'c:/root/src/project/file2.ts' does not exist.", "File 'c:/root/src/project/file2.tsx' does not exist.", "File 'c:/root/src/project/file2.d.ts' does not exist.", + "File 'c:/root/src/project/file2.json' does not exist.", "File 'c:/root/src/project/file2/package.json' does not exist.", "File 'c:/root/src/project/file2/index.ts' does not exist.", "File 'c:/root/src/project/file2/index.tsx' does not exist.", "File 'c:/root/src/project/file2/index.d.ts' does not exist.", + "File 'c:/root/src/project/file2/index.json' does not exist.", "Trying other entries in 'rootDirs'", "Loading 'project/file2' from the root dir 'c:/root/generated/src', candidate location 'c:/root/generated/src/project/file2'", "Loading module as file / folder, candidate module location 'c:/root/generated/src/project/file2'.", @@ -30,19 +32,23 @@ "File 'c:/root/module3.ts' does not exist.", "File 'c:/root/module3.tsx' does not exist.", "File 'c:/root/module3.d.ts' does not exist.", + "File 'c:/root/module3.json' does not exist.", "File 'c:/root/module3/package.json' does not exist.", "File 'c:/root/module3/index.ts' does not exist.", "File 'c:/root/module3/index.tsx' does not exist.", "File 'c:/root/module3/index.d.ts' does not exist.", + "File 'c:/root/module3/index.json' does not exist.", "Trying substitution 'c:/shared/*', candidate module location: 'c:/shared/module3'.", "Loading module as file / folder, candidate module location 'c:/shared/module3'.", "File 'c:/shared/module3.ts' does not exist.", "File 'c:/shared/module3.tsx' does not exist.", "File 'c:/shared/module3.d.ts' does not exist.", + "File 'c:/shared/module3.json' does not exist.", "File 'c:/shared/module3/package.json' does not exist.", "File 'c:/shared/module3/index.ts' does not exist.", "File 'c:/shared/module3/index.tsx' does not exist.", "File 'c:/shared/module3/index.d.ts' does not exist.", + "File 'c:/shared/module3/index.json' does not exist.", "Loading module 'module3' from 'node_modules' folder.", "File 'c:/root/src/node_modules/module3.ts' does not exist.", "File 'c:/root/src/node_modules/module3.tsx' does not exist.", @@ -87,15 +93,18 @@ "File 'c:/root/module1.ts' does not exist.", "File 'c:/root/module1.tsx' does not exist.", "File 'c:/root/module1.d.ts' does not exist.", + "File 'c:/root/module1.json' does not exist.", "File 'c:/root/module1/package.json' does not exist.", "File 'c:/root/module1/index.ts' does not exist.", "File 'c:/root/module1/index.tsx' does not exist.", "File 'c:/root/module1/index.d.ts' does not exist.", + "File 'c:/root/module1/index.json' does not exist.", "Trying substitution 'c:/shared/*', candidate module location: 'c:/shared/module1'.", "Loading module as file / folder, candidate module location 'c:/shared/module1'.", "File 'c:/shared/module1.ts' does not exist.", "File 'c:/shared/module1.tsx' does not exist.", "File 'c:/shared/module1.d.ts' does not exist.", + "File 'c:/shared/module1.json' does not exist.", "File 'c:/shared/module1/package.json' does not exist.", "File 'c:/shared/module1/index.ts' does not exist.", "File 'c:/shared/module1/index.tsx' does not exist.", @@ -123,16 +132,19 @@ "File 'c:/root/generated/src/file3.ts' does not exist.", "File 'c:/root/generated/src/file3.tsx' does not exist.", "File 'c:/root/generated/src/file3.d.ts' does not exist.", + "File 'c:/root/generated/src/file3.json' does not exist.", "File 'c:/root/generated/src/file3/package.json' does not exist.", "File 'c:/root/generated/src/file3/index.ts' does not exist.", "File 'c:/root/generated/src/file3/index.tsx' does not exist.", "File 'c:/root/generated/src/file3/index.d.ts' does not exist.", + "File 'c:/root/generated/src/file3/index.json' does not exist.", "Trying other entries in 'rootDirs'", "Loading 'file3' from the root dir 'c:/root/src', candidate location 'c:/root/src/file3'", "Loading module as file / folder, candidate module location 'c:/root/src/file3'.", "File 'c:/root/src/file3.ts' does not exist.", "File 'c:/root/src/file3.tsx' does not exist.", "File 'c:/root/src/file3.d.ts' does not exist.", + "File 'c:/root/src/file3.json' does not exist.", "File 'c:/root/src/file3/package.json' does not exist.", "File 'c:/root/src/file3/index.ts' does not exist.", "File 'c:/root/src/file3/index.tsx' does not exist.", diff --git a/tests/baselines/reference/requireJsonInCommonJS.js b/tests/baselines/reference/requireJsonInCommonJS.js new file mode 100644 index 0000000000000..88254cbcb5ebe --- /dev/null +++ b/tests/baselines/reference/requireJsonInCommonJS.js @@ -0,0 +1,25 @@ +//// [tests/cases/compiler/requireJsonInCommonJS.ts] //// + +//// [data.json] +{ + "a": "a", + "b": 42 +} + +//// [m.ts] +const data = require("./data"); +const a = data.a; +const b = data.b; + +//// [node.d.ts] +interface NodeRequireFunction { + (id: string): any; +} +interface NodeRequire extends NodeRequireFunction { +} +declare var require: NodeRequire; + +//// [m.js] +var data = require("./data"); +var a = data.a; +var b = data.b; diff --git a/tests/baselines/reference/requireJsonInCommonJS.symbols b/tests/baselines/reference/requireJsonInCommonJS.symbols new file mode 100644 index 0000000000000..ecfc74ecc6706 --- /dev/null +++ b/tests/baselines/reference/requireJsonInCommonJS.symbols @@ -0,0 +1,39 @@ +=== tests/cases/compiler/data.json === +{ +No type information for this code. "a": "a", +No type information for this code. "b": 42 +No type information for this code.} +No type information for this code. +No type information for this code.=== tests/cases/compiler/m.ts === +const data = require("./data"); +>data : Symbol(data, Decl(m.ts, 0, 5)) +>require : Symbol(require, Decl(node.d.ts, 5, 11)) +>"./data" : Symbol("tests/cases/compiler/data.json", Decl(data.json, 0, 0)) + +const a = data.a; +>a : Symbol(a, Decl(m.ts, 1, 5)) +>data.a : Symbol("a", Decl(data.json, 0, 1)) +>data : Symbol(data, Decl(m.ts, 0, 5)) +>a : Symbol("a", Decl(data.json, 0, 1)) + +const b = data.b; +>b : Symbol(b, Decl(m.ts, 2, 5)) +>data.b : Symbol("b", Decl(data.json, 1, 13)) +>data : Symbol(data, Decl(m.ts, 0, 5)) +>b : Symbol("b", Decl(data.json, 1, 13)) + +=== tests/cases/compiler/node.d.ts === +interface NodeRequireFunction { +>NodeRequireFunction : Symbol(NodeRequireFunction, Decl(node.d.ts, 0, 0)) + + (id: string): any; +>id : Symbol(id, Decl(node.d.ts, 1, 5)) +} +interface NodeRequire extends NodeRequireFunction { +>NodeRequire : Symbol(NodeRequire, Decl(node.d.ts, 2, 1)) +>NodeRequireFunction : Symbol(NodeRequireFunction, Decl(node.d.ts, 0, 0)) +} +declare var require: NodeRequire; +>require : Symbol(require, Decl(node.d.ts, 5, 11)) +>NodeRequire : Symbol(NodeRequire, Decl(node.d.ts, 2, 1)) + diff --git a/tests/baselines/reference/requireJsonInCommonJS.types b/tests/baselines/reference/requireJsonInCommonJS.types new file mode 100644 index 0000000000000..aacf7bbf390ea --- /dev/null +++ b/tests/baselines/reference/requireJsonInCommonJS.types @@ -0,0 +1,45 @@ +=== tests/cases/compiler/data.json === +{ +>{ "a": "a", "b": 42} : { "a": string; "b": number; } + + "a": "a", +>"a" : "a" + + "b": 42 +>42 : 42 +} + +=== tests/cases/compiler/m.ts === +const data = require("./data"); +>data : { "a": string; "b": number; } +>require("./data") : { "a": string; "b": number; } +>require : NodeRequire +>"./data" : "./data" + +const a = data.a; +>a : string +>data.a : string +>data : { "a": string; "b": number; } +>a : string + +const b = data.b; +>b : number +>data.b : number +>data : { "a": string; "b": number; } +>b : number + +=== tests/cases/compiler/node.d.ts === +interface NodeRequireFunction { +>NodeRequireFunction : NodeRequireFunction + + (id: string): any; +>id : string +} +interface NodeRequire extends NodeRequireFunction { +>NodeRequire : NodeRequire +>NodeRequireFunction : NodeRequireFunction +} +declare var require: NodeRequire; +>require : NodeRequire +>NodeRequire : NodeRequire + diff --git a/tests/cases/compiler/requireJsonInCommonJS.ts b/tests/cases/compiler/requireJsonInCommonJS.ts new file mode 100644 index 0000000000000..dc5832077ddec --- /dev/null +++ b/tests/cases/compiler/requireJsonInCommonJS.ts @@ -0,0 +1,21 @@ +// @allowjs: false +// @allowNonTsExtensions: true +// @outDir: dist +// @Filename: data.json +{ + "a": "a", + "b": 42 +} + +// @Filename: m.ts +const data = require("./data"); +const a = data.a; +const b = data.b; + +// @Filename: node.d.ts +interface NodeRequireFunction { + (id: string): any; +} +interface NodeRequire extends NodeRequireFunction { +} +declare var require: NodeRequire; \ No newline at end of file diff --git a/tests/cases/fourslash/completionListFromJSON01.ts b/tests/cases/fourslash/completionListFromJSON01.ts new file mode 100644 index 0000000000000..c2d8001850505 --- /dev/null +++ b/tests/cases/fourslash/completionListFromJSON01.ts @@ -0,0 +1,18 @@ +/// + +// @Module: commonjs +// @ModuleResolution: classic + +// @Filename: json1.json +////{ +//// "foo": "foo", +//// "bar": "bar" +////} + +// @Filename: test.ts +////var json1 = require("./json1"); +////json1./*1*/ + +goTo.marker("1"); +// ModuleResolution is "classic" so no completion +verify.completionListIsEmpty(); diff --git a/tests/cases/fourslash/completionListFromJSON02.ts b/tests/cases/fourslash/completionListFromJSON02.ts new file mode 100644 index 0000000000000..f4a038ee8626d --- /dev/null +++ b/tests/cases/fourslash/completionListFromJSON02.ts @@ -0,0 +1,18 @@ +/// + +// @Module: amd +// @ModuleResolution: node + +// @Filename: json1.json +////{ +//// "foo": "foo", +//// "bar": "bar" +////} + +// @Filename: test.ts +////var json1 = require("./json1"); +////json1./*1*/ + +goTo.marker("1"); +// Module is "amd" so no completion +verify.completionListIsEmpty(); diff --git a/tests/cases/fourslash/completionListFromJSON1.ts b/tests/cases/fourslash/completionListFromJSON1.ts new file mode 100644 index 0000000000000..64abd2d08624b --- /dev/null +++ b/tests/cases/fourslash/completionListFromJSON1.ts @@ -0,0 +1,15 @@ +/// + +// @Filename: json1.json +////{ +//// "foo": "foo", +//// "bar": "bar" +////} + +// @Filename: test.ts +////var json1 = require("./json1"); +////json1./*1*/ + +goTo.marker("1"); +verify.completionListContains("foo"); +verify.completionListContains("bar"); diff --git a/tests/cases/fourslash/completionListFromJSON2.ts b/tests/cases/fourslash/completionListFromJSON2.ts new file mode 100644 index 0000000000000..6520c0dae9f95 --- /dev/null +++ b/tests/cases/fourslash/completionListFromJSON2.ts @@ -0,0 +1,15 @@ +/// + +// @Filename: json1.json +////{ +//// "foo": "foo", +//// "bar": "bar" +////} + +// @Filename: test.ts +////import json1 = require("./json1"); +////json1./*1*/ + +goTo.marker("1"); +verify.completionListContains("foo"); +verify.completionListContains("bar"); diff --git a/tests/cases/fourslash/completionListFromJSON3.ts b/tests/cases/fourslash/completionListFromJSON3.ts new file mode 100644 index 0000000000000..574c1e79b8a0a --- /dev/null +++ b/tests/cases/fourslash/completionListFromJSON3.ts @@ -0,0 +1,14 @@ +/// + +// @Filename: json1.json +////{ +//// "foo": "foo", +//// "bar": "bar" +////} + +// @Filename: test.ts +////require("./json1")./*1*/ + +goTo.marker("1"); +verify.completionListContains("foo"); +verify.completionListContains("bar"); diff --git a/tests/cases/fourslash/completionListFromJSON4.ts b/tests/cases/fourslash/completionListFromJSON4.ts new file mode 100644 index 0000000000000..2512de6d3a945 --- /dev/null +++ b/tests/cases/fourslash/completionListFromJSON4.ts @@ -0,0 +1,16 @@ +/// + +// @Filename: json1.json +////{ +//// "foo": { +//// "bar": { +//// "baz": "baz" +//// } +//// } +////} + +// @Filename: test.ts +////require("./json1").foo.bar./*1*/ + +goTo.marker("1"); +verify.completionListContains("baz");