@@ -8,65 +8,37 @@ import { areUrlsEquivalent } from '#shared/utils/url'
88
99definePageMeta ({
1010 name: ' package' ,
11- alias: [' /package/:package(.*)*' ],
11+ /**
12+ * Supported patterns:
13+ * /nuxt → packageName: "nuxt", requestedVersion: null
14+ * /nuxt/v/4.2.0 → packageName: "nuxt", requestedVersion: "4.2.0"
15+ * /@nuxt/kit → packageName: "@nuxt/kit", requestedVersion: null
16+ * /@nuxt/kit/v/1.0.0 → packageName: "@nuxt/kit", requestedVersion: "1.0.0"
17+ * /axios@1.13.3 → packageName: "axios", requestedVersion: "1.13.3"
18+ * /@nuxt/kit@1.0.0 → packageName: "@nuxt/kit", requestedVersion: "1.0.0"
19+ */
20+ path: ' /:org(@[^/]+/)?:name([^@/]+):version()?' ,
21+ alias: [
22+ ' /:org(@[^/]+/)?:name([^@/]+)/v/:version()?' ,
23+ ' /package/:org(@[^/]+/)?:name([^@/]+):version()?' ,
24+ ' /package/:org(@[^/]+/)?:name([^@/]+)/v/:version()?' ,
25+ ],
1226})
1327
1428const route = useRoute (' package' )
1529
1630const router = useRouter ()
1731
18- // Parse package name and optional version from URL
19- // Patterns:
20- // /nuxt → packageName: "nuxt", requestedVersion: null
21- // /nuxt/v/4.2.0 → packageName: "nuxt", requestedVersion: "4.2.0"
22- // /@nuxt/kit → packageName: "@nuxt/kit", requestedVersion: null
23- // /@nuxt/kit/v/1.0.0 → packageName: "@nuxt/kit", requestedVersion: "1.0.0"
24- // /axios@1.13.3 → packageName: "axios", requestedVersion: "1.13.3"
25- // /@nuxt/kit@1.0.0 → packageName: "@nuxt/kit", requestedVersion: "1.0.0"
26- const parsedRoute = computed (() => {
27- const segments = route .params .package || []
28-
29- // Find the /v/ separator for version
30- const vIndex = segments .indexOf (' v' )
31- if (vIndex !== - 1 && vIndex < segments .length - 1 ) {
32- return {
33- packageName: segments .slice (0 , vIndex ).join (' /' ),
34- requestedVersion: segments .slice (vIndex + 1 ).join (' /' ),
35- }
36- }
37-
38- // Parse @ versioned package
39- const fullPath = segments .join (' /' )
40- const versionMatch = fullPath .match (/ ^ (@[^ /] + \/ [^ /] + | [^ /] + )@([^ /] + )$ / )
41- if (versionMatch ) {
42- const [, packageName, requestedVersion] = versionMatch as [string , string , string ]
43- return {
44- packageName ,
45- requestedVersion ,
46- }
47- }
48-
49- return {
50- packageName: fullPath ,
51- requestedVersion: null as string | null ,
52- }
53- })
54-
55- const packageName = computed (() => parsedRoute .value .packageName )
56- const requestedVersion = computed (() => parsedRoute .value .requestedVersion )
32+ const orgName = computed (() => route .params .org )
33+ const requestedVersion = computed (() => route .params .version || null )
34+ const packageName = computed (() =>
35+ orgName .value ? ` ${orgName .value }/${route .params .name } ` : route .params .name ,
36+ )
5737
5838if (import .meta .server ) {
5939 assertValidPackageName (packageName .value )
6040}
6141
62- // Extract org name from scoped package (e.g., "@nuxt/kit" -> "nuxt")
63- const orgName = computed (() => {
64- const name = packageName .value
65- if (! name .startsWith (' @' )) return null
66- const match = name .match (/ ^ @([^ /] + )\/ / )
67- return match ? match [1 ] : null
68- })
69-
7042const { data : pkg, status, error, resolvedVersion } = usePackage (packageName , requestedVersion )
7143
7244const { data : downloads } = usePackageDownloads (packageName , ' last-week' )
0 commit comments