[READ-ONLY] a fast, modern browser for the npm registry
at main 55 lines 1.9 kB view raw
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}