Skip to content

Commit abc203b

Browse files
authored
fix: redirect index file when redirect.dts.extension is enabled (#778)
1 parent 4f8e9fc commit abc203b

File tree

4 files changed

+63
-8
lines changed

4 files changed

+63
-8
lines changed

packages/plugin-dts/src/utils.ts

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,15 @@ export async function pathExists(path: string): Promise<boolean> {
7474
.catch(() => false);
7575
}
7676

77+
export async function isDirectory(filePath: string): Promise<boolean> {
78+
try {
79+
const stat = await fsP.stat(filePath);
80+
return stat.isDirectory();
81+
} catch {
82+
return false;
83+
}
84+
}
85+
7786
export async function emptyDir(dir: string): Promise<void> {
7887
if (!(await pathExists(dir))) {
7988
return;
@@ -164,6 +173,27 @@ export async function addBannerAndFooter(
164173
}
165174
}
166175

176+
async function addExtension(
177+
redirect: DtsRedirect,
178+
dtsFile: string,
179+
path: string,
180+
extension: string,
181+
): Promise<string> {
182+
if (!redirect.extension) {
183+
return path;
184+
}
185+
186+
let redirectPath = path;
187+
188+
// If the import path refers to a directory, it most likely actually refers to a `index.*` file due to Node's module resolution
189+
if (await isDirectory(join(dirname(dtsFile), redirectPath))) {
190+
// This uses `/` instead of `path.join` here because `join` removes potential "./" prefixes
191+
redirectPath = `${redirectPath}/index`;
192+
}
193+
194+
return `${redirectPath}${extension}`;
195+
}
196+
167197
export async function redirectDtsImports(
168198
dtsFile: string,
169199
dtsExtension: string,
@@ -218,7 +248,7 @@ export async function redirectDtsImports(
218248
e: matchNode.range().end.index,
219249
};
220250
});
221-
const extensions = dtsExtension
251+
const extension = dtsExtension
222252
.replace(/\.d\.ts$/, '.js')
223253
.replace(/\.d\.cts$/, '.cjs')
224254
.replace(/\.d\.mts$/, '.mjs');
@@ -269,7 +299,7 @@ export async function redirectDtsImports(
269299
if (redirect.extension) {
270300
redirectImportPath = redirectImportPath.replace(
271301
/\.[^.]+$/,
272-
extensions,
302+
extension,
273303
);
274304
}
275305
}
@@ -278,15 +308,21 @@ export async function redirectDtsImports(
278308
absoluteImportPath &&
279309
normalize(absoluteImportPath).startsWith(normalize(rootDir))
280310
) {
281-
if (redirect.extension) {
282-
redirectImportPath = `${redirectImportPath}${extensions}`;
283-
}
311+
redirectImportPath = await addExtension(
312+
redirect,
313+
dtsFile,
314+
redirectImportPath,
315+
extension,
316+
);
284317
}
285318

286319
if (!absoluteImportPath && importPath.startsWith('.')) {
287-
if (redirect.extension) {
288-
redirectImportPath = `${redirectImportPath}${extensions}`;
289-
}
320+
redirectImportPath = await addExtension(
321+
redirect,
322+
dtsFile,
323+
redirectImportPath,
324+
extension,
325+
);
290326
}
291327
}
292328

