diff options
-rw-r--r-- | src/js_parser.zig | 39 | ||||
-rw-r--r-- | test/bundler/esbuild/ts.test.ts | 12 |
2 files changed, 42 insertions, 9 deletions
diff --git a/src/js_parser.zig b/src/js_parser.zig index a323ed655..3e6143b18 100644 --- a/src/js_parser.zig +++ b/src/js_parser.zig @@ -9966,16 +9966,37 @@ fn NewParser_( } fn skipTypeScriptTypeStmt(p: *P, opts: *ParseStatementOptions) anyerror!void { - if (opts.is_export and p.lexer.token == .t_open_brace) { - // "export type {foo}" - // "export type {foo} from 'bar'" - _ = try p.parseExportClause(); - if (p.lexer.isContextualKeyword("from")) { - try p.lexer.next(); - _ = try p.parsePath(); + if (opts.is_export) { + switch (p.lexer.token) { + .t_open_brace => { + // "export type {foo}" + // "export type {foo} from 'bar'" + _ = try p.parseExportClause(); + if (p.lexer.isContextualKeyword("from")) { + try p.lexer.next(); + _ = try p.parsePath(); + } + try p.lexer.expectOrInsertSemicolon(); + return; + }, + .t_asterisk => { + // https://github.com/microsoft/TypeScript/pull/52217 + // - export type * as Foo from 'bar'; + // - export type Foo from 'bar'; + try p.lexer.next(); + if (p.lexer.isContextualKeyword("as")) { + // "export type * as ns from 'path'" + try p.lexer.next(); + _ = try p.parseClauseAlias("export"); + try p.lexer.next(); + } + try p.lexer.expectContextualKeyword("from"); + _ = try p.parsePath(); + try p.lexer.expectOrInsertSemicolon(); + return; + }, + else => {}, } - try p.lexer.expectOrInsertSemicolon(); - return; } const name = p.lexer.identifier; diff --git a/test/bundler/esbuild/ts.test.ts b/test/bundler/esbuild/ts.test.ts index 3a2da0f48..576ee7633 100644 --- a/test/bundler/esbuild/ts.test.ts +++ b/test/bundler/esbuild/ts.test.ts @@ -1049,6 +1049,18 @@ describe("bundler", () => { ]); }, }); + itBundled("ts/ExportType*", { + files: { + "/entry.ts": /* ts */ ` + export type * as Foo from "foo"; + export type * from "foo"; + console.log("hi"); + `, + }, + run: { + stdout: "hi\n", + }, + }); itBundled("ts/ExportDefaultTypeESBuildIssue316", { files: { "/entry.ts": /* ts */ ` |