|
1 | 1 | import { createError } from 'h3' |
2 | 2 | import validatePackageName from 'validate-npm-package-name' |
3 | 3 |
|
4 | | -/** |
5 | | - * Parsed package parameters from URL path segments. |
6 | | - */ |
7 | | -export interface ParsedPackageParams { |
8 | | - /** The npm package name (e.g., "vue", "@nuxt/kit") */ |
9 | | - packageName: string |
10 | | - /** The version if specified (e.g., "3.4.0"), undefined otherwise */ |
11 | | - version: string | undefined |
12 | | - /** Remaining path segments after the version (e.g., for file paths) */ |
13 | | - rest: string[] |
14 | | -} |
15 | | - |
16 | | -/** |
17 | | - * Parse package name, optional version, and remaining path from URL segments. |
18 | | - * |
19 | | - * Supports these URL patterns: |
20 | | - * - `/pkg` → { packageName: "pkg", version: undefined, rest: [] } |
21 | | - * - `/pkg/v/1.2.3` → { packageName: "pkg", version: "1.2.3", rest: [] } |
22 | | - * - `/pkg/v/1.2.3/src/index.ts` → { packageName: "pkg", version: "1.2.3", rest: ["src", "index.ts"] } |
23 | | - * - `/@scope/pkg` → { packageName: "@scope/pkg", version: undefined, rest: [] } |
24 | | - * - `/@scope/pkg/v/1.2.3` → { packageName: "@scope/pkg", version: "1.2.3", rest: [] } |
25 | | - * |
26 | | - * @param pkgParam - The raw package parameter from the URL (e.g., "vue/v/3.4.0/src/index.ts") |
27 | | - * @returns Parsed package name, optional version, and remaining path segments |
28 | | - * |
29 | | - * @example |
30 | | - * ```ts |
31 | | - * parsePackageParam('vue') |
32 | | - * // { packageName: 'vue', version: undefined, rest: [] } |
33 | | - * |
34 | | - * parsePackageParam('vue/v/3.4.0') |
35 | | - * // { packageName: 'vue', version: '3.4.0', rest: [] } |
36 | | - * |
37 | | - * parsePackageParam('@nuxt/kit/v/1.0.0/src/index.ts') |
38 | | - * // { packageName: '@nuxt/kit', version: '1.0.0', rest: ['src', 'index.ts'] } |
39 | | - * ``` |
40 | | - */ |
41 | | -export function parsePackageParam(pkgParam: string): ParsedPackageParams { |
42 | | - const segments = pkgParam.split('/') |
43 | | - const vIndex = segments.indexOf('v') |
44 | | - |
45 | | - if (vIndex !== -1 && vIndex < segments.length - 1) { |
46 | | - return { |
47 | | - packageName: segments.slice(0, vIndex).join('/'), |
48 | | - version: segments[vIndex + 1], |
49 | | - rest: segments.slice(vIndex + 2), |
50 | | - } |
51 | | - } |
52 | | - |
53 | | - return { |
54 | | - packageName: segments.join('/'), |
55 | | - version: undefined, |
56 | | - rest: [], |
57 | | - } |
58 | | -} |
| 4 | +// Re-export from separate file (avoids h3 dependency for unit tests) |
| 5 | +export { parsePackageParam } from './parse-package-param' |
| 6 | +export type { ParsedPackageParams } from './parse-package-param' |
59 | 7 |
|
60 | 8 | /** |
61 | 9 | * Validate an npm package name and throw an HTTP error if invalid. |
|
0 commit comments