diff --git a/packages/vite/configuration/vue.spec.ts b/packages/vite/configuration/vue.spec.ts new file mode 100644 index 0000000000..46ba6702fe --- /dev/null +++ b/packages/vite/configuration/vue.spec.ts @@ -0,0 +1,19 @@ +import { describe, expect, it, vi } from 'vitest'; + +// baseConfig resolves @nativescript/core from disk; only the Vue layer is under test +vi.mock('./base.js', () => ({ baseConfig: () => ({}) })); + +import { vueConfig } from './vue.js'; + +describe('vueConfig', () => { + it('aliases vue to nativescript-vue through resolve.alias rather than a rollup alias plugin', () => { + // Under rolldown, @rollup/plugin-alias resolved the bare replacement to + // the package directory and every SFC's injected `from "vue"` failed. + const config = vueConfig({ mode: 'production' }); + const aliases = config.resolve?.alias as Array<{ find: string | RegExp; replacement: string }>; + expect(Array.isArray(aliases)).toBe(true); + expect(aliases).toContainEqual({ find: 'vue', replacement: 'nativescript-vue' }); + const pluginNames = (config.plugins ?? []).flat().map((p: any) => p?.name); + expect(pluginNames).not.toContain('alias'); + }); +}); diff --git a/packages/vite/configuration/vue.ts b/packages/vite/configuration/vue.ts index 377c85d373..a8507856a7 100644 --- a/packages/vite/configuration/vue.ts +++ b/packages/vite/configuration/vue.ts @@ -1,9 +1,6 @@ import vue from '@vitejs/plugin-vue'; import vueJsx from '@vitejs/plugin-vue-jsx'; import path from 'path'; -import alias from '@rollup/plugin-alias'; -import { fileURLToPath } from 'node:url'; -import { dirname, resolve } from 'node:path'; import { mergeConfig, type UserConfig } from 'vite'; import { baseConfig } from './base.js'; import { parse as babelParse } from '@babel/parser'; @@ -13,9 +10,6 @@ import * as t from '@babel/types'; import { getCliFlags } from '../helpers/cli-flags.js'; import { getTypeCheckPlugins, type TypeCheckControlOptions } from '../helpers/typescript-check.js'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); - export const vueConfig = ({ mode }, options: TypeCheckControlOptions = {}): UserConfig => { const targetMode = mode === 'development' ? 'development' : 'production'; const cliFlags = getCliFlags(); @@ -23,19 +17,12 @@ export const vueConfig = ({ mode }, options: TypeCheckControlOptions = {}): User const hmrActive = isDevMode && !!cliFlags.hmr; return mergeConfig(baseConfig({ mode, flavor: 'vue' }), { + resolve: { + // @rollup/plugin-alias resolves a bare package to its directory under rolldown + alias: [{ find: 'vue', replacement: 'nativescript-vue' }], + }, plugins: [ ...getTypeCheckPlugins('vue', options.typeCheck), - { - ...alias({ - entries: { - // Retain 'vue' alias to 'nativescript-vue' so any generic Vue imports resolve - // to the NativeScript-Vue runtime. - vue: 'nativescript-vue', - 'set-value': resolve(__dirname, '../shims/set-value.js'), - }, - }), - enforce: 'pre', - }, // Enable Vue Single File Component support vue({ // NativeScript projects often use