diff --git a/package.json b/package.json index 8652990..d8e5be9 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,8 @@ "typescript": "5.8.3", "unbuild": "3.5.0", "vitest": "3.1.1", - "vue": "3.5.13" + "vue": "3.5.13", + "vue-tsc": "^2.2.8" }, "resolutions": { "vue-sfc-transformer": "link:." diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bcf3308..af283a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,7 +56,7 @@ importers: version: 15.5.0 mkdist: specifier: 2.3.0 - version: 2.3.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.6(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)) + version: 2.3.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.7(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)) pkg-pr-new: specifier: ^0.0.42 version: 0.0.42 @@ -68,13 +68,16 @@ importers: version: 5.8.3 unbuild: specifier: 3.5.0 - version: 3.5.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.6(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)) + version: 3.5.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.7(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)) vitest: specifier: 3.1.1 version: 3.1.1(@types/debug@4.1.12)(@types/node@22.14.0)(sass@1.86.3) vue: specifier: 3.5.13 version: 3.5.13(typescript@5.8.3) + vue-tsc: + specifier: ^2.2.8 + version: 2.2.8(typescript@5.8.3) playground: dependencies: @@ -3456,8 +3459,8 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 - vue-sfc-transformer@0.1.6: - resolution: {integrity: sha512-XEvtDnfg3m5b1Wcv14YqdsXJoPosEVblBwwwtNcV9ge8lmshkAnGLBsp0s3VRWkYKUeSQ9k2H4ZELCKHX8J1Ig==} + vue-sfc-transformer@0.1.7: + resolution: {integrity: sha512-9VU4yzO2qoYqLpGhviMNRypyB26HA5KLYb8dsNCaPBnGN/tRW0qmu46+NGb/ps4YjxnYSkozeU1EUEcFTqMUZg==} engines: {node: '>=18.0.0'} peerDependencies: esbuild: '*' @@ -4487,17 +4490,14 @@ snapshots: '@volar/language-core@2.4.12': dependencies: '@volar/source-map': 2.4.12 - optional: true - '@volar/source-map@2.4.12': - optional: true + '@volar/source-map@2.4.12': {} '@volar/typescript@2.4.12': dependencies: '@volar/language-core': 2.4.12 path-browserify: 1.0.1 vscode-uri: 3.1.0 - optional: true '@voxpelli/semver-set@6.0.0': dependencies: @@ -4543,7 +4543,6 @@ snapshots: dependencies: de-indent: 1.0.2 he: 1.2.0 - optional: true '@vue/language-core@2.2.8(typescript@5.8.3)': dependencies: @@ -4557,7 +4556,6 @@ snapshots: path-browserify: 1.0.1 optionalDependencies: typescript: 5.8.3 - optional: true '@vue/reactivity@3.5.13': dependencies: @@ -4601,8 +4599,7 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - alien-signals@1.0.13: - optional: true + alien-signals@1.0.13: {} ansi-escapes@7.0.0: dependencies: @@ -4955,8 +4952,7 @@ snapshots: csstype@3.1.3: {} - de-indent@1.0.2: - optional: true + de-indent@1.0.2: {} debug@3.2.7: dependencies: @@ -5584,8 +5580,7 @@ snapshots: dependencies: function-bind: 1.1.2 - he@1.2.0: - optional: true + he@1.2.0: {} hookable@5.5.3: {} @@ -6202,7 +6197,7 @@ snapshots: mkdirp@1.0.4: {} - mkdist@2.3.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.6(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)): + mkdist@2.3.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.7(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)): dependencies: autoprefixer: 10.4.21(postcss@8.5.3) citty: 0.1.6 @@ -6221,7 +6216,7 @@ snapshots: sass: 1.86.3 typescript: 5.8.3 vue: 3.5.13(typescript@5.8.3) - vue-sfc-transformer: 0.1.6(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)) + vue-sfc-transformer: 0.1.7(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)) vue-tsc: 2.2.8(typescript@5.8.3) mlly@1.7.4: @@ -6235,8 +6230,7 @@ snapshots: ms@2.1.3: {} - muggle-string@0.4.1: - optional: true + muggle-string@0.4.1: {} nanoid@3.3.8: {} @@ -6368,8 +6362,7 @@ snapshots: parse-ms@4.0.0: {} - path-browserify@1.0.1: - optional: true + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -6957,7 +6950,7 @@ snapshots: ufo@1.5.4: {} - unbuild@3.5.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.6(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)): + unbuild@3.5.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.7(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)): dependencies: '@rollup/plugin-alias': 5.1.1(rollup@4.39.0) '@rollup/plugin-commonjs': 28.0.2(rollup@4.39.0) @@ -6973,7 +6966,7 @@ snapshots: hookable: 5.5.3 jiti: 2.4.2 magic-string: 0.30.17 - mkdist: 2.3.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.6(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)) + mkdist: 2.3.0(sass@1.86.3)(typescript@5.8.3)(vue-sfc-transformer@0.1.7(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)))(vue-tsc@2.2.8(typescript@5.8.3))(vue@3.5.13(typescript@5.8.3)) mlly: 1.7.4 pathe: 2.0.3 pkg-types: 2.1.0 @@ -7133,8 +7126,7 @@ snapshots: - supports-color - terser - vscode-uri@3.1.0: - optional: true + vscode-uri@3.1.0: {} vue-eslint-parser@10.1.2(eslint@9.24.0(jiti@2.4.2)): dependencies: @@ -7149,7 +7141,7 @@ snapshots: transitivePeerDependencies: - supports-color - vue-sfc-transformer@0.1.6(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)): + vue-sfc-transformer@0.1.7(esbuild@0.25.2)(vue@3.5.13(typescript@5.8.3)): dependencies: '@babel/parser': 7.27.0 esbuild: 0.25.2 @@ -7161,7 +7153,6 @@ snapshots: '@volar/typescript': 2.4.12 '@vue/language-core': 2.2.8(typescript@5.8.3) typescript: 5.8.3 - optional: true vue@3.5.13(typescript@5.8.3): dependencies: diff --git a/src/mkdist.ts b/src/mkdist.ts index 6613246..ad80dd9 100644 --- a/src/mkdist.ts +++ b/src/mkdist.ts @@ -83,12 +83,13 @@ function defineVueLoader(options?: DefineVueLoaderOptions): Loader { } // generate dts - await context.loadFile({ + const files = await context.loadFile({ path: `${input.path}.js`, srcPath: `${input.srcPath}.js`, extension: '.js', getContents: () => 'export default {}', }) + addOutput(...files?.filter(f => f.declaration) || []) const results = await Promise.all( blocks.map(async (data) => { diff --git a/test/mkdist.test.ts b/test/mkdist.test.ts index 1cc3cb5..0462263 100644 --- a/test/mkdist.test.ts +++ b/test/mkdist.test.ts @@ -1,12 +1,12 @@ import { mkdir, readFile, rm, writeFile } from 'node:fs/promises' -import { tmpdir } from 'node:os' import { join } from 'node:path' +import { fileURLToPath } from 'node:url' import { mkdist } from 'mkdist' import { afterAll, describe, expect, it } from 'vitest' import { vueLoader } from '../src/mkdist' describe('transform typescript script setup', () => { - const tmpDir = join(tmpdir(), 'fixtures') + const tmpDir = fileURLToPath(new URL('./.tmp/fixtures', import.meta.url)) afterAll(async () => { await rm(tmpDir, { force: true, recursive: true }) }) @@ -196,16 +196,16 @@ describe('transform typescript script setup', () => { expect( await fixture( ` - `, +
+ + `, ), ).toMatchInlineSnapshot(` " + + ` + + expect(await declaration(src)).toMatchInlineSnapshot(` + "declare const _default: import("vue").DefineComponent<{ + msg: string; + }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{ + msg: string; + }> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>; + export default _default; + " + `) + }) + async function fixture(src: string): Promise { await rm(tmpDir, { force: true, recursive: true }) await mkdir(join(tmpDir, 'src'), { recursive: true }) @@ -223,4 +250,12 @@ describe('transform typescript script setup', () => { await mkdist({ loaders: ['js', vueLoader], rootDir: tmpDir }) return await readFile(join(tmpDir, 'dist/index.vue'), 'utf-8') } + + async function declaration(src: string): Promise { + await rm(tmpDir, { force: true, recursive: true }) + await mkdir(join(tmpDir, 'src'), { recursive: true }) + await writeFile(join(tmpDir, 'src/index.vue'), src) + await mkdist({ declaration: true, loaders: ['js', vueLoader], rootDir: tmpDir }) + return await readFile(join(tmpDir, 'dist/index.vue.d.ts'), 'utf-8') + } })