diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 3fca97c0450..70513219000 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -250,10 +250,12 @@ namespace ts { name: "moduleResolution", type: { "node": ModuleResolutionKind.NodeJs, - "classic": ModuleResolutionKind.Classic + "classic": ModuleResolutionKind.Classic, + // name is lowercased so we can still use hasProperty(userValue.toLower()) to check if user has entered the right value + "baseurl": ModuleResolutionKind.BaseUrl, }, description: Diagnostics.Specifies_module_resolution_strategy_Colon_node_Node_js_or_classic_TypeScript_pre_1_6, - error: Diagnostics.Argument_for_moduleResolution_option_must_be_node_or_classic, + error: Diagnostics.Argument_for_moduleResolution_option_must_be_node_classic_or_baseUrl, }, { name: "allowUnusedLabels", @@ -279,6 +281,26 @@ namespace ts { name: "forceConsistentCasingInFileNames", type: "boolean", description: Diagnostics.Disallow_inconsistently_cased_references_to_the_same_file + }, + { + name: "baseUrl", + type: "string", + isFilePath: true, + description: Diagnostics.Base_directory_to_resolve_relative_module_names + }, + { + // this option can only be specified in tsconfig.json + // use type = object to copy the value as-is + name: "paths", + type: "object", + isTSConfigOnly: true + }, + { + // this option can only be specified in tsconfig.json + // use type = object to copy the value as-is + name: "rootDirs", + type: "object", + isTSConfigOnly: true } ]; @@ -339,31 +361,36 @@ namespace ts { if (hasProperty(optionNameMap, s)) { const opt = optionNameMap[s]; - // Check to see if no argument was provided (e.g. "--locale" is the last command-line argument). - if (!args[i] && opt.type !== "boolean") { - errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_expects_an_argument, opt.name)); + if (opt.isTSConfigOnly) { + errors.push(createCompilerDiagnostic(Diagnostics.Option_0_can_only_be_specified_in_tsconfig_json_file, opt.name)); } + else { + // Check to see if no argument was provided (e.g. "--locale" is the last command-line argument). + if (!args[i] && opt.type !== "boolean") { + errors.push(createCompilerDiagnostic(Diagnostics.Compiler_option_0_expects_an_argument, opt.name)); + } - switch (opt.type) { - case "number": - options[opt.name] = parseInt(args[i++]); - break; - case "boolean": - options[opt.name] = true; - break; - case "string": - options[opt.name] = args[i++] || ""; - break; - // If not a primitive, the possible types are specified in what is effectively a map of options. - default: - let map = >opt.type; - let key = (args[i++] || "").toLowerCase(); - if (hasProperty(map, key)) { - options[opt.name] = map[key]; - } - else { - errors.push(createCompilerDiagnostic((opt).error)); - } + switch (opt.type) { + case "number": + options[opt.name] = parseInt(args[i++]); + break; + case "boolean": + options[opt.name] = true; + break; + case "string": + options[opt.name] = args[i++] || ""; + break; + // If not a primitive, the possible types are specified in what is effectively a map of options. + default: + let map = >opt.type; + let key = (args[i++] || "").toLowerCase(); + if (hasProperty(map, key)) { + options[opt.name] = map[key]; + } + else { + errors.push(createCompilerDiagnostic((opt).error)); + } + } } } else { @@ -466,7 +493,6 @@ namespace ts { return output; } - /** * Parse the contents of a config file (tsconfig.json). * @param json The contents of the config file to parse @@ -477,6 +503,9 @@ namespace ts { export function parseJsonConfigFileContent(json: any, host: ParseConfigHost, basePath: string): ParsedCommandLine { const { options, errors } = convertCompilerOptionsFromJson(json["compilerOptions"], basePath); + // set basePath as inferredBaseUrl so baseUrl module resolution strategy can still work even if user have not specified baseUrl explicity + options.inferredBaseUrl = basePath; + return { options, fileNames: getFileNames(), diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index ad71d646b7b..39b7fad4a49 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -2060,7 +2060,26 @@ "category": "Error", "code": 5054 }, - + "Option '{0}' can only be used when option 'moduleResolution' is 'baseUrl'.": { + "category": "Error", + "code": 5055 + }, + "Pattern '{0}' can have at most one '*' character": { + "category": "Error", + "code": 5056 + }, + "Substitution '{0}' in pattern '{1}' in can have at most one '*' character": { + "category": "Error", + "code": 5057 + }, + "'moduleResolution' kind 'baseUrl' cannot be used without specifying '--baseUrl' option.": { + "category": "Error", + "code": 5058 + }, + "Module resolution kind cannot be determined automatically. Please specify module resolution explicitly via 'moduleResolution' option.": { + "category": "Error", + "code": 5059 + }, "Concatenate and emit output to single file.": { "category": "Message", "code": 6001 @@ -2253,10 +2272,14 @@ "category": "Error", "code": 6062 }, - "Argument for '--moduleResolution' option must be 'node' or 'classic'.": { + "Argument for '--moduleResolution' option must be 'node', 'classic' or 'baseUrl'.": { "category": "Error", "code": 6063 }, + "Option '{0}' can only be specified in 'tsconfig.json' file.": { + "category": "Error", + "code": 6064 + }, "Enables experimental support for ES7 decorators.": { "category": "Message", @@ -2322,6 +2345,10 @@ "category": "Error", "code": 6082 }, + "Base directory to resolve relative module names.": { + "category": "Message", + "code": 6083 + }, "Variable '{0}' implicitly has an '{1}' type.": { "category": "Error", "code": 7005 diff --git a/src/compiler/program.ts b/src/compiler/program.ts index dc31dfb5213..36f01e77ece 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -37,23 +37,221 @@ namespace ts { } export function resolveModuleName(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { - const moduleResolution = compilerOptions.moduleResolution !== undefined - ? compilerOptions.moduleResolution - : compilerOptions.module === ModuleKind.CommonJS ? ModuleResolutionKind.NodeJs : ModuleResolutionKind.Classic; + let moduleResolution = compilerOptions.moduleResolution; + if (moduleResolution === undefined) { + if (compilerOptions.module === ModuleKind.CommonJS) { + moduleResolution = ModuleResolutionKind.NodeJs; + } + else if (compilerOptions.baseUrl !== undefined || compilerOptions.paths || compilerOptions.rootDirs) { + moduleResolution = ModuleResolutionKind.BaseUrl; + } + else { + moduleResolution = ModuleResolutionKind.Classic; + } + } switch (moduleResolution) { case ModuleResolutionKind.NodeJs: return nodeModuleNameResolver(moduleName, containingFile, host); case ModuleResolutionKind.Classic: return classicNameResolver(moduleName, containingFile, compilerOptions, host); + case ModuleResolutionKind.BaseUrl: return baseUrlModuleNameResolver(moduleName, containingFile, compilerOptions, host); } } + // Path mapping based module resolution strategy uses base url to resolve relative file names. This resolution strategy can be enabled + // by setting 'moduleResolution' option to 'baseUrl' and as it implied by the name it uses base url to resolve module names. + // Base url can be specified: + // - explicitly via command line option 'baseUrl'. If this value is relative it will be computed relative to current directory. + // - explicitly in 'tsconfig.json' via 'baseUrl' compiler option. If this value is relative it will be computed relative to the location + // of 'tsconfig.json'. + // - if value is not provided explicitly but project uses tsconfig.json then 'baseUrl' will be set of folder that contains 'tsconfig.json' + // If baseUrl is the only provided option then non-relative module names will be resolved relative to baseUrl. Relative module names + // will still be resolved relative to the folder that contains file with import. + // User can specify additional options in tsconfig.json to tweak module resolution. + // - 'paths' option allows to tune how non-relative module names will be resolved based on the content of the module name. + // Structure of 'paths' compiler options + // 'paths': { + // pattern-1: list of substitutions 1, + // pattern-2: list of substitutions 2, + // ... + // pattern-n: list of substitutions-n + // } + // Pattern here is a string that can contain zero or one '*' character. During module resolution module name will be matched against + // all patterns in the list. Matching for patterns that don't contain '*' means that module name must be equal to pattern respecting the case. + // If pattern contains '*' then to match pattern "*" module name must start with the and end with . + // denotes part of the module name between and . + // If module name can be matches with multiple patterns then pattern with the longest prefix will be picked. + // After selecting pattern we'll use list of substitutions to get candidate locations of the module and the try to load module from the candidate location. + // Substitiution is a string that can contain zero or one '*'. To get candidate location from substitution we'll pick every substitution in the list + // and replace '*' with string. If candidate location is not rooted it will be converted to absolute using baseUrl. + // For example: + // baseUrl: /a/b/c + // "paths": { + // // match all module names + // "*": [ + // "*", // use matched name as is, + // // will be looked as /a/b/c/ + // + // "folder1/*" // substitution will convert matched name to 'folder1/', + // // since it is not rooted then final candidate location will be /a/b/c/folder1/ + // ], + // // match module names that start with 'components/' + // "components/*": [ "/root/components/*" ] // substitution will convert /components/folder1/ to '/root/components/folder1/', + // // it is rooted so it will be final candidate location + // } + // 'paths' allows to remap locations of non-relative module names. Relative module names usually are resolved relative to the folder + // that contains import. However sometimes it might be useful to apply mappings to relative module names as well. + // Since the there might be different relative file names that refer to the same file we need to convert relative module name to non-relative + // so we can just apply path mapping to it. This conversion can be performed using 'rootDirs' compiler option - this options stores list of root directories + // for the project (if root directory is not absolute it will be converted to absolute using baseUrl as a base path). + // First - we convert relative module name to absolute using location of file that contains import. + // Then we try to find what element is rootDirs is the longest prefix for this absolute file name (respecting case): + // = + // Once it is done - value of is a be non-relative name for initially relative module name. + // Note that if element in rootDirs should always end with '/' so it will be appended automatically if value in configuration does not have it. + // For example: + // baseUrl: /a/b/c + // "paths": { + // "*": [ "*", "generated/*" ] // try to resolve module name as '/a/b/c/' then look it in '/a/b/c/generated/' + // } + // "rootDirs": [ + // "./src", // root dir is project baseUrl/src + // "./generated" // root dir is baseUrl/generated + // "/e/f" // root dir is /e/f + // ] + // @file: /a/b/c/src/form1.ts + // import {x} from "./form.content.ts" + // @file: /a/b/c/generated/form1.content.ts + // export var x = ... + // first './form.content.ts' needs to be converted to non-relative name. + // 1. convert it to absolute name '/a/b/c/src/form1.content.ts' -> + // find longest prefix in rootDirs that match this path, it will be './src' (after expansion '/a/b/c/src/') -> + // suffix is form1.content.ts + // 2. apply path mappings to 'form1.content.ts' -> + // '*' pattern will be matched -> + // '*' substitution yields '/a/b/c/form1.content.ts' - file does not exists + // 'generated/*' substitution yields '/a/b/c/generated/form1.content' - file exists - OK + export function baseUrlModuleNameResolver(moduleName: string, containingFile: string, options: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { + const baseUrl = options.baseUrl !== undefined ? options.baseUrl : options.inferredBaseUrl; + Debug.assert(baseUrl !== undefined); + + if (isRootedDiskPath(moduleName)) { + return { resolvedModule: { resolvedFileName: moduleName }, failedLookupLocations: emptyArray }; + } + + if (nameStartsWithDotSlashOrDotDotSlash(moduleName)) { + // relative name + return baseUrlResolveRelativeModuleName(moduleName, containingFile, baseUrl, options, host); + } + else { + // non-relative name + return baseUrlResolveNonRelativeModuleName(moduleName, baseUrl, options, host); + } + } + + export function baseUrlResolveRelativeModuleName(moduleName: string, containingFile: string, baseUrl: string, options: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { + const failedLookupLocations: string[] = []; + + const containingDirectory = getDirectoryPath(containingFile); + const candidate = normalizePath(combinePaths(containingDirectory, moduleName)); + + if (options.rootDirs) { + let matchedPrefix: string; + for (const rootDir of options.rootDirs) { + let normalizedRoot = getNormalizedAbsolutePath(rootDir, baseUrl); + if (!endsWith(normalizedRoot, directorySeparator)) { + normalizedRoot += directorySeparator; + } + if (startsWith(candidate, normalizedRoot) && (matchedPrefix === undefined || matchedPrefix.length < normalizedRoot.length)) { + matchedPrefix = normalizedRoot; + } + } + if (matchedPrefix) { + const suffix = candidate.substr(matchedPrefix.length); + return baseUrlResolveNonRelativeModuleName(suffix, baseUrl, options, host); + } + return { resolvedModule: undefined, failedLookupLocations }; + } + else { + const resolvedFileName = loadModuleFromFile(supportedExtensions, candidate, failedLookupLocations, host); + return { + resolvedModule: resolvedFileName ? { resolvedFileName } : undefined, + failedLookupLocations + }; + } + } + + export function baseUrlResolveNonRelativeModuleName(moduleName: string, baseUrl: string, options: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { + let longestMatchPrefixLength = -1; + let matchedPattern: string; + let matchedStar: string; + + const failedLookupLocations: string[] = []; + if (options.paths) { + for (const key in options.paths) { + const pattern: string = key; + const indexOfStar = pattern.indexOf("*"); + if (indexOfStar !== -1) { + const prefix = pattern.substr(0, indexOfStar); + const suffix = pattern.substr(indexOfStar + 1); + if (moduleName.length >= prefix.length + suffix.length && + startsWith(moduleName, prefix) && + endsWith(moduleName, suffix)) { + + // use length of prefix as betterness criteria + if (prefix.length > longestMatchPrefixLength) { + longestMatchPrefixLength = prefix.length; + matchedPattern = pattern; + matchedStar = moduleName.substr(prefix.length, moduleName.length - suffix.length); + } + } + } + else if (pattern === moduleName) { + // pattern was matched as is - no need to seatch further + matchedPattern = pattern; + matchedStar = undefined; + break; + } + } + } + + if (matchedPattern) { + for (const subst of options.paths[matchedPattern]) { + const path = matchedStar ? subst.replace("\*", matchedStar) : subst; + const candidate = normalizePath(combinePaths(baseUrl, path)); + const resolvedFileName = loadModuleFromFile(supportedExtensions, candidate, failedLookupLocations, host); + if (resolvedFileName) { + return { resolvedModule: { resolvedFileName }, failedLookupLocations }; + } + } + + return { resolvedModule: undefined, failedLookupLocations }; + } + else { + const candidate = normalizePath(combinePaths(baseUrl, moduleName)); + const resolvedFileName = loadModuleFromFile(supportedExtensions, candidate, failedLookupLocations, host); + return { + resolvedModule: resolvedFileName ? { resolvedFileName } : undefined, + failedLookupLocations + }; + } + } + + function startsWith(str: string, prefix: string): boolean { + return str.lastIndexOf(prefix, 0) === 0; + } + + function endsWith(str: string, suffix: string): boolean { + const expectedPos = str.length - suffix.length; + return str.indexOf(suffix, expectedPos) === expectedPos; + } + export function nodeModuleNameResolver(moduleName: string, containingFile: string, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { const containingDirectory = getDirectoryPath(containingFile); - if (getRootLength(moduleName) !== 0 || nameStartsWithDotSlashOrDotDotSlash(moduleName)) { + if (isRootedDiskPath(moduleName) || nameStartsWithDotSlashOrDotDotSlash(moduleName)) { const failedLookupLocations: string[] = []; const candidate = normalizePath(combinePaths(containingDirectory, moduleName)); - let resolvedFileName = loadNodeModuleFromFile(supportedJsExtensions, candidate, failedLookupLocations, host); + let resolvedFileName = loadModuleFromFile(supportedJsExtensions, candidate, failedLookupLocations, host); if (resolvedFileName) { return { resolvedModule: { resolvedFileName }, failedLookupLocations }; @@ -69,7 +267,7 @@ namespace ts { } } - function loadNodeModuleFromFile(extensions: string[], candidate: string, failedLookupLocation: string[], host: ModuleResolutionHost): string { + function loadModuleFromFile(extensions: string[], candidate: string, failedLookupLocation: string[], host: ModuleResolutionHost): string { return forEach(extensions, tryLoad); function tryLoad(ext: string): string { @@ -100,7 +298,7 @@ namespace ts { } if (jsonContent.typings) { - const result = loadNodeModuleFromFile(extensions, normalizePath(combinePaths(candidate, jsonContent.typings)), failedLookupLocation, host); + const result = loadModuleFromFile(extensions, normalizePath(combinePaths(candidate, jsonContent.typings)), failedLookupLocation, host); if (result) { return result; } @@ -111,7 +309,7 @@ namespace ts { failedLookupLocation.push(packageJsonPath); } - return loadNodeModuleFromFile(extensions, combinePaths(candidate, "index"), failedLookupLocation, host); + return loadModuleFromFile(extensions, combinePaths(candidate, "index"), failedLookupLocation, host); } function loadModuleFromNodeModules(moduleName: string, directory: string, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { @@ -122,7 +320,7 @@ namespace ts { if (baseName !== "node_modules") { const nodeModulesFolder = combinePaths(directory, "node_modules"); const candidate = normalizePath(combinePaths(nodeModulesFolder, moduleName)); - let result = loadNodeModuleFromFile(supportedExtensions, candidate, failedLookupLocations, host); + let result = loadModuleFromFile(supportedExtensions, candidate, failedLookupLocations, host); if (result) { return { resolvedModule: { resolvedFileName: result, isExternalLibraryImport: true }, failedLookupLocations }; } @@ -149,6 +347,22 @@ namespace ts { return i === 0 || (i === 1 && name.charCodeAt(0) === CharacterCodes.dot); } + function hasZeroOrOneAsteriskCharacter(str: string): boolean { + let seenAsterisk = false; + for (let i = 0; i < str.length; ++i) { + if (str.charCodeAt(i) === CharacterCodes.asterisk) { + if (!seenAsterisk) { + seenAsterisk = true; + } + else { + // have already seen asterisk + return false; + } + } + } + return true; + } + export function classicNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { // module names that contain '!' are used to reference resources and are not resolved to actual files on disk @@ -997,6 +1211,47 @@ namespace ts { } } + if (options.moduleResolution === ModuleResolutionKind.BaseUrl) { + if (options.baseUrl === undefined && options.inferredBaseUrl === undefined) { + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.moduleResolution_kind_baseUrl_cannot_be_used_without_specifying_baseUrl_option)); + } + } + else if (options.moduleResolution === undefined) { + // if module resolution kind is not specified it is an error to have baseUrl\paths\rootDirs and module === CommonJs + // since the former one implies moduleResolutionKind to be BaseUrl and the latter one - Node + if (options.module === ModuleKind.CommonJS && (options.baseUrl || options.paths || options.rootDirs)) { + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Module_resolution_kind_cannot_be_determined_automatically_Please_specify_module_resolution_explicitly_via_moduleResolution_option)); + } + } + else { + // here it is known that moduleResolution is not baseurl and is not undefined + if (options.baseUrl !== undefined) { + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_0_can_only_be_used_when_option_moduleResolution_is_baseUrl, "baseUrl")); + } + if (options.paths) { + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_0_can_only_be_used_when_option_moduleResolution_is_baseUrl, "paths")); + } + if (options.rootDirs) { + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_0_can_only_be_used_when_option_moduleResolution_is_baseUrl, "rootDirs")); + } + } + + if (options.paths) { + for (const key in options.paths) { + if (!hasProperty(options.paths, key)) { + continue; + } + if (!hasZeroOrOneAsteriskCharacter(key)) { + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Pattern_0_can_have_at_most_one_Asterisk_character, key)); + } + for (const subst of options.paths[key]) { + if (!hasZeroOrOneAsteriskCharacter(subst)) { + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Substitution_0_in_pattern_1_in_can_have_at_most_one_Asterisk_character, subst, key)); + } + } + } + } + if (options.inlineSources) { if (!options.sourceMap && !options.inlineSourceMap) { programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided)); diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index f560a15dfb9..12a538156f4 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -360,7 +360,7 @@ namespace ts { sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); return; } - const configParseResult = parseJsonConfigFileContent(configObject, sys, getDirectoryPath(configFileName)); + const configParseResult = parseJsonConfigFileContent(configObject, sys, getNormalizedAbsolutePath(getDirectoryPath(configFileName), sys.getCurrentDirectory())); if (configParseResult.errors.length > 0) { reportDiagnostics(configParseResult.errors, /* compilerHost */ undefined); sys.exit(ExitStatus.DiagnosticsPresent_OutputsSkipped); @@ -723,7 +723,9 @@ namespace ts { for (const name in options) { if (hasProperty(options, name)) { - const value = options[name]; + // tsconfig only options cannot be specified via command line, + // so we can assume that only types that can appear here string | number | boolean + const value = options[name]; switch (name) { case "init": case "watch": diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 34be02c5ba5..3cedb9b4123 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -2310,9 +2310,14 @@ namespace ts { export const enum ModuleResolutionKind { Classic = 1, - NodeJs = 2 + NodeJs = 2, + BaseUrl = 3 } + export type RootPaths = string[]; + export type PathSubstitutions = Map; + export type TsConfigOnlyOptions = RootPaths | PathSubstitutions; + export interface CompilerOptions { allowNonTsExtensions?: boolean; charset?: string; @@ -2360,12 +2365,17 @@ namespace ts { noImplicitReturns?: boolean; noFallthroughCasesInSwitch?: boolean; forceConsistentCasingInFileNames?: boolean; + baseUrl?: string; + paths?: PathSubstitutions; + rootDirs?: RootPaths; /* @internal */ stripInternal?: boolean; // Skip checking lib.d.ts to help speed up tests. /* @internal */ skipDefaultLibCheck?: boolean; + // inferred baseUrl - currently this will be set in 'parseJsonConfigFileContent' to 'baseDir' + /* @internal */ inferredBaseUrl?: string; - [option: string]: string | number | boolean; + [option: string]: string | number | boolean | TsConfigOnlyOptions; } export const enum ModuleKind { @@ -2425,12 +2435,13 @@ namespace ts { /* @internal */ export interface CommandLineOptionBase { name: string; - type: "string" | "number" | "boolean" | Map; // a value of a primitive type, or an object literal mapping named values to actual values + type: "string" | "number" | "boolean" | "object" | Map; // a value of a primitive type, or an object literal mapping named values to actual values isFilePath?: boolean; // True if option value is a path or fileName shortName?: string; // A short mnemonic for convenience - for instance, 'h' can be used in place of 'help' description?: DiagnosticMessage; // The message describing what the command line switch does paramType?: DiagnosticMessage; // The name to be used for a non-boolean option's parameter experimental?: boolean; + isTSConfigOnly?: boolean; // True if option can only be specified via tsconfig.json file } /* @internal */ @@ -2445,7 +2456,12 @@ namespace ts { } /* @internal */ - export type CommandLineOption = CommandLineOptionOfCustomType | CommandLineOptionOfPrimitiveType; + export interface TsConfigOnlyOption extends CommandLineOptionBase { + type: "object"; + } + + /* @internal */ + export type CommandLineOption = CommandLineOptionOfCustomType | CommandLineOptionOfPrimitiveType | TsConfigOnlyOption; /* @internal */ export const enum CharacterCodes { diff --git a/src/harness/compilerRunner.ts b/src/harness/compilerRunner.ts index 425fa888013..53e740db336 100644 --- a/src/harness/compilerRunner.ts +++ b/src/harness/compilerRunner.ts @@ -49,7 +49,6 @@ class CompilerBaselineRunner extends RunnerBase { // Mocha holds onto the closure environment of the describe callback even after the test is done. // Everything declared here should be cleared out in the "after" callback. let justName: string; - let lastUnit: Harness.TestCaseParser.TestUnitData; let harnessSettings: Harness.TestCaseParser.CompilerSettings; @@ -63,16 +62,30 @@ class CompilerBaselineRunner extends RunnerBase { before(() => { justName = fileName.replace(/^.*[\\\/]/, ""); // strips the fileName from the path. const content = Harness.IO.readFile(fileName); - const testCaseContent = Harness.TestCaseParser.makeUnitsFromTest(content, fileName); + const rootDir = fileName.indexOf("conformance") === -1 ? "tests/cases/compiler/" : ts.getDirectoryPath(fileName) + "/"; + const testCaseContent = Harness.TestCaseParser.makeUnitsFromTest(content, fileName, rootDir); const units = testCaseContent.testUnitData; harnessSettings = testCaseContent.settings; + let tsConfigOptions: ts.CompilerOptions; + if (testCaseContent.tsConfig) { + assert.equal(testCaseContent.tsConfig.fileNames.length, 0, `list of files in tsconfig is not currently supported`); + + tsConfigOptions = ts.clone(testCaseContent.tsConfig.options); + } + else { + const baseUrl = harnessSettings["baseUrl"]; + if (baseUrl !== undefined && !ts.isRootedDiskPath(baseUrl)) { + harnessSettings["baseUrl"] = ts.getNormalizedAbsolutePath(baseUrl, rootDir); + } + } + lastUnit = units[units.length - 1]; - const rootDir = lastUnit.originalFilePath.indexOf("conformance") === -1 ? "tests/cases/compiler/" : lastUnit.originalFilePath.substring(0, lastUnit.originalFilePath.lastIndexOf("/")) + "/"; // We need to assemble the list of input files for the compiler and other related files on the 'filesystem' (ie in a multi-file test) // If the last file in a test uses require or a triple slash reference we'll assume all other files will be brought in via references, // otherwise, assume all files are just meant to be in the same compilation session without explicit references to one another. toBeCompiled = []; otherFiles = []; + if (/require\(/.test(lastUnit.content) || /reference\spath/.test(lastUnit.content)) { toBeCompiled.push({ unitName: this.makeUnitName(lastUnit.name, rootDir), content: lastUnit.content }); units.forEach(unit => { @@ -88,7 +101,7 @@ class CompilerBaselineRunner extends RunnerBase { } const output = Harness.Compiler.compileFiles( - toBeCompiled, otherFiles, harnessSettings, /* options */ undefined, /* currentDirectory */ undefined); + toBeCompiled, otherFiles, harnessSettings, /*options*/ tsConfigOptions, /*currentDirectory*/ undefined); options = output.options; result = output.result; diff --git a/src/harness/harness.ts b/src/harness/harness.ts index ef0f2678e29..183852ad516 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -1000,6 +1000,9 @@ namespace Harness { if (options.useCaseSensitiveFileNames !== undefined) { useCaseSensitiveFileNames = options.useCaseSensitiveFileNames; } + if (options.inferredBaseUrl) { + options.inferredBaseUrl = ts.getNormalizedAbsolutePath(options.inferredBaseUrl, currentDirectory); + } const programFiles: TestFile[] = inputFiles.slice(); // Files from built\local that are requested by test "@includeBuiltFiles" to be in the context. @@ -1372,7 +1375,7 @@ namespace Harness { } /** Given a test file containing // @FileName directives, return an array of named units of code to be added to an existing compiler instance */ - export function makeUnitsFromTest(code: string, fileName: string): { settings: CompilerSettings; testUnitData: TestUnitData[]; } { + export function makeUnitsFromTest(code: string, fileName: string, rootDir?: string): { settings: CompilerSettings; testUnitData: TestUnitData[]; tsConfig: ts.ParsedCommandLine } { const settings = extractCompilerSettings(code); // List of all the subfiles we've parsed out @@ -1450,7 +1453,31 @@ namespace Harness { }; testUnitData.push(newTestFile2); - return { settings, testUnitData }; + // unit tests always list files explicitly + const parseConfigHost: ts.ParseConfigHost = { + readDirectory: (name) => [] + }; + + // check if project has tsconfig.json in the list of files + let tsConfig: ts.ParsedCommandLine; + for (let i = 0; i < testUnitData.length; ++i) { + const data = testUnitData[i]; + if (ts.getBaseFileName(data.name).toLowerCase() === "tsconfig.json") { + const configJson = ts.parseConfigFileTextToJson(data.name, data.content); + assert.isTrue(configJson.config !== undefined); + let baseDir = ts.normalizePath(ts.getDirectoryPath(data.name)); + if (rootDir) { + baseDir = ts.getNormalizedAbsolutePath(baseDir, rootDir); + } + tsConfig = ts.parseJsonConfigFileContent(configJson.config, parseConfigHost, baseDir); + + // delete entry from the list + testUnitData.splice(i, 1); + + break; + } + } + return { settings, testUnitData, tsConfig }; } } diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution1.js b/tests/baselines/reference/pathMappingBasedModuleResolution1.js new file mode 100644 index 00000000000..3a30893b5d1 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution1.js @@ -0,0 +1,27 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution1.ts] //// + +//// [file1.ts] + +// user defined base url + +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +//// [file2.ts] +export {x} from "./file3" + +//// [file3.ts] +export var x = 1; + +//// [file3.js] +exports.x = 1; +//// [file2.js] +var file3_1 = require("./file3"); +exports.x = file3_1.x; +//// [file1.js] +// user defined base url +var file2_1 = require("folder2/file2"); +use(file2_1.x.toExponential()); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution1.symbols new file mode 100644 index 00000000000..377cd6a86dc --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution1.symbols @@ -0,0 +1,25 @@ +=== tests/cases/compiler/root/folder1/file1.ts === + +// user defined base url + +import {x} from "folder2/file2" +>x : Symbol(x, Decl(file1.ts, 3, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 3, 31)) +>a : Symbol(a, Decl(file1.ts, 5, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 31)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 3, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== tests/cases/compiler/root/folder2/file2.ts === +export {x} from "./file3" +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== tests/cases/compiler/root/folder2/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution1.types b/tests/baselines/reference/pathMappingBasedModuleResolution1.types new file mode 100644 index 00000000000..68fc42a28f2 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution1.types @@ -0,0 +1,28 @@ +=== tests/cases/compiler/root/folder1/file1.ts === + +// user defined base url + +import {x} from "folder2/file2" +>x : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== tests/cases/compiler/root/folder2/file2.ts === +export {x} from "./file3" +>x : number + +=== tests/cases/compiler/root/folder2/file3.ts === +export var x = 1; +>x : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10.js b/tests/baselines/reference/pathMappingBasedModuleResolution10.js new file mode 100644 index 00000000000..0961ff87048 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10.js @@ -0,0 +1,34 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution10.ts] //// + +//// [file1.ts] +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' + +export var z = x.toExponential(); + +//// [file2.ts] +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' + +//// [file3.ts] +export var x = 1; + +//// [file3.ts] +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +let z = y.toLowerCase(); + + +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports", "folder1/file3"], function (require, exports, file3_1) { + exports.x = file3_1.x; // should be resolved to 'folder1/file3.ts' +}); +//// [file1.js] +define(["require", "exports", "./file2"], function (require, exports, file2_1) { + exports.z = file2_1.x.toExponential(); +}); +//// [file3.js] +define(["require", "exports", "../folder1/file1"], function (require, exports, file1_1) { + var z = file1_1.z.toLowerCase(); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution10.symbols new file mode 100644 index 00000000000..e01d12fc7e3 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10.symbols @@ -0,0 +1,29 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +export var z = x.toExponential(); +>z : Symbol(z, Decl(file1.ts, 2, 10)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== tests/cases/compiler/root/generated/folder1/file2.ts === +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== tests/cases/compiler/root/folder1/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + +=== tests/cases/compiler/root/generated/folder2/file3.ts === +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +>z : Symbol(y, Decl(file3.ts, 0, 8)) +>y : Symbol(y, Decl(file3.ts, 0, 8)) + +let z = y.toLowerCase(); +>z : Symbol(z, Decl(file3.ts, 1, 3)) +>y.toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file3.ts, 0, 8)) +>toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, --, --)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10.types b/tests/baselines/reference/pathMappingBasedModuleResolution10.types new file mode 100644 index 00000000000..ac3caa8b532 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10.types @@ -0,0 +1,32 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' +>x : number + +export var z = x.toExponential(); +>z : string +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== tests/cases/compiler/root/generated/folder1/file2.ts === +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' +>x : number + +=== tests/cases/compiler/root/folder1/file3.ts === +export var x = 1; +>x : number +>1 : number + +=== tests/cases/compiler/root/generated/folder2/file3.ts === +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +>z : string +>y : string + +let z = y.toLowerCase(); +>z : string +>y.toLowerCase() : string +>y.toLowerCase : () => string +>y : string +>toLowerCase : () => string + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10_1.js b/tests/baselines/reference/pathMappingBasedModuleResolution10_1.js new file mode 100644 index 00000000000..a7aa19bc304 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10_1.js @@ -0,0 +1,34 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution10_1.ts] //// + +//// [file2.ts] +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' + +//// [file3.ts] +export var x = 1; + +//// [file3.ts] +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +let z = y.toLowerCase(); + +//// [file1.ts] +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' + +export var z = x.toExponential(); + + +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports", "folder1/file3"], function (require, exports, file3_1) { + exports.x = file3_1.x; // should be resolved to 'folder1/file3.ts' +}); +//// [file1.js] +define(["require", "exports", "./file2"], function (require, exports, file2_1) { + exports.z = file2_1.x.toExponential(); +}); +//// [file3.js] +define(["require", "exports", "../folder1/file1"], function (require, exports, file1_1) { + var z = file1_1.z.toLowerCase(); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10_1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution10_1.symbols new file mode 100644 index 00000000000..dbc1fc792d4 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10_1.symbols @@ -0,0 +1,29 @@ +=== c:/root/generated/folder1/file2.ts === +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== c:/root/folder1/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + +=== c:/root/generated/folder2/file3.ts === +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +>z : Symbol(y, Decl(file3.ts, 0, 8)) +>y : Symbol(y, Decl(file3.ts, 0, 8)) + +let z = y.toLowerCase(); +>z : Symbol(z, Decl(file3.ts, 1, 3)) +>y.toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file3.ts, 0, 8)) +>toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, --, --)) + +=== c:/root/folder1/file1.ts === +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +export var z = x.toExponential(); +>z : Symbol(z, Decl(file1.ts, 2, 10)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10_1.types b/tests/baselines/reference/pathMappingBasedModuleResolution10_1.types new file mode 100644 index 00000000000..bf617b2b1a3 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10_1.types @@ -0,0 +1,32 @@ +=== c:/root/generated/folder1/file2.ts === +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' +>x : number + +=== c:/root/folder1/file3.ts === +export var x = 1; +>x : number +>1 : number + +=== c:/root/generated/folder2/file3.ts === +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +>z : string +>y : string + +let z = y.toLowerCase(); +>z : string +>y.toLowerCase() : string +>y.toLowerCase : () => string +>y : string +>toLowerCase : () => string + +=== c:/root/folder1/file1.ts === +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' +>x : number + +export var z = x.toExponential(); +>z : string +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10_2.js b/tests/baselines/reference/pathMappingBasedModuleResolution10_2.js new file mode 100644 index 00000000000..b1e7af6d834 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10_2.js @@ -0,0 +1,34 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution10_2.ts] //// + +//// [file2.ts] +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' + +//// [file3.ts] +export var x = 1; + +//// [file3.ts] +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +let z = y.toLowerCase(); + +//// [file1.ts] +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' + +export var z = x.toExponential(); + + +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports", "folder1/file3"], function (require, exports, file3_1) { + exports.x = file3_1.x; // should be resolved to 'folder1/file3.ts' +}); +//// [file1.js] +define(["require", "exports", "./file2"], function (require, exports, file2_1) { + exports.z = file2_1.x.toExponential(); +}); +//// [file3.js] +define(["require", "exports", "../folder1/file1"], function (require, exports, file1_1) { + var z = file1_1.z.toLowerCase(); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10_2.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution10_2.symbols new file mode 100644 index 00000000000..64a308338c9 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10_2.symbols @@ -0,0 +1,29 @@ +=== c:/root/src/generated/folder1/file2.ts === +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== c:/root/src/folder1/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + +=== c:/root/src/generated/folder2/file3.ts === +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +>z : Symbol(y, Decl(file3.ts, 0, 8)) +>y : Symbol(y, Decl(file3.ts, 0, 8)) + +let z = y.toLowerCase(); +>z : Symbol(z, Decl(file3.ts, 1, 3)) +>y.toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file3.ts, 0, 8)) +>toLowerCase : Symbol(String.toLowerCase, Decl(lib.d.ts, --, --)) + +=== c:/root/src/folder1/file1.ts === +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +export var z = x.toExponential(); +>z : Symbol(z, Decl(file1.ts, 2, 10)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution10_2.types b/tests/baselines/reference/pathMappingBasedModuleResolution10_2.types new file mode 100644 index 00000000000..0fc9270c667 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution10_2.types @@ -0,0 +1,32 @@ +=== c:/root/src/generated/folder1/file2.ts === +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' +>x : number + +=== c:/root/src/folder1/file3.ts === +export var x = 1; +>x : number +>1 : number + +=== c:/root/src/generated/folder2/file3.ts === +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +>z : string +>y : string + +let z = y.toLowerCase(); +>z : string +>y.toLowerCase() : string +>y.toLowerCase : () => string +>y : string +>toLowerCase : () => string + +=== c:/root/src/folder1/file1.ts === +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' +>x : number + +export var z = x.toExponential(); +>z : string +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution1_1.js b/tests/baselines/reference/pathMappingBasedModuleResolution1_1.js new file mode 100644 index 00000000000..889eacfca51 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution1_1.js @@ -0,0 +1,27 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution1_1.ts] //// + +//// [file1.ts] + +// user defined base url + +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +//// [file2.ts] +export {x} from "./file3" + +//// [file3.ts] +export var x = 1; + +//// [file3.js] +exports.x = 1; +//// [file2.js] +var file3_1 = require("./file3"); +exports.x = file3_1.x; +//// [file1.js] +// user defined base url +var file2_1 = require("folder2/file2"); +use(file2_1.x.toExponential()); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution1_1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution1_1.symbols new file mode 100644 index 00000000000..20f69963c76 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution1_1.symbols @@ -0,0 +1,25 @@ +=== c:/root/folder1/file1.ts === + +// user defined base url + +import {x} from "folder2/file2" +>x : Symbol(x, Decl(file1.ts, 3, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 3, 31)) +>a : Symbol(a, Decl(file1.ts, 5, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 31)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 3, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/root/folder2/file2.ts === +export {x} from "./file3" +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== c:/root/folder2/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution1_1.types b/tests/baselines/reference/pathMappingBasedModuleResolution1_1.types new file mode 100644 index 00000000000..5b0727157ac --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution1_1.types @@ -0,0 +1,28 @@ +=== c:/root/folder1/file1.ts === + +// user defined base url + +import {x} from "folder2/file2" +>x : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== c:/root/folder2/file2.ts === +export {x} from "./file3" +>x : number + +=== c:/root/folder2/file3.ts === +export var x = 1; +>x : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution2.js b/tests/baselines/reference/pathMappingBasedModuleResolution2.js new file mode 100644 index 00000000000..0d32bf187fe --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution2.js @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution2.ts] //// + +//// [file1.ts] +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +//// [file2.ts] +export {x} from "./file3" + +//// [file3.ts] +export var x = 1; + +//// [file3.js] +exports.x = 1; +//// [file2.js] +var file3_1 = require("./file3"); +exports.x = file3_1.x; +//// [file1.js] +var file2_1 = require("folder2/file2"); +use(file2_1.x.toExponential()); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution2.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution2.symbols new file mode 100644 index 00000000000..94f458ff1d3 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution2.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "folder2/file2" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>a : Symbol(a, Decl(file1.ts, 2, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== tests/cases/compiler/root/folder2/file2.ts === +export {x} from "./file3" +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== tests/cases/compiler/root/folder2/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution2.types b/tests/baselines/reference/pathMappingBasedModuleResolution2.types new file mode 100644 index 00000000000..ff6ef52f321 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution2.types @@ -0,0 +1,25 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "folder2/file2" +>x : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== tests/cases/compiler/root/folder2/file2.ts === +export {x} from "./file3" +>x : number + +=== tests/cases/compiler/root/folder2/file3.ts === +export var x = 1; +>x : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution2_1.js b/tests/baselines/reference/pathMappingBasedModuleResolution2_1.js new file mode 100644 index 00000000000..5e3e3820e5c --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution2_1.js @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution2_1.ts] //// + +//// [file1.ts] +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +//// [file2.ts] +export {x} from "./file3" + +//// [file3.ts] +export var x = 1; + +//// [file3.js] +exports.x = 1; +//// [file2.js] +var file3_1 = require("./file3"); +exports.x = file3_1.x; +//// [file1.js] +var file2_1 = require("folder2/file2"); +use(file2_1.x.toExponential()); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution2_1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution2_1.symbols new file mode 100644 index 00000000000..aa84fbf8cf9 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution2_1.symbols @@ -0,0 +1,22 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file2" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>a : Symbol(a, Decl(file1.ts, 2, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/root/folder2/file2.ts === +export {x} from "./file3" +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== c:/root/folder2/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution2_1.types b/tests/baselines/reference/pathMappingBasedModuleResolution2_1.types new file mode 100644 index 00000000000..de76a17e406 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution2_1.types @@ -0,0 +1,25 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file2" +>x : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== c:/root/folder2/file2.ts === +export {x} from "./file3" +>x : number + +=== c:/root/folder2/file3.ts === +export var x = 1; +>x : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution3.js b/tests/baselines/reference/pathMappingBasedModuleResolution3.js new file mode 100644 index 00000000000..0c14be68978 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution3.js @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution3.ts] //// + +//// [file1.ts] +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +//// [file2.ts] +export {x} from "./file3" + +//// [file3.ts] +export var x = 1; + +//// [file3.js] +exports.x = 1; +//// [file2.js] +var file3_1 = require("./file3"); +exports.x = file3_1.x; +//// [file1.js] +var file2_1 = require("folder2/file2"); +use(file2_1.x.toExponential()); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution3.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution3.symbols new file mode 100644 index 00000000000..b071ecec087 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution3.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/root/src/folder1/file1.ts === +import {x} from "folder2/file2" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>a : Symbol(a, Decl(file1.ts, 2, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== tests/cases/compiler/root/src/folder2/file2.ts === +export {x} from "./file3" +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== tests/cases/compiler/root/src/folder2/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution3.types b/tests/baselines/reference/pathMappingBasedModuleResolution3.types new file mode 100644 index 00000000000..15428de5560 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution3.types @@ -0,0 +1,25 @@ +=== tests/cases/compiler/root/src/folder1/file1.ts === +import {x} from "folder2/file2" +>x : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== tests/cases/compiler/root/src/folder2/file2.ts === +export {x} from "./file3" +>x : number + +=== tests/cases/compiler/root/src/folder2/file3.ts === +export var x = 1; +>x : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution3_1.js b/tests/baselines/reference/pathMappingBasedModuleResolution3_1.js new file mode 100644 index 00000000000..ee827d8fa7d --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution3_1.js @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution3_1.ts] //// + +//// [file1.ts] +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +//// [file2.ts] +export {x} from "./file3" + +//// [file3.ts] +export var x = 1; + +//// [file3.js] +exports.x = 1; +//// [file2.js] +var file3_1 = require("./file3"); +exports.x = file3_1.x; +//// [file1.js] +var file2_1 = require("folder2/file2"); +use(file2_1.x.toExponential()); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution3_1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution3_1.symbols new file mode 100644 index 00000000000..835d16d46f4 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution3_1.symbols @@ -0,0 +1,22 @@ +=== c:/root/src/folder1/file1.ts === +import {x} from "folder2/file2" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>a : Symbol(a, Decl(file1.ts, 2, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/root/src/folder2/file2.ts === +export {x} from "./file3" +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== c:/root/src/folder2/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution3_1.types b/tests/baselines/reference/pathMappingBasedModuleResolution3_1.types new file mode 100644 index 00000000000..8db89ab12b7 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution3_1.types @@ -0,0 +1,25 @@ +=== c:/root/src/folder1/file1.ts === +import {x} from "folder2/file2" +>x : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== c:/root/src/folder2/file2.ts === +export {x} from "./file3" +>x : number + +=== c:/root/src/folder2/file3.ts === +export var x = 1; +>x : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution4.js b/tests/baselines/reference/pathMappingBasedModuleResolution4.js new file mode 100644 index 00000000000..5e66fabcd92 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution4.js @@ -0,0 +1,27 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution4.ts] //// + +//// [file1.ts] +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +//// [file2.ts] +export {x} from "./file3" + +//// [file3.ts] +export var x = 1; + +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports", "./file3"], function (require, exports, file3_1) { + exports.x = file3_1.x; +}); +//// [file1.js] +define(["require", "exports", "folder2/file2"], function (require, exports, file2_1) { + use(file2_1.x.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution4.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution4.symbols new file mode 100644 index 00000000000..b071ecec087 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution4.symbols @@ -0,0 +1,22 @@ +=== tests/cases/compiler/root/src/folder1/file1.ts === +import {x} from "folder2/file2" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>a : Symbol(a, Decl(file1.ts, 2, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== tests/cases/compiler/root/src/folder2/file2.ts === +export {x} from "./file3" +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== tests/cases/compiler/root/src/folder2/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution4.types b/tests/baselines/reference/pathMappingBasedModuleResolution4.types new file mode 100644 index 00000000000..15428de5560 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution4.types @@ -0,0 +1,25 @@ +=== tests/cases/compiler/root/src/folder1/file1.ts === +import {x} from "folder2/file2" +>x : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== tests/cases/compiler/root/src/folder2/file2.ts === +export {x} from "./file3" +>x : number + +=== tests/cases/compiler/root/src/folder2/file3.ts === +export var x = 1; +>x : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution4_1.js b/tests/baselines/reference/pathMappingBasedModuleResolution4_1.js new file mode 100644 index 00000000000..ca2afc5bc59 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution4_1.js @@ -0,0 +1,27 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution4_1.ts] //// + +//// [file1.ts] +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +//// [file2.ts] +export {x} from "./file3" + +//// [file3.ts] +export var x = 1; + +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports", "./file3"], function (require, exports, file3_1) { + exports.x = file3_1.x; +}); +//// [file1.js] +define(["require", "exports", "folder2/file2"], function (require, exports, file2_1) { + use(file2_1.x.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution4_1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution4_1.symbols new file mode 100644 index 00000000000..835d16d46f4 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution4_1.symbols @@ -0,0 +1,22 @@ +=== c:/root/src/folder1/file1.ts === +import {x} from "folder2/file2" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>a : Symbol(a, Decl(file1.ts, 2, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 0, 31)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/root/src/folder2/file2.ts === +export {x} from "./file3" +>x : Symbol(x, Decl(file2.ts, 0, 8)) + +=== c:/root/src/folder2/file3.ts === +export var x = 1; +>x : Symbol(x, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution4_1.types b/tests/baselines/reference/pathMappingBasedModuleResolution4_1.types new file mode 100644 index 00000000000..8db89ab12b7 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution4_1.types @@ -0,0 +1,25 @@ +=== c:/root/src/folder1/file1.ts === +import {x} from "folder2/file2" +>x : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +=== c:/root/src/folder2/file2.ts === +export {x} from "./file3" +>x : number + +=== c:/root/src/folder2/file3.ts === +export var x = 1; +>x : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution5.errors.txt b/tests/baselines/reference/pathMappingBasedModuleResolution5.errors.txt new file mode 100644 index 00000000000..71dd19b48f2 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution5.errors.txt @@ -0,0 +1,6 @@ +error TS5059: Module resolution kind cannot be determined automatically. Please specify module resolution explicitly via 'moduleResolution' option. + + +!!! error TS5059: Module resolution kind cannot be determined automatically. Please specify module resolution explicitly via 'moduleResolution' option. +==== tests/cases/compiler/root/src/folder1/file1.ts (0 errors) ==== + export var x = 1; \ No newline at end of file diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution5.js b/tests/baselines/reference/pathMappingBasedModuleResolution5.js new file mode 100644 index 00000000000..66783980a0a --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution5.js @@ -0,0 +1,5 @@ +//// [file1.ts] +export var x = 1; + +//// [file1.js] +exports.x = 1; diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution6.errors.txt b/tests/baselines/reference/pathMappingBasedModuleResolution6.errors.txt new file mode 100644 index 00000000000..8b5760eaf60 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution6.errors.txt @@ -0,0 +1,8 @@ +error TS5056: Pattern '*1*' can have at most one '*' character +error TS5057: Substitution '*2*' in pattern '*1*' in can have at most one '*' character + + +!!! error TS5056: Pattern '*1*' can have at most one '*' character +!!! error TS5057: Substitution '*2*' in pattern '*1*' in can have at most one '*' character +==== tests/cases/compiler/root/src/folder1/file1.ts (0 errors) ==== + export var x = 1; \ No newline at end of file diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution6.js b/tests/baselines/reference/pathMappingBasedModuleResolution6.js new file mode 100644 index 00000000000..871b60535f1 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution6.js @@ -0,0 +1,7 @@ +//// [file1.ts] +export var x = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7.js b/tests/baselines/reference/pathMappingBasedModuleResolution7.js new file mode 100644 index 00000000000..292d0854fe3 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7.js @@ -0,0 +1,40 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution7.ts] //// + +//// [file1.ts] +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); + +//// [file1.ts] +export var x = 1; + +//// [file2.ts] +export var y = 1; + +//// [file3.ts] +export var z = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports"], function (require, exports) { + exports.y = 1; +}); +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.z = 1; +}); +//// [file1.js] +define(["require", "exports", "folder2/file1", "folder3/file2", "components/file3"], function (require, exports, file1_1, file2_1, file3_1) { + use(file1_1.x.toExponential()); + use(file2_1.y.toExponential()); + use(file3_1.z.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution7.symbols new file mode 100644 index 00000000000..4b7b9c15739 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7.symbols @@ -0,0 +1,44 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +import {y} from "folder3/file2" +>y : Symbol(y, Decl(file1.ts, 1, 8)) + +import {z} from "components/file3" +>z : Symbol(z, Decl(file1.ts, 2, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>a : Symbol(a, Decl(file1.ts, 4, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(y.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>y.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file1.ts, 1, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>z.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z : Symbol(z, Decl(file1.ts, 2, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== tests/cases/compiler/root/folder2/file1.ts === +export var x = 1; +>x : Symbol(x, Decl(file1.ts, 0, 10)) + +=== tests/cases/compiler/root/generated/folder3/file2.ts === +export var y = 1; +>y : Symbol(y, Decl(file2.ts, 0, 10)) + +=== tests/cases/compiler/root/shared/components/file3.ts === +export var z = 1; +>z : Symbol(z, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7.types b/tests/baselines/reference/pathMappingBasedModuleResolution7.types new file mode 100644 index 00000000000..1bc1622b19f --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7.types @@ -0,0 +1,53 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : number + +import {y} from "folder3/file2" +>y : number + +import {z} from "components/file3" +>z : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +use(y.toExponential()); +>use(y.toExponential()) : void +>use : (a: any) => void +>y.toExponential() : string +>y.toExponential : (fractionDigits?: number) => string +>y : number +>toExponential : (fractionDigits?: number) => string + +use(z.toExponential()); +>use(z.toExponential()) : void +>use : (a: any) => void +>z.toExponential() : string +>z.toExponential : (fractionDigits?: number) => string +>z : number +>toExponential : (fractionDigits?: number) => string + +=== tests/cases/compiler/root/folder2/file1.ts === +export var x = 1; +>x : number +>1 : number + +=== tests/cases/compiler/root/generated/folder3/file2.ts === +export var y = 1; +>y : number +>1 : number + +=== tests/cases/compiler/root/shared/components/file3.ts === +export var z = 1; +>z : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7_1.js b/tests/baselines/reference/pathMappingBasedModuleResolution7_1.js new file mode 100644 index 00000000000..6a384e27c43 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7_1.js @@ -0,0 +1,40 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution7_1.ts] //// + +//// [file1.ts] +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); + +//// [file1.ts] +export var x = 1; + +//// [file2.ts] +export var y = 1; + +//// [file3.ts] +export var z = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports"], function (require, exports) { + exports.y = 1; +}); +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.z = 1; +}); +//// [file1.js] +define(["require", "exports", "folder2/file1", "folder3/file2", "components/file3"], function (require, exports, file1_1, file2_1, file3_1) { + use(file1_1.x.toExponential()); + use(file2_1.y.toExponential()); + use(file3_1.z.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7_1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution7_1.symbols new file mode 100644 index 00000000000..097f0747b47 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7_1.symbols @@ -0,0 +1,44 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +import {y} from "folder3/file2" +>y : Symbol(y, Decl(file1.ts, 1, 8)) + +import {z} from "components/file3" +>z : Symbol(z, Decl(file1.ts, 2, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>a : Symbol(a, Decl(file1.ts, 4, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(y.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>y.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file1.ts, 1, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>z.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z : Symbol(z, Decl(file1.ts, 2, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/root/folder2/file1.ts === +export var x = 1; +>x : Symbol(x, Decl(file1.ts, 0, 10)) + +=== c:/root/generated/folder3/file2.ts === +export var y = 1; +>y : Symbol(y, Decl(file2.ts, 0, 10)) + +=== c:/root/shared/components/file3.ts === +export var z = 1; +>z : Symbol(z, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7_1.types b/tests/baselines/reference/pathMappingBasedModuleResolution7_1.types new file mode 100644 index 00000000000..9cc451eaa3b --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7_1.types @@ -0,0 +1,53 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : number + +import {y} from "folder3/file2" +>y : number + +import {z} from "components/file3" +>z : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +use(y.toExponential()); +>use(y.toExponential()) : void +>use : (a: any) => void +>y.toExponential() : string +>y.toExponential : (fractionDigits?: number) => string +>y : number +>toExponential : (fractionDigits?: number) => string + +use(z.toExponential()); +>use(z.toExponential()) : void +>use : (a: any) => void +>z.toExponential() : string +>z.toExponential : (fractionDigits?: number) => string +>z : number +>toExponential : (fractionDigits?: number) => string + +=== c:/root/folder2/file1.ts === +export var x = 1; +>x : number +>1 : number + +=== c:/root/generated/folder3/file2.ts === +export var y = 1; +>y : number +>1 : number + +=== c:/root/shared/components/file3.ts === +export var z = 1; +>z : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7_2.js b/tests/baselines/reference/pathMappingBasedModuleResolution7_2.js new file mode 100644 index 00000000000..123fc1f9658 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7_2.js @@ -0,0 +1,50 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution7_2.ts] //// + +//// [file1.ts] +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" +import {z1} from "file4" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); +use(z1.toExponential()); + +//// [file1.ts] +export var x = 1; + +//// [file2.ts] +export var y = 1; + +//// [file3.ts] +export var z = 1; + +//// [file4.ts] +export var z1 = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports"], function (require, exports) { + exports.y = 1; +}); +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.z = 1; +}); +//// [file4.js] +define(["require", "exports"], function (require, exports) { + exports.z1 = 1; +}); +//// [file1.js] +define(["require", "exports", "folder2/file1", "folder3/file2", "components/file3", "file4"], function (require, exports, file1_1, file2_1, file3_1, file4_1) { + use(file1_1.x.toExponential()); + use(file2_1.y.toExponential()); + use(file3_1.z.toExponential()); + use(file4_1.z1.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7_2.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution7_2.symbols new file mode 100644 index 00000000000..a974a238200 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7_2.symbols @@ -0,0 +1,57 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +import {y} from "folder3/file2" +>y : Symbol(y, Decl(file1.ts, 1, 8)) + +import {z} from "components/file3" +>z : Symbol(z, Decl(file1.ts, 2, 8)) + +import {z1} from "file4" +>z1 : Symbol(z1, Decl(file1.ts, 3, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>a : Symbol(a, Decl(file1.ts, 5, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(y.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>y.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file1.ts, 1, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>z.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z : Symbol(z, Decl(file1.ts, 2, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z1.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>z1.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z1 : Symbol(z1, Decl(file1.ts, 3, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/root/folder2/file1.ts === +export var x = 1; +>x : Symbol(x, Decl(file1.ts, 0, 10)) + +=== c:/root/generated/folder3/file2.ts === +export var y = 1; +>y : Symbol(y, Decl(file2.ts, 0, 10)) + +=== c:/root/shared/components/file3.ts === +export var z = 1; +>z : Symbol(z, Decl(file3.ts, 0, 10)) + +=== c:/sharedrepo/file4.ts === +export var z1 = 1; +>z1 : Symbol(z1, Decl(file4.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution7_2.types b/tests/baselines/reference/pathMappingBasedModuleResolution7_2.types new file mode 100644 index 00000000000..9a88412b623 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution7_2.types @@ -0,0 +1,69 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : number + +import {y} from "folder3/file2" +>y : number + +import {z} from "components/file3" +>z : number + +import {z1} from "file4" +>z1 : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +use(y.toExponential()); +>use(y.toExponential()) : void +>use : (a: any) => void +>y.toExponential() : string +>y.toExponential : (fractionDigits?: number) => string +>y : number +>toExponential : (fractionDigits?: number) => string + +use(z.toExponential()); +>use(z.toExponential()) : void +>use : (a: any) => void +>z.toExponential() : string +>z.toExponential : (fractionDigits?: number) => string +>z : number +>toExponential : (fractionDigits?: number) => string + +use(z1.toExponential()); +>use(z1.toExponential()) : void +>use : (a: any) => void +>z1.toExponential() : string +>z1.toExponential : (fractionDigits?: number) => string +>z1 : number +>toExponential : (fractionDigits?: number) => string + +=== c:/root/folder2/file1.ts === +export var x = 1; +>x : number +>1 : number + +=== c:/root/generated/folder3/file2.ts === +export var y = 1; +>y : number +>1 : number + +=== c:/root/shared/components/file3.ts === +export var z = 1; +>z : number +>1 : number + +=== c:/sharedrepo/file4.ts === +export var z1 = 1; +>z1 : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution8.js b/tests/baselines/reference/pathMappingBasedModuleResolution8.js new file mode 100644 index 00000000000..99c3a4932c7 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution8.js @@ -0,0 +1,40 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution8.ts] //// + +//// [file1.ts] +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); + +//// [file1.ts] +export var x = 1; + +//// [file2.ts] +export var y = 1; + +//// [file3.ts] +export var z = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports"], function (require, exports) { + exports.y = 1; +}); +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.z = 1; +}); +//// [file1.js] +define(["require", "exports", "folder2/file1", "folder3/file2", "components/file3"], function (require, exports, file1_1, file2_1, file3_1) { + use(file1_1.x.toExponential()); + use(file2_1.y.toExponential()); + use(file3_1.z.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution8.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution8.symbols new file mode 100644 index 00000000000..214b1d30ba8 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution8.symbols @@ -0,0 +1,44 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +import {y} from "folder3/file2" +>y : Symbol(y, Decl(file1.ts, 1, 8)) + +import {z} from "components/file3" +>z : Symbol(z, Decl(file1.ts, 2, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>a : Symbol(a, Decl(file1.ts, 4, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(y.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>y.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file1.ts, 1, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>z.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z : Symbol(z, Decl(file1.ts, 2, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== tests/cases/compiler/root/src/folder2/file1.ts === +export var x = 1; +>x : Symbol(x, Decl(file1.ts, 0, 10)) + +=== tests/cases/compiler/root/src/generated/folder3/file2.ts === +export var y = 1; +>y : Symbol(y, Decl(file2.ts, 0, 10)) + +=== tests/cases/compiler/root/src/shared/components/file3.ts === +export var z = 1; +>z : Symbol(z, Decl(file3.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution8.types b/tests/baselines/reference/pathMappingBasedModuleResolution8.types new file mode 100644 index 00000000000..5938d95ee03 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution8.types @@ -0,0 +1,53 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : number + +import {y} from "folder3/file2" +>y : number + +import {z} from "components/file3" +>z : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +use(y.toExponential()); +>use(y.toExponential()) : void +>use : (a: any) => void +>y.toExponential() : string +>y.toExponential : (fractionDigits?: number) => string +>y : number +>toExponential : (fractionDigits?: number) => string + +use(z.toExponential()); +>use(z.toExponential()) : void +>use : (a: any) => void +>z.toExponential() : string +>z.toExponential : (fractionDigits?: number) => string +>z : number +>toExponential : (fractionDigits?: number) => string + +=== tests/cases/compiler/root/src/folder2/file1.ts === +export var x = 1; +>x : number +>1 : number + +=== tests/cases/compiler/root/src/generated/folder3/file2.ts === +export var y = 1; +>y : number +>1 : number + +=== tests/cases/compiler/root/src/shared/components/file3.ts === +export var z = 1; +>z : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution8_1.js b/tests/baselines/reference/pathMappingBasedModuleResolution8_1.js new file mode 100644 index 00000000000..ca3a1f8c388 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution8_1.js @@ -0,0 +1,50 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution8_1.ts] //// + +//// [file1.ts] +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" +import {z1} from "file4" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); +use(z1.toExponential()); + +//// [file1.ts] +export var x = 1; + +//// [file2.ts] +export var y = 1; + +//// [file3.ts] +export var z = 1; + +//// [file4.ts] +export var z1 = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports"], function (require, exports) { + exports.y = 1; +}); +//// [file3.js] +define(["require", "exports"], function (require, exports) { + exports.z = 1; +}); +//// [file4.js] +define(["require", "exports"], function (require, exports) { + exports.z1 = 1; +}); +//// [file1.js] +define(["require", "exports", "folder2/file1", "folder3/file2", "components/file3", "file4"], function (require, exports, file1_1, file2_1, file3_1, file4_1) { + use(file1_1.x.toExponential()); + use(file2_1.y.toExponential()); + use(file3_1.z.toExponential()); + use(file4_1.z1.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution8_1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution8_1.symbols new file mode 100644 index 00000000000..553112dde95 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution8_1.symbols @@ -0,0 +1,57 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +import {y} from "folder3/file2" +>y : Symbol(y, Decl(file1.ts, 1, 8)) + +import {z} from "components/file3" +>z : Symbol(z, Decl(file1.ts, 2, 8)) + +import {z1} from "file4" +>z1 : Symbol(z1, Decl(file1.ts, 3, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>a : Symbol(a, Decl(file1.ts, 5, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(y.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>y.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file1.ts, 1, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>z.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z : Symbol(z, Decl(file1.ts, 2, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z1.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 24)) +>z1.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z1 : Symbol(z1, Decl(file1.ts, 3, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/root/src/folder2/file1.ts === +export var x = 1; +>x : Symbol(x, Decl(file1.ts, 0, 10)) + +=== c:/root/src/generated/folder3/file2.ts === +export var y = 1; +>y : Symbol(y, Decl(file2.ts, 0, 10)) + +=== c:/root/src/shared/components/file3.ts === +export var z = 1; +>z : Symbol(z, Decl(file3.ts, 0, 10)) + +=== c:/sharedrepo/file4.ts === +export var z1 = 1; +>z1 : Symbol(z1, Decl(file4.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution8_1.types b/tests/baselines/reference/pathMappingBasedModuleResolution8_1.types new file mode 100644 index 00000000000..61da62d4ee6 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution8_1.types @@ -0,0 +1,69 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : number + +import {y} from "folder3/file2" +>y : number + +import {z} from "components/file3" +>z : number + +import {z1} from "file4" +>z1 : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +use(y.toExponential()); +>use(y.toExponential()) : void +>use : (a: any) => void +>y.toExponential() : string +>y.toExponential : (fractionDigits?: number) => string +>y : number +>toExponential : (fractionDigits?: number) => string + +use(z.toExponential()); +>use(z.toExponential()) : void +>use : (a: any) => void +>z.toExponential() : string +>z.toExponential : (fractionDigits?: number) => string +>z : number +>toExponential : (fractionDigits?: number) => string + +use(z1.toExponential()); +>use(z1.toExponential()) : void +>use : (a: any) => void +>z1.toExponential() : string +>z1.toExponential : (fractionDigits?: number) => string +>z1 : number +>toExponential : (fractionDigits?: number) => string + +=== c:/root/src/folder2/file1.ts === +export var x = 1; +>x : number +>1 : number + +=== c:/root/src/generated/folder3/file2.ts === +export var y = 1; +>y : number +>1 : number + +=== c:/root/src/shared/components/file3.ts === +export var z = 1; +>z : number +>1 : number + +=== c:/sharedrepo/file4.ts === +export var z1 = 1; +>z1 : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9.js b/tests/baselines/reference/pathMappingBasedModuleResolution9.js new file mode 100644 index 00000000000..8611ed02a90 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9.js @@ -0,0 +1,47 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution9.ts] //// + +//// [file1.ts] +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); + +//// [file1.ts] +export var x = 1; + +//// [file2.ts] +export var y = 1; + +//// [file3.ts] +export {z} from "./file4" + +//// [file4.ts] +export var z = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports"], function (require, exports) { + exports.y = 1; +}); +//// [file4.js] +define(["require", "exports"], function (require, exports) { + exports.z = 1; +}); +//// [file3.js] +define(["require", "exports", "./file4"], function (require, exports, file4_1) { + exports.z = file4_1.z; +}); +//// [file1.js] +define(["require", "exports", "folder2/file1", "folder3/file2", "components/file3"], function (require, exports, file1_1, file2_1, file3_1) { + use(file1_1.x.toExponential()); + use(file2_1.y.toExponential()); + use(file3_1.z.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution9.symbols new file mode 100644 index 00000000000..764f878b293 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9.symbols @@ -0,0 +1,48 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +import {y} from "folder3/file2" +>y : Symbol(y, Decl(file1.ts, 1, 8)) + +import {z} from "components/file3" +>z : Symbol(z, Decl(file1.ts, 2, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>a : Symbol(a, Decl(file1.ts, 4, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(y.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>y.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file1.ts, 1, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z.toExponential()); +>use : Symbol(use, Decl(file1.ts, 2, 34)) +>z.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z : Symbol(z, Decl(file1.ts, 2, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== tests/cases/compiler/root/src/folder2/file1.ts === +export var x = 1; +>x : Symbol(x, Decl(file1.ts, 0, 10)) + +=== tests/cases/compiler/root/src/generated/folder3/file2.ts === +export var y = 1; +>y : Symbol(y, Decl(file2.ts, 0, 10)) + +=== tests/cases/compiler/root/src/shared/components/file3.ts === +export {z} from "./file4" +>z : Symbol(z, Decl(file3.ts, 0, 8)) + +=== tests/cases/compiler/root/src/shared/components/file4.ts === +export var z = 1; +>z : Symbol(z, Decl(file4.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9.types b/tests/baselines/reference/pathMappingBasedModuleResolution9.types new file mode 100644 index 00000000000..789e8d050b1 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9.types @@ -0,0 +1,57 @@ +=== tests/cases/compiler/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : number + +import {y} from "folder3/file2" +>y : number + +import {z} from "components/file3" +>z : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +use(y.toExponential()); +>use(y.toExponential()) : void +>use : (a: any) => void +>y.toExponential() : string +>y.toExponential : (fractionDigits?: number) => string +>y : number +>toExponential : (fractionDigits?: number) => string + +use(z.toExponential()); +>use(z.toExponential()) : void +>use : (a: any) => void +>z.toExponential() : string +>z.toExponential : (fractionDigits?: number) => string +>z : number +>toExponential : (fractionDigits?: number) => string + +=== tests/cases/compiler/root/src/folder2/file1.ts === +export var x = 1; +>x : number +>1 : number + +=== tests/cases/compiler/root/src/generated/folder3/file2.ts === +export var y = 1; +>y : number +>1 : number + +=== tests/cases/compiler/root/src/shared/components/file3.ts === +export {z} from "./file4" +>z : number + +=== tests/cases/compiler/root/src/shared/components/file4.ts === +export var z = 1; +>z : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9_1.js b/tests/baselines/reference/pathMappingBasedModuleResolution9_1.js new file mode 100644 index 00000000000..a7b6dbc0ec2 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9_1.js @@ -0,0 +1,57 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution9_1.ts] //// + +//// [file1.ts] +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" +import {z1} from "my/file4" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); +use(z1.toExponential()); + +//// [file1.ts] +export var x = 1; + +//// [file2.ts] +export var y = 1; + +//// [file3.ts] +export {z} from "./file4" + +//// [file4.ts] +export var z = 1; + +//// [file4.ts] +export var z1 = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports"], function (require, exports) { + exports.y = 1; +}); +//// [file4.js] +define(["require", "exports"], function (require, exports) { + exports.z = 1; +}); +//// [file3.js] +define(["require", "exports", "./file4"], function (require, exports, file4_1) { + exports.z = file4_1.z; +}); +//// [file4.js] +define(["require", "exports"], function (require, exports) { + exports.z1 = 1; +}); +//// [file1.js] +define(["require", "exports", "folder2/file1", "folder3/file2", "components/file3", "my/file4"], function (require, exports, file1_1, file2_1, file3_1, file4_1) { + use(file1_1.x.toExponential()); + use(file2_1.y.toExponential()); + use(file3_1.z.toExponential()); + use(file4_1.z1.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9_1.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution9_1.symbols new file mode 100644 index 00000000000..6f244cf026e --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9_1.symbols @@ -0,0 +1,61 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +import {y} from "folder3/file2" +>y : Symbol(y, Decl(file1.ts, 1, 8)) + +import {z} from "components/file3" +>z : Symbol(z, Decl(file1.ts, 2, 8)) + +import {z1} from "my/file4" +>z1 : Symbol(z1, Decl(file1.ts, 3, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>a : Symbol(a, Decl(file1.ts, 5, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(y.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>y.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file1.ts, 1, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>z.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z : Symbol(z, Decl(file1.ts, 2, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z1.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>z1.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z1 : Symbol(z1, Decl(file1.ts, 3, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/root/src/folder2/file1.ts === +export var x = 1; +>x : Symbol(x, Decl(file1.ts, 0, 10)) + +=== c:/root/src/generated/folder3/file2.ts === +export var y = 1; +>y : Symbol(y, Decl(file2.ts, 0, 10)) + +=== c:/root/src/shared/components/file3.ts === +export {z} from "./file4" +>z : Symbol(z, Decl(file3.ts, 0, 8)) + +=== c:/root/src/shared/components/file4.ts === +export var z = 1; +>z : Symbol(z, Decl(file4.ts, 0, 10)) + +=== c:/sharedrepo/my/file4.ts === +export var z1 = 1; +>z1 : Symbol(z1, Decl(file4.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9_1.types b/tests/baselines/reference/pathMappingBasedModuleResolution9_1.types new file mode 100644 index 00000000000..24e70346d2a --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9_1.types @@ -0,0 +1,73 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : number + +import {y} from "folder3/file2" +>y : number + +import {z} from "components/file3" +>z : number + +import {z1} from "my/file4" +>z1 : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +use(y.toExponential()); +>use(y.toExponential()) : void +>use : (a: any) => void +>y.toExponential() : string +>y.toExponential : (fractionDigits?: number) => string +>y : number +>toExponential : (fractionDigits?: number) => string + +use(z.toExponential()); +>use(z.toExponential()) : void +>use : (a: any) => void +>z.toExponential() : string +>z.toExponential : (fractionDigits?: number) => string +>z : number +>toExponential : (fractionDigits?: number) => string + +use(z1.toExponential()); +>use(z1.toExponential()) : void +>use : (a: any) => void +>z1.toExponential() : string +>z1.toExponential : (fractionDigits?: number) => string +>z1 : number +>toExponential : (fractionDigits?: number) => string + +=== c:/root/src/folder2/file1.ts === +export var x = 1; +>x : number +>1 : number + +=== c:/root/src/generated/folder3/file2.ts === +export var y = 1; +>y : number +>1 : number + +=== c:/root/src/shared/components/file3.ts === +export {z} from "./file4" +>z : number + +=== c:/root/src/shared/components/file4.ts === +export var z = 1; +>z : number +>1 : number + +=== c:/sharedrepo/my/file4.ts === +export var z1 = 1; +>z1 : number +>1 : number + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9_2.js b/tests/baselines/reference/pathMappingBasedModuleResolution9_2.js new file mode 100644 index 00000000000..375c151f3e2 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9_2.js @@ -0,0 +1,57 @@ +//// [tests/cases/compiler/pathMappingBasedModuleResolution9_2.ts] //// + +//// [file1.ts] +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" +import {z1} from "my/file4" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); +use(z1.toExponential()); + +//// [file1.ts] +export var x = 1; + +//// [file2.ts] +export var y = 1; + +//// [file3.ts] +export {z} from "./file4" + +//// [file4.ts] +export var z = 1; + +//// [file4.ts] +export var z1 = 1; + +//// [file1.js] +define(["require", "exports"], function (require, exports) { + exports.x = 1; +}); +//// [file2.js] +define(["require", "exports"], function (require, exports) { + exports.y = 1; +}); +//// [file4.js] +define(["require", "exports"], function (require, exports) { + exports.z = 1; +}); +//// [file3.js] +define(["require", "exports", "./file4"], function (require, exports, file4_1) { + exports.z = file4_1.z; +}); +//// [file4.js] +define(["require", "exports"], function (require, exports) { + exports.z1 = 1; +}); +//// [file1.js] +define(["require", "exports", "folder2/file1", "folder3/file2", "components/file3", "my/file4"], function (require, exports, file1_1, file2_1, file3_1, file4_1) { + use(file1_1.x.toExponential()); + use(file2_1.y.toExponential()); + use(file3_1.z.toExponential()); + use(file4_1.z1.toExponential()); +}); diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9_2.symbols b/tests/baselines/reference/pathMappingBasedModuleResolution9_2.symbols new file mode 100644 index 00000000000..f9f5bc671ab --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9_2.symbols @@ -0,0 +1,61 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : Symbol(x, Decl(file1.ts, 0, 8)) + +import {y} from "folder3/file2" +>y : Symbol(y, Decl(file1.ts, 1, 8)) + +import {z} from "components/file3" +>z : Symbol(z, Decl(file1.ts, 2, 8)) + +import {z1} from "my/file4" +>z1 : Symbol(z1, Decl(file1.ts, 3, 8)) + +declare function use(a: any): void; +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>a : Symbol(a, Decl(file1.ts, 5, 21)) + +use(x.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>x.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>x : Symbol(x, Decl(file1.ts, 0, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(y.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>y.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>y : Symbol(y, Decl(file1.ts, 1, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>z.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z : Symbol(z, Decl(file1.ts, 2, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +use(z1.toExponential()); +>use : Symbol(use, Decl(file1.ts, 3, 27)) +>z1.toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) +>z1 : Symbol(z1, Decl(file1.ts, 3, 8)) +>toExponential : Symbol(Number.toExponential, Decl(lib.d.ts, --, --)) + +=== c:/base/folder2/file1.ts === +export var x = 1; +>x : Symbol(x, Decl(file1.ts, 0, 10)) + +=== c:/base/generated/folder3/file2.ts === +export var y = 1; +>y : Symbol(y, Decl(file2.ts, 0, 10)) + +=== c:/base/shared/components/file3.ts === +export {z} from "./file4" +>z : Symbol(z, Decl(file3.ts, 0, 8)) + +=== c:/base/shared/components/file4.ts === +export var z = 1; +>z : Symbol(z, Decl(file4.ts, 0, 10)) + +=== c:/sharedrepo/my/file4.ts === +export var z1 = 1; +>z1 : Symbol(z1, Decl(file4.ts, 0, 10)) + diff --git a/tests/baselines/reference/pathMappingBasedModuleResolution9_2.types b/tests/baselines/reference/pathMappingBasedModuleResolution9_2.types new file mode 100644 index 00000000000..e84babf0a79 --- /dev/null +++ b/tests/baselines/reference/pathMappingBasedModuleResolution9_2.types @@ -0,0 +1,73 @@ +=== c:/root/folder1/file1.ts === +import {x} from "folder2/file1" +>x : number + +import {y} from "folder3/file2" +>y : number + +import {z} from "components/file3" +>z : number + +import {z1} from "my/file4" +>z1 : number + +declare function use(a: any): void; +>use : (a: any) => void +>a : any + +use(x.toExponential()); +>use(x.toExponential()) : void +>use : (a: any) => void +>x.toExponential() : string +>x.toExponential : (fractionDigits?: number) => string +>x : number +>toExponential : (fractionDigits?: number) => string + +use(y.toExponential()); +>use(y.toExponential()) : void +>use : (a: any) => void +>y.toExponential() : string +>y.toExponential : (fractionDigits?: number) => string +>y : number +>toExponential : (fractionDigits?: number) => string + +use(z.toExponential()); +>use(z.toExponential()) : void +>use : (a: any) => void +>z.toExponential() : string +>z.toExponential : (fractionDigits?: number) => string +>z : number +>toExponential : (fractionDigits?: number) => string + +use(z1.toExponential()); +>use(z1.toExponential()) : void +>use : (a: any) => void +>z1.toExponential() : string +>z1.toExponential : (fractionDigits?: number) => string +>z1 : number +>toExponential : (fractionDigits?: number) => string + +=== c:/base/folder2/file1.ts === +export var x = 1; +>x : number +>1 : number + +=== c:/base/generated/folder3/file2.ts === +export var y = 1; +>y : number +>1 : number + +=== c:/base/shared/components/file3.ts === +export {z} from "./file4" +>z : number + +=== c:/base/shared/components/file4.ts === +export var z = 1; +>z : number +>1 : number + +=== c:/sharedrepo/my/file4.ts === +export var z1 = 1; +>z1 : number +>1 : number + diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution1.ts new file mode 100644 index 00000000000..d6c24d75f96 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution1.ts @@ -0,0 +1,18 @@ +// @moduleResolution: baseUrl +// @module: commonjs +// @baseUrl: root + +// user defined base url + +// @filename: root/folder1/file1.ts +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +// @filename: root/folder2/file2.ts +export {x} from "./file3" + +// @filename: root/folder2/file3.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution10.ts b/tests/cases/compiler/pathMappingBasedModuleResolution10.ts new file mode 100644 index 00000000000..2f32cf3e7cd --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution10.ts @@ -0,0 +1,34 @@ +// @module: amd + +// paths\rootDirs is defined in tsconfig.json +// baseUrl is inferred from tsconfig.json + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "paths": { + "*": [ + "*", + "generated/*" + ] + }, + "rootDirs": [ + ".", + "./generated" + ] + } +} +// @filename: root/folder1/file1.ts +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' + +export var z = x.toExponential(); + +// @filename: root/generated/folder1/file2.ts +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' + +// @filename: root/folder1/file3.ts +export var x = 1; + +// @filename: root/generated/folder2/file3.ts +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +let z = y.toLowerCase(); diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution10_1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution10_1.ts new file mode 100644 index 00000000000..6cc6f8e32d9 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution10_1.ts @@ -0,0 +1,35 @@ +// @module: amd + +// paths\rootDirs is defined in tsconfig.json +// baseUrl is inferred from tsconfig.json + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "paths": { + "*": [ + "*", + "generated/*" + ] + }, + "rootDirs": [ + ".", + "./generated" + ] + } +} + +// @filename: c:/root/generated/folder1/file2.ts +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' + +// @filename: c:/root/folder1/file3.ts +export var x = 1; + +// @filename: c:/root/generated/folder2/file3.ts +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +let z = y.toLowerCase(); + +// @filename: c:/root/folder1/file1.ts +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' + +export var z = x.toExponential(); diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution10_2.ts b/tests/cases/compiler/pathMappingBasedModuleResolution10_2.ts new file mode 100644 index 00000000000..bd8942e1df1 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution10_2.ts @@ -0,0 +1,36 @@ +// @module: amd + +// paths\rootDirs is defined in tsconfig.json +// baseUrl is defined in tsconfig.json + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src", + "paths": { + "*": [ + "*", + "generated/*" + ] + }, + "rootDirs": [ + ".", + "./generated" + ] + } +} + +// @filename: c:/root/src/generated/folder1/file2.ts +export {x} from "folder1/file3" // should be resolved to 'folder1/file3.ts' + +// @filename: c:/root/src/folder1/file3.ts +export var x = 1; + +// @filename: c:/root/src/generated/folder2/file3.ts +import {z as y} from "../folder1/file1" // should be resolved to 'folder1/file1.ts' +let z = y.toLowerCase(); + +// @filename: c:/root/src/folder1/file1.ts +import {x} from "./file2" // should be resolved to 'generated/folder1/file2.ts' + +export var z = x.toExponential(); diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution1_1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution1_1.ts new file mode 100644 index 00000000000..fa987961cd2 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution1_1.ts @@ -0,0 +1,18 @@ +// @moduleResolution: baseUrl +// @module: commonjs +// @baseUrl: c:/root + +// user defined base url + +// @filename: c:/root/folder1/file1.ts +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +// @filename: c:/root/folder2/file2.ts +export {x} from "./file3" + +// @filename: c:/root/folder2/file3.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution2.ts b/tests/cases/compiler/pathMappingBasedModuleResolution2.ts new file mode 100644 index 00000000000..84bfc36b8d1 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution2.ts @@ -0,0 +1,22 @@ +// @module: commonjs + +// location of tsconfig.json as baseurl + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "moduleResolution": "baseUrl" + } +} +// @filename: root/folder1/file1.ts +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +// @filename: root/folder2/file2.ts +export {x} from "./file3" + +// @filename: root/folder2/file3.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution2_1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution2_1.ts new file mode 100644 index 00000000000..4b94e352879 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution2_1.ts @@ -0,0 +1,22 @@ +// @module: commonjs + +// location of tsconfig.json as baseurl + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "moduleResolution": "baseUrl" + } +} +// @filename: c:/root/folder1/file1.ts +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +// @filename: c:/root/folder2/file2.ts +export {x} from "./file3" + +// @filename: c:/root/folder2/file3.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution3.ts b/tests/cases/compiler/pathMappingBasedModuleResolution3.ts new file mode 100644 index 00000000000..466e8c90d77 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution3.ts @@ -0,0 +1,23 @@ +// @module: commonjs + +// baseurl is defined in tsconfig.json + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "moduleResolution": "baseUrl", + "baseUrl": "./src" + } +} +// @filename: root/src/folder1/file1.ts +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +// @filename: root/src/folder2/file2.ts +export {x} from "./file3" + +// @filename: root/src/folder2/file3.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution3_1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution3_1.ts new file mode 100644 index 00000000000..f3a8ccaf0a8 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution3_1.ts @@ -0,0 +1,23 @@ +// @module: commonjs + +// baseurl is defined in tsconfig.json + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "moduleResolution": "baseUrl", + "baseUrl": "./src" + } +} +// @filename: c:/root/src/folder1/file1.ts +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +// @filename: c:/root/src/folder2/file2.ts +export {x} from "./file3" + +// @filename: c:/root/src/folder2/file3.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution4.ts b/tests/cases/compiler/pathMappingBasedModuleResolution4.ts new file mode 100644 index 00000000000..17f8258e763 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution4.ts @@ -0,0 +1,23 @@ +// @module: amd + +// baseurl is defined in tsconfig.json +// module resolution kind is inferred from settings (baseurl is specified) + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src" + } +} +// @filename: root/src/folder1/file1.ts +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +// @filename: root/src/folder2/file2.ts +export {x} from "./file3" + +// @filename: root/src/folder2/file3.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution4_1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution4_1.ts new file mode 100644 index 00000000000..df6f267da65 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution4_1.ts @@ -0,0 +1,23 @@ +// @module: amd + +// baseurl is defined in tsconfig.json +// module resolution kind is inferred from settings (baseurl is specified) + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src" + } +} +// @filename: c:/root/src/folder1/file1.ts +import {x} from "folder2/file2" + +declare function use(a: any): void; + +use(x.toExponential()); + +// @filename: c:/root/src/folder2/file2.ts +export {x} from "./file3" + +// @filename: c:/root/src/folder2/file3.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution5.ts b/tests/cases/compiler/pathMappingBasedModuleResolution5.ts new file mode 100644 index 00000000000..305f7aa9c3f --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution5.ts @@ -0,0 +1,13 @@ +// @module: commonjs + +// baseurl is defined in tsconfig.json +// module resolution kind is ambiguous - error should be reported + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src" + } +} +// @filename: root/src/folder1/file1.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution6.ts b/tests/cases/compiler/pathMappingBasedModuleResolution6.ts new file mode 100644 index 00000000000..f1e51afc805 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution6.ts @@ -0,0 +1,17 @@ +// @module: amd + +// baseurl is defined in tsconfig.json +// paths has errors + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src", + "paths": { + "*1*": [ "*2*" ] + } + } +} + +// @filename: root/src/folder1/file1.ts +export var x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution7.ts b/tests/cases/compiler/pathMappingBasedModuleResolution7.ts new file mode 100644 index 00000000000..f59f0701a33 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution7.ts @@ -0,0 +1,38 @@ +// @module: amd + +// paths is defined in tsconfig.json +// module resolution kind is inferred from the presence of 'paths' + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "paths": { + "*": [ + "*", + "generated/*" + ], + "components/*": [ + "shared/components/*" + ] + } + } +} +// @filename: root/folder1/file1.ts +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); + +// @filename: root/folder2/file1.ts +export var x = 1; + +// @filename: root/generated/folder3/file2.ts +export var y = 1; + +// @filename: root/shared/components/file3.ts +export var z = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution7_1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution7_1.ts new file mode 100644 index 00000000000..c64eb687764 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution7_1.ts @@ -0,0 +1,38 @@ +// @module: amd + +// paths is defined in tsconfig.json +// module resolution kind is inferred from the presence of 'paths' + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "paths": { + "*": [ + "*", + "generated/*" + ], + "components/*": [ + "shared/components/*" + ] + } + } +} +// @filename: c:/root/folder1/file1.ts +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); + +// @filename: c:/root/folder2/file1.ts +export var x = 1; + +// @filename: c:/root/generated/folder3/file2.ts +export var y = 1; + +// @filename: c:/root/shared/components/file3.ts +export var z = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution7_2.ts b/tests/cases/compiler/pathMappingBasedModuleResolution7_2.ts new file mode 100644 index 00000000000..16284349643 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution7_2.ts @@ -0,0 +1,44 @@ +// @module: amd + +// paths is defined in tsconfig.json +// module resolution kind is inferred from the presence of 'paths' + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "paths": { + "*": [ + "*", + "generated/*", + "c:/sharedrepo/*" + ], + "components/*": [ + "shared/components/*" + ] + } + } +} +// @filename: c:/root/folder1/file1.ts +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" +import {z1} from "file4" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); +use(z1.toExponential()); + +// @filename: c:/root/folder2/file1.ts +export var x = 1; + +// @filename: c:/root/generated/folder3/file2.ts +export var y = 1; + +// @filename: c:/root/shared/components/file3.ts +export var z = 1; + +// @filename: c:/sharedrepo/file4.ts +export var z1 = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution8.ts b/tests/cases/compiler/pathMappingBasedModuleResolution8.ts new file mode 100644 index 00000000000..dc2be22c4ca --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution8.ts @@ -0,0 +1,39 @@ +// @module: amd + +// paths is defined in tsconfig.json +// baseUrl is specified in tsconfig.json + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src", + "paths": { + "*": [ + "*", + "generated/*" + ], + "components/*": [ + "shared/components/*" + ] + } + } +} +// @filename: root/folder1/file1.ts +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); + +// @filename: root/src/folder2/file1.ts +export var x = 1; + +// @filename: root/src/generated/folder3/file2.ts +export var y = 1; + +// @filename: root/src/shared/components/file3.ts +export var z = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution8_1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution8_1.ts new file mode 100644 index 00000000000..b858be9455d --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution8_1.ts @@ -0,0 +1,45 @@ +// @module: amd + +// paths is defined in tsconfig.json +// baseUrl is specified in tsconfig.json + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src", + "paths": { + "*": [ + "*", + "generated/*", + "c:/sharedrepo/*" + ], + "components/*": [ + "shared/components/*" + ] + } + } +} +// @filename: c:/root/folder1/file1.ts +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" +import {z1} from "file4" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); +use(z1.toExponential()); + +// @filename: c:/root/src/folder2/file1.ts +export var x = 1; + +// @filename: c:/root/src/generated/folder3/file2.ts +export var y = 1; + +// @filename: c:/root/src/shared/components/file3.ts +export var z = 1; + +// @filename: c:/sharedrepo/file4.ts +export var z1 = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution9.ts b/tests/cases/compiler/pathMappingBasedModuleResolution9.ts new file mode 100644 index 00000000000..1b104a27251 --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution9.ts @@ -0,0 +1,42 @@ +// @module: amd + +// paths is defined in tsconfig.json +// baseUrl is specified in tsconfig.json + +// @filename: root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src", + "paths": { + "*": [ + "*", + "generated/*" + ], + "components/*": [ + "shared/components/*" + ] + } + } +} +// @filename: root/folder1/file1.ts +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); + +// @filename: root/src/folder2/file1.ts +export var x = 1; + +// @filename: root/src/generated/folder3/file2.ts +export var y = 1; + +// @filename: root/src/shared/components/file3.ts +export {z} from "./file4" + +// @filename: root/src/shared/components/file4.ts +export var z = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution9_1.ts b/tests/cases/compiler/pathMappingBasedModuleResolution9_1.ts new file mode 100644 index 00000000000..68a0898229c --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution9_1.ts @@ -0,0 +1,48 @@ +// @module: amd + +// paths is defined in tsconfig.json +// baseUrl is specified in tsconfig.json + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "./src", + "paths": { + "*": [ + "*", + "generated/*", + "c:/sharedrepo/*" + ], + "components/*": [ + "shared/components/*" + ] + } + } +} +// @filename: c:/root/folder1/file1.ts +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" +import {z1} from "my/file4" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); +use(z1.toExponential()); + +// @filename: c:/root/src/folder2/file1.ts +export var x = 1; + +// @filename: c:/root/src/generated/folder3/file2.ts +export var y = 1; + +// @filename: c:/root/src/shared/components/file3.ts +export {z} from "./file4" + +// @filename: c:/root/src/shared/components/file4.ts +export var z = 1; + +// @filename: c:/sharedrepo/my/file4.ts +export var z1 = 1; \ No newline at end of file diff --git a/tests/cases/compiler/pathMappingBasedModuleResolution9_2.ts b/tests/cases/compiler/pathMappingBasedModuleResolution9_2.ts new file mode 100644 index 00000000000..83990d3c5ad --- /dev/null +++ b/tests/cases/compiler/pathMappingBasedModuleResolution9_2.ts @@ -0,0 +1,48 @@ +// @module: amd + +// paths is defined in tsconfig.json +// baseUrl is specified in tsconfig.json and it is absolute + +// @filename: c:/root/tsconfig.json +{ + "compilerOptions": { + "baseUrl": "c:/base", + "paths": { + "*": [ + "*", + "generated/*", + "c:/sharedrepo/*" + ], + "components/*": [ + "shared/components/*" + ] + } + } +} +// @filename: c:/root/folder1/file1.ts +import {x} from "folder2/file1" +import {y} from "folder3/file2" +import {z} from "components/file3" +import {z1} from "my/file4" + +declare function use(a: any): void; + +use(x.toExponential()); +use(y.toExponential()); +use(z.toExponential()); +use(z1.toExponential()); + +// @filename: c:/base/folder2/file1.ts +export var x = 1; + +// @filename: c:/base/generated/folder3/file2.ts +export var y = 1; + +// @filename: c:/base/shared/components/file3.ts +export {z} from "./file4" + +// @filename: c:/base/shared/components/file4.ts +export var z = 1; + +// @filename: c:/sharedrepo/my/file4.ts +export var z1 = 1; \ No newline at end of file diff --git a/tests/cases/unittests/moduleResolution.ts b/tests/cases/unittests/moduleResolution.ts index 9e316266bf6..277d71dca0e 100644 --- a/tests/cases/unittests/moduleResolution.ts +++ b/tests/cases/unittests/moduleResolution.ts @@ -381,4 +381,132 @@ import b = require("./moduleB.ts"); test(files, { module: ts.ModuleKind.CommonJS, forceConsistentCasingInFileNames: true }, "/a/B/c", /* useCaseSensitiveFileNames */ false, ["moduleD.ts"], []); }) }); + + describe("baseUrl module resolution", () => { + it("module resolution without path mappings/rootDirs", () => { + const file1: File = { name: "/root/folder1/file1.ts" }; + const file2: File = { name: "/root/folder2/file2.ts" }; + const file3: File = { name: "/root/folder2/file3.ts" }; + const host = createModuleResolutionHost(file1, file2, file3); + const options: CompilerOptions = { moduleResolution: ModuleResolutionKind.BaseUrl, baseUrl: "/root" }; + { + const result = baseUrlModuleNameResolver("folder2/file2", file1.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file2.name); + assert.deepEqual(result.failedLookupLocations, []); + } + { + const result = baseUrlModuleNameResolver("./file3", file2.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file3.name); + assert.deepEqual(result.failedLookupLocations, []); + } + { + const result = baseUrlModuleNameResolver(file1.name, file2.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file1.name); + assert.deepEqual(result.failedLookupLocations, []); + } + // add failure tests + }); + + it("module resolution with path mappings", () => { + const file1: File = { name: "/root/folder1/file1.ts" }; + const file2: File = { name: "/root/folder1/file2.ts" } + const file3: File = { name: "/root/generated/folder1/file3.ts" } + const file4: File = { name: "/root/generated/folder2/file4.ts" } + const file5: File = { name: "/root/someanotherfolder/file5.ts" } + const host = createModuleResolutionHost(file1, file2, file3, file4, file5); + const options: CompilerOptions = { + moduleResolution: ModuleResolutionKind.BaseUrl, + baseUrl: "/root", + paths: { + "*": [ + "*", + "generated/*" + ], + "somefolder/*": [ + "someanotherfolder/*" + ] + } + }; + { + const result = baseUrlModuleNameResolver("folder1/file2", file1.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file2.name); + assert.deepEqual(result.failedLookupLocations, []); + } + { + const result = baseUrlModuleNameResolver("./file2", file1.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file2.name); + assert.deepEqual(result.failedLookupLocations, []); + } + { + const result = baseUrlModuleNameResolver("folder1/file3", file1.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file3.name); + // non-empty because it tries to use '*' match first + assert.deepEqual(result.failedLookupLocations, [ + "/root/folder1/file3.ts", + "/root/folder1/file3.tsx", + "/root/folder1/file3.d.ts", + ]); + } + { + const result = baseUrlModuleNameResolver("folder2/file4", file1.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file4.name); + assert.deepEqual(result.failedLookupLocations, [ + "/root/folder2/file4.ts", + "/root/folder2/file4.tsx", + "/root/folder2/file4.d.ts", + ]); + } + { + const result = baseUrlModuleNameResolver("somefolder/file5", file1.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file5.name); + assert.deepEqual(result.failedLookupLocations, []); + } + // add failure tests + }); + + it ("module resolution with path mappings and root dirs", () => { + let file1: File = { name: "/root/folder1/file1.ts" }; + let file2: File = { name: "/root/generated/folder1/file2.ts" }; + let file3: File = { name: "/root/generated/folder2/file3.ts" }; + const host = createModuleResolutionHost(file1, file2, file3); + const options: CompilerOptions = { + moduleResolution: ModuleResolutionKind.BaseUrl, + baseUrl: "/root", + paths: { + "*": [ + "*", + "generated/*" + ] + }, + rootDirs: [ + ".", + "./generated/" + ] + }; + { + const result = baseUrlModuleNameResolver("./file2", file1.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file2.name); + assert.deepEqual(result.failedLookupLocations, [ + "/root/folder1/file2.ts", + "/root/folder1/file2.tsx", + "/root/folder1/file2.d.ts", + ]); + } + { + const result = baseUrlModuleNameResolver("../folder1/file1", file3.name, options, host); + assert.isTrue(result.resolvedModule !== undefined, "module should be resolved"); + assert.equal(result.resolvedModule.resolvedFileName, file1.name); + assert.deepEqual(result.failedLookupLocations, []); + } + }); + }) } \ No newline at end of file