Always recreate the file watcher when rename event occurs (#48997)

* Convert some of the watchEnvironment tests to baselines for updating later

* Add tests for inode watching by making fsWatch part of system function that tests presence before creating fs watch

* Refactor for simpler tests

* Accept map of file content or file or symlink or folder

* Add test when rename event occurs when file has already reappeared

* On rename event for the file, replace file watcher irrespective of file presence

* Fix regex

* Ensure that when doing inode watching watchers is replaces only on disappearance or appearance

* Some logging for debugging further

* Revert "Some logging for debugging further"

This reverts commit dd2164ac83.

* Add test when rename event occurs on mac with ~ appended to file name

* If the relativeFileName ends with tilde, remove it from the event

* Some logging for debugging further

* Revert "Some logging for debugging further"

This reverts commit e1ba8a8d5f.

* Add documentation and fail safe the event firing
This commit is contained in:
Sheetal Nandi
2022-06-08 17:54:57 -07:00
committed by GitHub
parent ce639352bb
commit f5ad78720f
541 changed files with 43227 additions and 7785 deletions
+179 -145
View File
@@ -518,7 +518,7 @@ namespace ts {
useCaseSensitiveFileNames: boolean;
getCurrentDirectory: System["getCurrentDirectory"];
getAccessibleSortedChildDirectories(path: string): readonly string[];
directoryExists(dir: string): boolean;
fileSystemEntryExists: FileSystemEntryExists;
realpath(s: string): string;
setTimeout: NonNullable<System["setTimeout"]>;
clearTimeout: NonNullable<System["clearTimeout"]>;
@@ -535,7 +535,7 @@ namespace ts {
useCaseSensitiveFileNames,
getCurrentDirectory,
getAccessibleSortedChildDirectories,
directoryExists,
fileSystemEntryExists,
realpath,
setTimeout,
clearTimeout
@@ -655,7 +655,7 @@ namespace ts {
function nonSyncUpdateChildWatches(dirName: string, dirPath: Path, fileName: string, options: WatchOptions | undefined) {
// Iterate through existing children and update the watches if needed
const parentWatcher = cache.get(dirPath);
if (parentWatcher && directoryExists(dirName)) {
if (parentWatcher && fileSystemEntryExists(dirName, FileSystemEntryKind.Directory)) {
// Schedule the update and postpone invoke for callbacks
scheduleUpdateChildWatches(dirName, dirPath, fileName, options);
return;
@@ -733,7 +733,7 @@ namespace ts {
if (!parentWatcher) return false;
let newChildWatches: ChildDirectoryWatcher[] | undefined;
const hasChanges = enumerateInsertsAndDeletes<string, ChildDirectoryWatcher>(
directoryExists(parentDir) ? mapDefined(getAccessibleSortedChildDirectories(parentDir), child => {
fileSystemEntryExists(parentDir, FileSystemEntryKind.Directory) ? mapDefined(getAccessibleSortedChildDirectories(parentDir), child => {
const childFullName = getNormalizedAbsolutePath(child, parentDir);
// Filter our the symbolic link directories since those arent included in recursive watch
// which is same behaviour when recursive: true is passed to fs.watch
@@ -780,7 +780,12 @@ namespace ts {
export type FsWatchCallback = (eventName: "rename" | "change", relativeFileName: string | undefined, modifiedTime?: Date) => void;
/*@internal*/
export type FsWatch = (fileOrDirectory: string, entryKind: FileSystemEntryKind, callback: FsWatchCallback, recursive: boolean, fallbackPollingInterval: PollingInterval, fallbackOptions: WatchOptions | undefined) => FileWatcher;
/*@internal*/
export interface FsWatchWorkerWatcher extends FileWatcher {
on(eventName: string, listener: () => void): void;
}
/*@internal*/
export type FsWatchWorker = (fileOrDirectory: string, recursive: boolean, callback: FsWatchCallback) => FsWatchWorkerWatcher;
/*@internal*/
export const enum FileSystemEntryKind {
File,
@@ -843,6 +848,9 @@ namespace ts {
};
}
/*@internal*/
export type FileSystemEntryExists = (fileorDirectrory: string, entryKind: FileSystemEntryKind) => boolean;
/*@internal*/
export interface CreateSystemWatchFunctions {
// Polling watch file
@@ -852,11 +860,11 @@ namespace ts {
setTimeout: NonNullable<System["setTimeout"]>;
clearTimeout: NonNullable<System["clearTimeout"]>;
// For fs events :
fsWatch: FsWatch;
fsWatchWorker: FsWatchWorker;
fileSystemEntryExists: FileSystemEntryExists;
useCaseSensitiveFileNames: boolean;
getCurrentDirectory: System["getCurrentDirectory"];
fsSupportsRecursiveFsWatch: boolean;
directoryExists: System["directoryExists"];
getAccessibleSortedChildDirectories(path: string): readonly string[];
realpath(s: string): string;
// For backward compatibility environment variables
@@ -864,6 +872,8 @@ namespace ts {
useNonPollingWatchers?: boolean;
tscWatchDirectory: string | undefined;
defaultWatchFileKind: System["defaultWatchFileKind"];
inodeWatching: boolean;
sysLog: (s: string) => void;
}
/*@internal*/
@@ -872,22 +882,25 @@ namespace ts {
getModifiedTime,
setTimeout,
clearTimeout,
fsWatch,
fsWatchWorker,
fileSystemEntryExists,
useCaseSensitiveFileNames,
getCurrentDirectory,
fsSupportsRecursiveFsWatch,
directoryExists,
getAccessibleSortedChildDirectories,
realpath,
tscWatchFile,
useNonPollingWatchers,
tscWatchDirectory,
defaultWatchFileKind,
inodeWatching,
sysLog,
}: CreateSystemWatchFunctions): { watchFile: HostWatchFile; watchDirectory: HostWatchDirectory; } {
let dynamicPollingWatchFile: HostWatchFile | undefined;
let fixedChunkSizePollingWatchFile: HostWatchFile | undefined;
let nonPollingWatchFile: HostWatchFile | undefined;
let hostRecursiveDirectoryWatcher: HostWatchDirectory | undefined;
let hitSystemWatcherLimit = false;
return {
watchFile,
watchDirectory
@@ -989,7 +1002,7 @@ namespace ts {
hostRecursiveDirectoryWatcher = createDirectoryWatcherSupportingRecursive({
useCaseSensitiveFileNames,
getCurrentDirectory,
directoryExists,
fileSystemEntryExists,
getAccessibleSortedChildDirectories,
watchDirectory: nonRecursiveWatchDirectory,
realpath,
@@ -1059,6 +1072,147 @@ namespace ts {
};
}
}
function fsWatch(
fileOrDirectory: string,
entryKind: FileSystemEntryKind,
callback: FsWatchCallback,
recursive: boolean,
fallbackPollingInterval: PollingInterval,
fallbackOptions: WatchOptions | undefined
): FileWatcher {
let lastDirectoryPartWithDirectorySeparator: string | undefined;
let lastDirectoryPart: string | undefined;
if (inodeWatching) {
lastDirectoryPartWithDirectorySeparator = fileOrDirectory.substring(fileOrDirectory.lastIndexOf(directorySeparator));
lastDirectoryPart = lastDirectoryPartWithDirectorySeparator.slice(directorySeparator.length);
}
/** Watcher for the file system entry depending on whether it is missing or present */
let watcher = !fileSystemEntryExists(fileOrDirectory, entryKind) ?
watchMissingFileSystemEntry() :
watchPresentFileSystemEntry();
return {
close: () => {
// Close the watcher (either existing file system entry watcher or missing file system entry watcher)
watcher.close();
watcher = undefined!;
}
};
function updateWatcher(createWatcher: () => FileWatcher) {
// If watcher is not closed, update it
if (watcher) {
sysLog(`sysLog:: ${fileOrDirectory}:: Changing watcher to ${createWatcher === watchPresentFileSystemEntry ? "Present" : "Missing"}FileSystemEntryWatcher`);
watcher.close();
watcher = createWatcher();
}
}
/**
* Watch the file or directory that is currently present
* and when the watched file or directory is deleted, switch to missing file system entry watcher
*/
function watchPresentFileSystemEntry(): FileWatcher {
if (hitSystemWatcherLimit) {
sysLog(`sysLog:: ${fileOrDirectory}:: Defaulting to watchFile`);
return watchPresentFileSystemEntryWithFsWatchFile();
}
try {
const presentWatcher = fsWatchWorker(
fileOrDirectory,
recursive,
inodeWatching ?
callbackChangingToMissingFileSystemEntry :
callback
);
// Watch the missing file or directory or error
presentWatcher.on("error", () => {
callback("rename", "");
updateWatcher(watchMissingFileSystemEntry);
});
return presentWatcher;
}
catch (e) {
// Catch the exception and use polling instead
// Eg. on linux the number of watches are limited and one could easily exhaust watches and the exception ENOSPC is thrown when creating watcher at that point
// so instead of throwing error, use fs.watchFile
hitSystemWatcherLimit ||= e.code === "ENOSPC";
sysLog(`sysLog:: ${fileOrDirectory}:: Changing to watchFile`);
return watchPresentFileSystemEntryWithFsWatchFile();
}
}
function callbackChangingToMissingFileSystemEntry(event: "rename" | "change", relativeName: string | undefined) {
// In some scenarios, file save operation fires event with fileName.ext~ instead of fileName.ext
// To ensure we see the file going missing and coming back up (file delete and then recreated)
// and watches being updated correctly we are calling back with fileName.ext as well as fileName.ext~
// The worst is we have fired event that was not needed but we wont miss any changes
// especially in cases where file goes missing and watches wrong inode
let originalRelativeName: string | undefined;
if (relativeName && endsWith(relativeName, "~")) {
originalRelativeName = relativeName;
relativeName = relativeName.slice(0, relativeName.length - 1);
}
// because relativeName is not guaranteed to be correct we need to check on each rename with few combinations
// Eg on ubuntu while watching app/node_modules the relativeName is "node_modules" which is neither relative nor full path
if (event === "rename" &&
(!relativeName ||
relativeName === lastDirectoryPart ||
endsWith(relativeName, lastDirectoryPartWithDirectorySeparator!))) {
const modifiedTime = getModifiedTime(fileOrDirectory) || missingFileModifiedTime;
if (originalRelativeName) callback(event, originalRelativeName, modifiedTime);
callback(event, relativeName, modifiedTime);
if (inodeWatching) {
// If this was rename event, inode has changed means we need to update watcher
updateWatcher(modifiedTime === missingFileModifiedTime ? watchMissingFileSystemEntry : watchPresentFileSystemEntry);
}
else if (modifiedTime === missingFileModifiedTime) {
updateWatcher(watchMissingFileSystemEntry);
}
}
else {
if (originalRelativeName) callback(event, originalRelativeName);
callback(event, relativeName);
}
}
/**
* Watch the file or directory using fs.watchFile since fs.watch threw exception
* Eg. on linux the number of watches are limited and one could easily exhaust watches and the exception ENOSPC is thrown when creating watcher at that point
*/
function watchPresentFileSystemEntryWithFsWatchFile(): FileWatcher {
return watchFile(
fileOrDirectory,
createFileWatcherCallback(callback),
fallbackPollingInterval,
fallbackOptions
);
}
/**
* Watch the file or directory that is missing
* and switch to existing file or directory when the missing filesystem entry is created
*/
function watchMissingFileSystemEntry(): FileWatcher {
return watchFile(
fileOrDirectory,
(_fileName, eventKind, modifiedTime) => {
if (eventKind === FileWatcherEventKind.Created) {
modifiedTime ||= getModifiedTime(fileOrDirectory) || missingFileModifiedTime;
if (modifiedTime !== missingFileModifiedTime) {
callback("rename", "", modifiedTime);
// Call the callback for current file or directory
// For now it could be callback for the inner directory creation,
// but just return current directory, better than current no-op
updateWatcher(watchPresentFileSystemEntry);
}
}
},
fallbackPollingInterval,
fallbackOptions
);
}
}
}
/**
@@ -1273,8 +1427,6 @@ namespace ts {
let activeSession: import("inspector").Session | "stopping" | undefined;
let profilePath = "./profile.cpuprofile";
let hitSystemWatcherLimit = false;
const Buffer: {
new (input: string, encoding?: string): any;
from?(input: string, encoding?: string): any;
@@ -1295,19 +1447,21 @@ namespace ts {
getModifiedTime,
setTimeout,
clearTimeout,
fsWatch,
fsWatchWorker,
useCaseSensitiveFileNames,
getCurrentDirectory,
fileSystemEntryExists,
// Node 4.0 `fs.watch` function supports the "recursive" option on both OSX and Windows
// (ref: https://github.com/nodejs/node/pull/2649 and https://github.com/Microsoft/TypeScript/issues/4643)
fsSupportsRecursiveFsWatch,
directoryExists,
getAccessibleSortedChildDirectories: path => getAccessibleFileSystemEntries(path).directories,
realpath,
tscWatchFile: process.env.TSC_WATCHFILE,
useNonPollingWatchers: process.env.TSC_NONPOLLING_WATCHER,
tscWatchDirectory: process.env.TSC_WATCHDIRECTORY,
defaultWatchFileKind: () => sys!.defaultWatchFileKind?.(),
inodeWatching: isLinuxOrMacOs,
sysLog,
});
const nodeSystem: System = {
args: process.argv.slice(2),
@@ -1568,139 +1722,19 @@ namespace ts {
}
}
function fsWatch(
function fsWatchWorker(
fileOrDirectory: string,
entryKind: FileSystemEntryKind,
callback: FsWatchCallback,
recursive: boolean,
fallbackPollingInterval: PollingInterval,
fallbackOptions: WatchOptions | undefined
): FileWatcher {
let options: any;
let lastDirectoryPartWithDirectorySeparator: string | undefined;
let lastDirectoryPart: string | undefined;
if (isLinuxOrMacOs) {
lastDirectoryPartWithDirectorySeparator = fileOrDirectory.substr(fileOrDirectory.lastIndexOf(directorySeparator));
lastDirectoryPart = lastDirectoryPartWithDirectorySeparator.slice(directorySeparator.length);
}
/** Watcher for the file system entry depending on whether it is missing or present */
let watcher = !fileSystemEntryExists(fileOrDirectory, entryKind) ?
watchMissingFileSystemEntry() :
watchPresentFileSystemEntry();
return {
close: () => {
// Close the watcher (either existing file system entry watcher or missing file system entry watcher)
watcher.close();
watcher = undefined!;
}
};
/**
* Invoke the callback with rename and update the watcher if not closed
* @param createWatcher
*/
function invokeCallbackAndUpdateWatcher(createWatcher: () => FileWatcher, modifiedTime?: Date) {
sysLog(`sysLog:: ${fileOrDirectory}:: Changing watcher to ${createWatcher === watchPresentFileSystemEntry ? "Present" : "Missing"}FileSystemEntryWatcher`);
// Call the callback for current directory
callback("rename", "", modifiedTime);
// If watcher is not closed, update it
if (watcher) {
watcher.close();
watcher = createWatcher();
}
}
/**
* Watch the file or directory that is currently present
* and when the watched file or directory is deleted, switch to missing file system entry watcher
*/
function watchPresentFileSystemEntry(): FileWatcher {
// Node 4.0 `fs.watch` function supports the "recursive" option on both OSX and Windows
// (ref: https://github.com/nodejs/node/pull/2649 and https://github.com/Microsoft/TypeScript/issues/4643)
if (options === undefined) {
if (fsSupportsRecursiveFsWatch) {
options = { persistent: true, recursive: !!recursive };
}
else {
options = { persistent: true };
}
}
if (hitSystemWatcherLimit) {
sysLog(`sysLog:: ${fileOrDirectory}:: Defaulting to fsWatchFile`);
return watchPresentFileSystemEntryWithFsWatchFile();
}
try {
const presentWatcher = _fs.watch(
fileOrDirectory,
options,
isLinuxOrMacOs ?
callbackChangingToMissingFileSystemEntry :
callback
);
// Watch the missing file or directory or error
presentWatcher.on("error", () => invokeCallbackAndUpdateWatcher(watchMissingFileSystemEntry));
return presentWatcher;
}
catch (e) {
// Catch the exception and use polling instead
// Eg. on linux the number of watches are limited and one could easily exhaust watches and the exception ENOSPC is thrown when creating watcher at that point
// so instead of throwing error, use fs.watchFile
hitSystemWatcherLimit ||= e.code === "ENOSPC";
sysLog(`sysLog:: ${fileOrDirectory}:: Changing to fsWatchFile`);
return watchPresentFileSystemEntryWithFsWatchFile();
}
}
function callbackChangingToMissingFileSystemEntry(event: "rename" | "change", relativeName: string | undefined) {
// because relativeName is not guaranteed to be correct we need to check on each rename with few combinations
// Eg on ubuntu while watching app/node_modules the relativeName is "node_modules" which is neither relative nor full path
const modifiedTime = getModifiedTime(fileOrDirectory) || missingFileModifiedTime;
return event === "rename" &&
(!relativeName ||
relativeName === lastDirectoryPart ||
(relativeName.lastIndexOf(lastDirectoryPartWithDirectorySeparator!) !== -1 && relativeName.lastIndexOf(lastDirectoryPartWithDirectorySeparator!) === relativeName.length - lastDirectoryPartWithDirectorySeparator!.length)) &&
modifiedTime === missingFileModifiedTime ?
invokeCallbackAndUpdateWatcher(watchMissingFileSystemEntry, modifiedTime) :
callback(event, relativeName, modifiedTime);
}
/**
* Watch the file or directory using fs.watchFile since fs.watch threw exception
* Eg. on linux the number of watches are limited and one could easily exhaust watches and the exception ENOSPC is thrown when creating watcher at that point
*/
function watchPresentFileSystemEntryWithFsWatchFile(): FileWatcher {
return watchFile(
fileOrDirectory,
createFileWatcherCallback(callback),
fallbackPollingInterval,
fallbackOptions
);
}
/**
* Watch the file or directory that is missing
* and switch to existing file or directory when the missing filesystem entry is created
*/
function watchMissingFileSystemEntry(): FileWatcher {
return watchFile(
fileOrDirectory,
(_fileName, eventKind, modifiedTime) => {
if (eventKind === FileWatcherEventKind.Created) {
modifiedTime ||= getModifiedTime(fileOrDirectory) || missingFileModifiedTime;
if (modifiedTime !== missingFileModifiedTime) {
// Call the callback for current file or directory
// For now it could be callback for the inner directory creation,
// but just return current directory, better than current no-op
invokeCallbackAndUpdateWatcher(watchPresentFileSystemEntry, modifiedTime);
}
}
},
fallbackPollingInterval,
fallbackOptions
);
}
callback: FsWatchCallback,
) {
// Node 4.0 `fs.watch` function supports the "recursive" option on both OSX and Windows
// (ref: https://github.com/nodejs/node/pull/2649 and https://github.com/Microsoft/TypeScript/issues/4643)
return _fs.watch(
fileOrDirectory,
fsSupportsRecursiveFsWatch ?
{ persistent: true, recursive: !!recursive } : { persistent: true },
callback
);
}
function readFileWorker(fileName: string, _encoding?: string): string | undefined {
+159 -234
View File
@@ -14,18 +14,6 @@ interface String { charAt: any; }
interface Array<T> { length: number; [n: number]: T; }`
};
export const safeList = {
path: "/safeList.json" as Path,
content: JSON.stringify({
commander: "commander",
express: "express",
jquery: "jquery",
lodash: "lodash",
moment: "moment",
chroma: "chroma-js"
})
};
function getExecutingFilePathFromLibFile(): string {
return combinePaths(getDirectoryPath(libFile.path), "tsc.js");
}
@@ -39,14 +27,15 @@ interface Array<T> { length: number; [n: number]: T; }`
environmentVariables?: ESMap<string, string>;
runWithoutRecursiveWatches?: boolean;
runWithFallbackPolling?: boolean;
inodeWatching?: boolean;
}
export function createWatchedSystem(fileOrFolderList: readonly FileOrFolderOrSymLink[], params?: TestServerHostCreationParameters): TestServerHost {
return new TestServerHost(/*withSafelist*/ false, fileOrFolderList, params);
export function createWatchedSystem(fileOrFolderList: FileOrFolderOrSymLinkMap | readonly FileOrFolderOrSymLink[], params?: TestServerHostCreationParameters): TestServerHost {
return new TestServerHost(fileOrFolderList, params);
}
export function createServerHost(fileOrFolderList: readonly FileOrFolderOrSymLink[], params?: TestServerHostCreationParameters): TestServerHost {
const host = new TestServerHost(/*withSafelist*/ true, fileOrFolderList, params);
export function createServerHost(fileOrFolderList: FileOrFolderOrSymLinkMap | readonly FileOrFolderOrSymLink[], params?: TestServerHostCreationParameters): TestServerHost {
const host = new TestServerHost(fileOrFolderList, params);
// Just like sys, patch the host to use writeFile
patchWriteFileEnsuringDirectory(host);
return host;
@@ -70,6 +59,9 @@ interface Array<T> { length: number; [n: number]: T; }`
}
export type FileOrFolderOrSymLink = File | Folder | SymLink;
export interface FileOrFolderOrSymLinkMap {
[path: string]: string | Omit<FileOrFolderOrSymLink, "path">;
}
export function isFile(fileOrFolderOrSymLink: FileOrFolderOrSymLink): fileOrFolderOrSymLink is File {
return isString((fileOrFolderOrSymLink as File).content);
}
@@ -195,70 +187,6 @@ interface Array<T> { length: number; [n: number]: T; }`
checkMap(caption, arrayToMap(actual, identity), expected, /*eachKeyCount*/ undefined);
}
export function checkWatchedFiles(host: TestServerHost, expectedFiles: readonly string[], additionalInfo?: string) {
checkMap(`watchedFiles:: ${additionalInfo || ""}::`, host.watchedFiles, expectedFiles, /*eachKeyCount*/ undefined);
}
export interface WatchFileDetails {
fileName: string;
pollingInterval: PollingInterval;
}
export function checkWatchedFilesDetailed(host: TestServerHost, expectedFiles: ReadonlyESMap<string, number>, expectedDetails?: ESMap<string, WatchFileDetails[]>): void;
export function checkWatchedFilesDetailed(host: TestServerHost, expectedFiles: readonly string[], eachFileWatchCount: number, expectedDetails?: ESMap<string, WatchFileDetails[]>): void;
export function checkWatchedFilesDetailed(host: TestServerHost, expectedFiles: ReadonlyESMap<string, number> | readonly string[], eachFileWatchCountOrExpectedDetails?: number | ESMap<string, WatchFileDetails[]>, expectedDetails?: ESMap<string, WatchFileDetails[]>) {
if (!isNumber(eachFileWatchCountOrExpectedDetails)) expectedDetails = eachFileWatchCountOrExpectedDetails;
if (isArray(expectedFiles)) {
checkMap(
"watchedFiles",
host.watchedFiles,
expectedFiles,
eachFileWatchCountOrExpectedDetails as number,
[expectedDetails, ({ fileName, pollingInterval }) => ({ fileName, pollingInterval })]
);
}
else {
checkMap(
"watchedFiles",
host.watchedFiles,
expectedFiles,
[expectedDetails, ({ fileName, pollingInterval }) => ({ fileName, pollingInterval })]
);
}
}
export function checkWatchedDirectories(host: TestServerHost, expectedDirectories: string[], recursive: boolean) {
checkMap(`watchedDirectories${recursive ? " recursive" : ""}`, recursive ? host.fsWatchesRecursive : host.fsWatches, expectedDirectories, /*eachKeyCount*/ undefined);
}
export interface WatchDirectoryDetails {
directoryName: string;
fallbackPollingInterval: PollingInterval;
fallbackOptions: WatchOptions | undefined;
}
export function checkWatchedDirectoriesDetailed(host: TestServerHost, expectedDirectories: ReadonlyESMap<string, number>, recursive: boolean, expectedDetails?: ESMap<string, WatchDirectoryDetails[]>): void;
export function checkWatchedDirectoriesDetailed(host: TestServerHost, expectedDirectories: readonly string[], eachDirectoryWatchCount: number, recursive: boolean, expectedDetails?: ESMap<string, WatchDirectoryDetails[]>): void;
export function checkWatchedDirectoriesDetailed(host: TestServerHost, expectedDirectories: ReadonlyESMap<string, number> | readonly string[], recursiveOrEachDirectoryWatchCount: boolean | number, recursiveOrExpectedDetails?: boolean | ESMap<string, WatchDirectoryDetails[]>, expectedDetails?: ESMap<string, WatchDirectoryDetails[]>) {
if (typeof recursiveOrExpectedDetails !== "boolean") expectedDetails = recursiveOrExpectedDetails;
if (isArray(expectedDirectories)) {
checkMap(
`fsWatches${recursiveOrExpectedDetails ? " recursive" : ""}`,
recursiveOrExpectedDetails as boolean ? host.fsWatchesRecursive : host.fsWatches,
expectedDirectories,
recursiveOrEachDirectoryWatchCount as number,
[expectedDetails, ({ directoryName, fallbackPollingInterval, fallbackOptions }) => ({ directoryName, fallbackPollingInterval, fallbackOptions })]
);
}
else {
recursiveOrExpectedDetails = recursiveOrEachDirectoryWatchCount as boolean;
checkMap(
`fsWatches${recursiveOrExpectedDetails ? " recursive" : ""}`,
recursiveOrExpectedDetails ? host.fsWatchesRecursive : host.fsWatches,
expectedDirectories,
[expectedDetails, ({ directoryName, fallbackPollingInterval, fallbackOptions }) => ({ directoryName, fallbackPollingInterval, fallbackOptions })]
);
}
}
export function checkOutputContains(host: TestServerHost, expected: readonly string[]) {
const mapExpected = new Set(expected);
const mapSeen = new Set<string>();
@@ -355,17 +283,22 @@ interface Array<T> { length: number; [n: number]: T; }`
export interface TestFsWatcher {
cb: FsWatchCallback;
directoryName: string;
fallbackPollingInterval: PollingInterval;
fallbackOptions: WatchOptions | undefined;
inode: number | undefined;
}
export interface ReloadWatchInvokeOptions {
export interface WatchInvokeOptions {
/** Invokes the directory watcher for the parent instead of the file changed */
invokeDirectoryWatcherInsteadOfFileChanged: boolean;
/** When new file is created, do not invoke watches for it */
ignoreWatchInvokedWithTriggerAsFileCreate: boolean;
/** Invoke the file delete, followed by create instead of file changed */
invokeFileDeleteCreateAsPartInsteadOfChange: boolean;
/** Dont invoke delete watches */
ignoreDelete: boolean;
/** Skip inode check on file or folder create*/
skipInodeCheckOnCreate: boolean;
/** When invoking rename event on fs watch, send event with file name suffixed with tilde */
useTildeAsSuffixInRenameEventFileName: boolean;
}
export enum Tsc_WatchFile {
@@ -384,7 +317,6 @@ interface Array<T> { length: number; [n: number]: T; }`
useCaseSensitiveFileNames: boolean;
executingFilePath: string;
currentDirectory: string;
fileOrFolderorSymLinkList: readonly FileOrFolderOrSymLink[];
newLine?: string;
useWindowsStylePaths?: boolean;
environmentVariables?: ESMap<string, string>;
@@ -417,14 +349,16 @@ interface Array<T> { length: number; [n: number]: T; }`
public defaultWatchFileKind?: () => WatchFileKind | undefined;
public storeFilesChangingSignatureDuringEmit = true;
watchFile: HostWatchFile;
private inodeWatching: boolean | undefined;
private readonly inodes?: ESMap<Path, number>;
watchDirectory: HostWatchDirectory;
constructor(
public withSafeList: boolean,
fileOrFolderorSymLinkList: readonly FileOrFolderOrSymLink[],
fileOrFolderorSymLinkList: FileOrFolderOrSymLinkMap | readonly FileOrFolderOrSymLink[],
{
useCaseSensitiveFileNames, executingFilePath, currentDirectory,
newLine, windowsStyleRoot, environmentVariables,
runWithoutRecursiveWatches, runWithFallbackPolling
runWithoutRecursiveWatches, runWithFallbackPolling,
inodeWatching,
}: TestServerHostCreationParameters = {}) {
this.useCaseSensitiveFileNames = !!useCaseSensitiveFileNames;
this.newLine = newLine || "\n";
@@ -438,6 +372,11 @@ interface Array<T> { length: number; [n: number]: T; }`
this.runWithFallbackPolling = !!runWithFallbackPolling;
const tscWatchFile = this.environmentVariables && this.environmentVariables.get("TSC_WATCHFILE");
const tscWatchDirectory = this.environmentVariables && this.environmentVariables.get("TSC_WATCHDIRECTORY");
if (inodeWatching) {
this.inodeWatching = true;
this.inodes = new Map();
}
const { watchFile, watchDirectory } = createSystemWatchFunctions({
// We dont have polling watch file
// it is essentially fsWatch but lets get that separate from fsWatch and
@@ -451,22 +390,29 @@ interface Array<T> { length: number; [n: number]: T; }`
getModifiedTime: this.getModifiedTime.bind(this),
setTimeout: this.setTimeout.bind(this),
clearTimeout: this.clearTimeout.bind(this),
fsWatch: this.fsWatch.bind(this),
fsWatchWorker: this.fsWatchWorker.bind(this),
fileSystemEntryExists: this.fileSystemEntryExists.bind(this),
useCaseSensitiveFileNames: this.useCaseSensitiveFileNames,
getCurrentDirectory: this.getCurrentDirectory.bind(this),
fsSupportsRecursiveFsWatch: tscWatchDirectory ? false : !runWithoutRecursiveWatches,
directoryExists: this.directoryExists.bind(this),
getAccessibleSortedChildDirectories: path => this.getDirectories(path),
realpath: this.realpath.bind(this),
tscWatchFile,
tscWatchDirectory,
defaultWatchFileKind: () => this.defaultWatchFileKind?.(),
inodeWatching: !!this.inodeWatching,
sysLog: s => this.write(s + this.newLine),
});
this.watchFile = watchFile;
this.watchDirectory = watchDirectory;
this.reloadFS(fileOrFolderorSymLinkList);
}
private nextInode = 0;
private setInode(path: Path) {
if (this.inodes) this.inodes.set(path, this.nextInode++);
}
// Output is pretty
writeOutputIsTTY() {
return true;
@@ -504,53 +450,31 @@ interface Array<T> { length: number; [n: number]: T; }`
this.time = time;
}
private reloadFS(fileOrFolderOrSymLinkList: readonly FileOrFolderOrSymLink[], options?: Partial<ReloadWatchInvokeOptions>) {
private reloadFS(fileOrFolderOrSymLinkList: FileOrFolderOrSymLinkMap | readonly FileOrFolderOrSymLink[]) {
Debug.assert(this.fs.size === 0);
fileOrFolderOrSymLinkList = fileOrFolderOrSymLinkList.concat(this.withSafeList ? safeList : []);
const filesOrFoldersToLoad: readonly FileOrFolderOrSymLink[] = !this.windowsStyleRoot ? fileOrFolderOrSymLinkList :
fileOrFolderOrSymLinkList.map<FileOrFolderOrSymLink>(f => {
const result = clone(f);
result.path = this.getHostSpecificPath(f.path);
return result;
});
for (const fileOrDirectory of filesOrFoldersToLoad) {
const path = this.toFullPath(fileOrDirectory.path);
// If its a change
const currentEntry = this.fs.get(path);
if (currentEntry) {
if (isFsFile(currentEntry)) {
if (isFile(fileOrDirectory)) {
// Update file
if (currentEntry.content !== fileOrDirectory.content) {
this.modifyFile(fileOrDirectory.path, fileOrDirectory.content, options);
}
if (isArray(fileOrFolderOrSymLinkList)) {
fileOrFolderOrSymLinkList.forEach(f => this.ensureFileOrFolder(!this.windowsStyleRoot ?
f :
{ ...f, path: this.getHostSpecificPath(f.path) }
));
}
else {
for (const key in fileOrFolderOrSymLinkList) {
if (hasProperty(fileOrFolderOrSymLinkList, key)) {
const path = this.getHostSpecificPath(key);
const value = fileOrFolderOrSymLinkList[key];
if (isString(value)) {
this.ensureFileOrFolder({ path, content: value });
}
else {
// TODO: Changing from file => folder/Symlink
this.ensureFileOrFolder({ path, ...value });
}
}
else if (isFsSymLink(currentEntry)) {
// TODO: update symlinks
}
else {
// Folder
if (isFile(fileOrDirectory)) {
// TODO: Changing from folder => file
}
else {
// Folder update: Nothing to do.
currentEntry.modifiedTime = this.now();
this.invokeFsWatches(currentEntry.fullPath, "change", currentEntry.modifiedTime);
}
}
}
else {
this.ensureFileOrFolder(fileOrDirectory, options && options.ignoreWatchInvokedWithTriggerAsFileCreate);
}
}
}
modifyFile(filePath: string, content: string, options?: Partial<ReloadWatchInvokeOptions>) {
modifyFile(filePath: string, content: string, options?: Partial<WatchInvokeOptions>) {
const path = this.toFullPath(filePath);
const currentEntry = this.fs.get(path);
if (!currentEntry || !isFsFile(currentEntry)) {
@@ -558,8 +482,8 @@ interface Array<T> { length: number; [n: number]: T; }`
}
if (options && options.invokeFileDeleteCreateAsPartInsteadOfChange) {
this.removeFileOrFolder(currentEntry, returnFalse);
this.ensureFileOrFolder({ path: filePath, content });
this.removeFileOrFolder(currentEntry, /*isRenaming*/ false, options);
this.ensureFileOrFolder({ path: filePath, content }, /*ignoreWatchInvokedWithTriggerAsFileCreate*/ undefined, /*ignoreParentWatch*/ undefined, options);
}
else {
currentEntry.content = content;
@@ -568,11 +492,11 @@ interface Array<T> { length: number; [n: number]: T; }`
if (options && options.invokeDirectoryWatcherInsteadOfFileChanged) {
const directoryFullPath = getDirectoryPath(currentEntry.fullPath);
this.invokeFileWatcher(directoryFullPath, FileWatcherEventKind.Changed, currentEntry.modifiedTime, /*useFileNameInCallback*/ true);
this.invokeFsWatchesCallbacks(directoryFullPath, "rename", currentEntry.modifiedTime, currentEntry.fullPath);
this.invokeRecursiveFsWatches(directoryFullPath, "rename", currentEntry.modifiedTime, currentEntry.fullPath);
this.invokeFsWatchesCallbacks(directoryFullPath, "rename", currentEntry.modifiedTime, currentEntry.fullPath, options.useTildeAsSuffixInRenameEventFileName);
this.invokeRecursiveFsWatches(directoryFullPath, "rename", currentEntry.modifiedTime, currentEntry.fullPath, options.useTildeAsSuffixInRenameEventFileName);
}
else {
this.invokeFileAndFsWatches(currentEntry.fullPath, FileWatcherEventKind.Changed, currentEntry.modifiedTime);
this.invokeFileAndFsWatches(currentEntry.fullPath, FileWatcherEventKind.Changed, currentEntry.modifiedTime, options?.useTildeAsSuffixInRenameEventFileName);
}
}
}
@@ -584,7 +508,7 @@ interface Array<T> { length: number; [n: number]: T; }`
Debug.assert(!!file);
// Only remove the file
this.removeFileOrFolder(file, returnFalse, /*isRenaming*/ true);
this.removeFileOrFolder(file, /*isRenaming*/ true);
// Add updated folder with new folder name
const newFullPath = getNormalizedAbsolutePath(newFileName, this.currentDirectory);
@@ -604,7 +528,7 @@ interface Array<T> { length: number; [n: number]: T; }`
Debug.assert(!!folder);
// Only remove the folder
this.removeFileOrFolder(folder, returnFalse, /*isRenaming*/ true);
this.removeFileOrFolder(folder, /*isRenaming*/ true);
// Add updated folder with new folder name
const newFullPath = getNormalizedAbsolutePath(newFolderName, this.currentDirectory);
@@ -631,6 +555,7 @@ interface Array<T> { length: number; [n: number]: T; }`
newFolder.entries.push(entry);
}
this.fs.set(entry.path, entry);
this.setInode(entry.path);
this.invokeFileAndFsWatches(entry.fullPath, FileWatcherEventKind.Created);
if (isFsFolder(entry)) {
this.renameFolderEntries(entry, entry);
@@ -638,29 +563,29 @@ interface Array<T> { length: number; [n: number]: T; }`
}
}
ensureFileOrFolder(fileOrDirectoryOrSymLink: FileOrFolderOrSymLink, ignoreWatchInvokedWithTriggerAsFileCreate?: boolean, ignoreParentWatch?: boolean) {
ensureFileOrFolder(fileOrDirectoryOrSymLink: FileOrFolderOrSymLink, ignoreWatchInvokedWithTriggerAsFileCreate?: boolean, ignoreParentWatch?: boolean, options?: Partial<WatchInvokeOptions>) {
if (isFile(fileOrDirectoryOrSymLink)) {
const file = this.toFsFile(fileOrDirectoryOrSymLink);
// file may already exist when updating existing type declaration file
if (!this.fs.get(file.path)) {
const baseFolder = this.ensureFolder(getDirectoryPath(file.fullPath), ignoreParentWatch);
this.addFileOrFolderInFolder(baseFolder, file, ignoreWatchInvokedWithTriggerAsFileCreate);
const baseFolder = this.ensureFolder(getDirectoryPath(file.fullPath), ignoreParentWatch, options);
this.addFileOrFolderInFolder(baseFolder, file, ignoreWatchInvokedWithTriggerAsFileCreate, options);
}
}
else if (isSymLink(fileOrDirectoryOrSymLink)) {
const symLink = this.toFsSymLink(fileOrDirectoryOrSymLink);
Debug.assert(!this.fs.get(symLink.path));
const baseFolder = this.ensureFolder(getDirectoryPath(symLink.fullPath), ignoreParentWatch);
this.addFileOrFolderInFolder(baseFolder, symLink, ignoreWatchInvokedWithTriggerAsFileCreate);
const baseFolder = this.ensureFolder(getDirectoryPath(symLink.fullPath), ignoreParentWatch, options);
this.addFileOrFolderInFolder(baseFolder, symLink, ignoreWatchInvokedWithTriggerAsFileCreate, options);
}
else {
const fullPath = getNormalizedAbsolutePath(fileOrDirectoryOrSymLink.path, this.currentDirectory);
this.ensureFolder(getDirectoryPath(fullPath), ignoreParentWatch);
this.ensureFolder(fullPath, ignoreWatchInvokedWithTriggerAsFileCreate);
this.ensureFolder(getDirectoryPath(fullPath), ignoreParentWatch, options);
this.ensureFolder(fullPath, ignoreWatchInvokedWithTriggerAsFileCreate, options);
}
}
private ensureFolder(fullPath: string, ignoreWatch: boolean | undefined): FsFolder {
private ensureFolder(fullPath: string, ignoreWatch: boolean | undefined, options: Partial<WatchInvokeOptions> | undefined): FsFolder {
const path = this.toPath(fullPath);
let folder = this.fs.get(path) as FsFolder;
if (!folder) {
@@ -668,34 +593,39 @@ interface Array<T> { length: number; [n: number]: T; }`
const baseFullPath = getDirectoryPath(fullPath);
if (fullPath !== baseFullPath) {
// Add folder in the base folder
const baseFolder = this.ensureFolder(baseFullPath, ignoreWatch);
this.addFileOrFolderInFolder(baseFolder, folder, ignoreWatch);
const baseFolder = this.ensureFolder(baseFullPath, ignoreWatch, options);
this.addFileOrFolderInFolder(baseFolder, folder, ignoreWatch, options);
}
else {
// root folder
Debug.assert(this.fs.size === 0 || !!this.windowsStyleRoot);
this.fs.set(path, folder);
this.setInode(path);
}
}
Debug.assert(isFsFolder(folder));
return folder;
}
private addFileOrFolderInFolder(folder: FsFolder, fileOrDirectory: FsFile | FsFolder | FsSymLink, ignoreWatch?: boolean) {
private addFileOrFolderInFolder(folder: FsFolder, fileOrDirectory: FsFile | FsFolder | FsSymLink, ignoreWatch?: boolean, options?: Partial<WatchInvokeOptions>) {
if (!this.fs.has(fileOrDirectory.path)) {
insertSorted(folder.entries, fileOrDirectory, (a, b) => compareStringsCaseSensitive(getBaseFileName(a.path), getBaseFileName(b.path)));
}
folder.modifiedTime = this.now();
this.fs.set(fileOrDirectory.path, fileOrDirectory);
this.setInode(fileOrDirectory.path);
if (ignoreWatch) {
return;
}
this.invokeFileAndFsWatches(fileOrDirectory.fullPath, FileWatcherEventKind.Created, fileOrDirectory.modifiedTime);
this.invokeFileAndFsWatches(folder.fullPath, FileWatcherEventKind.Changed, folder.modifiedTime);
const inodeWatching = this.inodeWatching;
if (options?.skipInodeCheckOnCreate) this.inodeWatching = false;
this.invokeFileAndFsWatches(fileOrDirectory.fullPath, FileWatcherEventKind.Created, fileOrDirectory.modifiedTime, options?.useTildeAsSuffixInRenameEventFileName);
this.invokeFileAndFsWatches(folder.fullPath, FileWatcherEventKind.Changed, fileOrDirectory.modifiedTime, options?.useTildeAsSuffixInRenameEventFileName);
this.inodeWatching = inodeWatching;
}
private removeFileOrFolder(fileOrDirectory: FsFile | FsFolder | FsSymLink, isRemovableLeafFolder: (folder: FsFolder) => boolean, isRenaming = false) {
private removeFileOrFolder(fileOrDirectory: FsFile | FsFolder | FsSymLink, isRenaming?: boolean, options?: Partial<WatchInvokeOptions>) {
const basePath = getDirectoryPath(fileOrDirectory.path);
const baseFolder = this.fs.get(basePath) as FsFolder;
if (basePath !== fileOrDirectory.path) {
@@ -708,20 +638,16 @@ interface Array<T> { length: number; [n: number]: T; }`
if (isFsFolder(fileOrDirectory)) {
Debug.assert(fileOrDirectory.entries.length === 0 || isRenaming);
}
this.invokeFileAndFsWatches(fileOrDirectory.fullPath, FileWatcherEventKind.Deleted);
this.invokeFileAndFsWatches(baseFolder.fullPath, FileWatcherEventKind.Changed, baseFolder.modifiedTime);
if (basePath !== fileOrDirectory.path &&
baseFolder.entries.length === 0 &&
isRemovableLeafFolder(baseFolder)) {
this.removeFileOrFolder(baseFolder, isRemovableLeafFolder);
}
if (!options?.ignoreDelete) this.invokeFileAndFsWatches(fileOrDirectory.fullPath, FileWatcherEventKind.Deleted, /*modifiedTime*/ undefined, options?.useTildeAsSuffixInRenameEventFileName);
this.inodes?.delete(fileOrDirectory.path);
if (!options?.ignoreDelete) this.invokeFileAndFsWatches(baseFolder.fullPath, FileWatcherEventKind.Changed, baseFolder.modifiedTime, options?.useTildeAsSuffixInRenameEventFileName);
}
deleteFile(filePath: string) {
const path = this.toFullPath(filePath);
const currentEntry = this.fs.get(path) as FsFile;
Debug.assert(isFsFile(currentEntry));
this.removeFileOrFolder(currentEntry, returnFalse);
this.removeFileOrFolder(currentEntry);
}
deleteFolder(folderPath: string, recursive?: boolean) {
@@ -735,11 +661,11 @@ interface Array<T> { length: number; [n: number]: T; }`
this.deleteFolder(fsEntry.fullPath, recursive);
}
else {
this.removeFileOrFolder(fsEntry, returnFalse);
this.removeFileOrFolder(fsEntry);
}
});
}
this.removeFileOrFolder(currentEntry, returnFalse);
this.removeFileOrFolder(currentEntry);
}
private watchFileWorker(fileName: string, cb: FileWatcherCallback, pollingInterval: PollingInterval) {
@@ -750,69 +676,73 @@ interface Array<T> { length: number; [n: number]: T; }`
);
}
private fsWatch(
private fsWatchWorker(
fileOrDirectory: string,
_entryKind: FileSystemEntryKind,
cb: FsWatchCallback,
recursive: boolean,
fallbackPollingInterval: PollingInterval,
fallbackOptions: WatchOptions | undefined): FileWatcher {
return this.runWithFallbackPolling ?
this.watchFile(
fileOrDirectory,
createFileWatcherCallback(cb),
fallbackPollingInterval,
fallbackOptions
) :
createWatcher(
recursive ? this.fsWatchesRecursive : this.fsWatches,
this.toFullPath(fileOrDirectory),
{
directoryName: fileOrDirectory,
cb,
fallbackPollingInterval,
fallbackOptions
}
);
cb: FsWatchCallback,
) {
if (this.runWithFallbackPolling) throw new Error("Need to use fallback polling instead of file system native watching");
const path = this.toFullPath(fileOrDirectory);
// Error if the path does not exist
if (this.inodeWatching && !this.inodes?.has(path)) throw new Error();
const result = createWatcher(
recursive ? this.fsWatchesRecursive : this.fsWatches,
path,
{
directoryName: fileOrDirectory,
cb,
inode: this.inodes?.get(path)
}
) as FsWatchWorkerWatcher;
result.on = noop;
return result;
}
invokeFileWatcher(fileFullPath: string, eventKind: FileWatcherEventKind, modifiedTime?: Date, useFileNameInCallback?: boolean) {
invokeWatcherCallbacks(this.watchedFiles.get(this.toPath(fileFullPath)), ({ cb, fileName }) => cb(useFileNameInCallback ? fileName : fileFullPath, eventKind, modifiedTime));
}
private fsWatchCallback(map: MultiMap<Path, TestFsWatcher>, fullPath: string, eventName: "rename" | "change", modifiedTime?: Date, entryFullPath?: string) {
invokeWatcherCallbacks(map.get(this.toPath(fullPath)), ({ cb }) => cb(eventName, entryFullPath ? this.getRelativePathToDirectory(fullPath, entryFullPath) : "", modifiedTime));
private fsWatchCallback(map: MultiMap<Path, TestFsWatcher>, fullPath: string, eventName: "rename" | "change", modifiedTime: Date | undefined, entryFullPath: string | undefined, useTildeSuffix: boolean | undefined) {
const path = this.toPath(fullPath);
const currentInode = this.inodes?.get(path);
invokeWatcherCallbacks(map.get(path), ({ cb, inode }) => {
// TODO::
if (this.inodeWatching && inode !== undefined && inode !== currentInode) return;
let relativeFileName = (entryFullPath ? this.getRelativePathToDirectory(fullPath, entryFullPath) : "");
if (useTildeSuffix) relativeFileName = (relativeFileName ? relativeFileName : getBaseFileName(fullPath)) + "~";
cb(eventName, relativeFileName, modifiedTime);
});
}
invokeFsWatchesCallbacks(fullPath: string, eventName: "rename" | "change", modifiedTime?: Date, entryFullPath?: string) {
this.fsWatchCallback(this.fsWatches, fullPath, eventName, modifiedTime, entryFullPath);
invokeFsWatchesCallbacks(fullPath: string, eventName: "rename" | "change", modifiedTime?: Date, entryFullPath?: string, useTildeSuffix?: boolean) {
this.fsWatchCallback(this.fsWatches, fullPath, eventName, modifiedTime, entryFullPath, useTildeSuffix);
}
invokeFsWatchesRecursiveCallbacks(fullPath: string, eventName: "rename" | "change", modifiedTime?: Date, entryFullPath?: string) {
this.fsWatchCallback(this.fsWatchesRecursive, fullPath, eventName, modifiedTime, entryFullPath);
invokeFsWatchesRecursiveCallbacks(fullPath: string, eventName: "rename" | "change", modifiedTime?: Date, entryFullPath?: string, useTildeSuffix?: boolean) {
this.fsWatchCallback(this.fsWatchesRecursive, fullPath, eventName, modifiedTime, entryFullPath, useTildeSuffix);
}
private getRelativePathToDirectory(directoryFullPath: string, fileFullPath: string) {
return getRelativePathToDirectoryOrUrl(directoryFullPath, fileFullPath, this.currentDirectory, this.getCanonicalFileName, /*isAbsolutePathAnUrl*/ false);
}
private invokeRecursiveFsWatches(fullPath: string, eventName: "rename" | "change", modifiedTime?: Date, entryFullPath?: string) {
this.invokeFsWatchesRecursiveCallbacks(fullPath, eventName, modifiedTime, entryFullPath);
private invokeRecursiveFsWatches(fullPath: string, eventName: "rename" | "change", modifiedTime?: Date, entryFullPath?: string, useTildeSuffix?: boolean) {
this.invokeFsWatchesRecursiveCallbacks(fullPath, eventName, modifiedTime, entryFullPath, useTildeSuffix);
const basePath = getDirectoryPath(fullPath);
if (this.getCanonicalFileName(fullPath) !== this.getCanonicalFileName(basePath)) {
this.invokeRecursiveFsWatches(basePath, eventName, modifiedTime, entryFullPath || fullPath);
this.invokeRecursiveFsWatches(basePath, eventName, modifiedTime, entryFullPath || fullPath, useTildeSuffix);
}
}
private invokeFsWatches(fullPath: string, eventName: "rename" | "change", modifiedTime?: Date) {
this.invokeFsWatchesCallbacks(fullPath, eventName, modifiedTime);
this.invokeFsWatchesCallbacks(getDirectoryPath(fullPath), eventName, modifiedTime, fullPath);
this.invokeRecursiveFsWatches(fullPath, eventName, modifiedTime);
private invokeFsWatches(fullPath: string, eventName: "rename" | "change", modifiedTime: Date | undefined, useTildeSuffix: boolean | undefined) {
this.invokeFsWatchesCallbacks(fullPath, eventName, modifiedTime, fullPath, useTildeSuffix);
this.invokeFsWatchesCallbacks(getDirectoryPath(fullPath), eventName, modifiedTime, fullPath, useTildeSuffix);
this.invokeRecursiveFsWatches(fullPath, eventName, modifiedTime, /*entryFullPath*/ undefined, useTildeSuffix);
}
private invokeFileAndFsWatches(fileOrFolderFullPath: string, eventKind: FileWatcherEventKind, modifiedTime?: Date) {
private invokeFileAndFsWatches(fileOrFolderFullPath: string, eventKind: FileWatcherEventKind, modifiedTime?: Date, useTildeSuffix?: boolean) {
this.invokeFileWatcher(fileOrFolderFullPath, eventKind, modifiedTime);
this.invokeFsWatches(fileOrFolderFullPath, eventKind === FileWatcherEventKind.Changed ? "change" : "rename", modifiedTime);
this.invokeFsWatches(fileOrFolderFullPath, eventKind === FileWatcherEventKind.Changed ? "change" : "rename", modifiedTime, useTildeSuffix);
}
private toFsEntry(path: string): FSEntryBase {
@@ -881,6 +811,10 @@ interface Array<T> { length: number; [n: number]: T; }`
return this.getRealFsEntry(isFsFolder, path, fsEntry);
}
fileSystemEntryExists(s: string, entryKind: FileSystemEntryKind) {
return entryKind === FileSystemEntryKind.File ? this.fileExists(s) : this.directoryExists(s);
}
fileExists(s: string) {
const path = this.toFullPath(s);
return !!this.getRealFile(path);
@@ -1046,11 +980,11 @@ interface Array<T> { length: number; [n: number]: T; }`
}
}
prependFile(path: string, content: string, options?: Partial<ReloadWatchInvokeOptions>): void {
prependFile(path: string, content: string, options?: Partial<WatchInvokeOptions>): void {
this.modifyFile(path, content + this.readFile(path), options);
}
appendFile(path: string, content: string, options?: Partial<ReloadWatchInvokeOptions>): void {
appendFile(path: string, content: string, options?: Partial<WatchInvokeOptions>): void {
this.modifyFile(path, this.readFile(path) + content, options);
}
@@ -1095,14 +1029,14 @@ interface Array<T> { length: number; [n: number]: T; }`
}
writtenFiles?: ESMap<Path, number>;
diff(baseline: string[], base: ESMap<string, FSEntry> = new Map()) {
this.fs.forEach(newFsEntry => {
diffFsEntry(baseline, base.get(newFsEntry.path), newFsEntry, this.writtenFiles);
diff(baseline: string[], base: ESMap<Path, FSEntry> = new Map()) {
this.fs.forEach((newFsEntry, path) => {
diffFsEntry(baseline, base.get(path), newFsEntry, this.inodes?.get(path), this.writtenFiles);
});
base.forEach(oldFsEntry => {
const newFsEntry = this.fs.get(oldFsEntry.path);
base.forEach((oldFsEntry, path) => {
const newFsEntry = this.fs.get(path);
if (!newFsEntry) {
diffFsEntry(baseline, oldFsEntry, newFsEntry, this.writtenFiles);
diffFsEntry(baseline, oldFsEntry, newFsEntry, this.inodes?.get(path), this.writtenFiles);
}
});
baseline.push("");
@@ -1150,86 +1084,77 @@ interface Array<T> { length: number; [n: number]: T; }`
}
}
function diffFsFile(baseline: string[], fsEntry: FsFile) {
baseline.push(`//// [${fsEntry.fullPath}]\r\n${fsEntry.content}`, "");
function diffFsFile(baseline: string[], fsEntry: FsFile, newInode: number | undefined) {
baseline.push(`//// [${fsEntry.fullPath}]${inodeString(newInode)}\r\n${fsEntry.content}`, "");
}
function diffFsSymLink(baseline: string[], fsEntry: FsSymLink) {
baseline.push(`//// [${fsEntry.fullPath}] symlink(${fsEntry.symLink})`);
function diffFsSymLink(baseline: string[], fsEntry: FsSymLink, newInode: number | undefined) {
baseline.push(`//// [${fsEntry.fullPath}] symlink(${fsEntry.symLink})${inodeString(newInode)}`);
}
function diffFsEntry(baseline: string[], oldFsEntry: FSEntry | undefined, newFsEntry: FSEntry | undefined, writtenFiles: ESMap<string, any> | undefined): void {
function inodeString(inode: number | undefined) {
return inode !== undefined ? ` Inode:: ${inode}` : "";
}
function diffFsEntry(baseline: string[], oldFsEntry: FSEntry | undefined, newFsEntry: FSEntry | undefined, newInode: number | undefined, writtenFiles: ESMap<string, any> | undefined): void {
const file = newFsEntry && newFsEntry.fullPath;
if (isFsFile(oldFsEntry)) {
if (isFsFile(newFsEntry)) {
if (oldFsEntry.content !== newFsEntry.content) {
diffFsFile(baseline, newFsEntry);
diffFsFile(baseline, newFsEntry, newInode);
}
else if (oldFsEntry.modifiedTime !== newFsEntry.modifiedTime) {
if (oldFsEntry.fullPath !== newFsEntry.fullPath) {
baseline.push(`//// [${file}] file was renamed from file ${oldFsEntry.fullPath}`);
baseline.push(`//// [${file}] file was renamed from file ${oldFsEntry.fullPath}${inodeString(newInode)}`);
}
else if (writtenFiles && !writtenFiles.has(newFsEntry.path)) {
baseline.push(`//// [${file}] file changed its modified time`);
baseline.push(`//// [${file}] file changed its modified time${inodeString(newInode)}`);
}
else {
baseline.push(`//// [${file}] file written with same contents`);
baseline.push(`//// [${file}] file written with same contents${inodeString(newInode)}`);
}
}
}
else {
baseline.push(`//// [${oldFsEntry.fullPath}] deleted`);
if (isFsSymLink(newFsEntry)) {
diffFsSymLink(baseline, newFsEntry);
diffFsSymLink(baseline, newFsEntry, newInode);
}
}
}
else if (isFsSymLink(oldFsEntry)) {
if (isFsSymLink(newFsEntry)) {
if (oldFsEntry.symLink !== newFsEntry.symLink) {
diffFsSymLink(baseline, newFsEntry);
diffFsSymLink(baseline, newFsEntry, newInode);
}
else if (oldFsEntry.modifiedTime !== newFsEntry.modifiedTime) {
if (oldFsEntry.fullPath !== newFsEntry.fullPath) {
baseline.push(`//// [${file}] symlink was renamed from symlink ${oldFsEntry.fullPath}`);
baseline.push(`//// [${file}] symlink was renamed from symlink ${oldFsEntry.fullPath}${inodeString(newInode)}`);
}
else if (writtenFiles && !writtenFiles.has(newFsEntry.path)) {
baseline.push(`//// [${file}] symlink changed its modified time`);
baseline.push(`//// [${file}] symlink changed its modified time${inodeString(newInode)}`);
}
else {
baseline.push(`//// [${file}] symlink written with same link`);
baseline.push(`//// [${file}] symlink written with same link${inodeString(newInode)}`);
}
}
}
else {
baseline.push(`//// [${oldFsEntry.fullPath}] deleted symlink`);
if (isFsFile(newFsEntry)) {
diffFsFile(baseline, newFsEntry);
diffFsFile(baseline, newFsEntry, newInode);
}
}
}
else if (isFsFile(newFsEntry)) {
diffFsFile(baseline, newFsEntry);
diffFsFile(baseline, newFsEntry, newInode);
}
else if (isFsSymLink(newFsEntry)) {
diffFsSymLink(baseline, newFsEntry);
diffFsSymLink(baseline, newFsEntry, newInode);
}
}
function serializeTestFsWatcher({ directoryName, fallbackPollingInterval, fallbackOptions }: TestFsWatcher) {
function serializeTestFsWatcher({ directoryName, inode }: TestFsWatcher) {
return {
directoryName,
fallbackPollingInterval,
fallbackOptions: serializeWatchOptions(fallbackOptions)
};
}
function serializeWatchOptions(fallbackOptions: WatchOptions | undefined) {
if (!fallbackOptions) return undefined;
const { watchFile, watchDirectory, fallbackPolling, ...rest } = fallbackOptions;
return {
watchFile: watchFile !== undefined ? WatchFileKind[watchFile] : undefined,
watchDirectory: watchDirectory !== undefined ? WatchDirectoryKind[watchDirectory] : undefined,
fallbackPolling: fallbackPolling !== undefined ? PollingWatchKind[fallbackPolling] : undefined,
...rest
inode,
};
}
@@ -6,11 +6,10 @@ namespace ts.tscWatch {
commandLineArgs: ["-b", "-w", "-verbose"],
sys: () => createWatchedSystem(
[
libFile,
{ path: libFile.path, content: libContent },
{ path: `${projectRoot}/a.js`, content: "" },
{ path: `${projectRoot}/b.ts`, content: "" },
{ path: `${projectRoot}/tsconfig.json`, content: JSON.stringify({ compilerOptions: { allowJs: true, noEmit: true } }) },
{ path: libFile.path, content: libContent }
],
{ currentDirectory: projectRoot }
),
+6 -15
View File
@@ -6,21 +6,12 @@ namespace ts.tscWatch {
scenario,
subScenario: `emit with outFile or out setting/${subScenario}`,
commandLineArgs: ["--w", "-p", "/a/tsconfig.json"],
sys: () => {
const config: File = {
path: "/a/tsconfig.json",
content: JSON.stringify({ compilerOptions: { out, outFile } })
};
const f1: File = {
path: "/a/a.ts",
content: "let x = 1"
};
const f2: File = {
path: "/a/b.ts",
content: "let y = 1"
};
return createWatchedSystem([f1, f2, config, libFile]);
},
sys: () => createWatchedSystem({
"/a/a.ts": "let x = 1",
"/a/b.ts": "let y = 1",
"/a/tsconfig.json": JSON.stringify({ compilerOptions: { out, outFile } }),
[libFile.path]: libFile.content,
}),
changes: [
{
caption: "Make change in the file",
@@ -20,7 +20,7 @@ namespace ts.tscWatch {
scenario: "forceConsistentCasingInFileNames",
subScenario,
commandLineArgs: ["--w", "--p", tsconfig.path],
sys: () => createWatchedSystem([loggerFile, anotherFile, tsconfig, libFile, tsconfig]),
sys: () => createWatchedSystem([loggerFile, anotherFile, tsconfig, libFile]),
changes
});
}
+1 -5
View File
@@ -7,10 +7,6 @@ namespace ts.tscWatch {
export import libFile = TestFSWithWatch.libFile;
export import createWatchedSystem = TestFSWithWatch.createWatchedSystem;
export import checkArray = TestFSWithWatch.checkArray;
export import checkWatchedFiles = TestFSWithWatch.checkWatchedFiles;
export import checkWatchedFilesDetailed = TestFSWithWatch.checkWatchedFilesDetailed;
export import checkWatchedDirectories = TestFSWithWatch.checkWatchedDirectories;
export import checkWatchedDirectoriesDetailed = TestFSWithWatch.checkWatchedDirectoriesDetailed;
export import checkOutputContains = TestFSWithWatch.checkOutputContains;
export import checkOutputDoesNotContain = TestFSWithWatch.checkOutputDoesNotContain;
@@ -436,7 +432,7 @@ namespace ts.tscWatch {
return sys;
}
export function createSystemWithSolutionBuild(solutionRoots: readonly string[], files: readonly TestFSWithWatch.FileOrFolderOrSymLink[], params?: TestFSWithWatch.TestServerHostCreationParameters) {
export function createSystemWithSolutionBuild(solutionRoots: readonly string[], files: TestFSWithWatch.FileOrFolderOrSymLinkMap | readonly TestFSWithWatch.FileOrFolderOrSymLink[], params?: TestFSWithWatch.TestServerHostCreationParameters) {
return solutionBuildWithBaseline(createWatchedSystem(files, params), solutionRoots);
}
}
@@ -581,5 +581,141 @@ namespace ts.tscWatch {
verifyWorker("-extendedDiagnostics");
});
});
verifyTscWatch({
scenario,
subScenario: `fsWatch/when using file watching thats when rename occurs when file is still on the disk`,
commandLineArgs: ["-w", "--extendedDiagnostics"],
sys: () => createWatchedSystem(
{
[libFile.path]: libFile.content,
[`${projectRoot}/main.ts`]: `import { foo } from "./foo"; foo();`,
[`${projectRoot}/foo.ts`]: `export declare function foo(): string;`,
[`${projectRoot}/tsconfig.json`]: JSON.stringify({
watchOptions: { watchFile: "useFsEvents" },
files: ["foo.ts", "main.ts"]
}),
},
{ currentDirectory: projectRoot, }
),
changes: [
{
caption: "Introduce error such that when callback happens file is already appeared",
// vm's wq generates this kind of event
// Skip delete event so inode changes but when the create's rename occurs file is on disk
change: sys => sys.modifyFile(`${projectRoot}/foo.ts`, `export declare function foo2(): string;`, {
invokeFileDeleteCreateAsPartInsteadOfChange: true,
ignoreDelete: true,
}),
timeouts: sys => sys.checkTimeoutQueueLengthAndRun(1),
},
{
caption: "Replace file with rename event that fixes error",
change: sys => sys.modifyFile(`${projectRoot}/foo.ts`, `export declare function foo(): string;`, { invokeFileDeleteCreateAsPartInsteadOfChange: true, }),
timeouts: sys => sys.checkTimeoutQueueLengthAndRun(1),
},
]
});
describe("with fsWatch on inodes", () => {
verifyTscWatch({
scenario,
subScenario: `fsWatch/when using file watching thats on inode`,
commandLineArgs: ["-w", "--extendedDiagnostics"],
sys: () => createWatchedSystem(
{
[libFile.path]: libFile.content,
[`${projectRoot}/main.ts`]: `import { foo } from "./foo"; foo();`,
[`${projectRoot}/foo.d.ts`]: `export function foo(): string;`,
[`${projectRoot}/tsconfig.json`]: JSON.stringify({ watchOptions: { watchFile: "useFsEvents" }, files: ["foo.d.ts", "main.ts"] }),
},
{
currentDirectory: projectRoot,
inodeWatching: true
}
),
changes: [
{
caption: "Replace file with rename event that introduces error",
change: sys => sys.modifyFile(`${projectRoot}/foo.d.ts`, `export function foo2(): string;`, { invokeFileDeleteCreateAsPartInsteadOfChange: true }),
timeouts: sys => sys.checkTimeoutQueueLengthAndRun(2),
},
{
caption: "Replace file with rename event that fixes error",
change: sys => sys.modifyFile(`${projectRoot}/foo.d.ts`, `export function foo(): string;`, { invokeFileDeleteCreateAsPartInsteadOfChange: true }),
timeouts: sys => sys.checkTimeoutQueueLengthAndRun(2),
},
]
});
verifyTscWatch({
scenario,
subScenario: `fsWatch/when using file watching thats on inode when rename event ends with tilde`,
commandLineArgs: ["-w", "--extendedDiagnostics"],
sys: () => createWatchedSystem(
{
[libFile.path]: libFile.content,
[`${projectRoot}/main.ts`]: `import { foo } from "./foo"; foo();`,
[`${projectRoot}/foo.d.ts`]: `export function foo(): string;`,
[`${projectRoot}/tsconfig.json`]: JSON.stringify({ watchOptions: { watchFile: "useFsEvents" }, files: ["foo.d.ts", "main.ts"] }),
},
{
currentDirectory: projectRoot,
inodeWatching: true
}
),
changes: [
{
caption: "Replace file with rename event that introduces error",
change: sys => sys.modifyFile(`${projectRoot}/foo.d.ts`, `export function foo2(): string;`, { invokeFileDeleteCreateAsPartInsteadOfChange: true, useTildeAsSuffixInRenameEventFileName: true }),
timeouts: sys => sys.checkTimeoutQueueLengthAndRun(2),
},
{
caption: "Replace file with rename event that fixes error",
change: sys => sys.modifyFile(`${projectRoot}/foo.d.ts`, `export function foo(): string;`, { invokeFileDeleteCreateAsPartInsteadOfChange: true, useTildeAsSuffixInRenameEventFileName: true }),
timeouts: sys => sys.checkTimeoutQueueLengthAndRun(2),
},
]
});
verifyTscWatch({
scenario,
subScenario: `fsWatch/when using file watching thats on inode when rename occurs when file is still on the disk`,
commandLineArgs: ["-w", "--extendedDiagnostics"],
sys: () => createWatchedSystem(
{
[libFile.path]: libFile.content,
[`${projectRoot}/main.ts`]: `import { foo } from "./foo"; foo();`,
[`${projectRoot}/foo.ts`]: `export declare function foo(): string;`,
[`${projectRoot}/tsconfig.json`]: JSON.stringify({
watchOptions: { watchFile: "useFsEvents" },
files: ["foo.ts", "main.ts"]
}),
},
{
currentDirectory: projectRoot,
inodeWatching: true,
}
),
changes: [
{
caption: "Introduce error such that when callback happens file is already appeared",
// vm's wq generates this kind of event
// Skip delete event so inode changes but when the create's rename occurs file is on disk
change: sys => sys.modifyFile(`${projectRoot}/foo.ts`, `export declare function foo2(): string;`, {
invokeFileDeleteCreateAsPartInsteadOfChange: true,
ignoreDelete: true,
skipInodeCheckOnCreate: true
}),
timeouts: sys => sys.checkTimeoutQueueLengthAndRun(1),
},
{
caption: "Replace file with rename event that fixes error",
change: sys => sys.modifyFile(`${projectRoot}/foo.ts`, `export declare function foo(): string;`, { invokeFileDeleteCreateAsPartInsteadOfChange: true, }),
timeouts: sys => sys.checkTimeoutQueueLengthAndRun(1),
},
]
});
});
});
}
@@ -1,8 +1,4 @@
namespace ts.projectSystem {
function getNumberOfWatchesInvokedForRecursiveWatches(recursiveWatchedDirs: string[], file: string) {
return countWhere(recursiveWatchedDirs, dir => file.length > dir.length && startsWith(file, dir) && file[dir.length] === directorySeparator);
}
describe("unittests:: tsserver:: CachingFileSystemInformation:: tsserverProjectSystem CachingFileSystemInformation", () => {
enum CalledMapsWithSingleArg {
fileExists = "fileExists",
@@ -15,7 +11,7 @@ namespace ts.projectSystem {
}
type CalledMaps = CalledMapsWithSingleArg | CalledMapsWithFiveArgs;
type CalledWithFiveArgs = [readonly string[], readonly string[], readonly string[], number];
function createCallsTrackingHost(host: TestServerHost) {
function createLoggerTrackingHostCalls(host: TestServerHost) {
const calledMaps: Record<CalledMapsWithSingleArg, MultiMap<string, true>> & Record<CalledMapsWithFiveArgs, MultiMap<string, CalledWithFiveArgs>> = {
fileExists: setCallsTrackingWithSingleArgFn(CalledMapsWithSingleArg.fileExists),
directoryExists: setCallsTrackingWithSingleArgFn(CalledMapsWithSingleArg.directoryExists),
@@ -24,15 +20,7 @@ namespace ts.projectSystem {
readDirectory: setCallsTrackingWithFiveArgFn(CalledMapsWithFiveArgs.readDirectory)
};
return {
verifyNoCall,
verifyCalledOnEachEntryNTimes,
verifyCalledOnEachEntry,
verifyNoHostCalls,
verifyNoHostCallsExceptFileExistsOnce,
verifyCalledOn,
clear
};
return logCacheAndClear;
function setCallsTrackingWithSingleArgFn(prop: CalledMapsWithSingleArg) {
const calledMap = createMultiMap<true>();
@@ -54,49 +42,25 @@ namespace ts.projectSystem {
return calledMap;
}
function verifyCalledOn(callback: CalledMaps, name: string) {
const calledMap = calledMaps[callback];
const result = calledMap.get(name);
assert.isTrue(result && !!result.length, `${callback} should be called with name: ${name}: ${arrayFrom(calledMap.keys())}`);
function logCacheEntry(logger: Logger, callback: CalledMaps) {
const result = arrayFrom<[string, (true | CalledWithFiveArgs)[]], { key: string, count: number }>(calledMaps[callback].entries(), ([key, arr]) => ({ key, count: arr.length }));
logger.info(`${callback}:: ${JSON.stringify(result)}`);
calledMaps[callback].clear();
}
function verifyNoCall(callback: CalledMaps) {
const calledMap = calledMaps[callback];
assert.equal(calledMap.size, 0, `${callback} shouldn't be called: ${arrayFrom(calledMap.keys())}`);
function logCacheAndClear(logger: Logger) {
logCacheEntry(logger, CalledMapsWithSingleArg.fileExists);
logCacheEntry(logger, CalledMapsWithSingleArg.directoryExists);
logCacheEntry(logger, CalledMapsWithSingleArg.getDirectories);
logCacheEntry(logger, CalledMapsWithSingleArg.readFile);
logCacheEntry(logger, CalledMapsWithFiveArgs.readDirectory);
}
}
function verifyCalledOnEachEntry(callback: CalledMaps, expectedKeys: ESMap<string, number>) {
TestFSWithWatch.checkMap<true | CalledWithFiveArgs>(callback, calledMaps[callback], expectedKeys);
}
function verifyCalledOnEachEntryNTimes(callback: CalledMaps, expectedKeys: readonly string[], nTimes: number) {
TestFSWithWatch.checkMap<true | CalledWithFiveArgs>(callback, calledMaps[callback], expectedKeys, nTimes);
}
function verifyNoHostCalls() {
iterateOnCalledMaps(key => verifyNoCall(key));
}
function verifyNoHostCallsExceptFileExistsOnce(expectedKeys: readonly string[]) {
verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, expectedKeys, 1);
verifyNoCall(CalledMapsWithSingleArg.directoryExists);
verifyNoCall(CalledMapsWithSingleArg.getDirectories);
verifyNoCall(CalledMapsWithSingleArg.readFile);
verifyNoCall(CalledMapsWithFiveArgs.readDirectory);
}
function clear() {
iterateOnCalledMaps(key => calledMaps[key].clear());
}
function iterateOnCalledMaps(cb: (key: CalledMaps) => void) {
for (const key in CalledMapsWithSingleArg) {
cb(key as CalledMapsWithSingleArg);
}
for (const key in CalledMapsWithFiveArgs) {
cb(key as CalledMapsWithFiveArgs);
}
}
function logSemanticDiagnostics(projectService: server.ProjectService, project: server.Project, file: File) {
const diags = project.getLanguageService().getSemanticDiagnostics(file.path);
projectService.logger.info(`getSemanticDiagnostics:: ${file.path}:: ${diags.length}`);
diags.forEach(d => projectService.logger.info(formatDiagnostic(d, project)));
}
it("works using legacy resolution logic", () => {
@@ -112,108 +76,50 @@ namespace ts.projectSystem {
};
const host = createServerHost([root, imported]);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.setCompilerOptionsForInferredProjects({ module: ModuleKind.AMD, noLib: true });
projectService.openClientFile(root.path);
checkNumberOfProjects(projectService, { inferredProjects: 1 });
const project = projectService.inferredProjects[0];
const rootScriptInfo = project.getRootScriptInfos()[0];
assert.equal(rootScriptInfo.fileName, root.path);
// ensure that imported file was found
verifyImportedDiagnostics();
logSemanticDiagnostics(projectService, project, imported);
const callsTrackingHost = createCallsTrackingHost(host);
const logCacheAndClear = createLoggerTrackingHostCalls(host);
// trigger synchronization to make sure that import will be fetched from the cache
// ensure file has correct number of errors after edit
editContent(`import {x} from "f1";
var x: string = 1;`);
verifyImportedDiagnostics();
callsTrackingHost.verifyNoHostCalls();
logSemanticDiagnostics(projectService, project, imported);
logCacheAndClear(projectService.logger);
// trigger synchronization to make sure that the host will try to find 'f2' module on disk
editContent(`import {x} from "f2"`);
try {
// trigger synchronization to make sure that the host will try to find 'f2' module on disk
verifyImportedDiagnostics();
assert.isTrue(false, `should not find file '${imported.path}'`);
logSemanticDiagnostics(projectService, project, imported);
}
catch (e) {
assert.isTrue(e.message.indexOf(`Could not find source file: '${imported.path}'.`) === 0, `Actual: ${e.message}`);
projectService.logger.info(e.message);
}
const f2Lookups = getLocationsForModuleLookup("f2");
callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, f2Lookups, 1);
const f2DirLookups = getLocationsForDirectoryLookup();
callsTrackingHost.verifyCalledOnEachEntry(CalledMapsWithSingleArg.directoryExists, f2DirLookups);
callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.getDirectories);
callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.readFile);
callsTrackingHost.verifyNoCall(CalledMapsWithFiveArgs.readDirectory);
logCacheAndClear(projectService.logger);
editContent(`import {x} from "f1"`);
verifyImportedDiagnostics();
const f1Lookups = f2Lookups.map(s => s.replace("f2", "f1"));
f1Lookups.length = f1Lookups.indexOf(imported.path) + 1;
const f1DirLookups = ["/c/d", "/c", ...mapCombinedPathsInAncestor(getDirectoryPath(root.path), nodeModulesAtTypes, returnTrue)];
vertifyF1Lookups();
logSemanticDiagnostics(projectService, project, imported);
logCacheAndClear(projectService.logger);
// setting compiler options discards module resolution cache
callsTrackingHost.clear();
projectService.setCompilerOptionsForInferredProjects({ module: ModuleKind.AMD, noLib: true, target: ScriptTarget.ES5 });
verifyImportedDiagnostics();
vertifyF1Lookups();
function vertifyF1Lookups() {
callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, f1Lookups, 1);
callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.directoryExists, f1DirLookups, 1);
callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.getDirectories);
callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.readFile);
callsTrackingHost.verifyNoCall(CalledMapsWithFiveArgs.readDirectory);
}
logSemanticDiagnostics(projectService, project, imported);
logCacheAndClear(projectService.logger);
baselineTsserverLogs("cachingFileSystemInformation", "works using legacy resolution logic", projectService);
function editContent(newContent: string) {
callsTrackingHost.clear();
rootScriptInfo.editContent(0, rootContent.length, newContent);
rootContent = newContent;
}
function verifyImportedDiagnostics() {
const diags = project.getLanguageService().getSemanticDiagnostics(imported.path);
assert.equal(diags.length, 1);
const diag = diags[0];
assert.equal(diag.code, Diagnostics.Cannot_find_name_0.code);
assert.equal(flattenDiagnosticMessageText(diag.messageText, "\n"), "Cannot find name 'foo'.");
}
function getLocationsForModuleLookup(module: string) {
const locations: string[] = [];
forEachAncestorDirectory(getDirectoryPath(root.path), ancestor => {
locations.push(
combinePaths(ancestor, `${module}.ts`),
combinePaths(ancestor, `${module}.tsx`),
combinePaths(ancestor, `${module}.d.ts`)
);
});
forEachAncestorDirectory(getDirectoryPath(root.path), ancestor => {
locations.push(
combinePaths(ancestor, `${module}.js`),
combinePaths(ancestor, `${module}.jsx`)
);
});
return locations;
}
function getLocationsForDirectoryLookup() {
const result = new Map<string, number>();
forEachAncestorDirectory(getDirectoryPath(root.path), ancestor => {
// To resolve modules
result.set(ancestor, 2);
// for type roots
result.set(combinePaths(ancestor, nodeModules), 1);
result.set(combinePaths(ancestor, nodeModulesAtTypes), 1);
});
return result;
}
});
it("loads missing files from disk", () => {
@@ -228,29 +134,22 @@ namespace ts.projectSystem {
};
const host = createServerHost([root]);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.setCompilerOptionsForInferredProjects({ module: ModuleKind.AMD, noLib: true });
const callsTrackingHost = createCallsTrackingHost(host);
const logCacheAndClear = createLoggerTrackingHostCalls(host);
projectService.openClientFile(root.path);
checkNumberOfProjects(projectService, { inferredProjects: 1 });
const project = projectService.inferredProjects[0];
const rootScriptInfo = project.getRootScriptInfos()[0];
assert.equal(rootScriptInfo.fileName, root.path);
let diags = project.getLanguageService().getSemanticDiagnostics(root.path);
assert.equal(diags.length, 1);
const diag = diags[0];
assert.equal(diag.code, Diagnostics.Cannot_find_module_0_Did_you_mean_to_set_the_moduleResolution_option_to_node_or_to_add_aliases_to_the_paths_option.code);
assert.equal(flattenDiagnosticMessageText(diag.messageText, "\n"), "Cannot find module 'bar'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option?");
callsTrackingHost.verifyCalledOn(CalledMapsWithSingleArg.fileExists, imported.path);
logSemanticDiagnostics(projectService, project, root);
logCacheAndClear(projectService.logger);
callsTrackingHost.clear();
host.writeFile(imported.path, imported.content);
host.runQueuedTimeoutCallbacks();
diags = project.getLanguageService().getSemanticDiagnostics(root.path);
assert.equal(diags.length, 0);
callsTrackingHost.verifyCalledOn(CalledMapsWithSingleArg.fileExists, imported.path);
logSemanticDiagnostics(projectService, project, root);
logCacheAndClear(projectService.logger);
baselineTsserverLogs("cachingFileSystemInformation", "loads missing files from disk", projectService);
});
it("when calling goto definition of module", () => {
@@ -296,17 +195,9 @@ namespace ts.projectSystem {
};
const projectFiles = [clientFile, anotherModuleFile, moduleFile, tsconfigFile];
const host = createServerHost(projectFiles);
const session = createSession(host);
const projectService = session.getProjectService();
const { configFileName } = projectService.openClientFile(clientFile.path);
assert.isDefined(configFileName, `should find config`);
checkNumberOfConfiguredProjects(projectService, 1);
const project = projectService.configuredProjects.get(tsconfigFile.path)!;
checkProjectActualFiles(project, map(projectFiles, f => f.path));
const callsTrackingHost = createCallsTrackingHost(host);
const session = createSession(host, { logger: createLoggerWithInMemoryLogs() });
openFilesForSession([clientFile], session);
const logCacheAndClear = createLoggerTrackingHostCalls(host);
// Get definitions shouldnt make host requests
const getDefinitionRequest = makeSessionRequest<protocol.FileLocationRequestArgs>(protocol.CommandTypes.Definition, {
@@ -315,137 +206,90 @@ namespace ts.projectSystem {
line: undefined!, // TODO: GH#18217
offset: undefined! // TODO: GH#18217
});
const response = session.executeCommand(getDefinitionRequest).response as server.protocol.FileSpan[];
assert.equal(response[0].file, moduleFile.path, "Should go to definition of vessel: response: " + JSON.stringify(response));
callsTrackingHost.verifyNoHostCalls();
session.executeCommand(getDefinitionRequest);
logCacheAndClear(session.logger);
// Open the file should call only file exists on module directory and use cached value for parental directory
const { configFileName: config2 } = projectService.openClientFile(moduleFile.path);
assert.equal(config2, configFileName);
callsTrackingHost.verifyNoHostCallsExceptFileExistsOnce(["/a/b/models/tsconfig.json", "/a/b/models/jsconfig.json"]);
openFilesForSession([moduleFile], session);
logCacheAndClear(session.logger);
checkNumberOfConfiguredProjects(projectService, 1);
assert.strictEqual(projectService.configuredProjects.get(tsconfigFile.path), project);
baselineTsserverLogs("cachingFileSystemInformation", "when calling goto definition of module", session);
});
describe("WatchDirectories for config file with", () => {
function verifyWatchDirectoriesCaseSensitivity(useCaseSensitiveFileNames: boolean) {
const frontendDir = "/Users/someuser/work/applications/frontend";
const toCanonical: (s: string) => Path = useCaseSensitiveFileNames ? s => s as Path : s => s.toLowerCase() as Path;
const canonicalFrontendDir = toCanonical(frontendDir);
const file1: File = {
path: `${frontendDir}/src/app/utils/Analytic.ts`,
content: "export class SomeClass { };"
};
const file2: File = {
path: `${frontendDir}/src/app/redux/configureStore.ts`,
content: "export class configureStore { }"
};
const file3: File = {
path: `${frontendDir}/src/app/utils/Cookie.ts`,
content: "export class Cookie { }"
};
const es2016LibFile: File = {
path: "/a/lib/lib.es2016.full.d.ts",
content: libFile.content
};
const typeRoots = ["types", "node_modules/@types"];
const types = ["node", "jest"];
const tsconfigFile: File = {
path: `${frontendDir}/tsconfig.json`,
content: JSON.stringify({
compilerOptions: {
strict: true,
strictNullChecks: true,
target: "es2016",
module: "commonjs",
moduleResolution: "node",
sourceMap: true,
noEmitOnError: true,
experimentalDecorators: true,
emitDecoratorMetadata: true,
types,
noUnusedLocals: true,
outDir: "./compiled",
typeRoots,
baseUrl: ".",
paths: {
"*": [
"types/*"
]
}
},
include: [
"src/**/*"
],
exclude: [
"node_modules",
"compiled"
]
})
};
const projectFiles = [file1, file2, es2016LibFile, tsconfigFile];
const host = createServerHost(projectFiles, { useCaseSensitiveFileNames });
const projectService = createProjectService(host);
const canonicalConfigPath = toCanonical(tsconfigFile.path);
const { configFileName } = projectService.openClientFile(file1.path);
assert.equal(configFileName, tsconfigFile.path as server.NormalizedPath, `should find config`);
checkNumberOfConfiguredProjects(projectService, 1);
const watchingRecursiveDirectories = [`${canonicalFrontendDir}/src`, `${canonicalFrontendDir}/types`, `${canonicalFrontendDir}/node_modules`].concat(getNodeModuleDirectories(getDirectoryPath(canonicalFrontendDir)));
it(`watchDirectories for config file with case ${useCaseSensitiveFileNames ? "" : "in"}sensitive file system`, () => {
const frontendDir = "/Users/someuser/work/applications/frontend";
const file1: File = {
path: `${frontendDir}/src/app/utils/Analytic.ts`,
content: "export class SomeClass { };"
};
const file2: File = {
path: `${frontendDir}/src/app/redux/configureStore.ts`,
content: "export class configureStore { }"
};
const file3: File = {
path: `${frontendDir}/src/app/utils/Cookie.ts`,
content: "export class Cookie { }"
};
const es2016LibFile: File = {
path: "/a/lib/lib.es2016.full.d.ts",
content: libFile.content
};
const typeRoots = ["types", "node_modules/@types"];
const types = ["node", "jest"];
const tsconfigFile: File = {
path: `${frontendDir}/tsconfig.json`,
content: JSON.stringify({
compilerOptions: {
strict: true,
strictNullChecks: true,
target: "es2016",
module: "commonjs",
moduleResolution: "node",
sourceMap: true,
noEmitOnError: true,
experimentalDecorators: true,
emitDecoratorMetadata: true,
types,
noUnusedLocals: true,
outDir: "./compiled",
typeRoots,
baseUrl: ".",
paths: {
"*": [
"types/*"
]
}
},
include: [
"src/**/*"
],
exclude: [
"node_modules",
"compiled"
]
})
};
const projectFiles = [file1, file2, es2016LibFile, tsconfigFile];
const host = createServerHost(projectFiles, { useCaseSensitiveFileNames });
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.openClientFile(file1.path);
const project = projectService.configuredProjects.get(canonicalConfigPath)!;
verifyProjectAndWatchedDirectories();
const logCacheAndClear = createLoggerTrackingHostCalls(host);
const callsTrackingHost = createCallsTrackingHost(host);
// Create file cookie.ts
host.writeFile(file3.path, file3.content);
host.runQueuedTimeoutCallbacks();
logCacheAndClear(projectService.logger);
// Create file cookie.ts
projectFiles.push(file3);
host.writeFile(file3.path, file3.content);
host.runQueuedTimeoutCallbacks();
const canonicalFile3Path = useCaseSensitiveFileNames ? file3.path : file3.path.toLocaleLowerCase();
const numberOfTimesWatchInvoked = getNumberOfWatchesInvokedForRecursiveWatches(watchingRecursiveDirectories, canonicalFile3Path);
callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, [canonicalFile3Path], numberOfTimesWatchInvoked);
callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.directoryExists, [canonicalFile3Path], numberOfTimesWatchInvoked);
callsTrackingHost.verifyNoCall(CalledMapsWithSingleArg.getDirectories);
callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.readFile, [file3.path], 1);
callsTrackingHost.verifyNoCall(CalledMapsWithFiveArgs.readDirectory);
checkNumberOfConfiguredProjects(projectService, 1);
assert.strictEqual(projectService.configuredProjects.get(canonicalConfigPath), project);
verifyProjectAndWatchedDirectories();
callsTrackingHost.clear();
const { configFileName: configFile2 } = projectService.openClientFile(file3.path);
assert.equal(configFile2, configFileName);
checkNumberOfConfiguredProjects(projectService, 1);
assert.strictEqual(projectService.configuredProjects.get(canonicalConfigPath), project);
verifyProjectAndWatchedDirectories();
callsTrackingHost.verifyNoHostCalls();
function getFilePathIfNotOpen(f: File) {
const path = toCanonical(f.path);
const info = projectService.getScriptInfoForPath(toCanonical(f.path));
return info && info.isScriptOpen() ? undefined : path;
}
function verifyProjectAndWatchedDirectories() {
checkProjectActualFiles(project, map(projectFiles, f => f.path));
checkWatchedFiles(host, mapDefined(projectFiles, getFilePathIfNotOpen));
checkWatchedDirectories(host, watchingRecursiveDirectories, /*recursive*/ true);
checkWatchedDirectories(host, [], /*recursive*/ false);
}
projectService.openClientFile(file3.path);
logCacheAndClear(projectService.logger);
baselineTsserverLogs("cachingFileSystemInformation", `watchDirectories for config file with case ${useCaseSensitiveFileNames ? "" : "in"}sensitive file system`, projectService);
});
}
it("case insensitive file system", () => {
verifyWatchDirectoriesCaseSensitivity(/*useCaseSensitiveFileNames*/ false);
});
it("case sensitive file system", () => {
verifyWatchDirectoriesCaseSensitivity(/*useCaseSensitiveFileNames*/ true);
});
verifyWatchDirectoriesCaseSensitivity(/*useCaseSensitiveFileNames*/ false);
verifyWatchDirectoriesCaseSensitivity(/*useCaseSensitiveFileNames*/ true);
});
describe("Subfolder invalidations correctly include parent folder failed lookup locations", () => {
@@ -538,15 +382,10 @@ namespace ts.projectSystem {
}
`
});
const appFolder = getDirectoryPath(app.path);
const projectFiles = [app, libFile, tsconfigJson];
const otherFiles = [packageJson];
const host = createServerHost(projectFiles.concat(otherFiles));
const host = createServerHost([app, libFile, tsconfigJson, packageJson]);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.setHostConfiguration({ preferences: { includePackageJsonAutoImports: "off" } });
const { configFileName } = projectService.openClientFile(app.path);
assert.equal(configFileName, tsconfigJson.path as server.NormalizedPath, `should find config`); // TODO: GH#18217
const recursiveWatchedDirectories: string[] = [`${appFolder}`, `${appFolder}/node_modules`].concat(getNodeModuleDirectories(getDirectoryPath(appFolder)));
projectService.openClientFile(app.path);
let npmInstallComplete = false;
@@ -625,10 +464,6 @@ namespace ts.projectSystem {
});
host.deleteFolder(root + "/a/b/node_modules/.staging", /*recursive*/ true);
const lodashIndexPath = root + "/a/b/node_modules/@types/lodash/index.d.ts";
projectFiles.push(find(filesAndFoldersToAdd, f => f.path === lodashIndexPath)!);
// we would now not have failed lookup in the parent of appFolder since lodash is available
recursiveWatchedDirectories.length = 2;
// npm installation complete, timeout after reload fs
npmInstallComplete = true;
verifyAfterPartialOrCompleteNpmInstall(2);
@@ -660,7 +495,6 @@ namespace ts.projectSystem {
it("timeouts occur inbetween installation", () => {
verifyNpmInstall(/*timeoutDuringPartialInstallation*/ true);
});
it("timeout occurs after installation", () => {
verifyNpmInstall(/*timeoutDuringPartialInstallation*/ false);
});
@@ -38,22 +38,14 @@ namespace ts.projectSystem {
content: "{}"
};
const host = createServerHost([f1, libFile, configFile, configFile2]);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(f1.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectDir);
checkNumberOfProjects(service, { configuredProjects: 1 });
assert.isDefined(service.configuredProjects.get(configFile.path));
checkWatchedFiles(host, [libFile.path, configFile.path]);
checkWatchedDirectories(host, [], /*recursive*/ false);
const typeRootLocations = getTypeRootsFromLocation(configFileLocation);
checkWatchedDirectories(host, typeRootLocations.concat(configFileLocation), /*recursive*/ true);
// Delete config file - should create inferred project and not configured project
host.deleteFile(configFile.path);
host.runQueuedTimeoutCallbacks();
checkNumberOfProjects(service, { inferredProjects: 1 });
checkWatchedFiles(host, [libFile.path, configFile.path, `${configFileLocation}/jsconfig.json`, `${projectDir}/tsconfig.json`, `${projectDir}/jsconfig.json`]);
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, typeRootLocations, /*recursive*/ true);
baselineTsserverLogs("configFileSearch", "should use projectRootPath when searching for inferred project again", service);
});
it("should use projectRootPath when searching for inferred project again 2", () => {
@@ -72,22 +64,17 @@ namespace ts.projectSystem {
content: "{}"
};
const host = createServerHost([f1, libFile, configFile, configFile2]);
const service = createProjectService(host, { useSingleInferredProject: true, useInferredProjectPerProjectRoot: true });
const service = createProjectService(host, {
useSingleInferredProject: true,
useInferredProjectPerProjectRoot: true,
logger: createLoggerWithInMemoryLogs(),
});
service.openClientFile(f1.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectDir);
checkNumberOfProjects(service, { configuredProjects: 1 });
assert.isDefined(service.configuredProjects.get(configFile.path));
checkWatchedFiles(host, [libFile.path, configFile.path]);
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, getTypeRootsFromLocation(configFileLocation).concat(configFileLocation), /*recursive*/ true);
// Delete config file - should create inferred project with project root path set
host.deleteFile(configFile.path);
host.runQueuedTimeoutCallbacks();
checkNumberOfProjects(service, { inferredProjects: 1 });
assert.equal(service.inferredProjects[0].projectRootPath, projectDir);
checkWatchedFiles(host, [libFile.path, configFile.path, `${configFileLocation}/jsconfig.json`, `${projectDir}/tsconfig.json`, `${projectDir}/jsconfig.json`]);
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, getTypeRootsFromLocation(projectDir), /*recursive*/ true);
baselineTsserverLogs("configFileSearch", "should use projectRootPath when searching for inferred project again 2", service);
});
describe("when the opened file is not from project root", () => {
@@ -100,89 +87,50 @@ namespace ts.projectSystem {
path: `${projectRoot}/tsconfig.json`,
content: "{}"
};
const dirOfFile = getDirectoryPath(file.path);
function openClientFile(files: File[]) {
const host = createServerHost(files);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.openClientFile(file.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, "/a/b/projects/proj");
return { host, projectService };
}
function verifyConfiguredProject(host: TestServerHost, projectService: TestProjectService, orphanInferredProject?: boolean) {
projectService.checkNumberOfProjects({ configuredProjects: 1, inferredProjects: orphanInferredProject ? 1 : 0 });
const project = Debug.checkDefined(projectService.configuredProjects.get(tsconfig.path));
if (orphanInferredProject) {
const inferredProject = projectService.inferredProjects[0];
assert.isTrue(inferredProject.isOrphan());
}
checkProjectActualFiles(project, [file.path, libFile.path, tsconfig.path]);
checkWatchedFiles(host, [libFile.path, tsconfig.path]);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectories(host, (orphanInferredProject ? [projectRoot, `${dirOfFile}/node_modules/@types`] : [projectRoot]).concat(getTypeRootsFromLocation(projectRoot)), /*recursive*/ true);
}
function verifyInferredProject(host: TestServerHost, projectService: TestProjectService) {
projectService.checkNumberOfProjects({ inferredProjects: 1 });
const project = projectService.inferredProjects[0];
assert.isDefined(project);
const filesToWatch = [libFile.path, ...getConfigFilesToWatch(dirOfFile)];
checkProjectActualFiles(project, [file.path, libFile.path]);
checkWatchedFiles(host, filesToWatch);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectories(host, getTypeRootsFromLocation(dirOfFile), /*recursive*/ true);
}
it("tsconfig for the file exists", () => {
const { host, projectService } = openClientFile([file, libFile, tsconfig]);
verifyConfiguredProject(host, projectService);
host.deleteFile(tsconfig.path);
host.runQueuedTimeoutCallbacks();
verifyInferredProject(host, projectService);
host.writeFile(tsconfig.path, tsconfig.content);
host.runQueuedTimeoutCallbacks();
verifyConfiguredProject(host, projectService, /*orphanInferredProject*/ true);
baselineTsserverLogs("configFileSearch", "tsconfig for the file exists", projectService);
});
it("tsconfig for the file does not exist", () => {
const { host, projectService } = openClientFile([file, libFile]);
verifyInferredProject(host, projectService);
host.writeFile(tsconfig.path, tsconfig.content);
host.runQueuedTimeoutCallbacks();
verifyConfiguredProject(host, projectService, /*orphanInferredProject*/ true);
host.deleteFile(tsconfig.path);
host.runQueuedTimeoutCallbacks();
verifyInferredProject(host, projectService);
baselineTsserverLogs("configFileSearch", "tsconfig for the file does not exist", projectService);
});
});
describe("should not search and watch config files from directories that cannot be watched", () => {
const root = "/root/teams/VSCode68/Shared Documents/General/jt-ts-test-workspace";
function verifyConfigFileWatch(projectRootPath: string | undefined) {
const path = `${root}/x.js`;
const host = createServerHost([libFile, { path, content: "const x = 10" }], { useCaseSensitiveFileNames: true });
const service = createProjectService(host);
service.openClientFile(path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectRootPath);
checkNumberOfProjects(service, { inferredProjects: 1 });
checkProjectActualFiles(service.inferredProjects[0], [path, libFile.path]);
checkWatchedFilesDetailed(host, [libFile.path, ...getConfigFilesToWatch(root)], 1);
function verifyConfigFileWatch(scenario: string, projectRootPath: string | undefined) {
it(scenario, () => {
const path = `/root/teams/VSCode68/Shared Documents/General/jt-ts-test-workspace/x.js`;
const host = createServerHost([libFile, { path, content: "const x = 10" }], { useCaseSensitiveFileNames: true });
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectRootPath);
baselineTsserverLogs("configFileSearch", scenario, service);
});
}
it("when projectRootPath is not present", () => {
verifyConfigFileWatch(/*projectRootPath*/ undefined);
});
it("when projectRootPath is present but file is not from project root", () => {
verifyConfigFileWatch("/a/b");
});
verifyConfigFileWatch("when projectRootPath is not present", /*projectRootPath*/ undefined);
verifyConfigFileWatch("when projectRootPath is present but file is not from project root", "/a/b");
});
});
}
@@ -25,21 +25,13 @@ namespace ts.projectSystem {
};
const host = createServerHost([configFile, libFile, file1, file2, file3]);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
const { configFileName, configFileErrors } = projectService.openClientFile(file1.path);
assert(configFileName, "should find config file");
assert.isTrue(!configFileErrors || configFileErrors.length === 0, `expect no errors in config file, got ${JSON.stringify(configFileErrors)}`);
checkNumberOfInferredProjects(projectService, 0);
checkNumberOfConfiguredProjects(projectService, 1);
const project = configuredProjectAt(projectService, 0);
checkProjectActualFiles(project, [file1.path, libFile.path, file2.path, configFile.path]);
checkProjectRootFiles(project, [file1.path, file2.path]);
// watching all files except one that was open
checkWatchedFiles(host, [configFile.path, file2.path, libFile.path]);
const configFileDirectory = getDirectoryPath(configFile.path);
checkWatchedDirectories(host, [configFileDirectory, combinePaths(configFileDirectory, nodeModulesAtTypes)], /*recursive*/ true);
baselineTsserverLogs("configuredProjects", "create configured project without file list", projectService);
});
it("create configured project with the file list", () => {
@@ -65,20 +57,13 @@ namespace ts.projectSystem {
};
const host = createServerHost([configFile, libFile, file1, file2, file3]);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
const { configFileName, configFileErrors } = projectService.openClientFile(file1.path);
assert(configFileName, "should find config file");
assert.isTrue(!configFileErrors || configFileErrors.length === 0, `expect no errors in config file, got ${JSON.stringify(configFileErrors)}`);
checkNumberOfInferredProjects(projectService, 0);
checkNumberOfConfiguredProjects(projectService, 1);
const project = configuredProjectAt(projectService, 0);
checkProjectActualFiles(project, [file1.path, libFile.path, file2.path, configFile.path]);
checkProjectRootFiles(project, [file1.path, file2.path]);
// watching all files except one that was open
checkWatchedFiles(host, [configFile.path, file2.path, libFile.path]);
checkWatchedDirectories(host, [getDirectoryPath(configFile.path)], /*recursive*/ false);
baselineTsserverLogs("configuredProjects", "create configured project with the file list", projectService);
});
it("add and then remove a config file in a folder with loose files", () => {
@@ -99,41 +84,19 @@ namespace ts.projectSystem {
const host = createServerHost([libFile, commonFile1, commonFile2]);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.openClientFile(commonFile1.path);
projectService.openClientFile(commonFile2.path);
projectService.checkNumberOfProjects({ inferredProjects: 2 });
checkProjectActualFiles(projectService.inferredProjects[0], [commonFile1.path, libFile.path]);
checkProjectActualFiles(projectService.inferredProjects[1], [commonFile2.path, libFile.path]);
const watchedFiles = getConfigFilesToWatch(tscWatch.projectRoot).concat(libFile.path);
checkWatchedFiles(host, watchedFiles);
// Add a tsconfig file
host.writeFile(configFile.path, configFile.content);
host.checkTimeoutQueueLengthAndRun(2); // load configured project from disk + ensureProjectsForOpenFiles
projectService.checkNumberOfProjects({ inferredProjects: 2, configuredProjects: 1 });
assert.isTrue(projectService.inferredProjects[0].isOrphan());
checkProjectActualFiles(projectService.inferredProjects[1], [commonFile2.path, libFile.path]);
checkProjectActualFiles(projectService.configuredProjects.get(configFile.path)!, [libFile.path, commonFile1.path, configFile.path]);
checkWatchedFiles(host, watchedFiles);
// remove the tsconfig file
host.deleteFile(configFile.path);
projectService.checkNumberOfProjects({ inferredProjects: 2 });
assert.isTrue(projectService.inferredProjects[0].isOrphan());
checkProjectActualFiles(projectService.inferredProjects[1], [commonFile2.path, libFile.path]);
host.checkTimeoutQueueLengthAndRun(1); // Refresh inferred projects
projectService.checkNumberOfProjects({ inferredProjects: 2 });
checkProjectActualFiles(projectService.inferredProjects[0], [commonFile1.path, libFile.path]);
checkProjectActualFiles(projectService.inferredProjects[1], [commonFile2.path, libFile.path]);
checkWatchedFiles(host, watchedFiles);
baselineTsserverLogs("configuredProjects", "add and then remove a config file in a folder with loose files", projectService);
});
it("add new files to a configured project without file list", () => {
@@ -142,20 +105,13 @@ namespace ts.projectSystem {
content: `{}`
};
const host = createServerHost([commonFile1, libFile, configFile]);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.openClientFile(commonFile1.path);
const configFileDir = getDirectoryPath(configFile.path);
checkWatchedDirectories(host, [configFileDir, combinePaths(configFileDir, nodeModulesAtTypes)], /*recursive*/ true);
checkNumberOfConfiguredProjects(projectService, 1);
const project = configuredProjectAt(projectService, 0);
checkProjectRootFiles(project, [commonFile1.path]);
// add a new ts file
host.writeFile(commonFile2.path, commonFile2.content);
host.checkTimeoutQueueLengthAndRun(2);
// project service waits for 250ms to update the project structure, therefore the assertion needs to wait longer.
checkProjectRootFiles(project, [commonFile1.path, commonFile2.path]);
baselineTsserverLogs("configuredProjects", "add new files to a configured project without file list", projectService);
});
it("should ignore non-existing files specified in the config file", () => {
@@ -581,56 +537,37 @@ namespace ts.projectSystem {
const files = [file1, file2, file3, file4];
const host = createServerHost(files.concat(configFile));
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.openClientFile(file1.path);
projectService.openClientFile(file2.path);
projectService.openClientFile(file3.path);
projectService.openClientFile(file4.path);
const infos = files.map(file => projectService.getScriptInfoForPath(file.path as Path)!);
checkOpenFiles(projectService, files);
checkNumberOfProjects(projectService, { configuredProjects: 1, inferredProjects: 2 });
const configProject1 = projectService.configuredProjects.get(configFile.path)!;
assert.isTrue(configProject1.hasOpenRef()); // file1 and file3
checkProjectActualFiles(configProject1, [file1.path, file3.path, configFile.path]);
const inferredProject1 = projectService.inferredProjects[0];
checkProjectActualFiles(inferredProject1, [file2.path]);
const inferredProject2 = projectService.inferredProjects[1];
checkProjectActualFiles(inferredProject2, [file4.path]);
host.writeFile(configFile.path, "{}");
host.runQueuedTimeoutCallbacks();
verifyScriptInfos();
checkOpenFiles(projectService, files);
verifyConfiguredProjectStateAfterUpdate(/*hasOpenRef*/ true, 2); // file1, file2, file3
assert.isTrue(configProject1.hasOpenRef()); // file1, file2, file3
assert.isTrue(projectService.inferredProjects[0].isOrphan());
const inferredProject3 = projectService.inferredProjects[1];
checkProjectActualFiles(inferredProject3, [file4.path]);
assert.strictEqual(inferredProject3, inferredProject2);
projectService.closeClientFile(file1.path);
projectService.closeClientFile(file2.path);
projectService.closeClientFile(file4.path);
verifyScriptInfos();
checkOpenFiles(projectService, [file3]);
verifyConfiguredProjectStateAfterUpdate(/*hasOpenRef*/ true, 2); // file3
assert.isTrue(configProject1.hasOpenRef()); // file3
assert.isTrue(projectService.inferredProjects[0].isOrphan());
assert.isTrue(projectService.inferredProjects[1].isOrphan());
projectService.openClientFile(file4.path);
verifyScriptInfos();
checkOpenFiles(projectService, [file3, file4]);
verifyConfiguredProjectStateAfterUpdate(/*hasOpenRef*/ true, 1); // file3
assert.isTrue(configProject1.hasOpenRef()); // file3
const inferredProject4 = projectService.inferredProjects[0];
checkProjectActualFiles(inferredProject4, [file4.path]);
projectService.closeClientFile(file3.path);
verifyScriptInfos();
checkOpenFiles(projectService, [file4]);
verifyConfiguredProjectStateAfterUpdate(/*hasOpenRef*/ false, 1); // No open files
assert.isFalse(configProject1.hasOpenRef()); // No open files
const inferredProject5 = projectService.inferredProjects[0];
checkProjectActualFiles(inferredProject4, [file4.path]);
assert.strictEqual(inferredProject5, inferredProject4);
@@ -641,31 +578,8 @@ namespace ts.projectSystem {
};
host.writeFile(file5.path, file5.content);
projectService.openClientFile(file5.path);
verifyScriptInfosAreUndefined([file1, file2, file3]);
assert.strictEqual(projectService.getScriptInfoForPath(file4.path as Path), find(infos, info => info.path === file4.path));
assert.isDefined(projectService.getScriptInfoForPath(file5.path as Path));
checkOpenFiles(projectService, [file4, file5]);
checkNumberOfProjects(projectService, { inferredProjects: 2 });
checkProjectActualFiles(projectService.inferredProjects[0], [file4.path]);
checkProjectActualFiles(projectService.inferredProjects[1], [file5.path]);
function verifyScriptInfos() {
infos.forEach(info => assert.strictEqual(projectService.getScriptInfoForPath(info.path), info));
}
function verifyScriptInfosAreUndefined(files: File[]) {
for (const file of files) {
assert.isUndefined(projectService.getScriptInfoForPath(file.path as Path));
}
}
function verifyConfiguredProjectStateAfterUpdate(hasOpenRef: boolean, inferredProjects: number) {
checkNumberOfProjects(projectService, { configuredProjects: 1, inferredProjects });
const configProject2 = projectService.configuredProjects.get(configFile.path)!;
assert.strictEqual(configProject2, configProject1);
checkProjectActualFiles(configProject2, [file1.path, file2.path, file3.path, configFile.path]);
assert.equal(configProject2.hasOpenRef(), hasOpenRef);
}
baselineTsserverLogs("configuredProjects", "Open ref of configured project when open file gets added to the project as part of configured file update", projectService);
});
it("Open ref of configured project when open file gets added to the project as part of configured file update buts its open file references are all closed when the update happens", () => {
@@ -1103,35 +1017,22 @@ foo();`
};
const host = createServerHost([alphaExtendedConfig, aConfig, aFile, bravoExtendedConfig, bConfig, bFile, ...(additionalFiles || emptyArray)]);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
return { host, projectService, aFile, bFile, aConfig, bConfig, alphaExtendedConfig, bravoExtendedConfig };
}
it("should watch the extended configs of multiple projects", () => {
const { host, projectService, aFile, bFile, aConfig, bConfig, alphaExtendedConfig, bravoExtendedConfig } = getService();
const { host, projectService, aFile, bFile, bConfig, alphaExtendedConfig, bravoExtendedConfig } = getService();
projectService.openClientFile(aFile.path);
projectService.openClientFile(bFile.path);
checkNumberOfConfiguredProjects(projectService, 2);
const aProject = projectService.configuredProjects.get(aConfig.path)!;
const bProject = projectService.configuredProjects.get(bConfig.path)!;
checkProjectActualFiles(aProject, [aFile.path, aConfig.path, alphaExtendedConfig.path]);
checkProjectActualFiles(bProject, [bFile.path, bConfig.path, bravoExtendedConfig.path, alphaExtendedConfig.path]);
assert.isUndefined(aProject.getCompilerOptions().strict);
assert.isUndefined(bProject.getCompilerOptions().strict);
checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, bravoExtendedConfig.path, alphaExtendedConfig.path]);
host.writeFile(alphaExtendedConfig.path, JSON.stringify({
compilerOptions: {
strict: true
}
}));
assert.isTrue(projectService.hasPendingProjectUpdate(aProject));
assert.isTrue(projectService.hasPendingProjectUpdate(bProject));
host.checkTimeoutQueueLengthAndRun(3);
assert.isTrue(aProject.getCompilerOptions().strict);
assert.isTrue(bProject.getCompilerOptions().strict);
checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, bravoExtendedConfig.path, alphaExtendedConfig.path]);
host.writeFile(bravoExtendedConfig.path, JSON.stringify({
extends: "./alpha.tsconfig.json",
@@ -1139,30 +1040,16 @@ foo();`
strict: false
}
}));
assert.isFalse(projectService.hasPendingProjectUpdate(aProject));
assert.isTrue(projectService.hasPendingProjectUpdate(bProject));
host.checkTimeoutQueueLengthAndRun(2);
assert.isTrue(aProject.getCompilerOptions().strict);
assert.isFalse(bProject.getCompilerOptions().strict);
checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, bravoExtendedConfig.path, alphaExtendedConfig.path]);
host.writeFile(bConfig.path, JSON.stringify({
extends: "../extended/alpha.tsconfig.json",
}));
assert.isFalse(projectService.hasPendingProjectUpdate(aProject));
assert.isTrue(projectService.hasPendingProjectUpdate(bProject));
host.checkTimeoutQueueLengthAndRun(2);
assert.isTrue(aProject.getCompilerOptions().strict);
assert.isTrue(bProject.getCompilerOptions().strict);
checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, alphaExtendedConfig.path]);
host.writeFile(alphaExtendedConfig.path, "{}");
assert.isTrue(projectService.hasPendingProjectUpdate(aProject));
assert.isTrue(projectService.hasPendingProjectUpdate(bProject));
host.checkTimeoutQueueLengthAndRun(3);
assert.isUndefined(aProject.getCompilerOptions().strict);
assert.isUndefined(bProject.getCompilerOptions().strict);
checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, alphaExtendedConfig.path]);
baselineTsserverLogs("configuredProjects", "should watch the extended configs of multiple projects", projectService);
});
it("should stop watching the extended configs of closed projects", () => {
@@ -1174,27 +1061,21 @@ foo();`
path: `${tscWatch.projectRoot}/dummy/tsconfig.json`,
content: "{}"
};
const { host, projectService, aFile, bFile, aConfig, bConfig, alphaExtendedConfig, bravoExtendedConfig } = getService([dummy, dummyConfig]);
const { projectService, aFile, bFile } = getService([dummy, dummyConfig]);
projectService.openClientFile(aFile.path);
projectService.openClientFile(bFile.path);
projectService.openClientFile(dummy.path);
checkNumberOfConfiguredProjects(projectService, 3);
checkWatchedFiles(host, [aConfig.path, bConfig.path, libFile.path, bravoExtendedConfig.path, alphaExtendedConfig.path, dummyConfig.path]);
projectService.closeClientFile(bFile.path);
projectService.closeClientFile(dummy.path);
projectService.openClientFile(dummy.path);
checkNumberOfConfiguredProjects(projectService, 2);
checkWatchedFiles(host, [aConfig.path, libFile.path, alphaExtendedConfig.path, dummyConfig.path]);
projectService.closeClientFile(aFile.path);
projectService.closeClientFile(dummy.path);
projectService.openClientFile(dummy.path);
checkNumberOfConfiguredProjects(projectService, 1);
checkWatchedFiles(host, [libFile.path, dummyConfig.path]);
baselineTsserverLogs("configuredProjects", "should stop watching the extended configs of closed projects", projectService);
});
});
});
@@ -1297,35 +1178,16 @@ foo();`
};
const files = [file1, file2a, configFile, libFile];
const host = createServerHost(files);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.openClientFile(file1.path);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
const project = projectService.configuredProjects.get(configFile.path)!;
assert.isDefined(project);
checkProjectActualFiles(project, map(files, file => file.path));
checkWatchedFiles(host, mapDefined(files, file => file === file1 ? undefined : file.path));
checkWatchedDirectoriesDetailed(host, ["/a/b"], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, ["/a/b/node_modules/@types"], 1, /*recursive*/ true);
files.push(file2);
host.writeFile(file2.path, file2.content);
host.runQueuedTimeoutCallbacks(); // Scheduled invalidation of resolutions
host.runQueuedTimeoutCallbacks(); // Actual update
checkNumberOfProjects(projectService, { configuredProjects: 1 });
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
checkProjectActualFiles(project, mapDefined(files, file => file === file2a ? undefined : file.path));
checkWatchedFiles(host, mapDefined(files, file => file === file1 ? undefined : file.path));
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, ["/a/b/node_modules/@types"], 1, /*recursive*/ true);
// On next file open the files file2a should be closed and not watched any more
projectService.openClientFile(file2.path);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
assert.strictEqual(projectService.configuredProjects.get(configFile.path), project);
checkProjectActualFiles(project, mapDefined(files, file => file === file2a ? undefined : file.path));
checkWatchedFiles(host, [libFile.path, configFile.path]);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, ["/a/b/node_modules/@types"], 1, /*recursive*/ true);
baselineTsserverLogs("configuredProjects", "changed module resolution reflected when specifying files list", projectService);
});
it("Failed lookup locations uses parent most node_modules directory", () => {
@@ -1355,17 +1217,9 @@ foo();`
nonLibFiles.forEach(f => f.path = root + f.path);
const files = nonLibFiles.concat(libFile);
const host = createServerHost(files);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.openClientFile(file1.path);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
const project = projectService.configuredProjects.get(configFile.path)!;
assert.isDefined(project);
checkProjectActualFiles(project, [file1.path, libFile.path, module1.path, module2.path, configFile.path]);
checkWatchedFiles(host, [libFile.path, configFile.path]);
checkWatchedDirectories(host, [], /*recursive*/ false);
const watchedRecursiveDirectories = getTypeRootsFromLocation(root + "/a/b/src");
watchedRecursiveDirectories.push(`${root}/a/b/src/node_modules`, `${root}/a/b/node_modules`);
checkWatchedDirectories(host, watchedRecursiveDirectories, /*recursive*/ true);
baselineTsserverLogs("configuredProjects", "failed lookup locations uses parent most node_modules directory", projectService);
});
});
@@ -198,7 +198,7 @@ namespace ts.projectSystem {
describe("when using event handler", () => {
verifyProjectLoadingStartAndFinish(host => {
const { session, events } = createSessionWithEventTracking<server.ProjectLoadingStartEvent | server.ProjectLoadingFinishEvent>(host, server.ProjectLoadingStartEvent, server.ProjectLoadingFinishEvent);
const { session, events } = createSessionWithEventTracking<server.ProjectLoadingStartEvent | server.ProjectLoadingFinishEvent>(host, [server.ProjectLoadingStartEvent, server.ProjectLoadingFinishEvent]);
return {
session,
getNumberOfEvents: () => events.length,
@@ -28,7 +28,7 @@ namespace ts.projectSystem {
verifyInitialOpen(file: File): void;
}
function verifyProjectsUpdatedInBackgroundEvent(createSession: (host: TestServerHost) => ProjectsUpdatedInBackgroundEventVerifier) {
function verifyProjectsUpdatedInBackgroundEvent(scenario: string, createSession: (host: TestServerHost, logger?: Logger) => ProjectsUpdatedInBackgroundEventVerifier) {
it("when adding new file", () => {
const commonFile1: File = {
path: "/a/b/file1.ts",
@@ -415,96 +415,70 @@ namespace ts.projectSystem {
});
describe("resolution when resolution cache size", () => {
function verifyWithMaxCacheLimit(useSlashRootAsSomeNotRootFolderInUserDirectory: boolean) {
const rootFolder = useSlashRootAsSomeNotRootFolderInUserDirectory ? "/user/username/rootfolder/otherfolder/" : "/";
const file1: File = {
path: rootFolder + "a/b/project/file1.ts",
content: 'import a from "file2"'
};
const file2: File = {
path: rootFolder + "a/b/node_modules/file2.d.ts",
content: "export class a { }"
};
const file3: File = {
path: rootFolder + "a/b/project/file3.ts",
content: "export class c { }"
};
const configFile: File = {
path: rootFolder + "a/b/project/tsconfig.json",
content: JSON.stringify({ compilerOptions: { typeRoots: [] } })
};
function verifyWithMaxCacheLimit(subScenario: string, useSlashRootAsSomeNotRootFolderInUserDirectory: boolean) {
it(subScenario, () => {
const rootFolder = useSlashRootAsSomeNotRootFolderInUserDirectory ? "/user/username/rootfolder/otherfolder/" : "/";
const file1: File = {
path: rootFolder + "a/b/project/file1.ts",
content: 'import a from "file2"'
};
const file2: File = {
path: rootFolder + "a/b/node_modules/file2.d.ts",
content: "export class a { }"
};
const file3: File = {
path: rootFolder + "a/b/project/file3.ts",
content: "export class c { }"
};
const configFile: File = {
path: rootFolder + "a/b/project/tsconfig.json",
content: JSON.stringify({ compilerOptions: { typeRoots: [] } })
};
const projectFiles = [file1, file3, libFile, configFile];
const openFiles = [file1.path];
const watchedRecursiveDirectories = useSlashRootAsSomeNotRootFolderInUserDirectory ?
// Folders of node_modules lookup not in changedRoot
["a/b/project", "a/b/project/node_modules", "a/b/node_modules", "a/node_modules", "node_modules"].map(v => rootFolder + v) :
// Folder of tsconfig
["/a/b/project", "/a/b/project/node_modules"];
const host = createServerHost(projectFiles);
const { session, verifyInitialOpen, verifyProjectsUpdatedInBackgroundEventHandler } = createSession(host);
const projectService = session.getProjectService();
verifyInitialOpen(file1);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
const project = projectService.configuredProjects.get(configFile.path)!;
verifyProject();
const openFiles = [file1.path];
const host = createServerHost([file1, file3, libFile, configFile]);
const { session, verifyInitialOpen, verifyProjectsUpdatedInBackgroundEventHandler } = createSession(host, createLoggerWithInMemoryLogs());
verifyInitialOpen(file1);
file3.content += "export class d {}";
host.writeFile(file3.path, file3.content);
host.checkTimeoutQueueLengthAndRun(2);
file3.content += "export class d {}";
host.writeFile(file3.path, file3.content);
host.checkTimeoutQueueLengthAndRun(2);
// Since this is first event
verifyProject();
verifyProjectsUpdatedInBackgroundEventHandler([{
eventName: server.ProjectsUpdatedInBackgroundEvent,
data: {
openFiles
}
}]);
// Since this is first event
verifyProjectsUpdatedInBackgroundEventHandler([{
eventName: server.ProjectsUpdatedInBackgroundEvent,
data: {
openFiles
}
}]);
projectFiles.push(file2);
host.writeFile(file2.path, file2.content);
host.runQueuedTimeoutCallbacks(); // For invalidation
host.runQueuedTimeoutCallbacks(); // For actual update
if (useSlashRootAsSomeNotRootFolderInUserDirectory) {
watchedRecursiveDirectories.length = 3;
}
else {
// file2 addition wont be detected
projectFiles.pop();
assert.isTrue(host.fileExists(file2.path));
}
verifyProject();
host.writeFile(file2.path, file2.content);
host.runQueuedTimeoutCallbacks(); // For invalidation
host.runQueuedTimeoutCallbacks(); // For actual update
verifyProjectsUpdatedInBackgroundEventHandler(useSlashRootAsSomeNotRootFolderInUserDirectory ? [{
eventName: server.ProjectsUpdatedInBackgroundEvent,
data: {
openFiles
}
}] : []);
function verifyProject() {
checkProjectActualFiles(project, map(projectFiles, file => file.path));
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, watchedRecursiveDirectories, /*recursive*/ true);
}
verifyProjectsUpdatedInBackgroundEventHandler(useSlashRootAsSomeNotRootFolderInUserDirectory ? [{
eventName: server.ProjectsUpdatedInBackgroundEvent,
data: {
openFiles
}
}] : []);
baselineTsserverLogs("projectUpdatedInBackground", `${scenario} and ${subScenario}`, session);
});
}
it("project is not at root level", () => {
verifyWithMaxCacheLimit(/*useSlashRootAsSomeNotRootFolderInUserDirectory*/ true);
});
it("project is at root level", () => {
verifyWithMaxCacheLimit(/*useSlashRootAsSomeNotRootFolderInUserDirectory*/ false);
});
verifyWithMaxCacheLimit("project is not at root level", /*useSlashRootAsSomeNotRootFolderInUserDirectory*/ true);
verifyWithMaxCacheLimit("project is at root level", /*useSlashRootAsSomeNotRootFolderInUserDirectory*/ false);
});
}
describe("when event handler is set in the session", () => {
verifyProjectsUpdatedInBackgroundEvent(createSessionWithProjectChangedEventHandler);
verifyProjectsUpdatedInBackgroundEvent("when event handler is set in the session", createSessionWithProjectChangedEventHandler);
function createSessionWithProjectChangedEventHandler(host: TestServerHost): ProjectsUpdatedInBackgroundEventVerifier {
const { session, events: projectChangedEvents } = createSessionWithEventTracking<server.ProjectsUpdatedInBackgroundEvent>(host, server.ProjectsUpdatedInBackgroundEvent);
function createSessionWithProjectChangedEventHandler(host: TestServerHost, logger: Logger | undefined): ProjectsUpdatedInBackgroundEventVerifier {
const { session, events: projectChangedEvents } = createSessionWithEventTracking<server.ProjectsUpdatedInBackgroundEvent>(
host,
server.ProjectsUpdatedInBackgroundEvent,
logger && { logger }
);
return {
session,
verifyProjectsUpdatedInBackgroundEventHandler,
@@ -535,16 +509,20 @@ namespace ts.projectSystem {
describe("when event handler is not set but session is created with canUseEvents = true", () => {
describe("without noGetErrOnBackgroundUpdate, diagnostics for open files are queued", () => {
verifyProjectsUpdatedInBackgroundEvent(createSessionThatUsesEvents);
verifyProjectsUpdatedInBackgroundEvent("without noGetErrOnBackgroundUpdate", createSessionThatUsesEvents);
});
describe("with noGetErrOnBackgroundUpdate, diagnostics for open file are not queued", () => {
verifyProjectsUpdatedInBackgroundEvent(host => createSessionThatUsesEvents(host, /*noGetErrOnBackgroundUpdate*/ true));
verifyProjectsUpdatedInBackgroundEvent("with noGetErrOnBackgroundUpdate", (host, logger) => createSessionThatUsesEvents(host, logger, /*noGetErrOnBackgroundUpdate*/ true));
});
function createSessionThatUsesEvents(host: TestServerHost, noGetErrOnBackgroundUpdate?: boolean): ProjectsUpdatedInBackgroundEventVerifier {
const { session, getEvents, clearEvents } = createSessionWithDefaultEventHandler<protocol.ProjectsUpdatedInBackgroundEvent>(host, server.ProjectsUpdatedInBackgroundEvent, { noGetErrOnBackgroundUpdate });
function createSessionThatUsesEvents(host: TestServerHost, logger: Logger | undefined, noGetErrOnBackgroundUpdate?: boolean): ProjectsUpdatedInBackgroundEventVerifier {
const { session, getEvents, clearEvents } = createSessionWithDefaultEventHandler<protocol.ProjectsUpdatedInBackgroundEvent>(
host,
server.ProjectsUpdatedInBackgroundEvent,
{ noGetErrOnBackgroundUpdate, logger: logger || createHasErrorMessageLogger() }
);
return {
session,
+17 -24
View File
@@ -10,10 +10,6 @@ namespace ts.projectSystem {
export import createServerHost = TestFSWithWatch.createServerHost;
export import checkArray = TestFSWithWatch.checkArray;
export import libFile = TestFSWithWatch.libFile;
export import checkWatchedFiles = TestFSWithWatch.checkWatchedFiles;
export import checkWatchedFilesDetailed = TestFSWithWatch.checkWatchedFilesDetailed;
export import checkWatchedDirectories = TestFSWithWatch.checkWatchedDirectories;
export import checkWatchedDirectoriesDetailed = TestFSWithWatch.checkWatchedDirectoriesDetailed;
export import commonFile1 = tscWatch.commonFile1;
export import commonFile2 = tscWatch.commonFile2;
@@ -103,11 +99,22 @@ namespace ts.projectSystem {
.replace(/\"updateGraphDurationMs\"\:\d+(?:\.\d+)?/g, `"updateGraphDurationMs":*`)
.replace(/\"createAutoImportProviderProgramDurationMs\"\:\d+(?:\.\d+)?/g, `"createAutoImportProviderProgramDurationMs":*`)
.replace(`"version":"${version}"`, `"version":"FakeVersion"`)
.replace(/getCompletionData: Get current token: \d+(?:\.\d+)?/g, `getCompletionData: Get current token: *`)
.replace(/getCompletionData: Is inside comment: \d+(?:\.\d+)?/g, `getCompletionData: Is inside comment: *`)
.replace(/getCompletionData: Get previous token: \d+(?:\.\d+)?/g, `getCompletionData: Get previous token: *`)
.replace(/getCompletionsAtPosition: isCompletionListBlocker: \d+(?:\.\d+)?/g, `getCompletionsAtPosition: isCompletionListBlocker: *`)
.replace(/getCompletionData: Semantic work: \d+(?:\.\d+)?/g, `getCompletionData: Semantic work: *`)
.replace(/getCompletionsAtPosition: getCompletionEntriesFromSymbols: \d+(?:\.\d+)?/g, `getCompletionsAtPosition: getCompletionEntriesFromSymbols: *`)
.replace(/forEachExternalModuleToImportFrom autoImportProvider: \d+(?:\.\d+)?/g, `forEachExternalModuleToImportFrom autoImportProvider: *`)
.replace(/getExportInfoMap: done in \d+(?:\.\d+)?/g, `getExportInfoMap: done in *`)
.replace(/collectAutoImports: \d+(?:\.\d+)?/g, `collectAutoImports: *`)
.replace(/dependencies in \d+(?:\.\d+)?/g, `dependencies in *`)
.replace(/\"exportMapKey\"\:\"[_$a-zA-Z][_$_$a-zA-Z0-9]*\|\d+\|/g, match => match.replace(/\|\d+\|/, `|*|`))
)
};
}
export function baselineTsserverLogs(scenario: string, subScenario: string, sessionOrService: TestSession | TestProjectService) {
export function baselineTsserverLogs(scenario: string, subScenario: string, sessionOrService: { logger: Logger; }) {
Debug.assert(sessionOrService.logger.logs.length); // Ensure caller used in memory logger
Harness.Baseline.runBaseline(`tsserver/${scenario}/${subScenario.split(" ").join("-")}.js`, sessionOrService.logger.logs.join("\r\n"));
}
@@ -138,7 +145,7 @@ namespace ts.projectSystem {
installTypingHost: server.ServerHost,
readonly typesRegistry = new Map<string, MapLike<string>>(),
log?: TI.Log) {
super(installTypingHost, globalTypingsCacheLocation, TestFSWithWatch.safeList.path, customTypesMap.path, throttleLimit, log);
super(installTypingHost, globalTypingsCacheLocation, "/safeList.json" as Path, customTypesMap.path, throttleLimit, log);
}
protected postExecActions: PostExecAction[] = [];
@@ -379,14 +386,15 @@ namespace ts.projectSystem {
return new TestSession({ ...sessionOptions, ...opts });
}
export function createSessionWithEventTracking<T extends server.ProjectServiceEvent>(host: server.ServerHost, eventName: T["eventName"], ...eventNames: T["eventName"][]) {
export function createSessionWithEventTracking<T extends server.ProjectServiceEvent>(host: server.ServerHost, eventNames: T["eventName"] | T["eventName"][], opts: Partial<TestSessionOptions> = {}) {
const events: T[] = [];
const session = createSession(host, {
eventHandler: e => {
if (e.eventName === eventName || eventNames.some(eventName => e.eventName === eventName)) {
if (isArray(eventNames) ? eventNames.some(eventName => e.eventName === eventName) : eventNames === e.eventName) {
events.push(e as T);
}
}
},
...opts
});
return { session, events };
@@ -475,13 +483,6 @@ namespace ts.projectSystem {
return iterResult.value;
}
export function checkOrphanScriptInfos(service: server.ProjectService, expectedFiles: readonly string[]) {
checkArray("Orphan ScriptInfos:", arrayFrom(mapDefinedIterator(
service.filenameToScriptInfo.values(),
v => v.containingProjects.length === 0 ? v.fileName : undefined
)), expectedFiles);
}
export function checkProjectActualFiles(project: server.Project, expectedFiles: readonly string[]) {
checkArray(`${server.ProjectKind[project.projectKind]} project: ${project.getProjectName()}:: actual files`, project.getFileNames(), expectedFiles);
}
@@ -522,14 +523,6 @@ namespace ts.projectSystem {
];
}
export function checkOpenFiles(projectService: server.ProjectService, expectedFiles: File[]) {
checkArray("Open files", arrayFrom(projectService.openFiles.keys(), path => projectService.getScriptInfoForPath(path as Path)!.fileName), expectedFiles.map(file => file.path));
}
export function checkScriptInfos(projectService: server.ProjectService, expectedFiles: readonly string[], additionInfo?: string) {
checkArray(`ScriptInfos files: ${additionInfo || ""}`, arrayFrom(projectService.filenameToScriptInfo.values(), info => info.fileName), expectedFiles);
}
export function protocolLocationFromSubstring(str: string, substring: string, options?: SpanFromSubstringOptions): protocol.Location {
const start = nthIndexOf(str, substring, options ? options.index : 0);
Debug.assert(start !== -1);
@@ -14,19 +14,9 @@ namespace ts.projectSystem {
content: `export let x: number`
};
const host = createServerHost([appFile, moduleFile, libFile]);
const projectService = createProjectService(host);
const { configFileName } = projectService.openClientFile(appFile.path);
assert(!configFileName, `should not find config, got: '${configFileName}`);
checkNumberOfConfiguredProjects(projectService, 0);
checkNumberOfInferredProjects(projectService, 1);
const project = projectService.inferredProjects[0];
checkArray("inferred project", project.getFileNames(), [appFile.path, libFile.path, moduleFile.path]);
checkWatchedFiles(host, getConfigFilesToWatch(tscWatch.projectRoot).concat(libFile.path, moduleFile.path));
checkWatchedDirectories(host, [tscWatch.projectRoot], /*recursive*/ false);
checkWatchedDirectories(host, [combinePaths(tscWatch.projectRoot, nodeModulesAtTypes)], /*recursive*/ true);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
projectService.openClientFile(appFile.path);
baselineTsserverLogs("inferredProjects", "create inferred project", projectService);
});
it("should use only one inferred project if 'useOneInferredProject' is set", () => {
@@ -59,13 +59,13 @@ namespace ts.projectSystem {
});
it("invalidates module specifiers when changes happen in contained node_modules directories", () => {
const { host, moduleSpecifierCache, triggerCompletions } = setup();
const { host, session, moduleSpecifierCache, triggerCompletions } = setup(createLoggerWithInMemoryLogs());
// Completion at an import statement will calculate and cache module specifiers
triggerCompletions({ file: cTs.path, line: 1, offset: cTs.content.length + 1 });
checkWatchedDirectories(host, ["/src", "/node_modules"], /*recursive*/ true);
host.writeFile("/node_modules/.staging/mobx-12345678/package.json", "{}");
host.runQueuedTimeoutCallbacks();
assert.equal(moduleSpecifierCache.count(), 0);
baselineTsserverLogs("moduleSpecifierCache", "invalidates module specifiers when changes happen in contained node_modules directories", session);
});
it("does not invalidate the cache when new files are added", () => {
@@ -123,9 +123,9 @@ namespace ts.projectSystem {
});
});
function setup() {
function setup(logger?: Logger) {
const host = createServerHost([aTs, bTs, cTs, bSymlink, ambientDeclaration, tsconfig, packageJson, mobxPackageJson, mobxDts]);
const session = createSession(host);
const session = createSession(host, logger && { logger });
openFilesForSession([aTs, bTs, cTs], session);
const projectService = session.getProjectService();
const project = configuredProjectAt(projectService, 0);
@@ -26,17 +26,19 @@ import { something } from "something";
content: "{}"
};
const host = createServerHost([file1, file2, file3, something, libFile, configFile]);
const session = createSession(host, { serverMode: LanguageServiceMode.PartialSemantic, useSingleInferredProject: true });
const session = createSession(host, {
serverMode: LanguageServiceMode.PartialSemantic,
useSingleInferredProject: true,
logger: createLoggerWithInMemoryLogs(),
});
return { host, session, file1, file2, file3, something, configFile };
}
it("open files are added to inferred project even if config file is present and semantic operations succeed", () => {
const { host, session, file1, file2 } = setup();
const { session, file1, file2 } = setup();
const service = session.getProjectService();
openFilesForSession([file1], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
const project = service.inferredProjects[0];
checkProjectActualFiles(project, [libFile.path, file1.path]); // no imports are resolved
verifyCompletions();
openFilesForSession([file2], session);
@@ -44,39 +46,13 @@ import { something } from "something";
checkProjectActualFiles(project, [libFile.path, file1.path, file2.path]);
verifyCompletions();
baselineTsserverLogs("partialSemanticServer", "files are added to inferred project", session);
function verifyCompletions() {
assert.isTrue(project.languageServiceEnabled);
checkWatchedFiles(host, emptyArray);
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
const response = session.executeCommandSeq<protocol.CompletionsRequest>({
session.executeCommandSeq<protocol.CompletionsRequest>({
command: protocol.CommandTypes.Completions,
arguments: protocolFileLocationFromSubstring(file1, "prop", { index: 1 })
}).response as protocol.CompletionEntry[];
assert.deepEqual(response, [
completionEntry("foo", ScriptElementKind.memberFunctionElement),
completionEntry("prop", ScriptElementKind.memberVariableElement),
]);
}
function completionEntry(name: string, kind: ScriptElementKind): protocol.CompletionEntry {
return {
name,
kind,
kindModifiers: "",
sortText: Completions.SortText.LocationPriority,
hasAction: undefined,
insertText: undefined,
isPackageJsonImport: undefined,
isImportStatementCompletion: undefined,
isRecommended: undefined,
replacementSpan: undefined,
source: undefined,
data: undefined,
sourceDisplay: undefined,
isSnippet: undefined,
labelDetails: undefined,
};
});
}
});
@@ -84,7 +60,6 @@ import { something } from "something";
const { session, file1 } = setup();
const service = session.getProjectService();
openFilesForSession([file1], session);
let hasException = false;
const request: protocol.SemanticDiagnosticsSyncRequest = {
type: "request",
seq: 1,
@@ -95,21 +70,17 @@ import { something } from "something";
session.executeCommand(request);
}
catch (e) {
assert.equal(e.message, `Request: semanticDiagnosticsSync not allowed in LanguageServiceMode.PartialSemantic`);
hasException = true;
session.logger.info(e.message);
}
assert.isTrue(hasException);
hasException = false;
const project = service.inferredProjects[0];
try {
project.getLanguageService().getSemanticDiagnostics(file1.path);
}
catch (e) {
assert.equal(e.message, `LanguageService Operation: getSemanticDiagnostics not allowed in LanguageServiceMode.PartialSemantic`);
hasException = true;
session.logger.info(e.message);
}
assert.isTrue(hasException);
baselineTsserverLogs("partialSemanticServer", "throws unsupported commands", session);
});
it("allows syntactic diagnostic commands", () => {
@@ -159,11 +130,8 @@ import { something } from "something";
content: "export const something = 10;"
};
host.ensureFileOrFolder(atTypes);
const service = session.getProjectService();
openFilesForSession([file1], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
const project = service.inferredProjects[0];
checkProjectActualFiles(project, [libFile.path, file1.path]); // Should not contain atTypes
baselineTsserverLogs("partialSemanticServer", "should not include auto type reference directives", session);
});
it("should not include referenced files from unopened files", () => {
@@ -192,30 +160,26 @@ function fooB() { }`
content: "{}"
};
const host = createServerHost([file1, file2, file3, something, libFile, configFile]);
const session = createSession(host, { serverMode: LanguageServiceMode.PartialSemantic, useSingleInferredProject: true });
const service = session.getProjectService();
const session = createSession(host, {
serverMode: LanguageServiceMode.PartialSemantic,
useSingleInferredProject: true,
logger: createLoggerWithInMemoryLogs(),
});
openFilesForSession([file1], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
const project = service.inferredProjects[0];
checkProjectActualFiles(project, [libFile.path, file1.path]); // no resolve
baselineTsserverLogs("partialSemanticServer", "should not include referenced files from unopened files", session);
});
it("should not crash when external module name resolution is reused", () => {
const { session, file1, file2, file3 } = setup();
const service = session.getProjectService();
openFilesForSession([file1], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
const project = service.inferredProjects[0];
checkProjectActualFiles(project, [libFile.path, file1.path]);
// Close the file that contains non relative external module name and open some file that doesnt have non relative external module import
closeFilesForSession([file1], session);
openFilesForSession([file3], session);
checkProjectActualFiles(project, [libFile.path, file3.path]);
// Open file with non relative external module name
openFilesForSession([file2], session);
checkProjectActualFiles(project, [libFile.path, file2.path, file3.path]);
baselineTsserverLogs("partialSemanticServer", "should not crash when external module name resolution is reused", session);
});
it("should not create autoImportProvider or handle package jsons", () => {
@@ -250,18 +214,13 @@ function fooB() { }`
});
it("should support go-to-definition on module specifiers", () => {
const { session, file1, file2 } = setup();
const { session, file1 } = setup();
openFilesForSession([file1], session);
const response = session.executeCommandSeq<protocol.DefinitionAndBoundSpanRequest>({
session.executeCommandSeq<protocol.DefinitionAndBoundSpanRequest>({
command: protocol.CommandTypes.DefinitionAndBoundSpan,
arguments: protocolFileLocationFromSubstring(file1, `"./b"`)
}).response as protocol.DefinitionInfoAndBoundSpan;
assert.isDefined(response);
assert.deepEqual(response.definitions, [{
file: file2.path,
start: { line: 1, offset: 1 },
end: { line: 1, offset: 1 },
}]);
});
baselineTsserverLogs("partialSemanticServer", "should support go-to-definition on module specifiers", session);
});
});
}
File diff suppressed because it is too large Load Diff
@@ -861,31 +861,30 @@ namespace ts.projectSystem {
content: `<html><script language="javascript">var x = 1;</></html>`
};
const host = createServerHost([file1]);
const projectService = createProjectService(host);
const projectService = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
const projectFileName = "projectFileName";
projectService.openExternalProject({ projectFileName, options: {}, rootFiles: [{ fileName: file1.path, scriptKind: ScriptKind.JS, hasMixedContent: true }] });
checkNumberOfProjects(projectService, { externalProjects: 1 });
checkWatchedFiles(host, [libFile.path]); // watching the "missing" lib file
const project = projectService.externalProjects[0];
const scriptInfo = project.getScriptInfo(file1.path)!;
const snap = scriptInfo.getSnapshot();
const actualText = getSnapshotText(snap);
assert.equal(actualText, "", `expected content to be empty string, got "${actualText}"`);
projectService.logger.info(`Text of${file1.path}: ${actualText}`);
projectService.openClientFile(file1.path, `var x = 1;`);
project.updateGraph();
const quickInfo = project.getLanguageService().getQuickInfoAtPosition(file1.path, 4)!;
assert.equal(quickInfo.kind, ScriptElementKind.variableElement);
projectService.logger.info(`QuickInfo : ${quickInfo.kind}`);
projectService.closeClientFile(file1.path);
const scriptInfo2 = project.getScriptInfo(file1.path)!;
const actualText2 = getSnapshotText(scriptInfo2.getSnapshot());
assert.equal(actualText2, "", `expected content to be empty string, got "${actualText2}"`);
projectService.logger.info(`Text of${file1.path}: ${actualText2}`);
baselineTsserverLogs("projects", "files with mixed content are handled correctly", projectService);
});
it("syntax tree cache handles changes in project settings", () => {
@@ -10,28 +10,17 @@ namespace ts.projectSystem {
const testsConfig = TestFSWithWatch.getTsBuildProjectFile("sample1", "tests/tsconfig.json");
const testsIndex = TestFSWithWatch.getTsBuildProjectFile("sample1", "tests/index.ts");
const host = createServerHost([libFile, coreConfig, coreIndex, coreAnotherModule, coreSomeDecl, logicConfig, logicIndex, testsConfig, testsIndex]);
const service = createProjectService(host);
const logger = createLoggerWithInMemoryLogs();
const service = createProjectService(host, { logger });
service.openClientFile(testsIndex.path);
checkWatchedFilesDetailed(host, [coreConfig, coreIndex, coreAnotherModule, logicConfig, logicIndex, testsConfig, libFile].map(f => f.path.toLowerCase()), 1);
checkWatchedDirectoriesDetailed(host, emptyArray, 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
TestFSWithWatch.getTsBuildProjectFilePath("sample1", "core"),
TestFSWithWatch.getTsBuildProjectFilePath("sample1", "logic"),
...getTypeRootsFromLocation(TestFSWithWatch.getTsBuildProjectFilePath("sample1", "tests"))
], 1, /*recursive*/ true);
// local edit in ts file
host.appendFile(logicIndex.path, `function foo() {}`);
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(testsConfig.path)!, [libFile.path, coreIndex.path, coreAnotherModule.path, logicIndex.path, testsIndex.path, testsConfig.path]);
// non local edit in ts file
host.appendFile(logicIndex.path, `export function gfoo() {}`);
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(testsConfig.path)!, [libFile.path, coreIndex.path, coreAnotherModule.path, logicIndex.path, testsIndex.path, testsConfig.path]);
// change in project reference config file
host.writeFile(logicConfig.path, JSON.stringify({
@@ -39,8 +28,7 @@ namespace ts.projectSystem {
references: [{ path: "../core" }]
}));
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(testsConfig.path)!, [libFile.path, coreIndex.path, coreAnotherModule.path, logicIndex.path, testsIndex.path, testsConfig.path]);
baselineTsserverLogs("projectsWithReferences", "sample project", service);
});
describe("on transitive references in different folders", () => {
@@ -90,47 +78,23 @@ X;`,
export class A {}`
};
const host = createServerHost([libFile, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs]);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(cTs.path);
return { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs };
}
it("non local edit", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, bTs } = createService();
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
// non local edit
host.appendFile(bTs.path, `export function gFoo() { }`);
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
baselineTsserverLogs("projectsWithReferences", "transitive references with non local edit", service);
});
it("edit on config file", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, cConfig, refsTs } = createService();
const nRefsTs: File = {
path: `${tscWatch.projectRoot}/nrefs/a.d.ts`,
content: refsTs.content
@@ -140,41 +104,15 @@ export class A {}`
cTsConfigJson.compilerOptions.paths = { "@ref/*": ["../nrefs/*"] };
host.writeFile(cConfig.path, JSON.stringify(cTsConfigJson));
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, nRefsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path, nRefsTs.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/nrefs`, // Failed lookup since nrefs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [refsTs.path]);
// revert the edit on config file
host.writeFile(cConfig.path, cConfig.content);
host.checkTimeoutQueueLengthAndRun(2);
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path, nRefsTs.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [nRefsTs.path]);
baselineTsserverLogs("projectsWithReferences", "transitive references with edit on config file", service);
});
it("edit in referenced config file", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, bConfig, refsTs } = createService();
const nRefsTs: File = {
path: `${tscWatch.projectRoot}/nrefs/a.d.ts`,
content: refsTs.content
@@ -184,107 +122,33 @@ export class A {}`
bTsConfigJson.compilerOptions.paths = { "@ref/*": ["../nrefs/*"] };
host.writeFile(bConfig.path, JSON.stringify(bTsConfigJson));
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, refsTs.path, nRefsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path, nRefsTs.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
`${tscWatch.projectRoot}/nrefs`, // Failed lookup since nrefs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [aTs.path]);
// revert the edit on config file
host.writeFile(bConfig.path, bConfig.content);
host.checkTimeoutQueueLengthAndRun(2);
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path, nRefsTs.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [nRefsTs.path]);
baselineTsserverLogs("projectsWithReferences", "transitive references with edit in referenced config file", service);
});
it("deleting referenced config file", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, bConfig } = createService();
host.deleteFile(bConfig.path);
host.checkTimeoutQueueLengthAndRun(3); // Schedules failed lookup invalidation
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [aTs.path]);
// revert
host.writeFile(bConfig.path, bConfig.content);
host.checkTimeoutQueueLengthAndRun(3); // Schedules failed lookup invalidation
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
baselineTsserverLogs("projectsWithReferences", "transitive references with deleting referenced config file", service);
});
it("deleting transitively referenced config file", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, aConfig } = createService();
host.deleteFile(aConfig.path);
host.checkTimeoutQueueLengthAndRun(3); // Schedules failed lookup invalidation
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
// revert
host.writeFile(aConfig.path, aConfig.content);
host.checkTimeoutQueueLengthAndRun(3); // Schedules failed lookup invalidation
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
baselineTsserverLogs("projectsWithReferences", "transitive references with deleting transitively referenced config file", service);
});
});
@@ -330,44 +194,22 @@ X;`,
export class A {}`
};
const host = createServerHost([libFile, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs]);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(cTs.path);
return { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs };
}
it("non local edit", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
const expectedWatchedDirectoriesDetailed = arrayToMap([
`${tscWatch.projectRoot}/c`, // Wild card directory
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], identity, () => 1);
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/a`, 2); // Failed to package json and wild card directory
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/b`, 2); // Failed to package json and wild card directory
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
const { host, service, bTs } = createService();
// non local edit
host.appendFile(bTs.path, `export function gFoo() { }`);
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
baselineTsserverLogs("projectsWithReferences", "trasitive references without files with non local edit", service);
});
it("edit on config file", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, cConfig, refsTs } = createService();
const nRefsTs: File = {
path: `${tscWatch.projectRoot}/nrefs/a.d.ts`,
content: refsTs.content
@@ -377,40 +219,15 @@ export class A {}`
cTsConfigJson.compilerOptions.paths = { "@ref/*": ["../nrefs/*"] };
host.writeFile(cConfig.path, JSON.stringify(cTsConfigJson));
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, nRefsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path, nRefsTs.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
const expectedWatchedDirectoriesDetailed = arrayToMap([
`${tscWatch.projectRoot}/c`, // Wild card directory
`${tscWatch.projectRoot}/nrefs`, // Failed lookup since nrefs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], identity, () => 1);
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/a`, 2); // Failed to package json and wild card directory
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/b`, 2); // Failed to package json and wild card directory
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [refsTs.path]);
// revert the edit on config file
host.writeFile(cConfig.path, cConfig.content);
host.checkTimeoutQueueLengthAndRun(2);
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path, nRefsTs.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
expectedWatchedDirectoriesDetailed.delete(`${tscWatch.projectRoot}/nrefs`);
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/refs`, 1); // Failed lookup since refs/a.ts does not exist
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [nRefsTs.path]);
baselineTsserverLogs("projectsWithReferences", "trasitive references without files with edit on config file", service);
});
it("edit in referenced config file", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, bConfig, refsTs } = createService();
const nRefsTs: File = {
path: `${tscWatch.projectRoot}/nrefs/a.d.ts`,
content: refsTs.content
@@ -420,108 +237,33 @@ export class A {}`
bTsConfigJson.compilerOptions.paths = { "@ref/*": ["../nrefs/*"] };
host.writeFile(bConfig.path, JSON.stringify(bTsConfigJson));
host.checkTimeoutQueueLengthAndRun(2);
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, refsTs.path, nRefsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path, nRefsTs.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
const expectedWatchedDirectoriesDetailed = arrayToMap([
`${tscWatch.projectRoot}/a`, // Wild card directory
`${tscWatch.projectRoot}/c`, // Wild card directory
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
`${tscWatch.projectRoot}/nrefs`, // Failed lookup since nrefs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], identity, () => 1);
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/b`, 2); // Failed to package json and wild card directory
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [aTs.path]);
// revert the edit on config file
host.writeFile(bConfig.path, bConfig.content);
host.checkTimeoutQueueLengthAndRun(2);
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path, nRefsTs.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
expectedWatchedDirectoriesDetailed.delete(`${tscWatch.projectRoot}/nrefs`);
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/a`, 2); // Failed to package json and wild card directory
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [nRefsTs.path]);
baselineTsserverLogs("projectsWithReferences", "trasitive references without files with edit in referenced config file", service);
});
it("deleting referenced config file", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, bConfig } = createService();
host.deleteFile(bConfig.path);
host.checkTimeoutQueueLengthAndRun(3); // Schedules failed lookup invalidation
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, [
`${tscWatch.projectRoot}/c`, // Wild card directory
`${tscWatch.projectRoot}/b`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], 1, /*recursive*/ true);
// Script infos arent deleted till next file open
checkOrphanScriptInfos(service, [aTs.path]);
// revert
host.writeFile(bConfig.path, bConfig.content);
host.checkTimeoutQueueLengthAndRun(3); // Schedules failed lookup invalidation
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
const expectedWatchedDirectoriesDetailed = arrayToMap([
`${tscWatch.projectRoot}/c`, // Wild card directory
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], identity, () => 1);
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/a`, 2); // Failed to package json and wild card directory
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/b`, 2); // Failed to package json and wild card directory
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
baselineTsserverLogs("projectsWithReferences", "trasitive references without files with deleting referenced config file", service);
});
it("deleting transitively referenced config file", () => {
const { host, service, aConfig, bConfig, cConfig, aTs, bTs, cTs, refsTs } = createService();
const { host, service, aConfig } = createService();
host.deleteFile(aConfig.path);
host.checkTimeoutQueueLengthAndRun(3); // Schedules failed lookup invalidation
checkNumberOfProjects(service, { configuredProjects: 1 });
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
const expectedWatchedDirectoriesDetailed = arrayToMap([
`${tscWatch.projectRoot}/c`, // Wild card directory
`${tscWatch.projectRoot}/a`, // Failed to package json
`${tscWatch.projectRoot}/refs`, // Failed lookup since refs/a.ts does not exist
...getTypeRootsFromLocation(`${tscWatch.projectRoot}/c`)
], identity, () => 1);
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/b`, 2); // Failed to package json and wild card directory
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
// revert
host.writeFile(aConfig.path, aConfig.content);
host.checkTimeoutQueueLengthAndRun(3); // Schedules failed lookup invalidation
checkProjectActualFiles(service.configuredProjects.get(cConfig.path)!, [libFile.path, cTs.path, cConfig.path, bTs.path, aTs.path, refsTs.path]);
checkWatchedFilesDetailed(host, [libFile.path, aTs.path, bTs.path, refsTs.path, aConfig.path, bConfig.path, cConfig.path], 1);
checkWatchedDirectoriesDetailed(host, [
tscWatch.projectRoot // watches for directories created for resolution of b
], 1, /*recursive*/ false);
expectedWatchedDirectoriesDetailed.set(`${tscWatch.projectRoot}/a`, 2); // Failed to package json and wild card directory
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesDetailed, /*recursive*/ true);
checkOrphanScriptInfos(service, emptyArray);
baselineTsserverLogs("projectsWithReferences", "trasitive references without files with deleting transitively referenced config file", service);
});
});
});
@@ -1,10 +1,4 @@
namespace ts.projectSystem {
function createHostModuleResolutionTrace(host: TestServerHost & ModuleResolutionHost) {
const resolutionTrace: string[] = [];
host.trace = resolutionTrace.push.bind(resolutionTrace);
return resolutionTrace;
}
describe("unittests:: tsserver:: resolutionCache:: tsserverProjectSystem extra resolution pass in server host", () => {
it("can load typings that are proper modules", () => {
const file1 = {
@@ -16,33 +10,14 @@ namespace ts.projectSystem {
content: "export let x = 1"
};
const host: TestServerHost & ModuleResolutionHost = createServerHost([file1, lib]);
const resolutionTrace = createHostModuleResolutionTrace(host);
const projectService = createProjectService(host, { typingsInstaller: new TestTypingsInstaller("/a/cache", /*throttleLimit*/5, host) });
const projectService = createProjectService(host, {
typingsInstaller: new TestTypingsInstaller("/a/cache", /*throttleLimit*/5, host),
logger: createLoggerWithInMemoryLogs()
});
projectService.setCompilerOptionsForInferredProjects({ traceResolution: true, allowJs: true });
projectService.openClientFile(file1.path);
projectService.checkNumberOfProjects({ inferredProjects: 1 });
const proj = projectService.inferredProjects[0];
assert.deepEqual(resolutionTrace, [
"======== Resolving module 'lib' from '/a/b/app.js'. ========",
"Module resolution kind is not specified, using 'NodeJs'.",
"Loading module 'lib' from 'node_modules' folder, target file type 'TypeScript'.",
"Directory '/a/b/node_modules' does not exist, skipping all lookups in it.",
"Directory '/a/node_modules' does not exist, skipping all lookups in it.",
"Directory '/node_modules' does not exist, skipping all lookups in it.",
"Loading module 'lib' from 'node_modules' folder, target file type 'JavaScript'.",
"Directory '/a/b/node_modules' does not exist, skipping all lookups in it.",
"Directory '/a/node_modules' does not exist, skipping all lookups in it.",
"Directory '/node_modules' does not exist, skipping all lookups in it.",
"======== Module name 'lib' was not resolved. ========",
`Auto discovery for typings is enabled in project '${proj.getProjectName()}'. Running extra resolution pass for module 'lib' using cache location '/a/cache'.`,
"File '/a/cache/node_modules/lib.d.ts' does not exist.",
"File '/a/cache/node_modules/@types/lib/package.json' does not exist.",
"File '/a/cache/node_modules/@types/lib.d.ts' does not exist.",
"File '/a/cache/node_modules/@types/lib/index.d.ts' exist - use it as a name resolution result.",
]);
checkProjectActualFiles(proj, [file1.path, lib.path]);
baselineTsserverLogs("resolutionCache", "can load typings that are proper modules", projectService);
});
});
@@ -378,117 +353,6 @@ namespace ts.projectSystem {
return { module1, module2 };
}
function verifyTrace(resolutionTrace: string[], expected: string[]) {
assert.deepEqual(resolutionTrace, expected);
resolutionTrace.length = 0;
}
function getExpectedFileDoesNotExistResolutionTrace(host: TestServerHost, expectedTrace: string[], foundModule: boolean, module: File, directory: string, file: string, ignoreIfParentMissing?: boolean) {
if (!foundModule) {
const path = combinePaths(directory, file);
if (!ignoreIfParentMissing || host.directoryExists(getDirectoryPath(path))) {
if (module.path === path) {
foundModule = true;
}
else {
expectedTrace.push(`File '${path}' does not exist.`);
}
}
}
return foundModule;
}
function getExpectedMissedLocationResolutionTrace(host: TestServerHost, expectedTrace: string[], dirPath: string, module: File, moduleName: string, useNodeModules: boolean, cacheLocation?: string) {
let foundModule = false;
forEachAncestorDirectory(dirPath, dirPath => {
if (dirPath === cacheLocation) {
return foundModule;
}
const directory = useNodeModules ? combinePaths(dirPath, nodeModules) : dirPath;
if (useNodeModules && !foundModule && !host.directoryExists(directory)) {
expectedTrace.push(`Directory '${directory}' does not exist, skipping all lookups in it.`);
return undefined;
}
foundModule = getExpectedFileDoesNotExistResolutionTrace(host, expectedTrace, foundModule, module, directory, `${moduleName}/package.json`, /*ignoreIfParentMissing*/ true);
foundModule = getExpectedFileDoesNotExistResolutionTrace(host, expectedTrace, foundModule, module, directory, `${moduleName}.ts`);
foundModule = getExpectedFileDoesNotExistResolutionTrace(host, expectedTrace, foundModule, module, directory, `${moduleName}.tsx`);
foundModule = getExpectedFileDoesNotExistResolutionTrace(host, expectedTrace, foundModule, module, directory, `${moduleName}.d.ts`);
foundModule = getExpectedFileDoesNotExistResolutionTrace(host, expectedTrace, foundModule, module, directory, `${moduleName}/index.ts`, /*ignoreIfParentMissing*/ true);
if (useNodeModules && !foundModule) {
expectedTrace.push(`Directory '${directory}/@types' does not exist, skipping all lookups in it.`);
}
return foundModule ? true : undefined;
});
}
function getExpectedResolutionTraceHeader(expectedTrace: string[], file: File, moduleName: string) {
expectedTrace.push(
`======== Resolving module '${moduleName}' from '${file.path}'. ========`,
`Module resolution kind is not specified, using 'NodeJs'.`
);
}
function getExpectedResolutionTraceFooter(expectedTrace: string[], module: File, moduleName: string, addRealPathTrace: boolean, ignoreModuleFileFound?: boolean) {
if (!ignoreModuleFileFound) {
expectedTrace.push(`File '${module.path}' exist - use it as a name resolution result.`);
}
if (addRealPathTrace) {
expectedTrace.push(`Resolving real path for '${module.path}', result '${module.path}'.`);
}
expectedTrace.push(`======== Module name '${moduleName}' was successfully resolved to '${module.path}'. ========`);
}
function getExpectedModuleResolutionFromCacheTrace(containingFile: File, module: File, moduleName: string, cacheLocation: string): string {
return `Reusing resolution of module '${moduleName}' from '${containingFile.path}' found in cache from location '${cacheLocation}', it was successfully resolved to '${module.path}'.`;
}
function getExpectedRelativeModuleResolutionTrace(host: TestServerHost, file: File, module: File, moduleName: string, expectedTrace: string[] = []) {
getExpectedResolutionTraceHeader(expectedTrace, file, moduleName);
expectedTrace.push(`Loading module as file / folder, candidate module location '${removeFileExtension(module.path)}', target file type 'TypeScript'.`);
getExpectedMissedLocationResolutionTrace(host, expectedTrace, getDirectoryPath(normalizePath(combinePaths(getDirectoryPath(file.path), moduleName))), module, moduleName.substring(moduleName.lastIndexOf("/") + 1), /*useNodeModules*/ false);
getExpectedResolutionTraceFooter(expectedTrace, module, moduleName, /*addRealPathTrace*/ false);
return expectedTrace;
}
function getExpectedNonRelativeModuleResolutionTrace(host: TestServerHost, file: File, module: File, moduleName: string, expectedTrace: string[] = []) {
getExpectedResolutionTraceHeader(expectedTrace, file, moduleName);
expectedTrace.push(`Loading module '${moduleName}' from 'node_modules' folder, target file type 'TypeScript'.`);
getExpectedMissedLocationResolutionTrace(host, expectedTrace, getDirectoryPath(file.path), module, moduleName, /*useNodeModules*/ true);
getExpectedResolutionTraceFooter(expectedTrace, module, moduleName, /*addRealPathTrace*/ true);
return expectedTrace;
}
function getExpectedNonRelativeModuleResolutionFromCacheTrace(host: TestServerHost, file: File, module: File, moduleName: string, cacheLocation: string, expectedTrace: string[] = []) {
getExpectedResolutionTraceHeader(expectedTrace, file, moduleName);
expectedTrace.push(`Loading module '${moduleName}' from 'node_modules' folder, target file type 'TypeScript'.`);
getExpectedMissedLocationResolutionTrace(host, expectedTrace, getDirectoryPath(file.path), module, moduleName, /*useNodeModules*/ true, cacheLocation);
expectedTrace.push(`Resolution for module '${moduleName}' was found in cache from location '${cacheLocation}'.`);
getExpectedResolutionTraceFooter(expectedTrace, module, moduleName, /*addRealPathTrace*/ false, /*ignoreModuleFileFound*/ true);
return expectedTrace;
}
function getExpectedReusingResolutionFromOldProgram(file: File, moduleFile: File, moduleName: string) {
return `Reusing resolution of module '${moduleName}' from '${file.path}' of old program, it was successfully resolved to '${moduleFile.path}'.`;
}
function verifyWatchesWithConfigFile(host: TestServerHost, files: File[], openFile: File, extraExpectedDirectories?: readonly string[]) {
const expectedRecursiveDirectories = new Set([tscWatch.projectRoot, `${tscWatch.projectRoot}/${nodeModulesAtTypes}`, ...(extraExpectedDirectories || emptyArray)]);
checkWatchedFiles(host, mapDefined(files, f => {
if (f === openFile) {
return undefined;
}
const indexOfNodeModules = f.path.indexOf("/node_modules/");
if (indexOfNodeModules === -1) {
return f.path;
}
expectedRecursiveDirectories.add(f.path.substr(0, indexOfNodeModules + "/node_modules".length));
return undefined;
}));
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, arrayFrom(expectedRecursiveDirectories.values()), /*recursive*/ true);
}
describe("from files in same folder", () => {
function getFiles(fileContent: string) {
const file1: File = {
@@ -503,64 +367,34 @@ namespace ts.projectSystem {
}
it("relative module name", () => {
const module1Name = "./module1";
const module2Name = "../module2";
const fileContent = `import { module1 } from "${module1Name}";import { module2 } from "${module2Name}";`;
const fileContent = `import { module1 } from "./module1";import { module2 } from "../module2";`;
const { file1, file2 } = getFiles(fileContent);
const { module1, module2 } = getModules(`${tscWatch.projectRoot}/src/module1.ts`, `${tscWatch.projectRoot}/module2.ts`);
const files = [module1, module2, file1, file2, configFile, libFile];
const host = createServerHost(files);
const resolutionTrace = createHostModuleResolutionTrace(host);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(file1.path);
const expectedTrace = getExpectedRelativeModuleResolutionTrace(host, file1, module1, module1Name);
getExpectedRelativeModuleResolutionTrace(host, file1, module2, module2Name, expectedTrace);
expectedTrace.push(getExpectedModuleResolutionFromCacheTrace(file2, module1, module1Name, `${tscWatch.projectRoot}/src`));
expectedTrace.push(getExpectedModuleResolutionFromCacheTrace(file2, module2, module2Name, `${tscWatch.projectRoot}/src`));
verifyTrace(resolutionTrace, expectedTrace);
verifyWatchesWithConfigFile(host, files, file1);
host.writeFile(file1.path, file1.content + fileContent);
host.writeFile(file2.path, file2.content + fileContent);
host.runQueuedTimeoutCallbacks();
verifyTrace(resolutionTrace, [
getExpectedReusingResolutionFromOldProgram(file1, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file1, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file2, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file2, module2, module2Name),
]);
verifyWatchesWithConfigFile(host, files, file1);
baselineTsserverLogs("resolutionCache", "relative module name from files in same folder", service);
});
it("non relative module name", () => {
const expectedNonRelativeDirectories = [`${tscWatch.projectRoot}/node_modules`, `${tscWatch.projectRoot}/src`];
const module1Name = "module1";
const module2Name = "module2";
const fileContent = `import { module1 } from "${module1Name}";import { module2 } from "${module2Name}";`;
const fileContent = `import { module1 } from "module1";import { module2 } from "module2";`;
const { file1, file2 } = getFiles(fileContent);
const { module1, module2 } = getModules(`${tscWatch.projectRoot}/src/node_modules/module1/index.ts`, `${tscWatch.projectRoot}/node_modules/module2/index.ts`);
const files = [module1, module2, file1, file2, configFile, libFile];
const host = createServerHost(files);
const resolutionTrace = createHostModuleResolutionTrace(host);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(file1.path);
const expectedTrace = getExpectedNonRelativeModuleResolutionTrace(host, file1, module1, module1Name);
getExpectedNonRelativeModuleResolutionTrace(host, file1, module2, module2Name, expectedTrace);
expectedTrace.push(getExpectedModuleResolutionFromCacheTrace(file2, module1, module1Name, `${tscWatch.projectRoot}/src`));
expectedTrace.push(getExpectedModuleResolutionFromCacheTrace(file2, module2, module2Name, `${tscWatch.projectRoot}/src`));
verifyTrace(resolutionTrace, expectedTrace);
verifyWatchesWithConfigFile(host, files, file1, expectedNonRelativeDirectories);
host.writeFile(file1.path, file1.content + fileContent);
host.writeFile(file2.path, file2.content + fileContent);
host.runQueuedTimeoutCallbacks();
verifyTrace(resolutionTrace, [
getExpectedReusingResolutionFromOldProgram(file1, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file1, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file2, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file2, module2, module2Name),
]);
verifyWatchesWithConfigFile(host, files, file1, expectedNonRelativeDirectories);
baselineTsserverLogs("resolutionCache", "non relative module name from files in same folder", service);
});
});
@@ -586,93 +420,40 @@ namespace ts.projectSystem {
}
it("relative module name", () => {
const module1Name = "./module1";
const module2Name = "../module2";
const module3Name = "../module1";
const module4Name = "../../module2";
const module5Name = "../../src/module1";
const module6Name = "../src/module1";
const fileContent1 = `import { module1 } from "${module1Name}";import { module2 } from "${module2Name}";`;
const fileContent2 = `import { module1 } from "${module3Name}";import { module2 } from "${module4Name}";`;
const fileContent3 = `import { module1 } from "${module5Name}";import { module2 } from "${module4Name}";`;
const fileContent4 = `import { module1 } from "${module6Name}";import { module2 } from "${module2Name}";`;
const fileContent1 = `import { module1 } from "./module1";import { module2 } from "../module2";`;
const fileContent2 = `import { module1 } from "../module1";import { module2 } from "../../module2";`;
const fileContent3 = `import { module1 } from "../../src/module1";import { module2 } from "../../module2";`;
const fileContent4 = `import { module1 } from "../src/module1}";import { module2 } from "../module2";`;
const { file1, file2, file3, file4 } = getFiles(fileContent1, fileContent2, fileContent3, fileContent4);
const { module1, module2 } = getModules(`${tscWatch.projectRoot}/product/src/module1.ts`, `${tscWatch.projectRoot}/product/module2.ts`);
const files = [module1, module2, file1, file2, file3, file4, configFile, libFile];
const host = createServerHost(files);
const resolutionTrace = createHostModuleResolutionTrace(host);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(file1.path);
const expectedTrace = getExpectedRelativeModuleResolutionTrace(host, file1, module1, module1Name);
getExpectedRelativeModuleResolutionTrace(host, file1, module2, module2Name, expectedTrace);
getExpectedRelativeModuleResolutionTrace(host, file2, module1, module3Name, expectedTrace);
getExpectedRelativeModuleResolutionTrace(host, file2, module2, module4Name, expectedTrace);
getExpectedRelativeModuleResolutionTrace(host, file4, module1, module6Name, expectedTrace);
getExpectedRelativeModuleResolutionTrace(host, file4, module2, module2Name, expectedTrace);
getExpectedRelativeModuleResolutionTrace(host, file3, module1, module5Name, expectedTrace);
getExpectedRelativeModuleResolutionTrace(host, file3, module2, module4Name, expectedTrace);
verifyTrace(resolutionTrace, expectedTrace);
verifyWatchesWithConfigFile(host, files, file1);
host.writeFile(file1.path, file1.content + fileContent1);
host.writeFile(file2.path, file2.content + fileContent2);
host.writeFile(file3.path, file3.content + fileContent3);
host.writeFile(file4.path, file4.content + fileContent4);
host.runQueuedTimeoutCallbacks();
verifyTrace(resolutionTrace, [
getExpectedReusingResolutionFromOldProgram(file1, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file1, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file2, module1, module3Name),
getExpectedReusingResolutionFromOldProgram(file2, module2, module4Name),
getExpectedReusingResolutionFromOldProgram(file4, module1, module6Name),
getExpectedReusingResolutionFromOldProgram(file4, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file3, module1, module5Name),
getExpectedReusingResolutionFromOldProgram(file3, module2, module4Name),
]);
verifyWatchesWithConfigFile(host, files, file1);
baselineTsserverLogs("resolutionCache", "relative module name from files in different folders", service);
});
it("non relative module name", () => {
const expectedNonRelativeDirectories = [`${tscWatch.projectRoot}/node_modules`, `${tscWatch.projectRoot}/product`];
const module1Name = "module1";
const module2Name = "module2";
const fileContent = `import { module1 } from "${module1Name}";import { module2 } from "${module2Name}";`;
const fileContent = `import { module1 } from "module1";import { module2 } from "module2";`;
const { file1, file2, file3, file4 } = getFiles(fileContent);
const { module1, module2 } = getModules(`${tscWatch.projectRoot}/product/node_modules/module1/index.ts`, `${tscWatch.projectRoot}/node_modules/module2/index.ts`);
const files = [module1, module2, file1, file2, file3, file4, configFile, libFile];
const host = createServerHost(files);
const resolutionTrace = createHostModuleResolutionTrace(host);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(file1.path);
const expectedTrace = getExpectedNonRelativeModuleResolutionTrace(host, file1, module1, module1Name);
getExpectedNonRelativeModuleResolutionTrace(host, file1, module2, module2Name, expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file2, module1, module1Name, getDirectoryPath(file1.path), expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file2, module2, module2Name, getDirectoryPath(file1.path), expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file4, module1, module1Name, `${tscWatch.projectRoot}/product`, expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file4, module2, module2Name, `${tscWatch.projectRoot}/product`, expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file3, module1, module1Name, getDirectoryPath(file4.path), expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file3, module2, module2Name, getDirectoryPath(file4.path), expectedTrace);
verifyTrace(resolutionTrace, expectedTrace);
verifyWatchesWithConfigFile(host, files, file1, expectedNonRelativeDirectories);
host.writeFile(file1.path, file1.content + fileContent);
host.writeFile(file2.path, file2.content + fileContent);
host.writeFile(file3.path, file3.content + fileContent);
host.writeFile(file4.path, file4.content + fileContent);
host.runQueuedTimeoutCallbacks();
verifyTrace(resolutionTrace, [
getExpectedReusingResolutionFromOldProgram(file1, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file1, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file2, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file2, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file4, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file4, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file3, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file3, module2, module2Name),
]);
verifyWatchesWithConfigFile(host, files, file1, expectedNonRelativeDirectories);
baselineTsserverLogs("resolutionCache", "non relative module name from files in different folders", service);
});
it("non relative module name from inferred project", () => {
@@ -686,135 +467,72 @@ namespace ts.projectSystem {
const { module1, module2 } = getModules(`${tscWatch.projectRoot}/product/node_modules/module1/index.ts`, `${tscWatch.projectRoot}/node_modules/module2/index.ts`);
const files = [module1, module2, file1, file2, file3, file4, libFile];
const host = createServerHost(files);
const resolutionTrace = createHostModuleResolutionTrace(host);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.setCompilerOptionsForInferredProjects({ traceResolution: true });
service.openClientFile(file1.path);
const expectedTrace = getExpectedRelativeModuleResolutionTrace(host, file1, file2, file2Name);
getExpectedRelativeModuleResolutionTrace(host, file1, file4, file4Name, expectedTrace);
getExpectedRelativeModuleResolutionTrace(host, file1, file3, file3Name, expectedTrace);
getExpectedNonRelativeModuleResolutionTrace(host, file1, module1, module1Name, expectedTrace);
getExpectedNonRelativeModuleResolutionTrace(host, file1, module2, module2Name, expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file2, module1, module1Name, getDirectoryPath(file1.path), expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file2, module2, module2Name, getDirectoryPath(file1.path), expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file4, module1, module1Name, `${tscWatch.projectRoot}/product`, expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file4, module2, module2Name, `${tscWatch.projectRoot}/product`, expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file3, module1, module1Name, getDirectoryPath(file4.path), expectedTrace);
getExpectedNonRelativeModuleResolutionFromCacheTrace(host, file3, module2, module2Name, getDirectoryPath(file4.path), expectedTrace);
verifyTrace(resolutionTrace, expectedTrace);
const currentDirectory = getDirectoryPath(file1.path);
const watchedFiles = mapDefined(files, f => f === file1 || f.path.indexOf("/node_modules/") !== -1 ? undefined : f.path)
.concat(getConfigFilesToWatch(`${tscWatch.projectRoot}/product/src`));
const watchedRecursiveDirectories = getTypeRootsFromLocation(currentDirectory).concat([
`${currentDirectory}/node_modules`, `${currentDirectory}/feature`, `${tscWatch.projectRoot}/product/${nodeModules}`,
`${tscWatch.projectRoot}/${nodeModules}`, `${tscWatch.projectRoot}/product/test/${nodeModules}`,
`${tscWatch.projectRoot}/product/test/src/${nodeModules}`
]);
checkWatches();
host.writeFile(file1.path, file1.content + importModuleContent);
host.writeFile(file2.path, file2.content + importModuleContent);
host.writeFile(file3.path, file3.content + importModuleContent);
host.writeFile(file4.path, file4.content + importModuleContent);
host.runQueuedTimeoutCallbacks();
verifyTrace(resolutionTrace, [
getExpectedReusingResolutionFromOldProgram(file1, file2, file2Name),
getExpectedReusingResolutionFromOldProgram(file1, file4, file4Name),
getExpectedReusingResolutionFromOldProgram(file1, file3, file3Name),
getExpectedReusingResolutionFromOldProgram(file1, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file1, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file2, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file2, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file4, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file4, module2, module2Name),
getExpectedReusingResolutionFromOldProgram(file3, module1, module1Name),
getExpectedReusingResolutionFromOldProgram(file3, module2, module2Name),
]);
checkWatches();
function checkWatches() {
checkWatchedFiles(host, watchedFiles);
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, watchedRecursiveDirectories, /*recursive*/ true);
}
baselineTsserverLogs("resolutionCache", "non relative module name from inferred project", service);
});
});
describe("when watching directories for failed lookup locations in amd resolution", () => {
const nodeFile: File = {
path: `${tscWatch.projectRoot}/src/typings/node.d.ts`,
content: `
function verifyModuleResolution(scenario: string, useNodeFile: boolean) {
it(scenario, () => {
const nodeFile: File = {
path: `${tscWatch.projectRoot}/src/typings/node.d.ts`,
content: `
declare module "fs" {
export interface something {
}
}`
};
const electronFile: File = {
path: `${tscWatch.projectRoot}/src/typings/electron.d.ts`,
content: `
};
const electronFile: File = {
path: `${tscWatch.projectRoot}/src/typings/electron.d.ts`,
content: `
declare module 'original-fs' {
import * as fs from 'fs';
export = fs;
}`
};
const srcFile: File = {
path: `${tscWatch.projectRoot}/src/somefolder/srcfile.ts`,
content: `
};
const srcFile: File = {
path: `${tscWatch.projectRoot}/src/somefolder/srcfile.ts`,
content: `
import { x } from "somefolder/module1";
import { x } from "somefolder/module2";
const y = x;`
};
const moduleFile: File = {
path: `${tscWatch.projectRoot}/src/somefolder/module1.ts`,
content: `
};
const moduleFile: File = {
path: `${tscWatch.projectRoot}/src/somefolder/module1.ts`,
content: `
export const x = 10;`
};
const configFile: File = {
path: `${tscWatch.projectRoot}/src/tsconfig.json`,
content: JSON.stringify({
compilerOptions: {
module: "amd",
moduleResolution: "classic",
target: "es5",
outDir: "../out",
baseUrl: "./",
typeRoots: ["typings"]
}
})
};
};
const configFile: File = {
path: `${tscWatch.projectRoot}/src/tsconfig.json`,
content: JSON.stringify({
compilerOptions: {
module: "amd",
moduleResolution: "classic",
target: "es5",
outDir: "../out",
baseUrl: "./",
typeRoots: ["typings"]
}
})
};
function verifyModuleResolution(useNodeFile: boolean) {
const files = [...(useNodeFile ? [nodeFile] : []), electronFile, srcFile, moduleFile, configFile, libFile];
const host = createServerHost(files);
const service = createProjectService(host);
service.openClientFile(srcFile.path, srcFile.content, ScriptKind.TS, tscWatch.projectRoot);
checkProjectActualFiles(service.configuredProjects.get(configFile.path)!, files.map(f => f.path));
checkWatchedFilesDetailed(host, mapDefined(files, f => f === srcFile ? undefined : f.path), 1);
if (useNodeFile) {
checkWatchedDirectories(host, emptyArray, /*recursive*/ false); // since fs resolves to ambient module, shouldnt watch failed lookup
}
else {
checkWatchedDirectoriesDetailed(host, [`${tscWatch.projectRoot}`, `${tscWatch.projectRoot}/src`], 1, /*recursive*/ false); // failed lookup for fs
}
const expectedWatchedDirectories = new Map<string, number>();
expectedWatchedDirectories.set(`${tscWatch.projectRoot}/src`, 1); // Wild card
expectedWatchedDirectories.set(`${tscWatch.projectRoot}/src/somefolder`, 1); // failedLookup for somefolder/module2
expectedWatchedDirectories.set(`${tscWatch.projectRoot}/src/node_modules`, 1); // failed lookup for somefolder/module2
expectedWatchedDirectories.set(`${tscWatch.projectRoot}/somefolder`, 1); // failed lookup for somefolder/module2
expectedWatchedDirectories.set(`${tscWatch.projectRoot}/node_modules`, 1); // failed lookup for with node_modules/@types/fs
expectedWatchedDirectories.set(`${tscWatch.projectRoot}/src/typings`, useNodeFile ? 1 : 2); // typeroot directory + failed lookup if not using node file
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectories, /*recursive*/ true);
const files = [...(useNodeFile ? [nodeFile] : []), electronFile, srcFile, moduleFile, configFile, libFile];
const host = createServerHost(files);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(srcFile.path, srcFile.content, ScriptKind.TS, tscWatch.projectRoot);
baselineTsserverLogs("resolutionCache", scenario, service);
});
}
it("when resolves to ambient module", () => {
verifyModuleResolution(/*useNodeFile*/ true);
});
it("when resolution fails", () => {
verifyModuleResolution(/*useNodeFile*/ false);
});
verifyModuleResolution("when resolves to ambient module", /*useNodeFile*/ true);
verifyModuleResolution("when resolution fails", /*useNodeFile*/ false);
});
describe("ignores files/folder changes in node_modules that start with '.'", () => {
@@ -864,10 +582,7 @@ export const x = 10;`
describe("avoid unnecessary invalidation", () => {
it("unnecessary lookup invalidation on save", () => {
const expectedNonRelativeDirectories = [`${tscWatch.projectRoot}/node_modules`, `${tscWatch.projectRoot}/src`];
const module1Name = "module1";
const module2Name = "module2";
const fileContent = `import { module1 } from "${module1Name}";import { module2 } from "${module2Name}";`;
const fileContent = `import { module1 } from "module1";import { module2 } from "module2";`;
const file1: File = {
path: `${tscWatch.projectRoot}/src/file1.ts`,
content: fileContent
@@ -875,17 +590,13 @@ export const x = 10;`
const { module1, module2 } = getModules(`${tscWatch.projectRoot}/src/node_modules/module1/index.ts`, `${tscWatch.projectRoot}/node_modules/module2/index.ts`);
const files = [module1, module2, file1, configFile, libFile];
const host = createServerHost(files);
const resolutionTrace = createHostModuleResolutionTrace(host);
const service = createProjectService(host);
const service = createProjectService(host, { logger: createLoggerWithInMemoryLogs() });
service.openClientFile(file1.path);
const expectedTrace = getExpectedNonRelativeModuleResolutionTrace(host, file1, module1, module1Name);
getExpectedNonRelativeModuleResolutionTrace(host, file1, module2, module2Name, expectedTrace);
verifyTrace(resolutionTrace, expectedTrace);
verifyWatchesWithConfigFile(host, files, file1, expectedNonRelativeDirectories);
// invoke callback to simulate saving
host.modifyFile(file1.path, file1.content, { invokeFileDeleteCreateAsPartInsteadOfChange: true });
host.checkTimeoutQueueLengthAndRun(0);
baselineTsserverLogs("resolutionCache", "avoid unnecessary lookup invalidation on save", service);
});
});
});
@@ -26,61 +26,40 @@ import { something } from "something";
content: "{}"
};
const host = createServerHost([file1, file2, file3, something, libFile, configFile]);
const session = createSession(host, { syntaxOnly: true, useSingleInferredProject: true });
const session = createSession(host, { syntaxOnly: true, useSingleInferredProject: true, logger: createLoggerWithInMemoryLogs() });
return { host, session, file1, file2, file3, something, configFile };
}
function verifySessionException<T extends server.protocol.Request>(session: TestSession, request: Partial<T>) {
let hasException = false;
try {
session.executeCommandSeq(request);
}
catch (e) {
assert.equal(e.message, `Request: ${request.command} not allowed in LanguageServiceMode.Syntactic`);
hasException = true;
session.logger.info(e.message);
}
assert.isTrue(hasException);
}
it("open files are added to inferred project even if config file is present and semantic operations fail", () => {
const { host, session, file1, file2, file3, something } = setup();
const service = session.getProjectService();
const { session, file1, file2, file3, something } = setup();
openFilesForSession([file1], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
const project = service.inferredProjects[0];
checkProjectActualFiles(project, emptyArray);
verifyCompletions();
verifyGoToDefToB();
openFilesForSession([file2], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
checkProjectActualFiles(project, emptyArray);
verifyCompletions();
verifyGoToDefToB();
verifyGoToDefToC();
openFilesForSession([file3], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
checkProjectActualFiles(project, emptyArray);
openFilesForSession([something], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
checkProjectActualFiles(project, emptyArray);
// Close open files and verify resolutions
closeFilesForSession([file3], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
checkProjectActualFiles(project, emptyArray);
closeFilesForSession([file2], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
checkProjectActualFiles(project, emptyArray);
baselineTsserverLogs("syntacticServer", "files go to inferred project and semantic operations fail", session);
function verifyCompletions() {
assert.isFalse(project.languageServiceEnabled);
checkWatchedFiles(host, emptyArray);
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
verifySessionException<protocol.CompletionsRequest>(session, {
command: protocol.CommandTypes.Completions,
arguments: protocolFileLocationFromSubstring(file1, "prop", { index: 1 })
@@ -113,16 +92,14 @@ import { something } from "something";
arguments: { file: file1.path }
});
let hasException = false;
const project = service.inferredProjects[0];
try {
project.getLanguageService().getSemanticDiagnostics(file1.path);
}
catch (e) {
assert.equal(e.message, `LanguageService Operation: getSemanticDiagnostics not allowed in LanguageServiceMode.Syntactic`);
hasException = true;
session.logger.info(e.message);
}
assert.isTrue(hasException);
baselineTsserverLogs("syntacticServer", "throws on unsupported commands", session);
});
it("should not include auto type reference directives", () => {
@@ -132,11 +109,8 @@ import { something } from "something";
content: "export const something = 10;"
};
host.ensureFileOrFolder(atTypes);
const service = session.getProjectService();
openFilesForSession([file1], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
const project = service.inferredProjects[0];
checkProjectActualFiles(project, emptyArray); // Should not contain atTypes
baselineTsserverLogs("syntacticServer", "should not include auto type reference directives", session);
});
it("should not include referenced files from unopened files", () => {
@@ -129,38 +129,17 @@ namespace ts.projectSystem {
}
})();
const projectService = createProjectService(host, { useSingleInferredProject: true, typingsInstaller: installer });
const projectService = createProjectService(host, {
useSingleInferredProject: true,
typingsInstaller: installer,
logger: createLoggerWithInMemoryLogs(),
});
projectService.setHostConfiguration({ preferences: { includePackageJsonAutoImports: "off" } });
projectService.openClientFile(file1.path);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
const p = configuredProjectAt(projectService, 0);
checkProjectActualFiles(p, [file1.path, tsconfig.path]);
const expectedWatchedFiles = new Map<string, number>();
expectedWatchedFiles.set(tsconfig.path, 1); // tsserver
expectedWatchedFiles.set(libFile.path, 1); // tsserver
expectedWatchedFiles.set(packageJson.path, 1); // typing installer
checkWatchedFilesDetailed(host, expectedWatchedFiles);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
const expectedWatchedDirectoriesRecursive = new Map<string, number>();
expectedWatchedDirectoriesRecursive.set("/a/b", 1); // wild card
expectedWatchedDirectoriesRecursive.set("/a/b/node_modules/@types", 1); // type root watch
expectedWatchedDirectoriesRecursive.set("/a/b/node_modules", 1); // TypingInstaller
expectedWatchedDirectoriesRecursive.set("/a/b/bower_components", 1); // TypingInstaller
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesRecursive, /*recursive*/ true);
installer.installAll(/*expectedCount*/ 1);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
host.checkTimeoutQueueLengthAndRun(2);
checkProjectActualFiles(p, [file1.path, jquery.path, tsconfig.path]);
// should not watch jquery
checkWatchedFilesDetailed(host, expectedWatchedFiles);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectoriesRecursive, /*recursive*/ true);
baselineTsserverLogs("typingsInstaller", "configured projects", projectService);
});
it("inferred project (typings installed)", () => {
@@ -1047,28 +1026,17 @@ namespace ts.projectSystem {
}
})();
const projectService = createProjectService(host, { useSingleInferredProject: true, typingsInstaller: installer });
const projectService = createProjectService(host, {
useSingleInferredProject: true,
typingsInstaller: installer,
logger: createLoggerWithInMemoryLogs(),
});
projectService.openClientFile(app.path);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
const p = configuredProjectAt(projectService, 0);
checkProjectActualFiles(p, [app.path, jsconfig.path]);
const watchedFilesExpected = new Map<string, number>();
watchedFilesExpected.set(jsconfig.path, 1); // project files
watchedFilesExpected.set(libFile.path, 1); // project files
watchedFilesExpected.set(combinePaths(installer.globalTypingsCacheLocation, "package.json"), 1);
checkWatchedFilesDetailed(host, watchedFilesExpected);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(host, ["/", "/node_modules", "/bower_components"], 1, /*recursive*/ true);
installer.installAll(/*expectedCount*/ 1);
checkNumberOfProjects(projectService, { configuredProjects: 1 });
host.checkTimeoutQueueLengthAndRun(2);
checkProjectActualFiles(p, [app.path, jqueryDTS.path, jsconfig.path]);
baselineTsserverLogs("typingsInstaller", "configured projects discover from bower_components", projectService);
});
it("configured projects discover from bower.json", () => {
@@ -1234,30 +1202,18 @@ namespace ts.projectSystem {
executeCommand(this, host, installedTypings, typingFiles, cb);
}
})();
const service = createProjectService(host, { typingsInstaller: installer });
const service = createProjectService(host, {
typingsInstaller: installer,
logger: createLoggerWithInMemoryLogs(),
});
service.openClientFile(file.path);
checkWatchedFiles(host, [...getConfigFilesToWatch(getDirectoryPath(file.path)), "/a/lib/lib.d.ts"]);
checkWatchedDirectories(host, [], /*recursive*/ false);
// Does not include cachePath because that is handled by typingsInstaller
checkWatchedDirectories(host, [
`${tscWatch.projects}/node_modules`,
`${tscWatch.projects}/a/node_modules`,
`${tscWatch.projects}/a/b/node_modules`,
`${tscWatch.projects}/a/node_modules/@types`,
`${tscWatch.projects}/a/b/node_modules/@types`,
`${tscWatch.projects}/a/b/bower_components`
], /*recursive*/ true);
service.checkNumberOfProjects({ inferredProjects: 1 });
checkProjectActualFiles(service.inferredProjects[0], [file.path, commanderJS.path]);
installer.installAll(/*expectedCount*/1);
for (const name of typeNames) {
assert.isTrue(host.fileExists(typePath(name)), `typings for '${name}' should be created`);
}
host.checkTimeoutQueueLengthAndRun(2);
checkProjectActualFiles(service.inferredProjects[0], [file.path, ...typeNames.map(typePath)]);
baselineTsserverLogs("typingsInstaller", "redo resolutions pointing to js on typing install", service);
});
it("should pick typing names from non-relative unresolved imports", () => {
@@ -1,139 +1,108 @@
namespace ts.projectSystem {
import Tsc_WatchDirectory = TestFSWithWatch.Tsc_WatchDirectory;
function serializeHostWatchesIntoLogger(host: TestServerHost, logger: Logger) {
const baselines: string[] = [];
host.serializeWatches(baselines);
baselines.forEach(s => logger.info(s));
}
describe("unittests:: tsserver:: watchEnvironment:: tsserverProjectSystem watchDirectories implementation", () => {
function verifyCompletionListWithNewFileInSubFolder(tscWatchDirectory: Tsc_WatchDirectory) {
const projectFolder = "/a/username/project";
const projectSrcFolder = `${projectFolder}/src`;
const configFile: File = {
path: `${projectFolder}/tsconfig.json`,
content: JSON.stringify({
watchOptions: {
synchronousWatchDirectory: true
}
})
};
const index: File = {
path: `${projectSrcFolder}/index.ts`,
content: `import {} from "./"`
};
const file1: File = {
path: `${projectSrcFolder}/file1.ts`,
content: ""
};
function verifyCompletionListWithNewFileInSubFolder(scenario: string, tscWatchDirectory: Tsc_WatchDirectory) {
it(scenario, () => {
const projectFolder = "/a/username/project";
const projectSrcFolder = `${projectFolder}/src`;
const configFile: File = {
path: `${projectFolder}/tsconfig.json`,
content: JSON.stringify({
watchOptions: {
synchronousWatchDirectory: true
}
})
};
const index: File = {
path: `${projectSrcFolder}/index.ts`,
content: `import {} from "./"`
};
const file1: File = {
path: `${projectSrcFolder}/file1.ts`,
content: ""
};
const files = [index, file1, configFile, libFile];
const fileNames = files.map(file => file.path);
// All closed files(files other than index), project folder, project/src folder and project/node_modules/@types folder
const expectedWatchedFiles = arrayToMap(fileNames.slice(1), s => s, () => 1);
const expectedWatchedDirectories = new Map<string, number>();
const mapOfDirectories = tscWatchDirectory === Tsc_WatchDirectory.NonRecursiveWatchDirectory ?
expectedWatchedDirectories :
tscWatchDirectory === Tsc_WatchDirectory.WatchFile ?
expectedWatchedFiles :
new Map();
// For failed resolution lookup and tsconfig files => cached so only watched only once
mapOfDirectories.set(projectFolder, 1);
// Through above recursive watches
mapOfDirectories.set(projectSrcFolder, 1);
// node_modules/@types folder
mapOfDirectories.set(`${projectFolder}/${nodeModulesAtTypes}`, 1);
const expectedCompletions = ["file1"];
const completionPosition = index.content.lastIndexOf('"');
const environmentVariables = new Map<string, string>();
environmentVariables.set("TSC_WATCHDIRECTORY", tscWatchDirectory);
const host = createServerHost(files, { environmentVariables });
const projectService = createProjectService(host);
projectService.openClientFile(index.path);
const files = [index, file1, configFile, libFile];
const completionPosition = index.content.lastIndexOf('"');
const environmentVariables = new Map<string, string>();
environmentVariables.set("TSC_WATCHDIRECTORY", tscWatchDirectory);
const host = createServerHost(files, { environmentVariables });
const logger = createLoggerWithInMemoryLogs();
const projectService = createProjectService(host, { logger });
projectService.openClientFile(index.path);
const project = Debug.checkDefined(projectService.configuredProjects.get(configFile.path));
verifyProjectAndCompletions();
const project = Debug.checkDefined(projectService.configuredProjects.get(configFile.path));
verifyProjectAndCompletions();
// Add file2
const file2: File = {
path: `${projectSrcFolder}/file2.ts`,
content: ""
};
fileNames.push(file2.path);
expectedWatchedFiles.set(file2.path, 1);
expectedCompletions.push("file2");
host.writeFile(file2.path, file2.content);
host.runQueuedTimeoutCallbacks();
assert.equal(projectService.configuredProjects.get(configFile.path), project);
verifyProjectAndCompletions();
// Add file2
const file2: File = {
path: `${projectSrcFolder}/file2.ts`,
content: ""
};
host.writeFile(file2.path, file2.content);
host.runQueuedTimeoutCallbacks();
assert.equal(projectService.configuredProjects.get(configFile.path), project);
verifyProjectAndCompletions();
baselineTsserverLogs("watchEnvironment", scenario, projectService);
function verifyProjectAndCompletions() {
const completions = project.getLanguageService().getCompletionsAtPosition(index.path, completionPosition, { includeExternalModuleExports: false, includeInsertTextCompletions: false })!;
checkArray("Completion Entries", completions.entries.map(e => e.name), expectedCompletions);
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
checkWatchedFilesDetailed(host, expectedWatchedFiles);
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectories, /*recursive*/ false);
checkProjectActualFiles(project, fileNames);
}
function verifyProjectAndCompletions() {
const completions = project.getLanguageService().getCompletionsAtPosition(index.path, completionPosition, { includeExternalModuleExports: false, includeInsertTextCompletions: false })!;
logger.info(`Completion Entries:: ${JSON.stringify(completions.entries.map(e => e.name))}`);
serializeHostWatchesIntoLogger(host, logger);
}
});
}
it("uses watchFile when file is added to subfolder, completion list has new file", () => {
verifyCompletionListWithNewFileInSubFolder(Tsc_WatchDirectory.WatchFile);
});
it("uses non recursive watchDirectory when file is added to subfolder, completion list has new file", () => {
verifyCompletionListWithNewFileInSubFolder(Tsc_WatchDirectory.NonRecursiveWatchDirectory);
});
it("uses dynamic polling when file is added to subfolder, completion list has new file", () => {
verifyCompletionListWithNewFileInSubFolder(Tsc_WatchDirectory.DynamicPolling);
});
verifyCompletionListWithNewFileInSubFolder(
"uses watchFile when file is added to subfolder",
Tsc_WatchDirectory.WatchFile
);
verifyCompletionListWithNewFileInSubFolder(
"uses non recursive watchDirectory when file is added to subfolder",
Tsc_WatchDirectory.NonRecursiveWatchDirectory
);
verifyCompletionListWithNewFileInSubFolder(
"uses dynamic polling when file is added to subfolder",
Tsc_WatchDirectory.DynamicPolling
);
});
describe("unittests:: tsserver:: watchEnvironment:: tsserverProjectSystem Watched recursive directories with windows style file system", () => {
function verifyWatchedDirectories(rootedPath: string, useProjectAtRoot: boolean) {
const root = useProjectAtRoot ? rootedPath : `${rootedPath}myfolder/allproject/`;
const configFile: File = {
path: root + "project/tsconfig.json",
content: "{}"
};
const file1: File = {
path: root + "project/file1.ts",
content: "let x = 10;"
};
const file2: File = {
path: root + "project/file2.ts",
content: "let y = 10;"
};
const files = [configFile, file1, file2, libFile];
const host = createServerHost(files, { windowsStyleRoot: "c:/" });
const projectService = createProjectService(host);
projectService.openClientFile(file1.path);
const project = projectService.configuredProjects.get(configFile.path)!;
assert.isDefined(project);
const winsowsStyleLibFilePath = "c:/" + libFile.path.substring(1);
checkProjectActualFiles(project, files.map(f => f === libFile ? winsowsStyleLibFilePath : f.path));
checkWatchedFiles(host, mapDefined(files, f => f === libFile ? winsowsStyleLibFilePath : f === file1 ? undefined : f.path));
checkWatchedDirectories(host, [], /*recursive*/ false);
checkWatchedDirectories(host, [
root + "project",
root + "project/node_modules/@types"
].concat(useProjectAtRoot ? [] : [root + nodeModulesAtTypes]), /*recursive*/ true);
}
function verifyRootedDirectoryWatch(rootedPath: string) {
it("When project is in rootFolder of style c:/", () => {
verifyWatchedDirectories(rootedPath, /*useProjectAtRoot*/ true);
});
it("When files at some folder other than root", () => {
verifyWatchedDirectories(rootedPath, /*useProjectAtRoot*/ false);
function verifyWatchedDirectories(scenario: string, rootedPath: string, useProjectAtRoot: boolean) {
it(scenario, () => {
const root = useProjectAtRoot ? rootedPath : `${rootedPath}myfolder/allproject/`;
const configFile: File = {
path: root + "project/tsconfig.json",
content: "{}"
};
const file1: File = {
path: root + "project/file1.ts",
content: "let x = 10;"
};
const file2: File = {
path: root + "project/file2.ts",
content: "let y = 10;"
};
const files = [configFile, file1, file2, libFile];
const host = createServerHost(files, { windowsStyleRoot: "c:/" });
const logger = createLoggerWithInMemoryLogs();
const projectService = createProjectService(host, { logger });
projectService.openClientFile(file1.path);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", scenario, projectService);
});
}
describe("for rootFolder of style c:/", () => {
verifyRootedDirectoryWatch("c:/");
});
describe("for rootFolder of style c:/users/username", () => {
verifyRootedDirectoryWatch("c:/users/username/");
});
verifyWatchedDirectories("files at windows style root", "c:/", /*useProjectAtRoot*/ true);
verifyWatchedDirectories("files not at windows style root", "c:/", /*useProjectAtRoot*/ false);
verifyWatchedDirectories("files at root", "c:/", /*useProjectAtRoot*/ true);
verifyWatchedDirectories("files not at root", "c:/", /*useProjectAtRoot*/ false);
});
it(`unittests:: tsserver:: watchEnvironment:: tsserverProjectSystem recursive watch directory implementation does not watch files/directories in node_modules starting with "."`, () => {
@@ -155,21 +124,14 @@ namespace ts.projectSystem {
path: `${projectFolder}/node_modules/someFile.d.ts`,
content: ""
};
const fileNames = [index, file1, configFile, libFile].map(file => file.path);
// All closed files(files other than index), project folder, project/src folder and project/node_modules/@types folder
const expectedWatchedFiles = arrayToMap(fileNames.slice(1), identity, () => 1);
const expectedWatchedDirectories = arrayToMap([projectFolder, projectSrcFolder, `${projectFolder}/${nodeModules}`, `${projectFolder}/${nodeModulesAtTypes}`], identity, () => 1);
const environmentVariables = new Map<string, string>();
environmentVariables.set("TSC_WATCHDIRECTORY", Tsc_WatchDirectory.NonRecursiveWatchDirectory);
const host = createServerHost([index, file1, configFile, libFile, nodeModulesExistingUnusedFile], { environmentVariables });
const projectService = createProjectService(host);
const logger = createLoggerWithInMemoryLogs();
const projectService = createProjectService(host, { logger });
projectService.openClientFile(index.path);
const project = Debug.checkDefined(projectService.configuredProjects.get(configFile.path));
verifyProject();
serializeHostWatchesIntoLogger(host, logger);
const nodeModulesIgnoredFileFromIgnoreDirectory: File = {
path: `${projectFolder}/node_modules/.cache/someFile.d.ts`,
content: ""
@@ -203,51 +165,34 @@ namespace ts.projectSystem {
].forEach(ignoredEntity => {
host.ensureFileOrFolder(ignoredEntity);
host.checkTimeoutQueueLength(0);
verifyProject();
serializeHostWatchesIntoLogger(host, logger);
});
function verifyProject() {
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
checkWatchedFilesDetailed(host, expectedWatchedFiles);
checkWatchedDirectoriesDetailed(host, expectedWatchedDirectories, /*recursive*/ false);
checkProjectActualFiles(project, fileNames);
}
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `recursive directory does not watch files starting with dot in node_modules`, projectService);
});
describe("unittests:: tsserver:: watchEnvironment:: tsserverProjectSystem watching files with network style paths", () => {
function verifyFilePathStyle(path: string) {
const windowsStyleRoot = path.substr(0, getRootLength(path));
it("unittests:: tsserver:: watchEnvironment:: tsserverProjectSystem watching files with network style paths", () => {
const logger = createLoggerWithInMemoryLogs();
verifyFilePathStyle("c:/myprojects/project/x.js", logger);
verifyFilePathStyle("//vda1cs4850/myprojects/project/x.js", logger);
verifyFilePathStyle("//vda1cs4850/c$/myprojects/project/x.js", logger);
verifyFilePathStyle("c:/users/username/myprojects/project/x.js", logger);
verifyFilePathStyle("//vda1cs4850/c$/users/username/myprojects/project/x.js", logger);
baselineTsserverLogs("watchEnvironment", `watching files with network style paths`, { logger });
function verifyFilePathStyle(path: string, logger: Logger) {
logger.info(`For files of style ${path}`);
const windowsStyleRoot = path.substring(0, getRootLength(path));
const host = createServerHost(
[libFile, { path, content: "const x = 10" }],
{ windowsStyleRoot }
);
const service = createProjectService(host);
const service = createProjectService(host, { logger });
service.openClientFile(path);
checkNumberOfProjects(service, { inferredProjects: 1 });
const libPath = `${windowsStyleRoot}${libFile.path.substring(1)}`;
checkProjectActualFiles(service.inferredProjects[0], [path, libPath]);
checkWatchedFiles(host, [libPath, `${getDirectoryPath(path)}/tsconfig.json`, `${getDirectoryPath(path)}/jsconfig.json`]);
serializeHostWatchesIntoLogger(host, logger);
}
it("for file of style c:/myprojects/project/x.js", () => {
verifyFilePathStyle("c:/myprojects/project/x.js");
});
it("for file of style //vda1cs4850/myprojects/project/x.js", () => {
verifyFilePathStyle("//vda1cs4850/myprojects/project/x.js");
});
it("for file of style //vda1cs4850/c$/myprojects/project/x.js", () => {
verifyFilePathStyle("//vda1cs4850/c$/myprojects/project/x.js");
});
it("for file of style c:/users/username/myprojects/project/x.js", () => {
verifyFilePathStyle("c:/users/username/myprojects/project/x.js");
});
it("for file of style //vda1cs4850/c$/users/username/myprojects/project/x.js", () => {
verifyFilePathStyle("//vda1cs4850/c$/users/username/myprojects/project/x.js");
});
});
describe("unittests:: tsserver:: watchEnvironment:: handles watch compiler options", () => {
@@ -258,7 +203,8 @@ namespace ts.projectSystem {
};
const files = [libFile, commonFile2, configFile];
const host = createServerHost(files.concat(commonFile1));
const session = createSession(host);
const logger = createLoggerWithInMemoryLogs();
const session = createSession(host, { logger });
session.executeCommandSeq<protocol.ConfigureRequest>({
command: protocol.CommandTypes.Configure,
arguments: {
@@ -267,45 +213,9 @@ namespace ts.projectSystem {
}
}
});
const service = session.getProjectService();
openFilesForSession([{ file: commonFile1, projectRootPath: "/a/b" }], session);
checkProjectActualFiles(
service.configuredProjects.get(configFile.path)!,
files.map(f => f.path).concat(commonFile1.path)
);
// Instead of polling watch (= watchedFiles), uses fsWatch
checkWatchedFiles(host, emptyArray);
checkWatchedDirectoriesDetailed(
host,
files.map(f => f.path.toLowerCase()),
1,
/*recursive*/ false,
arrayToMap(
files,
f => f.path.toLowerCase(),
f => [{
directoryName: f.path,
fallbackPollingInterval: f === configFile ? PollingInterval.High : PollingInterval.Medium,
fallbackOptions: { watchFile: WatchFileKind.PriorityPollingInterval }
}]
)
);
checkWatchedDirectoriesDetailed(
host,
["/a/b", "/a/b/node_modules/@types"],
1,
/*recursive*/ true,
arrayToMap(
["/a/b", "/a/b/node_modules/@types"],
identity,
directoryName => [{
directoryName,
fallbackPollingInterval: PollingInterval.Medium,
fallbackOptions: { watchFile: WatchFileKind.PriorityPollingInterval }
}]
)
);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `with watchFile option as host configuration`, session);
});
it("with watchDirectory option as host configuration", () => {
@@ -315,7 +225,8 @@ namespace ts.projectSystem {
};
const files = [libFile, commonFile2, configFile];
const host = createServerHost(files.concat(commonFile1), { runWithoutRecursiveWatches: true });
const session = createSession(host);
const logger = createLoggerWithInMemoryLogs();
const session = createSession(host, { logger });
session.executeCommandSeq<protocol.ConfigureRequest>({
command: protocol.CommandTypes.Configure,
arguments: {
@@ -324,42 +235,9 @@ namespace ts.projectSystem {
}
}
});
const service = session.getProjectService();
openFilesForSession([{ file: commonFile1, projectRootPath: "/a/b" }], session);
checkProjectActualFiles(
service.configuredProjects.get(configFile.path)!,
files.map(f => f.path).concat(commonFile1.path)
);
checkWatchedFilesDetailed(
host,
files.map(f => f.path.toLowerCase()),
1,
arrayToMap(
files,
f => f.path.toLowerCase(),
f => [{
fileName: f.path,
pollingInterval: PollingInterval.Low
}]
)
);
checkWatchedDirectoriesDetailed(
host,
["/a/b", "/a/b/node_modules/@types"],
1,
/*recursive*/ false,
arrayToMap(
["/a/b", "/a/b/node_modules/@types"],
identity,
directoryName => [{
directoryName,
fallbackPollingInterval: PollingInterval.Medium,
fallbackOptions: { watchFile: WatchFileKind.PriorityPollingInterval }
}]
)
);
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `with watchDirectory option as host configuration`, session);
});
it("with fallbackPolling option as host configuration", () => {
@@ -369,7 +247,8 @@ namespace ts.projectSystem {
};
const files = [libFile, commonFile2, configFile];
const host = createServerHost(files.concat(commonFile1), { runWithoutRecursiveWatches: true, runWithFallbackPolling: true });
const session = createSession(host);
const logger = createLoggerWithInMemoryLogs();
const session = createSession(host, { logger });
session.executeCommandSeq<protocol.ConfigureRequest>({
command: protocol.CommandTypes.Configure,
arguments: {
@@ -378,30 +257,9 @@ namespace ts.projectSystem {
}
}
});
const service = session.getProjectService();
openFilesForSession([{ file: commonFile1, projectRootPath: "/a/b" }], session);
checkProjectActualFiles(
service.configuredProjects.get(configFile.path)!,
files.map(f => f.path).concat(commonFile1.path)
);
const filePaths = files.map(f => f.path);
const allFilePaths = filePaths.concat(["/a/b", "/a/b/node_modules/@types"]);
checkWatchedFilesDetailed(
host,
allFilePaths.map(toLowerCase),
1,
arrayToMap(
allFilePaths,
toLowerCase,
fileName => [{
fileName,
pollingInterval: contains(filePaths, fileName) ? PollingInterval.Low : PollingInterval.Medium
}]
)
);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `with fallbackPolling option as host configuration`, session);
});
it("with watchFile option in configFile", () => {
@@ -415,59 +273,11 @@ namespace ts.projectSystem {
};
const files = [libFile, commonFile2, configFile];
const host = createServerHost(files.concat(commonFile1));
const session = createSession(host);
const service = session.getProjectService();
const logger = createLoggerWithInMemoryLogs();
const session = createSession(host, { logger });
openFilesForSession([{ file: commonFile1, projectRootPath: "/a/b" }], session);
checkProjectActualFiles(
service.configuredProjects.get(configFile.path)!,
files.map(f => f.path).concat(commonFile1.path)
);
// The closed script infos are watched using host settings
checkWatchedFilesDetailed(
host,
[libFile, commonFile2].map(f => f.path.toLowerCase()),
1,
arrayToMap(
[libFile, commonFile2],
f => f.path.toLowerCase(),
f => [{
fileName: f.path,
pollingInterval: PollingInterval.Low
}]
)
);
// Config file with the setting with fsWatch
checkWatchedDirectoriesDetailed(
host,
[configFile.path.toLowerCase()],
1,
/*recursive*/ false,
arrayToMap(
[configFile.path],
toLowerCase,
directoryName => [{
directoryName,
fallbackPollingInterval: PollingInterval.High,
fallbackOptions: { watchFile: WatchFileKind.PriorityPollingInterval }
}]
)
);
checkWatchedDirectoriesDetailed(
host,
["/a/b", "/a/b/node_modules/@types"],
1,
/*recursive*/ true,
arrayToMap(
["/a/b", "/a/b/node_modules/@types"],
identity,
directoryName => [{
directoryName,
fallbackPollingInterval: PollingInterval.Medium,
fallbackOptions: { watchFile: WatchFileKind.PriorityPollingInterval }
}]
)
);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `with watchFile option in configFile`, session);
});
it("with watchDirectory option in configFile", () => {
@@ -481,43 +291,11 @@ namespace ts.projectSystem {
};
const files = [libFile, commonFile2, configFile];
const host = createServerHost(files.concat(commonFile1), { runWithoutRecursiveWatches: true });
const session = createSession(host);
const service = session.getProjectService();
const logger = createLoggerWithInMemoryLogs();
const session = createSession(host, { logger });
openFilesForSession([{ file: commonFile1, projectRootPath: "/a/b" }], session);
checkProjectActualFiles(
service.configuredProjects.get(configFile.path)!,
files.map(f => f.path).concat(commonFile1.path)
);
checkWatchedFilesDetailed(
host,
files.map(f => f.path.toLowerCase()),
1,
arrayToMap(
files,
f => f.path.toLowerCase(),
f => [{
fileName: f.path,
pollingInterval: PollingInterval.Low
}]
)
);
checkWatchedDirectoriesDetailed(
host,
["/a/b", "/a/b/node_modules/@types"],
1,
/*recursive*/ false,
arrayToMap(
["/a/b", "/a/b/node_modules/@types"],
identity,
directoryName => [{
directoryName,
fallbackPollingInterval: PollingInterval.Medium,
fallbackOptions: { watchFile: WatchFileKind.PriorityPollingInterval }
}]
)
);
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `with watchDirectory option in configFile`, session);
});
it("with fallbackPolling option in configFile", () => {
@@ -531,7 +309,8 @@ namespace ts.projectSystem {
};
const files = [libFile, commonFile2, configFile];
const host = createServerHost(files.concat(commonFile1), { runWithoutRecursiveWatches: true, runWithFallbackPolling: true });
const session = createSession(host);
const logger = createLoggerWithInMemoryLogs();
const session = createSession(host, { logger });
session.executeCommandSeq<protocol.ConfigureRequest>({
command: protocol.CommandTypes.Configure,
arguments: {
@@ -540,30 +319,9 @@ namespace ts.projectSystem {
}
}
});
const service = session.getProjectService();
openFilesForSession([{ file: commonFile1, projectRootPath: "/a/b" }], session);
checkProjectActualFiles(
service.configuredProjects.get(configFile.path)!,
files.map(f => f.path).concat(commonFile1.path)
);
const filePaths = files.map(f => f.path);
const allFilePaths = filePaths.concat(["/a/b", "/a/b/node_modules/@types"]);
checkWatchedFilesDetailed(
host,
allFilePaths.map(toLowerCase),
1,
arrayToMap(
allFilePaths,
toLowerCase,
fileName => [{
fileName,
pollingInterval: contains(filePaths, fileName) ? PollingInterval.Low : PollingInterval.Medium
}]
)
);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectories(host, emptyArray, /*recursive*/ true);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `with fallbackPolling option in configFile`, session);
});
describe("excludeDirectories", () => {
@@ -598,44 +356,31 @@ namespace ts.projectSystem {
const { main, bar, foo } = setupFiles();
const files = [libFile, main, bar, foo, configFile];
const host = createServerHost(files, { currentDirectory: tscWatch.projectRoot });
const service = createProjectService(host);
const logger = createLoggerWithInMemoryLogs();
const service = createProjectService(host, { logger });
setupConfigureHost(service, configureHost);
service.openClientFile(main.path);
return { host, configFile };
return { host, service, logger };
}
it("with excludeDirectories option in configFile", () => {
const { host, configFile } = setup();
checkWatchedFilesDetailed(host, [configFile.path, libFile.path], 1);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(
host,
arrayToMap(
[`${tscWatch.projectRoot}/src`, `${tscWatch.projectRoot}/node_modules`],
identity,
f => f === `${tscWatch.projectRoot}/node_modules` ? 1 : 2,
),
/*recursive*/ true,
);
const { host, service, logger } = setup();
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `with excludeDirectories option in configFile`, service);
});
it("with excludeDirectories option in configuration", () => {
const { host, configFile } = setup(/*configureHost*/ true);
checkWatchedFilesDetailed(host, [configFile.path, libFile.path], 1);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(
host,
[`${tscWatch.projectRoot}/src`],
2,
/*recursive*/ true,
);
const { host, service, logger } = setup(/*configureHost*/ true);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `with excludeDirectories option in configuration`, service);
});
function setupExternalProject(configureHost?: boolean) {
const { main, bar, foo } = setupFiles();
const files = [libFile, main, bar, foo];
const host = createServerHost(files, { currentDirectory: tscWatch.projectRoot });
const service = createProjectService(host);
const logger = createLoggerWithInMemoryLogs();
const service = createProjectService(host, { logger });
setupConfigureHost(service, configureHost);
service.openExternalProject({
projectFileName: `${tscWatch.projectRoot}/project.csproj`,
@@ -643,31 +388,19 @@ namespace ts.projectSystem {
options: { excludeDirectories: ["node_modules"] }
} as protocol.ExternalProject);
service.openClientFile(main.path);
return host;
return { host, service, logger };
}
it("external project watch options", () => {
const host = setupExternalProject();
checkWatchedFilesDetailed(host, [libFile.path], 1);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(
host,
[`${tscWatch.projectRoot}/src`, `${tscWatch.projectRoot}/node_modules`],
1,
/*recursive*/ true,
);
const { host, service, logger } = setupExternalProject();
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `external project watch options`, service);
});
it("external project watch options in host configuration", () => {
const host = setupExternalProject(/*configureHost*/ true);
checkWatchedFilesDetailed(host, [libFile.path], 1);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(
host,
[`${tscWatch.projectRoot}/src`],
1,
/*recursive*/ true,
);
const { host, service, logger } = setupExternalProject(/*configureHost*/ true);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `external project watch options in host configuration`, service);
});
it("external project watch options errors", () => {
@@ -700,43 +433,24 @@ namespace ts.projectSystem {
const { main, bar, foo } = setupFiles();
const files = [libFile, main, bar, foo];
const host = createServerHost(files, { currentDirectory: tscWatch.projectRoot });
const service = createProjectService(host, { useInferredProjectPerProjectRoot: true });
const logger = createLoggerWithInMemoryLogs();
const service = createProjectService(host, { useInferredProjectPerProjectRoot: true, logger });
setupConfigureHost(service, configureHost);
service.setCompilerOptionsForInferredProjects({ excludeDirectories: ["node_modules"] }, tscWatch.projectRoot);
service.openClientFile(main.path, main.content, ScriptKind.TS, tscWatch.projectRoot);
return host;
return { host, service, logger };
}
it("inferred project watch options", () => {
const host = setupInferredProject();
checkWatchedFilesDetailed(
host,
[libFile.path, `${tscWatch.projectRoot}/tsconfig.json`, `${tscWatch.projectRoot}/jsconfig.json`, `${tscWatch.projectRoot}/src/tsconfig.json`, `${tscWatch.projectRoot}/src/jsconfig.json`],
1
);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(
host,
[`${tscWatch.projectRoot}/src`, `${tscWatch.projectRoot}/node_modules`],
1,
/*recursive*/ true,
);
const { host, service, logger } = setupInferredProject();
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `inferred project watch options`, service);
});
it("inferred project watch options in host configuration", () => {
const host = setupInferredProject(/*configureHost*/ true);
checkWatchedFilesDetailed(
host,
[libFile.path, `${tscWatch.projectRoot}/tsconfig.json`, `${tscWatch.projectRoot}/jsconfig.json`, `${tscWatch.projectRoot}/src/tsconfig.json`, `${tscWatch.projectRoot}/src/jsconfig.json`],
1
);
checkWatchedDirectories(host, emptyArray, /*recursive*/ false);
checkWatchedDirectoriesDetailed(
host,
[`${tscWatch.projectRoot}/src`],
1,
/*recursive*/ true,
);
const { host, service, logger } = setupInferredProject(/*configureHost*/ true);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", `inferred project watch options in host configuration`, service);
});
it("inferred project watch options errors", () => {
@@ -764,59 +478,24 @@ namespace ts.projectSystem {
});
describe("unittests:: tsserver:: watchEnvironment:: file names on case insensitive file system", () => {
function verifyFileNames(projectRoot: string, projectRootPath: string) {
const keyMapper = (str: string) => str.replace(projectRoot, projectRootPath);
const file: File = {
path: `${projectRoot}/foo.ts`,
content: `import { foo } from "bar"`
};
const host = createServerHost([file, libFile]);
const service = createProjectService(host);
service.openClientFile(file.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectRoot);
const expectedWatchFiles = [libFile.path, `${projectRoot}/tsconfig.json`, `${projectRoot}/jsconfig.json`];
checkWatchedFilesDetailed(
host,
expectedWatchFiles.map(keyMapper),
1,
arrayToMap(
expectedWatchFiles,
keyMapper,
fileName => [{
fileName,
pollingInterval: PollingInterval.Low
}]
)
);
checkWatchedDirectories(host, [], /*recursive*/ false);
const expectedWatchedDirectories = [`${projectRoot}/node_modules`, `${projectRoot}/node_modules/@types`];
checkWatchedDirectoriesDetailed(
host,
expectedWatchedDirectories.map(keyMapper),
1,
/*recursive*/ true,
arrayToMap(
expectedWatchedDirectories,
keyMapper,
directoryName => [{
directoryName,
fallbackPollingInterval: PollingInterval.Medium,
fallbackOptions: { watchFile: WatchFileKind.PriorityPollingInterval }
}]
)
);
function verifyFileNames(scenario: string, projectRoot: string) {
it(scenario, () => {
const file: File = {
path: `${projectRoot}/foo.ts`,
content: `import { foo } from "bar"`
};
const host = createServerHost([file, libFile]);
const logger = createLoggerWithInMemoryLogs();
const service = createProjectService(host, { logger });
service.openClientFile(file.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectRoot);
serializeHostWatchesIntoLogger(host, logger);
baselineTsserverLogs("watchEnvironment", scenario, service);
});
}
it("project with ascii file names", () => {
verifyFileNames("/User/userName/Projects/I", "/user/username/projects/i");
});
it("project with ascii file names with i", () => {
verifyFileNames("/User/userName/Projects/i", "/user/username/projects/i");
});
it("project with unicode file names", () => {
verifyFileNames("/User/userName/Projects/İ", "/user/username/projects/İ");
});
verifyFileNames("project with ascii file names", "/User/userName/Projects/I");
verifyFileNames("project with ascii file names with i", "/User/userName/Projects/i");
verifyFileNames("project with unicode file names", "/User/userName/Projects/İ");
});
describe("unittests:: tsserver:: watchEnvironment:: watchFile is single watcher per file", () => {
@@ -273,11 +273,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/demo/core:
{"directoryName":"/user/username/projects/demo/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/core"}
/user/username/projects/demo/animals:
{"directoryName":"/user/username/projects/demo/animals","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/animals"}
/user/username/projects/demo/zoo:
{"directoryName":"/user/username/projects/demo/zoo","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/zoo"}
exitCode:: ExitStatus.undefined
@@ -549,11 +549,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/demo/core:
{"directoryName":"/user/username/projects/demo/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/core"}
/user/username/projects/demo/animals:
{"directoryName":"/user/username/projects/demo/animals","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/animals"}
/user/username/projects/demo/zoo:
{"directoryName":"/user/username/projects/demo/zoo","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/zoo"}
exitCode:: ExitStatus.undefined
@@ -193,11 +193,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/demo/animals:
{"directoryName":"/user/username/projects/demo/animals","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/animals"}
/user/username/projects/demo/zoo:
{"directoryName":"/user/username/projects/demo/zoo","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/zoo"}
/user/username/projects/demo/core:
{"directoryName":"/user/username/projects/demo/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/core"}
exitCode:: ExitStatus.undefined
@@ -324,11 +324,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/demo/animals:
{"directoryName":"/user/username/projects/demo/animals","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/animals"}
/user/username/projects/demo/zoo:
{"directoryName":"/user/username/projects/demo/zoo","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/zoo"}
/user/username/projects/demo/core:
{"directoryName":"/user/username/projects/demo/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/demo/core"}
exitCode:: ExitStatus.undefined
@@ -168,9 +168,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/packages/pkg2:
{"directoryName":"/user/username/projects/myproject/packages/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg2"}
/user/username/projects/myproject/packages/pkg1:
{"directoryName":"/user/username/projects/myproject/packages/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg1"}
exitCode:: ExitStatus.undefined
@@ -356,9 +356,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/packages/pkg2:
{"directoryName":"/user/username/projects/myproject/packages/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg2"}
/user/username/projects/myproject/packages/pkg1:
{"directoryName":"/user/username/projects/myproject/packages/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg1"}
exitCode:: ExitStatus.undefined
@@ -458,9 +458,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/packages/pkg2:
{"directoryName":"/user/username/projects/myproject/packages/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg2"}
/user/username/projects/myproject/packages/pkg1:
{"directoryName":"/user/username/projects/myproject/packages/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg1"}
exitCode:: ExitStatus.undefined
@@ -170,9 +170,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/packages/pkg2:
{"directoryName":"/user/username/projects/myproject/packages/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg2"}
/user/username/projects/myproject/packages/pkg1:
{"directoryName":"/user/username/projects/myproject/packages/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg1"}
exitCode:: ExitStatus.undefined
@@ -367,9 +367,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/packages/pkg2:
{"directoryName":"/user/username/projects/myproject/packages/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg2"}
/user/username/projects/myproject/packages/pkg1:
{"directoryName":"/user/username/projects/myproject/packages/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg1"}
exitCode:: ExitStatus.undefined
@@ -472,9 +472,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/packages/pkg2:
{"directoryName":"/user/username/projects/myproject/packages/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg2"}
/user/username/projects/myproject/packages/pkg1:
{"directoryName":"/user/username/projects/myproject/packages/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg1"}
exitCode:: ExitStatus.undefined
@@ -589,9 +589,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/packages/pkg2:
{"directoryName":"/user/username/projects/myproject/packages/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg2"}
/user/username/projects/myproject/packages/pkg1:
{"directoryName":"/user/username/projects/myproject/packages/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg1"}
exitCode:: ExitStatus.undefined
@@ -735,9 +735,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/packages/pkg2:
{"directoryName":"/user/username/projects/myproject/packages/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg2"}
/user/username/projects/myproject/packages/pkg1:
{"directoryName":"/user/username/projects/myproject/packages/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/packages/pkg1"}
exitCode:: ExitStatus.undefined
@@ -27,16 +27,16 @@ declare const console: { log(msg: any): void; };
/a/lib/tsc.js -b -w -verbose --incremental
Output::
>> Screen clear
[12:00:25 AM] Starting compilation in watch mode...
[12:00:23 AM] Starting compilation in watch mode...
[12:00:26 AM] Projects in this build:
[12:00:24 AM] Projects in this build:
* tsconfig.json
[12:00:27 AM] Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
[12:00:25 AM] Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
[12:00:28 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:26 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:34 AM] Found 0 errors. Watching for file changes.
[12:00:32 AM] Found 0 errors. Watching for file changes.
@@ -70,7 +70,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -130,13 +130,13 @@ Input::
Output::
>> Screen clear
[12:00:38 AM] File change detected. Starting incremental compilation...
[12:00:36 AM] File change detected. Starting incremental compilation...
[12:00:39 AM] Project 'tsconfig.json' is out of date because output 'tsconfig.tsbuildinfo' is older than input 'a.js'
[12:00:37 AM] Project 'tsconfig.json' is out of date because output 'tsconfig.tsbuildinfo' is older than input 'a.js'
[12:00:40 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:38 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:41 AM] Found 0 errors. Watching for file changes.
[12:00:39 AM] Found 0 errors. Watching for file changes.
@@ -164,7 +164,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -178,13 +178,13 @@ const x = 10;
Output::
>> Screen clear
[12:00:45 AM] File change detected. Starting incremental compilation...
[12:00:43 AM] File change detected. Starting incremental compilation...
[12:00:46 AM] Project 'tsconfig.json' is out of date because output 'tsconfig.tsbuildinfo' is older than input 'a.js'
[12:00:44 AM] Project 'tsconfig.json' is out of date because output 'tsconfig.tsbuildinfo' is older than input 'a.js'
[12:00:47 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:45 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:55 AM] Found 0 errors. Watching for file changes.
[12:00:53 AM] Found 0 errors. Watching for file changes.
@@ -217,7 +217,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -27,16 +27,16 @@ declare const console: { log(msg: any): void; };
/a/lib/tsc.js -b -w -verbose
Output::
>> Screen clear
[12:00:25 AM] Starting compilation in watch mode...
[12:00:23 AM] Starting compilation in watch mode...
[12:00:26 AM] Projects in this build:
[12:00:24 AM] Projects in this build:
* tsconfig.json
[12:00:27 AM] Project 'tsconfig.json' is out of date because output 'a.js' is older than input 'b.ts'
[12:00:25 AM] Project 'tsconfig.json' is out of date because output 'a.js' is older than input 'b.ts'
[12:00:28 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:26 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:29 AM] Found 0 errors. Watching for file changes.
[12:00:27 AM] Found 0 errors. Watching for file changes.
@@ -70,7 +70,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -82,13 +82,13 @@ Input::
Output::
>> Screen clear
[12:00:33 AM] File change detected. Starting incremental compilation...
[12:00:31 AM] File change detected. Starting incremental compilation...
[12:00:34 AM] Project 'tsconfig.json' is out of date because output 'a.js' is older than input 'a.js'
[12:00:32 AM] Project 'tsconfig.json' is out of date because output 'a.js' is older than input 'a.js'
[12:00:35 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:33 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:36 AM] Found 0 errors. Watching for file changes.
[12:00:34 AM] Found 0 errors. Watching for file changes.
@@ -116,7 +116,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -130,13 +130,13 @@ const x = 10;
Output::
>> Screen clear
[12:00:40 AM] File change detected. Starting incremental compilation...
[12:00:38 AM] File change detected. Starting incremental compilation...
[12:00:41 AM] Project 'tsconfig.json' is out of date because output 'a.js' is older than input 'a.js'
[12:00:39 AM] Project 'tsconfig.json' is out of date because output 'a.js' is older than input 'a.js'
[12:00:42 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:40 AM] Building project '/user/username/projects/myproject/tsconfig.json'...
[12:00:43 AM] Found 0 errors. Watching for file changes.
[12:00:41 AM] Found 0 errors. Watching for file changes.
@@ -169,7 +169,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -87,7 +87,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -194,7 +194,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -256,7 +256,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -391,7 +391,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -520,7 +520,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -574,7 +574,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -673,7 +673,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -87,7 +87,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -141,7 +141,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -203,7 +203,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -281,7 +281,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -335,7 +335,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -391,7 +391,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -450,7 +450,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -194,9 +194,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -211,9 +211,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -552,9 +552,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -730,9 +730,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -64,7 +64,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -197,7 +197,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -248,7 +248,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -64,7 +64,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -197,7 +197,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -232,7 +232,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -69,7 +69,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -120,7 +120,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -69,7 +69,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -118,7 +118,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/solution/app:
{"directoryName":"/user/username/projects/solution/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/solution/app"}
exitCode:: ExitStatus.undefined
@@ -194,9 +194,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -532,9 +532,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -689,9 +689,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -193,9 +193,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -530,9 +530,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -686,9 +686,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -72,7 +72,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -166,7 +166,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -219,7 +219,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -304,7 +304,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -79,7 +79,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -181,7 +181,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -234,7 +234,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -324,7 +324,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -166,9 +166,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -115,7 +115,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
exitCode:: ExitStatus.undefined
@@ -265,9 +265,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -416,9 +416,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -93,9 +93,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/library:
{"directoryName":"/user/username/projects/sample1/library","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/library"}
/user/username/projects/sample1/app:
{"directoryName":"/user/username/projects/sample1/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/app"}
exitCode:: ExitStatus.undefined
@@ -242,9 +242,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/library:
{"directoryName":"/user/username/projects/sample1/library","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/library"}
/user/username/projects/sample1/app:
{"directoryName":"/user/username/projects/sample1/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/app"}
exitCode:: ExitStatus.undefined
@@ -374,9 +374,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/library:
{"directoryName":"/user/username/projects/sample1/library","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/library"}
/user/username/projects/sample1/app:
{"directoryName":"/user/username/projects/sample1/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/app"}
exitCode:: ExitStatus.undefined
@@ -71,9 +71,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -305,9 +305,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -424,9 +424,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -589,9 +589,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -692,9 +692,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -168,9 +168,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -486,9 +486,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -611,9 +611,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -671,9 +671,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -804,9 +804,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -168,9 +168,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -487,9 +487,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -626,9 +626,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -839,9 +839,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -970,9 +970,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -1185,9 +1185,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -1332,9 +1332,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -168,9 +168,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -489,9 +489,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -194,9 +194,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -520,9 +520,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -650,9 +650,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -710,9 +710,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -848,9 +848,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -194,9 +194,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -521,9 +521,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -665,9 +665,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -878,9 +878,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -1014,9 +1014,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -1229,9 +1229,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -1381,9 +1381,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -194,9 +194,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -523,9 +523,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/sample1/core:
{"directoryName":"/user/username/projects/sample1/core","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/core"}
/user/username/projects/sample1/logic:
{"directoryName":"/user/username/projects/sample1/logic","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/sample1/logic"}
exitCode:: ExitStatus.undefined
@@ -58,7 +58,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -101,7 +101,7 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -576,7 +576,7 @@ FsWatches::
FsWatchesRecursive::
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -638,7 +638,7 @@ FsWatches::
FsWatchesRecursive::
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -745,7 +745,7 @@ FsWatches::
FsWatchesRecursive::
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -126,11 +126,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -336,11 +336,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -418,11 +418,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -477,11 +477,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -599,11 +599,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -636,11 +636,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -186,15 +186,15 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
exitCode:: ExitStatus.undefined
@@ -510,15 +510,15 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
exitCode:: ExitStatus.undefined
@@ -606,15 +606,15 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
exitCode:: ExitStatus.undefined
@@ -677,15 +677,15 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
exitCode:: ExitStatus.undefined
@@ -845,15 +845,15 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
exitCode:: ExitStatus.undefined
@@ -896,15 +896,15 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
exitCode:: ExitStatus.undefined
@@ -276,21 +276,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -771,21 +771,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -888,21 +888,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -977,21 +977,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -1178,21 +1178,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -1285,21 +1285,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -1352,21 +1352,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -1441,21 +1441,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -1644,21 +1644,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -1758,21 +1758,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -1913,21 +1913,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -1980,21 +1980,21 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
/user/username/projects/myproject/pkg4:
{"directoryName":"/user/username/projects/myproject/pkg4","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg4"}
/user/username/projects/myproject/pkg5:
{"directoryName":"/user/username/projects/myproject/pkg5","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg5"}
/user/username/projects/myproject/pkg6:
{"directoryName":"/user/username/projects/myproject/pkg6","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg6"}
/user/username/projects/myproject/pkg7:
{"directoryName":"/user/username/projects/myproject/pkg7","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg7"}
exitCode:: ExitStatus.undefined
@@ -101,9 +101,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/shared:
{"directoryName":"/user/username/projects/myproject/shared","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/shared"}
/user/username/projects/myproject/webpack:
{"directoryName":"/user/username/projects/myproject/webpack","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/webpack"}
exitCode:: ExitStatus.undefined
@@ -327,9 +327,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/shared:
{"directoryName":"/user/username/projects/myproject/shared","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/shared"}
/user/username/projects/myproject/webpack:
{"directoryName":"/user/username/projects/myproject/webpack","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/webpack"}
exitCode:: ExitStatus.undefined
@@ -145,9 +145,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/reexport/src/pure:
{"directoryName":"/user/username/projects/reexport/src/pure","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/reexport/src/pure"}
/user/username/projects/reexport/src/main:
{"directoryName":"/user/username/projects/reexport/src/main","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/reexport/src/main"}
exitCode:: ExitStatus.undefined
@@ -345,9 +345,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/reexport/src/pure:
{"directoryName":"/user/username/projects/reexport/src/pure","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/reexport/src/pure"}
/user/username/projects/reexport/src/main:
{"directoryName":"/user/username/projects/reexport/src/main","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/reexport/src/main"}
exitCode:: ExitStatus.undefined
@@ -503,9 +503,9 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/reexport/src/pure:
{"directoryName":"/user/username/projects/reexport/src/pure","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/reexport/src/pure"}
/user/username/projects/reexport/src/main:
{"directoryName":"/user/username/projects/reexport/src/main","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/reexport/src/main"}
exitCode:: ExitStatus.undefined
@@ -173,13 +173,13 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
exitCode:: ExitStatus.undefined
@@ -333,13 +333,13 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
exitCode:: ExitStatus.undefined
@@ -385,11 +385,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -491,11 +491,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -173,13 +173,13 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
exitCode:: ExitStatus.undefined
@@ -333,13 +333,13 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
/user/username/projects/myproject/pkg3:
{"directoryName":"/user/username/projects/myproject/pkg3","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg3"}
exitCode:: ExitStatus.undefined
@@ -385,11 +385,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -491,11 +491,11 @@ FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/pkg0:
{"directoryName":"/user/username/projects/myproject/pkg0","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg0"}
/user/username/projects/myproject/pkg1:
{"directoryName":"/user/username/projects/myproject/pkg1","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg1"}
/user/username/projects/myproject/pkg2:
{"directoryName":"/user/username/projects/myproject/pkg2","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject/pkg2"}
exitCode:: ExitStatus.undefined
@@ -55,7 +55,7 @@ FsWatches::
FsWatchesRecursive::
/:
{"directoryName":"","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":""}
exitCode:: ExitStatus.undefined
@@ -102,7 +102,7 @@ FsWatches::
FsWatchesRecursive::
/:
{"directoryName":"","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":""}
exitCode:: ExitStatus.undefined
@@ -54,7 +54,7 @@ FsWatches::
FsWatchesRecursive::
/:
{"directoryName":"","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":""}
exitCode:: ExitStatus.undefined
@@ -101,7 +101,7 @@ FsWatches::
FsWatchesRecursive::
/:
{"directoryName":"","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":""}
exitCode:: ExitStatus.undefined
@@ -50,14 +50,14 @@ WatchedFiles::
{"fileName":"/home/username/project/app/file.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/home/username/project/node_modules/@types:
{"fileName":"/home/username/project/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/home/username/project/node_modules/@types:
{"directoryName":"/home/username/project/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/home/username/project/app:
{"directoryName":"/home/username/project/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/home/username/project/app"}
exitCode:: ExitStatus.undefined
@@ -103,14 +103,14 @@ WatchedFiles::
{"fileName":"/home/username/project/app/file.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/home/username/project/node_modules/@types:
{"fileName":"/home/username/project/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/home/username/project/node_modules/@types:
{"directoryName":"/home/username/project/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/home/username/project/app:
{"directoryName":"/home/username/project/app","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/home/username/project/app"}
exitCode:: ExitStatus.undefined
@@ -66,14 +66,14 @@ WatchedFiles::
{"fileName":"/a/b/f3.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -146,14 +146,14 @@ WatchedFiles::
{"fileName":"/a/b/f3.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -213,14 +213,14 @@ WatchedFiles::
{"fileName":"/a/b/f3.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -87,14 +87,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -187,14 +187,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -70,14 +70,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -175,14 +175,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -82,14 +82,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -173,14 +173,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -82,14 +82,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -183,16 +183,16 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
/a/b/file1consumer3.ts:
{"fileName":"/a/b/file1Consumer3.ts","pollingInterval":250}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -82,14 +82,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -178,14 +178,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -251,14 +251,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -320,14 +320,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -405,14 +405,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -478,14 +478,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -82,14 +82,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -177,14 +177,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -252,14 +252,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -67,12 +67,12 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile1.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -133,12 +133,12 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile1.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -191,12 +191,12 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile1.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -63,14 +63,14 @@ WatchedFiles::
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/modulefile2.ts:
{"fileName":"/a/b/modulefile2.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -136,14 +136,14 @@ WatchedFiles::
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/modulefile2.ts:
{"fileName":"/a/b/modulefile2.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -205,16 +205,16 @@ WatchedFiles::
{"fileName":"/a/b/referenceFile1.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
/a/b/modulefile2.ts:
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -64,14 +64,14 @@ WatchedFiles::
{"fileName":"/a/b/referenceFile1.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -136,16 +136,16 @@ WatchedFiles::
{"fileName":"/a/b/referenceFile1.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
/a/b/modulefile1.ts:
{"fileName":"/a/b/modulefile1.ts","pollingInterval":250}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -82,14 +82,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -182,14 +182,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -90,14 +90,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -191,14 +191,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -265,14 +265,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -347,14 +347,14 @@ WatchedFiles::
{"fileName":"/a/b/moduleFile2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -60,14 +60,14 @@ WatchedFiles::
{"fileName":"/a/b/file2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -129,14 +129,14 @@ WatchedFiles::
{"fileName":"/a/b/file2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/node_modules/@types:
{"fileName":"/a/b/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/node_modules/@types:
{"directoryName":"/a/b/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/b:
{"directoryName":"/a/b","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/b"}
exitCode:: ExitStatus.undefined
@@ -58,14 +58,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -119,14 +119,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -177,14 +177,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -52,14 +52,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -105,14 +105,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -158,14 +158,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -52,14 +52,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -105,14 +105,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -158,14 +158,14 @@ WatchedFiles::
{"fileName":"/a/b.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/node_modules/@types:
{"fileName":"/a/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/node_modules/@types:
{"directoryName":"/a/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a:
{"directoryName":"/a","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a"}
exitCode:: ExitStatus.undefined
@@ -69,12 +69,12 @@ WatchedFiles::
{"fileName":"/a/b/project/src/main2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/project/node_modules/@types:
{"fileName":"/a/b/project/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/project/node_modules/@types:
{"directoryName":"/a/b/project/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -79,12 +79,12 @@ WatchedFiles::
{"fileName":"/a/b/project/src/main2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/b/project/node_modules/@types:
{"fileName":"/a/b/project/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/b/project/node_modules/@types:
{"directoryName":"/a/b/project/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -58,14 +58,14 @@ WatchedFiles::
{"fileName":"/a/rootFolder/project/Scripts/TypeScript.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/rootfolder/project/node_modules/@types:
{"fileName":"/a/rootFolder/project/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/rootfolder/project/node_modules/@types:
{"directoryName":"/a/rootFolder/project/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/rootfolder/project/scripts:
{"directoryName":"/a/rootfolder/project/scripts","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/rootfolder/project/scripts"}
exitCode:: ExitStatus.undefined
@@ -119,14 +119,14 @@ WatchedFiles::
{"fileName":"/a/rootFolder/project/Scripts/TypeScript.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/a/rootfolder/project/node_modules/@types:
{"fileName":"/a/rootFolder/project/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/a/rootfolder/project/node_modules/@types:
{"directoryName":"/a/rootFolder/project/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/a/rootfolder/project/scripts:
{"directoryName":"/a/rootfolder/project/scripts","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/a/rootfolder/project/scripts"}
exitCode:: ExitStatus.undefined
@@ -76,16 +76,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -213,16 +213,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -342,16 +342,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -471,16 +471,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -76,16 +76,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -144,16 +144,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -204,16 +204,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -264,16 +264,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -76,14 +76,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -245,14 +245,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -401,14 +401,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -556,14 +556,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -76,14 +76,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -176,14 +176,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -254,14 +254,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -331,14 +331,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -117,14 +117,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -375,14 +375,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -544,14 +544,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -710,14 +710,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -117,14 +117,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -231,14 +231,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -304,14 +304,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -374,14 +374,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -105,12 +105,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib1/tools/tools.interface.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -394,12 +394,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib1/tools/tools.interface.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -604,12 +604,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib1/tools/tools.interface.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -810,12 +810,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib1/tools/tools.interface.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -105,12 +105,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib1/tools/tools.interface.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -280,12 +280,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib1/tools/tools.interface.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -356,12 +356,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib1/tools/tools.interface.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -428,12 +428,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib1/tools/tools.interface.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -116,12 +116,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib2/data2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -437,12 +437,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib2/data2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -666,12 +666,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib2/data2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -890,12 +890,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib2/data2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -116,12 +116,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib2/data2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -308,12 +308,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib2/data2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -388,12 +388,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib2/data2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -463,12 +463,12 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/lib2/data2.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
exitCode:: ExitStatus.undefined
@@ -85,14 +85,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -215,14 +215,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -271,14 +271,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -407,14 +407,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -537,14 +537,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -591,14 +591,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -704,14 +704,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -85,14 +85,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -139,14 +139,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -195,14 +195,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -273,14 +273,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -327,14 +327,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -381,14 +381,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -436,14 +436,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/noEmitOnError/src/other.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/noemitonerror/node_modules/@types:
{"fileName":"/user/username/projects/noEmitOnError/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/noemitonerror/node_modules/@types:
{"directoryName":"/user/username/projects/noEmitOnError/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/noemitonerror:
{"directoryName":"/user/username/projects/noemitonerror","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/noemitonerror"}
exitCode:: ExitStatus.undefined
@@ -76,16 +76,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -215,16 +215,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -342,16 +342,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -469,16 +469,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -76,16 +76,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -148,16 +148,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -208,16 +208,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -268,16 +268,16 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.d.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -76,14 +76,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -253,14 +253,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -399,14 +399,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -545,14 +545,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -76,14 +76,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -186,14 +186,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -265,14 +265,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -344,14 +344,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/c.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -117,14 +117,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -413,14 +413,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -653,14 +653,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined
@@ -893,14 +893,14 @@ WatchedFiles::
{"fileName":"/user/username/projects/myproject/e.ts","pollingInterval":250}
/a/lib/lib.d.ts:
{"fileName":"/a/lib/lib.d.ts","pollingInterval":250}
/user/username/projects/myproject/node_modules/@types:
{"fileName":"/user/username/projects/myproject/node_modules/@types","pollingInterval":500}
FsWatches::
FsWatchesRecursive::
/user/username/projects/myproject/node_modules/@types:
{"directoryName":"/user/username/projects/myproject/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
/user/username/projects/myproject:
{"directoryName":"/user/username/projects/myproject","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}}
{"directoryName":"/user/username/projects/myproject"}
exitCode:: ExitStatus.undefined

Some files were not shown because too many files have changed in this diff Show More