forked from
npmx.dev/npmx.dev
[READ-ONLY]
a fast, modern browser for the npm registry
1/**
2 * Parsed package parameters from URL path segments.
3 */
4export interface ParsedPackageParams {
5 /** The npm package name (e.g., "vue", "@nuxt/kit") */
6 packageName: string
7 /** The version if specified (e.g., "3.4.0"), undefined otherwise */
8 version: string | undefined
9 /** Remaining path segments after the version (e.g., for file paths) */
10 rest: string[]
11}
12
13/**
14 * Parse package name, optional version, and remaining path from URL segments.
15 *
16 * Supports these URL patterns:
17 * - `/pkg` → { packageName: "pkg", version: undefined, rest: [] }
18 * - `/pkg/v/1.2.3` → { packageName: "pkg", version: "1.2.3", rest: [] }
19 * - `/pkg/v/1.2.3/src/index.ts` → { packageName: "pkg", version: "1.2.3", rest: ["src", "index.ts"] }
20 * - `/@scope/pkg` → { packageName: "@scope/pkg", version: undefined, rest: [] }
21 * - `/@scope/pkg/v/1.2.3` → { packageName: "@scope/pkg", version: "1.2.3", rest: [] }
22 *
23 * @param pkgParam - The raw package parameter from the URL (e.g., "vue/v/3.4.0/src/index.ts")
24 * @returns Parsed package name, optional version, and remaining path segments
25 *
26 * @example
27 * ```ts
28 * parsePackageParam('vue')
29 * // { packageName: 'vue', version: undefined, rest: [] }
30 *
31 * parsePackageParam('vue/v/3.4.0')
32 * // { packageName: 'vue', version: '3.4.0', rest: [] }
33 *
34 * parsePackageParam('@nuxt/kit/v/1.0.0/src/index.ts')
35 * // { packageName: '@nuxt/kit', version: '1.0.0', rest: ['src', 'index.ts'] }
36 * ```
37 */
38export function parsePackageParam(pkgParam: string): ParsedPackageParams {
39 const segments = pkgParam.split('/')
40 const vIndex = segments.indexOf('v')
41
42 if (vIndex !== -1 && vIndex < segments.length - 1) {
43 return {
44 packageName: segments.slice(0, vIndex).join('/'),
45 version: segments[vIndex + 1],
46 rest: segments.slice(vIndex + 2),
47 }
48 }
49
50 return {
51 packageName: segments.join('/'),
52 version: undefined,
53 rest: [],
54 }
55}