Fix declaration emit when the packages are included through symlinks (#37438)

* Convert symlink scenarios to virtual FS where its symlinks are correctly maintained
Adds test for #36866

* Fix the casing issue when redirects differ in casing of the file

* Make ModuleSpecifierResolutionHost internal

* Refactoring for ModuleSpecifierResolutionHost

* If any of the file path option is from node_modules folder, consider only paths in node_modules folder

* Update src/services/utilities.ts

Co-Authored-By: Andrew Branch <andrewbranch@users.noreply.github.com>

Co-authored-by: Andrew Branch <andrewbranch@users.noreply.github.com>
This commit is contained in:
Sheetal Nandi
2020-03-17 13:21:40 -07:00
committed by GitHub
co-authored by Andrew Branch
parent a510cad873
commit e60bbac84f
27 changed files with 1611 additions and 320 deletions
+4 -5
View File
@@ -4066,9 +4066,10 @@ namespace ts {
tracker: tracker && tracker.trackSymbol ? tracker : { trackSymbol: noop, moduleResolverHost: flags! & NodeBuilderFlags.DoNotIncludeSymbolChain ? {
getCommonSourceDirectory: (host as Program).getCommonSourceDirectory ? () => (host as Program).getCommonSourceDirectory() : () => "",
getSourceFiles: () => host.getSourceFiles(),
getCurrentDirectory: maybeBind(host, host.getCurrentDirectory),
getCurrentDirectory: () => host.getCurrentDirectory(),
getProbableSymlinks: maybeBind(host, host.getProbableSymlinks),
useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames)
useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames),
redirectTargetsMap: host.redirectTargetsMap,
} : undefined },
encounteredError: false,
visitedTypes: undefined,
@@ -5028,9 +5029,7 @@ namespace ts {
specifierCompilerOptions,
contextFile,
moduleResolverHost,
host.getSourceFiles(),
{ importModuleSpecifierPreference: isBundle ? "non-relative" : "relative" },
host.redirectTargetsMap,
));
links.specifierCache = links.specifierCache || createMap();
links.specifierCache.set(contextFile.path, specifier);
@@ -6450,7 +6449,7 @@ namespace ts {
const getCanonicalFileName = createGetCanonicalFileName(!!host.useCaseSensitiveFileNames);
const resolverHost = {
getCanonicalFileName,
getCurrentDirectory: context.tracker.moduleResolverHost.getCurrentDirectory ? () => context.tracker.moduleResolverHost!.getCurrentDirectory!() : () => "",
getCurrentDirectory: () => context.tracker.moduleResolverHost!.getCurrentDirectory(),
getCommonSourceDirectory: () => context.tracker.moduleResolverHost!.getCommonSourceDirectory()
};
const newName = getResolvedExternalModuleName(resolverHost, targetFile);
-1
View File
@@ -794,7 +794,6 @@ namespace ts {
isEmitBlocked: returnFalse,
readFile: f => host.readFile(f),
fileExists: f => host.fileExists(f),
directoryExists: host.directoryExists && (f => host.directoryExists!(f)),
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
getProgramBuildInfo: returnUndefined,
getSourceFileFromReference: returnUndefined,
+20 -29
View File
@@ -41,11 +41,9 @@ namespace ts.moduleSpecifiers {
importingSourceFileName: Path,
toFileName: string,
host: ModuleSpecifierResolutionHost,
files: readonly SourceFile[],
redirectTargetsMap: RedirectTargetsMap,
oldImportSpecifier: string,
): string | undefined {
const res = getModuleSpecifierWorker(compilerOptions, importingSourceFileName, toFileName, host, files, redirectTargetsMap, getPreferencesForUpdate(compilerOptions, oldImportSpecifier));
const res = getModuleSpecifierWorker(compilerOptions, importingSourceFileName, toFileName, host, getPreferencesForUpdate(compilerOptions, oldImportSpecifier));
if (res === oldImportSpecifier) return undefined;
return res;
}
@@ -57,11 +55,9 @@ namespace ts.moduleSpecifiers {
importingSourceFileName: Path,
toFileName: string,
host: ModuleSpecifierResolutionHost,
files: readonly SourceFile[],
preferences: UserPreferences = {},
redirectTargetsMap: RedirectTargetsMap,
): string {
return getModuleSpecifierWorker(compilerOptions, importingSourceFileName, toFileName, host, files, redirectTargetsMap, getPreferences(preferences, compilerOptions, importingSourceFile));
return getModuleSpecifierWorker(compilerOptions, importingSourceFileName, toFileName, host, getPreferences(preferences, compilerOptions, importingSourceFile));
}
export function getNodeModulesPackageName(
@@ -69,11 +65,9 @@ namespace ts.moduleSpecifiers {
importingSourceFileName: Path,
nodeModulesFileName: string,
host: ModuleSpecifierResolutionHost,
files: readonly SourceFile[],
redirectTargetsMap: RedirectTargetsMap,
): string | undefined {
const info = getInfo(importingSourceFileName, host);
const modulePaths = getAllModulePaths(files, importingSourceFileName, nodeModulesFileName, info.getCanonicalFileName, host, redirectTargetsMap);
const modulePaths = getAllModulePaths(importingSourceFileName, nodeModulesFileName, host);
return firstDefined(modulePaths,
moduleFileName => tryGetModuleNameAsNodeModule(moduleFileName, info, host, compilerOptions, /*packageNameOnly*/ true));
}
@@ -83,12 +77,10 @@ namespace ts.moduleSpecifiers {
importingSourceFileName: Path,
toFileName: string,
host: ModuleSpecifierResolutionHost,
files: readonly SourceFile[],
redirectTargetsMap: RedirectTargetsMap,
preferences: Preferences
): string {
const info = getInfo(importingSourceFileName, host);
const modulePaths = getAllModulePaths(files, importingSourceFileName, toFileName, info.getCanonicalFileName, host, redirectTargetsMap);
const modulePaths = getAllModulePaths(importingSourceFileName, toFileName, host);
return firstDefined(modulePaths, moduleFileName => tryGetModuleNameAsNodeModule(moduleFileName, info, host, compilerOptions)) ||
getLocalModuleSpecifier(toFileName, info, compilerOptions, preferences);
}
@@ -99,16 +91,14 @@ namespace ts.moduleSpecifiers {
compilerOptions: CompilerOptions,
importingSourceFile: SourceFile,
host: ModuleSpecifierResolutionHost,
files: readonly SourceFile[],
userPreferences: UserPreferences,
redirectTargetsMap: RedirectTargetsMap,
): readonly string[] {
const ambient = tryGetModuleNameFromAmbientModule(moduleSymbol);
if (ambient) return [ambient];
const info = getInfo(importingSourceFile.path, host);
const moduleSourceFile = getSourceFileOfNode(moduleSymbol.valueDeclaration || getNonAugmentationDeclaration(moduleSymbol));
const modulePaths = getAllModulePaths(files, importingSourceFile.path, moduleSourceFile.originalFileName, info.getCanonicalFileName, host, redirectTargetsMap);
const modulePaths = getAllModulePaths(importingSourceFile.path, moduleSourceFile.originalFileName, host);
const preferences = getPreferences(userPreferences, compilerOptions, importingSourceFile);
const global = mapDefined(modulePaths, moduleFileName => tryGetModuleNameAsNodeModule(moduleFileName, info, host, compilerOptions));
@@ -179,26 +169,24 @@ namespace ts.moduleSpecifiers {
}
export function forEachFileNameOfModule<T>(
files: readonly SourceFile[],
importingFileName: string,
importedFileName: string,
getCanonicalFileName: GetCanonicalFileName,
host: ModuleSpecifierResolutionHost,
redirectTargetsMap: RedirectTargetsMap,
preferSymlinks: boolean,
cb: (fileName: string) => T | undefined
): T | undefined {
const redirects = redirectTargetsMap.get(importedFileName);
const importedFileNames = redirects ? [...redirects, importedFileName] : [importedFileName];
const cwd = host.getCurrentDirectory ? host.getCurrentDirectory() : "";
const getCanonicalFileName = hostGetCanonicalFileName(host);
const cwd = host.getCurrentDirectory();
const redirects = host.redirectTargetsMap.get(toPath(importedFileName, cwd, getCanonicalFileName)) || emptyArray;
const importedFileNames = [importedFileName, ...redirects];
const targets = importedFileNames.map(f => getNormalizedAbsolutePath(f, cwd));
if (!preferSymlinks) {
const result = forEach(targets, cb);
if (result) return result;
}
const links = host.getProbableSymlinks
? host.getProbableSymlinks(files)
: discoverProbableSymlinks(files, getCanonicalFileName, cwd);
? host.getProbableSymlinks(host.getSourceFiles())
: discoverProbableSymlinks(host.getSourceFiles(), getCanonicalFileName, cwd);
const compareStrings = (!host.useCaseSensitiveFileNames || host.useCaseSensitiveFileNames()) ? compareStringsCaseSensitive : compareStringsCaseInsensitive;
const result = forEachEntry(links, (resolved, path) => {
@@ -224,20 +212,20 @@ namespace ts.moduleSpecifiers {
* Looks for existing imports that use symlinks to this module.
* Symlinks will be returned first so they are preferred over the real path.
*/
function getAllModulePaths(files: readonly SourceFile[], importingFileName: string, importedFileName: string, getCanonicalFileName: GetCanonicalFileName, host: ModuleSpecifierResolutionHost, redirectTargetsMap: RedirectTargetsMap): readonly string[] {
const cwd = host.getCurrentDirectory ? host.getCurrentDirectory() : "";
function getAllModulePaths(importingFileName: string, importedFileName: string, host: ModuleSpecifierResolutionHost): readonly string[] {
const cwd = host.getCurrentDirectory();
const getCanonicalFileName = hostGetCanonicalFileName(host);
const allFileNames = createMap<string>();
let importedFileFromNodeModules = false;
forEachFileNameOfModule(
files,
importingFileName,
importedFileName,
getCanonicalFileName,
host,
redirectTargetsMap,
/*preferSymlinks*/ true,
path => {
// dont return value, so we collect everything
allFileNames.set(path, getCanonicalFileName(path));
importedFileFromNodeModules = importedFileFromNodeModules || pathContainsNodeModules(path);
}
);
@@ -251,7 +239,10 @@ namespace ts.moduleSpecifiers {
let pathsInDirectory: string[] | undefined;
allFileNames.forEach((canonicalFileName, fileName) => {
if (startsWith(canonicalFileName, directoryStart)) {
(pathsInDirectory || (pathsInDirectory = [])).push(fileName);
// If the importedFile is from node modules, use only paths in node_modules folder as option
if (!importedFileFromNodeModules || pathContainsNodeModules(fileName)) {
(pathsInDirectory || (pathsInDirectory = [])).push(fileName);
}
allFileNames.delete(fileName);
}
});
-1
View File
@@ -1493,7 +1493,6 @@ namespace ts {
// Before falling back to the host
return host.fileExists(f);
},
...(host.directoryExists ? { directoryExists: f => host.directoryExists!(f) } : {}),
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
getProgramBuildInfo: () => program.getProgramBuildInfo && program.getProgramBuildInfo(),
getSourceFileFromReference: (file, ref) => program.getSourceFileFromReference(file, ref),
+1 -3
View File
@@ -351,9 +351,7 @@ namespace ts {
toPath(outputFilePath, host.getCurrentDirectory(), host.getCanonicalFileName),
toPath(declFileName, host.getCurrentDirectory(), host.getCanonicalFileName),
host,
host.getSourceFiles(),
/*preferences*/ undefined,
host.redirectTargetsMap
);
if (!pathIsRelative(specifier)) {
// If some compiler option/symlink/whatever allows access to the file containing the ambient module declaration
@@ -376,7 +374,7 @@ namespace ts {
// omit references to files from node_modules (npm may disambiguate module
// references when installing this package, making the path is unreliable).
if (startsWith(fileName, "node_modules/") || fileName.indexOf("/node_modules/") !== -1) {
if (startsWith(fileName, "node_modules/") || pathContainsNodeModules(fileName)) {
return;
}
+12 -4
View File
@@ -3187,8 +3187,7 @@ namespace ts {
file: Path;
}
// TODO: This should implement TypeCheckerHost but that's an internal type.
export interface Program extends ScriptReferenceHost, ModuleSpecifierResolutionHost {
export interface Program extends ScriptReferenceHost {
getCurrentDirectory(): string;
/**
* Get a list of root file names that were passed to a 'createProgram'
@@ -3290,6 +3289,10 @@ namespace ts {
/*@internal*/ getProbableSymlinks(): ReadonlyMap<string>;
}
/*@internal*/
export interface Program extends TypeCheckerHost, ModuleSpecifierResolutionHost {
}
/* @internal */
export type RedirectTargetsMap = ReadonlyMap<readonly string[]>;
@@ -6420,14 +6423,19 @@ namespace ts {
getCurrentDirectory?(): string;
}
export interface ModuleSpecifierResolutionHost extends GetEffectiveTypeRootsHost {
/*@internal*/
export interface ModuleSpecifierResolutionHost {
useCaseSensitiveFileNames?(): boolean;
fileExists?(path: string): boolean;
getCurrentDirectory(): string;
readFile?(path: string): string | undefined;
/* @internal */
getProbableSymlinks?(files: readonly SourceFile[]): ReadonlyMap<string>;
/* @internal */
getGlobalTypingsCacheLocation?(): string | undefined;
getSourceFiles(): readonly SourceFile[];
readonly redirectTargetsMap: RedirectTargetsMap;
}
// Note: this used to be deprecated in our public API, but is still used internally
@@ -6441,7 +6449,7 @@ namespace ts {
reportPrivateInBaseOfClassExpression?(propertyName: string): void;
reportInaccessibleUniqueSymbolError?(): void;
reportLikelyUnsafeImportRequiredError?(specifier: string): void;
moduleResolverHost?: ModuleSpecifierResolutionHost & { getSourceFiles(): readonly SourceFile[], getCommonSourceDirectory(): string };
moduleResolverHost?: ModuleSpecifierResolutionHost & { getCommonSourceDirectory(): string };
trackReferencedAmbientModule?(decl: ModuleDeclaration, symbol: Symbol): void;
trackExternalModuleSymbolOfImportTypeNode?(symbol: Symbol): void;
}
+8
View File
@@ -3753,6 +3753,14 @@ namespace ts {
};
}
export function hostUsesCaseSensitiveFileNames(host: { useCaseSensitiveFileNames?(): boolean; }): boolean {
return host.useCaseSensitiveFileNames ? host.useCaseSensitiveFileNames() : false;
}
export function hostGetCanonicalFileName(host: { useCaseSensitiveFileNames?(): boolean; }): GetCanonicalFileName {
return createGetCanonicalFileName(hostUsesCaseSensitiveFileNames(host));
}
export interface ResolveModuleNameResolutionHost {
getCanonicalFileName(p: string): string;
getCommonSourceDirectory(): string;
+2 -2
View File
@@ -70,11 +70,11 @@ interface Array<T> { length: number; [n: number]: T; }`
}
export type FileOrFolderOrSymLink = File | Folder | SymLink;
function isFile(fileOrFolderOrSymLink: FileOrFolderOrSymLink): fileOrFolderOrSymLink is File {
export function isFile(fileOrFolderOrSymLink: FileOrFolderOrSymLink): fileOrFolderOrSymLink is File {
return isString((<File>fileOrFolderOrSymLink).content);
}
function isSymLink(fileOrFolderOrSymLink: FileOrFolderOrSymLink): fileOrFolderOrSymLink is SymLink {
export function isSymLink(fileOrFolderOrSymLink: FileOrFolderOrSymLink): fileOrFolderOrSymLink is SymLink {
return isString((<SymLink>fileOrFolderOrSymLink).symLink);
}
+1 -13
View File
@@ -16,22 +16,10 @@ namespace ts.codefix {
}
}
function getModuleSpecifierResolverHost(context: TypeConstructionContext): SymbolTracker["moduleResolverHost"] {
return {
directoryExists: context.host.directoryExists ? d => context.host.directoryExists!(d) : undefined,
fileExists: context.host.fileExists ? f => context.host.fileExists!(f) : undefined,
getCurrentDirectory: context.host.getCurrentDirectory ? () => context.host.getCurrentDirectory() : undefined,
readFile: context.host.readFile ? f => context.host.readFile!(f) : undefined,
useCaseSensitiveFileNames: context.host.useCaseSensitiveFileNames ? () => context.host.useCaseSensitiveFileNames!() : undefined,
getSourceFiles: () => context.program.getSourceFiles(),
getCommonSourceDirectory: () => context.program.getCommonSourceDirectory(),
};
}
export function getNoopSymbolTrackerWithResolver(context: TypeConstructionContext): SymbolTracker {
return {
trackSymbol: noop,
moduleResolverHost: getModuleSpecifierResolverHost(context),
moduleResolverHost: getModuleSpecifierResolverHost(context.program, context.host),
};
}
+10 -29
View File
@@ -374,7 +374,7 @@ namespace ts.codefix {
const { allowsImportingSpecifier } = createAutoImportFilter(sourceFile, program, host);
const choicesForEachExportingModule = flatMap(moduleSymbols, ({ moduleSymbol, importKind, exportedSymbolIsTypeOnly }) =>
moduleSpecifiers.getModuleSpecifiers(moduleSymbol, compilerOptions, sourceFile, host, program.getSourceFiles(), preferences, program.redirectTargetsMap)
moduleSpecifiers.getModuleSpecifiers(moduleSymbol, compilerOptions, sourceFile, createModuleSpecifierResolutionHost(program, host) , preferences)
.map((moduleSpecifier): FixAddNewImport | FixUseImportType =>
// `position` should only be undefined at a missing jsx namespace, in which case we shouldn't be looking for pure types.
exportedSymbolIsTypeOnly && isJs
@@ -788,10 +788,9 @@ namespace ts.codefix {
let filteredCount = 0;
const moduleSpecifierResolutionHost = createModuleSpecifierResolutionHost(program, host);
const packageJson = filterByPackageJson && createAutoImportFilter(from, program, host, moduleSpecifierResolutionHost);
const allSourceFiles = program.getSourceFiles();
forEachExternalModule(program.getTypeChecker(), allSourceFiles, (module, sourceFile) => {
forEachExternalModule(program.getTypeChecker(), program.getSourceFiles(), (module, sourceFile) => {
if (sourceFile === undefined) {
if (!packageJson || packageJson.allowsImportingAmbientModule(module, allSourceFiles)) {
if (!packageJson || packageJson.allowsImportingAmbientModule(module)) {
cb(module);
}
else if (packageJson) {
@@ -802,7 +801,7 @@ namespace ts.codefix {
sourceFile !== from &&
isImportableFile(program, from, sourceFile, moduleSpecifierResolutionHost)
) {
if (!packageJson || packageJson.allowsImportingSourceFile(sourceFile, allSourceFiles)) {
if (!packageJson || packageJson.allowsImportingSourceFile(sourceFile)) {
cb(module);
}
else if (packageJson) {
@@ -835,12 +834,9 @@ namespace ts.codefix {
const getCanonicalFileName = hostGetCanonicalFileName(moduleSpecifierResolutionHost);
const globalTypingsCache = moduleSpecifierResolutionHost.getGlobalTypingsCacheLocation?.();
return !!moduleSpecifiers.forEachFileNameOfModule(
program.getSourceFiles(),
from.fileName,
to.fileName,
hostGetCanonicalFileName(moduleSpecifierResolutionHost),
moduleSpecifierResolutionHost,
program.redirectTargetsMap,
/*preferSymlinks*/ false,
toPath => {
const toFile = program.getSourceFile(toPath);
@@ -896,20 +892,6 @@ namespace ts.codefix {
return !isStringANonContextualKeyword(res) ? res || "_" : `_${res}`;
}
function createModuleSpecifierResolutionHost(program: Program, host: LanguageServiceHost): ModuleSpecifierResolutionHost {
// Mix in `getProbablySymlinks` from Program when host doesn't have it
// in order for non-Project hosts to have a symlinks cache.
return {
directoryExists: maybeBind(host, host.directoryExists),
fileExists: maybeBind(host, host.fileExists),
getCurrentDirectory: maybeBind(host, host.getCurrentDirectory),
readFile: maybeBind(host, host.readFile),
useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames),
getProbableSymlinks: maybeBind(host, host.getProbableSymlinks) || program.getProbableSymlinks,
getGlobalTypingsCacheLocation: maybeBind(host, host.getGlobalTypingsCacheLocation),
};
}
function createAutoImportFilter(fromFile: SourceFile, program: Program, host: LanguageServiceHost, moduleSpecifierResolutionHost = createModuleSpecifierResolutionHost(program, host)) {
const packageJsons = host.getPackageJsonsVisibleToFile && host.getPackageJsonsVisibleToFile(fromFile.fileName) || getPackageJsonsVisibleToFile(fromFile.fileName, host);
const dependencyGroups = PackageJsonDependencyGroup.Dependencies | PackageJsonDependencyGroup.DevDependencies | PackageJsonDependencyGroup.OptionalDependencies;
@@ -927,13 +909,13 @@ namespace ts.codefix {
return false;
}
function allowsImportingAmbientModule(moduleSymbol: Symbol, allSourceFiles: readonly SourceFile[]): boolean {
function allowsImportingAmbientModule(moduleSymbol: Symbol): boolean {
if (!packageJsons.length) {
return true;
}
const declaringSourceFile = moduleSymbol.valueDeclaration.getSourceFile();
const declaringNodeModuleName = getNodeModulesPackageNameFromFileName(declaringSourceFile.fileName, allSourceFiles);
const declaringNodeModuleName = getNodeModulesPackageNameFromFileName(declaringSourceFile.fileName);
if (typeof declaringNodeModuleName === "undefined") {
return true;
}
@@ -947,12 +929,12 @@ namespace ts.codefix {
|| moduleSpecifierIsCoveredByPackageJson(declaredModuleSpecifier);
}
function allowsImportingSourceFile(sourceFile: SourceFile, allSourceFiles: readonly SourceFile[]): boolean {
function allowsImportingSourceFile(sourceFile: SourceFile): boolean {
if (!packageJsons.length) {
return true;
}
const moduleSpecifier = getNodeModulesPackageNameFromFileName(sourceFile.fileName, allSourceFiles);
const moduleSpecifier = getNodeModulesPackageNameFromFileName(sourceFile.fileName);
if (!moduleSpecifier) {
return true;
}
@@ -991,7 +973,7 @@ namespace ts.codefix {
return false;
}
function getNodeModulesPackageNameFromFileName(importedFileName: string, allSourceFiles: readonly SourceFile[]): string | undefined {
function getNodeModulesPackageNameFromFileName(importedFileName: string): string | undefined {
if (!stringContains(importedFileName, "node_modules")) {
return undefined;
}
@@ -1000,8 +982,7 @@ namespace ts.codefix {
fromFile.path,
importedFileName,
moduleSpecifierResolutionHost,
allSourceFiles,
program.redirectTargetsMap);
);
if (!specifier) {
return undefined;
+1 -1
View File
@@ -157,7 +157,7 @@ namespace ts {
// Need an update if the imported file moved, or the importing file moved and was using a relative path.
return toImport !== undefined && (toImport.updated || (importingSourceFileMoved && pathIsRelative(importLiteral.text)))
? moduleSpecifiers.updateModuleSpecifier(program.getCompilerOptions(), newImportFromPath, toImport.newFileName, host, allFiles, program.redirectTargetsMap, importLiteral.text)
? moduleSpecifiers.updateModuleSpecifier(program.getCompilerOptions(), newImportFromPath, toImport.newFileName, createModuleSpecifierResolutionHost(program, host), importLiteral.text)
: undefined;
});
}
+4 -1
View File
@@ -204,7 +204,7 @@ namespace ts {
//
// Public interface of the host of a language service instance.
//
export interface LanguageServiceHost extends ModuleSpecifierResolutionHost {
export interface LanguageServiceHost extends GetEffectiveTypeRootsHost {
getCompilationSettings(): CompilerOptions;
getNewLine?(): string;
getProjectVersion?(): string;
@@ -220,6 +220,7 @@ namespace ts {
log?(s: string): void;
trace?(s: string): void;
error?(s: string): void;
useCaseSensitiveFileNames?(): boolean;
/*
* LS host can optionally implement these methods to support completions for module specifiers.
@@ -249,6 +250,8 @@ namespace ts {
/* @internal */ hasChangedAutomaticTypeDirectiveNames?: boolean;
/* @internal */
getGlobalTypingsCacheLocation?(): string | undefined;
/* @internal */
getProbableSymlinks?(files: readonly SourceFile[]): ReadonlyMap<string>;
/*
* Required for full import and type reference completions.
+19 -12
View File
@@ -1701,12 +1701,26 @@ namespace ts {
return !!compilerOptions.module || compilerOptions.target! >= ScriptTarget.ES2015 || !!compilerOptions.noEmit;
}
export function hostUsesCaseSensitiveFileNames(host: { useCaseSensitiveFileNames?(): boolean; }): boolean {
return host.useCaseSensitiveFileNames ? host.useCaseSensitiveFileNames() : false;
export function createModuleSpecifierResolutionHost(program: Program, host: LanguageServiceHost): ModuleSpecifierResolutionHost {
// Mix in `getProbableSymlinks` from Program when host doesn't have it
// in order for non-Project hosts to have a symlinks cache.
return {
fileExists: maybeBind(host, host.fileExists),
getCurrentDirectory: () => host.getCurrentDirectory(),
readFile: maybeBind(host, host.readFile),
useCaseSensitiveFileNames: maybeBind(host, host.useCaseSensitiveFileNames),
getProbableSymlinks: maybeBind(host, host.getProbableSymlinks) || (() => program.getProbableSymlinks()),
getGlobalTypingsCacheLocation: maybeBind(host, host.getGlobalTypingsCacheLocation),
getSourceFiles: () => program.getSourceFiles(),
redirectTargetsMap: program.redirectTargetsMap
};
}
export function hostGetCanonicalFileName(host: { useCaseSensitiveFileNames?(): boolean; }): GetCanonicalFileName {
return createGetCanonicalFileName(hostUsesCaseSensitiveFileNames(host));
export function getModuleSpecifierResolverHost(program: Program, host: LanguageServiceHost): SymbolTracker["moduleResolverHost"] {
return {
...createModuleSpecifierResolutionHost(program, host),
getCommonSourceDirectory: () => program.getCommonSourceDirectory(),
};
}
export function makeImportIfNecessary(defaultImport: Identifier | undefined, namedImports: readonly ImportSpecifier[] | undefined, moduleSpecifier: string, quotePreference: QuotePreference): ImportDeclaration | undefined {
@@ -2409,14 +2423,7 @@ namespace ts {
reportInaccessibleThisError: notAccessible,
reportPrivateInBaseOfClassExpression: notAccessible,
reportInaccessibleUniqueSymbolError: notAccessible,
moduleResolverHost: {
readFile: host.readFile,
fileExists: host.fileExists,
directoryExists: host.directoryExists,
getSourceFiles: program.getSourceFiles,
getCurrentDirectory: program.getCurrentDirectory,
getCommonSourceDirectory: program.getCommonSourceDirectory,
}
moduleResolverHost: getModuleSpecifierResolverHost(program, host)
});
return typeIsAccessible ? res : undefined;
}
+229 -115
View File
@@ -1,15 +1,96 @@
namespace ts {
describe("unittests:: tsc:: declarationEmit::", () => {
verifyTsc({
scenario: "declarationEmit",
subScenario: "when same version is referenced through source and another symlinked package",
fs: () => {
const fsaPackageJson = Utils.dedent`
{
"name": "typescript-fsa",
"version": "3.0.0-beta-2"
}`;
const fsaIndex = Utils.dedent`
interface VerifyDeclarationEmitInput {
subScenario: string;
files: TestFSWithWatch.FileOrFolderOrSymLink[];
rootProject: string;
changeCaseFileTestPath: (path: string) => boolean;
}
function changeCaseFile(file: TestFSWithWatch.FileOrFolderOrSymLink, testPath: (path: string) => boolean, replacePath: (path: string) => string): TestFSWithWatch.FileOrFolderOrSymLink {
return !TestFSWithWatch.isSymLink(file) || !testPath(file.symLink) ?
testPath(file.path) ? { ...file, path: replacePath(file.path) } : file :
{ path: testPath(file.path) ? replacePath(file.path) : file.path, symLink: replacePath(file.symLink) };
}
function verifyDeclarationEmit({ subScenario, files, rootProject, changeCaseFileTestPath }: VerifyDeclarationEmitInput) {
describe(subScenario, () => {
tscWatch.verifyTscWatch({
scenario: "declarationEmit",
subScenario,
sys: () => tscWatch.createWatchedSystem(files, { currentDirectory: tscWatch.projectRoot }),
commandLineArgs: ["-p", rootProject, "--listFiles"],
changes: emptyArray
});
});
const caseChangeScenario = `${subScenario} moduleCaseChange`;
describe(caseChangeScenario, () => {
tscWatch.verifyTscWatch({
scenario: "declarationEmit",
subScenario: caseChangeScenario,
sys: () => tscWatch.createWatchedSystem(
files.map(f => changeCaseFile(f, changeCaseFileTestPath, str => str.replace("myproject", "myProject"))),
{ currentDirectory: tscWatch.projectRoot }
),
commandLineArgs: ["-p", rootProject, "--listFiles"],
changes: emptyArray
});
});
}
describe("with symlinks in sibling folders and common package referenced from both folders", () => {
function pluginOneConfig() {
return JSON.stringify({
compilerOptions: {
target: "es5",
declaration: true,
traceResolution: true
},
});
}
function pluginOneIndex() {
return `import pluginTwo from "plugin-two"; // include this to add reference to symlink`;
}
function pluginOneAction() {
return Utils.dedent`
import { actionCreatorFactory } from "typescript-fsa"; // Include version of shared lib
const action = actionCreatorFactory("somekey");
const featureOne = action<{ route: string }>("feature-one");
export const actions = { featureOne };`;
}
function pluginTwoDts() {
return Utils.dedent`
declare const _default: {
features: {
featureOne: {
actions: {
featureOne: {
(payload: {
name: string;
order: number;
}, meta?: {
[key: string]: any;
}): import("typescript-fsa").Action<{
name: string;
order: number;
}>;
};
};
path: string;
};
};
};
export default _default;`;
}
function fsaPackageJson() {
return JSON.stringify({
name: "typescript-fsa",
version: "3.0.0-beta-2"
});
}
function fsaIndex() {
return Utils.dedent`
export interface Action<Payload> {
type: string;
payload: Payload;
@@ -23,114 +104,147 @@ namespace ts {
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;`;
return loadProjectFromFiles({
"/src/plugin-two/index.d.ts": Utils.dedent`
declare const _default: {
features: {
featureOne: {
actions: {
featureOne: {
(payload: {
name: string;
order: number;
}, meta?: {
[key: string]: any;
}): import("typescript-fsa").Action<{
name: string;
order: number;
}>;
};
};
path: string;
};
};
};
export default _default;`,
"/src/plugin-two/node_modules/typescript-fsa/package.json": fsaPackageJson,
"/src/plugin-two/node_modules/typescript-fsa/index.d.ts": fsaIndex,
"/src/plugin-one/tsconfig.json": Utils.dedent`
{
"compilerOptions": {
"target": "es5",
"declaration": true,
},
}`,
"/src/plugin-one/index.ts": Utils.dedent`
import pluginTwo from "plugin-two"; // include this to add reference to symlink`,
"/src/plugin-one/action.ts": Utils.dedent`
import { actionCreatorFactory } from "typescript-fsa"; // Include version of shared lib
const action = actionCreatorFactory("somekey");
const featureOne = action<{ route: string }>("feature-one");
export const actions = { featureOne };`,
"/src/plugin-one/node_modules/typescript-fsa/package.json": fsaPackageJson,
"/src/plugin-one/node_modules/typescript-fsa/index.d.ts": fsaIndex,
"/src/plugin-one/node_modules/plugin-two": new vfs.Symlink("/src/plugin-two"),
});
},
commandLineArgs: ["-p", "src/plugin-one", "--listFiles"]
}
verifyDeclarationEmit({
subScenario: "when same version is referenced through source and another symlinked package",
rootProject: "plugin-one",
files: [
{ path: `${tscWatch.projectRoot}/plugin-two/index.d.ts`, content: pluginTwoDts() },
{ path: `${tscWatch.projectRoot}/plugin-two/node_modules/typescript-fsa/package.json`, content: fsaPackageJson() },
{ path: `${tscWatch.projectRoot}/plugin-two/node_modules/typescript-fsa/index.d.ts`, content: fsaIndex() },
{ path: `${tscWatch.projectRoot}/plugin-one/tsconfig.json`, content: pluginOneConfig() },
{ path: `${tscWatch.projectRoot}/plugin-one/index.ts`, content: pluginOneIndex() },
{ path: `${tscWatch.projectRoot}/plugin-one/action.ts`, content: pluginOneAction() },
{ path: `${tscWatch.projectRoot}/plugin-one/node_modules/typescript-fsa/package.json`, content: fsaPackageJson() },
{ path: `${tscWatch.projectRoot}/plugin-one/node_modules/typescript-fsa/index.d.ts`, content: fsaIndex() },
{ path: `${tscWatch.projectRoot}/plugin-one/node_modules/plugin-two`, symLink: `${tscWatch.projectRoot}/plugin-two` },
tscWatch.libFile
],
changeCaseFileTestPath: str => stringContains(str, "/plugin-two"),
});
verifyDeclarationEmit({
subScenario: "when same version is referenced through source and another symlinked package with indirect link",
rootProject: "plugin-one",
files: [
{
path: `${tscWatch.projectRoot}/plugin-two/package.json`,
content: JSON.stringify({
name: "plugin-two",
version: "0.1.3",
main: "dist/commonjs/index.js"
})
},
{ path: `${tscWatch.projectRoot}/plugin-two/dist/commonjs/index.d.ts`, content: pluginTwoDts() },
{ path: `${tscWatch.projectRoot}/plugin-two/node_modules/typescript-fsa/package.json`, content: fsaPackageJson() },
{ path: `${tscWatch.projectRoot}/plugin-two/node_modules/typescript-fsa/index.d.ts`, content: fsaIndex() },
{ path: `${tscWatch.projectRoot}/plugin-one/tsconfig.json`, content: pluginOneConfig() },
{
path: `${tscWatch.projectRoot}/plugin-one/index.ts`,
content: `${pluginOneIndex()}
${pluginOneAction()}`
},
{ path: `${tscWatch.projectRoot}/plugin-one/node_modules/typescript-fsa/package.json`, content: fsaPackageJson() },
{ path: `${tscWatch.projectRoot}/plugin-one/node_modules/typescript-fsa/index.d.ts`, content: fsaIndex() },
{ path: `/temp/yarn/data/link/plugin-two`, symLink: `${tscWatch.projectRoot}/plugin-two` },
{ path: `${tscWatch.projectRoot}/plugin-one/node_modules/plugin-two`, symLink: `/temp/yarn/data/link/plugin-two` },
tscWatch.libFile
],
changeCaseFileTestPath: str => stringContains(str, "/plugin-two"),
});
});
verifyTsc({
scenario: "declarationEmit",
verifyDeclarationEmit({
subScenario: "when pkg references sibling package through indirect symlink",
fs: () => loadProjectFromFiles({
"/src/pkg1/dist/index.d.ts": Utils.dedent`
export * from './types';`,
"/src/pkg1/dist/types.d.ts": Utils.dedent`
export declare type A = {
id: string;
};
export declare type B = {
id: number;
};
export declare type IdType = A | B;
export declare class MetadataAccessor<T, D extends IdType = IdType> {
readonly key: string;
private constructor();
toString(): string;
static create<T, D extends IdType = IdType>(key: string): MetadataAccessor<T, D>;
}`,
"/src/pkg1/package.json": Utils.dedent`
{
"name": "@raymondfeng/pkg1",
"version": "1.0.0",
"description": "",
"main": "dist/index.js",
"typings": "dist/index.d.ts"
}`,
"/src/pkg2/dist/index.d.ts": Utils.dedent`
export * from './types';`,
"/src/pkg2/dist/types.d.ts": Utils.dedent`
export {MetadataAccessor} from '@raymondfeng/pkg1';`,
"/src/pkg2/package.json": Utils.dedent`
{
"name": "@raymondfeng/pkg2",
"version": "1.0.0",
"description": "",
"main": "dist/index.js",
"typings": "dist/index.d.ts"
}`,
"/src/pkg3/src/index.ts": Utils.dedent`
export * from './keys';`,
"/src/pkg3/src/keys.ts": Utils.dedent`
import {MetadataAccessor} from "@raymondfeng/pkg2";
export const ADMIN = MetadataAccessor.create<boolean>('1');`,
"/src/pkg3/tsconfig.json": Utils.dedent`
{
"compilerOptions": {
"outDir": "dist",
"rootDir": "src",
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"declaration": true
}
}`,
"/src/pkg2/node_modules/@raymondfeng/pkg1": new vfs.Symlink("/src/pkg1"),
"/src/pkg3/node_modules/@raymondfeng/pkg2": new vfs.Symlink("/src/pkg2"),
}),
commandLineArgs: ["-p", "src/pkg3", "--listFiles"]
rootProject: "pkg3",
files: [
{
path: `${tscWatch.projectRoot}/pkg1/dist/index.d.ts`,
content: Utils.dedent`
export * from './types';`
},
{
path: `${tscWatch.projectRoot}/pkg1/dist/types.d.ts`,
content: Utils.dedent`
export declare type A = {
id: string;
};
export declare type B = {
id: number;
};
export declare type IdType = A | B;
export declare class MetadataAccessor<T, D extends IdType = IdType> {
readonly key: string;
private constructor();
toString(): string;
static create<T, D extends IdType = IdType>(key: string): MetadataAccessor<T, D>;
}`
},
{
path: `${tscWatch.projectRoot}/pkg1/package.json`,
content: JSON.stringify({
name: "@raymondfeng/pkg1",
version: "1.0.0",
main: "dist/index.js",
typings: "dist/index.d.ts"
})
},
{
path: `${tscWatch.projectRoot}/pkg2/dist/index.d.ts`,
content: Utils.dedent`
export * from './types';`
},
{
path: `${tscWatch.projectRoot}/pkg2/dist/types.d.ts`,
content: Utils.dedent`
export {MetadataAccessor} from '@raymondfeng/pkg1';`
},
{
path: `${tscWatch.projectRoot}/pkg2/package.json`,
content: JSON.stringify({
name: "@raymondfeng/pkg2",
version: "1.0.0",
main: "dist/index.js",
typings: "dist/index.d.ts"
})
},
{
path: `${tscWatch.projectRoot}/pkg3/src/index.ts`,
content: Utils.dedent`
export * from './keys';`
},
{
path: `${tscWatch.projectRoot}/pkg3/src/keys.ts`,
content: Utils.dedent`
import {MetadataAccessor} from "@raymondfeng/pkg2";
export const ADMIN = MetadataAccessor.create<boolean>('1');`
},
{
path: `${tscWatch.projectRoot}/pkg3/tsconfig.json`,
content: JSON.stringify({
compilerOptions: {
outDir: "dist",
rootDir: "src",
target: "es5",
module: "commonjs",
strict: true,
esModuleInterop: true,
declaration: true
}
})
},
{
path: `${tscWatch.projectRoot}/pkg2/node_modules/@raymondfeng/pkg1`,
symLink: `${tscWatch.projectRoot}/pkg1`
},
{
path: `${tscWatch.projectRoot}/pkg3/node_modules/@raymondfeng/pkg2`,
symLink: `${tscWatch.projectRoot}/pkg2`
},
tscWatch.libFile
],
changeCaseFileTestPath: str => stringContains(str, "/pkg1"),
});
});
}
+12 -1
View File
@@ -300,6 +300,7 @@ namespace ts.tscWatch {
baselineSourceMap
} = input;
if (!isWatch(commandLineArgs)) sys.exit = exitCode => sys.exitCode = exitCode;
const { cb, getPrograms } = commandLineCallbacks(sys);
const watchOrSolution = executeCommandLine(
sys,
@@ -352,7 +353,17 @@ namespace ts.tscWatch {
baselineSourceMap
});
}
Harness.Baseline.runBaseline(`${isBuild(commandLineArgs) ? "tsbuild/watchMode" : "tscWatch"}/${scenario}/${subScenario.split(" ").join("-")}.js`, baseline.join("\r\n"));
Harness.Baseline.runBaseline(`${isBuild(commandLineArgs) ?
isWatch(commandLineArgs) ? "tsbuild/watchMode" : "tsbuild" :
isWatch(commandLineArgs) ? "tscWatch" : "tsc"}/${scenario}/${subScenario.split(" ").join("-")}.js`, baseline.join("\r\n"));
}
function isWatch(commandLineArgs: readonly string[]) {
return forEach(commandLineArgs, arg => {
if (arg.charCodeAt(0) !== CharacterCodes.minus) return false;
const option = arg.slice(arg.charCodeAt(1) === CharacterCodes.minus ? 2 : 1).toLowerCase();
return option === "watch" || option === "w";
});
}
export interface WatchBaseline extends TscWatchCheckOptions {
+3 -7
View File
@@ -1924,7 +1924,7 @@ declare namespace ts {
/** @throws OperationCanceledException if isCancellationRequested is true */
throwIfCancellationRequested(): void;
}
export interface Program extends ScriptReferenceHost, ModuleSpecifierResolutionHost {
export interface Program extends ScriptReferenceHost {
getCurrentDirectory(): string;
/**
* Get a list of root file names that were passed to a 'createProgram'
@@ -3182,11 +3182,6 @@ declare namespace ts {
directoryExists?(directoryName: string): boolean;
getCurrentDirectory?(): string;
}
export interface ModuleSpecifierResolutionHost extends GetEffectiveTypeRootsHost {
useCaseSensitiveFileNames?(): boolean;
fileExists?(path: string): boolean;
readFile?(path: string): string | undefined;
}
export interface TextSpan {
start: number;
length: number;
@@ -5102,7 +5097,7 @@ declare namespace ts {
fileName: Path;
packageName: string;
}
interface LanguageServiceHost extends ModuleSpecifierResolutionHost {
interface LanguageServiceHost extends GetEffectiveTypeRootsHost {
getCompilationSettings(): CompilerOptions;
getNewLine?(): string;
getProjectVersion?(): string;
@@ -5118,6 +5113,7 @@ declare namespace ts {
log?(s: string): void;
trace?(s: string): void;
error?(s: string): void;
useCaseSensitiveFileNames?(): boolean;
readDirectory?(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[];
readFile?(path: string, encoding?: string): string | undefined;
realpath?(path: string): string;
+3 -7
View File
@@ -1924,7 +1924,7 @@ declare namespace ts {
/** @throws OperationCanceledException if isCancellationRequested is true */
throwIfCancellationRequested(): void;
}
export interface Program extends ScriptReferenceHost, ModuleSpecifierResolutionHost {
export interface Program extends ScriptReferenceHost {
getCurrentDirectory(): string;
/**
* Get a list of root file names that were passed to a 'createProgram'
@@ -3182,11 +3182,6 @@ declare namespace ts {
directoryExists?(directoryName: string): boolean;
getCurrentDirectory?(): string;
}
export interface ModuleSpecifierResolutionHost extends GetEffectiveTypeRootsHost {
useCaseSensitiveFileNames?(): boolean;
fileExists?(path: string): boolean;
readFile?(path: string): string | undefined;
}
export interface TextSpan {
start: number;
length: number;
@@ -5102,7 +5097,7 @@ declare namespace ts {
fileName: Path;
packageName: string;
}
interface LanguageServiceHost extends ModuleSpecifierResolutionHost {
interface LanguageServiceHost extends GetEffectiveTypeRootsHost {
getCompilationSettings(): CompilerOptions;
getNewLine?(): string;
getProjectVersion?(): string;
@@ -5118,6 +5113,7 @@ declare namespace ts {
log?(s: string): void;
trace?(s: string): void;
error?(s: string): void;
useCaseSensitiveFileNames?(): boolean;
readDirectory?(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[];
readFile?(path: string, encoding?: string): string | undefined;
realpath?(path: string): string;
@@ -0,0 +1,60 @@
tests/cases/compiler/monorepo/pkg3/src/keys.ts(3,14): error TS2742: The inferred type of 'ADMIN' cannot be named without a reference to '../../pkg2/node_modules/@raymondfeng/pkg1/dist'. This is likely not portable. A type annotation is necessary.
==== tests/cases/compiler/monorepo/pkg3/tsconfig.json (0 errors) ====
{
"compilerOptions": {
"outDir": "dist",
"rootDir": "src",
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"declaration": true
}
}
==== tests/cases/compiler/monorepo/pkg1/dist/index.d.ts (0 errors) ====
export * from './types';
==== tests/cases/compiler/monorepo/pkg1/dist/types.d.ts (0 errors) ====
export declare type A = {
id: string;
};
export declare type B = {
id: number;
};
export declare type IdType = A | B;
export declare class MetadataAccessor<T, D extends IdType = IdType> {
readonly key: string;
private constructor();
toString(): string;
static create<T, D extends IdType = IdType>(key: string): MetadataAccessor<T, D>;
}
==== tests/cases/compiler/monorepo/pkg1/package.json (0 errors) ====
{
"name": "@raymondfeng/pkg1",
"version": "1.0.0",
"description": "",
"main": "dist/index.js",
"typings": "dist/index.d.ts"
}
==== tests/cases/compiler/monorepo/pkg2/dist/index.d.ts (0 errors) ====
export * from './types';
==== tests/cases/compiler/monorepo/pkg2/dist/types.d.ts (0 errors) ====
export {MetadataAccessor} from '@raymondfeng/pkg1';
==== tests/cases/compiler/monorepo/pkg2/package.json (0 errors) ====
{
"name": "@raymondfeng/pkg2",
"version": "1.0.0",
"description": "",
"main": "dist/index.js",
"typings": "dist/index.d.ts"
}
==== tests/cases/compiler/monorepo/pkg3/src/index.ts (0 errors) ====
export * from './keys';
==== tests/cases/compiler/monorepo/pkg3/src/keys.ts (1 errors) ====
import {MetadataAccessor} from "@raymondfeng/pkg2";
export const ADMIN = MetadataAccessor.create<boolean>('1');
~~~~~
!!! error TS2742: The inferred type of 'ADMIN' cannot be named without a reference to '../../pkg2/node_modules/@raymondfeng/pkg1/dist'. This is likely not portable. A type annotation is necessary.
@@ -65,8 +65,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./keys"), exports);
//// [keys.d.ts]
import { MetadataAccessor } from "@raymondfeng/pkg2";
export declare const ADMIN: MetadataAccessor<boolean, import("../../pkg1/dist").IdType>;
//// [index.d.ts]
export * from './keys';
@@ -1,48 +0,0 @@
//// [/lib/initial-buildOutput.txt]
/lib/tsc -p src/pkg3 --listFiles
src/pkg3/src/keys.ts:2:14 - error TS2742: The inferred type of 'ADMIN' cannot be named without a reference to '@raymondfeng/pkg2/node_modules/@raymondfeng/pkg1'. This is likely not portable. A type annotation is necessary.
2 export const ADMIN = MetadataAccessor.create<boolean>('1');
   ~~~~~
/lib/lib.d.ts
/src/pkg3/node_modules/@raymondfeng/pkg2/node_modules/@raymondfeng/pkg1/dist/types.d.ts
/src/pkg3/node_modules/@raymondfeng/pkg2/node_modules/@raymondfeng/pkg1/dist/index.d.ts
/src/pkg3/node_modules/@raymondfeng/pkg2/dist/types.d.ts
/src/pkg3/node_modules/@raymondfeng/pkg2/dist/index.d.ts
/src/pkg3/src/keys.ts
/src/pkg3/src/index.ts
Found 1 error.
exitCode:: ExitStatus.DiagnosticsPresent_OutputsSkipped
//// [/src/pkg3/dist/index.d.ts]
export * from './keys';
//// [/src/pkg3/dist/index.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./keys"), exports);
//// [/src/pkg3/dist/keys.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ADMIN = void 0;
var pkg2_1 = require("@raymondfeng/pkg2");
exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
@@ -1,38 +0,0 @@
//// [/lib/initial-buildOutput.txt]
/lib/tsc -p src/plugin-one --listFiles
/lib/lib.d.ts
/src/plugin-one/node_modules/typescript-fsa/index.d.ts
/src/plugin-one/action.ts
/src/plugin-one/node_modules/plugin-two/node_modules/typescript-fsa/index.d.ts
/src/plugin-one/node_modules/plugin-two/index.d.ts
/src/plugin-one/index.ts
exitCode:: ExitStatus.Success
//// [/src/plugin-one/action.d.ts]
export declare const actions: {
featureOne: import("typescript-fsa").ActionCreator<{
route: string;
}>;
};
//// [/src/plugin-one/action.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.actions = void 0;
var typescript_fsa_1 = require("typescript-fsa"); // Include version of shared lib
var action = typescript_fsa_1.actionCreatorFactory("somekey");
var featureOne = action("feature-one");
exports.actions = { featureOne: featureOne };
//// [/src/plugin-one/index.d.ts]
export {};
//// [/src/plugin-one/index.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,129 @@
/a/lib/tsc.js -p pkg3 --listFiles
//// [/user/username/projects/myProject/pkg1/dist/index.d.ts]
export * from './types';
//// [/user/username/projects/myProject/pkg1/dist/types.d.ts]
export declare type A = {
id: string;
};
export declare type B = {
id: number;
};
export declare type IdType = A | B;
export declare class MetadataAccessor<T, D extends IdType = IdType> {
readonly key: string;
private constructor();
toString(): string;
static create<T, D extends IdType = IdType>(key: string): MetadataAccessor<T, D>;
}
//// [/user/username/projects/myProject/pkg1/package.json]
{"name":"@raymondfeng/pkg1","version":"1.0.0","main":"dist/index.js","typings":"dist/index.d.ts"}
//// [/user/username/projects/myproject/pkg2/dist/index.d.ts]
export * from './types';
//// [/user/username/projects/myproject/pkg2/dist/types.d.ts]
export {MetadataAccessor} from '@raymondfeng/pkg1';
//// [/user/username/projects/myproject/pkg2/package.json]
{"name":"@raymondfeng/pkg2","version":"1.0.0","main":"dist/index.js","typings":"dist/index.d.ts"}
//// [/user/username/projects/myproject/pkg3/src/index.ts]
export * from './keys';
//// [/user/username/projects/myproject/pkg3/src/keys.ts]
import {MetadataAccessor} from "@raymondfeng/pkg2";
export const ADMIN = MetadataAccessor.create<boolean>('1');
//// [/user/username/projects/myproject/pkg3/tsconfig.json]
{"compilerOptions":{"outDir":"dist","rootDir":"src","target":"es5","module":"commonjs","strict":true,"esModuleInterop":true,"declaration":true}}
//// [/user/username/projects/myProject/pkg2/node_modules/@raymondfeng/pkg1] symlink(/user/username/projects/myProject/pkg1)
//// [/user/username/projects/myproject/pkg3/node_modules/@raymondfeng/pkg2] symlink(/user/username/projects/myproject/pkg2)
//// [/a/lib/lib.d.ts]
/// <reference no-default-lib="true"/>
interface Boolean {}
interface Function {}
interface CallableFunction {}
interface NewableFunction {}
interface IArguments {}
interface Number { toExponential: any; }
interface Object {}
interface RegExp {}
interface String { charAt: any; }
interface Array<T> { length: number; [n: number]: T; }
//// [/user/username/projects/myproject/pkg3/dist/keys.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ADMIN = void 0;
var pkg2_1 = require("@raymondfeng/pkg2");
exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
//// [/user/username/projects/myproject/pkg3/dist/index.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./keys"), exports);
//// [/user/username/projects/myproject/pkg3/dist/index.d.ts]
export * from './keys';
Output::
pkg3/src/keys.ts:2:14 - error TS2742: The inferred type of 'ADMIN' cannot be named without a reference to '../../pkg2/node_modules/@raymondfeng/pkg1/dist'. This is likely not portable. A type annotation is necessary.
2 export const ADMIN = MetadataAccessor.create<boolean>('1');
   ~~~~~
/a/lib/lib.d.ts
/user/username/projects/myProject/pkg1/dist/types.d.ts
/user/username/projects/myProject/pkg1/dist/index.d.ts
/user/username/projects/myproject/pkg2/dist/types.d.ts
/user/username/projects/myproject/pkg2/dist/index.d.ts
/user/username/projects/myproject/pkg3/src/keys.ts
/user/username/projects/myproject/pkg3/src/index.ts
Found 1 error.
Program root files: ["/user/username/projects/myproject/pkg3/src/index.ts","/user/username/projects/myproject/pkg3/src/keys.ts"]
Program options: {"outDir":"/user/username/projects/myproject/pkg3/dist","rootDir":"/user/username/projects/myproject/pkg3/src","target":1,"module":1,"strict":true,"esModuleInterop":true,"declaration":true,"project":"/user/username/projects/myproject/pkg3","listFiles":true,"configFilePath":"/user/username/projects/myproject/pkg3/tsconfig.json"}
Program files::
/a/lib/lib.d.ts
/user/username/projects/myProject/pkg1/dist/types.d.ts
/user/username/projects/myProject/pkg1/dist/index.d.ts
/user/username/projects/myproject/pkg2/dist/types.d.ts
/user/username/projects/myproject/pkg2/dist/index.d.ts
/user/username/projects/myproject/pkg3/src/keys.ts
/user/username/projects/myproject/pkg3/src/index.ts
WatchedFiles::
FsWatches::
FsWatchesRecursive::
exitCode:: ExitStatus.DiagnosticsPresent_OutputsSkipped
@@ -0,0 +1,129 @@
/a/lib/tsc.js -p pkg3 --listFiles
//// [/user/username/projects/myproject/pkg1/dist/index.d.ts]
export * from './types';
//// [/user/username/projects/myproject/pkg1/dist/types.d.ts]
export declare type A = {
id: string;
};
export declare type B = {
id: number;
};
export declare type IdType = A | B;
export declare class MetadataAccessor<T, D extends IdType = IdType> {
readonly key: string;
private constructor();
toString(): string;
static create<T, D extends IdType = IdType>(key: string): MetadataAccessor<T, D>;
}
//// [/user/username/projects/myproject/pkg1/package.json]
{"name":"@raymondfeng/pkg1","version":"1.0.0","main":"dist/index.js","typings":"dist/index.d.ts"}
//// [/user/username/projects/myproject/pkg2/dist/index.d.ts]
export * from './types';
//// [/user/username/projects/myproject/pkg2/dist/types.d.ts]
export {MetadataAccessor} from '@raymondfeng/pkg1';
//// [/user/username/projects/myproject/pkg2/package.json]
{"name":"@raymondfeng/pkg2","version":"1.0.0","main":"dist/index.js","typings":"dist/index.d.ts"}
//// [/user/username/projects/myproject/pkg3/src/index.ts]
export * from './keys';
//// [/user/username/projects/myproject/pkg3/src/keys.ts]
import {MetadataAccessor} from "@raymondfeng/pkg2";
export const ADMIN = MetadataAccessor.create<boolean>('1');
//// [/user/username/projects/myproject/pkg3/tsconfig.json]
{"compilerOptions":{"outDir":"dist","rootDir":"src","target":"es5","module":"commonjs","strict":true,"esModuleInterop":true,"declaration":true}}
//// [/user/username/projects/myproject/pkg2/node_modules/@raymondfeng/pkg1] symlink(/user/username/projects/myproject/pkg1)
//// [/user/username/projects/myproject/pkg3/node_modules/@raymondfeng/pkg2] symlink(/user/username/projects/myproject/pkg2)
//// [/a/lib/lib.d.ts]
/// <reference no-default-lib="true"/>
interface Boolean {}
interface Function {}
interface CallableFunction {}
interface NewableFunction {}
interface IArguments {}
interface Number { toExponential: any; }
interface Object {}
interface RegExp {}
interface String { charAt: any; }
interface Array<T> { length: number; [n: number]: T; }
//// [/user/username/projects/myproject/pkg3/dist/keys.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ADMIN = void 0;
var pkg2_1 = require("@raymondfeng/pkg2");
exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
//// [/user/username/projects/myproject/pkg3/dist/index.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
Object.defineProperty(exports, "__esModule", { value: true });
__exportStar(require("./keys"), exports);
//// [/user/username/projects/myproject/pkg3/dist/index.d.ts]
export * from './keys';
Output::
pkg3/src/keys.ts:2:14 - error TS2742: The inferred type of 'ADMIN' cannot be named without a reference to '../../pkg2/node_modules/@raymondfeng/pkg1/dist'. This is likely not portable. A type annotation is necessary.
2 export const ADMIN = MetadataAccessor.create<boolean>('1');
   ~~~~~
/a/lib/lib.d.ts
/user/username/projects/myproject/pkg1/dist/types.d.ts
/user/username/projects/myproject/pkg1/dist/index.d.ts
/user/username/projects/myproject/pkg2/dist/types.d.ts
/user/username/projects/myproject/pkg2/dist/index.d.ts
/user/username/projects/myproject/pkg3/src/keys.ts
/user/username/projects/myproject/pkg3/src/index.ts
Found 1 error.
Program root files: ["/user/username/projects/myproject/pkg3/src/index.ts","/user/username/projects/myproject/pkg3/src/keys.ts"]
Program options: {"outDir":"/user/username/projects/myproject/pkg3/dist","rootDir":"/user/username/projects/myproject/pkg3/src","target":1,"module":1,"strict":true,"esModuleInterop":true,"declaration":true,"project":"/user/username/projects/myproject/pkg3","listFiles":true,"configFilePath":"/user/username/projects/myproject/pkg3/tsconfig.json"}
Program files::
/a/lib/lib.d.ts
/user/username/projects/myproject/pkg1/dist/types.d.ts
/user/username/projects/myproject/pkg1/dist/index.d.ts
/user/username/projects/myproject/pkg2/dist/types.d.ts
/user/username/projects/myproject/pkg2/dist/index.d.ts
/user/username/projects/myproject/pkg3/src/keys.ts
/user/username/projects/myproject/pkg3/src/index.ts
WatchedFiles::
FsWatches::
FsWatchesRecursive::
exitCode:: ExitStatus.DiagnosticsPresent_OutputsSkipped
@@ -0,0 +1,234 @@
/a/lib/tsc.js -p plugin-one --listFiles
//// [/user/username/projects/myProject/plugin-two/index.d.ts]
declare const _default: {
features: {
featureOne: {
actions: {
featureOne: {
(payload: {
name: string;
order: number;
}, meta?: {
[key: string]: any;
}): import("typescript-fsa").Action<{
name: string;
order: number;
}>;
};
};
path: string;
};
};
};
export default _default;
//// [/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/package.json]
{"name":"typescript-fsa","version":"3.0.0-beta-2"}
//// [/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts]
export interface Action<Payload> {
type: string;
payload: Payload;
}
export declare type ActionCreator<Payload> = {
type: string;
(payload: Payload): Action<Payload>;
}
export interface ActionCreatorFactory {
<Payload = void>(type: string): ActionCreator<Payload>;
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;
//// [/user/username/projects/myproject/plugin-one/tsconfig.json]
{"compilerOptions":{"target":"es5","declaration":true,"traceResolution":true}}
//// [/user/username/projects/myproject/plugin-one/index.ts]
import pluginTwo from "plugin-two"; // include this to add reference to symlink
//// [/user/username/projects/myproject/plugin-one/action.ts]
import { actionCreatorFactory } from "typescript-fsa"; // Include version of shared lib
const action = actionCreatorFactory("somekey");
const featureOne = action<{ route: string }>("feature-one");
export const actions = { featureOne };
//// [/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/package.json]
{"name":"typescript-fsa","version":"3.0.0-beta-2"}
//// [/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts]
export interface Action<Payload> {
type: string;
payload: Payload;
}
export declare type ActionCreator<Payload> = {
type: string;
(payload: Payload): Action<Payload>;
}
export interface ActionCreatorFactory {
<Payload = void>(type: string): ActionCreator<Payload>;
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;
//// [/user/username/projects/myProject/plugin-one/node_modules/plugin-two] symlink(/user/username/projects/myProject/plugin-two)
//// [/a/lib/lib.d.ts]
/// <reference no-default-lib="true"/>
interface Boolean {}
interface Function {}
interface CallableFunction {}
interface NewableFunction {}
interface IArguments {}
interface Number { toExponential: any; }
interface Object {}
interface RegExp {}
interface String { charAt: any; }
interface Array<T> { length: number; [n: number]: T; }
//// [/user/username/projects/myproject/plugin-one/action.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.actions = void 0;
var typescript_fsa_1 = require("typescript-fsa"); // Include version of shared lib
var action = typescript_fsa_1.actionCreatorFactory("somekey");
var featureOne = action("feature-one");
exports.actions = { featureOne: featureOne };
//// [/user/username/projects/myproject/plugin-one/action.d.ts]
export declare const actions: {
featureOne: import("typescript-fsa").ActionCreator<{
route: string;
}>;
};
//// [/user/username/projects/myproject/plugin-one/index.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//// [/user/username/projects/myproject/plugin-one/index.d.ts]
export {};
Output::
======== Resolving module 'typescript-fsa' from '/user/username/projects/myproject/plugin-one/action.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'typescript-fsa' from 'node_modules' folder, target file type 'TypeScript'.
Found 'package.json' at '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' does not have a 'main' field.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts', result '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts'.
======== Module name 'typescript-fsa' was successfully resolved to '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts' with Package ID 'typescript-fsa/index.d.ts@3.0.0-beta-2'. ========
======== Resolving module 'plugin-two' from '/user/username/projects/myproject/plugin-one/index.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'plugin-two' from 'node_modules' folder, target file type 'TypeScript'.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/package.json' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.d.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/index.d.ts', result '/user/username/projects/myProject/plugin-two/index.d.ts'.
======== Module name 'plugin-two' was successfully resolved to '/user/username/projects/myProject/plugin-two/index.d.ts'. ========
======== Resolving module 'typescript-fsa' from '/user/username/projects/myProject/plugin-two/index.d.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'typescript-fsa' from 'node_modules' folder, target file type 'TypeScript'.
Found 'package.json' at '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa.ts' does not exist.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa.tsx' does not exist.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' does not have a 'main' field.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.ts' does not exist.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.tsx' does not exist.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts', result '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts'.
======== Module name 'typescript-fsa' was successfully resolved to '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts' with Package ID 'typescript-fsa/index.d.ts@3.0.0-beta-2'. ========
/a/lib/lib.d.ts
/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-one/action.ts
/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myProject/plugin-two/index.d.ts
/user/username/projects/myproject/plugin-one/index.ts
Program root files: ["/user/username/projects/myproject/plugin-one/action.ts","/user/username/projects/myproject/plugin-one/index.ts"]
Program options: {"target":1,"declaration":true,"traceResolution":true,"project":"/user/username/projects/myproject/plugin-one","listFiles":true,"configFilePath":"/user/username/projects/myproject/plugin-one/tsconfig.json"}
Program files::
/a/lib/lib.d.ts
/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-one/action.ts
/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myProject/plugin-two/index.d.ts
/user/username/projects/myproject/plugin-one/index.ts
WatchedFiles::
FsWatches::
FsWatchesRecursive::
exitCode:: ExitStatus.Success
@@ -0,0 +1,248 @@
/a/lib/tsc.js -p plugin-one --listFiles
//// [/user/username/projects/myProject/plugin-two/package.json]
{"name":"plugin-two","version":"0.1.3","main":"dist/commonjs/index.js"}
//// [/user/username/projects/myProject/plugin-two/dist/commonjs/index.d.ts]
declare const _default: {
features: {
featureOne: {
actions: {
featureOne: {
(payload: {
name: string;
order: number;
}, meta?: {
[key: string]: any;
}): import("typescript-fsa").Action<{
name: string;
order: number;
}>;
};
};
path: string;
};
};
};
export default _default;
//// [/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/package.json]
{"name":"typescript-fsa","version":"3.0.0-beta-2"}
//// [/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts]
export interface Action<Payload> {
type: string;
payload: Payload;
}
export declare type ActionCreator<Payload> = {
type: string;
(payload: Payload): Action<Payload>;
}
export interface ActionCreatorFactory {
<Payload = void>(type: string): ActionCreator<Payload>;
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;
//// [/user/username/projects/myproject/plugin-one/tsconfig.json]
{"compilerOptions":{"target":"es5","declaration":true,"traceResolution":true}}
//// [/user/username/projects/myproject/plugin-one/index.ts]
import pluginTwo from "plugin-two"; // include this to add reference to symlink
import { actionCreatorFactory } from "typescript-fsa"; // Include version of shared lib
const action = actionCreatorFactory("somekey");
const featureOne = action<{ route: string }>("feature-one");
export const actions = { featureOne };
//// [/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/package.json]
{"name":"typescript-fsa","version":"3.0.0-beta-2"}
//// [/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts]
export interface Action<Payload> {
type: string;
payload: Payload;
}
export declare type ActionCreator<Payload> = {
type: string;
(payload: Payload): Action<Payload>;
}
export interface ActionCreatorFactory {
<Payload = void>(type: string): ActionCreator<Payload>;
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;
//// [/temp/yarn/data/link/plugin-two] symlink(/user/username/projects/myProject/plugin-two)
//// [/user/username/projects/myProject/plugin-one/node_modules/plugin-two] symlink(/temp/yarn/data/link/plugin-two)
//// [/a/lib/lib.d.ts]
/// <reference no-default-lib="true"/>
interface Boolean {}
interface Function {}
interface CallableFunction {}
interface NewableFunction {}
interface IArguments {}
interface Number { toExponential: any; }
interface Object {}
interface RegExp {}
interface String { charAt: any; }
interface Array<T> { length: number; [n: number]: T; }
//// [/user/username/projects/myproject/plugin-one/index.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.actions = void 0;
var typescript_fsa_1 = require("typescript-fsa"); // Include version of shared lib
var action = typescript_fsa_1.actionCreatorFactory("somekey");
var featureOne = action("feature-one");
exports.actions = { featureOne: featureOne };
//// [/user/username/projects/myproject/plugin-one/index.d.ts]
export declare const actions: {
featureOne: import("typescript-fsa").ActionCreator<{
route: string;
}>;
};
Output::
======== Resolving module 'plugin-two' from '/user/username/projects/myproject/plugin-one/index.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'plugin-two' from 'node_modules' folder, target file type 'TypeScript'.
Found 'package.json' at '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' has 'main' field 'dist/commonjs/index.js' that references '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js'.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js' does not exist.
Loading module as file / folder, candidate module location '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js', target file type 'TypeScript'.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js.d.ts' does not exist.
File name '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js' has a '.js' extension - stripping it.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.d.ts', result '/user/username/projects/myProject/plugin-two/dist/commonjs/index.d.ts'.
======== Module name 'plugin-two' was successfully resolved to '/user/username/projects/myProject/plugin-two/dist/commonjs/index.d.ts' with Package ID 'plugin-two/dist/commonjs/index.d.ts@0.1.3'. ========
======== Resolving module 'typescript-fsa' from '/user/username/projects/myproject/plugin-one/index.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'typescript-fsa' from 'node_modules' folder, target file type 'TypeScript'.
Found 'package.json' at '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' does not have a 'main' field.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts', result '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts'.
======== Module name 'typescript-fsa' was successfully resolved to '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts' with Package ID 'typescript-fsa/index.d.ts@3.0.0-beta-2'. ========
======== Resolving module 'typescript-fsa' from '/user/username/projects/myProject/plugin-two/dist/commonjs/index.d.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'typescript-fsa' from 'node_modules' folder, target file type 'TypeScript'.
Directory '/user/username/projects/myProject/plugin-two/dist/commonjs/node_modules' does not exist, skipping all lookups in it.
Directory '/user/username/projects/myProject/plugin-two/dist/node_modules' does not exist, skipping all lookups in it.
Found 'package.json' at '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa.ts' does not exist.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa.tsx' does not exist.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' does not have a 'main' field.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.ts' does not exist.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.tsx' does not exist.
File '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts', result '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts'.
======== Module name 'typescript-fsa' was successfully resolved to '/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts' with Package ID 'typescript-fsa/index.d.ts@3.0.0-beta-2'. ========
/a/lib/lib.d.ts
/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myProject/plugin-two/dist/commonjs/index.d.ts
/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-one/index.ts
Program root files: ["/user/username/projects/myproject/plugin-one/index.ts"]
Program options: {"target":1,"declaration":true,"traceResolution":true,"project":"/user/username/projects/myproject/plugin-one","listFiles":true,"configFilePath":"/user/username/projects/myproject/plugin-one/tsconfig.json"}
Program files::
/a/lib/lib.d.ts
/user/username/projects/myProject/plugin-two/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myProject/plugin-two/dist/commonjs/index.d.ts
/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-one/index.ts
WatchedFiles::
FsWatches::
FsWatchesRecursive::
exitCode:: ExitStatus.Success
@@ -0,0 +1,248 @@
/a/lib/tsc.js -p plugin-one --listFiles
//// [/user/username/projects/myproject/plugin-two/package.json]
{"name":"plugin-two","version":"0.1.3","main":"dist/commonjs/index.js"}
//// [/user/username/projects/myproject/plugin-two/dist/commonjs/index.d.ts]
declare const _default: {
features: {
featureOne: {
actions: {
featureOne: {
(payload: {
name: string;
order: number;
}, meta?: {
[key: string]: any;
}): import("typescript-fsa").Action<{
name: string;
order: number;
}>;
};
};
path: string;
};
};
};
export default _default;
//// [/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/package.json]
{"name":"typescript-fsa","version":"3.0.0-beta-2"}
//// [/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts]
export interface Action<Payload> {
type: string;
payload: Payload;
}
export declare type ActionCreator<Payload> = {
type: string;
(payload: Payload): Action<Payload>;
}
export interface ActionCreatorFactory {
<Payload = void>(type: string): ActionCreator<Payload>;
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;
//// [/user/username/projects/myproject/plugin-one/tsconfig.json]
{"compilerOptions":{"target":"es5","declaration":true,"traceResolution":true}}
//// [/user/username/projects/myproject/plugin-one/index.ts]
import pluginTwo from "plugin-two"; // include this to add reference to symlink
import { actionCreatorFactory } from "typescript-fsa"; // Include version of shared lib
const action = actionCreatorFactory("somekey");
const featureOne = action<{ route: string }>("feature-one");
export const actions = { featureOne };
//// [/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/package.json]
{"name":"typescript-fsa","version":"3.0.0-beta-2"}
//// [/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts]
export interface Action<Payload> {
type: string;
payload: Payload;
}
export declare type ActionCreator<Payload> = {
type: string;
(payload: Payload): Action<Payload>;
}
export interface ActionCreatorFactory {
<Payload = void>(type: string): ActionCreator<Payload>;
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;
//// [/temp/yarn/data/link/plugin-two] symlink(/user/username/projects/myproject/plugin-two)
//// [/user/username/projects/myproject/plugin-one/node_modules/plugin-two] symlink(/temp/yarn/data/link/plugin-two)
//// [/a/lib/lib.d.ts]
/// <reference no-default-lib="true"/>
interface Boolean {}
interface Function {}
interface CallableFunction {}
interface NewableFunction {}
interface IArguments {}
interface Number { toExponential: any; }
interface Object {}
interface RegExp {}
interface String { charAt: any; }
interface Array<T> { length: number; [n: number]: T; }
//// [/user/username/projects/myproject/plugin-one/index.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.actions = void 0;
var typescript_fsa_1 = require("typescript-fsa"); // Include version of shared lib
var action = typescript_fsa_1.actionCreatorFactory("somekey");
var featureOne = action("feature-one");
exports.actions = { featureOne: featureOne };
//// [/user/username/projects/myproject/plugin-one/index.d.ts]
export declare const actions: {
featureOne: import("typescript-fsa").ActionCreator<{
route: string;
}>;
};
Output::
======== Resolving module 'plugin-two' from '/user/username/projects/myproject/plugin-one/index.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'plugin-two' from 'node_modules' folder, target file type 'TypeScript'.
Found 'package.json' at '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' has 'main' field 'dist/commonjs/index.js' that references '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js'.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js' does not exist.
Loading module as file / folder, candidate module location '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js', target file type 'TypeScript'.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js.d.ts' does not exist.
File name '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.js' has a '.js' extension - stripping it.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/dist/commonjs/index.d.ts', result '/user/username/projects/myproject/plugin-two/dist/commonjs/index.d.ts'.
======== Module name 'plugin-two' was successfully resolved to '/user/username/projects/myproject/plugin-two/dist/commonjs/index.d.ts' with Package ID 'plugin-two/dist/commonjs/index.d.ts@0.1.3'. ========
======== Resolving module 'typescript-fsa' from '/user/username/projects/myproject/plugin-one/index.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'typescript-fsa' from 'node_modules' folder, target file type 'TypeScript'.
Found 'package.json' at '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' does not have a 'main' field.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts', result '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts'.
======== Module name 'typescript-fsa' was successfully resolved to '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts' with Package ID 'typescript-fsa/index.d.ts@3.0.0-beta-2'. ========
======== Resolving module 'typescript-fsa' from '/user/username/projects/myproject/plugin-two/dist/commonjs/index.d.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'typescript-fsa' from 'node_modules' folder, target file type 'TypeScript'.
Directory '/user/username/projects/myproject/plugin-two/dist/commonjs/node_modules' does not exist, skipping all lookups in it.
Directory '/user/username/projects/myproject/plugin-two/dist/node_modules' does not exist, skipping all lookups in it.
Found 'package.json' at '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa.ts' does not exist.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa.tsx' does not exist.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' does not have a 'main' field.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts', result '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts'.
======== Module name 'typescript-fsa' was successfully resolved to '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts' with Package ID 'typescript-fsa/index.d.ts@3.0.0-beta-2'. ========
/a/lib/lib.d.ts
/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-two/dist/commonjs/index.d.ts
/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-one/index.ts
Program root files: ["/user/username/projects/myproject/plugin-one/index.ts"]
Program options: {"target":1,"declaration":true,"traceResolution":true,"project":"/user/username/projects/myproject/plugin-one","listFiles":true,"configFilePath":"/user/username/projects/myproject/plugin-one/tsconfig.json"}
Program files::
/a/lib/lib.d.ts
/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-two/dist/commonjs/index.d.ts
/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-one/index.ts
WatchedFiles::
FsWatches::
FsWatchesRecursive::
exitCode:: ExitStatus.Success
@@ -0,0 +1,234 @@
/a/lib/tsc.js -p plugin-one --listFiles
//// [/user/username/projects/myproject/plugin-two/index.d.ts]
declare const _default: {
features: {
featureOne: {
actions: {
featureOne: {
(payload: {
name: string;
order: number;
}, meta?: {
[key: string]: any;
}): import("typescript-fsa").Action<{
name: string;
order: number;
}>;
};
};
path: string;
};
};
};
export default _default;
//// [/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/package.json]
{"name":"typescript-fsa","version":"3.0.0-beta-2"}
//// [/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts]
export interface Action<Payload> {
type: string;
payload: Payload;
}
export declare type ActionCreator<Payload> = {
type: string;
(payload: Payload): Action<Payload>;
}
export interface ActionCreatorFactory {
<Payload = void>(type: string): ActionCreator<Payload>;
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;
//// [/user/username/projects/myproject/plugin-one/tsconfig.json]
{"compilerOptions":{"target":"es5","declaration":true,"traceResolution":true}}
//// [/user/username/projects/myproject/plugin-one/index.ts]
import pluginTwo from "plugin-two"; // include this to add reference to symlink
//// [/user/username/projects/myproject/plugin-one/action.ts]
import { actionCreatorFactory } from "typescript-fsa"; // Include version of shared lib
const action = actionCreatorFactory("somekey");
const featureOne = action<{ route: string }>("feature-one");
export const actions = { featureOne };
//// [/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/package.json]
{"name":"typescript-fsa","version":"3.0.0-beta-2"}
//// [/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts]
export interface Action<Payload> {
type: string;
payload: Payload;
}
export declare type ActionCreator<Payload> = {
type: string;
(payload: Payload): Action<Payload>;
}
export interface ActionCreatorFactory {
<Payload = void>(type: string): ActionCreator<Payload>;
}
export declare function actionCreatorFactory(prefix?: string | null): ActionCreatorFactory;
export default actionCreatorFactory;
//// [/user/username/projects/myproject/plugin-one/node_modules/plugin-two] symlink(/user/username/projects/myproject/plugin-two)
//// [/a/lib/lib.d.ts]
/// <reference no-default-lib="true"/>
interface Boolean {}
interface Function {}
interface CallableFunction {}
interface NewableFunction {}
interface IArguments {}
interface Number { toExponential: any; }
interface Object {}
interface RegExp {}
interface String { charAt: any; }
interface Array<T> { length: number; [n: number]: T; }
//// [/user/username/projects/myproject/plugin-one/action.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.actions = void 0;
var typescript_fsa_1 = require("typescript-fsa"); // Include version of shared lib
var action = typescript_fsa_1.actionCreatorFactory("somekey");
var featureOne = action("feature-one");
exports.actions = { featureOne: featureOne };
//// [/user/username/projects/myproject/plugin-one/action.d.ts]
export declare const actions: {
featureOne: import("typescript-fsa").ActionCreator<{
route: string;
}>;
};
//// [/user/username/projects/myproject/plugin-one/index.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//// [/user/username/projects/myproject/plugin-one/index.d.ts]
export {};
Output::
======== Resolving module 'typescript-fsa' from '/user/username/projects/myproject/plugin-one/action.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'typescript-fsa' from 'node_modules' folder, target file type 'TypeScript'.
Found 'package.json' at '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' does not have a 'main' field.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts', result '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts'.
======== Module name 'typescript-fsa' was successfully resolved to '/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts' with Package ID 'typescript-fsa/index.d.ts@3.0.0-beta-2'. ========
======== Resolving module 'plugin-two' from '/user/username/projects/myproject/plugin-one/index.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'plugin-two' from 'node_modules' folder, target file type 'TypeScript'.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/package.json' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two.d.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-one/node_modules/plugin-two/index.d.ts', result '/user/username/projects/myproject/plugin-two/index.d.ts'.
======== Module name 'plugin-two' was successfully resolved to '/user/username/projects/myproject/plugin-two/index.d.ts'. ========
======== Resolving module 'typescript-fsa' from '/user/username/projects/myproject/plugin-two/index.d.ts'. ========
Module resolution kind is not specified, using 'NodeJs'.
Loading module 'typescript-fsa' from 'node_modules' folder, target file type 'TypeScript'.
Found 'package.json' at '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/package.json'.
'package.json' does not have a 'typesVersions' field.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa.ts' does not exist.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa.tsx' does not exist.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa.d.ts' does not exist.
'package.json' does not have a 'typings' field.
'package.json' does not have a 'types' field.
'package.json' does not have a 'main' field.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.ts' does not exist.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.tsx' does not exist.
File '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts' exist - use it as a name resolution result.
Resolving real path for '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts', result '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts'.
======== Module name 'typescript-fsa' was successfully resolved to '/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts' with Package ID 'typescript-fsa/index.d.ts@3.0.0-beta-2'. ========
/a/lib/lib.d.ts
/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-one/action.ts
/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-two/index.d.ts
/user/username/projects/myproject/plugin-one/index.ts
Program root files: ["/user/username/projects/myproject/plugin-one/action.ts","/user/username/projects/myproject/plugin-one/index.ts"]
Program options: {"target":1,"declaration":true,"traceResolution":true,"project":"/user/username/projects/myproject/plugin-one","listFiles":true,"configFilePath":"/user/username/projects/myproject/plugin-one/tsconfig.json"}
Program files::
/a/lib/lib.d.ts
/user/username/projects/myproject/plugin-one/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-one/action.ts
/user/username/projects/myproject/plugin-two/node_modules/typescript-fsa/index.d.ts
/user/username/projects/myproject/plugin-two/index.d.ts
/user/username/projects/myproject/plugin-one/index.ts
WatchedFiles::
FsWatches::
FsWatchesRecursive::
exitCode:: ExitStatus.Success