From 7d2227da2488c05d9b98a90eafa30c773210d33b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20L=C3=B3pez=20de=20la=20Franca=20Beltran?= Date: Mon, 13 Oct 2025 14:47:38 +0200 Subject: [PATCH 1/3] Compiler: Support for stdin TypeScript code --- internal/js/compiler/compiler.go | 12 +++++++++--- internal/js/compiler/compiler_test.go | 13 +++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/internal/js/compiler/compiler.go b/internal/js/compiler/compiler.go index 022d8c0d79e..92b9611a036 100644 --- a/internal/js/compiler/compiler.go +++ b/internal/js/compiler/compiler.go @@ -119,10 +119,16 @@ func (ps *parsingState) parseImpl(src, filename string, commonJSWrap bool) (*ast return prg, code, nil } - if strings.HasSuffix(filename, ".ts") { - if err := ps.compiler.usage.Uint64(usageParsedTSFilesKey, 1); err != nil { - ps.compiler.logger.WithError(err).Warn("couldn't report usage for " + usageParsedTSFilesKey) + isTsExtensionFile := strings.HasSuffix(filename, ".ts") + isStdin := filename == "file:///-" + + if isTsExtensionFile || isStdin { + if isTsExtensionFile { + if err := ps.compiler.usage.Uint64(usageParsedTSFilesKey, 1); err != nil { + ps.compiler.logger.WithError(err).Warn("couldn't report usage for " + usageParsedTSFilesKey) + } } + code, ps.srcMap, err = StripTypes(src, filename) if err != nil { return nil, "", err diff --git a/internal/js/compiler/compiler_test.go b/internal/js/compiler/compiler_test.go index 3702c7f5969..d52277d62b6 100644 --- a/internal/js/compiler/compiler_test.go +++ b/internal/js/compiler/compiler_test.go @@ -102,6 +102,19 @@ func TestCompile(t *testing.T) { assert.IsType(t, parser.ErrorList{}, err) assert.Contains(t, err.Error(), `Line 1:4 Unexpected token =>`) }) + + t.Run("Stdin TS", func(t *testing.T) { + t.Parallel() + c := New(testutils.NewLogger(t)) + src := `1 + (((): number => 2)());` + prg, _, err := c.Parse(src, "file:///-", false, false) + require.NoError(t, err) + pgm, err := sobek.CompileAST(prg, true) + require.NoError(t, err) + v, err := sobek.New().RunProgram(pgm) + require.NoError(t, err) + assert.Equal(t, int64(3), v.Export()) + }) } func TestCorruptSourceMap(t *testing.T) { From b2ec4b4d984aecd91b82be2786e77374c8fb99c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20L=C3=B3pez=20de=20la=20Franca=20Beltran?= Date: Mon, 13 Oct 2025 16:05:27 +0200 Subject: [PATCH 2/3] Make it linter-friendly --- internal/js/compiler/compiler.go | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/internal/js/compiler/compiler.go b/internal/js/compiler/compiler.go index 92b9611a036..6bb05509e91 100644 --- a/internal/js/compiler/compiler.go +++ b/internal/js/compiler/compiler.go @@ -121,27 +121,27 @@ func (ps *parsingState) parseImpl(src, filename string, commonJSWrap bool) (*ast isTsExtensionFile := strings.HasSuffix(filename, ".ts") isStdin := filename == "file:///-" + if !isTsExtensionFile && !isStdin { + return nil, "", err + } - if isTsExtensionFile || isStdin { - if isTsExtensionFile { - if err := ps.compiler.usage.Uint64(usageParsedTSFilesKey, 1); err != nil { - ps.compiler.logger.WithError(err).Warn("couldn't report usage for " + usageParsedTSFilesKey) - } + if isTsExtensionFile { + if err := ps.compiler.usage.Uint64(usageParsedTSFilesKey, 1); err != nil { + ps.compiler.logger.WithError(err).Warn("couldn't report usage for " + usageParsedTSFilesKey) } + } - code, ps.srcMap, err = StripTypes(src, filename) - if err != nil { - return nil, "", err - } - if ps.loader != nil { - // This hack is required for the source map to work - code += "\n//# sourceMappingURL=" + internalSourceMapURL - } - ps.commonJSWrapped = false - ps.compatibilityMode = lib.CompatibilityModeBase - return ps.parseImpl(code, filename, commonJSWrap) + code, ps.srcMap, err = StripTypes(src, filename) + if err != nil { + return nil, "", err + } + if ps.loader != nil { + // This hack is required for the source map to work + code += "\n//# sourceMappingURL=" + internalSourceMapURL } - return nil, "", err + ps.commonJSWrapped = false + ps.compatibilityMode = lib.CompatibilityModeBase + return ps.parseImpl(code, filename, commonJSWrap) } func (ps *parsingState) wrap(code, filename string) string { From 841afcffe23d82c64a725a534fc47a7ee85cb987 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20L=C3=B3pez=20de=20la=20Franca=20Beltran?= Date: Tue, 21 Oct 2025 13:09:13 +0200 Subject: [PATCH 3/3] Report usage/parsedTSFiles after stripping types successfully --- internal/js/compiler/compiler.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/internal/js/compiler/compiler.go b/internal/js/compiler/compiler.go index 3587ba82396..0f037074154 100644 --- a/internal/js/compiler/compiler.go +++ b/internal/js/compiler/compiler.go @@ -121,16 +121,17 @@ func (ps *parsingState) parseImpl(src, filename string, commonJSWrap bool) (*ast return nil, "", err } - if isTsExtensionFile { - if err := ps.compiler.usage.Uint64(usageParsedTSFilesKey, 1); err != nil { - ps.compiler.logger.WithError(err).Warn("couldn't report usage for " + usageParsedTSFilesKey) - } - } - code, ps.srcMap, err = StripTypes(src, filename) if err != nil { return nil, "", err } + + // At this point we have stripped types successfully, no matter whether it was a .ts file + // or a script from stdin, and so we can report that a TS file been parsed successfully. + if err := ps.compiler.usage.Uint64(usageParsedTSFilesKey, 1); err != nil { + ps.compiler.logger.WithError(err).Warn("couldn't report usage for " + usageParsedTSFilesKey) + } + if ps.loader != nil { // This hack is required for the source map to work code += "\n//# sourceMappingURL=" + internalSourceMapURL