From 48aecfa5a55a88a59919d54736e6220c149648cf Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Fri, 23 Jul 2021 16:32:52 -0700 Subject: [PATCH] Consider module augmentations in files referenced by imports in watch/incremental (#45156) * Consider module augmentations in files referenced by importsin watch/incremental * Accept baselines * Accept other baseline * Hooray optional chaining * Delete outdated and unuseful comment --- src/compiler/builderState.ts | 30 +- .../unittests/tscWatch/incremental.ts | 17 + ...s-merged-and-contains-late-bound-member.js | 39 ++- ...editing-module-augmentation-incremental.js | 266 +++++++++++++++ .../editing-module-augmentation-watch.js | 314 ++++++++++++++++++ 5 files changed, 632 insertions(+), 34 deletions(-) create mode 100644 tests/baselines/reference/tscWatch/incremental/editing-module-augmentation-incremental.js create mode 100644 tests/baselines/reference/tscWatch/incremental/editing-module-augmentation-watch.js diff --git a/src/compiler/builderState.ts b/src/compiler/builderState.ts index 779924a4c9d..69220454989 100644 --- a/src/compiler/builderState.ts +++ b/src/compiler/builderState.ts @@ -178,22 +178,16 @@ namespace ts { */ export type ComputeHash = ((data: string) => string) | undefined; - /** - * Get the referencedFile from the imported module symbol - */ - function getReferencedFileFromImportedModuleSymbol(symbol: Symbol) { - if (symbol.declarations && symbol.declarations[0]) { - const declarationSourceFile = getSourceFileOfNode(symbol.declarations[0]); - return declarationSourceFile && declarationSourceFile.resolvedPath; - } + function getReferencedFilesFromImportedModuleSymbol(symbol: Symbol): Path[] { + return mapDefined(symbol.declarations, declaration => getSourceFileOfNode(declaration)?.resolvedPath); } /** - * Get the referencedFile from the import name node from file + * Get the module source file and all augmenting files from the import name node from file */ - function getReferencedFileFromImportLiteral(checker: TypeChecker, importName: StringLiteralLike) { + function getReferencedFilesFromImportLiteral(checker: TypeChecker, importName: StringLiteralLike): Path[] | undefined { const symbol = checker.getSymbolAtLocation(importName); - return symbol && getReferencedFileFromImportedModuleSymbol(symbol); + return symbol && getReferencedFilesFromImportedModuleSymbol(symbol); } /** @@ -215,10 +209,8 @@ namespace ts { if (sourceFile.imports && sourceFile.imports.length > 0) { const checker: TypeChecker = program.getTypeChecker(); for (const importName of sourceFile.imports) { - const declarationSourceFilePath = getReferencedFileFromImportLiteral(checker, importName); - if (declarationSourceFilePath) { - addReferencedFile(declarationSourceFilePath); - } + const declarationSourceFilePaths = getReferencedFilesFromImportLiteral(checker, importName); + declarationSourceFilePaths?.forEach(addReferencedFile); } } @@ -458,7 +450,7 @@ namespace ts { } let exportedModules: Set | undefined; - exportedModulesFromDeclarationEmit.forEach(symbol => addExportedModule(getReferencedFileFromImportedModuleSymbol(symbol))); + exportedModulesFromDeclarationEmit.forEach(symbol => addExportedModule(getReferencedFilesFromImportedModuleSymbol(symbol))); if (exportedModules) { exportedModulesMapCache.set(sourceFile.resolvedPath, exportedModules); } @@ -466,12 +458,12 @@ namespace ts { exportedModulesMapCache.deleteKey(sourceFile.resolvedPath); } - function addExportedModule(exportedModulePath: Path | undefined) { - if (exportedModulePath) { + function addExportedModule(exportedModulePaths: Path[] | undefined) { + if (exportedModulePaths?.length) { if (!exportedModules) { exportedModules = new Set(); } - exportedModules.add(exportedModulePath); + exportedModulePaths.forEach(path => exportedModules!.add(path)); } } } diff --git a/src/testRunner/unittests/tscWatch/incremental.ts b/src/testRunner/unittests/tscWatch/incremental.ts index 147363447fd..bc6e541815a 100644 --- a/src/testRunner/unittests/tscWatch/incremental.ts +++ b/src/testRunner/unittests/tscWatch/incremental.ts @@ -355,5 +355,22 @@ export const Fragment: unique symbol; } }); }); + + describe("editing module augmentation", () => { + verifyIncrementalWatchEmit({ + subScenario: "editing module augmentation", + files: () => [ + { path: libFile.path, content: libContent }, + { path: `${project}/node_modules/classnames/index.d.ts`, content: `export interface Result {} export default function classNames(): Result;` }, + { path: `${project}/src/types/classnames.d.ts`, content: `export {}; declare module "classnames" { interface Result { foo } }` }, + { path: `${project}/src/index.ts`, content: `import classNames from "classnames"; classNames().foo;` }, + { path: configFile.path, content: JSON.stringify({ compilerOptions: { module: "commonjs", incremental: true } }) }, + ], + modifyFs: host => { + // delete 'foo' + host.writeFile(`${project}/src/types/classnames.d.ts`, `export {}; declare module "classnames" { interface Result {} }`); + }, + }); + }); }); } diff --git a/tests/baselines/reference/tsbuild/lateBoundSymbol/initial-build/interface-is-merged-and-contains-late-bound-member.js b/tests/baselines/reference/tsbuild/lateBoundSymbol/initial-build/interface-is-merged-and-contains-late-bound-member.js index 72a120e7d73..b7b96271b4e 100644 --- a/tests/baselines/reference/tsbuild/lateBoundSymbol/initial-build/interface-is-merged-and-contains-late-bound-member.js +++ b/tests/baselines/reference/tsbuild/lateBoundSymbol/initial-build/interface-is-merged-and-contains-late-bound-member.js @@ -71,7 +71,7 @@ var x = 10; //// [/src/tsconfig.tsbuildinfo] -{"program":{"fileNames":["../lib/lib.d.ts","./src/globals.d.ts","./src/hkt.ts","./src/main.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},{"version":"-1994196675-interface SymbolConstructor {\n (description?: string | number): symbol;\n}\ndeclare var Symbol: SymbolConstructor;","affectsGlobalScope":true},"675797797-export interface HKT { }","-28387946490-import { HKT } from \"./hkt\";\r\n\r\nconst sym = Symbol();\r\n\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: { a: T }\r\n }\r\n}\r\nconst x = 10;\r\ntype A = HKT[typeof sym];"],"options":{"rootDir":"./src"},"fileIdsList":[[3]],"referencedMap":[[4,1]],"exportedModulesMap":[[4,1]],"semanticDiagnosticsPerFile":[1,2,3,4]},"version":"FakeTSVersion"} +{"program":{"fileNames":["../lib/lib.d.ts","./src/globals.d.ts","./src/hkt.ts","./src/main.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},{"version":"-1994196675-interface SymbolConstructor {\n (description?: string | number): symbol;\n}\ndeclare var Symbol: SymbolConstructor;","affectsGlobalScope":true},"675797797-export interface HKT { }","-28387946490-import { HKT } from \"./hkt\";\r\n\r\nconst sym = Symbol();\r\n\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: { a: T }\r\n }\r\n}\r\nconst x = 10;\r\ntype A = HKT[typeof sym];"],"options":{"rootDir":"./src"},"fileIdsList":[[3,4]],"referencedMap":[[4,1]],"exportedModulesMap":[[4,1]],"semanticDiagnosticsPerFile":[1,2,3,4]},"version":"FakeTSVersion"} //// [/src/tsconfig.tsbuildinfo.readable.baseline.txt] { @@ -84,7 +84,8 @@ var x = 10; ], "fileNamesList": [ [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] ], "fileInfos": { @@ -112,12 +113,14 @@ var x = 10; }, "referencedMap": { "./src/main.ts": [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] }, "exportedModulesMap": { "./src/main.ts": [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] }, "semanticDiagnosticsPerFile": [ @@ -128,7 +131,7 @@ var x = 10; ] }, "version": "FakeTSVersion", - "size": 1191 + "size": 1193 } @@ -171,7 +174,7 @@ var sym = Symbol(); //// [/src/tsconfig.tsbuildinfo] -{"program":{"fileNames":["../lib/lib.d.ts","./src/globals.d.ts","./src/hkt.ts","./src/main.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},{"version":"-1994196675-interface SymbolConstructor {\n (description?: string | number): symbol;\n}\ndeclare var Symbol: SymbolConstructor;","affectsGlobalScope":true},"675797797-export interface HKT { }",{"version":"-27494779858-import { HKT } from \"./hkt\";\r\n\r\nconst sym = Symbol();\r\n\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: { a: T }\r\n }\r\n}\r\n\r\ntype A = HKT[typeof sym];","signature":"-7779857705-declare const sym: unique symbol;\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: {\r\n a: T;\r\n };\r\n }\r\n}\r\nexport {};\r\n"}],"options":{"rootDir":"./src"},"fileIdsList":[[3]],"referencedMap":[[4,1]],"exportedModulesMap":[[4,1]],"semanticDiagnosticsPerFile":[1,2,3,4]},"version":"FakeTSVersion"} +{"program":{"fileNames":["../lib/lib.d.ts","./src/globals.d.ts","./src/hkt.ts","./src/main.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},{"version":"-1994196675-interface SymbolConstructor {\n (description?: string | number): symbol;\n}\ndeclare var Symbol: SymbolConstructor;","affectsGlobalScope":true},"675797797-export interface HKT { }",{"version":"-27494779858-import { HKT } from \"./hkt\";\r\n\r\nconst sym = Symbol();\r\n\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: { a: T }\r\n }\r\n}\r\n\r\ntype A = HKT[typeof sym];","signature":"-7779857705-declare const sym: unique symbol;\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: {\r\n a: T;\r\n };\r\n }\r\n}\r\nexport {};\r\n"}],"options":{"rootDir":"./src"},"fileIdsList":[[3,4]],"referencedMap":[[4,1]],"exportedModulesMap":[[4,1]],"semanticDiagnosticsPerFile":[1,2,3,4]},"version":"FakeTSVersion"} //// [/src/tsconfig.tsbuildinfo.readable.baseline.txt] { @@ -184,7 +187,8 @@ var sym = Symbol(); ], "fileNamesList": [ [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] ], "fileInfos": { @@ -212,12 +216,14 @@ var sym = Symbol(); }, "referencedMap": { "./src/main.ts": [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] }, "exportedModulesMap": { "./src/main.ts": [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] }, "semanticDiagnosticsPerFile": [ @@ -228,7 +234,7 @@ var sym = Symbol(); ] }, "version": "FakeTSVersion", - "size": 1393 + "size": 1395 } @@ -272,7 +278,7 @@ var x = 10; //// [/src/tsconfig.tsbuildinfo] -{"program":{"fileNames":["../lib/lib.d.ts","./src/globals.d.ts","./src/hkt.ts","./src/main.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},{"version":"-1994196675-interface SymbolConstructor {\n (description?: string | number): symbol;\n}\ndeclare var Symbol: SymbolConstructor;","affectsGlobalScope":true},"675797797-export interface HKT { }",{"version":"-20682988154-import { HKT } from \"./hkt\";\r\n\r\nconst sym = Symbol();\r\n\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: { a: T }\r\n }\r\n}\r\n\r\ntype A = HKT[typeof sym];const x = 10;","signature":"-7779857705-declare const sym: unique symbol;\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: {\r\n a: T;\r\n };\r\n }\r\n}\r\nexport {};\r\n"}],"options":{"rootDir":"./src"},"fileIdsList":[[3]],"referencedMap":[[4,1]],"exportedModulesMap":[[4,1]],"semanticDiagnosticsPerFile":[1,2,3,4]},"version":"FakeTSVersion"} +{"program":{"fileNames":["../lib/lib.d.ts","./src/globals.d.ts","./src/hkt.ts","./src/main.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},{"version":"-1994196675-interface SymbolConstructor {\n (description?: string | number): symbol;\n}\ndeclare var Symbol: SymbolConstructor;","affectsGlobalScope":true},"675797797-export interface HKT { }",{"version":"-20682988154-import { HKT } from \"./hkt\";\r\n\r\nconst sym = Symbol();\r\n\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: { a: T }\r\n }\r\n}\r\n\r\ntype A = HKT[typeof sym];const x = 10;","signature":"-7779857705-declare const sym: unique symbol;\r\ndeclare module \"./hkt\" {\r\n interface HKT {\r\n [sym]: {\r\n a: T;\r\n };\r\n }\r\n}\r\nexport {};\r\n"}],"options":{"rootDir":"./src"},"fileIdsList":[[3,4]],"referencedMap":[[4,1]],"exportedModulesMap":[[4,1]],"semanticDiagnosticsPerFile":[1,2,3,4]},"version":"FakeTSVersion"} //// [/src/tsconfig.tsbuildinfo.readable.baseline.txt] { @@ -285,7 +291,8 @@ var x = 10; ], "fileNamesList": [ [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] ], "fileInfos": { @@ -313,12 +320,14 @@ var x = 10; }, "referencedMap": { "./src/main.ts": [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] }, "exportedModulesMap": { "./src/main.ts": [ - "./src/hkt.ts" + "./src/hkt.ts", + "./src/main.ts" ] }, "semanticDiagnosticsPerFile": [ @@ -329,6 +338,6 @@ var x = 10; ] }, "version": "FakeTSVersion", - "size": 1406 + "size": 1408 } diff --git a/tests/baselines/reference/tscWatch/incremental/editing-module-augmentation-incremental.js b/tests/baselines/reference/tscWatch/incremental/editing-module-augmentation-incremental.js new file mode 100644 index 00000000000..6ef212caad5 --- /dev/null +++ b/tests/baselines/reference/tscWatch/incremental/editing-module-augmentation-incremental.js @@ -0,0 +1,266 @@ +Input:: +//// [/a/lib/lib.d.ts] +/// +interface Boolean {} +interface Function {} +interface CallableFunction {} +interface NewableFunction {} +interface IArguments {} +interface Number { toExponential: any; } +interface Object {} +interface RegExp {} +interface String { charAt: any; } +interface Array { length: number; [n: number]: T; } +interface ReadonlyArray {} +declare const console: { log(msg: any): void; }; + +//// [/users/username/projects/project/node_modules/classnames/index.d.ts] +export interface Result {} export default function classNames(): Result; + +//// [/users/username/projects/project/src/types/classnames.d.ts] +export {}; declare module "classnames" { interface Result { foo } } + +//// [/users/username/projects/project/src/index.ts] +import classNames from "classnames"; classNames().foo; + +//// [/users/username/projects/project/tsconfig.json] +{"compilerOptions":{"module":"commonjs","incremental":true}} + + +/a/lib/tsc.js -i +Output:: + + +Program root files: ["/users/username/projects/project/src/index.ts","/users/username/projects/project/src/types/classnames.d.ts"] +Program options: {"module":1,"incremental":true,"configFilePath":"/users/username/projects/project/tsconfig.json"} +Program structureReused: Not +Program files:: +/a/lib/lib.d.ts +/users/username/projects/project/node_modules/classnames/index.d.ts +/users/username/projects/project/src/index.ts +/users/username/projects/project/src/types/classnames.d.ts + +Semantic diagnostics in builder refreshed for:: +/a/lib/lib.d.ts +/users/username/projects/project/node_modules/classnames/index.d.ts +/users/username/projects/project/src/index.ts +/users/username/projects/project/src/types/classnames.d.ts + +Shape signatures in builder refreshed for:: +/a/lib/lib.d.ts (used version) +/users/username/projects/project/node_modules/classnames/index.d.ts (used version) +/users/username/projects/project/src/index.ts (used version) +/users/username/projects/project/src/types/classnames.d.ts (used version) + +WatchedFiles:: + +FsWatches:: + +FsWatchesRecursive:: + +exitCode:: ExitStatus.Success + +//// [/users/username/projects/project/src/index.js] +"use strict"; +exports.__esModule = true; +var classnames_1 = require("classnames"); +(0, classnames_1["default"])().foo; + + +//// [/users/username/projects/project/tsconfig.tsbuildinfo] +{"program":{"fileNames":["../../../../a/lib/lib.d.ts","./node_modules/classnames/index.d.ts","./src/index.ts","./src/types/classnames.d.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},"1239706283-export interface Result {} export default function classNames(): Result;","-5756287633-import classNames from \"classnames\"; classNames().foo;","-16510108606-export {}; declare module \"classnames\" { interface Result { foo } }"],"options":{"module":1},"fileIdsList":[[2,4],[2]],"referencedMap":[[3,1],[4,2]],"exportedModulesMap":[[3,1],[4,2]],"semanticDiagnosticsPerFile":[1,2,3,4]},"version":"FakeTSVersion"} + +//// [/users/username/projects/project/tsconfig.tsbuildinfo.readable.baseline.txt] +{ + "program": { + "fileNames": [ + "../../../../a/lib/lib.d.ts", + "./node_modules/classnames/index.d.ts", + "./src/index.ts", + "./src/types/classnames.d.ts" + ], + "fileNamesList": [ + [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + [ + "./node_modules/classnames/index.d.ts" + ] + ], + "fileInfos": { + "../../../../a/lib/lib.d.ts": { + "version": "3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "signature": "3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true + }, + "./node_modules/classnames/index.d.ts": { + "version": "1239706283-export interface Result {} export default function classNames(): Result;", + "signature": "1239706283-export interface Result {} export default function classNames(): Result;" + }, + "./src/index.ts": { + "version": "-5756287633-import classNames from \"classnames\"; classNames().foo;", + "signature": "-5756287633-import classNames from \"classnames\"; classNames().foo;" + }, + "./src/types/classnames.d.ts": { + "version": "-16510108606-export {}; declare module \"classnames\" { interface Result { foo } }", + "signature": "-16510108606-export {}; declare module \"classnames\" { interface Result { foo } }" + } + }, + "options": { + "module": 1 + }, + "referencedMap": { + "./src/index.ts": [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + "./src/types/classnames.d.ts": [ + "./node_modules/classnames/index.d.ts" + ] + }, + "exportedModulesMap": { + "./src/index.ts": [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + "./src/types/classnames.d.ts": [ + "./node_modules/classnames/index.d.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + "../../../../a/lib/lib.d.ts", + "./node_modules/classnames/index.d.ts", + "./src/index.ts", + "./src/types/classnames.d.ts" + ] + }, + "version": "FakeTSVersion", + "size": 1056 +} + + +Change:: + +Input:: +//// [/users/username/projects/project/src/types/classnames.d.ts] +export {}; declare module "classnames" { interface Result {} } + + +Output:: +src/index.ts:1:51 - error TS2339: Property 'foo' does not exist on type 'Result'. + +1 import classNames from "classnames"; classNames().foo; +   ~~~ + + +Found 1 error. + + + +Program root files: ["/users/username/projects/project/src/index.ts","/users/username/projects/project/src/types/classnames.d.ts"] +Program options: {"module":1,"incremental":true,"configFilePath":"/users/username/projects/project/tsconfig.json"} +Program structureReused: Not +Program files:: +/a/lib/lib.d.ts +/users/username/projects/project/node_modules/classnames/index.d.ts +/users/username/projects/project/src/index.ts +/users/username/projects/project/src/types/classnames.d.ts + +Semantic diagnostics in builder refreshed for:: +/users/username/projects/project/src/index.ts +/users/username/projects/project/src/types/classnames.d.ts + +Shape signatures in builder refreshed for:: +/users/username/projects/project/src/types/classnames.d.ts (used version) +/users/username/projects/project/src/index.ts (computed .d.ts) + +WatchedFiles:: + +FsWatches:: + +FsWatchesRecursive:: + +exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated + +//// [/users/username/projects/project/src/index.js] file written with same contents +//// [/users/username/projects/project/tsconfig.tsbuildinfo] +{"program":{"fileNames":["../../../../a/lib/lib.d.ts","./node_modules/classnames/index.d.ts","./src/index.ts","./src/types/classnames.d.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},"1239706283-export interface Result {} export default function classNames(): Result;",{"version":"-5756287633-import classNames from \"classnames\"; classNames().foo;","signature":"-3531856636-export {};\n"},"-14890340642-export {}; declare module \"classnames\" { interface Result {} }"],"options":{"module":1},"fileIdsList":[[2,4],[2]],"referencedMap":[[3,1],[4,2]],"exportedModulesMap":[[4,2]],"semanticDiagnosticsPerFile":[1,2,[3,[{"file":"./src/index.ts","start":50,"length":3,"code":2339,"category":1,"messageText":"Property 'foo' does not exist on type 'Result'."}]],4]},"version":"FakeTSVersion"} + +//// [/users/username/projects/project/tsconfig.tsbuildinfo.readable.baseline.txt] +{ + "program": { + "fileNames": [ + "../../../../a/lib/lib.d.ts", + "./node_modules/classnames/index.d.ts", + "./src/index.ts", + "./src/types/classnames.d.ts" + ], + "fileNamesList": [ + [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + [ + "./node_modules/classnames/index.d.ts" + ] + ], + "fileInfos": { + "../../../../a/lib/lib.d.ts": { + "version": "3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "signature": "3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true + }, + "./node_modules/classnames/index.d.ts": { + "version": "1239706283-export interface Result {} export default function classNames(): Result;", + "signature": "1239706283-export interface Result {} export default function classNames(): Result;" + }, + "./src/index.ts": { + "version": "-5756287633-import classNames from \"classnames\"; classNames().foo;", + "signature": "-3531856636-export {};\n" + }, + "./src/types/classnames.d.ts": { + "version": "-14890340642-export {}; declare module \"classnames\" { interface Result {} }", + "signature": "-14890340642-export {}; declare module \"classnames\" { interface Result {} }" + } + }, + "options": { + "module": 1 + }, + "referencedMap": { + "./src/index.ts": [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + "./src/types/classnames.d.ts": [ + "./node_modules/classnames/index.d.ts" + ] + }, + "exportedModulesMap": { + "./src/types/classnames.d.ts": [ + "./node_modules/classnames/index.d.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + "../../../../a/lib/lib.d.ts", + "./node_modules/classnames/index.d.ts", + [ + "./src/index.ts", + [ + { + "file": "./src/index.ts", + "start": 50, + "length": 3, + "code": 2339, + "category": 1, + "messageText": "Property 'foo' does not exist on type 'Result'." + } + ] + ], + "./src/types/classnames.d.ts" + ] + }, + "version": "FakeTSVersion", + "size": 1237 +} + diff --git a/tests/baselines/reference/tscWatch/incremental/editing-module-augmentation-watch.js b/tests/baselines/reference/tscWatch/incremental/editing-module-augmentation-watch.js new file mode 100644 index 00000000000..381d2d4f0f6 --- /dev/null +++ b/tests/baselines/reference/tscWatch/incremental/editing-module-augmentation-watch.js @@ -0,0 +1,314 @@ +Input:: +//// [/a/lib/lib.d.ts] +/// +interface Boolean {} +interface Function {} +interface CallableFunction {} +interface NewableFunction {} +interface IArguments {} +interface Number { toExponential: any; } +interface Object {} +interface RegExp {} +interface String { charAt: any; } +interface Array { length: number; [n: number]: T; } +interface ReadonlyArray {} +declare const console: { log(msg: any): void; }; + +//// [/users/username/projects/project/node_modules/classnames/index.d.ts] +export interface Result {} export default function classNames(): Result; + +//// [/users/username/projects/project/src/types/classnames.d.ts] +export {}; declare module "classnames" { interface Result { foo } } + +//// [/users/username/projects/project/src/index.ts] +import classNames from "classnames"; classNames().foo; + +//// [/users/username/projects/project/tsconfig.json] +{"compilerOptions":{"module":"commonjs","incremental":true}} + + +/a/lib/tsc.js -w +Output:: +>> Screen clear +[12:00:33 AM] Starting compilation in watch mode... + +[12:00:38 AM] Found 0 errors. Watching for file changes. + + + +Program root files: ["/users/username/projects/project/src/index.ts","/users/username/projects/project/src/types/classnames.d.ts"] +Program options: {"module":1,"incremental":true,"watch":true,"configFilePath":"/users/username/projects/project/tsconfig.json"} +Program structureReused: Not +Program files:: +/a/lib/lib.d.ts +/users/username/projects/project/node_modules/classnames/index.d.ts +/users/username/projects/project/src/index.ts +/users/username/projects/project/src/types/classnames.d.ts + +Semantic diagnostics in builder refreshed for:: +/a/lib/lib.d.ts +/users/username/projects/project/node_modules/classnames/index.d.ts +/users/username/projects/project/src/index.ts +/users/username/projects/project/src/types/classnames.d.ts + +Shape signatures in builder refreshed for:: +/a/lib/lib.d.ts (used version) +/users/username/projects/project/node_modules/classnames/index.d.ts (used version) +/users/username/projects/project/src/index.ts (used version) +/users/username/projects/project/src/types/classnames.d.ts (used version) + +WatchedFiles:: +/users/username/projects/project/tsconfig.json: + {"fileName":"/users/username/projects/project/tsconfig.json","pollingInterval":250} +/users/username/projects/project/src/index.ts: + {"fileName":"/users/username/projects/project/src/index.ts","pollingInterval":250} +/users/username/projects/project/node_modules/classnames/index.d.ts: + {"fileName":"/users/username/projects/project/node_modules/classnames/index.d.ts","pollingInterval":250} +/users/username/projects/project/src/types/classnames.d.ts: + {"fileName":"/users/username/projects/project/src/types/classnames.d.ts","pollingInterval":250} +/a/lib/lib.d.ts: + {"fileName":"/a/lib/lib.d.ts","pollingInterval":250} +/users/username/projects/project/node_modules/classnames/package.json: + {"fileName":"/users/username/projects/project/node_modules/classnames/package.json","pollingInterval":250} + +FsWatches:: + +FsWatchesRecursive:: +/users/username/projects/project/src: + {"directoryName":"/users/username/projects/project/src","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}} +/users/username/projects/project/node_modules: + {"directoryName":"/users/username/projects/project/node_modules","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}} +/users/username/projects/project/node_modules/@types: + {"directoryName":"/users/username/projects/project/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}} +/users/username/projects/project: + {"directoryName":"/users/username/projects/project","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}} + +exitCode:: ExitStatus.undefined + +//// [/users/username/projects/project/src/index.js] +"use strict"; +exports.__esModule = true; +var classnames_1 = require("classnames"); +(0, classnames_1["default"])().foo; + + +//// [/users/username/projects/project/tsconfig.tsbuildinfo] +{"program":{"fileNames":["../../../../a/lib/lib.d.ts","./node_modules/classnames/index.d.ts","./src/index.ts","./src/types/classnames.d.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},"1239706283-export interface Result {} export default function classNames(): Result;","-5756287633-import classNames from \"classnames\"; classNames().foo;","-16510108606-export {}; declare module \"classnames\" { interface Result { foo } }"],"options":{"module":1},"fileIdsList":[[2,4],[2]],"referencedMap":[[3,1],[4,2]],"exportedModulesMap":[[3,1],[4,2]],"semanticDiagnosticsPerFile":[1,2,3,4]},"version":"FakeTSVersion"} + +//// [/users/username/projects/project/tsconfig.tsbuildinfo.readable.baseline.txt] +{ + "program": { + "fileNames": [ + "../../../../a/lib/lib.d.ts", + "./node_modules/classnames/index.d.ts", + "./src/index.ts", + "./src/types/classnames.d.ts" + ], + "fileNamesList": [ + [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + [ + "./node_modules/classnames/index.d.ts" + ] + ], + "fileInfos": { + "../../../../a/lib/lib.d.ts": { + "version": "3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "signature": "3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true + }, + "./node_modules/classnames/index.d.ts": { + "version": "1239706283-export interface Result {} export default function classNames(): Result;", + "signature": "1239706283-export interface Result {} export default function classNames(): Result;" + }, + "./src/index.ts": { + "version": "-5756287633-import classNames from \"classnames\"; classNames().foo;", + "signature": "-5756287633-import classNames from \"classnames\"; classNames().foo;" + }, + "./src/types/classnames.d.ts": { + "version": "-16510108606-export {}; declare module \"classnames\" { interface Result { foo } }", + "signature": "-16510108606-export {}; declare module \"classnames\" { interface Result { foo } }" + } + }, + "options": { + "module": 1 + }, + "referencedMap": { + "./src/index.ts": [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + "./src/types/classnames.d.ts": [ + "./node_modules/classnames/index.d.ts" + ] + }, + "exportedModulesMap": { + "./src/index.ts": [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + "./src/types/classnames.d.ts": [ + "./node_modules/classnames/index.d.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + "../../../../a/lib/lib.d.ts", + "./node_modules/classnames/index.d.ts", + "./src/index.ts", + "./src/types/classnames.d.ts" + ] + }, + "version": "FakeTSVersion", + "size": 1056 +} + + +Change:: + +Input:: +//// [/users/username/projects/project/src/types/classnames.d.ts] +export {}; declare module "classnames" { interface Result {} } + + +Output:: +>> Screen clear +[12:00:44 AM] Starting compilation in watch mode... + +src/index.ts:1:51 - error TS2339: Property 'foo' does not exist on type 'Result'. + +1 import classNames from "classnames"; classNames().foo; +   ~~~ + +[12:00:51 AM] Found 1 error. Watching for file changes. + + + +Program root files: ["/users/username/projects/project/src/index.ts","/users/username/projects/project/src/types/classnames.d.ts"] +Program options: {"module":1,"incremental":true,"watch":true,"configFilePath":"/users/username/projects/project/tsconfig.json"} +Program structureReused: Not +Program files:: +/a/lib/lib.d.ts +/users/username/projects/project/node_modules/classnames/index.d.ts +/users/username/projects/project/src/index.ts +/users/username/projects/project/src/types/classnames.d.ts + +Semantic diagnostics in builder refreshed for:: +/users/username/projects/project/src/index.ts +/users/username/projects/project/src/types/classnames.d.ts + +Shape signatures in builder refreshed for:: +/users/username/projects/project/src/types/classnames.d.ts (used version) +/users/username/projects/project/src/index.ts (computed .d.ts) + +WatchedFiles:: +/users/username/projects/project/node_modules/classnames/package.json: + {"fileName":"/users/username/projects/project/node_modules/classnames/package.json","pollingInterval":250} + {"fileName":"/users/username/projects/project/node_modules/classnames/package.json","pollingInterval":250} +/users/username/projects/project/tsconfig.json: + {"fileName":"/users/username/projects/project/tsconfig.json","pollingInterval":250} +/users/username/projects/project/src/index.ts: + {"fileName":"/users/username/projects/project/src/index.ts","pollingInterval":250} +/users/username/projects/project/node_modules/classnames/index.d.ts: + {"fileName":"/users/username/projects/project/node_modules/classnames/index.d.ts","pollingInterval":250} +/users/username/projects/project/src/types/classnames.d.ts: + {"fileName":"/users/username/projects/project/src/types/classnames.d.ts","pollingInterval":250} +/a/lib/lib.d.ts: + {"fileName":"/a/lib/lib.d.ts","pollingInterval":250} + +FsWatches:: + +FsWatchesRecursive:: +/users/username/projects/project/src: + {"directoryName":"/users/username/projects/project/src","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}} +/users/username/projects/project/node_modules: + {"directoryName":"/users/username/projects/project/node_modules","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}} +/users/username/projects/project/node_modules/@types: + {"directoryName":"/users/username/projects/project/node_modules/@types","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}} +/users/username/projects/project: + {"directoryName":"/users/username/projects/project","fallbackPollingInterval":500,"fallbackOptions":{"watchFile":"PriorityPollingInterval"}} + +exitCode:: ExitStatus.undefined + +//// [/users/username/projects/project/src/index.js] file written with same contents +//// [/users/username/projects/project/tsconfig.tsbuildinfo] +{"program":{"fileNames":["../../../../a/lib/lib.d.ts","./node_modules/classnames/index.d.ts","./src/index.ts","./src/types/classnames.d.ts"],"fileInfos":[{"version":"3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true},"1239706283-export interface Result {} export default function classNames(): Result;",{"version":"-5756287633-import classNames from \"classnames\"; classNames().foo;","signature":"-3531856636-export {};\n"},"-14890340642-export {}; declare module \"classnames\" { interface Result {} }"],"options":{"module":1},"fileIdsList":[[2,4],[2]],"referencedMap":[[3,1],[4,2]],"exportedModulesMap":[[4,2]],"semanticDiagnosticsPerFile":[1,2,[3,[{"file":"./src/index.ts","start":50,"length":3,"code":2339,"category":1,"messageText":"Property 'foo' does not exist on type 'Result'."}]],4]},"version":"FakeTSVersion"} + +//// [/users/username/projects/project/tsconfig.tsbuildinfo.readable.baseline.txt] +{ + "program": { + "fileNames": [ + "../../../../a/lib/lib.d.ts", + "./node_modules/classnames/index.d.ts", + "./src/index.ts", + "./src/types/classnames.d.ts" + ], + "fileNamesList": [ + [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + [ + "./node_modules/classnames/index.d.ts" + ] + ], + "fileInfos": { + "../../../../a/lib/lib.d.ts": { + "version": "3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "signature": "3858781397-/// \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; }\ninterface ReadonlyArray {}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true + }, + "./node_modules/classnames/index.d.ts": { + "version": "1239706283-export interface Result {} export default function classNames(): Result;", + "signature": "1239706283-export interface Result {} export default function classNames(): Result;" + }, + "./src/index.ts": { + "version": "-5756287633-import classNames from \"classnames\"; classNames().foo;", + "signature": "-3531856636-export {};\n" + }, + "./src/types/classnames.d.ts": { + "version": "-14890340642-export {}; declare module \"classnames\" { interface Result {} }", + "signature": "-14890340642-export {}; declare module \"classnames\" { interface Result {} }" + } + }, + "options": { + "module": 1 + }, + "referencedMap": { + "./src/index.ts": [ + "./node_modules/classnames/index.d.ts", + "./src/types/classnames.d.ts" + ], + "./src/types/classnames.d.ts": [ + "./node_modules/classnames/index.d.ts" + ] + }, + "exportedModulesMap": { + "./src/types/classnames.d.ts": [ + "./node_modules/classnames/index.d.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + "../../../../a/lib/lib.d.ts", + "./node_modules/classnames/index.d.ts", + [ + "./src/index.ts", + [ + { + "file": "./src/index.ts", + "start": 50, + "length": 3, + "code": 2339, + "category": 1, + "messageText": "Property 'foo' does not exist on type 'Result'." + } + ] + ], + "./src/types/classnames.d.ts" + ] + }, + "version": "FakeTSVersion", + "size": 1237 +} +