tests/integration/redirect/dts.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ test('redirect.dts default', async () => {
1616
import { logger } from '../../../../compile/rslog';
1717
import { logRequest as logRequest2 } from '../logger';
1818
export { logRequest, logRequest2, logger };
19+
",
20+
"<ROOT>/tests/integration/redirect/dts/dist/default/esm/foo/index.d.ts": "export type Barrel = string;
1921
",
2022
"<ROOT>/tests/integration/redirect/dts/dist/default/esm/index.d.ts": "import { logRequest } from './logger';
2123
import { logger } from '../../../compile/rslog';
@@ -24,6 +26,8 @@ test('redirect.dts default', async () => {
2426
export { logRequest, logger, type LoggerOptions, defaultOptions };
2527
export type { Foo } from './types';
2628
export type { Bar } from './types';
29+
export * from './foo';
30+
export * from './foo';
2731
export * from './types';
2832
export * from '../../../compile/rslog';
2933
export * from './logger';
@@ -55,6 +59,8 @@ test('redirect.dts.path false', async () => {
5559
import { logger } from 'rslog';
5660
import { logRequest as logRequest2 } from '../logger';
5761
export { logRequest, logRequest2, logger };
62+
",
63+
"<ROOT>/tests/integration/redirect/dts/dist/path-false/esm/foo/index.d.ts": "export type Barrel = string;
5864
",
5965
"<ROOT>/tests/integration/redirect/dts/dist/path-false/esm/index.d.ts": "import { logRequest } from '@src/logger';
6066
import { logger } from 'rslog';
@@ -63,6 +69,8 @@ test('redirect.dts.path false', async () => {
6369
export { logRequest, logger, type LoggerOptions, defaultOptions };
6470
export type { Foo } from '@src/types';
6571
export type { Bar } from 'types';
72+
export * from './foo';
73+
export * from '@src/foo';
6674
export * from './types';
6775
export * from 'rslog';
6876
export * from '@src/logger';
@@ -94,6 +102,8 @@ test('redirect.dts.extension true', async () => {
94102
import { logger } from '../../../../compile/rslog';
95103
import { logRequest as logRequest2 } from '../logger.js';
96104
export { logRequest, logRequest2, logger };
105+
",
106+
"<ROOT>/tests/integration/redirect/dts/dist/extension-true/esm/foo/index.d.ts": "export type Barrel = string;
97107
",
98108
"<ROOT>/tests/integration/redirect/dts/dist/extension-true/esm/index.d.ts": "import { logRequest } from './logger.js';
99109
import { logger } from '../../../compile/rslog';
@@ -102,6 +112,8 @@ test('redirect.dts.extension true', async () => {
102112
export { logRequest, logger, type LoggerOptions, defaultOptions };
103113
export type { Foo } from './types.js';
104114
export type { Bar } from './types.js';
115+
export * from './foo/index.js';
116+
export * from './foo/index.js';
105117
export * from './types.js';
106118
export * from '../../../compile/rslog';
107119
export * from './logger.js';
@@ -133,6 +145,8 @@ test('redirect.dts.extension true with dts.autoExtension true', async () => {
133145
import { logger } from '../../../../compile/rslog';
134146
import { logRequest as logRequest2 } from '../logger.mjs';
135147
export { logRequest, logRequest2, logger };
148+
",
149+
"<ROOT>/tests/integration/redirect/dts/dist/auto-extension-true/esm/foo/index.d.mts": "export type Barrel = string;
136150
",
137151
"<ROOT>/tests/integration/redirect/dts/dist/auto-extension-true/esm/index.d.mts": "import { logRequest } from './logger.mjs';
138152
import { logger } from '../../../compile/rslog';
@@ -141,6 +155,8 @@ test('redirect.dts.extension true with dts.autoExtension true', async () => {
141155
export { logRequest, logger, type LoggerOptions, defaultOptions };
142156
export type { Foo } from './types.mjs';
143157
export type { Bar } from './types.mjs';
158+
export * from './foo/index.mjs';
159+
export * from './foo/index.mjs';
144160
export * from './types.mjs';
145161
export * from '../../../compile/rslog';
146162
export * from './logger.mjs';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export type Barrel = string;

tests/integration/redirect/dts/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ export { logRequest, logger, type LoggerOptions, defaultOptions };
77

88
export type { Foo } from '@src/types';
99
export type { Bar } from 'types';
10+
export * from './foo';
11+
export * from '@src/foo';
1012
export * from './types';
1113
export * from 'rslog';
1214
export * from '@src/logger';

0 commit comments

Comments
 (0)