diff --git a/README.md b/README.md index f681d44..3b54d4c 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ export interface Resolver { /** * Transform source to declaration files * - * Note that the path of the return files should base on `root`, not `outDir` + * Note that the path of the returns should base on `outDir`, or relative path to `root` */ transform: (payload: { id: string, diff --git a/README.zh-CN.md b/README.zh-CN.md index 3cc12a0..f500b9a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -98,7 +98,7 @@ export interface Resolver { /** * 将源文件转换为类型文件 * - * 注意,返回的文件的路径应该基于 `root` 而不是 `outDir` + * 注意,返回的文件的路径应该基于 `outDir`,或者相对于 `root` */ transform: (payload: { id: string, diff --git a/examples/ts/tsconfig.json b/examples/ts/tsconfig.json index c21f6d1..90cfc00 100644 --- a/examples/ts/tsconfig.json +++ b/examples/ts/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "target": "esnext", "module": "esnext", - "moduleResolution": "node", + "moduleResolution": "Bundler", "importHelpers": true, "outDir": "dist", "strict": true, diff --git a/examples/ts/vite.config.ts b/examples/ts/vite.config.ts index f0d7e88..295b6bd 100644 --- a/examples/ts/vite.config.ts +++ b/examples/ts/vite.config.ts @@ -26,7 +26,7 @@ export default defineConfig({ exclude: ['src/ignore'], // aliasesExclude: [/^@components/], staticImport: true, - rollupTypes: true, + // rollupTypes: true, insertTypesEntry: true }) ] diff --git a/src/plugin.ts b/src/plugin.ts index 7a6a77d..bdfaf92 100644 --- a/src/plugin.ts +++ b/src/plugin.ts @@ -344,14 +344,20 @@ export function dtsPlugin(options: PluginOptions = {}): import('vite').Plugin { }) for (const { path, content } of result) { - outputFiles.set(ensureAbsolute(path, publicRoot), content) + outputFiles.set( + resolve(publicRoot, relative(outDir, ensureAbsolute(path, outDir))), + content + ) } } else { const sourceFile = program.getSourceFile(id) if (sourceFile) { for (const outputFile of service.getEmitOutput(sourceFile.fileName, true).outputFiles) { - outputFiles.set(resolve(publicRoot, relative(outDir, outputFile.name)), outputFile.text) + outputFiles.set( + resolve(publicRoot, relative(outDir, ensureAbsolute(outputFile.name, outDir))), + outputFile.text + ) } } } @@ -429,7 +435,10 @@ export function dtsPlugin(options: PluginOptions = {}): import('vite').Plugin { if (rootFiles.has(sourceFile.fileName)) { for (const outputFile of service.getEmitOutput(sourceFile.fileName, true).outputFiles) { - outputFiles.set(resolve(publicRoot, relative(outDir, outputFile.name)), outputFile.text) + outputFiles.set( + resolve(publicRoot, relative(outDir, ensureAbsolute(outputFile.name, outDir))), + outputFile.text + ) } rootFiles.delete(sourceFile.fileName) diff --git a/src/resolvers/json.ts b/src/resolvers/json.ts index 58e9639..8dc0740 100644 --- a/src/resolvers/json.ts +++ b/src/resolvers/json.ts @@ -1,3 +1,5 @@ +import { relative } from 'node:path' + import type { Resolver } from '../types' const jsonRE = /\.json$/ @@ -8,14 +10,14 @@ export function JsonResolver(): Resolver { supports(id) { return jsonRE.test(id) }, - transform({ id, program }) { + transform({ id, root, program }) { const sourceFile = program.getSourceFile(id) if (!sourceFile) return [] return [ { - path: `${id}.d.ts`, + path: relative(root, `${id}.d.ts`), content: `declare const _default: ${sourceFile.text};\n\nexport default _default;\n` } ] diff --git a/src/resolvers/svelte.ts b/src/resolvers/svelte.ts index cd8daa3..77b1f7e 100644 --- a/src/resolvers/svelte.ts +++ b/src/resolvers/svelte.ts @@ -1,3 +1,5 @@ +import { relative } from 'node:path' + import type { Resolver } from '../types' const svelteRE = /\.svelte$/ @@ -8,10 +10,10 @@ export function SvelteResolver(): Resolver { supports(id) { return svelteRE.test(id) }, - transform({ id }) { + transform({ id, root }) { return [ { - path: `${id}.d.ts`, + path: relative(root, `${id}.d.ts`), content: "export { SvelteComponentTyped as default } from 'svelte';\n" } ] diff --git a/src/resolvers/vue.ts b/src/resolvers/vue.ts index f6be279..75bab63 100644 --- a/src/resolvers/vue.ts +++ b/src/resolvers/vue.ts @@ -1,7 +1,3 @@ -import { relative } from 'node:path' - -import { resolve } from '../utils' - import type { Resolver } from '../types' const vueRE = /\.vue$/ @@ -12,7 +8,7 @@ export function VueResolver(): Resolver { supports(id) { return vueRE.test(id) }, - transform({ id, root, outDir, program, service }) { + transform({ id, program, service }) { const sourceFile = program.getSourceFile(id) || program.getSourceFile(id + '.ts') || @@ -24,7 +20,7 @@ export function VueResolver(): Resolver { return service.getEmitOutput(sourceFile.fileName, true).outputFiles.map(file => { return { - path: resolve(root, relative(outDir, file.name)), + path: file.name, content: file.text } }) diff --git a/src/types.ts b/src/types.ts index 7d4043a..c3370de 100644 --- a/src/types.ts +++ b/src/types.ts @@ -17,7 +17,7 @@ export interface Resolver { /** * Transform source to declaration files * - * Note that the path of the return files should base on `root`, not `outDir` + * Note that the path of the returns should base on `outDir`, or relative path to `root` */ transform: (payload: { id: string,