diff --git a/tsc/internal/checker/checker.go b/tsc/internal/checker/checker.go index 845f62365bb84..642a5dc90b820 100644 --- a/tsc/internal/checker/checker.go +++ b/tsc/internal/checker/checker.go @@ -698,6 +698,7 @@ type Checker struct { ReverseMappedSymbolLinks core.LinkStore[*ast.Symbol, ReverseMappedSymbolLinks] markedAssignmentSymbolLinks core.LinkStore[*ast.Symbol, MarkedAssignmentSymbolLinks] symbolContainerLinks core.LinkStore[*ast.Symbol, ContainingSymbolLinks] + externalModuleContainers *externalModuleContainerIndex sourceFileLinks core.LinkStore[*ast.SourceFile, SourceFileLinks] regExpScanner *scanner.Scanner patternForType map[*Type]*ast.Node @@ -14599,8 +14600,12 @@ func (c *Checker) recordMergedSymbol(target *ast.Symbol, source *ast.Symbol) { c.mergedSymbols[source] = target } +func (c *Checker) getResolvedTarget(symbol *ast.Symbol) *ast.Symbol { + return c.getMergedSymbol(c.resolveSymbol(c.getMergedSymbol(symbol))) +} + func (c *Checker) getSymbolIfSameReference(s1 *ast.Symbol, s2 *ast.Symbol) *ast.Symbol { - if c.getMergedSymbol(c.resolveSymbol(c.getMergedSymbol(s1))) == c.getMergedSymbol(c.resolveSymbol(c.getMergedSymbol(s2))) { + if c.getResolvedTarget(s1) == c.getResolvedTarget(s2) { return s1 } return nil diff --git a/tsc/internal/checker/symbolaccessibility.go b/tsc/internal/checker/symbolaccessibility.go index d19806d50599d..74b2b7824d400 100644 --- a/tsc/internal/checker/symbolaccessibility.go +++ b/tsc/internal/checker/symbolaccessibility.go @@ -1,6 +1,7 @@ package checker import ( + "cmp" "slices" "github.com/microsoft/TypeScript/tsc/internal/ast" @@ -206,21 +207,100 @@ func (c *Checker) getAlternativeContainingModules(symbol *ast.Symbol, enclosingD if links.extendedContainers != nil { return *links.extendedContainers } - // No results from files already being imported by this file - expand search (expensive, but not location-specific, so cached) - otherFiles := c.program.SourceFiles() - for _, file := range otherFiles { + results = c.getExternalModuleContainers(symbol) + links.extendedContainers = &results + return results +} + +type externalModuleContainerIndex struct { + complete bool + containersByTarget map[*ast.Symbol][]*ast.Symbol + moduleOrder map[*ast.Symbol]int +} + +func (index *externalModuleContainerIndex) add(target *ast.Symbol, container *ast.Symbol) { + // Modules are indexed one at a time, so a repeat of this container is always the last entry. + if existing := index.containersByTarget[target]; len(existing) == 0 || existing[len(existing)-1] != container { + index.containersByTarget[target] = append(existing, container) + } +} + +func (c *Checker) getExternalModuleContainers(symbol *ast.Symbol) []*ast.Symbol { + if c.externalModuleContainers == nil { + c.buildExternalModuleContainerIndex() + } + index := c.externalModuleContainers + if !index.complete { + // Re-entered from an alias resolved while building the index; answer this query without it. + return c.scanExternalModuleContainers(symbol) + } + containers := index.containersByTarget[c.getResolvedTarget(symbol)] + parent := c.getParentOfSymbol(symbol) + parentOrder, parentIsModule := index.moduleOrder[parent] + if !parentIsModule { + return containers + } + // The parent module contains the symbol even when the symbol is absent from its exports. + if at, found := slices.BinarySearchFunc(containers, parentOrder, func(container *ast.Symbol, order int) int { + return cmp.Compare(index.moduleOrder[container], order) + }); !found { + return slices.Insert(slices.Clone(containers), at, parent) + } + return containers +} + +func (c *Checker) buildExternalModuleContainerIndex() { + index := &externalModuleContainerIndex{ + containersByTarget: make(map[*ast.Symbol][]*ast.Symbol), + moduleOrder: make(map[*ast.Symbol]int, len(c.program.SourceFiles())), + } + c.externalModuleContainers = index + for _, file := range c.program.SourceFiles() { if !ast.IsExternalModule(file) { continue } - sym := c.getSymbolOfDeclaration(file.AsNode()) - ref := c.getAliasForSymbolInContainer(sym, symbol) - if ref == nil { + container := c.getSymbolOfDeclaration(file.AsNode()) + index.moduleOrder[container] = len(index.moduleOrder) + for _, exported := range c.getExportsOfSymbol(container) { + index.add(c.getResolvedTarget(exported), container) + } + if exportEquals := container.Exports[ast.InternalSymbolNameExportEquals]; exportEquals != nil { + index.add(c.getResolvedTarget(exportEquals), container) + } + } + index.complete = true +} + +func (c *Checker) scanExternalModuleContainers(symbol *ast.Symbol) []*ast.Symbol { + var containers []*ast.Symbol + for _, file := range c.program.SourceFiles() { + if !ast.IsExternalModule(file) { continue } - results = append(results, sym) + if container := c.getSymbolOfDeclaration(file.AsNode()); c.getAliasForSymbolInContainer(container, symbol) != nil { + containers = append(containers, container) + } } - links.extendedContainers = &results - return results + return containers +} + +func (c *Checker) getExportsByTarget(container *ast.Symbol) map[*ast.Symbol][]*ast.Symbol { + links := c.symbolContainerLinks.Get(container) + if links.exportsByTarget == nil { + exports := c.getExportsOfSymbol(container) + byTarget := make(map[*ast.Symbol][]*ast.Symbol, len(exports)) + for _, exported := range exports { + target := c.getResolvedTarget(exported) + byTarget[target] = append(byTarget[target], exported) + } + for _, candidates := range byTarget { + if len(candidates) > 1 { + c.sortSymbols(candidates) // symbol tables are randomly iterated + } + } + links.exportsByTarget = byTarget + } + return links.exportsByTarget } func (c *Checker) getVariableDeclarationOfObjectLiteral(symbol *ast.Symbol, meaning ast.SymbolFlags) *ast.Symbol { @@ -344,27 +424,21 @@ func (c *Checker) getAliasForSymbolInContainer(container *ast.Symbol, symbol *as // fast path, `symbol` is either already the alias or isn't aliased return symbol } + target := c.getResolvedTarget(symbol) // Check if container is a thing with an `export=` which points directly at `symbol`, and if so, return // the container itself as the alias for the symbol if container.Exports != nil { exportEquals, ok := container.Exports[ast.InternalSymbolNameExportEquals] - if ok && exportEquals != nil && c.getSymbolIfSameReference(exportEquals, symbol) != nil { + if ok && exportEquals != nil && c.getResolvedTarget(exportEquals) == target { return container } } exports := c.getExportsOfSymbol(container) quick, ok := exports[symbol.Name] - if ok && quick != nil && c.getSymbolIfSameReference(quick, symbol) != nil { + if ok && quick != nil && c.getResolvedTarget(quick) == target { return quick } - var candidates []*ast.Symbol - for _, exported := range exports { - if c.getSymbolIfSameReference(exported, symbol) != nil { - candidates = append(candidates, exported) - } - } - if len(candidates) > 0 { - c.sortSymbols(candidates) // _must_ sort exports for stable results - symbol table is randomly iterated + if candidates := c.getExportsByTarget(container)[target]; len(candidates) > 0 { return candidates[0] } return nil diff --git a/tsc/internal/checker/types.go b/tsc/internal/checker/types.go index f5a8a37954c85..8c7b5dcf41ae7 100644 --- a/tsc/internal/checker/types.go +++ b/tsc/internal/checker/types.go @@ -337,6 +337,7 @@ type ContainingSymbolLinks struct { extendedContainersByFile map[ast.NodeId][]*ast.Symbol // Symbols of nodes which which logically contain this one, cached by file the request is made within extendedContainers *[]*ast.Symbol // Containers (other than the parent) which this symbol is aliased in accessibleChainCache map[accessibleChainCacheKey][]*ast.Symbol + exportsByTarget map[*ast.Symbol][]*ast.Symbol } type AccessFlags uint32 diff --git a/tsc/internal/execute/incremental/affectedfileshandler.go b/tsc/internal/execute/incremental/affectedfileshandler.go index 73289380cc51d..6e1ac80ab7d29 100644 --- a/tsc/internal/execute/incremental/affectedfileshandler.go +++ b/tsc/internal/execute/incremental/affectedfileshandler.go @@ -2,7 +2,6 @@ package incremental import ( "context" - "maps" "slices" "sync" "sync/atomic" @@ -85,19 +84,17 @@ func (h *affectedFilesHandler) computeDtsSignature(file *ast.SourceFile) string } func (h *affectedFilesHandler) updateShapeSignature(file *ast.SourceFile, useFileVersionAsSignature bool) bool { + info, _ := h.program.snapshot.fileInfos.Load(file.Path()) update := &updatedSignature{} update.mu.Lock() defer update.mu.Unlock() - // If we have cached the result for this file, that means hence forth we should assume file shape is uptodate if existing, ok := h.updatedSignatures.LoadOrStore(file.Path(), update); ok { // Ensure calculations for existing ones are complete before using the value existing.mu.Lock() defer existing.mu.Unlock() - return false + return existing.signature != info.signature } - info, _ := h.program.snapshot.fileInfos.Load(file.Path()) - prevSignature := info.signature // JSON files have no declaration output from which to compute a shape // signature, so use the file version to conservatively invalidate dependents. if !file.IsDeclarationFile && !ast.IsJsonSourceFile(file) && !useFileVersionAsSignature { @@ -108,45 +105,47 @@ func (h *affectedFilesHandler) updateShapeSignature(file *ast.SourceFile, useFil update.signature = info.version update.kind = SignatureUpdateKindUsedVersion } - return update.signature != prevSignature + return update.signature != info.signature } -func (h *affectedFilesHandler) getFilesAffectedBy(path tspath.Path) []*ast.SourceFile { +func (h *affectedFilesHandler) collectFilesAffectedBy(path tspath.Path, wg core.WorkGroup, result *collections.SyncSet[*ast.SourceFile]) { file := h.program.program.GetSourceFileByPath(path) if file == nil { - return nil + return } + result.Add(file) if !h.updateShapeSignature(file, false) { - return []*ast.SourceFile{file} + return } if info, _ := h.program.snapshot.fileInfos.Load(file.Path()); info.affectsGlobalScope { h.hasAllFilesExcludingDefaultLibraryFile.Store(true) - return h.program.snapshot.getAllFilesExcludingDefaultLibraryFile(h.program.program, file) + for _, affectedFile := range h.program.snapshot.getAllFilesExcludingDefaultLibraryFile(h.program.program, file) { + result.Add(affectedFile) + } + return } if h.program.snapshot.options.IsolatedModules.IsTrue() { - return []*ast.SourceFile{file} + return } - // Now we need to if each file in the referencedBy list has a shape change as well. - // Because if so, its own referencedBy files need to be saved as well to make the - // emitting result consistent with files on disk. - seenFileNamesMap := h.forEachFileReferencedBy( - file, - func(currentFile *ast.SourceFile, currentPath tspath.Path) (queueForFile bool, fastReturn bool) { - // If the current file is not nil and has a shape change, we need to queue it for processing - if currentFile != nil && h.updateShapeSignature(currentFile, false) { - return true, false + h.collectReferencingFiles(file, wg, result) +} + +func (h *affectedFilesHandler) collectReferencingFiles(file *ast.SourceFile, wg core.WorkGroup, result *collections.SyncSet[*ast.SourceFile]) { + for path := range h.program.snapshot.referencedMap.getReferencedBy(file.Path()) { + currentFile := h.program.program.GetSourceFileByPath(path) + if currentFile == nil || !result.AddIfAbsent(currentFile) { + continue + } + wg.Queue(func() { + if h.updateShapeSignature(currentFile, false) { + h.collectReferencingFiles(currentFile, wg, result) } - return false, false - }, - ) - // Return array of values that needs emit - return core.Filter(slices.Collect(maps.Values(seenFileNamesMap)), func(file *ast.SourceFile) bool { - return file != nil - }) + }) + } } func (h *affectedFilesHandler) forEachFileReferencedBy(file *ast.SourceFile, fn func(currentFile *ast.SourceFile, currentPath tspath.Path) (queueForFile bool, fastReturn bool)) map[tspath.Path]*ast.SourceFile { @@ -366,9 +365,7 @@ func collectAllAffectedFiles(ctx context.Context, program *Program) { var result collections.SyncSet[*ast.SourceFile] program.snapshot.changedFilesSet.Range(func(file tspath.Path) bool { wg.Queue(func() { - for _, affectedFile := range handler.getFilesAffectedBy(file) { - result.Add(affectedFile) - } + handler.collectFilesAffectedBy(file, wg, &result) }) return true }) diff --git a/tsc/internal/execute/incremental/affectedfileshandler_internal_test.go b/tsc/internal/execute/incremental/affectedfileshandler_internal_test.go new file mode 100644 index 0000000000000..094344a8a9780 --- /dev/null +++ b/tsc/internal/execute/incremental/affectedfileshandler_internal_test.go @@ -0,0 +1,66 @@ +package incremental + +import ( + "testing" + + "github.com/microsoft/TypeScript/tsc/internal/ast" + "github.com/microsoft/TypeScript/tsc/internal/bundled" + "github.com/microsoft/TypeScript/tsc/internal/collections" + "github.com/microsoft/TypeScript/tsc/internal/compiler" + "github.com/microsoft/TypeScript/tsc/internal/core" + "github.com/microsoft/TypeScript/tsc/internal/tsoptions" + "github.com/microsoft/TypeScript/tsc/internal/vfs/vfstest" + "gotest.tools/v3/assert" +) + +func TestUpdateShapeSignatureCachedResult(t *testing.T) { + t.Parallel() + if !bundled.Embedded { + t.Skip("bundled files are not embedded") + } + fs := bundled.WrapFS(vfstest.FromMap(map[string]string{ + "/tsconfig.json": `{"compilerOptions":{"strict":true,"noEmit":true,"incremental":true,"skipLibCheck":true}}`, + "/a.ts": `export const a = 1;`, + "/b.ts": `import { a } from "./a"; export const b = a; declare global { interface Window { fromB: string; } }`, + "/c.ts": `export const c = window.fromB;`, + "/d.ts": `import { b } from "./b"; export const d = 2;`, + }, true)) + build := func(old *Program) *Program { + host := compiler.NewCompilerHost("/", fs, bundled.LibPath(), nil, nil, nil) + config, diagnostics := tsoptions.GetParsedCommandLineOfConfigFile("/tsconfig.json", &core.CompilerOptions{}, nil, host, nil) + assert.Equal(t, len(diagnostics), 0) + if old == nil { + old = ReadBuildInfoProgram(config, NewBuildInfoReader(host), host) + } + return NewProgram(compiler.NewProgram(compiler.ProgramOptions{Config: config, Host: host}), old, CreateHost(host), nil, false) + } + check := func() { + program := build(nil) + assert.Equal(t, len(program.GetSemanticDiagnostics(t.Context(), nil)), 0) + assert.Equal(t, len(program.Emit(t.Context(), compiler.EmitOptions{}).Diagnostics), 0) + } + check() + // A rebuild replaces the version-based signatures of a, b and d with computed ones. + assert.NilError(t, fs.AppendFile("/a.ts", "\n// edit\n")) + check() + + assert.NilError(t, fs.WriteFile("/a.ts", `export const a = "changed";`)) + assert.NilError(t, fs.AppendFile("/b.ts", "\n// edit\n")) + program := build(nil) + h := affectedFilesHandler{ctx: t.Context(), program: program} + b := program.program.GetSourceFile("/b.ts") + c := program.program.GetSourceFile("/c.ts") + d := program.program.GetSourceFile("/d.ts") + + assert.Assert(t, h.updateShapeSignature(b, false)) + assert.Assert(t, h.updateShapeSignature(b, false), "cached result must still report the changed signature") + assert.Assert(t, !h.updateShapeSignature(d, false)) + assert.Assert(t, !h.updateShapeSignature(d, false)) + + wg := core.NewWorkGroup(true) + var result collections.SyncSet[*ast.SourceFile] + wg.Queue(func() { h.collectFilesAffectedBy(b.Path(), wg, &result) }) + wg.RunAndWait() + assert.Assert(t, h.hasAllFilesExcludingDefaultLibraryFile.Load(), "global-scope invalidation must not depend on which traversal computed the signature") + assert.Assert(t, result.Has(c)) +} diff --git a/tsc/internal/execute/incremental/affectedfileshandler_test.go b/tsc/internal/execute/incremental/affectedfileshandler_test.go new file mode 100644 index 0000000000000..b6ab2b851a825 --- /dev/null +++ b/tsc/internal/execute/incremental/affectedfileshandler_test.go @@ -0,0 +1,60 @@ +package incremental_test + +import ( + "fmt" + "strings" + "testing" + + "github.com/microsoft/TypeScript/tsc/internal/bundled" + "github.com/microsoft/TypeScript/tsc/internal/compiler" + "github.com/microsoft/TypeScript/tsc/internal/core" + "github.com/microsoft/TypeScript/tsc/internal/execute/incremental" + "github.com/microsoft/TypeScript/tsc/internal/tsoptions" + "github.com/microsoft/TypeScript/tsc/internal/vfs/vfstest" + "gotest.tools/v3/assert" +) + +func BenchmarkFirstIncrementalRebuild(b *testing.B) { + if !bundled.Embedded { + b.Skip("bundled files are not embedded") + } + for _, leaves := range []int{200, 1000} { + b.Run(fmt.Sprintf("leaves=%d", leaves), func(b *testing.B) { + files := map[string]string{ + "/src/hub.ts": `export const prefix = "hub";`, + "/tsconfig.json": `{"compilerOptions":{"strict":true,"noEmit":true,"incremental":true,"skipLibCheck":true,"module":"esnext","moduleResolution":"bundler"}}`, + } + var factories, exports strings.Builder + for i := range leaves / 2 { + files[fmt.Sprintf("/src/types/t%d.ts", i)] = fmt.Sprintf(`export interface Model%d { id: string; value%d: number; } export function make%d(id: string): Model%d { return { id, value%d: %d }; }`, i, i, i, i, i, i) + fmt.Fprintf(&factories, "export { make%d } from './t%d';\n", i, i) + } + files["/src/types/index.ts"] = factories.String() + for i := range leaves { + a, other := i%(leaves/2), (i*7+3)%(leaves/2) + files[fmt.Sprintf("/src/leaves/l%d.ts", i)] = fmt.Sprintf(`import { prefix } from "../hub"; import { make%d, make%d } from "../types"; export const leaf%d = { first: make%d(prefix), second: make%d("%d") };`, a, other, i, a, other, i) + fmt.Fprintf(&exports, "export * from './leaves/l%d';\n", i) + } + files["/src/index.ts"] = exports.String() + fs := bundled.WrapFS(vfstest.FromMap(files, true)) + newHost := func() compiler.CompilerHost { + return compiler.NewCompilerHost("/", fs, bundled.LibPath(), nil, nil, nil) + } + host := newHost() + config, diagnostics := tsoptions.GetParsedCommandLineOfConfigFile("/tsconfig.json", &core.CompilerOptions{}, nil, host, nil) + assert.Equal(b, len(diagnostics), 0) + program := incremental.NewProgram(compiler.NewProgram(compiler.ProgramOptions{Config: config, Host: host}), nil, incremental.CreateHost(host), nil, false) + assert.Equal(b, len(program.GetSemanticDiagnostics(b.Context(), nil)), 0) + assert.Equal(b, len(program.Emit(b.Context(), compiler.EmitOptions{}).Diagnostics), 0) + assert.NilError(b, fs.AppendFile("/src/hub.ts", "\n// comment only edit\n")) + b.ReportAllocs() + for b.Loop() { + host := newHost() + oldProgram := incremental.ReadBuildInfoProgram(config, incremental.NewBuildInfoReader(host), host) + assert.Assert(b, oldProgram != nil) + program := incremental.NewProgram(compiler.NewProgram(compiler.ProgramOptions{Config: config, Host: host}), oldProgram, incremental.CreateHost(host), nil, false) + assert.Equal(b, len(program.GetSemanticDiagnostics(b.Context(), nil)), 0) + } + }) + } +} diff --git a/tsc/internal/execute/tsctests/tsc_test.go b/tsc/internal/execute/tsctests/tsc_test.go index 489de77659c33..8492bf0fac85a 100644 --- a/tsc/internal/execute/tsctests/tsc_test.go +++ b/tsc/internal/execute/tsctests/tsc_test.go @@ -1432,6 +1432,57 @@ func TestTscIncremental(t *testing.T) { }, } } + getSharedDependencyTest := func(commandLineArgs []string) *tscInput { + const project = "/home/src/workspaces/project/" + return &tscInput{ + subScenario: "shared dependency with inferred types", + commandLineArgs: commandLineArgs, + files: FileMap{ + project + "tsconfig.json": `{"compilerOptions":{"strict":true,"noEmit":true,"incremental":true}}`, + project + "hub.ts": `export const prefix = "hub";`, + project + "model.ts": `export interface Model { id: string; } export function make(id: string): Model { return { id }; }`, + project + "factory.ts": `export { make } from "./model";`, + project + "left.ts": `import { prefix } from "./hub"; import { make } from "./factory"; export const left = make(prefix); export { right } from "./right";`, + project + "right.ts": `import { prefix } from "./hub"; import { make } from "./factory"; export const right = make(prefix); export { left } from "./left";`, + project + "barrel.ts": `export { left } from "./left"; export { right } from "./right";`, + project + "index.ts": `import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id];`, + }, + edits: []*tscEdit{ + noChange, + { + caption: "first comment only edit", + edit: func(sys *TestSys) { + sys.appendFile(project+"hub.ts", "\n// first edit\n") + }, + }, + { + caption: "second comment only edit", + edit: func(sys *TestSys) { + sys.appendFile(project+"hub.ts", "\n// second edit\n") + }, + }, + { + caption: "change the shared value type", + edit: func(sys *TestSys) { + sys.replaceFileText(project+"hub.ts", `"hub"`, "10") + }, + }, + { + caption: "change the inferred type through the barrel", + edit: func(sys *TestSys) { + sys.writeFileNoError(project+"model.ts", `export interface Model { id: number; } export function make(id: number): Model { return { id }; }`) + }, + }, + { + caption: "restore both shared dependencies", + edit: func(sys *TestSys) { + sys.replaceFileText(project+"hub.ts", "10", `"hub"`) + sys.writeFileNoError(project+"model.ts", `export interface Model { id: string; } export function make(id: string): Model { return { id }; }`) + }, + }, + }, + } + } testCases := []*tscInput{ { subScenario: "serializing error chain", @@ -2421,6 +2472,8 @@ func TestTscIncremental(t *testing.T) { }, }, }, + getSharedDependencyTest(nil), + getSharedDependencyTest([]string{"--watch"}), } for _, test := range testCases { diff --git a/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.js b/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.js new file mode 100644 index 0000000000000..b926a83b61144 --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.js @@ -0,0 +1,94 @@ +//// [tests/cases/compiler/declarationEmitAlternativeContainingModules.ts] //// + +//// [model.ts] +export interface Model { value: string; } +export function make(): Model { return { value: "" }; } + +//// [factory.ts] +export { make } from "./model"; + +//// [aliases.ts] +export { Model as First, Model as Second } from "./model"; + +//// [preferred.ts] +export { Model, Model as Renamed } from "./model"; + +//// [star.ts] +export * from "./aliases"; + +//// [direct.ts] +import { make } from "./factory"; +export const direct = make(); +export const repeated = make(); + +//// [renamed.ts] +import { make } from "./factory"; +import * as aliases from "./aliases"; +export const renamed = make(); + +//// [sameName.ts] +import { make } from "./factory"; +import * as preferred from "./preferred"; +export const sameName = make(); + +//// [starred.ts] +import { make } from "./factory"; +import * as star from "./star"; +export const starred = make(); + +//// [exported.ts] +import { Model } from "./model"; +export = Model; + +//// [exportEquals.ts] +import { make } from "./factory"; +import Model = require("./exported"); +export const exportEquals = make(); + +//// [index.ts] +export { direct, repeated } from "./direct"; +export { renamed } from "./renamed"; +export { sameName } from "./sameName"; +export { starred } from "./starred"; +export { exportEquals } from "./exportEquals"; + + + + +//// [model.d.ts] +export interface Model { + value: string; +} +export declare function make(): Model; +//// [factory.d.ts] +export { make } from "./model"; +//// [aliases.d.ts] +export { Model as First, Model as Second } from "./model"; +//// [preferred.d.ts] +export { Model, Model as Renamed } from "./model"; +//// [star.d.ts] +export * from "./aliases"; +//// [direct.d.ts] +export declare const direct: import("./model").Model; +export declare const repeated: import("./model").Model; +//// [renamed.d.ts] +import * as aliases from "./aliases"; +export declare const renamed: aliases.First; +//// [sameName.d.ts] +import * as preferred from "./preferred"; +export declare const sameName: preferred.Model; +//// [starred.d.ts] +import * as star from "./star"; +export declare const starred: star.First; +//// [exported.d.ts] +import { Model } from "./model"; +export = Model; +//// [exportEquals.d.ts] +import Model = require("./exported"); +export declare const exportEquals: Model; +//// [index.d.ts] +export { direct, repeated } from "./direct"; +export { renamed } from "./renamed"; +export { sameName } from "./sameName"; +export { starred } from "./starred"; +export { exportEquals } from "./exportEquals"; diff --git a/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.symbols b/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.symbols new file mode 100644 index 0000000000000..9b5dd1b73629c --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.symbols @@ -0,0 +1,113 @@ +//// [tests/cases/compiler/declarationEmitAlternativeContainingModules.ts] //// + +=== model.ts === +export interface Model { value: string; } +>Model : Symbol(Model, Decl(model.ts, 0, 0)) +>value : Symbol(Model.value, Decl(model.ts, 0, 24)) + +export function make(): Model { return { value: "" }; } +>make : Symbol(make, Decl(model.ts, 0, 41)) +>Model : Symbol(Model, Decl(model.ts, 0, 0)) +>value : Symbol(value, Decl(model.ts, 1, 40)) + +=== factory.ts === +export { make } from "./model"; +>make : Symbol(make, Decl(factory.ts, 0, 8)) + +=== aliases.ts === +export { Model as First, Model as Second } from "./model"; +>Model : Symbol(Model, Decl(model.ts, 0, 0)) +>First : Symbol(First, Decl(aliases.ts, 0, 8)) +>Model : Symbol(Model, Decl(model.ts, 0, 0)) +>Second : Symbol(Second, Decl(aliases.ts, 0, 24)) + +=== preferred.ts === +export { Model, Model as Renamed } from "./model"; +>Model : Symbol(Model, Decl(preferred.ts, 0, 8)) +>Model : Symbol(Model, Decl(model.ts, 0, 0)) +>Renamed : Symbol(Renamed, Decl(preferred.ts, 0, 15)) + +=== star.ts === + +export * from "./aliases"; + +=== direct.ts === +import { make } from "./factory"; +>make : Symbol(make, Decl(direct.ts, 0, 8)) + +export const direct = make(); +>direct : Symbol(direct, Decl(direct.ts, 1, 12)) +>make : Symbol(make, Decl(direct.ts, 0, 8)) + +export const repeated = make(); +>repeated : Symbol(repeated, Decl(direct.ts, 2, 12)) +>make : Symbol(make, Decl(direct.ts, 0, 8)) + +=== renamed.ts === +import { make } from "./factory"; +>make : Symbol(make, Decl(renamed.ts, 0, 8)) + +import * as aliases from "./aliases"; +>aliases : Symbol(aliases, Decl(renamed.ts, 1, 6)) + +export const renamed = make(); +>renamed : Symbol(renamed, Decl(renamed.ts, 2, 12)) +>make : Symbol(make, Decl(renamed.ts, 0, 8)) + +=== sameName.ts === +import { make } from "./factory"; +>make : Symbol(make, Decl(sameName.ts, 0, 8)) + +import * as preferred from "./preferred"; +>preferred : Symbol(preferred, Decl(sameName.ts, 1, 6)) + +export const sameName = make(); +>sameName : Symbol(sameName, Decl(sameName.ts, 2, 12)) +>make : Symbol(make, Decl(sameName.ts, 0, 8)) + +=== starred.ts === +import { make } from "./factory"; +>make : Symbol(make, Decl(starred.ts, 0, 8)) + +import * as star from "./star"; +>star : Symbol(star, Decl(starred.ts, 1, 6)) + +export const starred = make(); +>starred : Symbol(starred, Decl(starred.ts, 2, 12)) +>make : Symbol(make, Decl(starred.ts, 0, 8)) + +=== exported.ts === +import { Model } from "./model"; +>Model : Symbol(Model, Decl(exported.ts, 0, 8)) + +export = Model; +>Model : Symbol(Model, Decl(exported.ts, 0, 8)) + +=== exportEquals.ts === +import { make } from "./factory"; +>make : Symbol(make, Decl(exportEquals.ts, 0, 8)) + +import Model = require("./exported"); +>Model : Symbol(Model, Decl(exportEquals.ts, 0, 33)) + +export const exportEquals = make(); +>exportEquals : Symbol(exportEquals, Decl(exportEquals.ts, 2, 12)) +>make : Symbol(make, Decl(exportEquals.ts, 0, 8)) + +=== index.ts === +export { direct, repeated } from "./direct"; +>direct : Symbol(direct, Decl(index.ts, 0, 8)) +>repeated : Symbol(repeated, Decl(index.ts, 0, 16)) + +export { renamed } from "./renamed"; +>renamed : Symbol(renamed, Decl(index.ts, 1, 8)) + +export { sameName } from "./sameName"; +>sameName : Symbol(sameName, Decl(index.ts, 2, 8)) + +export { starred } from "./starred"; +>starred : Symbol(starred, Decl(index.ts, 3, 8)) + +export { exportEquals } from "./exportEquals"; +>exportEquals : Symbol(exportEquals, Decl(index.ts, 4, 8)) + diff --git a/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.types b/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.types new file mode 100644 index 0000000000000..4b4fd897e88ae --- /dev/null +++ b/tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.types @@ -0,0 +1,119 @@ +//// [tests/cases/compiler/declarationEmitAlternativeContainingModules.ts] //// + +=== model.ts === +export interface Model { value: string; } +>value : string + +export function make(): Model { return { value: "" }; } +>make : () => Model +>{ value: "" } : { value: string; } +>value : string +>"" : "" + +=== factory.ts === +export { make } from "./model"; +>make : () => import("./model").Model + +=== aliases.ts === +export { Model as First, Model as Second } from "./model"; +>Model : any +>First : any +>Model : any +>Second : any + +=== preferred.ts === +export { Model, Model as Renamed } from "./model"; +>Model : any +>Model : any +>Renamed : any + +=== star.ts === + +export * from "./aliases"; + +=== direct.ts === +import { make } from "./factory"; +>make : () => import("./model").Model + +export const direct = make(); +>direct : import("./model").Model +>make() : import("./model").Model +>make : () => import("./model").Model + +export const repeated = make(); +>repeated : import("./model").Model +>make() : import("./model").Model +>make : () => import("./model").Model + +=== renamed.ts === +import { make } from "./factory"; +>make : () => aliases.First + +import * as aliases from "./aliases"; +>aliases : typeof aliases + +export const renamed = make(); +>renamed : aliases.First +>make() : aliases.First +>make : () => aliases.First + +=== sameName.ts === +import { make } from "./factory"; +>make : () => preferred.Model + +import * as preferred from "./preferred"; +>preferred : typeof preferred + +export const sameName = make(); +>sameName : preferred.Model +>make() : preferred.Model +>make : () => preferred.Model + +=== starred.ts === +import { make } from "./factory"; +>make : () => star.First + +import * as star from "./star"; +>star : typeof star + +export const starred = make(); +>starred : star.First +>make() : star.First +>make : () => star.First + +=== exported.ts === +import { Model } from "./model"; +>Model : any + +export = Model; +>Model : Model + +=== exportEquals.ts === +import { make } from "./factory"; +>make : () => Model + +import Model = require("./exported"); +>Model : any + +export const exportEquals = make(); +>exportEquals : Model +>make() : Model +>make : () => Model + +=== index.ts === +export { direct, repeated } from "./direct"; +>direct : import("./model").Model +>repeated : import("./model").Model + +export { renamed } from "./renamed"; +>renamed : import("./model").Model + +export { sameName } from "./sameName"; +>sameName : import("./model").Model + +export { starred } from "./starred"; +>starred : import("./model").Model + +export { exportEquals } from "./exportEquals"; +>exportEquals : import("./model").Model + diff --git a/tsc/testdata/baselines/reference/tsc/incremental/shared-dependency-with-inferred-types.js b/tsc/testdata/baselines/reference/tsc/incremental/shared-dependency-with-inferred-types.js new file mode 100644 index 0000000000000..9e0b542b0cd99 --- /dev/null +++ b/tsc/testdata/baselines/reference/tsc/incremental/shared-dependency-with-inferred-types.js @@ -0,0 +1,1450 @@ +currentDirectory::/home/src/workspaces/project +useCaseSensitiveFileNames::true +Input:: +//// [/home/src/workspaces/project/barrel.ts] *new* +export { left } from "./left"; export { right } from "./right"; +//// [/home/src/workspaces/project/factory.ts] *new* +export { make } from "./model"; +//// [/home/src/workspaces/project/hub.ts] *new* +export const prefix = "hub"; +//// [/home/src/workspaces/project/index.ts] *new* +import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id]; +//// [/home/src/workspaces/project/left.ts] *new* +import { prefix } from "./hub"; import { make } from "./factory"; export const left = make(prefix); export { right } from "./right"; +//// [/home/src/workspaces/project/model.ts] *new* +export interface Model { id: string; } export function make(id: string): Model { return { id }; } +//// [/home/src/workspaces/project/right.ts] *new* +import { prefix } from "./hub"; import { make } from "./factory"; export const right = make(prefix); export { left } from "./left"; +//// [/home/src/workspaces/project/tsconfig.json] *new* +{"compilerOptions":{"strict":true,"noEmit":true,"incremental":true}} + +tsgo +ExitStatus:: Success +Output:: +//// [/home/src/tslibs/TS/Lib/lib.es2025.full.d.ts] *Lib* +/// +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 {} +interface SymbolConstructor { + (desc?: string | number): symbol; + for(name: string): symbol; + readonly toStringTag: symbol; +} +declare var Symbol: SymbolConstructor; +interface Symbol { + readonly [Symbol.toStringTag]: string; +} +declare const console: { log(msg: any): void; }; +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *new* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},"e69fd43859d508fe2d52ada7fe216c06-export const prefix = \"hub\";","c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","8c035626178906db4f73ee993640fecd-export { make } from \"./model\";","07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];"],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *new* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "e69fd43859d508fe2d52ada7fe216c06-export const prefix = \"hub\";", + "signature": "e69fd43859d508fe2d52ada7fe216c06-export const prefix = \"hub\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "impliedNodeFormat": "CommonJS" + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 1962 +} + +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/tslibs/TS/Lib/lib.es2025.full.d.ts +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/model.ts +*refresh* /home/src/workspaces/project/factory.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: + + +Edit [0]:: no change + +tsgo +ExitStatus:: Success +Output:: + +tsconfig.json:: +SemanticDiagnostics:: +Signatures:: + + +Edit [1]:: first comment only edit +//// [/home/src/workspaces/project/hub.ts] *modified* +export const prefix = "hub"; +// first edit + + +tsgo +ExitStatus:: Success +Output:: +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0cc5c48d027554ce2074931a1f2ea370-export const prefix = \"hub\";\n// first edit\n","signature":"eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n","impliedNodeFormat":1},"c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","8c035626178906db4f73ee993640fecd-export { make } from \"./model\";",{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},{"version":"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","signature":"f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n","impliedNodeFormat":1},{"version":"3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];","signature":"17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n","impliedNodeFormat":1}],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "0cc5c48d027554ce2074931a1f2ea370-export const prefix = \"hub\";\n// first edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "0cc5c48d027554ce2074931a1f2ea370-export const prefix = \"hub\";\n// first edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n", + "impliedNodeFormat": 1 + } + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 2717 +} + +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/hub.ts +(computed .d.ts) /home/src/workspaces/project/right.ts +(computed .d.ts) /home/src/workspaces/project/left.ts +(computed .d.ts) /home/src/workspaces/project/barrel.ts +(computed .d.ts) /home/src/workspaces/project/index.ts + + +Edit [2]:: second comment only edit +//// [/home/src/workspaces/project/hub.ts] *modified* +export const prefix = "hub"; +// first edit + +// second edit + + +tsgo +ExitStatus:: Success +Output:: +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n","signature":"eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n","impliedNodeFormat":1},"c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","8c035626178906db4f73ee993640fecd-export { make } from \"./model\";",{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},{"version":"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","signature":"f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n","impliedNodeFormat":1},{"version":"3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];","signature":"17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n","impliedNodeFormat":1}],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n", + "impliedNodeFormat": 1 + } + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 2735 +} + +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/hub.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/hub.ts + + +Edit [3]:: change the shared value type +//// [/home/src/workspaces/project/hub.ts] *modified* +export const prefix = 10; +// first edit + +// second edit + + +tsgo +ExitStatus:: DiagnosticsPresent_OutputsGenerated +Output:: +left.ts:1:92 - error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. + +1 import { prefix } from "./hub"; import { make } from "./factory"; export const left = make(prefix); export { right } from "./right"; +   ~~~~~~ + +right.ts:1:93 - error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. + +1 import { prefix } from "./hub"; import { make } from "./factory"; export const right = make(prefix); export { left } from "./left"; +   ~~~~~~ + + +Found 2 errors in 2 files. + +Errors Files + 1 left.ts:1 + 1 right.ts:1 + +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n","signature":"a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n","impliedNodeFormat":1},"c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","8c035626178906db4f73ee993640fecd-export { make } from \"./model\";",{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];"],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"semanticDiagnosticsPerFile":[[5,[{"pos":92,"end":98,"code":2345,"category":1,"messageKey":"Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345","messageArgs":["number","string"]}]],[6,[{"pos":91,"end":97,"code":2345,"category":1,"messageKey":"Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345","messageArgs":["number","string"]}]]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n", + "signature": "a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n", + "signature": "a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "impliedNodeFormat": "CommonJS" + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + [ + "./right.ts", + [ + { + "pos": 92, + "end": 98, + "code": 2345, + "category": 1, + "messageKey": "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345", + "messageArgs": [ + "number", + "string" + ] + } + ] + ], + [ + "./left.ts", + [ + { + "pos": 91, + "end": 97, + "code": 2345, + "category": 1, + "messageKey": "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345", + "messageArgs": [ + "number", + "string" + ] + } + ] + ] + ], + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 2815 +} + +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/hub.ts +(computed .d.ts) /home/src/workspaces/project/right.ts +(computed .d.ts) /home/src/workspaces/project/left.ts +(used version) /home/src/workspaces/project/barrel.ts +(used version) /home/src/workspaces/project/index.ts + + +Edit [4]:: change the inferred type through the barrel +//// [/home/src/workspaces/project/model.ts] *modified* +export interface Model { id: number; } export function make(id: number): Model { return { id }; } + +tsgo +ExitStatus:: DiagnosticsPresent_OutputsGenerated +Output:: +index.ts:1:71 - error TS2322: Type 'number' is not assignable to type 'string'. + +1 import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id]; +   ~~~~~~~ + +index.ts:1:80 - error TS2322: Type 'number' is not assignable to type 'string'. + +1 import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id]; +   ~~~~~~~~ + + +Found 2 errors in the same file, starting at: index.ts:1 + +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n","signature":"a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n","impliedNodeFormat":1},{"version":"a5bcf1db41c7b2b195764099f803185d-export interface Model { id: number; } export function make(id: number): Model { return { id }; }","signature":"755c74df06b876a52b12daa9bd085134-export interface Model {\n id: number;\n}\nexport declare function make(id: number): Model;\n","impliedNodeFormat":1},{"version":"8c035626178906db4f73ee993640fecd-export { make } from \"./model\";","signature":"8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n","impliedNodeFormat":1},{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];"],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"semanticDiagnosticsPerFile":[[8,[{"pos":70,"end":77,"code":2322,"category":1,"messageKey":"Type_0_is_not_assignable_to_type_1_2322","messageArgs":["number","string"]},{"pos":79,"end":87,"code":2322,"category":1,"messageKey":"Type_0_is_not_assignable_to_type_1_2322","messageArgs":["number","string"]}]]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n", + "signature": "a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n", + "signature": "a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "a5bcf1db41c7b2b195764099f803185d-export interface Model { id: number; } export function make(id: number): Model { return { id }; }", + "signature": "755c74df06b876a52b12daa9bd085134-export interface Model {\n id: number;\n}\nexport declare function make(id: number): Model;\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "a5bcf1db41c7b2b195764099f803185d-export interface Model { id: number; } export function make(id: number): Model { return { id }; }", + "signature": "755c74df06b876a52b12daa9bd085134-export interface Model {\n id: number;\n}\nexport declare function make(id: number): Model;\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "impliedNodeFormat": "CommonJS" + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + [ + "./index.ts", + [ + { + "pos": 70, + "end": 77, + "code": 2322, + "category": 1, + "messageKey": "Type_0_is_not_assignable_to_type_1_2322", + "messageArgs": [ + "number", + "string" + ] + }, + { + "pos": 79, + "end": 87, + "code": 2322, + "category": 1, + "messageKey": "Type_0_is_not_assignable_to_type_1_2322", + "messageArgs": [ + "number", + "string" + ] + } + ] + ] + ], + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 3054 +} + +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/model.ts +*refresh* /home/src/workspaces/project/factory.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/model.ts +(computed .d.ts) /home/src/workspaces/project/factory.ts +(computed .d.ts) /home/src/workspaces/project/right.ts +(computed .d.ts) /home/src/workspaces/project/left.ts +(used version) /home/src/workspaces/project/barrel.ts +(used version) /home/src/workspaces/project/index.ts + + +Edit [5]:: restore both shared dependencies +//// [/home/src/workspaces/project/hub.ts] *modified* +export const prefix = "hub"; +// first edit + +// second edit + +//// [/home/src/workspaces/project/model.ts] *modified* +export interface Model { id: string; } export function make(id: string): Model { return { id }; } + +tsgo +ExitStatus:: Success +Output:: +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n","signature":"eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n","impliedNodeFormat":1},{"version":"c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","signature":"c7653311ee886021d70d18d464ff2d71-export interface Model {\n id: string;\n}\nexport declare function make(id: string): Model;\n","impliedNodeFormat":1},{"version":"8c035626178906db4f73ee993640fecd-export { make } from \"./model\";","signature":"8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n","impliedNodeFormat":1},{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];"],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c7653311ee886021d70d18d464ff2d71-export interface Model {\n id: string;\n}\nexport declare function make(id: string): Model;\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c7653311ee886021d70d18d464ff2d71-export interface Model {\n id: string;\n}\nexport declare function make(id: string): Model;\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "impliedNodeFormat": "CommonJS" + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 2759 +} + +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/model.ts +*refresh* /home/src/workspaces/project/factory.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/hub.ts +(computed .d.ts) /home/src/workspaces/project/model.ts +(computed .d.ts) /home/src/workspaces/project/factory.ts +(computed .d.ts) /home/src/workspaces/project/right.ts +(computed .d.ts) /home/src/workspaces/project/left.ts +(used version) /home/src/workspaces/project/barrel.ts +(used version) /home/src/workspaces/project/index.ts diff --git a/tsc/testdata/baselines/reference/tscWatch/incremental/shared-dependency-with-inferred-types.js b/tsc/testdata/baselines/reference/tscWatch/incremental/shared-dependency-with-inferred-types.js new file mode 100644 index 0000000000000..e45d3e5e216fd --- /dev/null +++ b/tsc/testdata/baselines/reference/tscWatch/incremental/shared-dependency-with-inferred-types.js @@ -0,0 +1,1504 @@ +currentDirectory::/home/src/workspaces/project +useCaseSensitiveFileNames::true +Input:: +//// [/home/src/workspaces/project/barrel.ts] *new* +export { left } from "./left"; export { right } from "./right"; +//// [/home/src/workspaces/project/factory.ts] *new* +export { make } from "./model"; +//// [/home/src/workspaces/project/hub.ts] *new* +export const prefix = "hub"; +//// [/home/src/workspaces/project/index.ts] *new* +import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id]; +//// [/home/src/workspaces/project/left.ts] *new* +import { prefix } from "./hub"; import { make } from "./factory"; export const left = make(prefix); export { right } from "./right"; +//// [/home/src/workspaces/project/model.ts] *new* +export interface Model { id: string; } export function make(id: string): Model { return { id }; } +//// [/home/src/workspaces/project/right.ts] *new* +import { prefix } from "./hub"; import { make } from "./factory"; export const right = make(prefix); export { left } from "./left"; +//// [/home/src/workspaces/project/tsconfig.json] *new* +{"compilerOptions":{"strict":true,"noEmit":true,"incremental":true}} + +tsgo --watch +ExitStatus:: Success +Output:: +[HH:MM:SS AM] Starting compilation in watch mode... + +[HH:MM:SS AM] Found 0 errors. Watching for file changes. + +//// [/home/src/tslibs/TS/Lib/lib.es2025.full.d.ts] *Lib* +/// +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 {} +interface SymbolConstructor { + (desc?: string | number): symbol; + for(name: string): symbol; + readonly toStringTag: symbol; +} +declare var Symbol: SymbolConstructor; +interface Symbol { + readonly [Symbol.toStringTag]: string; +} +declare const console: { log(msg: any): void; }; +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *new* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},"e69fd43859d508fe2d52ada7fe216c06-export const prefix = \"hub\";","c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","8c035626178906db4f73ee993640fecd-export { make } from \"./model\";","07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];"],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *new* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "e69fd43859d508fe2d52ada7fe216c06-export const prefix = \"hub\";", + "signature": "e69fd43859d508fe2d52ada7fe216c06-export const prefix = \"hub\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "impliedNodeFormat": "CommonJS" + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 1962 +} + +Watch Registrations:: +Directory watches:: + /home/src/tslibs/TS/Lib + /home/src/workspaces/project (recursive) +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/tslibs/TS/Lib/lib.es2025.full.d.ts +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/model.ts +*refresh* /home/src/workspaces/project/factory.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: + + +Edit [0]:: no change + + +Output:: + +Watch Registrations:: +Directory watches:: + /home/src/tslibs/TS/Lib + /home/src/workspaces/project (recursive) +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/tslibs/TS/Lib/lib.es2025.full.d.ts +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/model.ts +*refresh* /home/src/workspaces/project/factory.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: + + +Edit [1]:: first comment only edit +//// [/home/src/workspaces/project/hub.ts] *modified* +export const prefix = "hub"; +// first edit + + + +Output:: +[HH:MM:SS AM] File change detected. Starting incremental compilation... + +[HH:MM:SS AM] Found 0 errors. Watching for file changes. + +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"0cc5c48d027554ce2074931a1f2ea370-export const prefix = \"hub\";\n// first edit\n","signature":"eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n","impliedNodeFormat":1},"c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","8c035626178906db4f73ee993640fecd-export { make } from \"./model\";",{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},{"version":"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","signature":"f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n","impliedNodeFormat":1},{"version":"3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];","signature":"17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n","impliedNodeFormat":1}],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "0cc5c48d027554ce2074931a1f2ea370-export const prefix = \"hub\";\n// first edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "0cc5c48d027554ce2074931a1f2ea370-export const prefix = \"hub\";\n// first edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n", + "impliedNodeFormat": 1 + } + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 2717 +} + +Watch Registrations:: +Directory watches:: + /home/src/tslibs/TS/Lib + /home/src/workspaces/project (recursive) +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/hub.ts +(computed .d.ts) /home/src/workspaces/project/right.ts +(computed .d.ts) /home/src/workspaces/project/left.ts +(computed .d.ts) /home/src/workspaces/project/barrel.ts +(computed .d.ts) /home/src/workspaces/project/index.ts + + +Edit [2]:: second comment only edit +//// [/home/src/workspaces/project/hub.ts] *modified* +export const prefix = "hub"; +// first edit + +// second edit + + + +Output:: +[HH:MM:SS AM] File change detected. Starting incremental compilation... + +[HH:MM:SS AM] Found 0 errors. Watching for file changes. + +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n","signature":"eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n","impliedNodeFormat":1},"c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","8c035626178906db4f73ee993640fecd-export { make } from \"./model\";",{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},{"version":"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","signature":"f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n","impliedNodeFormat":1},{"version":"3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];","signature":"17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n","impliedNodeFormat":1}],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "f614ffe60290b2d15ae0fd0b4ce7ba1d-export { left } from \"./left\";\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "17897b95b5d22b2e69f98a20dfe4df48-export declare const ids: string[];\n", + "impliedNodeFormat": 1 + } + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 2735 +} + +Watch Registrations:: +Directory watches:: + /home/src/tslibs/TS/Lib + /home/src/workspaces/project (recursive) +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/hub.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/hub.ts + + +Edit [3]:: change the shared value type +//// [/home/src/workspaces/project/hub.ts] *modified* +export const prefix = 10; +// first edit + +// second edit + + + +Output:: +[HH:MM:SS AM] File change detected. Starting incremental compilation... + +left.ts:1:92 - error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. + +1 import { prefix } from "./hub"; import { make } from "./factory"; export const left = make(prefix); export { right } from "./right"; +   ~~~~~~ + +right.ts:1:93 - error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. + +1 import { prefix } from "./hub"; import { make } from "./factory"; export const right = make(prefix); export { left } from "./left"; +   ~~~~~~ + + +Found 2 errors in 2 files. + +Errors Files + 1 left.ts:1 + 1 right.ts:1 + +[HH:MM:SS AM] Found 2 errors. Watching for file changes. + +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n","signature":"a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n","impliedNodeFormat":1},"c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","8c035626178906db4f73ee993640fecd-export { make } from \"./model\";",{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];"],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"semanticDiagnosticsPerFile":[[5,[{"pos":92,"end":98,"code":2345,"category":1,"messageKey":"Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345","messageArgs":["number","string"]}]],[6,[{"pos":91,"end":97,"code":2345,"category":1,"messageKey":"Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345","messageArgs":["number","string"]}]]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n", + "signature": "a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n", + "signature": "a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "impliedNodeFormat": "CommonJS" + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + [ + "./right.ts", + [ + { + "pos": 92, + "end": 98, + "code": 2345, + "category": 1, + "messageKey": "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345", + "messageArgs": [ + "number", + "string" + ] + } + ] + ], + [ + "./left.ts", + [ + { + "pos": 91, + "end": 97, + "code": 2345, + "category": 1, + "messageKey": "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345", + "messageArgs": [ + "number", + "string" + ] + } + ] + ] + ], + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 2815 +} + +Watch Registrations:: +Directory watches:: + /home/src/tslibs/TS/Lib + /home/src/workspaces/project (recursive) +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/hub.ts +(computed .d.ts) /home/src/workspaces/project/right.ts +(computed .d.ts) /home/src/workspaces/project/left.ts +(used version) /home/src/workspaces/project/barrel.ts +(used version) /home/src/workspaces/project/index.ts + + +Edit [4]:: change the inferred type through the barrel +//// [/home/src/workspaces/project/model.ts] *modified* +export interface Model { id: number; } export function make(id: number): Model { return { id }; } + + +Output:: +[HH:MM:SS AM] File change detected. Starting incremental compilation... + +index.ts:1:71 - error TS2322: Type 'number' is not assignable to type 'string'. + +1 import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id]; +   ~~~~~~~ + +index.ts:1:80 - error TS2322: Type 'number' is not assignable to type 'string'. + +1 import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id]; +   ~~~~~~~~ + + +Found 2 errors in the same file, starting at: index.ts:1 + +[HH:MM:SS AM] Found 2 errors. Watching for file changes. + +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n","signature":"a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n","impliedNodeFormat":1},{"version":"a5bcf1db41c7b2b195764099f803185d-export interface Model { id: number; } export function make(id: number): Model { return { id }; }","signature":"755c74df06b876a52b12daa9bd085134-export interface Model {\n id: number;\n}\nexport declare function make(id: number): Model;\n","impliedNodeFormat":1},{"version":"8c035626178906db4f73ee993640fecd-export { make } from \"./model\";","signature":"8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n","impliedNodeFormat":1},{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];"],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"semanticDiagnosticsPerFile":[[8,[{"pos":70,"end":77,"code":2322,"category":1,"messageKey":"Type_0_is_not_assignable_to_type_1_2322","messageArgs":["number","string"]},{"pos":79,"end":87,"code":2322,"category":1,"messageKey":"Type_0_is_not_assignable_to_type_1_2322","messageArgs":["number","string"]}]]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n", + "signature": "a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "7a581f3c32763bd712056d8cf58fc0b0-export const prefix = 10;\n// first edit\n\n// second edit\n", + "signature": "a434d648ec62f01f82ba7bc6df302f43-export declare const prefix = 10;\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "a5bcf1db41c7b2b195764099f803185d-export interface Model { id: number; } export function make(id: number): Model { return { id }; }", + "signature": "755c74df06b876a52b12daa9bd085134-export interface Model {\n id: number;\n}\nexport declare function make(id: number): Model;\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "a5bcf1db41c7b2b195764099f803185d-export interface Model { id: number; } export function make(id: number): Model { return { id }; }", + "signature": "755c74df06b876a52b12daa9bd085134-export interface Model {\n id: number;\n}\nexport declare function make(id: number): Model;\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "impliedNodeFormat": "CommonJS" + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "semanticDiagnosticsPerFile": [ + [ + "./index.ts", + [ + { + "pos": 70, + "end": 77, + "code": 2322, + "category": 1, + "messageKey": "Type_0_is_not_assignable_to_type_1_2322", + "messageArgs": [ + "number", + "string" + ] + }, + { + "pos": 79, + "end": 87, + "code": 2322, + "category": 1, + "messageKey": "Type_0_is_not_assignable_to_type_1_2322", + "messageArgs": [ + "number", + "string" + ] + } + ] + ] + ], + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 3054 +} + +Watch Registrations:: +Directory watches:: + /home/src/tslibs/TS/Lib + /home/src/workspaces/project (recursive) +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/model.ts +*refresh* /home/src/workspaces/project/factory.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/model.ts +(computed .d.ts) /home/src/workspaces/project/factory.ts +(computed .d.ts) /home/src/workspaces/project/right.ts +(computed .d.ts) /home/src/workspaces/project/left.ts +(used version) /home/src/workspaces/project/barrel.ts +(used version) /home/src/workspaces/project/index.ts + + +Edit [5]:: restore both shared dependencies +//// [/home/src/workspaces/project/hub.ts] *modified* +export const prefix = "hub"; +// first edit + +// second edit + +//// [/home/src/workspaces/project/model.ts] *modified* +export interface Model { id: string; } export function make(id: string): Model { return { id }; } + + +Output:: +[HH:MM:SS AM] File change detected. Starting incremental compilation... + +[HH:MM:SS AM] Found 0 errors. Watching for file changes. + +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo] *modified* +{"version":"FakeTSVersion","root":[[2,8]],"fileNames":["lib.es2025.full.d.ts","./hub.ts","./model.ts","./factory.ts","./right.ts","./left.ts","./barrel.ts","./index.ts"],"fileInfos":[{"version":"8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };","affectsGlobalScope":true,"impliedNodeFormat":1},{"version":"df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n","signature":"eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n","impliedNodeFormat":1},{"version":"c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }","signature":"c7653311ee886021d70d18d464ff2d71-export interface Model {\n id: string;\n}\nexport declare function make(id: string): Model;\n","impliedNodeFormat":1},{"version":"8c035626178906db4f73ee993640fecd-export { make } from \"./model\";","signature":"8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n","impliedNodeFormat":1},{"version":"07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";","signature":"5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n","impliedNodeFormat":1},{"version":"8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";","signature":"4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n","impliedNodeFormat":1},"0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";","3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];"],"fileIdsList":[[5,6],[3],[7],[2,4,5],[2,4,6]],"options":{"strict":true},"referencedMap":[[7,1],[4,2],[8,3],[6,4],[5,5]],"affectedFilesPendingEmit":[7,4,2,8,6,3,5]} +//// [/home/src/workspaces/project/tsconfig.tsbuildinfo.readable.baseline.txt] *modified* +{ + "version": "FakeTSVersion", + "root": [ + { + "files": [ + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "original": [ + 2, + 8 + ] + } + ], + "fileNames": [ + "lib.es2025.full.d.ts", + "./hub.ts", + "./model.ts", + "./factory.ts", + "./right.ts", + "./left.ts", + "./barrel.ts", + "./index.ts" + ], + "fileInfos": [ + { + "fileName": "lib.es2025.full.d.ts", + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "signature": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8859c12c614ce56ba9a18e58384a198f-/// \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 {}\ninterface SymbolConstructor {\n (desc?: string | number): symbol;\n for(name: string): symbol;\n readonly toStringTag: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\ninterface Symbol {\n readonly [Symbol.toStringTag]: string;\n}\ndeclare const console: { log(msg: any): void; };", + "affectsGlobalScope": true, + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./hub.ts", + "version": "df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "df41fd128159de07c8cd657d90367a14-export const prefix = \"hub\";\n// first edit\n\n// second edit\n", + "signature": "eee9e59e027e6765a0d5610b039f5e8a-export declare const prefix = \"hub\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./model.ts", + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c7653311ee886021d70d18d464ff2d71-export interface Model {\n id: string;\n}\nexport declare function make(id: string): Model;\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "c3a0075202bda4cd9036e02a547ec2c5-export interface Model { id: string; } export function make(id: string): Model { return { id }; }", + "signature": "c7653311ee886021d70d18d464ff2d71-export interface Model {\n id: string;\n}\nexport declare function make(id: string): Model;\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./factory.ts", + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8c035626178906db4f73ee993640fecd-export { make } from \"./model\";", + "signature": "8bc5b2140b7efd4a238218fee9ed0bed-export { make } from \"./model\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./right.ts", + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "07e82acbe36641a8ce675b19260fa5a2-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const right = make(prefix); export { left } from \"./left\";", + "signature": "5384af1820c5ff2c360cadd81ece6963-export declare const right: import(\"./model\").Model;\nexport { left } from \"./left\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./left.ts", + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": "CommonJS", + "original": { + "version": "8787d0bbf1b6fc034a8dddf15a994040-import { prefix } from \"./hub\"; import { make } from \"./factory\"; export const left = make(prefix); export { right } from \"./right\";", + "signature": "4cb928914cdf7892b933ea43a96add55-export declare const left: import(\"./model\").Model;\nexport { right } from \"./right\";\n", + "impliedNodeFormat": 1 + } + }, + { + "fileName": "./barrel.ts", + "version": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "signature": "0b617de94256baa3cd1e090732042a0a-export { left } from \"./left\"; export { right } from \"./right\";", + "impliedNodeFormat": "CommonJS" + }, + { + "fileName": "./index.ts", + "version": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "signature": "3f3b96b60ee7fcf8db28c5a0509c1d85-import { left, right } from \"./barrel\"; export const ids: string[] = [left.id, right.id];", + "impliedNodeFormat": "CommonJS" + } + ], + "fileIdsList": [ + [ + "./right.ts", + "./left.ts" + ], + [ + "./model.ts" + ], + [ + "./barrel.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + ], + "options": { + "strict": true + }, + "referencedMap": { + "./barrel.ts": [ + "./right.ts", + "./left.ts" + ], + "./factory.ts": [ + "./model.ts" + ], + "./index.ts": [ + "./barrel.ts" + ], + "./left.ts": [ + "./hub.ts", + "./factory.ts", + "./right.ts" + ], + "./right.ts": [ + "./hub.ts", + "./factory.ts", + "./left.ts" + ] + }, + "affectedFilesPendingEmit": [ + [ + "./barrel.ts", + "Js", + 7 + ], + [ + "./factory.ts", + "Js", + 4 + ], + [ + "./hub.ts", + "Js", + 2 + ], + [ + "./index.ts", + "Js", + 8 + ], + [ + "./left.ts", + "Js", + 6 + ], + [ + "./model.ts", + "Js", + 3 + ], + [ + "./right.ts", + "Js", + 5 + ] + ], + "size": 2759 +} + +Watch Registrations:: +Directory watches:: + /home/src/tslibs/TS/Lib + /home/src/workspaces/project (recursive) +tsconfig.json:: +SemanticDiagnostics:: +*refresh* /home/src/workspaces/project/hub.ts +*refresh* /home/src/workspaces/project/model.ts +*refresh* /home/src/workspaces/project/factory.ts +*refresh* /home/src/workspaces/project/right.ts +*refresh* /home/src/workspaces/project/left.ts +*refresh* /home/src/workspaces/project/barrel.ts +*refresh* /home/src/workspaces/project/index.ts +Signatures:: +(computed .d.ts) /home/src/workspaces/project/hub.ts +(computed .d.ts) /home/src/workspaces/project/model.ts +(computed .d.ts) /home/src/workspaces/project/factory.ts +(computed .d.ts) /home/src/workspaces/project/right.ts +(computed .d.ts) /home/src/workspaces/project/left.ts +(used version) /home/src/workspaces/project/barrel.ts +(used version) /home/src/workspaces/project/index.ts diff --git a/tsc/testdata/tests/cases/compiler/declarationEmitAlternativeContainingModules.ts b/tsc/testdata/tests/cases/compiler/declarationEmitAlternativeContainingModules.ts new file mode 100644 index 0000000000000..920e456260489 --- /dev/null +++ b/tsc/testdata/tests/cases/compiler/declarationEmitAlternativeContainingModules.ts @@ -0,0 +1,57 @@ +// @declaration: true +// @emitDeclarationOnly: true +// @strict: true +// @module: commonjs +// @target: esnext + +// @filename: model.ts +export interface Model { value: string; } +export function make(): Model { return { value: "" }; } + +// @filename: factory.ts +export { make } from "./model"; + +// @filename: aliases.ts +export { Model as First, Model as Second } from "./model"; + +// @filename: preferred.ts +export { Model, Model as Renamed } from "./model"; + +// @filename: star.ts +export * from "./aliases"; + +// @filename: direct.ts +import { make } from "./factory"; +export const direct = make(); +export const repeated = make(); + +// @filename: renamed.ts +import { make } from "./factory"; +import * as aliases from "./aliases"; +export const renamed = make(); + +// @filename: sameName.ts +import { make } from "./factory"; +import * as preferred from "./preferred"; +export const sameName = make(); + +// @filename: starred.ts +import { make } from "./factory"; +import * as star from "./star"; +export const starred = make(); + +// @filename: exported.ts +import { Model } from "./model"; +export = Model; + +// @filename: exportEquals.ts +import { make } from "./factory"; +import Model = require("./exported"); +export const exportEquals = make(); + +// @filename: index.ts +export { direct, repeated } from "./direct"; +export { renamed } from "./renamed"; +export { sameName } from "./sameName"; +export { starred } from "./starred"; +export { exportEquals } from "./exportEquals";