From e9dcaadd76c1dbe0b36f04ca1ea5c968b4bd4303 Mon Sep 17 00:00:00 2001 From: Timeless0911 <1604889533@qq.com> Date: Tue, 2 Dec 2025 19:10:52 +0800 Subject: [PATCH 1/2] fix(dts): check for existence of target path when `redirect.dts.extension` is enabled --- packages/plugin-dts/src/utils.ts | 58 ++++++++++--------- .../dts-tsgo/compile/prebundle-types/index.js | 1 + .../compile/prebundle-types/package.json | 8 +++ .../compile/prebundle-types/types/index.d.ts | 4 ++ .../redirect/dts-tsgo/src/config.ts | 1 + .../redirect/dts-tsgo/src/config/load.ts | 1 + .../redirect/dts-tsgo/src/index.ts | 4 +- .../redirect/dts-tsgo/tsconfig.json | 1 + tests/integration/redirect/dts.test.ts | 36 ++++++++++++ .../dts/compile/prebundle-types/index.js | 1 + .../dts/compile/prebundle-types/package.json | 8 +++ .../compile/prebundle-types/types/index.d.ts | 4 ++ tests/integration/redirect/dts/src/config.ts | 1 + .../redirect/dts/src/config/load.ts | 1 + tests/integration/redirect/dts/src/index.ts | 2 + tests/integration/redirect/dts/tsconfig.json | 1 + tests/integration/redirect/dtsTsgo.test.ts | 36 ++++++++++++ website/docs/en/config/lib/experiments.mdx | 2 +- website/docs/zh/config/lib/experiments.mdx | 2 +- 19 files changed, 143 insertions(+), 29 deletions(-) create mode 100644 tests/integration/redirect/dts-tsgo/compile/prebundle-types/index.js create mode 100644 tests/integration/redirect/dts-tsgo/compile/prebundle-types/package.json create mode 100644 tests/integration/redirect/dts-tsgo/compile/prebundle-types/types/index.d.ts create mode 100644 tests/integration/redirect/dts-tsgo/src/config.ts create mode 100644 tests/integration/redirect/dts-tsgo/src/config/load.ts create mode 100644 tests/integration/redirect/dts/compile/prebundle-types/index.js create mode 100644 tests/integration/redirect/dts/compile/prebundle-types/package.json create mode 100644 tests/integration/redirect/dts/compile/prebundle-types/types/index.d.ts create mode 100644 tests/integration/redirect/dts/src/config.ts create mode 100644 tests/integration/redirect/dts/src/config/load.ts diff --git a/packages/plugin-dts/src/utils.ts b/packages/plugin-dts/src/utils.ts index 44846932a..6bf7d9e04 100644 --- a/packages/plugin-dts/src/utils.ts +++ b/packages/plugin-dts/src/utils.ts @@ -237,26 +237,40 @@ async function addExtension( redirect: DtsRedirect, dtsFile: string, path: string, - extension: string, + jsExtension: string, + dtsExtension: string, ): Promise { if (!redirect.extension) { return path; } - let redirectPath = path; - - // Only add extension if redirectPath is an absolute or relative path - if (!isAbsolute(redirectPath) && !redirectPath.startsWith('.')) { - return redirectPath; + // Only add extension if path is an absolute or relative path + if (!isAbsolute(path) && !path.startsWith('.')) { + return path; } + const candidatePaths = []; + // 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))) { + if (await isDirectory(join(dirname(dtsFile), path))) { // This uses `/` instead of `path.join` here because `join` removes potential "./" prefixes - redirectPath = `${redirectPath.replace(/\/+$/, '')}/index`; + candidatePaths.push(`${path.replace(/\/+$/, '')}/index`); + } + + candidatePaths.push(path); + + // make sure the candidatePath exists, otherwise we may break the import, e.g. import 'foo.svg', import '../compile/prebundle-types' + for (const candidatePath of candidatePaths) { + if ( + await pathExists( + join(dirname(dtsFile), `${candidatePath}${dtsExtension}`), + ) + ) { + return `${candidatePath}${jsExtension}`; + } } - return `${redirectPath}${extension}`; + return path; } export async function redirectDtsImports( @@ -334,7 +348,7 @@ export async function redirectDtsImports( e: matchNode.range().end.index, }; }); - const extension = dtsExtension + const jsExtension = dtsExtension .replace(/\.d\.ts$/, '.js') .replace(/\.d\.cts$/, '.cjs') .replace(/\.d\.mts$/, '.mjs'); @@ -393,28 +407,18 @@ export async function redirectDtsImports( if (redirect.extension) { redirectImportPath = redirectImportPath.replace( /\.[^.]+$/, - extension, + jsExtension, ); } } else { // handle the case importPath is like './foo.bar', we need to check if './foo.bar.d.ts' exists - const candidatePath = await addExtension( + redirectImportPath = await addExtension( redirect, dtsFile, redirectImportPath, - extension, + jsExtension, + dtsExtension, ); - // make sure the candidatePath exists, otherwise we may break the import, e.g. import 'foo.svg' - if ( - await pathExists( - path.join( - dirname(dtsFile), - candidatePath.replace(/\.[^.]+$/, dtsExtension), - ), - ) - ) { - redirectImportPath = candidatePath; - } } } else { if ( @@ -425,7 +429,8 @@ export async function redirectDtsImports( redirect, dtsFile, redirectImportPath, - extension, + jsExtension, + dtsExtension, ); } @@ -434,7 +439,8 @@ export async function redirectDtsImports( redirect, dtsFile, redirectImportPath, - extension, + jsExtension, + dtsExtension, ); } } diff --git a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/index.js b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/index.js new file mode 100644 index 000000000..cc798ff50 --- /dev/null +++ b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/index.js @@ -0,0 +1 @@ +export const a = 1; diff --git a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/package.json b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/package.json new file mode 100644 index 000000000..37dd4a690 --- /dev/null +++ b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/package.json @@ -0,0 +1,8 @@ +{ + "name": "prebundle-types", + "version": "0.0.0", + "private": true, + "type": "module", + "module": "index.js", + "types": "types/index.d.ts" +} diff --git a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/types/index.d.ts b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/types/index.d.ts new file mode 100644 index 000000000..1ad38157c --- /dev/null +++ b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/types/index.d.ts @@ -0,0 +1,4 @@ +export interface PluginInstance { + apply: (compiler: any) => void; + [index: string]: any; +} diff --git a/tests/integration/redirect/dts-tsgo/src/config.ts b/tests/integration/redirect/dts-tsgo/src/config.ts new file mode 100644 index 000000000..3932f5ba9 --- /dev/null +++ b/tests/integration/redirect/dts-tsgo/src/config.ts @@ -0,0 +1 @@ +export * from './config/load'; diff --git a/tests/integration/redirect/dts-tsgo/src/config/load.ts b/tests/integration/redirect/dts-tsgo/src/config/load.ts new file mode 100644 index 000000000..b34410a12 --- /dev/null +++ b/tests/integration/redirect/dts-tsgo/src/config/load.ts @@ -0,0 +1 @@ +export const loadConfig = () => {}; diff --git a/tests/integration/redirect/dts-tsgo/src/index.ts b/tests/integration/redirect/dts-tsgo/src/index.ts index a6a576679..63223c0c8 100644 --- a/tests/integration/redirect/dts-tsgo/src/index.ts +++ b/tests/integration/redirect/dts-tsgo/src/index.ts @@ -18,12 +18,14 @@ export { export * from '@src/foo'; export * from '@src/logger'; export type { Foo } from '@src/types'; -// export { Router } from 'express'; export * from 'prebundle-pkg'; +// export { Router } from 'express'; +export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden'; export * from './.hidden-folder'; export * from './a.b'; export * from './bar.baz'; +export * from './config'; export * from './foo'; export * from './types'; diff --git a/tests/integration/redirect/dts-tsgo/tsconfig.json b/tests/integration/redirect/dts-tsgo/tsconfig.json index 6db3ff6ac..17cb87509 100644 --- a/tests/integration/redirect/dts-tsgo/tsconfig.json +++ b/tests/integration/redirect/dts-tsgo/tsconfig.json @@ -5,6 +5,7 @@ "paths": { "@src/*": ["./src/*"], "prebundle-pkg": ["./compile/prebundle-pkg"], + "prebundle-types": ["./compile/prebundle-types"], "self-entry": ["./src"], "express": ["./node_modules/express"], "*": ["./src/*"] diff --git a/tests/integration/redirect/dts.test.ts b/tests/integration/redirect/dts.test.ts index d1a7acb79..d5a2d7268 100644 --- a/tests/integration/redirect/dts.test.ts +++ b/tests/integration/redirect/dts.test.ts @@ -19,6 +19,10 @@ test('redirect.dts.path: true with redirect.dts.extension: false - default', asy "/tests/integration/redirect/dts/dist/default/esm/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts/dist/default/esm/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts/dist/default/esm/config.d.ts": "export * from './config/load'; + ", + "/tests/integration/redirect/dts/dist/default/esm/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts/dist/default/esm/foo/foo.d.ts": "import { logRequest } from '../logger'; import { logger } from '../../../../compile/prebundle-pkg'; @@ -39,11 +43,13 @@ test('redirect.dts.path: true with redirect.dts.extension: false - default', asy export type { Foo } from './types'; export { Router } from 'express'; export * from '../../../compile/prebundle-pkg'; + export type * from '../../../compile/prebundle-types'; export type { Bar } from './types'; export * from './.hidden'; export * from './.hidden-folder'; export * from './a.b'; export * from './bar.baz'; + export * from './config'; export * from './foo'; export * from './types'; ", @@ -80,6 +86,10 @@ test('redirect.dts.path: false with redirect.dts.extension: false', async () => "/tests/integration/redirect/dts/dist/path-false/esm/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts/dist/path-false/esm/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts/dist/path-false/esm/config.d.ts": "export * from './config/load'; + ", + "/tests/integration/redirect/dts/dist/path-false/esm/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts/dist/path-false/esm/foo/foo.d.ts": "import { logRequest } from '@src/logger'; import { logger } from 'prebundle-pkg'; @@ -100,11 +110,13 @@ test('redirect.dts.path: false with redirect.dts.extension: false', async () => export type { Foo } from '@src/types'; export { Router } from 'express'; export * from 'prebundle-pkg'; + export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden'; export * from './.hidden-folder'; export * from './a.b'; export * from './bar.baz'; + export * from './config'; export * from './foo'; export * from './types'; ", @@ -141,6 +153,10 @@ test('redirect.dts.path: true with redirect.dts.extension: true', async () => { "/tests/integration/redirect/dts/dist/extension-true/esm/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts/dist/extension-true/esm/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts/dist/extension-true/esm/config.d.ts": "export * from './config/load.js'; + ", + "/tests/integration/redirect/dts/dist/extension-true/esm/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts/dist/extension-true/esm/foo/foo.d.ts": "import { logRequest } from '../logger.js'; import { logger } from '../../../../compile/prebundle-pkg'; @@ -161,11 +177,13 @@ test('redirect.dts.path: true with redirect.dts.extension: true', async () => { export type { Foo } from './types.js'; export { Router } from 'express'; export * from '../../../compile/prebundle-pkg'; + export type * from '../../../compile/prebundle-types'; export type { Bar } from './types.js'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; export * from './a.b/index.js'; export * from './bar.baz.js'; + export * from './config.js'; export * from './foo/index.js'; export * from './types.js'; ", @@ -202,6 +220,10 @@ test('redirect.dts.path: false with dts.redirect.extension: true', async () => { "/tests/integration/redirect/dts/dist/path-false-extension-true/esm/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts/dist/path-false-extension-true/esm/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts/dist/path-false-extension-true/esm/config.d.ts": "export * from './config/load.js'; + ", + "/tests/integration/redirect/dts/dist/path-false-extension-true/esm/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts/dist/path-false-extension-true/esm/foo/foo.d.ts": "import { logRequest } from '@src/logger'; import { logger } from 'prebundle-pkg'; @@ -222,11 +244,13 @@ test('redirect.dts.path: false with dts.redirect.extension: true', async () => { export type { Foo } from '@src/types'; export { Router } from 'express'; export * from 'prebundle-pkg'; + export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; export * from './a.b/index.js'; export * from './bar.baz.js'; + export * from './config.js'; export * from './foo/index.js'; export * from './types.js'; ", @@ -271,6 +295,14 @@ test('redirect.dts.extension: true with dts.autoExtension: true', async () => { "/tests/integration/redirect/dts/dist/auto-extension-true/bar.baz.d.mts": "export declare const bar = "bar-baz"; ", "/tests/integration/redirect/dts/dist/auto-extension-true/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts/dist/auto-extension-true/config.d.mts": "export * from './config/load.mjs'; + ", + "/tests/integration/redirect/dts/dist/auto-extension-true/config.d.ts": "export * from './config/load.js'; + ", + "/tests/integration/redirect/dts/dist/auto-extension-true/config/load.d.mts": "export declare const loadConfig: () => void; + ", + "/tests/integration/redirect/dts/dist/auto-extension-true/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts/dist/auto-extension-true/foo/foo.d.mts": "import { logRequest } from '../logger.mjs'; import { logger } from '../../../compile/prebundle-pkg'; @@ -298,11 +330,13 @@ test('redirect.dts.extension: true with dts.autoExtension: true', async () => { export type { Foo } from './types.mjs'; export { Router } from 'express'; export * from '../../compile/prebundle-pkg'; + export type * from '../../compile/prebundle-types'; export type { Bar } from './types.mjs'; export * from './.hidden.mjs'; export * from './.hidden-folder/index.mjs'; export * from './a.b/index.mjs'; export * from './bar.baz.mjs'; + export * from './config.mjs'; export * from './foo/index.mjs'; export * from './types.mjs'; ", @@ -318,11 +352,13 @@ test('redirect.dts.extension: true with dts.autoExtension: true', async () => { export type { Foo } from './types.js'; export { Router } from 'express'; export * from '../../compile/prebundle-pkg'; + export type * from '../../compile/prebundle-types'; export type { Bar } from './types.js'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; export * from './a.b/index.js'; export * from './bar.baz.js'; + export * from './config.js'; export * from './foo/index.js'; export * from './types.js'; ", diff --git a/tests/integration/redirect/dts/compile/prebundle-types/index.js b/tests/integration/redirect/dts/compile/prebundle-types/index.js new file mode 100644 index 000000000..cc798ff50 --- /dev/null +++ b/tests/integration/redirect/dts/compile/prebundle-types/index.js @@ -0,0 +1 @@ +export const a = 1; diff --git a/tests/integration/redirect/dts/compile/prebundle-types/package.json b/tests/integration/redirect/dts/compile/prebundle-types/package.json new file mode 100644 index 000000000..37dd4a690 --- /dev/null +++ b/tests/integration/redirect/dts/compile/prebundle-types/package.json @@ -0,0 +1,8 @@ +{ + "name": "prebundle-types", + "version": "0.0.0", + "private": true, + "type": "module", + "module": "index.js", + "types": "types/index.d.ts" +} diff --git a/tests/integration/redirect/dts/compile/prebundle-types/types/index.d.ts b/tests/integration/redirect/dts/compile/prebundle-types/types/index.d.ts new file mode 100644 index 000000000..1ad38157c --- /dev/null +++ b/tests/integration/redirect/dts/compile/prebundle-types/types/index.d.ts @@ -0,0 +1,4 @@ +export interface PluginInstance { + apply: (compiler: any) => void; + [index: string]: any; +} diff --git a/tests/integration/redirect/dts/src/config.ts b/tests/integration/redirect/dts/src/config.ts new file mode 100644 index 000000000..3932f5ba9 --- /dev/null +++ b/tests/integration/redirect/dts/src/config.ts @@ -0,0 +1 @@ +export * from './config/load'; diff --git a/tests/integration/redirect/dts/src/config/load.ts b/tests/integration/redirect/dts/src/config/load.ts new file mode 100644 index 000000000..b34410a12 --- /dev/null +++ b/tests/integration/redirect/dts/src/config/load.ts @@ -0,0 +1 @@ +export const loadConfig = () => {}; diff --git a/tests/integration/redirect/dts/src/index.ts b/tests/integration/redirect/dts/src/index.ts index 8c0da979f..8d074c3c2 100644 --- a/tests/integration/redirect/dts/src/index.ts +++ b/tests/integration/redirect/dts/src/index.ts @@ -20,10 +20,12 @@ export * from '@src/logger'; export type { Foo } from '@src/types'; export { Router } from 'express'; export * from 'prebundle-pkg'; +export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden'; export * from './.hidden-folder'; export * from './a.b'; export * from './bar.baz'; +export * from './config'; export * from './foo'; export * from './types'; diff --git a/tests/integration/redirect/dts/tsconfig.json b/tests/integration/redirect/dts/tsconfig.json index 6db3ff6ac..17cb87509 100644 --- a/tests/integration/redirect/dts/tsconfig.json +++ b/tests/integration/redirect/dts/tsconfig.json @@ -5,6 +5,7 @@ "paths": { "@src/*": ["./src/*"], "prebundle-pkg": ["./compile/prebundle-pkg"], + "prebundle-types": ["./compile/prebundle-types"], "self-entry": ["./src"], "express": ["./node_modules/express"], "*": ["./src/*"] diff --git a/tests/integration/redirect/dtsTsgo.test.ts b/tests/integration/redirect/dtsTsgo.test.ts index f68a3a9e4..4c3f5058b 100644 --- a/tests/integration/redirect/dtsTsgo.test.ts +++ b/tests/integration/redirect/dtsTsgo.test.ts @@ -23,6 +23,10 @@ describe.skipIf(process.version.startsWith('v18'))( "/tests/integration/redirect/dts-tsgo/dist/default/esm/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts-tsgo/dist/default/esm/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts-tsgo/dist/default/esm/config.d.ts": "export * from './config/load'; + ", + "/tests/integration/redirect/dts-tsgo/dist/default/esm/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts-tsgo/dist/default/esm/foo/foo.d.ts": "import { logRequest } from '../logger'; import { logger } from '../../../../compile/prebundle-pkg'; @@ -42,11 +46,13 @@ describe.skipIf(process.version.startsWith('v18'))( export * from './logger'; export type { Foo } from './types'; export * from '../../../compile/prebundle-pkg'; + export type * from '../../../compile/prebundle-types'; export type { Bar } from './types'; export * from './.hidden'; export * from './.hidden-folder'; export * from './a.b'; export * from './bar.baz'; + export * from './config'; export * from './foo'; export * from './types'; ", @@ -82,6 +88,10 @@ describe.skipIf(process.version.startsWith('v18'))( "/tests/integration/redirect/dts-tsgo/dist/path-false/esm/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts-tsgo/dist/path-false/esm/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts-tsgo/dist/path-false/esm/config.d.ts": "export * from './config/load'; + ", + "/tests/integration/redirect/dts-tsgo/dist/path-false/esm/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts-tsgo/dist/path-false/esm/foo/foo.d.ts": "import { logRequest } from '@src/logger'; import { logger } from 'prebundle-pkg'; @@ -101,11 +111,13 @@ describe.skipIf(process.version.startsWith('v18'))( export * from '@src/logger'; export type { Foo } from '@src/types'; export * from 'prebundle-pkg'; + export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden'; export * from './.hidden-folder'; export * from './a.b'; export * from './bar.baz'; + export * from './config'; export * from './foo'; export * from './types'; ", @@ -141,6 +153,10 @@ describe.skipIf(process.version.startsWith('v18'))( "/tests/integration/redirect/dts-tsgo/dist/extension-true/esm/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts-tsgo/dist/extension-true/esm/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts-tsgo/dist/extension-true/esm/config.d.ts": "export * from './config/load.js'; + ", + "/tests/integration/redirect/dts-tsgo/dist/extension-true/esm/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts-tsgo/dist/extension-true/esm/foo/foo.d.ts": "import { logRequest } from '../logger.js'; import { logger } from '../../../../compile/prebundle-pkg'; @@ -160,11 +176,13 @@ describe.skipIf(process.version.startsWith('v18'))( export * from './logger.js'; export type { Foo } from './types.js'; export * from '../../../compile/prebundle-pkg'; + export type * from '../../../compile/prebundle-types'; export type { Bar } from './types.js'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; export * from './a.b/index.js'; export * from './bar.baz.js'; + export * from './config.js'; export * from './foo/index.js'; export * from './types.js'; ", @@ -200,6 +218,10 @@ describe.skipIf(process.version.startsWith('v18'))( "/tests/integration/redirect/dts-tsgo/dist/path-false-extension-true/esm/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts-tsgo/dist/path-false-extension-true/esm/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts-tsgo/dist/path-false-extension-true/esm/config.d.ts": "export * from './config/load.js'; + ", + "/tests/integration/redirect/dts-tsgo/dist/path-false-extension-true/esm/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts-tsgo/dist/path-false-extension-true/esm/foo/foo.d.ts": "import { logRequest } from '@src/logger'; import { logger } from 'prebundle-pkg'; @@ -219,11 +241,13 @@ describe.skipIf(process.version.startsWith('v18'))( export * from '@src/logger'; export type { Foo } from '@src/types'; export * from 'prebundle-pkg'; + export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; export * from './a.b/index.js'; export * from './bar.baz.js'; + export * from './config.js'; export * from './foo/index.js'; export * from './types.js'; ", @@ -259,6 +283,10 @@ describe.skipIf(process.version.startsWith('v18'))( "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/esm/a.b/index.d.mts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/esm/bar.baz.d.mts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/esm/config.d.mts": "export * from './config/load.mjs'; + ", + "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/esm/config/load.d.mts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/esm/foo/foo.d.mts": "import { logRequest } from '../logger.mjs'; import { logger } from '../../../../compile/prebundle-pkg'; @@ -278,11 +306,13 @@ describe.skipIf(process.version.startsWith('v18'))( export * from './logger.mjs'; export type { Foo } from './types.mjs'; export * from '../../../compile/prebundle-pkg'; + export type * from '../../../compile/prebundle-types'; export type { Bar } from './types.mjs'; export * from './.hidden.mjs'; export * from './.hidden-folder/index.mjs'; export * from './a.b/index.mjs'; export * from './bar.baz.mjs'; + export * from './config.mjs'; export * from './foo/index.mjs'; export * from './types.mjs'; ", @@ -315,6 +345,10 @@ describe.skipIf(process.version.startsWith('v18'))( "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/cjs/a.b/index.d.ts": "export declare const ab = "a.b"; ", "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/cjs/bar.baz.d.ts": "export declare const bar = "bar-baz"; + ", + "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/cjs/config.d.ts": "export * from './config/load.js'; + ", + "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/cjs/config/load.d.ts": "export declare const loadConfig: () => void; ", "/tests/integration/redirect/dts-tsgo/dist/auto-extension-true/cjs/foo/foo.d.ts": "import { logRequest } from '../logger.js'; import { logger } from '../../../../compile/prebundle-pkg'; @@ -334,11 +368,13 @@ describe.skipIf(process.version.startsWith('v18'))( export * from './logger.js'; export type { Foo } from './types.js'; export * from '../../../compile/prebundle-pkg'; + export type * from '../../../compile/prebundle-types'; export type { Bar } from './types.js'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; export * from './a.b/index.js'; export * from './bar.baz.js'; + export * from './config.js'; export * from './foo/index.js'; export * from './types.js'; ", diff --git a/website/docs/en/config/lib/experiments.mdx b/website/docs/en/config/lib/experiments.mdx index 31d5bd70e..45d245d06 100644 --- a/website/docs/en/config/lib/experiments.mdx +++ b/website/docs/en/config/lib/experiments.mdx @@ -13,7 +13,7 @@ Controls whether to enable Rspack experimental ESM output. When enabled, it emit Currently this option only takes effect in bundle mode when format is `'esm'`. ::: -```js title="rslib.config.js" +```js title="rslib.config.ts" export default { lib: [ { diff --git a/website/docs/zh/config/lib/experiments.mdx b/website/docs/zh/config/lib/experiments.mdx index 545e7c055..aea5ca132 100644 --- a/website/docs/zh/config/lib/experiments.mdx +++ b/website/docs/zh/config/lib/experiments.mdx @@ -13,7 +13,7 @@ 目前该选项仅在 bundle 模式下且 format 为 `'esm'` 时生效。 ::: -```js title="rslib.config.js" +```js title="rslib.config.ts" export default { lib: [ { From 8bb24777c554dbe6bbfefed550b8518b9e612766 Mon Sep 17 00:00:00 2001 From: Timeless0911 <1604889533@qq.com> Date: Tue, 2 Dec 2025 19:34:34 +0800 Subject: [PATCH 2/2] chore: update --- packages/plugin-dts/src/utils.ts | 2 +- .../redirect/dts-tsgo/compile/prebundle-types/index.js | 1 - .../dts-tsgo/compile/prebundle-types/package.json | 8 -------- .../dts-tsgo/compile/prebundle-types/types/index.d.ts | 4 ---- tests/integration/redirect/dts-tsgo/src/index.ts | 1 - tests/integration/redirect/dts-tsgo/tsconfig.json | 1 - tests/integration/redirect/dts.test.ts | 6 ------ .../redirect/dts/compile/prebundle-types/index.js | 1 - .../redirect/dts/compile/prebundle-types/package.json | 8 -------- .../redirect/dts/compile/prebundle-types/types/index.d.ts | 4 ---- tests/integration/redirect/dts/src/index.ts | 1 - tests/integration/redirect/dts/tsconfig.json | 1 - tests/integration/redirect/dtsTsgo.test.ts | 6 ------ 13 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 tests/integration/redirect/dts-tsgo/compile/prebundle-types/index.js delete mode 100644 tests/integration/redirect/dts-tsgo/compile/prebundle-types/package.json delete mode 100644 tests/integration/redirect/dts-tsgo/compile/prebundle-types/types/index.d.ts delete mode 100644 tests/integration/redirect/dts/compile/prebundle-types/index.js delete mode 100644 tests/integration/redirect/dts/compile/prebundle-types/package.json delete mode 100644 tests/integration/redirect/dts/compile/prebundle-types/types/index.d.ts diff --git a/packages/plugin-dts/src/utils.ts b/packages/plugin-dts/src/utils.ts index 6bf7d9e04..a43ff52cf 100644 --- a/packages/plugin-dts/src/utils.ts +++ b/packages/plugin-dts/src/utils.ts @@ -259,7 +259,7 @@ async function addExtension( candidatePaths.push(path); - // make sure the candidatePath exists, otherwise we may break the import, e.g. import 'foo.svg', import '../compile/prebundle-types' + // make sure the candidatePath exists, otherwise we may break the import, e.g. import 'foo.svg', import '../foo/index' for (const candidatePath of candidatePaths) { if ( await pathExists( diff --git a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/index.js b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/index.js deleted file mode 100644 index cc798ff50..000000000 --- a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/index.js +++ /dev/null @@ -1 +0,0 @@ -export const a = 1; diff --git a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/package.json b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/package.json deleted file mode 100644 index 37dd4a690..000000000 --- a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "prebundle-types", - "version": "0.0.0", - "private": true, - "type": "module", - "module": "index.js", - "types": "types/index.d.ts" -} diff --git a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/types/index.d.ts b/tests/integration/redirect/dts-tsgo/compile/prebundle-types/types/index.d.ts deleted file mode 100644 index 1ad38157c..000000000 --- a/tests/integration/redirect/dts-tsgo/compile/prebundle-types/types/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface PluginInstance { - apply: (compiler: any) => void; - [index: string]: any; -} diff --git a/tests/integration/redirect/dts-tsgo/src/index.ts b/tests/integration/redirect/dts-tsgo/src/index.ts index 63223c0c8..977528a4b 100644 --- a/tests/integration/redirect/dts-tsgo/src/index.ts +++ b/tests/integration/redirect/dts-tsgo/src/index.ts @@ -20,7 +20,6 @@ export * from '@src/logger'; export type { Foo } from '@src/types'; export * from 'prebundle-pkg'; // export { Router } from 'express'; -export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden'; export * from './.hidden-folder'; diff --git a/tests/integration/redirect/dts-tsgo/tsconfig.json b/tests/integration/redirect/dts-tsgo/tsconfig.json index 17cb87509..6db3ff6ac 100644 --- a/tests/integration/redirect/dts-tsgo/tsconfig.json +++ b/tests/integration/redirect/dts-tsgo/tsconfig.json @@ -5,7 +5,6 @@ "paths": { "@src/*": ["./src/*"], "prebundle-pkg": ["./compile/prebundle-pkg"], - "prebundle-types": ["./compile/prebundle-types"], "self-entry": ["./src"], "express": ["./node_modules/express"], "*": ["./src/*"] diff --git a/tests/integration/redirect/dts.test.ts b/tests/integration/redirect/dts.test.ts index d5a2d7268..a9d2eb63f 100644 --- a/tests/integration/redirect/dts.test.ts +++ b/tests/integration/redirect/dts.test.ts @@ -43,7 +43,6 @@ test('redirect.dts.path: true with redirect.dts.extension: false - default', asy export type { Foo } from './types'; export { Router } from 'express'; export * from '../../../compile/prebundle-pkg'; - export type * from '../../../compile/prebundle-types'; export type { Bar } from './types'; export * from './.hidden'; export * from './.hidden-folder'; @@ -110,7 +109,6 @@ test('redirect.dts.path: false with redirect.dts.extension: false', async () => export type { Foo } from '@src/types'; export { Router } from 'express'; export * from 'prebundle-pkg'; - export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden'; export * from './.hidden-folder'; @@ -177,7 +175,6 @@ test('redirect.dts.path: true with redirect.dts.extension: true', async () => { export type { Foo } from './types.js'; export { Router } from 'express'; export * from '../../../compile/prebundle-pkg'; - export type * from '../../../compile/prebundle-types'; export type { Bar } from './types.js'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; @@ -244,7 +241,6 @@ test('redirect.dts.path: false with dts.redirect.extension: true', async () => { export type { Foo } from '@src/types'; export { Router } from 'express'; export * from 'prebundle-pkg'; - export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; @@ -330,7 +326,6 @@ test('redirect.dts.extension: true with dts.autoExtension: true', async () => { export type { Foo } from './types.mjs'; export { Router } from 'express'; export * from '../../compile/prebundle-pkg'; - export type * from '../../compile/prebundle-types'; export type { Bar } from './types.mjs'; export * from './.hidden.mjs'; export * from './.hidden-folder/index.mjs'; @@ -352,7 +347,6 @@ test('redirect.dts.extension: true with dts.autoExtension: true', async () => { export type { Foo } from './types.js'; export { Router } from 'express'; export * from '../../compile/prebundle-pkg'; - export type * from '../../compile/prebundle-types'; export type { Bar } from './types.js'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; diff --git a/tests/integration/redirect/dts/compile/prebundle-types/index.js b/tests/integration/redirect/dts/compile/prebundle-types/index.js deleted file mode 100644 index cc798ff50..000000000 --- a/tests/integration/redirect/dts/compile/prebundle-types/index.js +++ /dev/null @@ -1 +0,0 @@ -export const a = 1; diff --git a/tests/integration/redirect/dts/compile/prebundle-types/package.json b/tests/integration/redirect/dts/compile/prebundle-types/package.json deleted file mode 100644 index 37dd4a690..000000000 --- a/tests/integration/redirect/dts/compile/prebundle-types/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "prebundle-types", - "version": "0.0.0", - "private": true, - "type": "module", - "module": "index.js", - "types": "types/index.d.ts" -} diff --git a/tests/integration/redirect/dts/compile/prebundle-types/types/index.d.ts b/tests/integration/redirect/dts/compile/prebundle-types/types/index.d.ts deleted file mode 100644 index 1ad38157c..000000000 --- a/tests/integration/redirect/dts/compile/prebundle-types/types/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface PluginInstance { - apply: (compiler: any) => void; - [index: string]: any; -} diff --git a/tests/integration/redirect/dts/src/index.ts b/tests/integration/redirect/dts/src/index.ts index 8d074c3c2..316eda25b 100644 --- a/tests/integration/redirect/dts/src/index.ts +++ b/tests/integration/redirect/dts/src/index.ts @@ -20,7 +20,6 @@ export * from '@src/logger'; export type { Foo } from '@src/types'; export { Router } from 'express'; export * from 'prebundle-pkg'; -export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden'; export * from './.hidden-folder'; diff --git a/tests/integration/redirect/dts/tsconfig.json b/tests/integration/redirect/dts/tsconfig.json index 17cb87509..6db3ff6ac 100644 --- a/tests/integration/redirect/dts/tsconfig.json +++ b/tests/integration/redirect/dts/tsconfig.json @@ -5,7 +5,6 @@ "paths": { "@src/*": ["./src/*"], "prebundle-pkg": ["./compile/prebundle-pkg"], - "prebundle-types": ["./compile/prebundle-types"], "self-entry": ["./src"], "express": ["./node_modules/express"], "*": ["./src/*"] diff --git a/tests/integration/redirect/dtsTsgo.test.ts b/tests/integration/redirect/dtsTsgo.test.ts index 4c3f5058b..8820b8f5d 100644 --- a/tests/integration/redirect/dtsTsgo.test.ts +++ b/tests/integration/redirect/dtsTsgo.test.ts @@ -46,7 +46,6 @@ describe.skipIf(process.version.startsWith('v18'))( export * from './logger'; export type { Foo } from './types'; export * from '../../../compile/prebundle-pkg'; - export type * from '../../../compile/prebundle-types'; export type { Bar } from './types'; export * from './.hidden'; export * from './.hidden-folder'; @@ -111,7 +110,6 @@ describe.skipIf(process.version.startsWith('v18'))( export * from '@src/logger'; export type { Foo } from '@src/types'; export * from 'prebundle-pkg'; - export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden'; export * from './.hidden-folder'; @@ -176,7 +174,6 @@ describe.skipIf(process.version.startsWith('v18'))( export * from './logger.js'; export type { Foo } from './types.js'; export * from '../../../compile/prebundle-pkg'; - export type * from '../../../compile/prebundle-types'; export type { Bar } from './types.js'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; @@ -241,7 +238,6 @@ describe.skipIf(process.version.startsWith('v18'))( export * from '@src/logger'; export type { Foo } from '@src/types'; export * from 'prebundle-pkg'; - export type * from 'prebundle-types'; export type { Bar } from 'types'; export * from './.hidden.js'; export * from './.hidden-folder/index.js'; @@ -306,7 +302,6 @@ describe.skipIf(process.version.startsWith('v18'))( export * from './logger.mjs'; export type { Foo } from './types.mjs'; export * from '../../../compile/prebundle-pkg'; - export type * from '../../../compile/prebundle-types'; export type { Bar } from './types.mjs'; export * from './.hidden.mjs'; export * from './.hidden-folder/index.mjs'; @@ -368,7 +363,6 @@ describe.skipIf(process.version.startsWith('v18'))( export * from './logger.js'; export type { Foo } from './types.js'; export * from '../../../compile/prebundle-pkg'; - export type * from '../../../compile/prebundle-types'; export type { Bar } from './types.js'; export * from './.hidden.js'; export * from './.hidden-folder/index.js';