diff --git a/shared/utils/package-analysis.ts b/shared/utils/package-analysis.ts index f46c98518d..57ed391d82 100644 --- a/shared/utils/package-analysis.ts +++ b/shared/utils/package-analysis.ts @@ -200,17 +200,21 @@ export function getCreatePackageName(packageName: string): string { /** * Extract the short name from a create-* package for display. - * e.g., "create-vite" -> "vite", "@scope/create-foo" -> "foo" + * e.g., "create-vite" -> "vite", "@scope/create-foo" -> "@scope/foo", "@scope/create" -> "@scope" */ export function getCreateShortName(createPackageName: string): string { if (createPackageName.startsWith('@')) { - // @scope/create-foo -> foo + // @scope/create -> @scope, @scope/create-foo -> @scope/foo const slashIndex = createPackageName.indexOf('/') + const scope = createPackageName.slice(0, slashIndex) const name = createPackageName.slice(slashIndex + 1) + if (name === 'create') { + return scope + } if (name.startsWith('create-')) { - return name.slice('create-'.length) + return `${scope}/${name.slice('create-'.length)}` } - return name + return createPackageName } // create-vite -> vite if (createPackageName.startsWith('create-')) { diff --git a/test/unit/app/utils/install-command.spec.ts b/test/unit/app/utils/install-command.spec.ts index fb35bb94dc..4abbb51f8d 100644 --- a/test/unit/app/utils/install-command.spec.ts +++ b/test/unit/app/utils/install-command.spec.ts @@ -402,7 +402,17 @@ describe('install command generation', () => { packageManager: 'npm', isCreatePackage: true, }), - ).toEqual(['npm', 'create', 'app']) + ).toEqual(['npm', 'create', '@vue/app']) + }) + + it('handles @scope/create pattern', () => { + expect( + getExecuteCommandParts({ + packageName: '@angular/create', + packageManager: 'npm', + isCreatePackage: true, + }), + ).toEqual(['npm', 'create', '@angular']) }) }) }) diff --git a/test/unit/shared/utils/package-analysis.spec.ts b/test/unit/shared/utils/package-analysis.spec.ts index 1508559f00..5ac7d37605 100644 --- a/test/unit/shared/utils/package-analysis.spec.ts +++ b/test/unit/shared/utils/package-analysis.spec.ts @@ -429,19 +429,23 @@ describe('getCreateShortName', () => { expect(getCreateShortName('create-vite')).toBe('vite') }) - it('extracts name from scoped create-* package', () => { - expect(getCreateShortName('@vue/create-app')).toBe('app') + it('extracts name from scoped create-* package preserving scope', () => { + expect(getCreateShortName('@vue/create-app')).toBe('@vue/app') }) it('returns full name if not a create-* package', () => { expect(getCreateShortName('vite')).toBe('vite') }) - it('handles scoped package without create- prefix', () => { - expect(getCreateShortName('@scope/foo')).toBe('foo') + it('returns full name for scoped package without create- prefix', () => { + expect(getCreateShortName('@scope/foo')).toBe('@scope/foo') }) it('extracts name from create-next-app style packages', () => { expect(getCreateShortName('create-next-app')).toBe('next-app') }) + + it('returns scope only for @scope/create packages', () => { + expect(getCreateShortName('@angular/create')).toBe('@angular') + }) })