Skip to content

Commit c7ff8c3

Browse files
committed
fix: vlt package manager
1 parent e5f9ef4 commit c7ff8c3

2 files changed

Lines changed: 34 additions & 39 deletions

File tree

app/utils/install-command.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export const packageManagers = [
66
{ id: 'yarn', label: 'yarn', action: 'add' },
77
{ id: 'bun', label: 'bun', action: 'add' },
88
{ id: 'deno', label: 'deno', action: 'add' },
9-
{ id: 'jsr', label: 'jsr', action: 'add' },
9+
{ id: 'vlt', label: 'vlt', action: 'install' },
1010
] as const
1111

1212
export type PackageManagerId = (typeof packageManagers)[number]['id']
@@ -20,26 +20,21 @@ export interface InstallCommandOptions {
2020

2121
/**
2222
* Get the package specifier for a given package manager.
23-
* Handles npm: prefix for deno and jsr (when not native).
23+
* Handles jsr: prefix for deno (when available on JSR).
2424
*/
2525
export function getPackageSpecifier(options: InstallCommandOptions): string {
2626
const { packageName, packageManager, jsrInfo } = options
2727

2828
if (packageManager === 'deno') {
29-
// deno add npm:package
30-
return `npm:${packageName}`
31-
}
32-
33-
if (packageManager === 'jsr') {
3429
if (jsrInfo?.exists && jsrInfo.scope && jsrInfo.name) {
35-
// Native JSR package: @scope/name
36-
return `@${jsrInfo.scope}/${jsrInfo.name}`
30+
// Native JSR package: jsr:@scope/name
31+
return `jsr:@${jsrInfo.scope}/${jsrInfo.name}`
3732
}
3833
// npm compatibility: npm:package
3934
return `npm:${packageName}`
4035
}
4136

42-
// Standard package managers (npm, pnpm, yarn, bun)
37+
// Standard package managers (npm, pnpm, yarn, bun, vlt)
4338
return packageName
4439
}
4540

test/unit/install-command.spec.ts

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ describe('install command generation', () => {
3131
['yarn', 'lodash'],
3232
['bun', 'lodash'],
3333
['deno', 'npm:lodash'],
34-
['jsr', 'npm:lodash'],
34+
['vlt', 'lodash'],
3535
] as const)('%s → %s', (pm, expected) => {
3636
expect(
3737
getPackageSpecifier({
@@ -49,8 +49,8 @@ describe('install command generation', () => {
4949
['pnpm', '@trpc/server'],
5050
['yarn', '@trpc/server'],
5151
['bun', '@trpc/server'],
52-
['deno', 'npm:@trpc/server'],
53-
['jsr', '@trpc/server'], // Native JSR specifier
52+
['deno', 'jsr:@trpc/server'], // Native JSR specifier preferred
53+
['vlt', '@trpc/server'],
5454
] as const)('%s → %s', (pm, expected) => {
5555
expect(
5656
getPackageSpecifier({
@@ -68,8 +68,8 @@ describe('install command generation', () => {
6868
['pnpm', '@vue/shared'],
6969
['yarn', '@vue/shared'],
7070
['bun', '@vue/shared'],
71-
['deno', 'npm:@vue/shared'],
72-
['jsr', 'npm:@vue/shared'], // Falls back to npm: compat
71+
['deno', 'npm:@vue/shared'], // Falls back to npm: compat
72+
['vlt', '@vue/shared'],
7373
] as const)('%s → %s', (pm, expected) => {
7474
expect(
7575
getPackageSpecifier({
@@ -90,7 +90,7 @@ describe('install command generation', () => {
9090
['yarn', 'yarn add lodash'],
9191
['bun', 'bun add lodash'],
9292
['deno', 'deno add npm:lodash'],
93-
['jsr', 'jsr add npm:lodash'],
93+
['vlt', 'vlt install lodash'],
9494
] as const)('%s → %s', (pm, expected) => {
9595
expect(
9696
getInstallCommand({
@@ -109,7 +109,7 @@ describe('install command generation', () => {
109109
['yarn', 'yarn add lodash@4.17.21'],
110110
['bun', 'bun add lodash@4.17.21'],
111111
['deno', 'deno add npm:lodash@4.17.21'],
112-
['jsr', 'jsr add npm:lodash@4.17.21'],
112+
['vlt', 'vlt install lodash@4.17.21'],
113113
] as const)('%s → %s', (pm, expected) => {
114114
expect(
115115
getInstallCommand({
@@ -128,8 +128,8 @@ describe('install command generation', () => {
128128
['pnpm', 'pnpm add @trpc/server'],
129129
['yarn', 'yarn add @trpc/server'],
130130
['bun', 'bun add @trpc/server'],
131-
['deno', 'deno add npm:@trpc/server'],
132-
['jsr', 'jsr add @trpc/server'], // Native JSR
131+
['deno', 'deno add jsr:@trpc/server'], // Native JSR preferred
132+
['vlt', 'vlt install @trpc/server'],
133133
] as const)('%s → %s', (pm, expected) => {
134134
expect(
135135
getInstallCommand({
@@ -147,8 +147,8 @@ describe('install command generation', () => {
147147
['pnpm', 'pnpm add @trpc/server@10.0.0'],
148148
['yarn', 'yarn add @trpc/server@10.0.0'],
149149
['bun', 'bun add @trpc/server@10.0.0'],
150-
['deno', 'deno add npm:@trpc/server@10.0.0'],
151-
['jsr', 'jsr add @trpc/server@10.0.0'], // Native JSR with version
150+
['deno', 'deno add jsr:@trpc/server@10.0.0'], // Native JSR with version
151+
['vlt', 'vlt install @trpc/server@10.0.0'],
152152
] as const)('%s → %s', (pm, expected) => {
153153
expect(
154154
getInstallCommand({
@@ -167,8 +167,8 @@ describe('install command generation', () => {
167167
['pnpm', 'pnpm add @vue/shared'],
168168
['yarn', 'yarn add @vue/shared'],
169169
['bun', 'bun add @vue/shared'],
170-
['deno', 'deno add npm:@vue/shared'],
171-
['jsr', 'jsr add npm:@vue/shared'], // Falls back to npm: compat
170+
['deno', 'deno add npm:@vue/shared'], // Falls back to npm: compat
171+
['vlt', 'vlt install @vue/shared'],
172172
] as const)('%s → %s', (pm, expected) => {
173173
expect(
174174
getInstallCommand({
@@ -201,31 +201,31 @@ describe('install command generation', () => {
201201
expect(parts).toEqual(['npm', 'install', 'lodash@4.17.21'])
202202
})
203203

204-
it('returns correct parts for deno with npm: prefix', () => {
204+
it('returns correct parts for deno with jsr: prefix when available', () => {
205205
const parts = getInstallCommandParts({
206206
packageName: '@trpc/server',
207207
packageManager: 'deno',
208208
jsrInfo: jsrAvailable,
209209
})
210-
expect(parts).toEqual(['deno', 'add', 'npm:@trpc/server'])
210+
expect(parts).toEqual(['deno', 'add', 'jsr:@trpc/server'])
211211
})
212212

213-
it('returns correct parts for jsr with native package', () => {
213+
it('returns correct parts for deno with npm: prefix when not on JSR', () => {
214214
const parts = getInstallCommandParts({
215-
packageName: '@trpc/server',
216-
packageManager: 'jsr',
217-
jsrInfo: jsrAvailable,
215+
packageName: 'lodash',
216+
packageManager: 'deno',
217+
jsrInfo: jsrNotAvailable,
218218
})
219-
expect(parts).toEqual(['jsr', 'add', '@trpc/server'])
219+
expect(parts).toEqual(['deno', 'add', 'npm:lodash'])
220220
})
221221

222-
it('returns correct parts for jsr with npm compat', () => {
222+
it('returns correct parts for vlt', () => {
223223
const parts = getInstallCommandParts({
224224
packageName: 'lodash',
225-
packageManager: 'jsr',
225+
packageManager: 'vlt',
226226
jsrInfo: jsrNotAvailable,
227227
})
228-
expect(parts).toEqual(['jsr', 'add', 'npm:lodash'])
228+
expect(parts).toEqual(['vlt', 'install', 'lodash'])
229229
})
230230

231231
it('joined parts match getInstallCommand output', () => {
@@ -242,35 +242,35 @@ describe('install command generation', () => {
242242
})
243243

244244
describe('edge cases', () => {
245-
it('handles null jsrInfo same as not available', () => {
245+
it('handles null jsrInfo same as not available for deno', () => {
246246
expect(
247247
getPackageSpecifier({
248248
packageName: 'lodash',
249-
packageManager: 'jsr',
249+
packageManager: 'deno',
250250
jsrInfo: null,
251251
}),
252252
).toBe('npm:lodash')
253253
})
254254

255-
it('handles undefined jsrInfo same as not available', () => {
255+
it('handles undefined jsrInfo same as not available for deno', () => {
256256
expect(
257257
getPackageSpecifier({
258258
packageName: 'lodash',
259-
packageManager: 'jsr',
259+
packageManager: 'deno',
260260
jsrInfo: undefined,
261261
}),
262262
).toBe('npm:lodash')
263263
})
264264

265-
it('handles jsrInfo with exists:true but missing scope/name', () => {
265+
it('handles jsrInfo with exists:true but missing scope/name for deno', () => {
266266
const partialJsr: JsrPackageInfo = {
267267
exists: true,
268268
// Missing scope and name
269269
}
270270
expect(
271271
getPackageSpecifier({
272272
packageName: '@foo/bar',
273-
packageManager: 'jsr',
273+
packageManager: 'deno',
274274
jsrInfo: partialJsr,
275275
}),
276276
).toBe('npm:@foo/bar')

0 commit comments

Comments
 (0)