Skip to content

Commit

Permalink
fix: redirect index file when redirect.dts.extension is enabled (#778)
Browse files Browse the repository at this point in the history
  • Loading branch information
Timeless0911 authored Feb 20, 2025
1 parent 4f8e9fc commit abc203b
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 8 deletions.
52 changes: 44 additions & 8 deletions packages/plugin-dts/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,15 @@ export async function pathExists(path: string): Promise<boolean> {
.catch(() => false);
}

export async function isDirectory(filePath: string): Promise<boolean> {
try {
const stat = await fsP.stat(filePath);
return stat.isDirectory();
} catch {
return false;
}
}

export async function emptyDir(dir: string): Promise<void> {
if (!(await pathExists(dir))) {
return;
Expand Down Expand Up @@ -164,6 +173,27 @@ export async function addBannerAndFooter(
}
}

async function addExtension(
redirect: DtsRedirect,
dtsFile: string,
path: string,
extension: string,
): Promise<string> {
if (!redirect.extension) {
return path;
}

let redirectPath = path;

// If the import path refers to a directory, it most likely actually refers to a `index.*` file due to Node's module resolution
if (await isDirectory(join(dirname(dtsFile), redirectPath))) {
// This uses `/` instead of `path.join` here because `join` removes potential "./" prefixes
redirectPath = `${redirectPath}/index`;
}

return `${redirectPath}${extension}`;
}

export async function redirectDtsImports(
dtsFile: string,
dtsExtension: string,
Expand Down Expand Up @@ -218,7 +248,7 @@ export async function redirectDtsImports(
e: matchNode.range().end.index,
};
});
const extensions = dtsExtension
const extension = dtsExtension
.replace(/\.d\.ts$/, '.js')
.replace(/\.d\.cts$/, '.cjs')
.replace(/\.d\.mts$/, '.mjs');
Expand Down Expand Up @@ -269,7 +299,7 @@ export async function redirectDtsImports(
if (redirect.extension) {
redirectImportPath = redirectImportPath.replace(
/\.[^.]+$/,
extensions,
extension,
);
}
}
Expand All @@ -278,15 +308,21 @@ export async function redirectDtsImports(
absoluteImportPath &&
normalize(absoluteImportPath).startsWith(normalize(rootDir))
) {
if (redirect.extension) {
redirectImportPath = `${redirectImportPath}${extensions}`;
}
redirectImportPath = await addExtension(
redirect,
dtsFile,
redirectImportPath,
extension,
);
}

if (!absoluteImportPath && importPath.startsWith('.')) {
if (redirect.extension) {
redirectImportPath = `${redirectImportPath}${extensions}`;
}
redirectImportPath = await addExtension(
redirect,
dtsFile,
redirectImportPath,
extension,
);
}
}

Expand Down
16 changes: 16 additions & 0 deletions tests/integration/redirect/dts.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ test('redirect.dts default', async () => {
import { logger } from '../../../../compile/rslog';
import { logRequest as logRequest2 } from '../logger';
export { logRequest, logRequest2, logger };
",
"<ROOT>/tests/integration/redirect/dts/dist/default/esm/foo/index.d.ts": "export type Barrel = string;
",
"<ROOT>/tests/integration/redirect/dts/dist/default/esm/index.d.ts": "import { logRequest } from './logger';
import { logger } from '../../../compile/rslog';
Expand All @@ -24,6 +26,8 @@ test('redirect.dts default', async () => {
export { logRequest, logger, type LoggerOptions, defaultOptions };
export type { Foo } from './types';
export type { Bar } from './types';
export * from './foo';
export * from './foo';
export * from './types';
export * from '../../../compile/rslog';
export * from './logger';
Expand Down Expand Up @@ -55,6 +59,8 @@ test('redirect.dts.path false', async () => {
import { logger } from 'rslog';
import { logRequest as logRequest2 } from '../logger';
export { logRequest, logRequest2, logger };
",
"<ROOT>/tests/integration/redirect/dts/dist/path-false/esm/foo/index.d.ts": "export type Barrel = string;
",
"<ROOT>/tests/integration/redirect/dts/dist/path-false/esm/index.d.ts": "import { logRequest } from '@src/logger';
import { logger } from 'rslog';
Expand All @@ -63,6 +69,8 @@ test('redirect.dts.path false', async () => {
export { logRequest, logger, type LoggerOptions, defaultOptions };
export type { Foo } from '@src/types';
export type { Bar } from 'types';
export * from './foo';
export * from '@src/foo';
export * from './types';
export * from 'rslog';
export * from '@src/logger';
Expand Down Expand Up @@ -94,6 +102,8 @@ test('redirect.dts.extension true', async () => {
import { logger } from '../../../../compile/rslog';
import { logRequest as logRequest2 } from '../logger.js';
export { logRequest, logRequest2, logger };
",
"<ROOT>/tests/integration/redirect/dts/dist/extension-true/esm/foo/index.d.ts": "export type Barrel = string;
",
"<ROOT>/tests/integration/redirect/dts/dist/extension-true/esm/index.d.ts": "import { logRequest } from './logger.js';
import { logger } from '../../../compile/rslog';
Expand All @@ -102,6 +112,8 @@ test('redirect.dts.extension true', async () => {
export { logRequest, logger, type LoggerOptions, defaultOptions };
export type { Foo } from './types.js';
export type { Bar } from './types.js';
export * from './foo/index.js';
export * from './foo/index.js';
export * from './types.js';
export * from '../../../compile/rslog';
export * from './logger.js';
Expand Down Expand Up @@ -133,6 +145,8 @@ test('redirect.dts.extension true with dts.autoExtension true', async () => {
import { logger } from '../../../../compile/rslog';
import { logRequest as logRequest2 } from '../logger.mjs';
export { logRequest, logRequest2, logger };
",
"<ROOT>/tests/integration/redirect/dts/dist/auto-extension-true/esm/foo/index.d.mts": "export type Barrel = string;
",
"<ROOT>/tests/integration/redirect/dts/dist/auto-extension-true/esm/index.d.mts": "import { logRequest } from './logger.mjs';
import { logger } from '../../../compile/rslog';
Expand All @@ -141,6 +155,8 @@ test('redirect.dts.extension true with dts.autoExtension true', async () => {
export { logRequest, logger, type LoggerOptions, defaultOptions };
export type { Foo } from './types.mjs';
export type { Bar } from './types.mjs';
export * from './foo/index.mjs';
export * from './foo/index.mjs';
export * from './types.mjs';
export * from '../../../compile/rslog';
export * from './logger.mjs';
Expand Down
1 change: 1 addition & 0 deletions tests/integration/redirect/dts/src/foo/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type Barrel = string;
2 changes: 2 additions & 0 deletions tests/integration/redirect/dts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ export { logRequest, logger, type LoggerOptions, defaultOptions };

export type { Foo } from '@src/types';
export type { Bar } from 'types';
export * from './foo';
export * from '@src/foo';
export * from './types';
export * from 'rslog';
export * from '@src/logger';

0 comments on commit abc203b

Please sign in to comment.