diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index a1480723b8b93..d8ee13561b397 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -933,7 +933,16 @@ function createWatchFactoryHostUsingWatchEvents(service: ProjectService, canUseW recursive ? watchedDirectoriesRecursive : watchedDirectories, path, callback, - id => ({ eventName: CreateDirectoryWatcherEvent, data: { id, path, recursive: !!recursive } }), + id => ({ + eventName: CreateDirectoryWatcherEvent, + data: { + id, + path, + recursive: !!recursive, + // Special case node_modules as we watch it for changes to closed script infos as well + ignoreUpdate: !path.endsWith("/node_modules") ? true : undefined, + }, + }), ); } function getOrCreateFileWatcher( @@ -963,37 +972,32 @@ function createWatchFactoryHostUsingWatchEvents(service: ProjectService, canUseW }, }; } - function onWatchChange({ id, path, eventType }: protocol.WatchChangeRequestArgs) { - // console.log(`typescript-vscode-watcher:: Invoke:: ${id}:: ${path}:: ${eventType}`); - onFileWatcherCallback(id, path, eventType); - onDirectoryWatcherCallback(watchedDirectories, id, path, eventType); - onDirectoryWatcherCallback(watchedDirectoriesRecursive, id, path, eventType); + function onWatchChange(args: protocol.WatchChangeRequestArgs | readonly protocol.WatchChangeRequestArgs[]) { + if (isArray(args)) args.forEach(onWatchChangeRequestArgs); + else onWatchChangeRequestArgs(args); } - function onFileWatcherCallback( - id: number, - eventPath: string, - eventType: "create" | "delete" | "update", - ) { - watchedFiles.idToCallbacks.get(id)?.forEach(callback => { - const eventKind = eventType === "create" ? - FileWatcherEventKind.Created : - eventType === "delete" ? - FileWatcherEventKind.Deleted : - FileWatcherEventKind.Changed; - callback(eventPath, eventKind); - }); + function onWatchChangeRequestArgs({ id, created, deleted, updated }: protocol.WatchChangeRequestArgs) { + onWatchEventType(id, created, FileWatcherEventKind.Created); + onWatchEventType(id, deleted, FileWatcherEventKind.Deleted); + onWatchEventType(id, updated, FileWatcherEventKind.Changed); + } + + function onWatchEventType(id: number, paths: readonly string[] | undefined, eventKind: FileWatcherEventKind) { + if (!paths?.length) return; + forEachCallback(watchedFiles, id, paths, (callback, eventPath) => callback(eventPath, eventKind)); + forEachCallback(watchedDirectories, id, paths, (callback, eventPath) => callback(eventPath)); + forEachCallback(watchedDirectoriesRecursive, id, paths, (callback, eventPath) => callback(eventPath)); } - function onDirectoryWatcherCallback( - { idToCallbacks }: HostWatcherMap, + function forEachCallback( + hostWatcherMap: HostWatcherMap, id: number, - eventPath: string, - eventType: "create" | "delete" | "update", + eventPaths: readonly string[], + cb: (callback: T, eventPath: string) => void, ) { - if (eventType === "update") return; - idToCallbacks.get(id)?.forEach(callback => { - callback(eventPath); + hostWatcherMap.idToCallbacks.get(id)?.forEach(callback => { + eventPaths.forEach(eventPath => cb(callback, eventPath)); }); } } diff --git a/src/server/protocol.ts b/src/server/protocol.ts index e61c2393f1d14..25910e021990a 100644 --- a/src/server/protocol.ts +++ b/src/server/protocol.ts @@ -1960,13 +1960,13 @@ export interface CloseRequest extends FileRequest { export interface WatchChangeRequest extends Request { command: CommandTypes.WatchChange; - arguments: WatchChangeRequestArgs; + arguments: WatchChangeRequestArgs | readonly WatchChangeRequestArgs[]; } - export interface WatchChangeRequestArgs { id: number; - path: string; - eventType: "create" | "delete" | "update"; + created?: string[]; + deleted?: string[]; + updated?: string[]; } /** @@ -3052,6 +3052,7 @@ export interface CreateDirectoryWatcherEventBody { readonly id: number; readonly path: string; readonly recursive: boolean; + readonly ignoreUpdate?: boolean; } export type CloseFileWatcherEventName = "closeFileWatcher"; diff --git a/src/testRunner/unittests/tsserver/events/watchEvents.ts b/src/testRunner/unittests/tsserver/events/watchEvents.ts index 0a6028dcda33d..88c6450a7ae52 100644 --- a/src/testRunner/unittests/tsserver/events/watchEvents.ts +++ b/src/testRunner/unittests/tsserver/events/watchEvents.ts @@ -4,6 +4,7 @@ import { } from "../../../../harness/tsserverLogger"; import { createWatchUtils, + Watches, WatchUtils, } from "../../../../harness/watchUtils"; import * as ts from "../../../_namespaces/ts"; @@ -60,11 +61,11 @@ describe("unittests:: tsserver:: events:: watchEvents", () => { } function watchDirectory(data: ts.server.protocol.CreateDirectoryWatcherEventBody) { - logger.log(`Custom watchDirectory: ${data.id}: ${data.path} ${data.recursive}`); + logger.log(`Custom watchDirectory: ${data.id}: ${data.path} ${data.recursive} ${data.ignoreUpdate}`); ts.Debug.assert(!idToClose.has(data.id)); const result = host.factoryData.watchUtils.fsWatch(data.path, data.recursive, data); idToClose.set(data.id, () => { - logger.log(`Custom watchDirectory:: Close:: ${data.id}: ${data.path} ${data.recursive}`); + logger.log(`Custom watchDirectory:: Close:: ${data.id}: ${data.path} ${data.recursive} ${data.ignoreUpdate}`); result.close(); }); } @@ -89,37 +90,132 @@ describe("unittests:: tsserver:: events:: watchEvents", () => { } } - function updateFileOnHost(session: TestSession, file: string, log: string) { + function updateFileOnHost(session: TestSession, file: string, log: string, content?: string) { // Change b.ts - session.logger.log(log); - session.host.writeFile(file, session.host.readFile("/user/username/projects/myproject/a.ts")!); + session.logger.log(`${log}: ${file}`); + if (content) session.host.appendFile(file, content); + else session.host.writeFile(file, session.host.readFile("/user/username/projects/myproject/a.ts")!); session.host.runQueuedTimeoutCallbacks(); } + function collectWatchChanges( + session: TestSession, + watches: Watches, + path: string, + eventPath: string, + eventType: "created" | "deleted" | "updated", + ignoreUpdate?: (data: T) => boolean, + ) { + session.logger.log(`Custom watch:: ${path} ${eventPath} ${eventType}`); + let result: ts.server.protocol.WatchChangeRequestArgs[] | undefined; + watches.forEach( + path, + data => { + if (ignoreUpdate?.(data)) return; + switch (eventType) { + case "created": + (result ??= []).push({ id: data.id, created: [eventPath] }); + break; + case "deleted": + (result ??= []).push({ id: data.id, deleted: [eventPath] }); + break; + case "updated": + (result ??= []).push({ id: data.id, updated: [eventPath] }); + break; + default: + ts.Debug.assertNever(eventType); + } + }, + ); + return result; + } + + function collectDirectoryWatcherChanges( + session: TestSession, + dir: string, + eventPath: string, + eventType: "created" | "deleted" | "updated", + ) { + return collectWatchChanges( + session, + (session.logger.host as TestServerHostWithCustomWatch).factoryData.watchUtils.fsWatchesRecursive, + dir, + eventPath, + eventType, + data => !!data.ignoreUpdate && eventType === "updated", + ); + } + + function collectFileWatcherChanges( + session: TestSession, + file: string, + eventType: "created" | "deleted" | "updated", + ) { + return collectWatchChanges( + session, + (session.logger.host as TestServerHostWithCustomWatch).factoryData.watchUtils.pollingWatches, + file, + file, + eventType, + ); + } + + function invokeWatchChange( + session: TestSession, + ...args: (ts.server.protocol.WatchChangeRequestArgs[] | undefined)[] + ) { + let result: Map | undefined; + args.forEach(arg => + arg?.forEach(value => { + result ??= new Map(); + const valueInResult = result.get(value.id); + if (!valueInResult) result.set(value.id, value); + else { + valueInResult.created = ts.combine(valueInResult.created, value.created); + valueInResult.deleted = ts.combine(valueInResult.deleted, value.deleted); + valueInResult.updated = ts.combine(valueInResult.updated, value.updated); + } + }) + ); + if (result) { + session.executeCommandSeq({ + command: ts.server.protocol.CommandTypes.WatchChange, + arguments: ts.singleOrMany(ts.arrayFrom(result.values())), + }); + } + } + function addFile(session: TestSession, path: string) { updateFileOnHost(session, path, "Add file"); - session.logger.log("Custom watch"); - (session.logger.host as TestServerHostWithCustomWatch).factoryData.watchUtils.fsWatchesRecursive.forEach( - "/user/username/projects/myproject", - data => - session.executeCommandSeq({ - command: ts.server.protocol.CommandTypes.WatchChange, - arguments: { id: data.id, path, eventType: "create" }, - }), + invokeWatchChange( + session, + collectDirectoryWatcherChanges(session, "/user/username/projects/myproject", path, "created"), ); session.host.runQueuedTimeoutCallbacks(); } - function changeFile(session: TestSession, path: string) { - updateFileOnHost(session, path, "Change File"); - session.logger.log("Custom watch"); - (session.logger.host as TestServerHostWithCustomWatch).factoryData.watchUtils.pollingWatches.forEach( - path, - data => - session.executeCommandSeq({ - command: ts.server.protocol.CommandTypes.WatchChange, - arguments: { id: data.id, path, eventType: "update" }, - }), + function changeFile(session: TestSession, path: string, content?: string) { + updateFileOnHost(session, path, "Change File", content); + invokeWatchChange( + session, + collectFileWatcherChanges(session, path, "updated"), + collectDirectoryWatcherChanges(session, ts.getDirectoryPath(path), path, "updated"), + ); + session.host.runQueuedTimeoutCallbacks(); + } + + function npmInstall(session: TestSession) { + session.logger.log("update with npm install"); + session.host.appendFile("/user/username/projects/myproject/node_modules/something/index.d.ts", `export const y = 20;`); + session.host.runQueuedTimeoutCallbacks(); + invokeWatchChange( + session, + collectDirectoryWatcherChanges( + session, + "/user/username/projects/myproject/node_modules", + "/user/username/projects/myproject/node_modules/something/index.d.ts", + "updated", + ), ); session.host.runQueuedTimeoutCallbacks(); } @@ -129,6 +225,8 @@ describe("unittests:: tsserver:: events:: watchEvents", () => { "/user/username/projects/myproject/tsconfig.json": "{}", "/user/username/projects/myproject/a.ts": `export class a { prop = "hello"; foo() { return this.prop; } }`, "/user/username/projects/myproject/b.ts": `export class b { prop = "hello"; foo() { return this.prop; } }`, + "/user/username/projects/myproject/m.ts": `import { x } from "something"`, + "/user/username/projects/myproject/node_modules/something/index.d.ts": `export const x = 10;`, [libFile.path]: libFile.content, }); const logger = createLoggerWithInMemoryLogs(inputHost); @@ -153,6 +251,26 @@ describe("unittests:: tsserver:: events:: watchEvents", () => { // Re watch closeFilesForSession(["/user/username/projects/myproject/b.ts"], session); + // Update c.ts + changeFile(session, "/user/username/projects/myproject/c.ts", `export const y = 20;`); + + // Update with npm install + npmInstall(session); + host.runQueuedTimeoutCallbacks(); + + // Add and change multiple files - combine and send multiple requests together + updateFileOnHost(session, "/user/username/projects/myproject/d.ts", "Add file"); + updateFileOnHost(session, "/user/username/projects/myproject/c.ts", "Change File", `export const z = 30;`); + updateFileOnHost(session, "/user/username/projects/myproject/e.ts", "Add File"); + invokeWatchChange( + session, + collectDirectoryWatcherChanges(session, "/user/username/projects/myproject", "/user/username/projects/myproject/d.ts", "created"), + collectFileWatcherChanges(session, "/user/username/projects/myproject/c.ts", "updated"), + collectDirectoryWatcherChanges(session, "/user/username/projects/myproject", "/user/username/projects/myproject/c.ts", "updated"), + collectDirectoryWatcherChanges(session, "/user/username/projects/myproject", "/user/username/projects/myproject/e.ts", "created"), + ); + session.host.runQueuedTimeoutCallbacks(); + baselineTsserverLogs("events/watchEvents", `canUseWatchEvents`, session); function handleWatchEvents(event: ts.server.ProjectServiceEvent) { switch (event.eventName) { @@ -192,9 +310,15 @@ describe("unittests:: tsserver:: events:: watchEvents", () => { logger.msg = (s, type) => logger.info(`${type}:: ${s}`); session.executeCommandSeq({ command: ts.server.protocol.CommandTypes.WatchChange, - arguments: { id: 1, path: "/user/username/projects/myproject/b.ts", eventType: "update" }, + arguments: { id: 1, updated: ["/user/username/projects/myproject/b.ts"] }, }); + // Update c.ts + changeFile(session, "/user/username/projects/myproject/c.ts", `export const y = 20;`); + + // Update with npm install + npmInstall(session); + baselineTsserverLogs("events/watchEvents", `canUseWatchEvents without canUseEvents`, session); }); }); diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index a131733463740..ae8aa63c572e0 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -1510,12 +1510,13 @@ declare namespace ts { } interface WatchChangeRequest extends Request { command: CommandTypes.WatchChange; - arguments: WatchChangeRequestArgs; + arguments: WatchChangeRequestArgs | readonly WatchChangeRequestArgs[]; } interface WatchChangeRequestArgs { id: number; - path: string; - eventType: "create" | "delete" | "update"; + created?: string[]; + deleted?: string[]; + updated?: string[]; } /** * Request to obtain the list of files that should be regenerated if target file is recompiled. @@ -2452,6 +2453,7 @@ declare namespace ts { readonly id: number; readonly path: string; readonly recursive: boolean; + readonly ignoreUpdate?: boolean; } type CloseFileWatcherEventName = "closeFileWatcher"; interface CloseFileWatcherEvent extends Event { diff --git a/tests/baselines/reference/tsserver/events/watchEvents/canUseWatchEvents-without-canUseEvents.js b/tests/baselines/reference/tsserver/events/watchEvents/canUseWatchEvents-without-canUseEvents.js index f4967a6194cc0..103fa17f1687b 100644 --- a/tests/baselines/reference/tsserver/events/watchEvents/canUseWatchEvents-without-canUseEvents.js +++ b/tests/baselines/reference/tsserver/events/watchEvents/canUseWatchEvents-without-canUseEvents.js @@ -10,6 +10,12 @@ export class a { prop = "hello"; foo() { return this.prop; } } //// [/user/username/projects/myproject/b.ts] export class b { prop = "hello"; foo() { return this.prop; } } +//// [/user/username/projects/myproject/m.ts] +import { x } from "something" + +//// [/user/username/projects/myproject/node_modules/something/index.d.ts] +export const x = 10; + //// [/a/lib/lib.d.ts] /// interface Boolean {} @@ -40,7 +46,8 @@ Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/project Info seq [hh:mm:ss:mss] Config: /user/username/projects/myproject/tsconfig.json : { "rootNames": [ "/user/username/projects/myproject/a.ts", - "/user/username/projects/myproject/b.ts" + "/user/username/projects/myproject/b.ts", + "/user/username/projects/myproject/m.ts" ], "options": { "configFilePath": "/user/username/projects/myproject/tsconfig.json" @@ -49,18 +56,25 @@ Info seq [hh:mm:ss:mss] Config: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject 1 undefined Config: /user/username/projects/myproject/tsconfig.json WatchType: Wild card directory Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject 1 undefined Config: /user/username/projects/myproject/tsconfig.json WatchType: Wild card directory Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/projects/myproject/b.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/projects/myproject/m.ts 500 undefined WatchType: Closed Script info Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined WatchType: node_modules for closed script infos and package.jsons affecting module specifier cache +Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined WatchType: node_modules for closed script infos and package.jsons affecting module specifier cache Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /a/lib/lib.d.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Failed Lookup Locations +Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Failed Lookup Locations Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules/@types 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Type roots Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules/@types 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Type roots Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/node_modules/@types 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Type roots Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/node_modules/@types 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Type roots Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 1 projectProgramVersion: 0 structureChanged: true structureIsReused:: Not Elapsed:: *ms Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (3) +Info seq [hh:mm:ss:mss] Files (5) /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" /user/username/projects/myproject/b.ts Text-1 "export class b { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-1 "export const x = 10;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" ../../../../a/lib/lib.d.ts @@ -69,10 +83,14 @@ Info seq [hh:mm:ss:mss] Files (3) Matched by default include pattern '**/*' b.ts Matched by default include pattern '**/*' + node_modules/something/index.d.ts + Imported via "something" from file 'm.ts' + m.ts + Matched by default include pattern '**/*' Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (3) +Info seq [hh:mm:ss:mss] Files (5) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -95,12 +113,16 @@ FsWatches:: {} /user/username/projects/myproject/b.ts: *new* {} +/user/username/projects/myproject/m.ts: *new* + {} /user/username/projects/myproject/tsconfig.json: *new* {} FsWatchesRecursive:: /user/username/projects/myproject: *new* {} +/user/username/projects/myproject/node_modules: *new* + {} Projects:: /user/username/projects/myproject/tsconfig.json (Configured) *new* @@ -120,8 +142,16 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts *new* + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts *new* + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json -Add file +Add file: /user/username/projects/myproject/c.ts Info seq [hh:mm:ss:mss] DirectoryWatcher:: Triggered with /user/username/projects/myproject/c.ts :: WatchInfo: /user/username/projects/myproject 1 undefined Config: /user/username/projects/myproject/tsconfig.json WatchType: Wild card directory Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles* @@ -148,10 +178,12 @@ Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/project Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 2 projectProgramVersion: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" /user/username/projects/myproject/b.ts Text-1 "export class b { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-1 "export const x = 10;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" /user/username/projects/myproject/c.ts Text-1 "export class a { prop = \"hello\"; foo() { return this.prop; } }" @@ -161,6 +193,10 @@ Info seq [hh:mm:ss:mss] Files (4) Matched by default include pattern '**/*' b.ts Matched by default include pattern '**/*' + node_modules/something/index.d.ts + Imported via "something" from file 'm.ts' + m.ts + Matched by default include pattern '**/*' c.ts Matched by default include pattern '**/*' @@ -168,7 +204,7 @@ Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Running: *ensureProjectForOpenFiles* Info seq [hh:mm:ss:mss] Before ensureProjectForOpenFiles: Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -176,7 +212,7 @@ Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts Proje Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] After ensureProjectForOpenFiles: Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -197,12 +233,16 @@ FsWatches:: {} /user/username/projects/myproject/c.ts: *new* {} +/user/username/projects/myproject/m.ts: + {} /user/username/projects/myproject/tsconfig.json: {} FsWatchesRecursive:: /user/username/projects/myproject: {} +/user/username/projects/myproject/node_modules: + {} Projects:: /user/username/projects/myproject/tsconfig.json (Configured) *changed* @@ -227,13 +267,21 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json -Custom watch +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/c.ts created Before running Timeout callback:: count: 0 After running Timeout callback:: count: 0 -Change File +Change File: /user/username/projects/myproject/b.ts Info seq [hh:mm:ss:mss] FileWatcher:: Triggered with /user/username/projects/myproject/b.ts 1:: WatchInfo: /user/username/projects/myproject/b.ts 500 undefined WatchType: Closed Script info Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles* @@ -273,22 +321,32 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Running: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 3 projectProgramVersion: 2 structureChanged: false structureIsReused:: Completely Elapsed:: *ms Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" /user/username/projects/myproject/b.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-1 "export const x = 10;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" /user/username/projects/myproject/c.ts Text-1 "export class a { prop = \"hello\"; foo() { return this.prop; } }" Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Running: *ensureProjectForOpenFiles* Info seq [hh:mm:ss:mss] Before ensureProjectForOpenFiles: Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -296,7 +354,7 @@ Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts Proje Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] After ensureProjectForOpenFiles: Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -328,8 +386,17 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json -Custom watch +Custom watch:: /user/username/projects/myproject/b.ts /user/username/projects/myproject/b.ts updated +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/b.ts updated Before running Timeout callback:: count: 0 After running Timeout callback:: count: 0 @@ -349,7 +416,7 @@ Info seq [hh:mm:ss:mss] FileWatcher:: Close:: WatchInfo: /user/username/project Info seq [hh:mm:ss:mss] Search path: /user/username/projects/myproject Info seq [hh:mm:ss:mss] For info: /user/username/projects/myproject/b.ts :: Config file name: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -374,6 +441,8 @@ FsWatches:: {} /user/username/projects/myproject/c.ts: {} +/user/username/projects/myproject/m.ts: + {} /user/username/projects/myproject/tsconfig.json: {} @@ -384,6 +453,8 @@ FsWatches *deleted*:: FsWatchesRecursive:: /user/username/projects/myproject: {} +/user/username/projects/myproject/node_modules: + {} ScriptInfos:: /a/lib/lib.d.ts @@ -403,6 +474,14 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json Before request @@ -417,7 +496,7 @@ Info seq [hh:mm:ss:mss] request: } Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/projects/myproject/b.ts 500 undefined WatchType: Closed Script info Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -442,12 +521,16 @@ FsWatches:: {} /user/username/projects/myproject/c.ts: {} +/user/username/projects/myproject/m.ts: + {} /user/username/projects/myproject/tsconfig.json: {} FsWatchesRecursive:: /user/username/projects/myproject: {} +/user/username/projects/myproject/node_modules: + {} ScriptInfos:: /a/lib/lib.d.ts @@ -467,6 +550,14 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json Before request @@ -475,8 +566,9 @@ Info seq [hh:mm:ss:mss] request: "command": "watchChange", "arguments": { "id": 1, - "path": "/user/username/projects/myproject/b.ts", - "eventType": "update" + "updated": [ + "/user/username/projects/myproject/b.ts" + ] }, "seq": 4, "type": "request" @@ -486,8 +578,9 @@ Info seq [hh:mm:ss:mss] Err:: Unrecognized JSON command: "command": "watchChange", "arguments": { "id": 1, - "path": "/user/username/projects/myproject/b.ts", - "eventType": "update" + "updated": [ + "/user/username/projects/myproject/b.ts" + ] }, "seq": 4, "type": "request" @@ -509,3 +602,136 @@ Info seq [hh:mm:ss:mss] response: "responseRequired": false } After request + +Change File: /user/username/projects/myproject/c.ts +Info seq [hh:mm:ss:mss] FileWatcher:: Triggered with /user/username/projects/myproject/c.ts 1:: WatchInfo: /user/username/projects/myproject/c.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles* +Info seq [hh:mm:ss:mss] Elapsed:: *ms FileWatcher:: Triggered with /user/username/projects/myproject/c.ts 1:: WatchInfo: /user/username/projects/myproject/c.ts 500 undefined WatchType: Closed Script info +Before running Timeout callback:: count: 2 +5: /user/username/projects/myproject/tsconfig.json +6: *ensureProjectForOpenFiles* +//// [/user/username/projects/myproject/c.ts] +export class a { prop = "hello"; foo() { return this.prop; } }export const y = 20; + + +Timeout callback:: count: 2 +5: /user/username/projects/myproject/tsconfig.json *new* +6: *ensureProjectForOpenFiles* *new* + +Projects:: +/user/username/projects/myproject/tsconfig.json (Configured) *changed* + projectStateVersion: 4 *changed* + projectProgramVersion: 2 + dirty: true *changed* + +ScriptInfos:: +/a/lib/lib.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/a.ts (Open) + version: SVC-1-0 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json *default* +/user/username/projects/myproject/b.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/c.ts *changed* + version: Text-1 + pendingReloadFromDisk: true *changed* + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json + +Info seq [hh:mm:ss:mss] Running: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 4 projectProgramVersion: 2 structureChanged: false structureIsReused:: Completely Elapsed:: *ms +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" + /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/b.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-1 "export const x = 10;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" + /user/username/projects/myproject/c.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }export const y = 20;" + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Running: *ensureProjectForOpenFiles* +Info seq [hh:mm:ss:mss] Before ensureProjectForOpenFiles: +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Open files: +Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts ProjectRootPath: undefined +Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] After ensureProjectForOpenFiles: +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Open files: +Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts ProjectRootPath: undefined +Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json +After running Timeout callback:: count: 0 + +Projects:: +/user/username/projects/myproject/tsconfig.json (Configured) *changed* + projectStateVersion: 4 + projectProgramVersion: 2 + dirty: false *changed* + +ScriptInfos:: +/a/lib/lib.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/a.ts (Open) + version: SVC-1-0 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json *default* +/user/username/projects/myproject/b.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/c.ts *changed* + version: Text-2 *changed* + pendingReloadFromDisk: false *changed* + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json + +Custom watch:: /user/username/projects/myproject/c.ts /user/username/projects/myproject/c.ts updated +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/c.ts updated +Before running Timeout callback:: count: 0 + +After running Timeout callback:: count: 0 + +update with npm install +Before running Timeout callback:: count: 0 +//// [/user/username/projects/myproject/node_modules/something/index.d.ts] +export const x = 10;export const y = 20; + + +After running Timeout callback:: count: 0 + +Custom watch:: /user/username/projects/myproject/node_modules /user/username/projects/myproject/node_modules/something/index.d.ts updated +Before running Timeout callback:: count: 0 + +After running Timeout callback:: count: 0 diff --git a/tests/baselines/reference/tsserver/events/watchEvents/canUseWatchEvents.js b/tests/baselines/reference/tsserver/events/watchEvents/canUseWatchEvents.js index b7bc70a6bb148..a70a15d02f3e5 100644 --- a/tests/baselines/reference/tsserver/events/watchEvents/canUseWatchEvents.js +++ b/tests/baselines/reference/tsserver/events/watchEvents/canUseWatchEvents.js @@ -10,6 +10,12 @@ export class a { prop = "hello"; foo() { return this.prop; } } //// [/user/username/projects/myproject/b.ts] export class b { prop = "hello"; foo() { return this.prop; } } +//// [/user/username/projects/myproject/m.ts] +import { x } from "something" + +//// [/user/username/projects/myproject/node_modules/something/index.d.ts] +export const x = 10; + //// [/a/lib/lib.d.ts] /// interface Boolean {} @@ -61,7 +67,8 @@ Info seq [hh:mm:ss:mss] event: Info seq [hh:mm:ss:mss] Config: /user/username/projects/myproject/tsconfig.json : { "rootNames": [ "/user/username/projects/myproject/a.ts", - "/user/username/projects/myproject/b.ts" + "/user/username/projects/myproject/b.ts", + "/user/username/projects/myproject/m.ts" ], "options": { "configFilePath": "/user/username/projects/myproject/tsconfig.json" @@ -76,10 +83,11 @@ Info seq [hh:mm:ss:mss] event: "body": { "id": 2, "path": "/user/username/projects/myproject", - "recursive": true + "recursive": true, + "ignoreUpdate": true } } -Custom watchDirectory: 2: /user/username/projects/myproject true +Custom watchDirectory: 2: /user/username/projects/myproject true true Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject 1 undefined Config: /user/username/projects/myproject/tsconfig.json WatchType: Wild card directory Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/projects/myproject/b.ts 500 undefined WatchType: Closed Script info Info seq [hh:mm:ss:mss] event: @@ -93,7 +101,33 @@ Info seq [hh:mm:ss:mss] event: } } Custom watchFile: 3: /user/username/projects/myproject/b.ts +Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/projects/myproject/m.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] event: + { + "seq": 0, + "type": "event", + "event": "CustomHandler::createFileWatcher", + "body": { + "id": 4, + "path": "/user/username/projects/myproject/m.ts" + } + } +Custom watchFile: 4: /user/username/projects/myproject/m.ts Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined WatchType: node_modules for closed script infos and package.jsons affecting module specifier cache +Info seq [hh:mm:ss:mss] event: + { + "seq": 0, + "type": "event", + "event": "CustomHandler::createDirectoryWatcher", + "body": { + "id": 5, + "path": "/user/username/projects/myproject/node_modules", + "recursive": true + } + } +Custom watchDirectory: 5: /user/username/projects/myproject/node_modules true undefined +Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined WatchType: node_modules for closed script infos and package.jsons affecting module specifier cache Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /a/lib/lib.d.ts 500 undefined WatchType: Closed Script info Info seq [hh:mm:ss:mss] event: { @@ -101,11 +135,13 @@ Info seq [hh:mm:ss:mss] event: "type": "event", "event": "CustomHandler::createFileWatcher", "body": { - "id": 4, + "id": 6, "path": "/a/lib/lib.d.ts" } } -Custom watchFile: 4: /a/lib/lib.d.ts +Custom watchFile: 6: /a/lib/lib.d.ts +Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Failed Lookup Locations +Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Failed Lookup Locations Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules/@types 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Type roots Info seq [hh:mm:ss:mss] event: { @@ -113,12 +149,13 @@ Info seq [hh:mm:ss:mss] event: "type": "event", "event": "CustomHandler::createDirectoryWatcher", "body": { - "id": 5, + "id": 7, "path": "/user/username/projects/myproject/node_modules/@types", - "recursive": true + "recursive": true, + "ignoreUpdate": true } } -Custom watchDirectory: 5: /user/username/projects/myproject/node_modules/@types true +Custom watchDirectory: 7: /user/username/projects/myproject/node_modules/@types true true Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/myproject/node_modules/@types 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Type roots Info seq [hh:mm:ss:mss] DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/node_modules/@types 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Type roots Info seq [hh:mm:ss:mss] event: @@ -127,19 +164,22 @@ Info seq [hh:mm:ss:mss] event: "type": "event", "event": "CustomHandler::createDirectoryWatcher", "body": { - "id": 6, + "id": 8, "path": "/user/username/projects/node_modules/@types", - "recursive": true + "recursive": true, + "ignoreUpdate": true } } -Custom watchDirectory: 6: /user/username/projects/node_modules/@types true +Custom watchDirectory: 8: /user/username/projects/node_modules/@types true true Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Added:: WatchInfo: /user/username/projects/node_modules/@types 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Type roots Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 1 projectProgramVersion: 0 structureChanged: true structureIsReused:: Not Elapsed:: *ms Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (3) +Info seq [hh:mm:ss:mss] Files (5) /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" /user/username/projects/myproject/b.ts Text-1 "export class b { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-1 "export const x = 10;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" ../../../../a/lib/lib.d.ts @@ -148,6 +188,10 @@ Info seq [hh:mm:ss:mss] Files (3) Matched by default include pattern '**/*' b.ts Matched by default include pattern '**/*' + node_modules/something/index.d.ts + Imported via "something" from file 'm.ts' + m.ts + Matched by default include pattern '**/*' Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] event: @@ -171,12 +215,12 @@ Info seq [hh:mm:ss:mss] event: "jsSize": 0, "jsx": 0, "jsxSize": 0, - "ts": 2, - "tsSize": 124, + "ts": 3, + "tsSize": 153, "tsx": 0, "tsxSize": 0, - "dts": 1, - "dtsSize": 334, + "dts": 2, + "dtsSize": 354, "deferred": 0, "deferredSize": 0 }, @@ -209,7 +253,7 @@ Info seq [hh:mm:ss:mss] event: } } Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (3) +Info seq [hh:mm:ss:mss] Files (5) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -223,19 +267,23 @@ After request Custom WatchedFiles:: /a/lib/lib.d.ts: *new* - {"id":4,"path":"/a/lib/lib.d.ts"} + {"id":6,"path":"/a/lib/lib.d.ts"} /user/username/projects/myproject/b.ts: *new* {"id":3,"path":"/user/username/projects/myproject/b.ts"} +/user/username/projects/myproject/m.ts: *new* + {"id":4,"path":"/user/username/projects/myproject/m.ts"} /user/username/projects/myproject/tsconfig.json: *new* {"id":1,"path":"/user/username/projects/myproject/tsconfig.json"} Custom WatchedDirectoriesRecursive:: /user/username/projects/myproject: *new* - {"id":2,"path":"/user/username/projects/myproject","recursive":true} + {"id":2,"path":"/user/username/projects/myproject","recursive":true,"ignoreUpdate":true} +/user/username/projects/myproject/node_modules: *new* + {"id":5,"path":"/user/username/projects/myproject/node_modules","recursive":true} /user/username/projects/myproject/node_modules/@types: *new* - {"id":5,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true} + {"id":7,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true,"ignoreUpdate":true} /user/username/projects/node_modules/@types: *new* - {"id":6,"path":"/user/username/projects/node_modules/@types","recursive":true} + {"id":8,"path":"/user/username/projects/node_modules/@types","recursive":true,"ignoreUpdate":true} Projects:: /user/username/projects/myproject/tsconfig.json (Configured) *new* @@ -255,8 +303,16 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts *new* + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts *new* + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json -Add file +Add file: /user/username/projects/myproject/c.ts Before running Timeout callback:: count: 0 //// [/user/username/projects/myproject/c.ts] export class a { prop = "hello"; foo() { return this.prop; } } @@ -264,7 +320,7 @@ export class a { prop = "hello"; foo() { return this.prop; } } After running Timeout callback:: count: 0 -Custom watch +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/c.ts created Before request Info seq [hh:mm:ss:mss] request: @@ -272,8 +328,9 @@ Info seq [hh:mm:ss:mss] request: "command": "watchChange", "arguments": { "id": 2, - "path": "/user/username/projects/myproject/c.ts", - "eventType": "create" + "created": [ + "/user/username/projects/myproject/c.ts" + ] }, "seq": 2, "type": "request" @@ -310,18 +367,20 @@ Info seq [hh:mm:ss:mss] event: "type": "event", "event": "CustomHandler::createFileWatcher", "body": { - "id": 7, + "id": 9, "path": "/user/username/projects/myproject/c.ts" } } -Custom watchFile: 7: /user/username/projects/myproject/c.ts +Custom watchFile: 9: /user/username/projects/myproject/c.ts Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 2 projectProgramVersion: 1 structureChanged: true structureIsReused:: Not Elapsed:: *ms Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" /user/username/projects/myproject/b.ts Text-1 "export class b { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-1 "export const x = 10;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" /user/username/projects/myproject/c.ts Text-1 "export class a { prop = \"hello\"; foo() { return this.prop; } }" @@ -331,6 +390,10 @@ Info seq [hh:mm:ss:mss] Files (4) Matched by default include pattern '**/*' b.ts Matched by default include pattern '**/*' + node_modules/something/index.d.ts + Imported via "something" from file 'm.ts' + m.ts + Matched by default include pattern '**/*' c.ts Matched by default include pattern '**/*' @@ -338,7 +401,7 @@ Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Running: *ensureProjectForOpenFiles* Info seq [hh:mm:ss:mss] Before ensureProjectForOpenFiles: Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -346,7 +409,7 @@ Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts Proje Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] After ensureProjectForOpenFiles: Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -367,21 +430,25 @@ After running Timeout callback:: count: 0 Custom WatchedFiles:: /a/lib/lib.d.ts: - {"id":4,"path":"/a/lib/lib.d.ts"} + {"id":6,"path":"/a/lib/lib.d.ts"} /user/username/projects/myproject/b.ts: {"id":3,"path":"/user/username/projects/myproject/b.ts"} /user/username/projects/myproject/c.ts: *new* - {"id":7,"path":"/user/username/projects/myproject/c.ts"} + {"id":9,"path":"/user/username/projects/myproject/c.ts"} +/user/username/projects/myproject/m.ts: + {"id":4,"path":"/user/username/projects/myproject/m.ts"} /user/username/projects/myproject/tsconfig.json: {"id":1,"path":"/user/username/projects/myproject/tsconfig.json"} Custom WatchedDirectoriesRecursive:: /user/username/projects/myproject: - {"id":2,"path":"/user/username/projects/myproject","recursive":true} + {"id":2,"path":"/user/username/projects/myproject","recursive":true,"ignoreUpdate":true} +/user/username/projects/myproject/node_modules: + {"id":5,"path":"/user/username/projects/myproject/node_modules","recursive":true} /user/username/projects/myproject/node_modules/@types: - {"id":5,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true} + {"id":7,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true,"ignoreUpdate":true} /user/username/projects/node_modules/@types: - {"id":6,"path":"/user/username/projects/node_modules/@types","recursive":true} + {"id":8,"path":"/user/username/projects/node_modules/@types","recursive":true,"ignoreUpdate":true} Projects:: /user/username/projects/myproject/tsconfig.json (Configured) *changed* @@ -406,8 +473,16 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json -Change File +Change File: /user/username/projects/myproject/b.ts Before running Timeout callback:: count: 0 //// [/user/username/projects/myproject/b.ts] export class a { prop = "hello"; foo() { return this.prop; } } @@ -415,7 +490,8 @@ export class a { prop = "hello"; foo() { return this.prop; } } After running Timeout callback:: count: 0 -Custom watch +Custom watch:: /user/username/projects/myproject/b.ts /user/username/projects/myproject/b.ts updated +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/b.ts updated Before request Info seq [hh:mm:ss:mss] request: @@ -423,8 +499,9 @@ Info seq [hh:mm:ss:mss] request: "command": "watchChange", "arguments": { "id": 3, - "path": "/user/username/projects/myproject/b.ts", - "eventType": "update" + "updated": [ + "/user/username/projects/myproject/b.ts" + ] }, "seq": 3, "type": "request" @@ -467,6 +544,14 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json Before running Timeout callback:: count: 2 3: /user/username/projects/myproject/tsconfig.json @@ -476,17 +561,19 @@ Info seq [hh:mm:ss:mss] Running: /user/username/projects/myproject/tsconfig.jso Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 3 projectProgramVersion: 2 structureChanged: false structureIsReused:: Completely Elapsed:: *ms Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" /user/username/projects/myproject/b.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-1 "export const x = 10;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" /user/username/projects/myproject/c.ts Text-1 "export class a { prop = \"hello\"; foo() { return this.prop; } }" Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Running: *ensureProjectForOpenFiles* Info seq [hh:mm:ss:mss] Before ensureProjectForOpenFiles: Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -494,7 +581,7 @@ Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts Proje Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] After ensureProjectForOpenFiles: Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -537,6 +624,14 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json Before request @@ -563,7 +658,7 @@ Custom watchFile:: Close:: 3: /user/username/projects/myproject/b.ts Info seq [hh:mm:ss:mss] Search path: /user/username/projects/myproject Info seq [hh:mm:ss:mss] For info: /user/username/projects/myproject/b.ts :: Config file name: /user/username/projects/myproject/tsconfig.json Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -579,9 +674,11 @@ After request Custom WatchedFiles:: /a/lib/lib.d.ts: - {"id":4,"path":"/a/lib/lib.d.ts"} + {"id":6,"path":"/a/lib/lib.d.ts"} /user/username/projects/myproject/c.ts: - {"id":7,"path":"/user/username/projects/myproject/c.ts"} + {"id":9,"path":"/user/username/projects/myproject/c.ts"} +/user/username/projects/myproject/m.ts: + {"id":4,"path":"/user/username/projects/myproject/m.ts"} /user/username/projects/myproject/tsconfig.json: {"id":1,"path":"/user/username/projects/myproject/tsconfig.json"} @@ -591,11 +688,13 @@ Custom WatchedFiles *deleted*:: Custom WatchedDirectoriesRecursive:: /user/username/projects/myproject: - {"id":2,"path":"/user/username/projects/myproject","recursive":true} + {"id":2,"path":"/user/username/projects/myproject","recursive":true,"ignoreUpdate":true} +/user/username/projects/myproject/node_modules: + {"id":5,"path":"/user/username/projects/myproject/node_modules","recursive":true} /user/username/projects/myproject/node_modules/@types: - {"id":5,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true} + {"id":7,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true,"ignoreUpdate":true} /user/username/projects/node_modules/@types: - {"id":6,"path":"/user/username/projects/node_modules/@types","recursive":true} + {"id":8,"path":"/user/username/projects/node_modules/@types","recursive":true,"ignoreUpdate":true} ScriptInfos:: /a/lib/lib.d.ts @@ -615,6 +714,14 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json Before request @@ -634,13 +741,13 @@ Info seq [hh:mm:ss:mss] event: "type": "event", "event": "CustomHandler::createFileWatcher", "body": { - "id": 8, + "id": 10, "path": "/user/username/projects/myproject/b.ts" } } -Custom watchFile: 8: /user/username/projects/myproject/b.ts +Custom watchFile: 10: /user/username/projects/myproject/b.ts Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) -Info seq [hh:mm:ss:mss] Files (4) +Info seq [hh:mm:ss:mss] Files (6) Info seq [hh:mm:ss:mss] ----------------------------------------------- Info seq [hh:mm:ss:mss] Open files: @@ -654,21 +761,25 @@ After request Custom WatchedFiles:: /a/lib/lib.d.ts: - {"id":4,"path":"/a/lib/lib.d.ts"} + {"id":6,"path":"/a/lib/lib.d.ts"} /user/username/projects/myproject/b.ts: *new* - {"id":8,"path":"/user/username/projects/myproject/b.ts"} + {"id":10,"path":"/user/username/projects/myproject/b.ts"} /user/username/projects/myproject/c.ts: - {"id":7,"path":"/user/username/projects/myproject/c.ts"} + {"id":9,"path":"/user/username/projects/myproject/c.ts"} +/user/username/projects/myproject/m.ts: + {"id":4,"path":"/user/username/projects/myproject/m.ts"} /user/username/projects/myproject/tsconfig.json: {"id":1,"path":"/user/username/projects/myproject/tsconfig.json"} Custom WatchedDirectoriesRecursive:: /user/username/projects/myproject: - {"id":2,"path":"/user/username/projects/myproject","recursive":true} + {"id":2,"path":"/user/username/projects/myproject","recursive":true,"ignoreUpdate":true} +/user/username/projects/myproject/node_modules: + {"id":5,"path":"/user/username/projects/myproject/node_modules","recursive":true} /user/username/projects/myproject/node_modules/@types: - {"id":5,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true} + {"id":7,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true,"ignoreUpdate":true} /user/username/projects/node_modules/@types: - {"id":6,"path":"/user/username/projects/node_modules/@types","recursive":true} + {"id":8,"path":"/user/username/projects/node_modules/@types","recursive":true,"ignoreUpdate":true} ScriptInfos:: /a/lib/lib.d.ts @@ -688,3 +799,592 @@ ScriptInfos:: version: Text-1 containingProjects: 1 /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json + +Change File: /user/username/projects/myproject/c.ts +Before running Timeout callback:: count: 0 +//// [/user/username/projects/myproject/c.ts] +export class a { prop = "hello"; foo() { return this.prop; } }export const y = 20; + + +After running Timeout callback:: count: 0 + +Custom watch:: /user/username/projects/myproject/c.ts /user/username/projects/myproject/c.ts updated +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/c.ts updated +Before request + +Info seq [hh:mm:ss:mss] request: + { + "command": "watchChange", + "arguments": { + "id": 9, + "updated": [ + "/user/username/projects/myproject/c.ts" + ] + }, + "seq": 6, + "type": "request" + } +Info seq [hh:mm:ss:mss] FileWatcher:: Triggered with /user/username/projects/myproject/c.ts 1:: WatchInfo: /user/username/projects/myproject/c.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles* +Info seq [hh:mm:ss:mss] Elapsed:: *ms FileWatcher:: Triggered with /user/username/projects/myproject/c.ts 1:: WatchInfo: /user/username/projects/myproject/c.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] response: + { + "responseRequired": false + } +After request + +Timeout callback:: count: 2 +5: /user/username/projects/myproject/tsconfig.json *new* +6: *ensureProjectForOpenFiles* *new* + +Projects:: +/user/username/projects/myproject/tsconfig.json (Configured) *changed* + projectStateVersion: 4 *changed* + projectProgramVersion: 2 + dirty: true *changed* + +ScriptInfos:: +/a/lib/lib.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/a.ts (Open) + version: SVC-1-0 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json *default* +/user/username/projects/myproject/b.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/c.ts *changed* + version: Text-1 + pendingReloadFromDisk: true *changed* + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json + +Before running Timeout callback:: count: 2 +5: /user/username/projects/myproject/tsconfig.json +6: *ensureProjectForOpenFiles* + +Info seq [hh:mm:ss:mss] Running: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 4 projectProgramVersion: 2 structureChanged: false structureIsReused:: Completely Elapsed:: *ms +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" + /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/b.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-1 "export const x = 10;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" + /user/username/projects/myproject/c.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }export const y = 20;" + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Running: *ensureProjectForOpenFiles* +Info seq [hh:mm:ss:mss] Before ensureProjectForOpenFiles: +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Open files: +Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts ProjectRootPath: undefined +Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] After ensureProjectForOpenFiles: +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Open files: +Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts ProjectRootPath: undefined +Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] event: + { + "seq": 0, + "type": "event", + "event": "CustomHandler::projectsUpdatedInBackground", + "body": { + "openFiles": [ + "/user/username/projects/myproject/a.ts" + ] + } + } +After running Timeout callback:: count: 0 + +Projects:: +/user/username/projects/myproject/tsconfig.json (Configured) *changed* + projectStateVersion: 4 + projectProgramVersion: 2 + dirty: false *changed* + +ScriptInfos:: +/a/lib/lib.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/a.ts (Open) + version: SVC-1-0 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json *default* +/user/username/projects/myproject/b.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/c.ts *changed* + version: Text-2 *changed* + pendingReloadFromDisk: false *changed* + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json + +update with npm install +Before running Timeout callback:: count: 0 +//// [/user/username/projects/myproject/node_modules/something/index.d.ts] +export const x = 10;export const y = 20; + + +After running Timeout callback:: count: 0 + +Custom watch:: /user/username/projects/myproject/node_modules /user/username/projects/myproject/node_modules/something/index.d.ts updated +Before request + +Info seq [hh:mm:ss:mss] request: + { + "command": "watchChange", + "arguments": { + "id": 5, + "updated": [ + "/user/username/projects/myproject/node_modules/something/index.d.ts" + ] + }, + "seq": 7, + "type": "request" + } +Info seq [hh:mm:ss:mss] DirectoryWatcher:: Triggered with /user/username/projects/myproject/node_modules/something/index.d.ts :: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined WatchType: node_modules for closed script infos and package.jsons affecting module specifier cache +Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles* +Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Triggered with /user/username/projects/myproject/node_modules/something/index.d.ts :: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined WatchType: node_modules for closed script infos and package.jsons affecting module specifier cache +Info seq [hh:mm:ss:mss] DirectoryWatcher:: Triggered with /user/username/projects/myproject/node_modules/something/index.d.ts :: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Failed Lookup Locations +Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.jsonFailedLookupInvalidation +Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Triggered with /user/username/projects/myproject/node_modules/something/index.d.ts :: WatchInfo: /user/username/projects/myproject/node_modules 1 undefined Project: /user/username/projects/myproject/tsconfig.json WatchType: Failed Lookup Locations +Info seq [hh:mm:ss:mss] response: + { + "responseRequired": false + } +After request + +Timeout callback:: count: 3 +7: /user/username/projects/myproject/tsconfig.json *new* +8: *ensureProjectForOpenFiles* *new* +9: /user/username/projects/myproject/tsconfig.jsonFailedLookupInvalidation *new* + +Projects:: +/user/username/projects/myproject/tsconfig.json (Configured) *changed* + projectStateVersion: 5 *changed* + projectProgramVersion: 2 + dirty: true *changed* + +ScriptInfos:: +/a/lib/lib.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/a.ts (Open) + version: SVC-1-0 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json *default* +/user/username/projects/myproject/b.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/c.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts *changed* + version: Text-1 + pendingReloadFromDisk: true *changed* + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json + +Before running Timeout callback:: count: 3 +7: /user/username/projects/myproject/tsconfig.json +8: *ensureProjectForOpenFiles* +9: /user/username/projects/myproject/tsconfig.jsonFailedLookupInvalidation + +Info seq [hh:mm:ss:mss] Running: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one +Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 5 projectProgramVersion: 2 structureChanged: true structureIsReused:: SafeModules Elapsed:: *ms +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" + /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/b.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-2 "export const x = 10;export const y = 20;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" + /user/username/projects/myproject/c.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }export const y = 20;" + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +After running Timeout callback:: count: 1 + +Timeout callback:: count: 1 +8: *ensureProjectForOpenFiles* *deleted* +9: /user/username/projects/myproject/tsconfig.jsonFailedLookupInvalidation *deleted* +10: *ensureProjectForOpenFiles* *new* + +Projects:: +/user/username/projects/myproject/tsconfig.json (Configured) *changed* + projectStateVersion: 5 + projectProgramVersion: 3 *changed* + dirty: false *changed* + +ScriptInfos:: +/a/lib/lib.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/a.ts (Open) + version: SVC-1-0 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json *default* +/user/username/projects/myproject/b.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/c.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts *changed* + version: Text-2 *changed* + pendingReloadFromDisk: false *changed* + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json + +Before running Timeout callback:: count: 1 +10: *ensureProjectForOpenFiles* + +Info seq [hh:mm:ss:mss] Running: *ensureProjectForOpenFiles* +Info seq [hh:mm:ss:mss] Before ensureProjectForOpenFiles: +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Open files: +Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts ProjectRootPath: undefined +Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] After ensureProjectForOpenFiles: +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (6) + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Open files: +Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts ProjectRootPath: undefined +Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] event: + { + "seq": 0, + "type": "event", + "event": "CustomHandler::projectsUpdatedInBackground", + "body": { + "openFiles": [ + "/user/username/projects/myproject/a.ts" + ] + } + } +After running Timeout callback:: count: 0 + +Add file: /user/username/projects/myproject/d.ts +Before running Timeout callback:: count: 0 +//// [/user/username/projects/myproject/d.ts] +export class a { prop = "hello"; foo() { return this.prop; } } + + +After running Timeout callback:: count: 0 + +Change File: /user/username/projects/myproject/c.ts +Before running Timeout callback:: count: 0 +//// [/user/username/projects/myproject/c.ts] +export class a { prop = "hello"; foo() { return this.prop; } }export const y = 20;export const z = 30; + + +After running Timeout callback:: count: 0 + +Add File: /user/username/projects/myproject/e.ts +Before running Timeout callback:: count: 0 +//// [/user/username/projects/myproject/e.ts] +export class a { prop = "hello"; foo() { return this.prop; } } + + +After running Timeout callback:: count: 0 + +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/d.ts created +Custom watch:: /user/username/projects/myproject/c.ts /user/username/projects/myproject/c.ts updated +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/c.ts updated +Custom watch:: /user/username/projects/myproject /user/username/projects/myproject/e.ts created +Before request + +Info seq [hh:mm:ss:mss] request: + { + "command": "watchChange", + "arguments": [ + { + "id": 2, + "created": [ + "/user/username/projects/myproject/d.ts", + "/user/username/projects/myproject/e.ts" + ] + }, + { + "id": 9, + "updated": [ + "/user/username/projects/myproject/c.ts" + ] + } + ], + "seq": 8, + "type": "request" + } +Info seq [hh:mm:ss:mss] DirectoryWatcher:: Triggered with /user/username/projects/myproject/d.ts :: WatchInfo: /user/username/projects/myproject 1 undefined Config: /user/username/projects/myproject/tsconfig.json WatchType: Wild card directory +Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles* +Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Triggered with /user/username/projects/myproject/d.ts :: WatchInfo: /user/username/projects/myproject 1 undefined Config: /user/username/projects/myproject/tsconfig.json WatchType: Wild card directory +Info seq [hh:mm:ss:mss] DirectoryWatcher:: Triggered with /user/username/projects/myproject/e.ts :: WatchInfo: /user/username/projects/myproject 1 undefined Config: /user/username/projects/myproject/tsconfig.json WatchType: Wild card directory +Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.json, Cancelled earlier one +Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one +Info seq [hh:mm:ss:mss] Elapsed:: *ms DirectoryWatcher:: Triggered with /user/username/projects/myproject/e.ts :: WatchInfo: /user/username/projects/myproject 1 undefined Config: /user/username/projects/myproject/tsconfig.json WatchType: Wild card directory +Info seq [hh:mm:ss:mss] FileWatcher:: Triggered with /user/username/projects/myproject/c.ts 1:: WatchInfo: /user/username/projects/myproject/c.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] Scheduled: /user/username/projects/myproject/tsconfig.json, Cancelled earlier one +Info seq [hh:mm:ss:mss] Scheduled: *ensureProjectForOpenFiles*, Cancelled earlier one +Info seq [hh:mm:ss:mss] Elapsed:: *ms FileWatcher:: Triggered with /user/username/projects/myproject/c.ts 1:: WatchInfo: /user/username/projects/myproject/c.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] response: + { + "responseRequired": false + } +After request + +Timeout callback:: count: 2 +15: /user/username/projects/myproject/tsconfig.json *new* +16: *ensureProjectForOpenFiles* *new* + +Projects:: +/user/username/projects/myproject/tsconfig.json (Configured) *changed* + projectStateVersion: 6 *changed* + projectProgramVersion: 3 + dirty: true *changed* + +ScriptInfos:: +/a/lib/lib.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/a.ts (Open) + version: SVC-1-0 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json *default* +/user/username/projects/myproject/b.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/c.ts *changed* + version: Text-2 + pendingReloadFromDisk: true *changed* + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json + +Before running Timeout callback:: count: 2 +15: /user/username/projects/myproject/tsconfig.json +16: *ensureProjectForOpenFiles* + +Info seq [hh:mm:ss:mss] Running: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/projects/myproject/d.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] event: + { + "seq": 0, + "type": "event", + "event": "CustomHandler::createFileWatcher", + "body": { + "id": 11, + "path": "/user/username/projects/myproject/d.ts" + } + } +Custom watchFile: 11: /user/username/projects/myproject/d.ts +Info seq [hh:mm:ss:mss] FileWatcher:: Added:: WatchInfo: /user/username/projects/myproject/e.ts 500 undefined WatchType: Closed Script info +Info seq [hh:mm:ss:mss] event: + { + "seq": 0, + "type": "event", + "event": "CustomHandler::createFileWatcher", + "body": { + "id": 12, + "path": "/user/username/projects/myproject/e.ts" + } + } +Custom watchFile: 12: /user/username/projects/myproject/e.ts +Info seq [hh:mm:ss:mss] Starting updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] Finishing updateGraphWorker: Project: /user/username/projects/myproject/tsconfig.json projectStateVersion: 6 projectProgramVersion: 3 structureChanged: true structureIsReused:: Not Elapsed:: *ms +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (8) + /a/lib/lib.d.ts Text-1 "/// \ninterface Boolean {}\ninterface Function {}\ninterface CallableFunction {}\ninterface NewableFunction {}\ninterface IArguments {}\ninterface Number { toExponential: any; }\ninterface Object {}\ninterface RegExp {}\ninterface String { charAt: any; }\ninterface Array { length: number; [n: number]: T; }" + /user/username/projects/myproject/a.ts SVC-1-0 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/b.ts Text-2 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/node_modules/something/index.d.ts Text-2 "export const x = 10;export const y = 20;" + /user/username/projects/myproject/m.ts Text-1 "import { x } from \"something\"" + /user/username/projects/myproject/c.ts Text-3 "export class a { prop = \"hello\"; foo() { return this.prop; } }export const y = 20;export const z = 30;" + /user/username/projects/myproject/d.ts Text-1 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + /user/username/projects/myproject/e.ts Text-1 "export class a { prop = \"hello\"; foo() { return this.prop; } }" + + + ../../../../a/lib/lib.d.ts + Default library for target 'es5' + a.ts + Matched by default include pattern '**/*' + b.ts + Matched by default include pattern '**/*' + node_modules/something/index.d.ts + Imported via "something" from file 'm.ts' + m.ts + Matched by default include pattern '**/*' + c.ts + Matched by default include pattern '**/*' + d.ts + Matched by default include pattern '**/*' + e.ts + Matched by default include pattern '**/*' + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Running: *ensureProjectForOpenFiles* +Info seq [hh:mm:ss:mss] Before ensureProjectForOpenFiles: +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (8) + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Open files: +Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts ProjectRootPath: undefined +Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] After ensureProjectForOpenFiles: +Info seq [hh:mm:ss:mss] Project '/user/username/projects/myproject/tsconfig.json' (Configured) +Info seq [hh:mm:ss:mss] Files (8) + +Info seq [hh:mm:ss:mss] ----------------------------------------------- +Info seq [hh:mm:ss:mss] Open files: +Info seq [hh:mm:ss:mss] FileName: /user/username/projects/myproject/a.ts ProjectRootPath: undefined +Info seq [hh:mm:ss:mss] Projects: /user/username/projects/myproject/tsconfig.json +Info seq [hh:mm:ss:mss] event: + { + "seq": 0, + "type": "event", + "event": "CustomHandler::projectsUpdatedInBackground", + "body": { + "openFiles": [ + "/user/username/projects/myproject/a.ts" + ] + } + } +After running Timeout callback:: count: 0 + +Custom WatchedFiles:: +/a/lib/lib.d.ts: + {"id":6,"path":"/a/lib/lib.d.ts"} +/user/username/projects/myproject/b.ts: + {"id":10,"path":"/user/username/projects/myproject/b.ts"} +/user/username/projects/myproject/c.ts: + {"id":9,"path":"/user/username/projects/myproject/c.ts"} +/user/username/projects/myproject/d.ts: *new* + {"id":11,"path":"/user/username/projects/myproject/d.ts"} +/user/username/projects/myproject/e.ts: *new* + {"id":12,"path":"/user/username/projects/myproject/e.ts"} +/user/username/projects/myproject/m.ts: + {"id":4,"path":"/user/username/projects/myproject/m.ts"} +/user/username/projects/myproject/tsconfig.json: + {"id":1,"path":"/user/username/projects/myproject/tsconfig.json"} + +Custom WatchedDirectoriesRecursive:: +/user/username/projects/myproject: + {"id":2,"path":"/user/username/projects/myproject","recursive":true,"ignoreUpdate":true} +/user/username/projects/myproject/node_modules: + {"id":5,"path":"/user/username/projects/myproject/node_modules","recursive":true} +/user/username/projects/myproject/node_modules/@types: + {"id":7,"path":"/user/username/projects/myproject/node_modules/@types","recursive":true,"ignoreUpdate":true} +/user/username/projects/node_modules/@types: + {"id":8,"path":"/user/username/projects/node_modules/@types","recursive":true,"ignoreUpdate":true} + +Projects:: +/user/username/projects/myproject/tsconfig.json (Configured) *changed* + projectStateVersion: 6 + projectProgramVersion: 4 *changed* + dirty: false *changed* + +ScriptInfos:: +/a/lib/lib.d.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/a.ts (Open) + version: SVC-1-0 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json *default* +/user/username/projects/myproject/b.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/c.ts *changed* + version: Text-3 *changed* + pendingReloadFromDisk: false *changed* + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/d.ts *new* + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/e.ts *new* + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/m.ts + version: Text-1 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json +/user/username/projects/myproject/node_modules/something/index.d.ts + version: Text-2 + containingProjects: 1 + /user/username/projects/myproject/tsconfig.json