vite-plugin-dts 3.6.3 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -13
- package/README.zh-CN.md +31 -14
- package/dist/index.cjs +45 -25
- package/dist/index.d.cts +6 -2
- package/dist/index.d.mts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.mjs +43 -26
- package/package.json +21 -20
package/README.md
CHANGED
|
@@ -59,18 +59,6 @@ Starting with `3.0.0`, you can use this plugin with Rollup.
|
|
|
59
59
|
|
|
60
60
|
Here are some FAQ's and solutions.
|
|
61
61
|
|
|
62
|
-
### Missing some declaration files after build (before `1.7.0`)
|
|
63
|
-
|
|
64
|
-
By default, the `skipDiagnostics` option is set to `true` which means type diagnostics will be skipped during the build process (some projects may have diagnostic tools such as `vue-tsc`). Files with type errors which interrupt the build process will not be emitted (declaration files won't be generated).
|
|
65
|
-
|
|
66
|
-
If your project doesn't use type diagnostic tools, you can set `skipDiagnostics: false` and `logDiagnostics: true` to turn on diagnostic and logging features of this plugin. Type errors during build will be logged to the terminal.
|
|
67
|
-
|
|
68
|
-
### Type error when using both `script` and `setup-script` in Vue component (before `3.0.0`)
|
|
69
|
-
|
|
70
|
-
This is usually caused by using the `defineComponent` function in both `script` and `setup-script`. When `vue/compiler-sfc` compiles these files, the default export result from `script` gets merged with the parameter object of `defineComponent` from `setup-script`. This is incompatible with parameters and types returned from `defineComponent`. This results in a type error.
|
|
71
|
-
|
|
72
|
-
Here is a simple [example](https://github.com/qmhc/vite-plugin-dts/blob/main/examples/vue/components/BothScripts.vue). You should remove the `defineComponent` in `script` and export a native object directly.
|
|
73
|
-
|
|
74
62
|
### Type errors that are unable to infer types from packages in `node_modules`
|
|
75
63
|
|
|
76
64
|
This is an existing [TypeScript issue](https://github.com/microsoft/TypeScript/issues/42873) where TypeScript infers types from packages located in `node_modules` through soft links (pnpm). A workaround is to add `baseUrl` to your `tsconfig.json` and specify the `paths` for these packages:
|
|
@@ -86,6 +74,33 @@ This is an existing [TypeScript issue](https://github.com/microsoft/TypeScript/i
|
|
|
86
74
|
}
|
|
87
75
|
```
|
|
88
76
|
|
|
77
|
+
### `Internal Error` occurs when using `rollupTypes: true`
|
|
78
|
+
|
|
79
|
+
Refer to this [issue](https://github.com/microsoft/rushstack/issues/3875), it's due to a limitation of `@microsoft/api-extractor` or TypeScript resolver.
|
|
80
|
+
|
|
81
|
+
The main reason is that `baseUrl` is specified in `tsconfig.json` and non-standard paths are used directly when imported.
|
|
82
|
+
|
|
83
|
+
For example: `baseUrl: 'src'` is specified and importing from `<root>/src/components/index.ts` in `<root>/src/index.ts`, and `import 'components'` is used instead of `import './components'`.
|
|
84
|
+
|
|
85
|
+
Currently, you need to avoid the above situation, or use aliases instead (with the `paths` option).
|
|
86
|
+
|
|
87
|
+
<details>
|
|
88
|
+
<summary>Legacy</summary>
|
|
89
|
+
|
|
90
|
+
### Missing some declaration files after build (before `1.7.0`)
|
|
91
|
+
|
|
92
|
+
By default, the `skipDiagnostics` option is set to `true` which means type diagnostics will be skipped during the build process (some projects may have diagnostic tools such as `vue-tsc`). Files with type errors which interrupt the build process will not be emitted (declaration files won't be generated).
|
|
93
|
+
|
|
94
|
+
If your project doesn't use type diagnostic tools, you can set `skipDiagnostics: false` and `logDiagnostics: true` to turn on diagnostic and logging features of this plugin. Type errors during build will be logged to the terminal.
|
|
95
|
+
|
|
96
|
+
### Type error when using both `script` and `setup-script` in Vue component (before `3.0.0`)
|
|
97
|
+
|
|
98
|
+
This is usually caused by using the `defineComponent` function in both `script` and `setup-script`. When `vue/compiler-sfc` compiles these files, the default export result from `script` gets merged with the parameter object of `defineComponent` from `setup-script`. This is incompatible with parameters and types returned from `defineComponent`. This results in a type error.
|
|
99
|
+
|
|
100
|
+
Here is a simple [example](https://github.com/qmhc/vite-plugin-dts/blob/main/examples/vue/components/BothScripts.vue). You should remove the `defineComponent` in `script` and export a native object directly.
|
|
101
|
+
|
|
102
|
+
</details>
|
|
103
|
+
|
|
89
104
|
## Options
|
|
90
105
|
|
|
91
106
|
```ts
|
|
@@ -343,6 +358,8 @@ export interface PluginOptions {
|
|
|
343
358
|
/**
|
|
344
359
|
* Hook called after all declaration files are written
|
|
345
360
|
*
|
|
361
|
+
* It will be received a map (path -> content) that records those emitted files
|
|
362
|
+
*
|
|
346
363
|
* @default () => {}
|
|
347
364
|
*/
|
|
348
365
|
afterBuild?: () => MaybePromise<void>
|
|
@@ -354,7 +371,7 @@ export interface PluginOptions {
|
|
|
354
371
|
Thanks for all the contributions!
|
|
355
372
|
|
|
356
373
|
<a href="https://github.com/qmhc/vite-plugin-dts/graphs/contributors">
|
|
357
|
-
<img src="https://contrib.rocks/image?repo=qmhc/vite-plugin-dts" />
|
|
374
|
+
<img src="https://contrib.rocks/image?repo=qmhc/vite-plugin-dts" alt="contributors" />
|
|
358
375
|
</a>
|
|
359
376
|
|
|
360
377
|
## Example
|
package/README.zh-CN.md
CHANGED
|
@@ -59,18 +59,6 @@ export default defineConfig({
|
|
|
59
59
|
|
|
60
60
|
此处将收录一些常见的问题并提供一些解决方案。
|
|
61
61
|
|
|
62
|
-
### 打包后出现类型文件缺失 (`1.7.0` 之前)
|
|
63
|
-
|
|
64
|
-
默认情况下 `skipDiagnostics` 选项的值为 `true`,这意味着打包过程中将跳过类型检查(一些项目通常有 `vue-tsc` 等的类型检查工具),这时如果出现存在类型错误的文件,并且这是错误会中断打包过程,那么这些文件对应的类型文件将不会被生成。
|
|
65
|
-
|
|
66
|
-
如果您的项目没有依赖外部的类型检查工具,这时候可以您可以设置 `skipDiagnostics: false` 和 `logDiagnostics: true` 来打开插件的诊断与输出功能,这将帮助您检查打包过程中出现的类型错误并将错误信息输出至终端。
|
|
67
|
-
|
|
68
|
-
### Vue 组件中同时使用了 `script` 和 `setup-script` 后出现类型错误(`3.0.0` 之前)
|
|
69
|
-
|
|
70
|
-
这通常是由于分别在 `script` 和 `setup-script` 中同时使用了 `defineComponent` 方法导致的。 `vue/compiler-sfc` 为这类文件编译时会将 `script` 中的默认导出结果合并到 `setup-script` 的 `defineComponent` 的参数定义中,而 `defineComponent` 的参数类型与结果类型并不兼容,这一行为将会导致类型错误。
|
|
71
|
-
|
|
72
|
-
这是一个简单的[示例](https://github.com/qmhc/vite-plugin-dts/blob/main/example/components/BothScripts.vue),您应该将位于 `script` 中的 `defineComponent` 方法移除,直接导出一个原始的对象。
|
|
73
|
-
|
|
74
62
|
### 打包时出现了无法从 `node_modules` 的包中推断类型的错误
|
|
75
63
|
|
|
76
64
|
这是 TypeScript 通过软链接 (pnpm) 读取 `node_modules` 中过的类型时会出现的一个已知的问题,可以参考这个 [issue](https://github.com/microsoft/TypeScript/issues/42873),目前已有的一个解决方案,在你的 `tsconfig.json` 中添加 `baseUrl` 以及在 `paths` 添加这些包的路径:
|
|
@@ -86,6 +74,33 @@ export default defineConfig({
|
|
|
86
74
|
}
|
|
87
75
|
```
|
|
88
76
|
|
|
77
|
+
### 在 `rollupTypes: true` 时出现 `Internal Error`
|
|
78
|
+
|
|
79
|
+
参考这个 [issue](https://github.com/microsoft/rushstack/issues/3875),这是由于 `@microsoft/api-extractor` 或者是 TypeScript 解析器的一些限制导致的。
|
|
80
|
+
|
|
81
|
+
主要原因在于 `tsconfig.json` 中指定了 `baseUrl` 并且在引入时直接使用非标准路径。
|
|
82
|
+
|
|
83
|
+
例如:指定了 `baseUrl: 'src'` 并且在 `<root>/src/index.ts` 中引入 `<root>/src/components/index.ts` 时使用了 `import 'components'` 而不是 `import './components'`。
|
|
84
|
+
|
|
85
|
+
目前想要正常打包,需要规避上述情况,或使用别名代替(配合 `paths` 属性)。
|
|
86
|
+
|
|
87
|
+
<details>
|
|
88
|
+
<summary>过时的</summary>
|
|
89
|
+
|
|
90
|
+
### 打包后出现类型文件缺失 (`1.7.0` 之前)
|
|
91
|
+
|
|
92
|
+
默认情况下 `skipDiagnostics` 选项的值为 `true`,这意味着打包过程中将跳过类型检查(一些项目通常有 `vue-tsc` 等的类型检查工具),这时如果出现存在类型错误的文件,并且这是错误会中断打包过程,那么这些文件对应的类型文件将不会被生成。
|
|
93
|
+
|
|
94
|
+
如果您的项目没有依赖外部的类型检查工具,这时候可以您可以设置 `skipDiagnostics: false` 和 `logDiagnostics: true` 来打开插件的诊断与输出功能,这将帮助您检查打包过程中出现的类型错误并将错误信息输出至终端。
|
|
95
|
+
|
|
96
|
+
### Vue 组件中同时使用了 `script` 和 `setup-script` 后出现类型错误(`3.0.0` 之前)
|
|
97
|
+
|
|
98
|
+
这通常是由于分别在 `script` 和 `setup-script` 中同时使用了 `defineComponent` 方法导致的。 `vue/compiler-sfc` 为这类文件编译时会将 `script` 中的默认导出结果合并到 `setup-script` 的 `defineComponent` 的参数定义中,而 `defineComponent` 的参数类型与结果类型并不兼容,这一行为将会导致类型错误。
|
|
99
|
+
|
|
100
|
+
这是一个简单的[示例](https://github.com/qmhc/vite-plugin-dts/blob/main/example/components/BothScripts.vue),您应该将位于 `script` 中的 `defineComponent` 方法移除,直接导出一个原始的对象。
|
|
101
|
+
|
|
102
|
+
</details>
|
|
103
|
+
|
|
89
104
|
## 选项
|
|
90
105
|
|
|
91
106
|
```ts
|
|
@@ -343,9 +358,11 @@ export interface PluginOptions {
|
|
|
343
358
|
/**
|
|
344
359
|
* 在所有类型文件被写入后调用的钩子
|
|
345
360
|
*
|
|
361
|
+
* 它会接收一个记录了那些最终被写入的文件的映射(path -> content)
|
|
362
|
+
*
|
|
346
363
|
* @default () => {}
|
|
347
364
|
*/
|
|
348
|
-
afterBuild?: () => MaybePromise<void>
|
|
365
|
+
afterBuild?: (emittedFiles: Map<string, string>) => MaybePromise<void>
|
|
349
366
|
}
|
|
350
367
|
```
|
|
351
368
|
|
|
@@ -354,7 +371,7 @@ export interface PluginOptions {
|
|
|
354
371
|
感谢他们的所做的一切贡献!
|
|
355
372
|
|
|
356
373
|
<a href="https://github.com/qmhc/vite-plugin-dts/graphs/contributors">
|
|
357
|
-
<img src="https://contrib.rocks/image?repo=qmhc/vite-plugin-dts" />
|
|
374
|
+
<img src="https://contrib.rocks/image?repo=qmhc/vite-plugin-dts" alt="contributors" />
|
|
358
375
|
</a>
|
|
359
376
|
|
|
360
377
|
## 示例
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
const node_path = require('node:path');
|
|
4
6
|
const node_fs = require('node:fs');
|
|
5
7
|
const promises = require('node:fs/promises');
|
|
@@ -206,6 +208,21 @@ function setModuleResolution(options) {
|
|
|
206
208
|
}
|
|
207
209
|
options.moduleResolution = moduleResolution;
|
|
208
210
|
}
|
|
211
|
+
function editSourceMapDir(content, fromDir, toDir) {
|
|
212
|
+
const relativeOutDir = node_path.relative(fromDir, toDir);
|
|
213
|
+
if (relativeOutDir) {
|
|
214
|
+
try {
|
|
215
|
+
const sourceMap = JSON.parse(content);
|
|
216
|
+
sourceMap.sources = sourceMap.sources.map((source) => {
|
|
217
|
+
return normalizePath(node_path.relative(relativeOutDir, source));
|
|
218
|
+
});
|
|
219
|
+
return JSON.stringify(sourceMap);
|
|
220
|
+
} catch (e) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
209
226
|
|
|
210
227
|
const dtsRE$1 = /\.d\.tsx?$/;
|
|
211
228
|
function rollupDeclarationFiles({
|
|
@@ -429,6 +446,9 @@ function isAliasMatch(alias, importer) {
|
|
|
429
446
|
return true;
|
|
430
447
|
return importer.indexOf(alias.find) === 0 && (alias.find.endsWith("/") || importer.substring(alias.find.length)[0] === "/");
|
|
431
448
|
}
|
|
449
|
+
function ensureStartWithDot(path) {
|
|
450
|
+
return path.startsWith(".") ? path : `./${path}`;
|
|
451
|
+
}
|
|
432
452
|
const globalImportRE = /(?:(?:import|export)\s?(?:type)?\s?(?:(?:\{[^;\n]+\})|(?:[^;\n]+))\s?from\s?['"][^;\n]+['"])|(?:import\(['"][^;\n]+?['"]\))/g;
|
|
433
453
|
const staticImportRE = /(?:import|export)\s?(?:type)?\s?\{?.+\}?\s?from\s?['"](.+)['"]/;
|
|
434
454
|
const dynamicImportRE = /import\(['"]([^;\n]+?)['"]\)/;
|
|
@@ -450,13 +470,17 @@ function transformAliasImport(filePath, content, aliases, exclude = []) {
|
|
|
450
470
|
if (exclude.some((e) => isRegExp(e) ? e.test(matchResult[1]) : String(e) === matchResult[1])) {
|
|
451
471
|
return str;
|
|
452
472
|
}
|
|
453
|
-
const
|
|
473
|
+
const dir = node_path.dirname(filePath);
|
|
474
|
+
const replacement = node_path.isAbsolute(matchedAlias.replacement) ? normalizePath(node_path.relative(dir, matchedAlias.replacement)) : normalizePath(matchedAlias.replacement);
|
|
475
|
+
const endSlash = matchResult[1].match(matchedAlias.find)[0].endsWith("/");
|
|
476
|
+
const truthPath = matchResult[1].replace(
|
|
477
|
+
matchedAlias.find,
|
|
478
|
+
replacement + (endSlash ? "/" : "")
|
|
479
|
+
);
|
|
480
|
+
const normalizedPath = normalizePath(node_path.relative(dir, node_path.resolve(dir, truthPath)));
|
|
454
481
|
return str.replace(
|
|
455
482
|
isDynamic ? simpleDynamicImportRE : simpleStaticImportRE,
|
|
456
|
-
`$1'${
|
|
457
|
-
matchedAlias.find,
|
|
458
|
-
(truthPath.startsWith(".") ? truthPath : `./${truthPath}`) + (typeof matchedAlias.find === "string" && matchedAlias.find.endsWith("/") ? "/" : "")
|
|
459
|
-
)}'${isDynamic ? ")" : ""}`
|
|
483
|
+
`$1'${ensureStartWithDot(normalizedPath)}'${isDynamic ? ")" : ""}`
|
|
460
484
|
);
|
|
461
485
|
}
|
|
462
486
|
}
|
|
@@ -467,6 +491,10 @@ const pureImportRE = /import\s?['"][^;\n]+?['"];?\n?/g;
|
|
|
467
491
|
function removePureImport(content) {
|
|
468
492
|
return content.replace(pureImportRE, "");
|
|
469
493
|
}
|
|
494
|
+
const asDefaultRE = /export\s*\{.*\w+\s*\bas\s+default\b.*\}\s*from\s*['"].+['"]/;
|
|
495
|
+
function hasExportDefault(content) {
|
|
496
|
+
return content.includes("export default") || asDefaultRE.test(content);
|
|
497
|
+
}
|
|
470
498
|
|
|
471
499
|
const jsRE = /\.(m|c)?jsx?$/;
|
|
472
500
|
const tsRE = /\.(m|c)?tsx?$/;
|
|
@@ -551,7 +579,7 @@ function dtsPlugin(options = {}) {
|
|
|
551
579
|
return { find: key, replacement: value };
|
|
552
580
|
});
|
|
553
581
|
} else {
|
|
554
|
-
aliases = ensureArray(aliasOptions);
|
|
582
|
+
aliases = ensureArray(aliasOptions).map((alias) => ({ ...alias }));
|
|
555
583
|
}
|
|
556
584
|
if (aliasesExclude.length > 0) {
|
|
557
585
|
aliases = aliases.filter(
|
|
@@ -560,6 +588,9 @@ function dtsPlugin(options = {}) {
|
|
|
560
588
|
)
|
|
561
589
|
);
|
|
562
590
|
}
|
|
591
|
+
for (const alias of aliases) {
|
|
592
|
+
alias.replacement = resolve(alias.replacement);
|
|
593
|
+
}
|
|
563
594
|
},
|
|
564
595
|
async configResolved(config) {
|
|
565
596
|
logger = logLevel ? (await import('vite')).createLogger(logLevel, { allowClearScreen: config.clearScreen }) : config.logger;
|
|
@@ -694,7 +725,7 @@ ${logPrefix} ${kolorist.yellow(
|
|
|
694
725
|
entryRoot = ensureAbsolute(entryRoot, root);
|
|
695
726
|
const diagnostics = program.getDeclarationDiagnostics();
|
|
696
727
|
if (diagnostics?.length) {
|
|
697
|
-
logger.error(ts__default.
|
|
728
|
+
logger.error(ts__default.formatDiagnosticsWithColorAndContext(diagnostics, host));
|
|
698
729
|
}
|
|
699
730
|
if (typeof afterDiagnostic === "function") {
|
|
700
731
|
await wrapPromise(afterDiagnostic(diagnostics));
|
|
@@ -888,13 +919,10 @@ ${logPrefix} ${kolorist.yellow(
|
|
|
888
919
|
fromPath = fullRelativeRE.test(fromPath) ? fromPath : `./${fromPath}`;
|
|
889
920
|
let content = `export * from '${fromPath}'
|
|
890
921
|
`;
|
|
891
|
-
if (node_fs.existsSync(index)) {
|
|
892
|
-
|
|
893
|
-
if (entryCodes.includes("export default")) {
|
|
894
|
-
content += `import ${libName} from '${fromPath}'
|
|
922
|
+
if (node_fs.existsSync(index) && hasExportDefault(await promises.readFile(index, "utf-8"))) {
|
|
923
|
+
content += `import ${libName} from '${fromPath}'
|
|
895
924
|
export default ${libName}
|
|
896
925
|
`;
|
|
897
|
-
}
|
|
898
926
|
}
|
|
899
927
|
await writeOutput(cleanPath(path), content, outDir);
|
|
900
928
|
}
|
|
@@ -960,17 +988,8 @@ export default ${libName}
|
|
|
960
988
|
extraOutDirs.map(async (targetOutDir) => {
|
|
961
989
|
const path = resolve(targetOutDir, relativePath);
|
|
962
990
|
if (wroteFile.endsWith(".map")) {
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
try {
|
|
966
|
-
const sourceMap = JSON.parse(content);
|
|
967
|
-
sourceMap.sources = sourceMap.sources.map((source) => {
|
|
968
|
-
return normalizePath(node_path.relative(relativeOutDir, source));
|
|
969
|
-
});
|
|
970
|
-
content = JSON.stringify(sourceMap);
|
|
971
|
-
} catch (e) {
|
|
972
|
-
logger.warn(`${logPrefix} ${kolorist.yellow("Processing source map fail:")} ${path}`);
|
|
973
|
-
}
|
|
991
|
+
if (!editSourceMapDir(content, outDir, targetOutDir)) {
|
|
992
|
+
logger.warn(`${logPrefix} ${kolorist.yellow("Processing source map fail:")} ${path}`);
|
|
974
993
|
}
|
|
975
994
|
}
|
|
976
995
|
await writeOutput(path, content, targetOutDir, false);
|
|
@@ -979,7 +998,7 @@ export default ${libName}
|
|
|
979
998
|
});
|
|
980
999
|
}
|
|
981
1000
|
if (typeof afterBuild === "function") {
|
|
982
|
-
await wrapPromise(afterBuild());
|
|
1001
|
+
await wrapPromise(afterBuild(emittedFiles));
|
|
983
1002
|
}
|
|
984
1003
|
bundleDebug("finish");
|
|
985
1004
|
logger.info(
|
|
@@ -997,4 +1016,5 @@ export default ${libName}
|
|
|
997
1016
|
};
|
|
998
1017
|
}
|
|
999
1018
|
|
|
1000
|
-
|
|
1019
|
+
exports.default = dtsPlugin;
|
|
1020
|
+
exports.editSourceMapDir = editSourceMapDir;
|
package/dist/index.d.cts
CHANGED
|
@@ -216,11 +216,15 @@ interface PluginOptions {
|
|
|
216
216
|
/**
|
|
217
217
|
* Hook called after all declaration files are written
|
|
218
218
|
*
|
|
219
|
+
* It will be received a map (path -> content) that records those emitted files
|
|
220
|
+
*
|
|
219
221
|
* @default () => {}
|
|
220
222
|
*/
|
|
221
|
-
afterBuild?: () => MaybePromise<void>;
|
|
223
|
+
afterBuild?: (emittedFiles: Map<string, string>) => MaybePromise<void>;
|
|
222
224
|
}
|
|
223
225
|
|
|
224
226
|
declare function dtsPlugin(options?: PluginOptions): vite.Plugin;
|
|
225
227
|
|
|
226
|
-
|
|
228
|
+
declare function editSourceMapDir(content: string, fromDir: string, toDir: string): string | boolean;
|
|
229
|
+
|
|
230
|
+
export { type PluginOptions, dtsPlugin as default, editSourceMapDir };
|
package/dist/index.d.mts
CHANGED
|
@@ -216,11 +216,15 @@ interface PluginOptions {
|
|
|
216
216
|
/**
|
|
217
217
|
* Hook called after all declaration files are written
|
|
218
218
|
*
|
|
219
|
+
* It will be received a map (path -> content) that records those emitted files
|
|
220
|
+
*
|
|
219
221
|
* @default () => {}
|
|
220
222
|
*/
|
|
221
|
-
afterBuild?: () => MaybePromise<void>;
|
|
223
|
+
afterBuild?: (emittedFiles: Map<string, string>) => MaybePromise<void>;
|
|
222
224
|
}
|
|
223
225
|
|
|
224
226
|
declare function dtsPlugin(options?: PluginOptions): vite.Plugin;
|
|
225
227
|
|
|
226
|
-
|
|
228
|
+
declare function editSourceMapDir(content: string, fromDir: string, toDir: string): string | boolean;
|
|
229
|
+
|
|
230
|
+
export { type PluginOptions, dtsPlugin as default, editSourceMapDir };
|
package/dist/index.d.ts
CHANGED
|
@@ -216,11 +216,15 @@ interface PluginOptions {
|
|
|
216
216
|
/**
|
|
217
217
|
* Hook called after all declaration files are written
|
|
218
218
|
*
|
|
219
|
+
* It will be received a map (path -> content) that records those emitted files
|
|
220
|
+
*
|
|
219
221
|
* @default () => {}
|
|
220
222
|
*/
|
|
221
|
-
afterBuild?: () => MaybePromise<void>;
|
|
223
|
+
afterBuild?: (emittedFiles: Map<string, string>) => MaybePromise<void>;
|
|
222
224
|
}
|
|
223
225
|
|
|
224
226
|
declare function dtsPlugin(options?: PluginOptions): vite.Plugin;
|
|
225
227
|
|
|
226
|
-
|
|
228
|
+
declare function editSourceMapDir(content: string, fromDir: string, toDir: string): string | boolean;
|
|
229
|
+
|
|
230
|
+
export { type PluginOptions, dtsPlugin as default, editSourceMapDir };
|
package/dist/index.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import __cjs_mod__ from 'module';
|
|
|
5
5
|
const __filename = __cjs_url__.fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = __cjs_path__.dirname(__filename);
|
|
7
7
|
const require = __cjs_mod__.createRequire(import.meta.url);
|
|
8
|
-
import { posix, resolve as resolve$1, isAbsolute, dirname, normalize, sep,
|
|
8
|
+
import { relative, posix, resolve as resolve$1, isAbsolute, dirname, normalize, sep, basename } from 'node:path';
|
|
9
9
|
import { existsSync, readdirSync, lstatSync, rmdirSync } from 'node:fs';
|
|
10
10
|
import { readFile, mkdir, writeFile, unlink } from 'node:fs/promises';
|
|
11
11
|
import { cpus } from 'node:os';
|
|
@@ -206,6 +206,21 @@ function setModuleResolution(options) {
|
|
|
206
206
|
}
|
|
207
207
|
options.moduleResolution = moduleResolution;
|
|
208
208
|
}
|
|
209
|
+
function editSourceMapDir(content, fromDir, toDir) {
|
|
210
|
+
const relativeOutDir = relative(fromDir, toDir);
|
|
211
|
+
if (relativeOutDir) {
|
|
212
|
+
try {
|
|
213
|
+
const sourceMap = JSON.parse(content);
|
|
214
|
+
sourceMap.sources = sourceMap.sources.map((source) => {
|
|
215
|
+
return normalizePath(relative(relativeOutDir, source));
|
|
216
|
+
});
|
|
217
|
+
return JSON.stringify(sourceMap);
|
|
218
|
+
} catch (e) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
209
224
|
|
|
210
225
|
const dtsRE$1 = /\.d\.tsx?$/;
|
|
211
226
|
function rollupDeclarationFiles({
|
|
@@ -429,6 +444,9 @@ function isAliasMatch(alias, importer) {
|
|
|
429
444
|
return true;
|
|
430
445
|
return importer.indexOf(alias.find) === 0 && (alias.find.endsWith("/") || importer.substring(alias.find.length)[0] === "/");
|
|
431
446
|
}
|
|
447
|
+
function ensureStartWithDot(path) {
|
|
448
|
+
return path.startsWith(".") ? path : `./${path}`;
|
|
449
|
+
}
|
|
432
450
|
const globalImportRE = /(?:(?:import|export)\s?(?:type)?\s?(?:(?:\{[^;\n]+\})|(?:[^;\n]+))\s?from\s?['"][^;\n]+['"])|(?:import\(['"][^;\n]+?['"]\))/g;
|
|
433
451
|
const staticImportRE = /(?:import|export)\s?(?:type)?\s?\{?.+\}?\s?from\s?['"](.+)['"]/;
|
|
434
452
|
const dynamicImportRE = /import\(['"]([^;\n]+?)['"]\)/;
|
|
@@ -450,13 +468,17 @@ function transformAliasImport(filePath, content, aliases, exclude = []) {
|
|
|
450
468
|
if (exclude.some((e) => isRegExp(e) ? e.test(matchResult[1]) : String(e) === matchResult[1])) {
|
|
451
469
|
return str;
|
|
452
470
|
}
|
|
453
|
-
const
|
|
471
|
+
const dir = dirname(filePath);
|
|
472
|
+
const replacement = isAbsolute(matchedAlias.replacement) ? normalizePath(relative(dir, matchedAlias.replacement)) : normalizePath(matchedAlias.replacement);
|
|
473
|
+
const endSlash = matchResult[1].match(matchedAlias.find)[0].endsWith("/");
|
|
474
|
+
const truthPath = matchResult[1].replace(
|
|
475
|
+
matchedAlias.find,
|
|
476
|
+
replacement + (endSlash ? "/" : "")
|
|
477
|
+
);
|
|
478
|
+
const normalizedPath = normalizePath(relative(dir, resolve$1(dir, truthPath)));
|
|
454
479
|
return str.replace(
|
|
455
480
|
isDynamic ? simpleDynamicImportRE : simpleStaticImportRE,
|
|
456
|
-
`$1'${
|
|
457
|
-
matchedAlias.find,
|
|
458
|
-
(truthPath.startsWith(".") ? truthPath : `./${truthPath}`) + (typeof matchedAlias.find === "string" && matchedAlias.find.endsWith("/") ? "/" : "")
|
|
459
|
-
)}'${isDynamic ? ")" : ""}`
|
|
481
|
+
`$1'${ensureStartWithDot(normalizedPath)}'${isDynamic ? ")" : ""}`
|
|
460
482
|
);
|
|
461
483
|
}
|
|
462
484
|
}
|
|
@@ -467,6 +489,10 @@ const pureImportRE = /import\s?['"][^;\n]+?['"];?\n?/g;
|
|
|
467
489
|
function removePureImport(content) {
|
|
468
490
|
return content.replace(pureImportRE, "");
|
|
469
491
|
}
|
|
492
|
+
const asDefaultRE = /export\s*\{.*\w+\s*\bas\s+default\b.*\}\s*from\s*['"].+['"]/;
|
|
493
|
+
function hasExportDefault(content) {
|
|
494
|
+
return content.includes("export default") || asDefaultRE.test(content);
|
|
495
|
+
}
|
|
470
496
|
|
|
471
497
|
const jsRE = /\.(m|c)?jsx?$/;
|
|
472
498
|
const tsRE = /\.(m|c)?tsx?$/;
|
|
@@ -551,7 +577,7 @@ function dtsPlugin(options = {}) {
|
|
|
551
577
|
return { find: key, replacement: value };
|
|
552
578
|
});
|
|
553
579
|
} else {
|
|
554
|
-
aliases = ensureArray(aliasOptions);
|
|
580
|
+
aliases = ensureArray(aliasOptions).map((alias) => ({ ...alias }));
|
|
555
581
|
}
|
|
556
582
|
if (aliasesExclude.length > 0) {
|
|
557
583
|
aliases = aliases.filter(
|
|
@@ -560,6 +586,9 @@ function dtsPlugin(options = {}) {
|
|
|
560
586
|
)
|
|
561
587
|
);
|
|
562
588
|
}
|
|
589
|
+
for (const alias of aliases) {
|
|
590
|
+
alias.replacement = resolve(alias.replacement);
|
|
591
|
+
}
|
|
563
592
|
},
|
|
564
593
|
async configResolved(config) {
|
|
565
594
|
logger = logLevel ? (await import('vite')).createLogger(logLevel, { allowClearScreen: config.clearScreen }) : config.logger;
|
|
@@ -694,7 +723,7 @@ ${logPrefix} ${yellow(
|
|
|
694
723
|
entryRoot = ensureAbsolute(entryRoot, root);
|
|
695
724
|
const diagnostics = program.getDeclarationDiagnostics();
|
|
696
725
|
if (diagnostics?.length) {
|
|
697
|
-
logger.error(ts.
|
|
726
|
+
logger.error(ts.formatDiagnosticsWithColorAndContext(diagnostics, host));
|
|
698
727
|
}
|
|
699
728
|
if (typeof afterDiagnostic === "function") {
|
|
700
729
|
await wrapPromise(afterDiagnostic(diagnostics));
|
|
@@ -888,13 +917,10 @@ ${logPrefix} ${yellow(
|
|
|
888
917
|
fromPath = fullRelativeRE.test(fromPath) ? fromPath : `./${fromPath}`;
|
|
889
918
|
let content = `export * from '${fromPath}'
|
|
890
919
|
`;
|
|
891
|
-
if (existsSync(index)) {
|
|
892
|
-
|
|
893
|
-
if (entryCodes.includes("export default")) {
|
|
894
|
-
content += `import ${libName} from '${fromPath}'
|
|
920
|
+
if (existsSync(index) && hasExportDefault(await readFile(index, "utf-8"))) {
|
|
921
|
+
content += `import ${libName} from '${fromPath}'
|
|
895
922
|
export default ${libName}
|
|
896
923
|
`;
|
|
897
|
-
}
|
|
898
924
|
}
|
|
899
925
|
await writeOutput(cleanPath(path), content, outDir);
|
|
900
926
|
}
|
|
@@ -960,17 +986,8 @@ export default ${libName}
|
|
|
960
986
|
extraOutDirs.map(async (targetOutDir) => {
|
|
961
987
|
const path = resolve(targetOutDir, relativePath);
|
|
962
988
|
if (wroteFile.endsWith(".map")) {
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
try {
|
|
966
|
-
const sourceMap = JSON.parse(content);
|
|
967
|
-
sourceMap.sources = sourceMap.sources.map((source) => {
|
|
968
|
-
return normalizePath(relative(relativeOutDir, source));
|
|
969
|
-
});
|
|
970
|
-
content = JSON.stringify(sourceMap);
|
|
971
|
-
} catch (e) {
|
|
972
|
-
logger.warn(`${logPrefix} ${yellow("Processing source map fail:")} ${path}`);
|
|
973
|
-
}
|
|
989
|
+
if (!editSourceMapDir(content, outDir, targetOutDir)) {
|
|
990
|
+
logger.warn(`${logPrefix} ${yellow("Processing source map fail:")} ${path}`);
|
|
974
991
|
}
|
|
975
992
|
}
|
|
976
993
|
await writeOutput(path, content, targetOutDir, false);
|
|
@@ -979,7 +996,7 @@ export default ${libName}
|
|
|
979
996
|
});
|
|
980
997
|
}
|
|
981
998
|
if (typeof afterBuild === "function") {
|
|
982
|
-
await wrapPromise(afterBuild());
|
|
999
|
+
await wrapPromise(afterBuild(emittedFiles));
|
|
983
1000
|
}
|
|
984
1001
|
bundleDebug("finish");
|
|
985
1002
|
logger.info(
|
|
@@ -997,4 +1014,4 @@ export default ${libName}
|
|
|
997
1014
|
};
|
|
998
1015
|
}
|
|
999
1016
|
|
|
1000
|
-
export { dtsPlugin as default };
|
|
1017
|
+
export { dtsPlugin as default, editSourceMapDir };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vite-plugin-dts",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.7.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "qmhc",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"prettier": "pretty-quick --staged && pnpm run lint",
|
|
18
18
|
"release": "tsx scripts/release.ts",
|
|
19
19
|
"test": "vitest run",
|
|
20
|
+
"test:dev": "vitest",
|
|
20
21
|
"test:react": "pnpm -C examples/react build",
|
|
21
22
|
"test:svelte": "pnpm -C examples/svelte build",
|
|
22
23
|
"test:ts": "pnpm -C examples/ts build",
|
|
@@ -57,43 +58,43 @@
|
|
|
57
58
|
"volar"
|
|
58
59
|
],
|
|
59
60
|
"dependencies": {
|
|
60
|
-
"@microsoft/api-extractor": "
|
|
61
|
-
"@rollup/pluginutils": "^5.0
|
|
62
|
-
"@vue/language-core": "^1.8.
|
|
61
|
+
"@microsoft/api-extractor": "7.39.0",
|
|
62
|
+
"@rollup/pluginutils": "^5.1.0",
|
|
63
|
+
"@vue/language-core": "^1.8.26",
|
|
63
64
|
"debug": "^4.3.4",
|
|
64
65
|
"kolorist": "^1.8.0",
|
|
65
|
-
"vue-tsc": "^1.8.
|
|
66
|
+
"vue-tsc": "^1.8.26"
|
|
66
67
|
},
|
|
67
68
|
"devDependencies": {
|
|
68
|
-
"@commitlint/cli": "^18.
|
|
69
|
-
"@types/debug": "^4.1.
|
|
70
|
-
"@types/minimist": "^1.2.
|
|
71
|
-
"@types/node": "^20.
|
|
72
|
-
"@types/prompts": "^2.4.
|
|
73
|
-
"@types/semver": "^7.5.
|
|
74
|
-
"@vexip-ui/commitlint-config": "^0.
|
|
75
|
-
"@vexip-ui/eslint-config": "^0.
|
|
69
|
+
"@commitlint/cli": "^18.4.3",
|
|
70
|
+
"@types/debug": "^4.1.12",
|
|
71
|
+
"@types/minimist": "^1.2.5",
|
|
72
|
+
"@types/node": "^20.10.5",
|
|
73
|
+
"@types/prompts": "^2.4.9",
|
|
74
|
+
"@types/semver": "^7.5.6",
|
|
75
|
+
"@vexip-ui/commitlint-config": "^0.3.0",
|
|
76
|
+
"@vexip-ui/eslint-config": "^0.11.0",
|
|
76
77
|
"@vexip-ui/prettier-config": "^0.2.0",
|
|
77
78
|
"@vue/eslint-config-standard": "^8.0.1",
|
|
78
79
|
"@vue/eslint-config-typescript": "^12.0.0",
|
|
79
80
|
"conventional-changelog-cli": "^4.1.0",
|
|
80
|
-
"eslint": "^8.
|
|
81
|
+
"eslint": "^8.56.0",
|
|
81
82
|
"execa": "^8.0.1",
|
|
82
83
|
"husky": "^8.0.3",
|
|
83
84
|
"is-ci": "^3.0.1",
|
|
84
|
-
"lint-staged": "^15.0
|
|
85
|
+
"lint-staged": "^15.2.0",
|
|
85
86
|
"minimist": "^1.2.8",
|
|
86
87
|
"pinst": "^3.0.0",
|
|
87
|
-
"prettier": "^3.
|
|
88
|
+
"prettier": "^3.1.1",
|
|
88
89
|
"pretty-quick": "^3.1.3",
|
|
89
90
|
"prompts": "^2.4.2",
|
|
90
91
|
"rimraf": "^5.0.5",
|
|
91
92
|
"semver": "^7.5.4",
|
|
92
|
-
"tsx": "^
|
|
93
|
+
"tsx": "^4.7.0",
|
|
93
94
|
"typescript": "5.2.2",
|
|
94
95
|
"unbuild": "^2.0.0",
|
|
95
|
-
"vite": "^
|
|
96
|
-
"vitest": "^
|
|
96
|
+
"vite": "^5.0.10",
|
|
97
|
+
"vitest": "^1.1.0"
|
|
97
98
|
},
|
|
98
99
|
"peerDependencies": {
|
|
99
100
|
"typescript": "*",
|
|
@@ -106,7 +107,7 @@
|
|
|
106
107
|
},
|
|
107
108
|
"pnpm": {
|
|
108
109
|
"patchedDependencies": {
|
|
109
|
-
"@microsoft/api-extractor@7.
|
|
110
|
+
"@microsoft/api-extractor@7.39.0": "patches/@microsoft__api-extractor@7.39.0.patch"
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
113
|
}
|