rolldown-plugin-dts 0.11.3 → 0.12.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 CHANGED
@@ -6,7 +6,7 @@ A Rolldown plugin to generate and bundle dts files.
6
6
 
7
7
  ## Install
8
8
 
9
- ⚠️ Requires `rolldown@1.0.0-beta.8-commit.534fde3` (which is canary) or later.
9
+ ⚠️ Requires `rolldown@1.0.0-beta.8-commit.2a5c6a6` (which is canary) or later.
10
10
 
11
11
  ```bash
12
12
  npm i rolldown-plugin-dts
package/dist/index.d.ts CHANGED
@@ -13,8 +13,9 @@ declare function createFakeJsPlugin({
13
13
  declare function createGeneratePlugin({
14
14
  compilerOptions,
15
15
  isolatedDeclarations,
16
- emitDtsOnly
17
- }: Pick<OptionsResolved, "compilerOptions" | "isolatedDeclarations" | "emitDtsOnly">): Plugin;
16
+ emitDtsOnly,
17
+ vue
18
+ }: Pick<OptionsResolved, "compilerOptions" | "isolatedDeclarations" | "emitDtsOnly" | "vue">): Plugin;
18
19
 
19
20
  //#endregion
20
21
  //#region src/index.d.ts
@@ -63,6 +64,10 @@ interface Options {
63
64
  sourcemap?: boolean;
64
65
  /** Resolve external types used in dts files from `node_modules` */
65
66
  resolve?: boolean | (string | RegExp)[];
67
+ /**
68
+ * When `true`, the plugin will generate `.d.ts` via `vue-tsc`.
69
+ */
70
+ vue?: boolean;
66
71
  }
67
72
  type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U;
68
73
  type OptionsResolved = Overwrite<Required<Options>, {
@@ -78,7 +83,8 @@ declare function resolveOptions({
78
83
  sourcemap,
79
84
  dtsInput,
80
85
  emitDtsOnly,
81
- resolve
86
+ resolve,
87
+ vue
82
88
  }: Options): OptionsResolved;
83
89
 
84
90
  //#endregion
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { createRequire } from "node:module";
1
2
  import path from "node:path";
2
3
  import process from "node:process";
3
4
  import Debug from "debug";
@@ -6,8 +7,7 @@ import _generate from "@babel/generator";
6
7
  import { parse } from "@babel/parser";
7
8
  import * as t from "@babel/types";
8
9
  import { isDeclarationType, isTypeOf } from "ast-kit";
9
- import { isolatedDeclaration } from "rolldown/experimental";
10
- import { createRequire } from "node:module";
10
+ import { ResolverFactory, isolatedDeclaration } from "rolldown/experimental";
11
11
  import { createResolver } from "dts-resolver";
12
12
 
13
13
  //#region src/dts-input.ts
@@ -230,11 +230,12 @@ const RE_DTS = /\.d\.([cm]?)ts$/;
230
230
  const RE_DTS_MAP = /\.d\.([cm]?)ts\.map$/;
231
231
  const RE_NODE_MODULES = /[\\/]node_modules[\\/]/;
232
232
  const RE_CSS = /\.css$/;
233
+ const RE_VUE = /\.vue$/;
233
234
  function filename_js_to_dts(id) {
234
235
  return id.replace(RE_JS, ".d.$1ts");
235
236
  }
236
237
  function filename_ts_to_dts(id) {
237
- return id.replace(RE_TS, ".d.$1ts");
238
+ return id.replace(RE_VUE, ".vue.ts").replace(RE_TS, ".d.$1ts");
238
239
  }
239
240
  function filename_dts_to(id, ext) {
240
241
  return id.replace(RE_DTS, `.$1${ext}`);
@@ -295,6 +296,7 @@ function createFakeJsPlugin({ dtsInput, sourcemap }) {
295
296
  const setStmt = (node) => program.body[i] = node;
296
297
  if (rewriteImportExport(stmt, setStmt)) continue;
297
298
  const sideEffect = stmt.type === "TSModuleDeclaration" && stmt.kind !== "namespace";
299
+ if (sideEffect && id.endsWith(".vue.d.ts") && code.slice(stmt.start, stmt.end).includes("__VLS_")) continue;
298
300
  const isDefaultExport = stmt.type === "ExportDefaultDeclaration";
299
301
  const isDecl = isTypeOf(stmt, ["ExportNamedDeclaration", "ExportDefaultDeclaration"]) && stmt.declaration;
300
302
  const decl = isDecl ? stmt.declaration : stmt;
@@ -618,6 +620,37 @@ function inheritNodeComments(oldNode, newNode) {
618
620
  }
619
621
  }
620
622
 
623
+ //#endregion
624
+ //#region src/utils/vue.ts
625
+ const debug$3 = Debug("rolldown-plugin-dts:vue");
626
+ let createVueProgram;
627
+ const require = createRequire(import.meta.url);
628
+ function loadVueLanguageTools() {
629
+ try {
630
+ const vueTscPath = require.resolve("vue-tsc");
631
+ const { proxyCreateProgram } = require(require.resolve("@volar/typescript", { paths: [vueTscPath] }));
632
+ const vue = require(require.resolve("@vue/language-core", { paths: [vueTscPath] }));
633
+ return {
634
+ proxyCreateProgram,
635
+ vue
636
+ };
637
+ } catch (error) {
638
+ debug$3("vue language tools not found", error);
639
+ throw new Error("Failed to load vue language tools. Please manually install vue-tsc.");
640
+ }
641
+ }
642
+ function createVueProgramFactory() {
643
+ if (createVueProgram) return createVueProgram;
644
+ debug$3("loading vue language tools");
645
+ const { proxyCreateProgram, vue } = loadVueLanguageTools();
646
+ return createVueProgram = proxyCreateProgram(ts, ts.createProgram, (ts$1, options) => {
647
+ const { configFilePath } = options.options;
648
+ const vueOptions = typeof configFilePath === "string" ? vue.createParsedCommandLine(ts$1, ts$1.sys, configFilePath.replaceAll("\\", "/")).vueOptions : vue.getDefaultCompilerOptions();
649
+ const vueLanguagePlugin = vue.createVueLanguagePlugin(ts$1, options.options, vueOptions, (id) => id);
650
+ return { languagePlugins: [vueLanguagePlugin] };
651
+ });
652
+ }
653
+
621
654
  //#endregion
622
655
  //#region src/utils/tsc.ts
623
656
  const debug$2 = Debug("rolldown-plugin-dts:tsc");
@@ -625,8 +658,8 @@ let ts;
625
658
  let formatHost;
626
659
  function initTs() {
627
660
  debug$2("loading typescript");
628
- const require = createRequire(import.meta.url);
629
- ts = require("typescript");
661
+ const require$1 = createRequire(import.meta.url);
662
+ ts = require$1("typescript");
630
663
  formatHost = {
631
664
  getCurrentDirectory: () => ts.sys.getCurrentDirectory(),
632
665
  getNewLine: () => ts.sys.newLine,
@@ -642,11 +675,10 @@ const defaultCompilerOptions = {
642
675
  checkJs: false,
643
676
  declarationMap: false,
644
677
  skipLibCheck: true,
645
- preserveSymlinks: true,
646
678
  target: 99,
647
679
  resolveJsonModule: true
648
680
  };
649
- function createOrGetTsModule(programs, compilerOptions, id, isEntry, dtsMap) {
681
+ function createOrGetTsModule(programs, compilerOptions, id, isEntry, dtsMap, vue) {
650
682
  const program = programs.find((program$1) => {
651
683
  if (isEntry) return program$1.getRootFileNames().includes(id);
652
684
  return program$1.getSourceFile(id);
@@ -659,12 +691,12 @@ function createOrGetTsModule(programs, compilerOptions, id, isEntry, dtsMap) {
659
691
  };
660
692
  }
661
693
  debug$2(`create program for module: ${id}`);
662
- const module = createTsProgram(compilerOptions, dtsMap, id);
694
+ const module = createTsProgram(compilerOptions, dtsMap, id, vue);
663
695
  debug$2(`created program for module: ${id}`);
664
696
  programs.push(module.program);
665
697
  return module;
666
698
  }
667
- function createTsProgram(compilerOptions, dtsMap, id) {
699
+ function createTsProgram(compilerOptions, dtsMap, id, vue) {
668
700
  const overrideCompilerOptions = ts.convertCompilerOptionsFromJson(compilerOptions, ".").options;
669
701
  const options = {
670
702
  ...defaultCompilerOptions,
@@ -684,8 +716,13 @@ function createTsProgram(compilerOptions, dtsMap, id) {
684
716
  if (debug$2.enabled && !RE_NODE_MODULES.test(fileName)) debug$2(`read file from fs: ${fileName}`);
685
717
  return _readFile(fileName);
686
718
  };
687
- const entries = Array.from(dtsMap.values()).filter((v) => v.isEntry).map((v) => v.id);
688
- const program = ts.createProgram(Array.from(new Set([id, ...entries])), options, host);
719
+ const entries = [...new Set([...Array.from(dtsMap.values()).filter((v) => v.isEntry).map((v) => v.id), id])];
720
+ const createProgram = vue ? createVueProgramFactory() : ts.createProgram;
721
+ const program = createProgram({
722
+ rootNames: entries,
723
+ options,
724
+ host
725
+ });
689
726
  const sourceFile = program.getSourceFile(id);
690
727
  if (!sourceFile) throw new Error(`Source file not found: ${id}`);
691
728
  return {
@@ -729,7 +766,7 @@ function getTsModule(dtsMap, tsId) {
729
766
  //#endregion
730
767
  //#region src/generate.ts
731
768
  const debug$1 = Debug("rolldown-plugin-dts:generate");
732
- function createGeneratePlugin({ compilerOptions = {}, isolatedDeclarations, emitDtsOnly = false }) {
769
+ function createGeneratePlugin({ compilerOptions = {}, isolatedDeclarations, emitDtsOnly = false, vue }) {
733
770
  const dtsMap = new Map();
734
771
  /**
735
772
  * A map of input id to output file name
@@ -742,7 +779,10 @@ function createGeneratePlugin({ compilerOptions = {}, isolatedDeclarations, emit
742
779
  */
743
780
  const inputAliasMap = new Map();
744
781
  let programs = [];
745
- if (!isolatedDeclarations) initTs();
782
+ if (vue || !isolatedDeclarations) {
783
+ initTs();
784
+ if (vue) createVueProgramFactory();
785
+ }
746
786
  return {
747
787
  name: "rolldown-plugin-dts:generate",
748
788
  async buildStart(options) {
@@ -774,7 +814,7 @@ function createGeneratePlugin({ compilerOptions = {}, isolatedDeclarations, emit
774
814
  transform: {
775
815
  order: "pre",
776
816
  filter: { id: {
777
- include: [RE_TS],
817
+ include: [RE_TS, RE_VUE],
778
818
  exclude: [RE_DTS, RE_NODE_MODULES]
779
819
  } },
780
820
  handler(code, id) {
@@ -809,7 +849,7 @@ function createGeneratePlugin({ compilerOptions = {}, isolatedDeclarations, emit
809
849
  let dtsCode;
810
850
  let map;
811
851
  debug$1("generate dts %s from %s", dtsId, id);
812
- if (isolatedDeclarations) {
852
+ if (isolatedDeclarations && !RE_VUE.test(id)) {
813
853
  const result = isolatedDeclaration(id, code, isolatedDeclarations);
814
854
  if (result.errors.length) {
815
855
  const [error] = result.errors;
@@ -824,7 +864,7 @@ function createGeneratePlugin({ compilerOptions = {}, isolatedDeclarations, emit
824
864
  map.sourcesContent = void 0;
825
865
  }
826
866
  } else {
827
- const module = createOrGetTsModule(programs, compilerOptions, id, isEntry, dtsMap);
867
+ const module = createOrGetTsModule(programs, compilerOptions, id, isEntry, dtsMap, vue);
828
868
  const result = tscEmit(module);
829
869
  if (result.error) return this.error(result.error);
830
870
  dtsCode = result.code;
@@ -851,7 +891,8 @@ function createGeneratePlugin({ compilerOptions = {}, isolatedDeclarations, emit
851
891
  function createDtsResolvePlugin({ tsconfig, resolve }) {
852
892
  const resolver = createResolver({
853
893
  tsconfig,
854
- resolveNodeModules: !!resolve
894
+ resolveNodeModules: !!resolve,
895
+ ResolverFactory
855
896
  });
856
897
  return {
857
898
  name: "rolldown-plugin-dts:resolve",
@@ -871,7 +912,7 @@ function createDtsResolvePlugin({ tsconfig, resolve }) {
871
912
  };
872
913
  let resolution = resolver(id, importer);
873
914
  resolution &&= path.normalize(resolution);
874
- if (!resolution || !RE_TS.test(resolution)) {
915
+ if (!resolution || !RE_TS.test(resolution) && !RE_VUE.test(resolution)) {
875
916
  const result = await this.resolve(id, importer, options);
876
917
  if (!result || !RE_TS.test(result.id)) return external;
877
918
  resolution = result.id;
@@ -882,7 +923,7 @@ function createDtsResolvePlugin({ tsconfig, resolve }) {
882
923
  else shouldResolve = resolve.some((pattern) => typeof pattern === "string" ? id === pattern : pattern.test(id));
883
924
  if (!shouldResolve) return external;
884
925
  }
885
- if (RE_TS.test(resolution) && !RE_DTS.test(resolution)) {
926
+ if (RE_TS.test(resolution) && !RE_DTS.test(resolution) || RE_VUE.test(resolution)) {
886
927
  await this.load({ id: resolution });
887
928
  resolution = filename_ts_to_dts(resolution);
888
929
  }
@@ -905,7 +946,7 @@ function dts(options = {}) {
905
946
  plugins.push(createDtsResolvePlugin(resolved), createFakeJsPlugin(resolved));
906
947
  return plugins;
907
948
  }
908
- function resolveOptions({ cwd = process.cwd(), tsconfig, compilerOptions = {}, isolatedDeclarations, sourcemap, dtsInput = false, emitDtsOnly = false, resolve = false }) {
949
+ function resolveOptions({ cwd = process.cwd(), tsconfig, compilerOptions = {}, isolatedDeclarations, sourcemap, dtsInput = false, emitDtsOnly = false, resolve = false, vue = false }) {
909
950
  if (tsconfig === true || tsconfig == null) {
910
951
  const { config, path: path$1 } = getTsconfig(cwd) || {};
911
952
  tsconfig = path$1;
@@ -937,7 +978,8 @@ function resolveOptions({ cwd = process.cwd(), tsconfig, compilerOptions = {}, i
937
978
  sourcemap,
938
979
  dtsInput,
939
980
  emitDtsOnly,
940
- resolve
981
+ resolve,
982
+ vue
941
983
  };
942
984
  }
943
985
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rolldown-plugin-dts",
3
- "version": "0.11.3",
3
+ "version": "0.12.0",
4
4
  "description": "A Rolldown plugin to bundle dts files",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -29,11 +29,15 @@
29
29
  },
30
30
  "peerDependencies": {
31
31
  "rolldown": "^1.0.0-beta.8-commit.534fde3",
32
- "typescript": "^5.0.0"
32
+ "typescript": "^5.0.0",
33
+ "vue-tsc": "~2.2.0"
33
34
  },
34
35
  "peerDependenciesMeta": {
35
36
  "typescript": {
36
37
  "optional": true
38
+ },
39
+ "vue-tsc": {
40
+ "optional": true
37
41
  }
38
42
  },
39
43
  "dependencies": {
@@ -42,35 +46,39 @@
42
46
  "@babel/types": "^7.27.1",
43
47
  "ast-kit": "^2.0.0",
44
48
  "debug": "^4.4.0",
45
- "dts-resolver": "^1.1.2",
49
+ "dts-resolver": "^2.0.1",
46
50
  "get-tsconfig": "^4.10.0"
47
51
  },
48
52
  "devDependencies": {
49
- "@sxzz/eslint-config": "^7.0.0",
53
+ "@sxzz/eslint-config": "^7.0.1",
50
54
  "@sxzz/prettier-config": "^2.2.1",
51
55
  "@sxzz/test-utils": "^0.5.6",
52
56
  "@types/babel__generator": "^7.27.0",
53
57
  "@types/debug": "^4.1.12",
54
58
  "@types/diff": "^7.0.2",
55
59
  "@types/node": "^22.15.17",
60
+ "@volar/typescript": "^2.4.13",
61
+ "@vue/language-core": "^2.2.10",
56
62
  "bumpp": "^10.1.0",
57
63
  "diff": "^7.0.0",
58
64
  "eslint": "^9.26.0",
59
65
  "estree-walker": "^3.0.3",
60
66
  "prettier": "^3.5.3",
61
- "rolldown": "nightly",
67
+ "rolldown": "canary",
62
68
  "rollup-plugin-dts": "^6.2.1",
63
69
  "tinyglobby": "^0.2.13",
64
- "tsdown": "^0.11.1",
70
+ "tsdown": "^0.11.4",
65
71
  "tsx": "^4.19.4",
66
72
  "typescript": "^5.8.3",
67
- "vitest": "^3.1.3"
73
+ "vitest": "^3.1.3",
74
+ "vue": "^3.5.13",
75
+ "vue-tsc": "^2.2.10"
68
76
  },
69
77
  "engines": {
70
78
  "node": ">=20.18.0"
71
79
  },
72
80
  "resolutions": {
73
- "rolldown": "nightly",
81
+ "rolldown": "canary",
74
82
  "rolldown-plugin-dts": "workspace:*"
75
83
  },
76
84
  "prettier": "@sxzz/prettier-config",