From 89e63bb9090188adacb2a5e251740317d524b5b1 Mon Sep 17 00:00:00 2001
From: Gadzhi Gadzhiev <168296+resure@users.noreply.github.com>
Date: Sun, 27 Sep 2026 10:43:11 +0300
Subject: [PATCH] Speed up first incremental rebuilds after shared dependency
edits
---
tsc/internal/checker/checker.go | 7 +-
tsc/internal/checker/symbolaccessibility.go | 112 +-
tsc/internal/checker/types.go | 1 +
.../incremental/affectedfileshandler.go | 57 +-
.../affectedfileshandler_internal_test.go | 66 +
.../incremental/affectedfileshandler_test.go | 60 +
tsc/internal/execute/tsctests/tsc_test.go | 53 +
...arationEmitAlternativeContainingModules.js | 94 ++
...onEmitAlternativeContainingModules.symbols | 113 ++
...tionEmitAlternativeContainingModules.types | 119 ++
.../shared-dependency-with-inferred-types.js | 1450 ++++++++++++++++
.../shared-dependency-with-inferred-types.js | 1504 +++++++++++++++++
...arationEmitAlternativeContainingModules.ts | 57 +
13 files changed, 3643 insertions(+), 50 deletions(-)
create mode 100644 tsc/internal/execute/incremental/affectedfileshandler_internal_test.go
create mode 100644 tsc/internal/execute/incremental/affectedfileshandler_test.go
create mode 100644 tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.js
create mode 100644 tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.symbols
create mode 100644 tsc/testdata/baselines/reference/compiler/declarationEmitAlternativeContainingModules.types
create mode 100644 tsc/testdata/baselines/reference/tsc/incremental/shared-dependency-with-inferred-types.js
create mode 100644 tsc/testdata/baselines/reference/tscWatch/incremental/shared-dependency-with-inferred-types.js
create mode 100644 tsc/testdata/tests/cases/compiler/declarationEmitAlternativeContainingModules.ts
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::
+[96mleft.ts[0m:[93m1[0m:[93m92[0m - [91merror[0m[90m TS2345: [0mArgument of type 'number' is not assignable to parameter of type 'string'.
+
+[7m1[0m import { prefix } from "./hub"; import { make } from "./factory"; export const left = make(prefix); export { right } from "./right";
+[7m [0m [91m ~~~~~~[0m
+
+[96mright.ts[0m:[93m1[0m:[93m93[0m - [91merror[0m[90m TS2345: [0mArgument of type 'number' is not assignable to parameter of type 'string'.
+
+[7m1[0m import { prefix } from "./hub"; import { make } from "./factory"; export const right = make(prefix); export { left } from "./left";
+[7m [0m [91m ~~~~~~[0m
+
+
+Found 2 errors in 2 files.
+
+Errors Files
+ 1 left.ts[90m:1[0m
+ 1 right.ts[90m:1[0m
+
+//// [/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::
+[96mindex.ts[0m:[93m1[0m:[93m71[0m - [91merror[0m[90m TS2322: [0mType 'number' is not assignable to type 'string'.
+
+[7m1[0m import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id];
+[7m [0m [91m ~~~~~~~[0m
+
+[96mindex.ts[0m:[93m1[0m:[93m80[0m - [91merror[0m[90m TS2322: [0mType 'number' is not assignable to type 'string'.
+
+[7m1[0m import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id];
+[7m [0m [91m ~~~~~~~~[0m
+
+
+Found 2 errors in the same file, starting at: index.ts[90m:1[0m
+
+//// [/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::
+[2J[3J[H[[90mHH:MM:SS AM[0m] Starting compilation in watch mode...
+
+[[90mHH:MM:SS AM[0m] 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::
+[2J[3J[H[[90mHH:MM:SS AM[0m] File change detected. Starting incremental compilation...
+
+[[90mHH:MM:SS AM[0m] 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::
+[2J[3J[H[[90mHH:MM:SS AM[0m] File change detected. Starting incremental compilation...
+
+[[90mHH:MM:SS AM[0m] 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::
+[2J[3J[H[[90mHH:MM:SS AM[0m] File change detected. Starting incremental compilation...
+
+[96mleft.ts[0m:[93m1[0m:[93m92[0m - [91merror[0m[90m TS2345: [0mArgument of type 'number' is not assignable to parameter of type 'string'.
+
+[7m1[0m import { prefix } from "./hub"; import { make } from "./factory"; export const left = make(prefix); export { right } from "./right";
+[7m [0m [91m ~~~~~~[0m
+
+[96mright.ts[0m:[93m1[0m:[93m93[0m - [91merror[0m[90m TS2345: [0mArgument of type 'number' is not assignable to parameter of type 'string'.
+
+[7m1[0m import { prefix } from "./hub"; import { make } from "./factory"; export const right = make(prefix); export { left } from "./left";
+[7m [0m [91m ~~~~~~[0m
+
+
+Found 2 errors in 2 files.
+
+Errors Files
+ 1 left.ts[90m:1[0m
+ 1 right.ts[90m:1[0m
+
+[[90mHH:MM:SS AM[0m] 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::
+[2J[3J[H[[90mHH:MM:SS AM[0m] File change detected. Starting incremental compilation...
+
+[96mindex.ts[0m:[93m1[0m:[93m71[0m - [91merror[0m[90m TS2322: [0mType 'number' is not assignable to type 'string'.
+
+[7m1[0m import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id];
+[7m [0m [91m ~~~~~~~[0m
+
+[96mindex.ts[0m:[93m1[0m:[93m80[0m - [91merror[0m[90m TS2322: [0mType 'number' is not assignable to type 'string'.
+
+[7m1[0m import { left, right } from "./barrel"; export const ids: string[] = [left.id, right.id];
+[7m [0m [91m ~~~~~~~~[0m
+
+
+Found 2 errors in the same file, starting at: index.ts[90m:1[0m
+
+[[90mHH:MM:SS AM[0m] 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::
+[2J[3J[H[[90mHH:MM:SS AM[0m] File change detected. Starting incremental compilation...
+
+[[90mHH:MM:SS AM[0m] 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";