From c8703867cb46c6559aed5f4f08df933c4519edf3 Mon Sep 17 00:00:00 2001 From: Teages Date: Mon, 7 Apr 2025 23:05:06 +0800 Subject: [PATCH 1/5] fix: enable `verbatimModuleSyntax` for script --- package.json | 6 +++++ src/mkdist.ts | 66 +++++++++++++++++++++++---------------------- test/mkdist.test.ts | 24 +++++++++++++++++ 3 files changed, 64 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index 13603e2..dc29f60 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,14 @@ "test:types": "tsc --noEmit" }, "peerDependencies": { + "esbuild": "0.25.2", "vue": "^3.5.13" }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + } + }, "dependencies": { "@babel/parser": "^7.27.0" }, diff --git a/src/mkdist.ts b/src/mkdist.ts index bd741f1..664abff 100644 --- a/src/mkdist.ts +++ b/src/mkdist.ts @@ -40,7 +40,6 @@ function defineVueLoader(options?: DefineVueLoaderOptions): Loader { const { parse } = await import('vue/compiler-sfc') let modified = false - let fakeScriptBlock = false const raw = await input.getContents() const sfc = parse(raw, { @@ -81,28 +80,14 @@ function defineVueLoader(options?: DefineVueLoaderOptions): Loader { : sfc.descriptor.scriptSetup, ) } - if (!sfc.descriptor.script && !sfc.descriptor.scriptSetup) { - // push a fake script block to generate dts - blocks.unshift({ - type: 'script', - content: 'default {}', - attrs: {}, - loc: { - start: { - offset: 0, - line: 1, - column: 1, - }, - end: { - offset: 0, - line: 1, - column: 1, - }, - source: '', - }, - }) - fakeScriptBlock = true - } + + // generate dts + await context.loadFile({ + path: `${input.path}.js`, + srcPath: `${input.srcPath}.js`, + extension: '.js', + getContents: () => 'export default {}', + }) const results = await Promise.all( blocks.map(async (data) => { @@ -127,10 +112,6 @@ function defineVueLoader(options?: DefineVueLoaderOptions): Loader { const contents = results .sort((a, b) => a.offset - b.offset) .map(({ block }) => { - if (block.type === 'script' && fakeScriptBlock) { - return undefined - } - const attrs = Object.entries(block.attrs) .map(([key, value]) => { if (!value) { @@ -236,11 +217,24 @@ const styleLoader = defineDefaultBlockLoader({ type: 'style', }) -const scriptLoader = defineDefaultBlockLoader({ - defaultLang: 'js', - type: 'script', - validExtensions: ['.js', '.mjs'], -}) +const scriptLoader: VueBlockLoader = async (block, { options }) => { + if (block.type !== 'script') { + return + } + + const { transform } = await esbuild() + const { code: result } = await transform(block.content, { + ...options.esbuild, + loader: 'ts', + tsconfigRaw: { compilerOptions: { target: 'ESNext', verbatimModuleSyntax: true } }, + }) + + return { + type: block.type, + attrs: toOmit(block.attrs, ['lang', 'generic']), + content: result, + } +} export const vueLoader = defineVueLoader({ blockLoaders: { @@ -250,6 +244,14 @@ export const vueLoader = defineVueLoader({ }, }) +let esbuildCache: typeof import('esbuild') +async function esbuild() { + if (!esbuildCache) { + esbuildCache = await import('esbuild') + } + return esbuildCache +} + function cleanupBreakLine(str: string): string { return str.replaceAll(/(\n\n)\n+/g, '\n\n').replace(/^\s*\n|\n\s*$/g, '') } diff --git a/test/mkdist.test.ts b/test/mkdist.test.ts index 84f0e8d..1cc3cb5 100644 --- a/test/mkdist.test.ts +++ b/test/mkdist.test.ts @@ -192,6 +192,30 @@ describe('transform typescript script setup', () => { `) }) + it('do not tree-shake', async () => { + expect( + await fixture( + ` + `, + ), + ).toMatchInlineSnapshot(` + " + + + " + `) + }) + async function fixture(src: string): Promise { await rm(tmpDir, { force: true, recursive: true }) await mkdir(join(tmpDir, 'src'), { recursive: true }) From 706af1d721ff2870f806d7c3a81c549f348c9509 Mon Sep 17 00:00:00 2001 From: Teages Date: Mon, 7 Apr 2025 23:11:46 +0800 Subject: [PATCH 2/5] fix: relex esbuild requirements --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dc29f60..f437fe8 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "test:types": "tsc --noEmit" }, "peerDependencies": { - "esbuild": "0.25.2", + "esbuild": "^0.25.2", "vue": "^3.5.13" }, "peerDependenciesMeta": { From 167336c68824898775e392209064f7fcf1befc08 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 7 Apr 2025 08:29:43 -0700 Subject: [PATCH 3/5] chore: add dependency on `esbuild` --- package.json | 6 ------ src/mkdist.ts | 10 +--------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/package.json b/package.json index f437fe8..13603e2 100644 --- a/package.json +++ b/package.json @@ -44,14 +44,8 @@ "test:types": "tsc --noEmit" }, "peerDependencies": { - "esbuild": "^0.25.2", "vue": "^3.5.13" }, - "peerDependenciesMeta": { - "esbuild": { - "optional": true - } - }, "dependencies": { "@babel/parser": "^7.27.0" }, diff --git a/src/mkdist.ts b/src/mkdist.ts index 664abff..6613246 100644 --- a/src/mkdist.ts +++ b/src/mkdist.ts @@ -1,5 +1,6 @@ import type { SFCBlock, SFCTemplateBlock } from 'vue/compiler-sfc' import type { InputFile, Loader, LoaderContext, LoaderResult, OutputFile } from './types/mkdist' +import { transform } from 'esbuild' import { preTranspileScriptSetup, transpileVueTemplate } from './index' interface DefineVueLoaderOptions { @@ -222,7 +223,6 @@ const scriptLoader: VueBlockLoader = async (block, { options }) => { return } - const { transform } = await esbuild() const { code: result } = await transform(block.content, { ...options.esbuild, loader: 'ts', @@ -244,14 +244,6 @@ export const vueLoader = defineVueLoader({ }, }) -let esbuildCache: typeof import('esbuild') -async function esbuild() { - if (!esbuildCache) { - esbuildCache = await import('esbuild') - } - return esbuildCache -} - function cleanupBreakLine(str: string): string { return str.replaceAll(/(\n\n)\n+/g, '\n\n').replace(/^\s*\n|\n\s*$/g, '') } From b6e840130bc9908064242dfdddcf0ec883d68a68 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 7 Apr 2025 08:32:12 -0700 Subject: [PATCH 4/5] chore: whoops --- package.json | 4 ++-- pnpm-lock.yaml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 13603e2..e87134b 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,8 @@ "vue": "^3.5.13" }, "dependencies": { - "@babel/parser": "^7.27.0" + "@babel/parser": "^7.27.0", + "esbuild": "0.25.2" }, "devDependencies": { "@antfu/eslint-config": "4.11.0", @@ -57,7 +58,6 @@ "@vue/compiler-dom": "3.5.13", "bumpp": "10.1.0", "changelogithub": "13.13.0", - "esbuild": "0.25.2", "eslint": "9.24.0", "exsolve": "1.0.4", "installed-check": "9.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ac68d1..82cdd50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@babel/parser': specifier: ^7.27.0 version: 7.27.0 + esbuild: + specifier: 0.25.2 + version: 0.25.2 devDependencies: '@antfu/eslint-config': specifier: 4.11.0 @@ -36,9 +39,6 @@ importers: changelogithub: specifier: 13.13.0 version: 13.13.0(magicast@0.3.5) - esbuild: - specifier: 0.25.2 - version: 0.25.2 eslint: specifier: 9.24.0 version: 9.24.0(jiti@2.4.2) From fa1c67f7abe581f2f9d1cef45eadf8463e6015b0 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 7 Apr 2025 08:35:51 -0700 Subject: [PATCH 5/5] chore: move back to peer dep + update versions --- package.json | 7 ++++--- pnpm-lock.yaml | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e87134b..2877664 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "dist" ], "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" }, "scripts": { "build": "unbuild", @@ -44,11 +44,11 @@ "test:types": "tsc --noEmit" }, "peerDependencies": { + "esbuild": "*", "vue": "^3.5.13" }, "dependencies": { - "@babel/parser": "^7.27.0", - "esbuild": "0.25.2" + "@babel/parser": "^7.27.0" }, "devDependencies": { "@antfu/eslint-config": "4.11.0", @@ -58,6 +58,7 @@ "@vue/compiler-dom": "3.5.13", "bumpp": "10.1.0", "changelogithub": "13.13.0", + "esbuild": "0.25.2", "eslint": "9.24.0", "exsolve": "1.0.4", "installed-check": "9.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82cdd50..2ac68d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,6 @@ importers: '@babel/parser': specifier: ^7.27.0 version: 7.27.0 - esbuild: - specifier: 0.25.2 - version: 0.25.2 devDependencies: '@antfu/eslint-config': specifier: 4.11.0 @@ -39,6 +36,9 @@ importers: changelogithub: specifier: 13.13.0 version: 13.13.0(magicast@0.3.5) + esbuild: + specifier: 0.25.2 + version: 0.25.2 eslint: specifier: 9.24.0 version: 9.24.0(jiti@2.4.2)