diff --git a/packages/nuxi/src/utils/banner.ts b/packages/nuxi/src/utils/banner.ts index 81fe6570..6e026592 100644 --- a/packages/nuxi/src/utils/banner.ts +++ b/packages/nuxi/src/utils/banner.ts @@ -9,16 +9,16 @@ export function getBuilder(cwd: string, builder: Exclude 0) { + let from: string | undefined = cwd + for (const step of options.via) { + from = resolveModulePath(step, { from, try: true }) ?? undefined + if (!from) { + break + } + } + if (from) { + roots.push(from) } - const p = resolveModulePath(`${pkg}/package.json`, { from: url, try: true }) + } + + // Fallback: direct resolution from cwd or nuxt's location + roots.push(cwd) + const nuxtPath = tryResolveNuxt(cwd) + if (nuxtPath) { + roots.push(nuxtPath) + } + + for (const root of roots) { + const p = resolveModulePath(`${pkg}/package.json`, { from: root, try: true }) if (p) { return JSON.parse(readFileSync(p, 'utf-8')) } } + return null } diff --git a/packages/nuxi/test/unit/utils/banner.spec.ts b/packages/nuxi/test/unit/utils/banner.spec.ts new file mode 100644 index 00000000..6e5d4cb4 --- /dev/null +++ b/packages/nuxi/test/unit/utils/banner.spec.ts @@ -0,0 +1,35 @@ +import { describe, expect, it, vi } from 'vitest' + +vi.mock('../../../src/utils/versions', () => ({ + getPkgJSON: vi.fn((_cwd: string, pkg: string, options?: { via?: string[] }) => { + if (pkg === 'vite' && options?.via?.includes('@nuxt/vite-builder')) { + return { name: 'vite', version: '7.3.1' } + } + return null + }), + getPkgVersion: vi.fn((_cwd: string, pkg: string, options?: { via?: string[] }) => { + if (pkg === 'webpack' && options?.via?.includes('@nuxt/webpack-builder')) { + return '5.99.0' + } + if (pkg === '@rspack/core' && options?.via?.includes('@nuxt/rspack-builder')) { + return '1.3.0' + } + return '' + }), +})) + +const { getBuilder } = await import('../../../src/utils/banner') + +describe('getBuilder', () => { + it('resolves vite version via nuxt -> @nuxt/vite-builder', () => { + expect(getBuilder('/any', 'vite')).toEqual({ name: 'Vite', version: '7.3.1' }) + }) + + it('resolves webpack version via @nuxt/webpack-builder', () => { + expect(getBuilder('/any', 'webpack')).toEqual({ name: 'Webpack', version: '5.99.0' }) + }) + + it('resolves rspack version via @nuxt/rspack-builder', () => { + expect(getBuilder('/any', 'rspack')).toEqual({ name: 'Rspack', version: '1.3.0' }) + }) +})