Skip to content

Commit 7efb8c4

Browse files
committed
refactor: extract and use util to parse package name
1 parent f10f375 commit 7efb8c4

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

app/composables/useCommandPalettePackageCommands.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,12 @@ export function useCommandPalettePackageCommands(
3131
const resolvedContext = toValue(context)
3232
if (!resolvedContext?.resolvedVersion) return []
3333

34-
const splitName = resolvedContext.packageName.split('/')
35-
const [firstSegment, secondSegment] = splitName
36-
if (!firstSegment) return []
34+
const { org, name } = splitPackageName(resolvedContext.packageName)
35+
if (!name) return []
3736

38-
const isScopedPackage = splitName.length === 2 && !!secondSegment
39-
const docsPath: [string, ...string[]] = isScopedPackage
40-
? [firstSegment, secondSegment, 'v', resolvedContext.resolvedVersion]
41-
: [firstSegment, 'v', resolvedContext.resolvedVersion]
37+
const docsPath: [string, ...string[]] = org
38+
? [org, name, 'v', resolvedContext.resolvedVersion]
39+
: [name, 'v', resolvedContext.resolvedVersion]
4240
const docsLink = {
4341
name: 'docs' as const,
4442
params: {
@@ -48,8 +46,8 @@ export function useCommandPalettePackageCommands(
4846
const codeLink = {
4947
name: 'code' as const,
5048
params: {
51-
org: isScopedPackage ? firstSegment : undefined,
52-
packageName: isScopedPackage ? secondSegment : firstSegment,
49+
org: org || undefined,
50+
packageName: name,
5351
version: resolvedContext.resolvedVersion,
5452
filePath: '',
5553
},

app/utils/package-name.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@ import validatePackageName from 'validate-npm-package-name'
22
import { NPM_REGISTRY } from '#shared/utils/constants'
33
import { encodePackageName } from '#shared/utils/npm'
44

5+
export function splitPackageName(packageName: string): { org: string; name: string } {
6+
const [org = '', name = ''] = packageName.startsWith('@')
7+
? packageName.split('/')
8+
: ['', packageName]
9+
return { org, name }
10+
}
11+
512
/**
613
* Normalize a package name for comparison by removing common variations.
714
* This aims to mirror npm's typosquatting detection algorithm.

app/utils/router.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import type { RouteLocationRaw } from 'vue-router'
2+
import { splitPackageName } from '~/utils/package-name'
23

34
export function packageRoute(
45
packageName: string,
56
version?: string | null,
67
hash?: string,
78
): RouteLocationRaw {
8-
const [org, name = ''] = packageName.startsWith('@') ? packageName.split('/') : ['', packageName]
9+
const { org, name } = splitPackageName(packageName)
910

1011
if (version) {
1112
return {
@@ -34,7 +35,7 @@ export function diffRoute(
3435
fromVersion: string,
3536
toVersion: string,
3637
): RouteLocationRaw {
37-
const [org, name = ''] = packageName.startsWith('@') ? packageName.split('/') : ['', packageName]
38+
const { org, name } = splitPackageName(packageName)
3839

3940
return {
4041
name: 'diff',

0 commit comments

Comments
 (0)