Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion packages/vscode-typescript/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,14 @@ export class Client implements vscode.Disposable {

this.documentSelector = [
...jsTsLanguageModes.map(language => ({ scheme: "file", language })),
...jsTsLanguageModes.map(language => ({ scheme: "untitled", language })),
...jsTsLanguageModes.map(language => ({
scheme: "untitled",
language,
})),
...jsTsLanguageModes.map(language => ({
scheme: "zip",
language,
})),
];
this.clientOptions = {
documentSelector: this.documentSelector,
Expand Down
17 changes: 16 additions & 1 deletion tsc/cmd/tsc/sys.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import (

"github.com/microsoft/TypeScript/tsc/internal/bundled"
"github.com/microsoft/TypeScript/tsc/internal/execute/tsc"
"github.com/microsoft/TypeScript/tsc/internal/pnp"
"github.com/microsoft/TypeScript/tsc/internal/tspath"
"github.com/microsoft/TypeScript/tsc/internal/vfs"
"github.com/microsoft/TypeScript/tsc/internal/vfs/osvfs"
"github.com/microsoft/TypeScript/tsc/internal/vfs/pnpvfs"
"golang.org/x/term"
)

Expand All @@ -22,6 +24,7 @@ type osSys struct {
defaultLibraryPath string
cwd string
start time.Time
pnpApi *pnp.PnpApi
}

func (s *osSys) SinceStart() time.Duration {
Expand Down Expand Up @@ -65,6 +68,10 @@ func (s *osSys) GetEnvironmentVariable(name string) string {
return os.Getenv(name)
}

func (s *osSys) PnpApi() *pnp.PnpApi {
return s.pnpApi
}

func (s *osSys) Spawn(command []string, dir string, stderr io.Writer) (io.ReadWriteCloser, error) {
return spawnProcess(command, dir, stderr)
}
Expand Down Expand Up @@ -128,11 +135,19 @@ func newSystem() *osSys {
os.Exit(int(tsc.ExitStatusInvalidProject_OutputsSkipped))
}

var fs vfs.FS = osvfs.FS()

pnpApi := pnp.InitPnpApi(fs, tspath.NormalizePath(cwd))
if pnpApi != nil {
fs = pnpvfs.From(fs)
}

return &osSys{
cwd: tspath.NormalizePath(cwd),
fs: bundled.WrapFS(osvfs.FS()),
fs: bundled.WrapFS(fs),
defaultLibraryPath: bundled.LibPath(),
writer: os.Stdout,
start: time.Now(),
pnpApi: pnpApi,
}
}
13 changes: 12 additions & 1 deletion tsc/internal/api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@ import (
"github.com/microsoft/TypeScript/tsc/internal/contentmapper"
"github.com/microsoft/TypeScript/tsc/internal/ipc"
"github.com/microsoft/TypeScript/tsc/internal/lsp/lsproto"
"github.com/microsoft/TypeScript/tsc/internal/pnp"
"github.com/microsoft/TypeScript/tsc/internal/project"
"github.com/microsoft/TypeScript/tsc/internal/vfs"
"github.com/microsoft/TypeScript/tsc/internal/vfs/osvfs"
"github.com/microsoft/TypeScript/tsc/internal/vfs/pnpvfs"
)

// StdioServerOptions configures the STDIO-based API server.
Expand Down Expand Up @@ -74,7 +77,14 @@ func (s *StdioServer) Run(ctx context.Context) error {
transport = t
}

fs := bundled.WrapFS(osvfs.FS())
var fs vfs.FS = osvfs.FS()

pnpApi := pnp.InitPnpApi(fs, s.options.Cwd)
if pnpApi != nil {
fs = pnpvfs.From(fs)
}

fs = bundled.WrapFS(fs)

// Wrap the base FS with callbackFS if callbacks are requested
var callbackFS *callbackFS
Expand All @@ -87,6 +97,7 @@ func (s *StdioServer) Run(ctx context.Context) error {
BackgroundCtx: ctx,
Logger: nil, // TODO: Add logging support
FS: fs,
PnpApi: pnpApi,
Options: &project.SessionOptions{
CurrentDirectory: s.options.Cwd,
DefaultLibraryPath: s.options.DefaultLibraryPath,
Expand Down
2 changes: 1 addition & 1 deletion tsc/internal/checker/checker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ foo.bar;`
fs = bundled.WrapFS(fs)

cd := "/"
host := compiler.NewCompilerHost(cd, fs, bundled.LibPath(), nil, nil, nil)
host := compiler.NewCompilerHost(cd, fs, bundled.LibPath(), nil, nil, nil, nil)

parsed, errors := tsoptions.GetParsedCommandLineOfConfigFile("/tsconfig.json", &core.CompilerOptions{}, nil, host, nil)
assert.Equal(t, len(errors), 0, "Expected no errors in parsed command line")
Expand Down
2 changes: 1 addition & 1 deletion tsc/internal/compiler/contentmapper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func newContentMapperProgramWithOptions(t *testing.T, contentMapperProject conte
}
return compiler.NewProgram(compiler.ProgramOptions{
Config: config,
Host: compiler.NewCompilerHost("/src", fs, bundled.LibPath(), nil, nil, contentMapperProject),
Host: compiler.NewCompilerHost("/src", fs, bundled.LibPath(), nil, nil, nil, contentMapperProject),
// Load files on the calling goroutine for deterministic diagnostics ordering.
SingleThreaded: core.TSTrue,
})
Expand Down
4 changes: 4 additions & 0 deletions tsc/internal/compiler/emitHost.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/microsoft/TypeScript/tsc/internal/module"
"github.com/microsoft/TypeScript/tsc/internal/outputpaths"
"github.com/microsoft/TypeScript/tsc/internal/packagejson"
"github.com/microsoft/TypeScript/tsc/internal/pnp"
"github.com/microsoft/TypeScript/tsc/internal/printer"
"github.com/microsoft/TypeScript/tsc/internal/symlinks"
"github.com/microsoft/TypeScript/tsc/internal/transformers/declarations"
Expand All @@ -25,6 +26,7 @@ type EmitHost interface {
GetCurrentDirectory() string
CommonSourceDirectory() string
IsEmitBlocked(file string) bool
PnpApi() *pnp.PnpApi
}

var _ EmitHost = (*emitHost)(nil)
Expand Down Expand Up @@ -121,6 +123,8 @@ func (host *emitHost) UseCaseSensitiveFileNames() bool {
return host.program.UseCaseSensitiveFileNames()
}

func (host *emitHost) PnpApi() *pnp.PnpApi { return host.program.PnpApi() }

func (host *emitHost) IsEmitBlocked(file string) bool {
return host.program.IsEmitBlocked(file)
}
Expand Down
6 changes: 3 additions & 3 deletions tsc/internal/compiler/emit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func BenchmarkEmitLongLines(b *testing.B) {
OutDir: "/dev/out",
}

host := compiler.NewCompilerHost("/dev/src", fs, bundled.LibPath(), nil, nil, nil)
host := compiler.NewCompilerHost("/dev/src", fs, bundled.LibPath(), nil, nil, nil, nil)

p := compiler.NewProgram(compiler.ProgramOptions{
Config: &tsoptions.ParsedCommandLine{
Expand Down Expand Up @@ -106,7 +106,7 @@ func BenchmarkEmitManyFiles(b *testing.B) {
OutDir: "/dev/out",
}

host := compiler.NewCompilerHost("/dev/src", fs, bundled.LibPath(), nil, nil, nil)
host := compiler.NewCompilerHost("/dev/src", fs, bundled.LibPath(), nil, nil, nil, nil)

p := compiler.NewProgram(compiler.ProgramOptions{
Config: &tsoptions.ParsedCommandLine{
Expand Down Expand Up @@ -164,7 +164,7 @@ func BenchmarkEmitLongLinesWithLineBreaks(b *testing.B) {
OutDir: "/dev/out",
}

host := compiler.NewCompilerHost("/dev/src", fs, bundled.LibPath(), nil, nil, nil)
host := compiler.NewCompilerHost("/dev/src", fs, bundled.LibPath(), nil, nil, nil, nil)

p := compiler.NewProgram(compiler.ProgramOptions{
Config: &tsoptions.ParsedCommandLine{
Expand Down
13 changes: 12 additions & 1 deletion tsc/internal/compiler/host.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/microsoft/TypeScript/tsc/internal/core"
"github.com/microsoft/TypeScript/tsc/internal/diagnostics"
"github.com/microsoft/TypeScript/tsc/internal/parser"
"github.com/microsoft/TypeScript/tsc/internal/pnp"
"github.com/microsoft/TypeScript/tsc/internal/tsoptions"
"github.com/microsoft/TypeScript/tsc/internal/tspath"
"github.com/microsoft/TypeScript/tsc/internal/vfs"
Expand All @@ -28,6 +29,7 @@ type CompilerHost interface {
// command line has no content mappers. The project owns transform identity and lifecycle state.
ContentMapperProject() contentmapper.Project
GetResolvedProjectReference(fileName string, path tspath.Path) *tsoptions.ParsedCommandLine
PnpApi() *pnp.PnpApi
}

var _ CompilerHost = (*compilerHost)(nil)
Expand All @@ -37,6 +39,7 @@ type compilerHost struct {
fs vfs.FS
defaultLibraryPath string
extendedConfigCache tsoptions.ExtendedConfigCache
pnpApi *pnp.PnpApi
trace func(msg *diagnostics.Message, args ...any)
contentMapperProject contentmapper.Project
}
Expand All @@ -46,29 +49,33 @@ func NewCachedFSCompilerHost(
fs vfs.FS,
defaultLibraryPath string,
extendedConfigCache tsoptions.ExtendedConfigCache,
pnpApi *pnp.PnpApi,
trace func(msg *diagnostics.Message, args ...any),
contentMapperProject contentmapper.Project,
) CompilerHost {
return NewCompilerHost(currentDirectory, cachedvfs.From(fs), defaultLibraryPath, extendedConfigCache, trace, contentMapperProject)
return NewCompilerHost(currentDirectory, cachedvfs.From(fs), defaultLibraryPath, extendedConfigCache, pnpApi, trace, contentMapperProject)
}

func NewCompilerHost(
currentDirectory string,
fs vfs.FS,
defaultLibraryPath string,
extendedConfigCache tsoptions.ExtendedConfigCache,
pnpApi *pnp.PnpApi,
trace func(msg *diagnostics.Message, args ...any),
contentMapperProject contentmapper.Project,
) CompilerHost {
if trace == nil {
trace = func(msg *diagnostics.Message, args ...any) {}
}

return &compilerHost{
currentDirectory: currentDirectory,
fs: fs,
defaultLibraryPath: defaultLibraryPath,
extendedConfigCache: extendedConfigCache,
trace: trace,
pnpApi: pnpApi,
contentMapperProject: contentMapperProject,
}
}
Expand All @@ -85,6 +92,10 @@ func (h *compilerHost) GetCurrentDirectory() string {
return h.currentDirectory
}

func (h *compilerHost) PnpApi() *pnp.PnpApi {
return h.pnpApi
}

func (h *compilerHost) Trace(msg *diagnostics.Message, args ...any) {
h.trace(msg, args...)
}
Expand Down
6 changes: 6 additions & 0 deletions tsc/internal/compiler/program.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/microsoft/TypeScript/tsc/internal/outputpaths"
"github.com/microsoft/TypeScript/tsc/internal/packagejson"
"github.com/microsoft/TypeScript/tsc/internal/parser"
"github.com/microsoft/TypeScript/tsc/internal/pnp"
"github.com/microsoft/TypeScript/tsc/internal/printer"
"github.com/microsoft/TypeScript/tsc/internal/scanner"
"github.com/microsoft/TypeScript/tsc/internal/sourcemap"
Expand Down Expand Up @@ -131,6 +132,11 @@ func (p *Program) GetCurrentDirectory() string {
return p.Host().GetCurrentDirectory()
}

// PnpApi implements checker.Program.
func (p *Program) PnpApi() *pnp.PnpApi {
return p.Host().PnpApi()
}

func (p *Program) ContentMapperProject() contentmapper.Project {
return p.opts.Host.ContentMapperProject()
}
Expand Down
6 changes: 3 additions & 3 deletions tsc/internal/compiler/program_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ func TestProgram(t *testing.T) {
CompilerOptions: &opts,
},
},
Host: compiler.NewCompilerHost("c:/dev/src", fs, bundled.LibPath(), nil, nil, nil),
Host: compiler.NewCompilerHost("c:/dev/src", fs, bundled.LibPath(), nil, nil, nil, nil),
})

actualFiles := []string{}
Expand Down Expand Up @@ -287,7 +287,7 @@ func TestIncludeProcessorDiagnosticsWithMissingFileCasing(t *testing.T) {
CompilerOptions: &opts,
},
},
Host: compiler.NewCompilerHost("/", fs, bundled.LibPath(), nil, nil, nil),
Host: compiler.NewCompilerHost("/", fs, bundled.LibPath(), nil, nil, nil, nil),
})

// GetProgramDiagnostics triggers getDiagnostics which processes all
Expand Down Expand Up @@ -329,7 +329,7 @@ func BenchmarkNewProgram(b *testing.B) {
CompilerOptions: &opts,
},
},
Host: compiler.NewCompilerHost("c:/dev/src", fs, bundled.LibPath(), nil, nil, nil),
Host: compiler.NewCompilerHost("c:/dev/src", fs, bundled.LibPath(), nil, nil, nil, nil),
}

for b.Loop() {
Expand Down
6 changes: 6 additions & 0 deletions tsc/internal/compiler/projectreferencedtsfakinghost.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/microsoft/TypeScript/tsc/internal/collections"
"github.com/microsoft/TypeScript/tsc/internal/core"
"github.com/microsoft/TypeScript/tsc/internal/module"
"github.com/microsoft/TypeScript/tsc/internal/pnp"
"github.com/microsoft/TypeScript/tsc/internal/symlinks"
"github.com/microsoft/TypeScript/tsc/internal/tspath"
"github.com/microsoft/TypeScript/tsc/internal/vfs"
Expand Down Expand Up @@ -43,6 +44,11 @@ func (h *projectReferenceDtsFakingHost) GetCurrentDirectory() string {
return h.host.GetCurrentDirectory()
}

// PnpApi implements module.ResolutionHost.
func (h *projectReferenceDtsFakingHost) PnpApi() *pnp.PnpApi {
return h.host.PnpApi()
}

type projectReferenceDtsFakingVfs struct {
projectReferenceFileMapper *projectReferenceFileMapper
dtsDirectories collections.Set[tspath.Path]
Expand Down
10 changes: 10 additions & 0 deletions tsc/internal/core/compileroptions.go
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,13 @@ func (options *CompilerOptions) GetEffectiveTypeRoots(currentDirectory string) (
if options.TypeRoots != nil {
return options.TypeRoots, true
}
baseDir := options.GetBaseDirFromOptions(currentDirectory)

nmTypes, nmFromConfig := options.GetNodeModulesTypeRoots(baseDir)
return nmTypes, nmFromConfig
}

func (options *CompilerOptions) GetBaseDirFromOptions(currentDirectory string) string {
var baseDir string
if options.ConfigFilePath != "" {
baseDir = tspath.GetDirectoryPath(options.ConfigFilePath)
Expand All @@ -313,7 +320,10 @@ func (options *CompilerOptions) GetEffectiveTypeRoots(currentDirectory string) (
panic("cannot get effective type roots without a config file path or current directory")
}
}
return baseDir
}

func (options *CompilerOptions) GetNodeModulesTypeRoots(baseDir string) (result []string, fromConfig bool) {
typeRoots := make([]string, 0, strings.Count(baseDir, "/"))
tspath.ForEachAncestorDirectory(baseDir, func(dir string) (any, bool) {
typeRoots = append(typeRoots, tspath.CombinePaths(dir, "node_modules", "@types"))
Expand Down
32 changes: 32 additions & 0 deletions tsc/internal/diagnostics/diagnostics_generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading