Skip to content

Commit 0818e03

Browse files
committed
support moduleSuffixes in tsconfig.json
1 parent 962eed8 commit 0818e03

File tree

5 files changed

+288
-33
lines changed

5 files changed

+288
-33
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
* Add support for TypeScript's `moduleSuffixes` field from TypeScript 4.7
6+
7+
The upcoming version of TypeScript adds the `moduleSuffixes` field to `tsconfig.json` that introduces more rules to import path resolution. Setting `moduleSuffixes` to `[".ios", ".native", ""]` will try to look at the the relative files `./foo.ios.ts`, `./foo.native.ts`, and finally `./foo.ts` for an import path of `./foo`. Note that the empty string `""` in `moduleSuffixes` is necessary for TypeScript to also look-up `./foo.ts`. This was announced in the [TypeScript 4.7 beta blog post](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7-beta/#resolution-customization-with-modulesuffixes).
8+
39
## 0.14.36
410

511
* Revert path metadata validation for now ([#2177](https://github.com/evanw/esbuild/issues/2177))

internal/bundler/bundler_tsconfig_test.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,3 +1514,98 @@ func TestTsConfigPathsExtendsBaseURL(t *testing.T) {
15141514
},
15151515
})
15161516
}
1517+
1518+
func TestTsConfigModuleSuffixesInsert(t *testing.T) {
1519+
tsconfig_suite.expectBundled(t, bundled{
1520+
files: map[string]string{
1521+
"/Users/user/project/src/entry.ts": `
1522+
import "./foo"
1523+
import "./bar.js"
1524+
import "./baz.a.js"
1525+
`,
1526+
1527+
"/Users/user/project/src/foo.a.ts": `console.log('foo.a')`,
1528+
"/Users/user/project/src/foo.b.ts": `console.log('foo.b')`,
1529+
"/Users/user/project/src/foo.ts": `console.log('foo')`,
1530+
1531+
"/Users/user/project/src/bar.a.ts": `console.log('bar.a')`,
1532+
"/Users/user/project/src/bar.b.ts": `console.log('bar.b')`,
1533+
"/Users/user/project/src/bar.ts": `console.log('bar')`,
1534+
1535+
"/Users/user/project/src/baz.a.ts": `console.log('baz.a')`,
1536+
"/Users/user/project/src/baz.b.ts": `console.log('baz.b')`,
1537+
"/Users/user/project/src/baz.ts": `console.log('baz')`,
1538+
1539+
"/Users/user/project/tsconfig.json": `{
1540+
"compilerOptions": {
1541+
"moduleSuffixes": [".a", ".b", ""]
1542+
}
1543+
}`,
1544+
},
1545+
entryPaths: []string{"/Users/user/project/src/entry.ts"},
1546+
options: config.Options{
1547+
Mode: config.ModeBundle,
1548+
AbsOutputFile: "/Users/user/project/out.js",
1549+
},
1550+
})
1551+
}
1552+
1553+
func TestTsConfigModuleSuffixesNoInsert(t *testing.T) {
1554+
tsconfig_suite.expectBundled(t, bundled{
1555+
files: map[string]string{
1556+
"/Users/user/project/src/entry.ts": `
1557+
import "./foo.b"
1558+
import "./bar.js"
1559+
import "./baz.b.js"
1560+
`,
1561+
1562+
"/Users/user/project/src/foo.a.ts": `console.log('foo.a')`,
1563+
"/Users/user/project/src/foo.b.ts": `console.log('foo.b')`,
1564+
"/Users/user/project/src/foo.ts": `console.log('foo')`,
1565+
1566+
"/Users/user/project/src/bar.ts": `console.log('bar')`,
1567+
1568+
"/Users/user/project/src/baz.a.ts": `console.log('baz.a')`,
1569+
"/Users/user/project/src/baz.b.ts": `console.log('baz.b')`,
1570+
"/Users/user/project/src/baz.ts": `console.log('baz')`,
1571+
1572+
"/Users/user/project/tsconfig.json": `{
1573+
"compilerOptions": {
1574+
"moduleSuffixes": [".a", ".b", ""]
1575+
}
1576+
}`,
1577+
},
1578+
entryPaths: []string{"/Users/user/project/src/entry.ts"},
1579+
options: config.Options{
1580+
Mode: config.ModeBundle,
1581+
AbsOutputFile: "/Users/user/project/out.js",
1582+
},
1583+
})
1584+
}
1585+
1586+
func TestTsConfigModuleSuffixesNoEmpty(t *testing.T) {
1587+
tsconfig_suite.expectBundled(t, bundled{
1588+
files: map[string]string{
1589+
"/Users/user/project/src/entry.ts": `
1590+
import "./foo.js"
1591+
import "./bar"
1592+
`,
1593+
1594+
"/Users/user/project/src/foo.b.ts": `console.log('foo.b')`,
1595+
"/Users/user/project/src/bar.ts": `console.log('bar')`,
1596+
1597+
"/Users/user/project/tsconfig.json": `{
1598+
"compilerOptions": {
1599+
"moduleSuffixes": [".a", ".b"]
1600+
}
1601+
}`,
1602+
},
1603+
entryPaths: []string{"/Users/user/project/src/entry.ts"},
1604+
options: config.Options{
1605+
Mode: config.ModeBundle,
1606+
AbsOutputFile: "/Users/user/project/out.js",
1607+
},
1608+
expectedScanLog: `Users/user/project/src/entry.ts: ERROR: Could not resolve "./bar"
1609+
`,
1610+
})
1611+
}

internal/bundler/snapshots/snapshots_tsconfig.txt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,30 @@ TestTsConfigJSX
2828
// Users/user/project/entry.tsx
2929
console.log(/* @__PURE__ */ R.c(R.F, null, /* @__PURE__ */ R.c("div", null), /* @__PURE__ */ R.c("div", null)));
3030

31+
================================================================================
32+
TestTsConfigModuleSuffixesInsert
33+
---------- /Users/user/project/out.js ----------
34+
// Users/user/project/src/foo.a.ts
35+
console.log("foo.a");
36+
37+
// Users/user/project/src/bar.a.ts
38+
console.log("bar.a");
39+
40+
// Users/user/project/src/baz.a.ts
41+
console.log("baz.a");
42+
43+
================================================================================
44+
TestTsConfigModuleSuffixesNoInsert
45+
---------- /Users/user/project/out.js ----------
46+
// Users/user/project/src/foo.b.ts
47+
console.log("foo.b");
48+
49+
// Users/user/project/src/bar.ts
50+
console.log("bar");
51+
52+
// Users/user/project/src/baz.b.ts
53+
console.log("baz.b");
54+
3155
================================================================================
3256
TestTsConfigNestedJSX
3357
---------- /Users/user/project/out.js ----------

0 commit comments

Comments
 (0)