diff --git a/internal/js/compiler/compiler.go b/internal/js/compiler/compiler.go index de00026d631..0f037074154 100644 --- a/internal/js/compiler/compiler.go +++ b/internal/js/compiler/compiler.go @@ -115,22 +115,29 @@ 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) - } - 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 - return ps.parseImpl(code, filename, commonJSWrap) + isTsExtensionFile := strings.HasSuffix(filename, ".ts") + isStdin := filename == "file:///-" + if !isTsExtensionFile && !isStdin { + return nil, "", err + } + + 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 } - return nil, "", err + ps.commonJSWrapped = false + return ps.parseImpl(code, filename, commonJSWrap) } func (ps *parsingState) wrap(code, filename string) string { diff --git a/internal/js/compiler/compiler_test.go b/internal/js/compiler/compiler_test.go index 8ff17c8abc1..335bc2b57bc 100644 --- a/internal/js/compiler/compiler_test.go +++ b/internal/js/compiler/compiler_test.go @@ -98,6 +98,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) {