From 71ba4c238ca4b7ce05b718cff83c17566ed25dc8 Mon Sep 17 00:00:00 2001 From: Roscoe Rubin-Rottenberg <118622417+knotbin@users.noreply.github.com> Date: Wed, 1 Apr 2026 14:11:52 +0000 Subject: [PATCH 1/5] fix: Deno command for create- packages --- app/utils/install-command.ts | 5 ++++- test/unit/app/utils/install-command.spec.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/utils/install-command.ts b/app/utils/install-command.ts index 857804cafa..926a566ab1 100644 --- a/app/utils/install-command.ts +++ b/app/utils/install-command.ts @@ -47,7 +47,7 @@ export const packageManagers = [ action: 'add', executeLocal: 'deno run', executeRemote: 'deno run', - create: 'deno run', + create: 'deno create', icon: 'i-simple-icons:deno', }, { @@ -137,6 +137,9 @@ export function getExecuteCommandParts(options: ExecuteCommandOptions): string[] if (options.isCreatePackage) { const shortName = getCreateShortName(options.packageName) if (shortName !== options.packageName) { + if (options.packageManager === 'deno') { + return ['deno', 'create', `npm:${shortName}`] + } return [...pm.create.split(' '), shortName] } } diff --git a/test/unit/app/utils/install-command.spec.ts b/test/unit/app/utils/install-command.spec.ts index 8dd5c1bbab..9d69be4071 100644 --- a/test/unit/app/utils/install-command.spec.ts +++ b/test/unit/app/utils/install-command.spec.ts @@ -381,7 +381,7 @@ describe('install command generation', () => { ['pnpm', ['pnpm', 'create', 'vite']], ['yarn', ['yarn', 'create', 'vite']], ['bun', ['bun', 'create', 'vite']], - ['deno', ['deno', 'run', 'vite']], + ['deno', ['deno', 'create', 'npm:vite']], ['vlt', ['vlx', 'vite']], ] as const)('%s → %s', (pm, expected) => { expect( From 4ef9418dae9ca77cd133ac434ee3e54de5b4cfa0 Mon Sep 17 00:00:00 2001 From: Roscoe Rubin-Rottenberg <118622417+knotbin@users.noreply.github.com> Date: Wed, 1 Apr 2026 21:05:14 +0000 Subject: [PATCH 2/5] fix vue duplicate logic --- app/components/Terminal/Install.vue | 31 +++++++++++++---------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/app/components/Terminal/Install.vue b/app/components/Terminal/Install.vue index f1fbe7fd2f..38955234fb 100644 --- a/app/components/Terminal/Install.vue +++ b/app/components/Terminal/Install.vue @@ -60,22 +60,12 @@ function getRunPartsForPM(pmId: PackageManagerId, command?: string) { // Generate create command parts for a specific package manager function getCreatePartsForPM(pmId: PackageManagerId) { if (!props.createPackageInfo) return [] - const pm = packageManagers.find(p => p.id === pmId) - if (!pm) return [] - - const createPkgName = props.createPackageInfo.packageName - let shortName: string - if (createPkgName.startsWith('@')) { - const slashIndex = createPkgName.indexOf('/') - const name = createPkgName.slice(slashIndex + 1) - shortName = name.startsWith('create-') ? name.slice('create-'.length) : name - } else { - shortName = createPkgName.startsWith('create-') - ? createPkgName.slice('create-'.length) - : createPkgName - } - - return [...pm.create.split(' '), shortName] + return getExecuteCommandParts({ + packageName: props.createPackageInfo.packageName, + packageManager: pmId, + jsrInfo: null, + isCreatePackage: true, + }) } // Generate @types install command parts for a specific package manager @@ -102,7 +92,14 @@ function getFullRunCommand(command?: string) { // Full create command for copying (uses current selected PM) function getFullCreateCommand() { - return getCreatePartsForPM(selectedPM.value).join(' ') + if (!props.createPackageInfo) return '' + + return getExecuteCommand({ + packageName: props.createPackageInfo.packageName, + packageManager: selectedPM.value, + jsrInfo: null, + isCreatePackage: true, + }) } // Copy handlers From ad11fa961b0ce7a9b907db46a9dd6ba52d44428e Mon Sep 17 00:00:00 2001 From: Roscoe Rubin-Rottenberg <118622417+knotbin@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:46:19 +0000 Subject: [PATCH 3/5] add npm: prefix to getCreateShortName --- app/utils/install-command.ts | 2 +- shared/utils/package-analysis.ts | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/utils/install-command.ts b/app/utils/install-command.ts index 926a566ab1..f5a12fcc56 100644 --- a/app/utils/install-command.ts +++ b/app/utils/install-command.ts @@ -135,7 +135,7 @@ export function getExecuteCommandParts(options: ExecuteCommandOptions): string[] // For create-* packages, use the shorthand create command if (options.isCreatePackage) { - const shortName = getCreateShortName(options.packageName) + const shortName = getCreateShortName(options.packageName, options.packageManager) if (shortName !== options.packageName) { if (options.packageManager === 'deno') { return ['deno', 'create', `npm:${shortName}`] diff --git a/shared/utils/package-analysis.ts b/shared/utils/package-analysis.ts index d9c0a39f15..a86c37f1dc 100644 --- a/shared/utils/package-analysis.ts +++ b/shared/utils/package-analysis.ts @@ -207,7 +207,7 @@ export function getCreatePackageName(packageName: string): string { * Extract the short name from a create-* package for display. * e.g., "create-vite" -> "vite", "@scope/create-foo" -> "@scope/foo", "@scope/create" -> "@scope" */ -export function getCreateShortName(createPackageName: string): string { +export function getCreateShortName(createPackageName: string, packageManager: string): string { if (createPackageName.startsWith('@')) { // @scope/create -> @scope, @scope/create-foo -> @scope/foo const slashIndex = createPackageName.indexOf('/') @@ -225,6 +225,9 @@ export function getCreateShortName(createPackageName: string): string { if (createPackageName.startsWith('create-')) { return createPackageName.slice('create-'.length) } + if (packageManager === 'deno') { + createPackageName = `npm:${createPackageName}` + } return createPackageName } From 78dd9c48d1306d41e191b12424236cd5eaebf293 Mon Sep 17 00:00:00 2001 From: Roscoe Rubin-Rottenberg <118622417+knotbin@users.noreply.github.com> Date: Fri, 3 Apr 2026 19:04:40 +0000 Subject: [PATCH 4/5] getCreatePackageSpecifier --- app/utils/install-command.ts | 31 ++++++++++++++++++++++--------- shared/utils/package-analysis.ts | 5 +---- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/app/utils/install-command.ts b/app/utils/install-command.ts index f5a12fcc56..468c480210 100644 --- a/app/utils/install-command.ts +++ b/app/utils/install-command.ts @@ -125,6 +125,24 @@ export interface ExecuteCommandOptions extends InstallCommandOptions { isCreatePackage?: boolean } +function getCreatePackageSpecifier(options: ExecuteCommandOptions): string | null { + const { packageName, packageManager, isCreatePackage } = options + + if (!isCreatePackage) { + return null + } + const shortName = getCreateShortName(packageName) + if (shortName === packageName) { + return null + } + if (packageManager === 'deno') { + // npm compatibility: npm:package + return `npm:${shortName}` + } + + return shortName +} + export function getExecuteCommand(options: ExecuteCommandOptions): string { return getExecuteCommandParts(options).join(' ') } @@ -133,15 +151,10 @@ export function getExecuteCommandParts(options: ExecuteCommandOptions): string[] const pm = packageManagers.find(p => p.id === options.packageManager) if (!pm) return [] - // For create-* packages, use the shorthand create command - if (options.isCreatePackage) { - const shortName = getCreateShortName(options.packageName, options.packageManager) - if (shortName !== options.packageName) { - if (options.packageManager === 'deno') { - return ['deno', 'create', `npm:${shortName}`] - } - return [...pm.create.split(' '), shortName] - } + // For create-* packages, use the shorthand create command. + const createSpecifier = getCreatePackageSpecifier(options) + if (createSpecifier) { + return [...pm.create.split(' '), createSpecifier] } // Choose remote or local execute based on package type diff --git a/shared/utils/package-analysis.ts b/shared/utils/package-analysis.ts index a86c37f1dc..d9c0a39f15 100644 --- a/shared/utils/package-analysis.ts +++ b/shared/utils/package-analysis.ts @@ -207,7 +207,7 @@ export function getCreatePackageName(packageName: string): string { * Extract the short name from a create-* package for display. * e.g., "create-vite" -> "vite", "@scope/create-foo" -> "@scope/foo", "@scope/create" -> "@scope" */ -export function getCreateShortName(createPackageName: string, packageManager: string): string { +export function getCreateShortName(createPackageName: string): string { if (createPackageName.startsWith('@')) { // @scope/create -> @scope, @scope/create-foo -> @scope/foo const slashIndex = createPackageName.indexOf('/') @@ -225,9 +225,6 @@ export function getCreateShortName(createPackageName: string, packageManager: st if (createPackageName.startsWith('create-')) { return createPackageName.slice('create-'.length) } - if (packageManager === 'deno') { - createPackageName = `npm:${createPackageName}` - } return createPackageName } From e26594a03eab8fff8dd4756ca0ab1285be884c38 Mon Sep 17 00:00:00 2001 From: Roscoe Rubin-Rottenberg <118622417+knotbin@users.noreply.github.com> Date: Sat, 4 Apr 2026 15:27:53 -0400 Subject: [PATCH 5/5] Update app/utils/install-command.ts Co-authored-by: Willow (GHOST) --- app/utils/install-command.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/utils/install-command.ts b/app/utils/install-command.ts index 468c480210..3b656a74ce 100644 --- a/app/utils/install-command.ts +++ b/app/utils/install-command.ts @@ -126,17 +126,17 @@ export interface ExecuteCommandOptions extends InstallCommandOptions { } function getCreatePackageSpecifier(options: ExecuteCommandOptions): string | null { - const { packageName, packageManager, isCreatePackage } = options - - if (!isCreatePackage) { + if (!options.isCreatePackage) { return null } - const shortName = getCreateShortName(packageName) - if (shortName === packageName) { + + const shortName = getCreateShortName(options.packageName) + if (shortName === options.packageName) { return null } - if (packageManager === 'deno') { - // npm compatibility: npm:package + + if (options.packageManager === 'deno') { + // npm compatibility: npm:package-name return `npm:${shortName}` }