{"record":{"id":"ed9506ac0fafd502","repo":"evanw/esbuild","slug":"unexpected-interface","errorCode":null,"errorMessage":"Unexpected \"interface\"","messagePattern":"Unexpected \"interface\"","errorType":"panic","errorClass":"LexerPanic","httpStatus":null,"severity":"error","filePath":"internal/js_parser/js_parser.go","lineNumber":8337,"sourceCode":"\t\t\t\t\t\tif !p.lexer.HasNewlineBefore && (opts.isModuleScope || opts.isNamespaceScope) && (p.lexer.Token == js_lexer.TIdentifier ||\n\t\t\t\t\t\t\t(p.lexer.Token == js_lexer.TStringLiteral && opts.isTypeScriptDeclare)) {\n\t\t\t\t\t\t\treturn p.parseTypeScriptNamespaceStmt(loc, opts)\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase \"interface\":\n\t\t\t\t\t\t// \"interface Foo {}\"\n\t\t\t\t\t\t// \"export default interface Foo {}\"\n\t\t\t\t\t\t// \"export default interface \\n Foo {}\"\n\t\t\t\t\t\tif !p.lexer.HasNewlineBefore || opts.isExportDefault {\n\t\t\t\t\t\t\tp.skipTypeScriptInterfaceStmt(parseStmtOpts{isModuleScope: opts.isModuleScope})\n\t\t\t\t\t\t\treturn js_ast.Stmt{Loc: loc, Data: js_ast.STypeScriptShared}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// \"interface \\n Foo {}\"\n\t\t\t\t\t\t// \"export interface \\n Foo {}\"\n\t\t\t\t\t\tif opts.isExport {\n\t\t\t\t\t\t\tp.log.AddError(&p.tracker, nameRange, \"Unexpected \\\"interface\\\"\")\n\t\t\t\t\t\t\tpanic(js_lexer.LexerPanic{})\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase \"abstract\":\n\t\t\t\t\t\tif !p.lexer.HasNewlineBefore && p.lexer.Token == js_lexer.TClass {\n\t\t\t\t\t\t\treturn p.parseClassStmt(loc, opts)\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase \"global\":\n\t\t\t\t\t\t// \"declare module 'fs' { global { namespace NodeJS {} } }\"\n\t\t\t\t\t\tif opts.isNamespaceScope && opts.isTypeScriptDeclare && p.lexer.Token == js_lexer.TOpenBrace {\n\t\t\t\t\t\t\tp.lexer.Next()\n\t\t\t\t\t\t\tp.parseStmtsUpTo(js_lexer.TCloseBrace, opts)\n\t\t\t\t\t\t\tp.lexer.Next()\n\t\t\t\t\t\t\treturn js_ast.Stmt{Loc: loc, Data: js_ast.STypeScriptShared}\n\t\t\t\t\t\t}\n\n\t\t\t\t\tcase \"declare\":\n\t\t\t\t\t\tif !p.lexer.HasNewlineBefore {","sourceCodeStart":8319,"sourceCodeEnd":8355,"githubUrl":"https://github.com/evanw/esbuild/blob/f6058f8364fe7ab91ca57a83e02577ed74c9cae4/internal/js_parser/js_parser.go#L8319-L8355","documentation":"In TypeScript, 'interface' is rejected when it appears after a newline in an export (non-default) statement context (js_parser.go:8335). The guard fires when opts.isExport is set, a newline precedes 'interface', and it is not an export-default form.","triggerScenarios":"'export\\ninterface Foo {}' — a line break between 'export' and 'interface' in a named export.","commonSituations":"Formatter/prettier wrapping the 'export' keyword onto its own line; refactor artifacts; copy-paste of declaration + export.","solutions":["Keep 'export interface' on the same line.","If a default export of an interface is truly intended, use 'export default interface'.","Remove the line break between 'export' and 'interface'."],"exampleFix":"// before\nexport\ninterface Foo {}\n// after\nexport interface Foo {}","handlingStrategy":"validation","validationCode":"import \"github.com/evanw/esbuild/pkg/api\"\nres := api.Transform(src, api.TransformOptions{Loader: api.LoaderTS})\nfor _, m := range res.Errors {\n  if strings.Contains(m.Text, `Unexpected \"interface\"`) {\n    // 'interface' appeared after a newline in an export statement\n  }\n}","typeGuard":"// Flag 'export\\ninterface' (line break between export and interface).\nvar reExportNewlineInterface = regexp.MustCompile(`(?m)^export\\s*\\\\n\\s*interface\\\\b`)\nfunc exportNewlineBeforeInterface(src string) bool { return reExportNewlineInterface.MatchString(src) }","tryCatchPattern":null,"preventionTips":["Keep 'export interface' on the same line.","Run tsc on .ts files to catch malformed export declarations.","Review formatter settings that wrap 'export' onto its own line."],"tags":["syntax-error","parser","typescript","interface","export","newline"],"backgroundTag":null,"analyzedSha":"f6058f8364fe7ab91ca57a83e02577ed74c9cae4","analyzedAt":"2026-08-09T18:37:22.223Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}